Page MenuHomec4science

alembert.cpp
No OneTemporary

File Metadata

Created
Tue, Oct 15, 10:48

alembert.cpp

#include "alembert.h"
wave_system::wave_system(
const double& _dx,
const double& _dt,
const double& _N,
const std::function<double(double)>& _u,
bound::boundary * _b,
init_t itype,
const std::function<double(double)>& init)
: dx(_dx), dt(_dt), N(_N), t(0)
u(N+2), f[0](N+2), f[1](N+2), b(_b)
{
/*
* Initial conditions setup
*/
// setup of u
for (int k = 0; k <= N+1; ++k)
u[k] = _u(k * dx);
// setup of f
// f_-1
for (int k = 1; k <= N; ++k)
{
double m(0);
switch(itype)
{
case init_t::sleep:
break;
case init_t::progressive:
m = - u[k]; // TODO sign inversion?
break;
case init_t::regressive:
m = u[k]; // TODO sign inversion?
break;
default:
break;
}
f[0][k] = init(k * dx + m * dt);
}
b->set(); // boundary conditions, this applies on f[1]
f[0][0] = f[1][0];
f[0][N+1] = f[1][N+1];
// f_0
for (int k = 1; k <= N; ++k)
f[1][k] = init(k * dx);
// boundary conditions are equals on both vectors
}
void wave_system::step()
{
// first, evolve the system
evolve();
// apply boundary conditions for the new step
b->set();
// advance in time counting
t += dt;
}
/*
* System equation specification
*/
// equation A
//
void wave_sys_A::evolve()
{
f_n = f[1];
f[1] = A * f_n - f[0]; // f_n+1
f[0] = f_n;
}
wave_sys_A(double _dx, double _dt, const map& _u, border_t b)
: wave_system(_dx, _dt, _u, b), A(_u.size())
{
A[0][0] = A[0][1] = 0;
for (int k = 1; k < N+1; ++k)
{
double b = beta(k);
A[k][k-1] = A[k][k+1] = b;
A[k][k] = 2 * (1 - b * b);
}
A[N+1][N+1] = A[N+1][N] = 0;
}
// equation B
//
void wave_sys_B::evolve()
{
}
// equation C
//
void wave_sys_C::evolve()
{
}
/*
* Boundary treatment
*/
using namespace bound;
void fixed::set()
{
sys.at()[0] = C;
sys.at()[sys.N + 1] = C;
}
void free::set()
{
// TODO
}
void harmonic::set()
{
// TODO
}
void infinite::set()
{
// TODO
}

Event Timeline