40 : Jx(Nx), Jy(Nx), Jz(Nx), small(0.5*pmax/Np) {
59 for (
size_t i(0); i <
Jx.
numx(); ++i) {
60 Jx(i) = complex<double >(temp(0,i));
61 Jy(i) = complex<double >(temp(1,i));
62 Jz(i) = complex<double >(temp(2,i));
73 valarray<double> temp(Din(0).numx());
77 for (
size_t i(0); i <
Jx.
numx(); ++i) {
78 Jx(i) = complex<double >(temp[i]);
91 double pmin,
double pmax,
size_t Np,
92 double xmin,
double xmax,
size_t Nx)
96 : A1(Nl+1,Nm+1), A2(Nl+1,Nm+1),
98 C1(Nl+1), C2(Nl+1,Nm+1), C3(Nl+1), C4(Nl+1,Nm+1),
100 H(Np,Nx), G(Np,Nx), TMP(Np,Nx),
106 complex<double>(pmax),
111 complex<double> lc, mc;
114 for (
size_t i(0); i <
pr.size(); ++i) {
117 double idp = (-1.0)/ (2.0*(pmax-pmin)/
double(Np));
122 for (
size_t l(1); l < Nl+1; ++l){
123 for (
size_t m(0); m<((Nm<l)?Nm:l)+1; ++m){
124 lc = complex<double>(l);
125 mc = complex<double>(m);
126 A1(l,m) = idp *(-1.0) * (lc+1.0-mc)/(2.0*lc+1.0) * lc/(lc+1.0);
127 A2(l,m) = idp * (lc+mc)/(2.0*lc+1.0);
137 for (
size_t l(1); l<Nl+1; ++l){
138 lc = complex<double>(l);
139 B1[l] = idp * lc* lc /(2.0*lc+1.0);
140 B2[l] = idp * lc*(lc+1.0)/(2.0*lc+1.0);
147 for (
size_t l(1); l<Nl+1; ++l){
148 lc = complex<double>(l);
149 C1[l] = (-0.5) * idp * lc /((2.0*lc+1.0)*(lc+1.0));
150 C3[l] = (-0.5) * idp /(2.0*lc+1.0);
157 for (
size_t l(2); l<Nl+1; ++l){
158 for (
size_t m(2); m<((Nm<l)?Nm:l)+1; ++m){
159 lc = complex<double>(l);
160 mc = complex<double>(m);
161 C2(l,m) = (0.5) * idp * lc * (lc-mc+2.0)*(lc-mc+1.0)/((2.0*lc+1.0)*(lc+1.0));
162 C4(l,m) = (0.5) * idp * (lc+mc-1.0)*(lc+mc)/(2.0*lc+1.0);
169 Hp0[0] = 1.0 /
pr[0];
170 for (
size_t l(1); l < Nl+1; ++l) {
172 Hp0[l] =
Hp0[l-1] * (
pr[0]/
pr[1]) * (2.0*ld+1.0)/(2.0*ld-1.0);
176 A100 = complex<double>(idp);
177 C100 = complex<double>(0.5*idp);
178 A210 = complex<double>(1.0/3.0*idp);
179 B211 = complex<double>(2.0/3.0);
180 A310 = complex<double>(2.0/5.0*idp);
181 C311 = complex<double>(-0.5*idp/5.0);
194 complex<double> ii(0.0,1.0);
196 valarray<complex<double> > Ex(FEx.
array());
197 valarray<complex<double> > Em(FEz.
array());
200 valarray<complex<double> > Ep(FEz.
array());
230 for (
size_t l(2); l < l0; ++l){
269 for (
size_t l(3); l < l0; ++l){
290 for (
size_t m(2); m < m0; ++m){
295 Ep *=
C4(m,m) /
C4(l0,m-1); Dh(m-1,m-1) +=
H.
mxaxis(Ep);
298 Ep *=
C2(m,m) /
C4(m,m); Dh(m+1,m-1) +=
G.
mxaxis(Ep);
305 Ep *=
C4(m+1,m) /
C2(m,m); Dh(m ,m-1) +=
H.
mxaxis(Ep);
309 Ep *=
C2(m+1,m) /
C4(m+1,m); Dh(m+2,m-1) +=
G.
mxaxis(Ep);
314 for (
size_t l(m+2); l < l0; ++l){
318 Ep *=
C4(l,m) /
C2(l-1,m); Dh(l-1,m-1) +=
H.
mxaxis(Ep);
321 Ep *=
C2(l,m) /
C4(l,m); Dh(l+1,m-1) +=
G.
mxaxis(Ep);
329 Ep *=
C4(l0,m) /
C2(l0-1,m); Dh(l0-1,m-1) +=
H.
mxaxis(Ep);
337 Ep *=
C4(m0,m0) /
C4(l0,m0-1); Dh(m0-1,m0-1) +=
H.
mxaxis(Ep);
343 Ep *=
C2(m0,m0) /
C4(m0,m0); Dh(m0+1,m0-1) +=
G.
mxaxis(Ep);
348 MakeGH(Din(m0+1,m0),m0+1);
350 Ep *=
C4(m0+1,m0) /
C2(m0,m0); Dh(m0,m0-1) +=
H.
mxaxis(Ep);
353 Ep *=
C2(m0+1,m0) /
C4(m0+1,m0); Dh(m0+2,m0-1)+=
G.
mxaxis(Ep);
358 for (
size_t l(m0+2); l < l0; ++l){
361 Ep *=
C4(l,m0) /
C2(l-1,m0); Dh(l-1,m0-1) +=
H.
mxaxis(Ep);
363 Ep *=
C2(l,m0) /
C4(l, m0); Dh(l+1,m0-1) +=
G.
mxaxis(Ep);
371 Ep *=
C4(l0,m0) /
C2(l0-1,m0); Dh(l0-1,m0-1) +=
H.
mxaxis(Ep);
386 complex<double> ii(0.0,1.0);
388 valarray<complex<double> > Ex(FEx.
array());
421 for (
size_t l(2); l < l0; ++l){
449 valarray<complex<double> > Ex(FEx.
array());
494 valarray<complex<double> > Em(FEy.
array());
495 valarray<complex<double> > Ep(FEy.
array());
561 complex<double> ii(0.0,1.0);
564 valarray<complex<double> > Em(FEz.
array());
568 valarray<complex<double> > Ep(FEz.
array());
640 complex<double> ii(0.0,1.0);
642 valarray<complex<double> > Ex(FEx.
array());
643 valarray<complex<double> > Em(FEz.
array());
646 valarray<complex<double> > Ep(FEz.
array());
658 f20 *= complex<double>(1.0/3.0);
699 valarray<complex<double> > Ex(FEx.
array());
703 f20 *= complex<double>(1.0/3.0);
728 valarray<complex<double> > Em(FEy.
array());
729 valarray<complex<double> > Ep(FEy.
array());
732 f20 *= complex<double>(1.0/3.0);
767 complex<double> ii(0.0,1.0);
769 f20 *= complex<double>(1.0/3.0);
771 valarray<complex<double> > Em(FEz.
array());
775 valarray<complex<double> > Ep(FEz.
array());
809 valarray<complex<double> > invpax(
invpr);
810 complex<double> ld(el);
812 invpax *= (-2.0)*(ld+1.0) * (
pr[1]-
pr[0]);
818 G *= -(2.0*ld+1.0)/ld;
821 for (
size_t i(0); i <
G.
numx(); ++i)
G(0,i) = 0.0;
822 for (
size_t i(0); i <
H.
numx(); ++i)
H(0,i) = f(1,i) *
Hp0[el];
832 complex<double> p0p1_sq(
pr[0]*
pr[0]/(
pr[1]*
pr[1]) ),
833 inv_mp0p1_sq( 1.0/(1.0-p0p1_sq) ),
834 g_r = -4.0*(pr[1]-pr[0]) * pr[0]/(pr[1]*pr[1]),
838 for (
size_t i(0); i < f.
numx(); ++i) {
839 f00 = ( f(0,i) - f(1,i) * p0p1_sq) * inv_mp0p1_sq;
840 G(0,i) = ( f(1,i) - f00) * g_r;
850 double pmin,
double pmax,
size_t Np,
851 double xmin,
double xmax,
size_t Nx)
855 :
A1(Nm+1),
B1(Nl+1),
A2(Nl+1,Nm+1), A3(0.5),
859 complex<double> lc, mc;
860 complex<double> c01(0.0,1.0);
864 for (
size_t m(0); m < Nm+1; ++m){
865 mc = complex<double>(m);
866 A1[m] = (-1.0)*c01*mc;
872 for (
size_t l(1); l < Nl+1; ++l)
873 for (
size_t m=0; m<((Nm<l)?Nm:l)+1; ++m){
874 lc = complex<double>(l);
875 mc = complex<double>(m);
876 A2(l,m) = (-0.5)*(lc+1.0-mc)*(lc+mc);
887 for (
size_t l(0); l < Nl+1; ++l){
888 lc = complex<double>(l);
889 B1[l] = (-1.0)*lc*(lc+1.0);
905 complex<double> ii(0.0,1.0);
907 valarray<complex<double> > Bx(FBx.
array());
908 valarray<complex<double> > Bm(FBy.
array());
911 valarray<complex<double> > Bp(FBy.
array());
919 size_t l0(
B1.size()-1);
920 size_t m0(
A1.size()-1);
926 for (
size_t l(1); l < l0+1; ++l){
939 for (
size_t l(2); l < l0+1; ++l){
949 for (
size_t m(2); m < m0; ++m){
952 for (
size_t l(m+1); l < l0+1; ++l){
965 for (
size_t l(m0+1); l < l0+1; ++l){
980 complex<double> ii(0.0,1.0);
982 valarray<complex<double> > Bx(FBx.
array());
983 valarray<complex<double> > Bm(FBy.
array());
986 valarray<complex<double> > Bp(FBy.
array());
1001 complex<double> temp(0.0,0.0);
1003 for (
size_t i(0); i<Din(0,0).numx(); ++i)
1005 for (
size_t l(1); l < l0+1; ++l)
1008 valarray<complex<double>> fin((0.0,0.0),2*Nm+1);
1009 valarray<complex<double>> RHSv((0.0,0.0),2*Nm+1);
1024 RHS(0,0) = 1.0-ii*double(Nm)*dt/2.0*Bx[i];
1025 LHS(0,0) = conj(RHS(0,0));
1026 RHS(0,1) = 0.25*dt*Bp[i];
1027 LHS(0,1) = -0.25*dt*Bp[i];
1029 for (
int m(Nm-1);m>0;--m)
1033 RHS(ind,ind) = 1.0-ii*double(m)*dt/2.0*Bx[i];
1034 LHS(ind,ind) = conj(RHS(ind,ind));
1036 RHS(ind,ind+1) = 0.25*dt*Bp[i];
1037 LHS(ind,ind+1) = -0.25*dt*Bp[i];
1039 RHS(ind,ind-1) = -0.25*dt*(l-m)*(l+m+1)*Bm[i];
1040 LHS(ind,ind-1) = 0.25*dt*(l-m)*(l+m+1)*Bm[i];
1045 RHS(Nm,Nm-1) = -0.25*dt*(l)*(l+1)*Bm[i];
1046 LHS(Nm,Nm-1) = 0.25*dt*(l)*(l+1)*Bm[i];
1049 RHS(Nm,Nm+1) = conj(RHS(Nm,Nm-1));
1050 LHS(Nm,Nm+1) = conj(LHS(Nm,Nm-1));
1052 for (
int m(-1);m>-Nm;--m)
1057 RHS(ind,ind) = conj(RHS(indp,indp));
1058 LHS(ind,ind) = conj(LHS(indp,indp));
1060 RHS(ind,ind+1) = conj(RHS(indp,indp-1));
1061 LHS(ind,ind+1) = conj(LHS(indp,indp-1));
1063 RHS(ind,ind-1) = conj(RHS(indp,indp+1));
1064 LHS(ind,ind-1) = conj(LHS(indp,indp+1));
1067 RHS(2*Nm,2*Nm) = conj(RHS(0,0));
1068 LHS(2*Nm,2*Nm) = conj(LHS(0,0));
1069 RHS(2*Nm,2*Nm-1) = conj(RHS(0,1));
1070 LHS(2*Nm,2*Nm-1) = conj(LHS(0,1));
1072 for (
size_t k(0); k < Din(0,0).nump(); ++k) {
1074 fin[0] = Din(l, Nm)(k, i);
1075 for (
int m(Nm - 1); m > 1; --m) {
1077 fin[ind] = Din(l, m)(k, i);
1079 fin[Nm] = Din(l, 0)(k, i);
1080 for (
int m(-1); m > -Nm; --m) {
1082 fin[ind] = conj(Din(l, abs(m))(k, i));
1084 fin[2 * Nm] = conj(Din(l, Nm)(k, i));
1087 RHSv[0] = fin[0] * RHS(0, 0) + fin[1] * RHS(0, 1);
1088 for (
size_t mm(1); mm < 2 * Nm; ++mm) {
1089 RHSv[mm] = fin[mm - 1] * RHS(mm, mm - 1) + fin[mm] * RHS(mm, mm) + fin[mm + 1] * RHS(mm, mm + 1);
1091 RHSv[2 * Nm] = fin[2 * Nm - 1] * RHS(2 * Nm, 2 * Nm - 1) + fin[2 * Nm] * RHS(2 * Nm, 2 * Nm);
1105 Din(l,Nm)(k,i) = fin[0];
1106 for (
int m(Nm-1);m>1;--m)
1109 Din(l,m)(k,i) = fin[ind];
1111 Din(l,0)(k,i) = fin[Nm];
1127 complex<double> ii(0.0,1.0);
1129 valarray<complex<double> > Bx(FBx.
array());
1130 valarray<complex<double> > Bm(FBy.
array());
1133 valarray<complex<double> > Bp(FBy.
array());
1141 size_t l0(
B1.size()-1);
1142 size_t m0(
A1.size()-1);
1148 for (
size_t l(1); l < l0+1; ++l){
1200 double pmin,
double pmax,
size_t Np,
1201 double xmin,
double xmax,
size_t Nx)
1205 :
A1(Nl+1,Nm+1),
A2(Nl+1,Nm+1),
1206 fd1(Np,Nx), fd2(Np,Nx),
1212 complex<double>(pmax),
1216 complex<double> lc, mc;
1218 for (
size_t i(0); i <
vr.size(); ++i) {
1219 vr[i] =
vr[i]/(sqrt(1.0+
vr[i]*
vr[i]));
1222 double idx = (-1.0) / (2.0*(xmax-xmin)/
double(Nx));
1227 for (
size_t l(0); l < Nl+1; ++l){
1228 for (
size_t m=0; m<((Nm<l)?Nm:l)+1; ++m){
1229 lc = complex<double>(l);
1230 mc = complex<double>(m);
1231 A1(l,m) = idx *(-1.0) * (lc-mc+1.0) / (2.0*lc+1.0);
1232 A2(l,m) = idx *(-1.0) * (lc+mc) / (2.0*lc+1.0);
1238 A00 = complex<double>(idx);
1239 A10 = complex<double>(idx/3.0);
1240 A20 = complex<double>(idx*2.0/5.0);
1252 valarray<complex<double> > vt(
vr); vt *= 1.0/Din.
mass();
1254 size_t l0(Din.
l0());
1255 size_t m0(Din.
m0());
1257 for (
size_t m(0); m < ((m0<l0)?(m0+1):m0); ++m){
1263 for (
size_t l(m+1); l < l0; ++l) {
1283 valarray<complex<double> > vt(
vr); vt *= 1.0/Din.
mass();
1285 size_t l0(Din.
l0());
1287 fd1 = Din(0,0); fd1 = fd1.Dx();
1289 vt *=
A1(0,0); Dh(1,0) += fd1.mpaxis(vt);
1291 for (
size_t l(1); l < l0; ++l) {
1295 vt *=
A2(l,0)/
A1(l-1,0);
fd2 =
fd1; Dh(l-1,0) += fd1.mpaxis(vt);
1299 fd1 = Din(l0,0); fd1 = fd1.Dx();
1300 vt *=
A2(l0,0)/
A1(l0-1,0); Dh(l0-1,0) += fd1.mpaxis(vt);
1309 valarray<complex<double> > vt(
vr); vt *= 1.0/Din.
mass();
1334 : tmpE(Nx), numx(Nx) {
1336 idx = complex<double>((-1.0)/ (2.0*(xmax-xmin)/
double(Nx)));
1383 : tmpB(Nx),
numx(Nx) {
1385 idx = complex<double>((-1.0)/ (2.0*(xmax-xmin)/
double(Nx)));
void Implicit_Ez_f1only(const DistFunc1D &Din, const Field1D &FEz, DistFunc1D &Dh)
valarray< complex< double > > C3
bool Thomas_Tridiagonal(Array2D< double > &A, valarray< double > &d, valarray< double > &xk)
The tridiagonal solver for implicit collisions.
valarray< complex< double > > B1
void MakeG00(SHarmonic1D &f)
Ampere_1D(double xmin, double xmax, size_t Nx)
Underlying data structures.
Array2D< complex< double > > C2
Electric_Field_1D(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
valarray< complex< double > > A1
void implicit(DistFunc1D &Din, const Field1D &FBx, const Field1D &FBy, const Field1D &FBz, double dt)
void Implicit_Ex(const DistFunc1D &Din, const Field1D &FEx, DistFunc1D &Dh)
Magnetic_Field_1D(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
Array2D< complex< double > > A2
SHarmonic1D & mxaxis(const valarray< complex< double > > &shmulti)
Array2D< complex< double > > A2
valarray< complex< double > > vr
void es1d(const DistFunc1D &Din, Field1D &FExh)
Spatial_Advection_1D(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
void operator()(EMF1D &EMFin, EMF1D &EMFh)
void Implicit_Ey_f1only(const DistFunc1D &Din, const Field1D &FEy, DistFunc1D &Dh)
void Implicit_Ez(const DistFunc1D &Din, const Field1D &FEz, DistFunc1D &Dh)
Functors for various time-integration methodds - Declarations.
valarray< complex< double > > & array() const
void operator()(const DistFunc1D &Din, const Field1D &FBx, const Field1D &FBy, const Field1D &FBz, DistFunc1D &Dh)
void f1only(const DistFunc1D &Din, const Field1D &FEx, const Field1D &FEy, const Field1D &FEz, DistFunc1D &Dh)
void f1only(const DistFunc1D &Din, const Field1D &FBx, const Field1D &FBy, const Field1D &FBz, DistFunc1D &Dh)
void f1only(const DistFunc1D &Din, DistFunc1D &Dh)
void Implicit_Ey(const DistFunc1D &Din, const Field1D &FEy, DistFunc1D &Dh)
Array2D< complex< double > > A1
Array2D< complex< double > > A1
void operator()(const DistFunc1D &Din, Field1D &FExh, Field1D &FEyh, Field1D &FEzh)
valarray< complex< double > > B2
void operator()(EMF1D &EMFin, EMF1D &EMFh)
Fields, Distributions, Harmonics, States - Declarations.
valarray< complex< double > > pr
void MakeGH(SHarmonic1D &f, size_t l)
valarray< T > MakeCAxis(const T min, const T max, const size_t N)
void operator()(const DistFunc1D &Din, DistFunc1D &Dh)
valarray< complex< double > > C1
valarray< complex< double > > B1
Array2D< complex< double > > C4
Current_1D(double pmin, double pmax, size_t Np, size_t Nx)
Faraday_1D(double xmin, double xmax, size_t Nx)
void operator()(const DistFunc1D &Din, const Field1D &FEx, const Field1D &FEy, const Field1D &FEz, DistFunc1D &Dh)
void es1d(const DistFunc1D &Din, const Field1D &FEx, const Field1D &FEy, const Field1D &FEz, DistFunc1D &Dh)
valarray< complex< double > > invpr
valarray< complex< double > > Hp0
valarray< double > getcurrent(size_t dir)
Array2D< complex< double > > A2
The 1D distribution function is the container for all SHarmonic1D per species.
void Implicit_Ex_f1only(const DistFunc1D &Din, const Field1D &FEx, DistFunc1D &Dh)
void es1d(const DistFunc1D &Din, DistFunc1D &Dh)
SHarmonic1D & mpaxis(const valarray< complex< double > > &shmulti)
Numerical Methods - Declarations.