30 valarray<complex<double> >& b,
31 valarray<complex<double> >& xk) {
40 ( A.
dim1() != b.size() ) ||
41 ( A.
dim1() != xk.size() ) ) {
42 cout <<
"Error: The Matrices don't have the right dimensions!" << endl;
47 for (
int i(0); i < A.
dim1(); ++i){
49 for (
int j(0); j < A.
dim2(); ++j){
52 if (!(rowi < 2.0*A(i,i)))
return false;
59 valarray<double> invDIAG(A.
dim1());
60 for (
int i(0); i < invDIAG.size(); ++i) invDIAG[i] = 1.0 / A(i,i);
62 valarray<complex<double> > xold(xk);
68 while ( (iteration++ < MAXiter) && (conv < b.size()) ) {
71 for (
int i(0); i < A.
dim1(); ++i){
72 complex<double> sigma(0.0);
73 for (
int j(0); j < i; ++j){
74 sigma += A(i,j)*xk[j];
76 for (
int j(i+1); j < A.
dim2(); ++j){
77 sigma += A(i,j)*xk[j];
79 xk[i] = invDIAG[i] * (b[i] - sigma);
88 while ( ( conv < b.size() ) &&
89 ( abs(xold[conv]) < (tol*abs(xk[conv] + 20.0*DBL_MIN)) ) ){
122 const valarray<double>& b,
124 valarray<complex<double> > d,
125 valarray<complex<double> >& x) {
133 for (
int i(1); i < n; ++i){
134 double id(1.0/(b[i]-c[i-1]*a[i]));
136 d[i] -= d[i-1] * a[i];
142 for (
int i(n-2); i > -1; --i){
144 x[i] -= c[i] * x[i+1];
152 const valarray<double>& b,
155 valarray<double>& x) {
163 for (
int i(1); i < n; ++i){
164 double id(1.0/(b[i]-c[i-1]*a[i]));
166 d[i] -= d[i-1] * a[i];
172 for (
int i(n-2); i > -1; --i){
174 x[i] -= c[i] * x[i+1];
184 const valarray<complex<double>>& b,
185 valarray<complex<double>>& c,
186 valarray<complex<double>> d,
187 valarray<complex<double>>& x) {
195 for (
int i(1); i < n; ++i){
196 complex<double> id(1.0/(b[i]-c[i-1]*a[i]));
198 d[i] -= d[i-1] * a[i];
204 for (
int i(n-2); i > -1; --i){
206 x[i] -= c[i] * x[i+1];
217 valarray<double> & d,
218 valarray<double> & xk) {
228 ( A.
dim1() != d.size() ) ||
229 ( A.
dim1() != xk.size() ) ) {
230 cout <<
"Error: The Matrices don't have the right dimensions!" << endl;
235 valarray<double> a(d.size()), b(d.size()), c(d.size());
237 for (
int i(0); i < A.
dim1()-1; ++i){
240 for (
int i(0); i < A.
dim1(); ++i){
243 for (
int i(0); i < A.
dim1()-1; ++i){
255 valarray<complex<double> >& d,
256 valarray<complex<double> >& xk) {
266 ( A.
dim1() != d.size() ) ||
267 ( A.
dim1() != xk.size() ) ) {
268 cout <<
"Error: The Matrices don't have the right dimensions!" << endl;
273 valarray<double> a(d.size()), b(d.size()), c(d.size());
275 for (
int i(0); i < A.
dim1()-1; ++i){
278 for (
int i(0); i < A.
dim1(); ++i){
281 for (
int i(0); i < A.
dim1()-1; ++i){
295 valarray<complex<double> >& d,
296 valarray<complex<double> >& xk) {
305 if ( ( A.dim1() != A.dim2() ) ||
306 ( A.dim1() != d.size() ) ||
307 ( A.dim1() != xk.size() ) ) {
308 cout <<
"Error: The Matrices don't have the right dimensions!" << endl;
313 valarray<complex<double>> a(d.size()), b(d.size()), c(d.size());
315 for (
int i(0); i < A.dim1()-1; ++i){
318 for (
int i(0); i < A.dim1(); ++i){
321 for (
int i(0); i < A.dim1()-1; ++i){
337 Array2D<complex <double>>& A) {
339 return A(0,0) * ( A(1,1)*A(2,2) - A(2,1)*A(1,2) ) -
340 A(1,0) * ( A(0,1)*A(2,2) - A(2,1)*A(0,2) ) +
341 A(2,0) * ( A(0,1)*A(1,2) - A(1,1)*A(0,2) );
346 complex <double>
Detx33(valarray<complex <double>>& D,
347 Array2D<complex <double>>& A) {
349 return D[0] * ( A(1,1)*A(2,2) - A(2,1)*A(1,2) ) -
350 D[1] * ( A(0,1)*A(2,2) - A(2,1)*A(0,2) ) +
351 D[2] * ( A(0,1)*A(1,2) - A(1,1)*A(0,2) );
356 complex <double>
Dety33(valarray<complex <double>>& D,
357 Array2D<complex <double>>& A) {
359 return A(0,0) * ( D[1]*A(2,2) - D[2]*A(1,2) ) -
360 A(1,0) * ( D[0]*A(2,2) - D[2]*A(0,2) ) +
361 A(2,0) * ( D[0]*A(1,2) - D[1]*A(0,2) );
366 complex <double>
Detz33(valarray<complex <double>>& D,
367 Array2D<complex <double>>& A) {
369 return A(0,0) * ( A(1,1)*D[2] - A(2,1)*D[1] ) -
370 A(1,0) * ( A(0,1)*D[2] - A(2,1)*D[0] ) +
371 A(2,0) * ( A(0,1)*D[1] - A(1,1)*D[0] );
381 valarray<float>
vfloat(
const valarray<double>& vDouble) {
382 valarray<float> vf(vDouble.size());
383 for (
size_t i(0); i < vf.size(); ++i) {
384 vf[i] =
static_cast<float>(vDouble[i]);
397 vector<float>
vfloat(
const vector<double> vDouble) {
399 for (
size_t i(0); i < vDouble.size(); ++i) {
400 vf.push_back(static_cast<float>(vDouble[i]));
404 vector<float>
vfloat(
const vector<complex<double> > vDouble) {
406 for (
size_t i(0); i < vDouble.size(); ++i) {
407 vf.push_back(static_cast<float>(vDouble[i].real()));
414 for (
size_t i(0); i < vDouble.size(); ++i) {
415 vf.push_back(static_cast<float>(vDouble[i].imag()));
422 valarray<double> df(f.size());
425 df[1] = 1.0/12.0*(f[4]-6.0*f[3]+18.0*f[2]-10.0*f[1]-3.0*f[0]);
427 for (
size_t i(2); i < df.size()-2; ++i) {
428 df[i] = 1.0/12.0*(-f[i+2]+8.0*f[i+1]-8.0*f[i-1]+f[i-2]);
431 df[df.size()-2] = 1.0/12.0*(3.0*f[df.size()-1]+10.0*f[df.size()-2]-18.0*f[df.size()-3]+6.0*f[df.size()-4]-f[df.size()-5]);
432 df[df.size()-1] = f[df.size()-1]-f[df.size()-2];
438 valarray<double> df(f.size());
441 df[1] = 1.0/12.0*(f[4]-6.0*f[3]+18.0*f[2]-10.0*f[1]-3.0*f[0]);
443 for (
size_t i(2); i < df.size()-2; ++i) {
444 df[i] = 1.0/12.0*(-f[i+2]+8.0*f[i+1]-8.0*f[i-1]+f[i-2]);
447 df[df.size()-2] = 1.0/12.0*(3.0*f[df.size()-1]+10.0*f[df.size()-2]-18.0*f[df.size()-3]+6.0*f[df.size()-4]-f[df.size()-5]);
448 df[df.size()-1] = f[df.size()-1]-f[df.size()-2];
453 valarray<complex<double> >
df_4thorder(
const valarray<complex<double> >& f) {
454 valarray<complex<double> > df(f.size());
457 df[1] = 1.0/12.0*(f[4]-6.0*f[3]+18.0*f[2]-10.0*f[1]-3.0*f[0]);
459 for (
size_t i(2); i < df.size()-2; ++i) {
460 df[i] = 1.0/12.0*(-f[i+2]+8.0*f[i+1]-8.0*f[i-1]+f[i-2]);
463 df[df.size()-2] = 1.0/12.0*(3.0*f[df.size()-1]+10.0*f[df.size()-2]-18.0*f[df.size()-3]+6.0*f[df.size()-4]-f[df.size()-5]);
464 df[df.size()-1] = f[df.size()-1]-f[df.size()-2];
472 for (
long i2(0); i2<f.dim1();++i2){
474 df(0,i2) = f(1,i2)-f(0,i2);
475 df(1,i2) = 1.0/12.0*(f(4,i2)-6.0*f(3,i2)+18.0*f(2,i2)-10.0*f(1,i2)-3.0*f(0,i2));
477 for (
long i1(2); i1<f.dim1()-2;++i1){
478 df(i1,i2) = 1.0/12.0*(-f(i1+2,i2)+8.0*f(i1+1,i2)-8.0*f(i1-1,i2)+f(i1-2,i2));
481 df(f.dim1()-2,i2) = 1.0/12.0*(3.0*f(f.dim2()-1,i2)+10.0*f(f.dim2()-2,i2)-18.0*f(f.dim2()-3,i2)+6.0*f(f.dim2()-4,i2)-f(f.dim2()-5,i2));
482 df(f.dim1()-1,i2) = f(f.dim2()-1,i2)-f(f.dim2()-2,i2);
492 for (
long i1(0); i1<f.dim1();++i1){
494 df(i1,0) = f(i1,1)-f(i1,0);
495 df(i1,1) = 1.0/12.0*(f(i1,4)-6.0*f(i1,3)+18.0*f(i1,2)-10.0*f(i1,1)-3.0*f(i1,0));
497 for (
long i2(2); i2<f.dim2()-2;++i2){
498 df(i1,i2) = 1.0/12.0*(-f(i1,i2+2)+8.0*f(i1,i2+1)-8.0*f(i1,i2-1)+f(i1,i2-2));
501 df(i1,f.dim2()-2) = 1.0/12.0*(3.0*f(i1,f.dim2()-1)+10.0*f(i1,f.dim2()-2)-18.0*f(i1,f.dim2()-3)+6.0*f(i1,f.dim2()-4)-f(i1,f.dim2()-5));
502 df(i1,f.dim2()-1) = f(i1,f.dim2()-1)-f(i1,f.dim2()-2);
bool Thomas_Tridiagonal(Array2D< double > &A, valarray< double > &d, valarray< double > &xk)
The tridiagonal solver for implicit collisions.
vector< float > vfloat_complex(const vector< complex< double > > vDouble)
valarray< double > df_4thorder(const valarray< double > &f)
Underlying data structures.
Array2D< complex< double > > df1_4thorder(Array2D< complex< double > > &f)
valarray< float > vfloat(const valarray< double > &vDouble)
complex< double > Detx33(valarray< complex< double >> &D, Array2D< complex< double >> &A)
complex< double > Detz33(valarray< complex< double >> &D, Array2D< complex< double >> &A)
void TridiagonalSolve(const valarray< double > &a, const valarray< double > &b, valarray< double > &c, valarray< complex< double > > d, valarray< complex< double > > &x)
Set up tridiagonal solver.
complex< double > Det33(Array2D< complex< double >> &A)
Array2D< complex< double > > df2_4thorder(Array2D< complex< double > > &f)
complex< double > Dety33(valarray< complex< double >> &D, Array2D< complex< double >> &A)
bool Gauss_Seidel(Array2D< double > &A, valarray< complex< double > > &b, valarray< complex< double > > &xk)
Performs Gauss-Seidel method on Ax = b.