38 double pmin,
double pmax,
size_t Np,
39 double xmin,
double xmax,
size_t Nx)
44 H(Np,Nx), G(Np,Nx), TMP(Np,Nx),
46 static_cast<complex<double> >(pmax),
52 complex<double> lc, mc;
55 for (
size_t i(0); i <
pr.size(); ++i) {
58 double idp = (-1.0)/ (2.0*(pmax-pmin)/
double(Np-1));
61 A100 =
static_cast<complex<double>
>(idp);
62 C100 =
static_cast<complex<double>
>(0.5*idp);
63 A210 =
static_cast<complex<double>
>(1.0/3.0*idp);
64 B211 =
static_cast<complex<double>
>(2.0/3.0);
65 A310 =
static_cast<complex<double>
>(2.0/5.0*idp);
66 C311 =
static_cast<complex<double>
>(-0.5*idp/5.0);
71 for (
size_t l(1); l < Nl+1; ++l) {
73 Hp0[l] =
Hp0[l-1] * (
pr[0]/
pr[1]) * (2.0*ld+1.0)/(2.0*ld-1.0);
88 complex<double> ii(0.0,1.0);
90 valarray<complex<double> > Ex(FEx.
array());
91 valarray<complex<double> > Em(FEz.
array());
94 valarray<complex<double> > Ep(FEz.
array());
148 valarray<complex<double> > Ex(FEx.
array());
177 valarray<complex<double> > Em(FEy.
array());
178 valarray<complex<double> > Ep(FEy.
array());
217 complex<double> ii(0.0,1.0);
220 valarray<complex<double> > Em(FEz.
array());
224 valarray<complex<double> > Ep(FEz.
array());
236 Din(2,0) *=
static_cast<complex<double>
>(1.0/3.0);
259 valarray<complex<double> > invpax(
invpr);
260 complex<double> ld(el);
262 invpax *= (-2.0)*(ld+1.0) * (
pr[1]-
pr[0]);
268 G *= -(2.0*ld+1.0)/ld;
271 for (
size_t i(0); i <
G.
numx(); ++i)
G(0,i) = 0.0;
272 for (
size_t i(0); i <
H.
numx(); ++i)
H(0,i) = f(1,i) *
Hp0[el];
282 complex<double> p0p1_sq(
pr[0]*
pr[0]/(
pr[1]*
pr[1]) ),
283 inv_mp0p1_sq( 1.0/(1.0-p0p1_sq) ),
284 g_r = -4.0*(pr[1]-pr[0]) * pr[0]/(pr[1]*pr[1]),
287 for (
size_t i(0); i < f.
numx(); ++i) {
288 f00 = ( f(0,i) - f(1,i) * p0p1_sq) * inv_mp0p1_sq;
289 G(0,i) = ( f(1,i) - f00) * g_r;
299 double pmin,
double pmax,
size_t Np,
300 double xmin,
double xmax,
size_t Nx)
304 : A1(Nm+1), B1(Nl+1), A2(Nl+1,Nm+1), A3(0.5),
308 complex<double> lc, mc;
309 complex<double> c01(0.0,1.0);
313 for (
size_t m(0); m < Nm+1; ++m){
314 mc =
static_cast< complex<double>
>(m);
315 A1[m] = (-1.0)*c01*mc;
336 for (
size_t l(0); l < Nl+1; ++l){
337 lc =
static_cast< complex<double>
>(l);
338 B1[l] = (-1.0)*lc*(lc+1.0);
354 complex<double> ii(0.0,1.0);
356 valarray<complex<double> > Bx(FBx.
array());
357 valarray<complex<double> > Bm(FBy.
array());
360 valarray<complex<double> > Bp(FBy.
array());
368 size_t l0(
B1.size()-1);
369 size_t m0(
A1.size()-1);
375 for (
size_t l(1); l < l0+1; ++l){
429 complex<double> ii(0.0,1.0);
431 valarray<complex<double> > Bx(FBx.
array());
432 valarray<complex<double> > Bm(FBy.
array());
435 valarray<complex<double> > Bp(FBy.
array());
450 complex<double> temp(0.0,0.0);
452 for (
size_t i(0); i<Din(0,0).numx(); ++i)
454 for (
size_t l(1); l < l0+1; ++l)
457 valarray<complex<double>> fin((0.0,0.0),2*Nm+1);
458 valarray<complex<double>> RHSv((0.0,0.0),2*Nm+1);
473 RHS(0,0) = 1.0-ii*double(Nm)*dt/2.0*Bx[i];
474 LHS(0,0) = conj(RHS(0,0));
475 RHS(0,1) = 0.25*dt*Bp[i];
476 LHS(0,1) = -0.25*dt*Bp[i];
478 for (
int m(Nm-1);m>0;--m)
482 RHS(ind,ind) = 1.0-ii*double(m)*dt/2.0*Bx[i];
483 LHS(ind,ind) = conj(RHS(ind,ind));
485 RHS(ind,ind+1) = 0.25*dt*Bp[i];
486 LHS(ind,ind+1) = -0.25*dt*Bp[i];
488 RHS(ind,ind-1) = -0.25*dt*(l-m)*(l+m+1)*Bm[i];
489 LHS(ind,ind-1) = 0.25*dt*(l-m)*(l+m+1)*Bm[i];
494 RHS(Nm,Nm-1) = -0.25*dt*(l)*(l+1)*Bm[i];
495 LHS(Nm,Nm-1) = 0.25*dt*(l)*(l+1)*Bm[i];
498 RHS(Nm,Nm+1) = conj(RHS(Nm,Nm-1));
499 LHS(Nm,Nm+1) = conj(LHS(Nm,Nm-1));
501 for (
int m(-1);m>-Nm;--m)
506 RHS(ind,ind) = conj(RHS(indp,indp));
507 LHS(ind,ind) = conj(LHS(indp,indp));
509 RHS(ind,ind+1) = conj(RHS(indp,indp-1));
510 LHS(ind,ind+1) = conj(LHS(indp,indp-1));
512 RHS(ind,ind-1) = conj(RHS(indp,indp+1));
513 LHS(ind,ind-1) = conj(LHS(indp,indp+1));
516 RHS(2*Nm,2*Nm) = conj(RHS(0,0));
517 LHS(2*Nm,2*Nm) = conj(LHS(0,0));
518 RHS(2*Nm,2*Nm-1) = conj(RHS(0,1));
519 LHS(2*Nm,2*Nm-1) = conj(LHS(0,1));
521 for (
size_t k(0); k < Din(0,0).nump(); ++k) {
523 fin[0] = Din(l, Nm)(k, i);
524 for (
int m(Nm - 1); m > 1; --m) {
526 fin[ind] = Din(l, m)(k, i);
528 fin[Nm] = Din(l, 0)(k, i);
529 for (
int m(-1); m > -Nm; --m) {
531 fin[ind] = conj(Din(l, abs(m))(k, i));
533 fin[2 * Nm] = conj(Din(l, Nm)(k, i));
536 RHSv[0] = fin[0] * RHS(0, 0) + fin[1] * RHS(0, 1);
537 for (
size_t mm(1); mm < 2 * Nm; ++mm) {
538 RHSv[mm] = fin[mm - 1] * RHS(mm, mm - 1) + fin[mm] * RHS(mm, mm) + fin[mm + 1] * RHS(mm, mm + 1);
540 RHSv[2 * Nm] = fin[2 * Nm - 1] * RHS(2 * Nm, 2 * Nm - 1) + fin[2 * Nm] * RHS(2 * Nm, 2 * Nm);
554 Din(l,Nm)(k,i) = fin[0];
555 for (
int m(Nm-1);m>1;--m)
558 Din(l,m)(k,i) = fin[ind];
560 Din(l,0)(k,i) = fin[Nm];
574 double pmin,
double pmax,
size_t Np,
575 double xmin,
double xmax,
size_t Nx)
581 static_cast<complex<double> >(pmax),
585 complex<double> lc, mc;
587 for (
size_t i(0); i <
vr.size(); ++i) {
588 vr[i] =
vr[i]/(sqrt(1.0+
vr[i]*
vr[i]));
591 double idx = (-1.0) / (2.0*(xmax-xmin)/
double(Nx));
594 A00 =
static_cast<complex<double>
>(idx);
595 A10 =
static_cast<complex<double>
>(idx/3.0);
596 A20 =
static_cast<complex<double>
>(idx*2.0/5.0);
606 valarray<complex<double> > vt(
vr); vt *= 1.0/Din.
mass();
617 fd1 = Din(0,0);
fd1 *=
static_cast<complex<double>
>(1.0/3.0);
634 double xmin,
double xmax,
size_t Nx) {
637 for (
size_t s(0); s < Nl.size(); ++s){
639 double pmin( pmax[s] / (
double(Np[s] * 2 - 1)) );
645 JX.push_back(
Current_1D(pmin, pmax[s], Np[s], Nx) );
651 AM.push_back(
Ampere_1D(xmin, xmax, Nx) );
667 for (
size_t s(0); s < Yin.
Species(); ++s) {
669 SA[s](Yin.
DF(s),Yslope.
DF(s));
679 AM[s](Yin.
EMF(),Yslope.
EMF());
681 FA[s](Yin.
EMF(),Yslope.
EMF());
694 double xmin,
double xmax,
size_t Nx) {
697 for (
size_t s(0); s < Nl.size(); ++s){
699 double pmin( pmax[s] / (
double(Np[s] * 2 - 1)) );
705 JX.push_back(
Current_1D(pmin, pmax[s], Np[s], Nx) );
711 AM.push_back(
Ampere_1D(xmin, xmax, Nx) );
727 for (
size_t s(0); s < Yin.
Species(); ++s) {
729 SA[s](Yin.
DF(s),Yslope.
DF(s));
739 AM[s](Yin.
EMF(),Yslope.
EMF());
741 FA[s](Yin.
EMF(),Yslope.
EMF());
765 double xmin,
double xmax,
size_t Nx) {
768 for (
size_t s(0); s < Nl.size(); ++s){
770 double pmin( pmax[s] / (
double(Np[s] * 2 - 1)) );
798 for (
size_t s(0); s < Yin.
Species(); ++s) {
800 SA[s](Yin.
DF(s),Yslope.
DF(s));
829 double xmin,
double xmax,
size_t Nx) {
832 for (
size_t s(0); s < Nl.size(); ++s){
834 double pmin( pmax[s] / (
double(Np[s] * 2 - 1)) );
862 for (
size_t s(0); s < Yin.
Species(); ++s) {
864 SA[s](Yin.
DF(s),Yslope.
DF(s));
893 double xmin,
double xmax,
size_t Nx) {
896 for (
size_t s(0); s < Nl.size(); ++s){
898 double pmin( pmax[s] / (
double(Np[s] * 2 - 1)) );
913 for (
size_t s(0); s < Yin.
Species(); ++s) {
914 FA[s](Yin.
EMF(),Yslope.
EMF());
930 for (
size_t s(0); s < Yin.
Species(); ++s) {
931 EF[s].Implicit_Ex(Yin.
DF(s),Yin.
EMF().
Ex(),Yslope.
DF(s));
935 else if (direction == 2)
937 for (
size_t s(0); s < Yin.
Species(); ++s) {
938 EF[s].Implicit_Ey(Yin.
DF(s),Yin.
EMF().
Ey(),Yslope.
DF(s));
945 for (
size_t s(0); s < Yin.
Species(); ++s) {
946 EF[s].Implicit_Ez(Yin.
DF(s),Yin.
EMF().
Ez(),Yslope.
DF(s));
void Implicit_Ez(const DistFunc1D &Din, const Field1D &FEz, DistFunc1D &Dh)
valarray< complex< double > > pr
valarray< complex< double > > B1
valarray< complex< double > > invpr
void implicit(DistFunc1D &Din, const Field1D &FBx, const Field1D &FBy, const Field1D &FBz, double dt)
bool Thomas_Tridiagonal(Array2D< double > &A, valarray< double > &d, valarray< double > &xk)
The tridiagonal solver for implicit collisions.
Electric_Field_1D_f1(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
void MakeG00(SHarmonic1D &f)
VlasovFunctor1D_f1_implicitE_p1(vector< size_t > Nl, vector< size_t > Nm, vector< double > pmax, vector< size_t > Np, double xmin, double xmax, size_t Nx)
Underlying data structures.
valarray< complex< double > > A1
void Implicit_Ex(const DistFunc1D &Din, const Field1D &FEx, DistFunc1D &Dh)
Spatial_Advection_1D_f1(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
void operator()(const State1D &Yin, State1D &Yslope)
SHarmonic1D & mxaxis(const valarray< complex< double > > &shmulti)
Functors for various time-integration methodds - Declarations.
void operator()(const State1D &Yin, State1D &Yslope)
void MakeGH(SHarmonic1D &f, size_t l)
void operator()(const State1D &Yin, State1D &Yslope)
void operator()(const State1D &Yin, State1D &Yslope)
valarray< complex< double > > & array() const
void operator()(const State1D &Yin, State1D &Yslope)
valarray< T > MakeAxis(const T min, const T max, const size_t N)
DistFunc1D & DF(size_t s)
VlasovFunctor1D_f1_explicitE(vector< size_t > Nl, vector< size_t > Nm, vector< double > pmax, vector< size_t > Np, double xmin, double xmax, size_t Nx)
Fields, Distributions, Harmonics, States - Declarations.
void Implicit_Ey(const DistFunc1D &Din, const Field1D &FEy, DistFunc1D &Dh)
void operator()(const DistFunc1D &Din, const Field1D &FEx, const Field1D &FEy, const Field1D &FEz, DistFunc1D &Dh)
VlasovFunctor1D_f1_implicitEB_p1(vector< size_t > Nl, vector< size_t > Nm, vector< double > pmax, vector< size_t > Np, double xmin, double xmax, size_t Nx)
void operator()(const DistFunc1D &Din, const Field1D &FBx, const Field1D &FBy, const Field1D &FBz, DistFunc1D &Dh)
void operator()(const DistFunc1D &Din, DistFunc1D &Dh)
VlasovFunctor1D_f1_explicitEB(vector< size_t > Nl, vector< size_t > Nm, vector< double > pmax, vector< size_t > Np, double xmin, double xmax, size_t Nx)
valarray< complex< double > > Hp0
valarray< complex< double > > vr
Magnetic_Field_1D_f1(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
The 1D distribution function is the container for all SHarmonic1D per species.
Vlasov Equation - Declarations.
VlasovFunctor1D_f1_implicitE_p2(vector< size_t > Nl, vector< size_t > Nm, vector< double > pmax, vector< size_t > Np, double xmin, double xmax, size_t Nx)
SHarmonic1D & mpaxis(const valarray< complex< double > > &shmulti)
Numerical Methods - Declarations.