Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F87864857
alembert.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Oct 15, 10:48
Size
2 KB
Mime Type
text/x-c
Expires
Thu, Oct 17, 10:48 (2 d)
Engine
blob
Format
Raw Data
Handle
21670273
Attached To
rSTICAZZI yearII_reports
alembert.cpp
View Options
#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
Log In to Comment