49 fslope(0.0, DF1(0,0).nump()),
51 df0(0.0, DF1(0,0).nump()),
53 U4(0.0, DF2(0,0).nump()),
54 U4m1(0.0, DF2(0,0).nump()),
55 U2(0.0, DF2(0,0).nump()),
56 U2m1(0.0, DF2(0,0).nump()),
57 U1(0.0, DF2(0,0).nump()),
58 U1m1(0.0, DF2(0,0).nump()),
61 J1_s2(0.0, DF2(0,0).nump()),
62 I2_s2(0.0, DF2(0,0).nump()),
63 I4_s2(0.0, DF2(0,0).nump()),
65 U3(0.0, DF2(0,0).nump()),
66 Qn(0.0, DF2(0,0).nump()),
67 Pn(0.0, DF2(0,0).nump()),
69 J1_s1(0.0, DF2(0,0).nump()),
70 I2_s1(0.0, DF2(0,0).nump()),
71 I4_s1(0.0, DF2(0,0).nump())
78 z2 = DF2.
q();
z1 = DF1.
q();
82 double re(2.8179402894e-13);
83 double kp(sqrt(4.0*M_PI*(
Input::List().density_np)*re));
90 for (
size_t i(1); i < DF2(0,0).nump(); ++i) {
101 for (
size_t i(0); i <
U3.size(); ++i) {
106 for (
size_t i(1); i <
Qn.size()-1; ++i) {
110 for (
size_t i(0); i <
Pn.size()-1; ++i) {
134 for (
int n(1); n < f1in.size()-1; ++n) {
135 df0[n] = f1in[n+1]-f1in[n-1];
139 df0[0] = f1in[1]-f1in[0];
142 df0[f1in.size()-1] = f1in[f1in.size()-1]-f1in[f1in.size()-2];
143 df0[f1in.size()-1]/= pgrid_s1[f1in.size()-1]-pgrid_s1[f1in.size()-2];
153 temp /= pgrid_s1[ipp]-pgrid_s1[ipm];
154 temp /= 3.0*(0.25*pow(pgrid_s1[ipm]+pgrid_s1[ipp],2.0));
159 for (
int ip(1);ip < f1in.size()-2;++ip)
167 temp /= pgrid_s1[ipp]-pgrid_s1[ipm];
169 temp /= 3.0*(0.25*pow(pgrid_s1[ipm]+pgrid_s1[ipp],2.0));
177 ipp=f1in.size()-1;ipm=f1in.size()-2;
181 temp /= pgrid_s1[ipp]-pgrid_s1[ipm];
182 temp /= 3.0*(0.25*pow(pgrid_s1[ipm]+pgrid_s1[ipp],2.0));
184 fslope[f1in.size()-1] = temp;
204 for (
int n(1); n <
I4_s2.size(); ++n) {
211 for (
int n(1); n <
I2_s2.size(); ++n) {
226 for (
int n(J1_s2.size()-2); n > -1; --n) {
227 J1_s2[n] =
U1[n+1]*f2in[n+1]+
U1m1[n+1]*f2in[n];
228 J1_s2[n] += J1_s2[n+1];
276 while ( (n <
pgrid_s1.size()) && (
pgrid_s1[n] < pgrid_s2[pgrid_s2.size()-1]))
278 dist = modf(
pgrid_s1[n]/dp_s2 , &cell_s2 );
280 I4_s1[n] =
I4_s2[
static_cast<size_t>(cell_s2)]*(1.0-dist) +
I4_s2[
static_cast<size_t>(cell_s2)+1]*dist;
281 I2_s1[n] =
I2_s2[
static_cast<size_t>(cell_s2)]*(1.0-dist) +
I2_s2[
static_cast<size_t>(cell_s2)+1]*dist;
282 J1_s1[n] =
J1_s2[
static_cast<size_t>(cell_s2)]*(1.0-dist) +
J1_s2[
static_cast<size_t>(cell_s2)+1]*dist;
303 :collide(DF1,DF2,smalldt){}
318 rkf00(DF1, DF2, deltat),
319 fin1(0.0,DF1(0,0).nump()), fin2(0.0,DF2(0,0).nump()),
321 num_h(size_t(deltat/
Input::
List().small_dt)+1)
325 h = deltat/
static_cast<double>(
num_h);
341 for (
size_t ix(0); ix <
szx-2*
Nbc; ++ix){
344 for (
size_t ip(0); ip <
fin1.size(); ++ip){
345 fin1[ip] = (SH1(ip,ix+Nbc)).real();
348 for (
size_t ip(0); ip <
fin2.size(); ++ip){
349 fin2[ip] = (SH2(ip,ix+Nbc)).real();
353 for (
size_t h_step(0); h_step <
num_h; ++h_step){
358 for (
int ip(0); ip <
fin1.size(); ++ip){
360 SH1(ip,ix+Nbc) =
fin1[ip];
396 Scattering_Term(0.0, nump),
400 Alpha_Tri(nump, nump),
401 if_tridiagonal(
Input::
List().if_tridiagonal)
406 double re(2.8179402894e-13);
407 double kp(sqrt(4.0*M_PI*(
Input::List().density_np)*re));
411 for (
size_t i(0); i <
vr.size(); ++i) {
412 vr[i] =
vr[i] / (sqrt(1.0+
vr[i]*
vr[i]));
416 for (
size_t i(1); i <
U4.size(); ++i) {
417 U4[i] = 0.5 * pow(
vr[i],4) * (
vr[i]-
vr[i-1]);
418 U4m1[i] = 0.5 * pow(
vr[i-1],4) * (
vr[i]-
vr[i-1]);
421 U1[i] = 0.5 *
vr[i] * (
vr[i]-
vr[i-1]);
445 for (
int k(1); k <
I2.size(); ++k) {
446 I2[k] =
U4[k]*fin[k]+
U4m1[k]*fin[k-1];
451 for (
int k(0); k <
I2.size(); ++k){
457 for (
int k(1); k <
I0.size(); ++k) {
458 I0[k] =
U2[k]*fin[k]+
U2m1[k]*fin[k-1];
466 for (
int k(
J1m.size()-2); k > -1; --k) {
467 J1m[k] =
U1[k+1]*fin[k+1]+
U1m1[k+1]*fin[k];
470 for (
int k(0); k <
J1m.size(); ++k){
471 J1m[k] *= 4.0 * M_PI *
vr[k];
485 valarray<double> TriI1(fin), TriI2(fin);
487 for (
int i(0); i < TriI1.size(); ++i){
488 TriI1[i] =
I0[i] + (2.0*
J1m[i] -
I2[i]) / 3.0 ;
489 TriI2[i] = (
I2[i] +
J1m[i] ) / 3.0 ;
510 double IvDnDm1, IvDnDp1, Ivsq2Dn;
512 for (
int i(1); i < TriI1.size()-1; ++i){
513 IvDnDm1 = 1.0 / (
vr[i] * 0.5*(
vr[i+1]-
vr[i-1]) * (
vr[i] -
vr[i-1]));
514 IvDnDp1 = 1.0 / (
vr[i] * 0.5*(
vr[i+1]-
vr[i-1]) * (
vr[i+1]-
vr[i] ));
515 Ivsq2Dn = 1.0 / (
vr[i] *
vr[i] * (
vr[i+1]-
vr[i-1]));
516 Alpha_Tri(i, i ) = 8.0 * M_PI * fin[i] - TriI2[i] * (IvDnDm1 + IvDnDp1);
517 Alpha_Tri(i, i-1) = TriI2[i] * IvDnDm1 - TriI1[i] * Ivsq2Dn;
518 Alpha_Tri(i, i+1) = TriI2[i] * IvDnDp1 + TriI1[i] * Ivsq2Dn;
527 for (
int n(1); n < fin.size()-1; ++n) {
528 df0[n] = fin[n+1]-fin[n-1];
534 for (
int n(1); n < fin.size(); ++n) {
535 ddf0[n] = (fin[n-1]-fin[n]) ;
539 for (
int n(1); n < fin.size()-1; ++n) {
545 double f00 = ( fin[0] - ( (
vr[0]*
vr[0])/(
vr[1]*
vr[1]) ) *fin[1] )
546 / (1.0 - (vr[0]*vr[0])/(vr[1]*vr[1]));
547 ddf0[0] = 2.0 * (fin[1] - f00) / (vr[1]*vr[1]);
551 for (
int n(0); n < fin.size()-1; ++n) {
552 df0[n] /= vr[n]*vr[n];
553 ddf0[n] /= 2.0 *vr[n];
573 valarray<complex<double> > fout(fin);
588 double A1( (LL+1.0)*(LL+2.0) / ((2.0*LL+1.0)*(2.0*LL+3.0)) );
589 double A2( (-1.0) *(LL-1.0)* LL / ((2.0*LL+1.0)*(2.0*LL-1.0)) );
590 double B1( (-1.0) *( 0.5 *LL*(LL+1.0) +(LL+1.0) ) / ((2.0*LL+1.0)*(2.0*LL+3.0)) );
591 double B2( ( (-0.5)*LL*(LL+1.0) +(LL+2.0) ) / ((2.0*LL+1.0)*(2.0*LL+3.0)) );
592 double B3( ( 0.5 *LL*(LL+1.0) +(LL-1.0) ) / ((2.0*LL+1.0)*(2.0*LL-1.0)) );
593 double B4( ( 0.5 *LL*(LL+1.0) - LL ) / ((2.0*LL+1.0)*(2.0*LL-1.0)) );
596 for (
int i(0); i < Alpha.
dim1()-1; ++i){
597 double t1( A1*
ddf0[i] + B1*
df0[i] );
599 double t2( A1*
ddf0[i] + B2*
df0[i] );
601 double t3( A2*
ddf0[i] + B3*
df0[i] );
603 double t4( A2*
ddf0[i] + B4*
df0[i] );
606 Alpha(i,0) += t1 * ( 2.0*M_PI*pow(
vr[0]/
vr[i],el+2)*
vr[0]*
vr[0]*(
vr[1]-
vr[0]) );
607 Alpha(i,0) += t3 * ( 2.0*M_PI*pow(
vr[0]/
vr[i],el) *
vr[0]*
vr[0]*(
vr[1]-
vr[0]) );
609 for (
int j(1); j < i; ++j){
610 Alpha(i,j) += t1 * ( 2.0*M_PI*pow(
vr[j]/
vr[i],el+2)*
vr[j]*
vr[j]*(
vr[j+1]-
vr[j-1]) );
611 Alpha(i,j) += t3 * ( 2.0*M_PI*pow(
vr[j]/
vr[i],el) *
vr[j]*
vr[j]*(
vr[j+1]-
vr[j-1]) );
614 Alpha(i,i) += t1 * ( 2.0*M_PI *
vr[i]*
vr[i]*(
vr[i]-
vr[i-1]) );
615 Alpha(i,i) += t3 * ( 2.0*M_PI *
vr[i]*
vr[i]*(
vr[i]-
vr[i-1]) );
617 Alpha(i,i) += t2 * ( 2.0*M_PI *
vr[i]*
vr[i]*(
vr[i+1]-
vr[i]) );
618 Alpha(i,i) += t4 * ( 2.0*M_PI *
vr[i]*
vr[i]*(
vr[i+1]-
vr[i]) );
620 for (
int j(i+1); j < Alpha.
dim2()-1; ++j){
621 Alpha(i,j) += t2 * ( 2.0*M_PI*pow(
vr[j]/
vr[i],-el-1)*
vr[j]*
vr[j]*(
vr[j+1]-
vr[j-1]) );
622 Alpha(i,j) += t4 * ( 2.0*M_PI*pow(
vr[j]/
vr[i],-el+1)*
vr[j]*
vr[j]*(
vr[j+1]-
vr[j-1]) );
630 double ll1(static_cast<double>(el));
631 ll1 *= (-0.5)*(ll1 + 1.0);
633 for (
int i(0); i < Alpha.
dim1(); ++i){
647 cout <<
"WARNING: Matrix is not diagonally dominant" << endl;
652 cout <<
"WARNING: Matrix is not diagonally dominant" << endl;
677 : f00(0.0, DFin(0).nump()),
678 fc(0.0,DFin(0).nump()),
681 implicit_step(DFin.pmax(),DFin(0).nump()),
703 for (
size_t ix(0); ix <
szx-2*
Nbc; ++ix){
707 for (
size_t ip(0); ip <
fc.size(); ++ip){
708 f00[ip] = (DF(0,0)(ip,ix+
Nbc)).real();
714 for(
int m(0); m < 2; ++m){
717 for (
int ip(0); ip < DF(1,m).nump(); ++ip) {
718 fc[ip] = DF(1,m)(ip,ix+
Nbc);
725 for (
int ip(0); ip < DF(1,m).nump(); ++ip) {
726 DF(1,m)(ip,ix+
Nbc) =
fc[ip];
747 for (
size_t ix(0); ix <
szx-2*
Nbc; ++ix){
751 for (
size_t ip(0); ip <
fc.size(); ++ip){
752 f00[ip] = (DF(0,0)(ip,ix+
Nbc)).real();
758 for(
int l(2); l <
l0+1 ; ++l){
759 for(
int m(0); m < ((
m0 < l)?
m0:l)+1; ++m){
762 for (
size_t ip(0); ip <
fc.size(); ++ip){
763 fc[ip] = (DF(l,m))(ip,ix+Nbc);
770 for (
size_t ip(0); ip <
fc.size(); ++ip){
771 DF(l,m)(ip,ix+
Nbc) =
fc[ip];
794 for (
size_t s(0); s<Yin.
Species(); ++s){
798 std::cout <<
"\n\n sind,s = " << sind <<
"," << s <<
", size = " <<interspecies_f00_collisions.size() <<
"\n\n";
841 for (
size_t s(0); s<Yin.
Species(); ++s){
844 interspecies_f00_collisions[sind].rkloop(Yin.
SH(sind,0,0),Yin.
SH(s,0,0));
845 std::cout <<
"\n\n sind,s = " << sind <<
"," << s <<
"\n\n";
void advancef00(State1D &Y, const size_t &sind)
Remap Distribution to momentum grid of colliding particles.
size_t l0
Number of m harmonics.
void operator()(const valarray< double > &fin1, valarray< double > &fslope)
bool Thomas_Tridiagonal(Array2D< double > &A, valarray< double > &d, valarray< double > &xk)
The tridiagonal solver for implicit collisions.
interspecies_f00_RKfunctor(const DistFunc1D &DF1, const DistFunc1D &DF2, const double &smalldt)
Constructor for RK4 method on f00.
valarray< complex< double > > fc
Dummy array.
Underlying data structures.
Array2D< double > Alpha_Tri
int szx
Total cells including boundary cells in x-direction.
valarray< double > J1_s1
The integrals.
Interspecies Collisions - Definitions.
valarray< double > pgrid_s2
interspecies_f00_explicit_step collide
void remapintegrals()
Remap Distribution to momentum grid of colliding particles.
interspecies_f00_explicit_collisions(const DistFunc1D &DF1, const DistFunc1D &DF2, const double &deltat)
Constructors/Destructors.
valarray< double > J1_s2
The integrals.
valarray< double > pgrid_s1
interspecies_flm_implicit_step implicit_step
The object that is responsible for performing the algebra required for the integrals.
int szx
Total cells including boundary cells in x-direction.
valarray< double > Scattering_Term
int Nbc
Number of boundary cells in each direction.
void calculateintegrals(const valarray< double > &f1in, const valarray< double > &f2in)
Remap Distribution to momentum grid of colliding particles.
int Nbc
Number of boundary cells in each direction.
size_t m0
Number of m harmonics.
void advancef1(DistFunc1D &DF)
Advance f1_loop for 2D code.
void rkloop(SHarmonic1D &SH1, const SHarmonic1D &SH2)
interspecies_flm_implicit_step(double pmax, size_t nump)
DistFunc1D & DF(size_t s)
interspecies_flm_implicit_collisions(const DistFunc1D &DFin, const double &deltat)
Constructors/Destructors.
SHarmonic1D & SH(size_t s, size_t lh, size_t mh)
Fields, Distributions, Harmonics, States - Declarations.
void reset_coeff(const valarray< double > &f00, const double Delta_t)
Resets coefficients and integrals to use in the matrix solve.
int Nbc
Number of boundary cells in each direction.
valarray< double > f00
Array for isotropic component distribution function. Needed for calculating coefficients.
valarray< T > MakeCAxis(const T min, const T max, const size_t N)
valarray< double > takestep(const valarray< double > &f1in, const valarray< double > &f2in)
Collisions between species 1 and 2 in 0,0 harmonic.
interspecies_collisions(const State1D &Yin, const size_t &sind, const double &deltat)
Constructors/Destructors.
int szx
Total cells including boundary cells in x-direction.
void advanceflm(DistFunc1D &DF)
Advance flm_loop for 2D code.
interspecies_f00_explicit_step(const DistFunc1D &DF1, const DistFunc1D &DF2, const double &deltat)
Constructors/Destructors.
bool Gauss_Seidel(Array2D< double > &A, valarray< complex< double > > &b, valarray< complex< double > > &xk)
Performs Gauss-Seidel method on Ax = b.
valarray< double > fslope
The 1D distribution function is the container for all SHarmonic1D per species.
T moment(const vector< T > q, const vector< T > x, const int p)
void advance(valarray< complex< double > > &fin, const int el)
Perform a matrix solve to calculate effect of collisions on f >= 1.
Numerical Methods - Declarations.