37 idx(numx/(xmax-xmin)), szx(numx), FEQ(xmin,xmax,numx) {}
43 valarray<double> electronpressure(0.0,
szx), electrondensity(0.0,
szx);
51 FEQ.
velocity( Yin , Yslope.
HYDRO(), electrondensity, electronpressure, electroncurrent);
66 :
idx(Nx/(xmax-xmin)),
szx(Nx), dummy(0.0,Nx)
76 for (
size_t ix(0);ix<
szx;++ix)
77 d_nvx[ix] = d_nvx[ix] * Hin.
vx(ix);
83 for (
size_t ix(1);ix<szx-1;++ix)
95 for (
size_t ix(0);ix<
szx;++ix)
96 d_nZx[ix] = d_nZx[ix] * Hin.
Z(ix);
100 Hslope.
Z(0) -=
idx * d_nZx[0];
102 for (
size_t ix(1);ix<szx-1;++ix)
104 Hslope.
Z(ix) -=
idx * d_nZx[ix];
107 Hslope.
Z(szx - 1) -=
idx * d_nZx[szx-1];
113 valarray<double>& electrondensity, valarray<double>& electronpressure,
Array2D<double>& electroncurrent){
117 valarray<double> eventuallychargeseparation(electronpressure);
121 for (
size_t ix(0);ix<
szx;++ix){
122 eventuallynetPovern[ix] = eventuallynetPovern[ix] * Yin.
HYDRO().
temperature(ix);
125 eventuallynetPovern =
df_4thorder(eventuallynetPovern);
126 eventuallychargeseparation =
df_4thorder(eventuallychargeseparation);
128 for (
size_t ix(0);ix<
szx;++ix){
131 eventuallynetPovern[ix] = eventuallynetPovern[ix] / Yin.
HYDRO().
density(ix) + eventuallychargeseparation[ix] / electrondensity[ix];
147 Hslope.
vx(0) += -
idx * eventuallynetPovern[0] / Yin.
HYDRO().
mass()
148 + Zeovermi * eventuallychargeseparation[0] * (Yin.
EMF().
Ex()(0).real()
149 + netcurrent(1,0) * Yin.
EMF().
Bz()(0).real()
150 - netcurrent(2,0) * Yin.
EMF().
By()(0).real());
152 Hslope.
vx(0) -= netcurrent(0,0) * (
idx * d_vx[0]);
154 for (
size_t ix(1);ix<szx-1;++ix)
157 Hslope.
vx(ix) += -0.5 *
idx * eventuallynetPovern[ix] / Yin.
HYDRO().
mass()
158 + Zeovermi * eventuallychargeseparation[ix] * (Yin.
EMF().
Ex()(ix).real()
159 + netcurrent(1,ix) * Yin.
EMF().
Bz()(ix).real()
160 - netcurrent(2,ix) * Yin.
EMF().
By()(ix).real());
161 Hslope.
vx(ix) -= netcurrent(0,ix) * (
idx * d_vx[ix]);
164 Hslope.
vx(szx - 1) += -
idx * eventuallynetPovern[szx - 1] / Yin.
HYDRO().
mass()
165 + Zeovermi * eventuallychargeseparation[szx - 1] * (Yin.
EMF().
Ex()(szx - 1).real()
166 + netcurrent(1,szx - 1) * Yin.
EMF().
Bz()(szx - 1).real()
167 - netcurrent(2,szx - 1) * Yin.
EMF().
By()(szx - 1).real());
168 Hslope.
vx(szx - 1) -= netcurrent(0,szx - 1) * (
idx * d_vx[szx - 1]);
173 Hslope.
vy(0) += Zeovermi *
174 ( netcurrent(2,0) * Yin.
EMF().
Bx()(0).real()
175 - netcurrent(0,0) * Yin.
EMF().
Bz()(0).real()
176 + eventuallychargeseparation[0] * Yin.
EMF().
Ey()(0).real());
178 for (
size_t ix(1);ix<szx-1;++ix)
180 Hslope.
vy(ix) += Zeovermi *
181 ( netcurrent(2,ix) * Yin.
EMF().
Bx()(ix).real()
182 - netcurrent(0,ix) * Yin.
EMF().
Bz()(ix).real()
183 + eventuallychargeseparation[ix] * Yin.
EMF().
Ey()(ix).real());
186 Hslope.
vy(szx - 1) += Zeovermi *
187 ( netcurrent(2,szx - 1) * Yin.
EMF().
Bx()(szx - 1).real()
188 - netcurrent(0,szx - 1) * Yin.
EMF().
Bz()(szx - 1).real()
189 + eventuallychargeseparation[szx - 1] * Yin.
EMF().
Ey()(szx - 1).real());
195 Hslope.
vz(0) += Zeovermi *
196 ( netcurrent(0,0) * Yin.
EMF().
By()(0).real()
197 - netcurrent(1,0) * Yin.
EMF().
Bx()(0).real()
198 + eventuallychargeseparation[0] * Yin.
EMF().
Ez()(0).real());
200 for (
size_t ix(1);ix<szx-1;++ix)
202 Hslope.
vz(ix) += Zeovermi *
203 ( netcurrent(0,ix) * Yin.
EMF().
By()(ix).real()
204 - netcurrent(1,ix) * Yin.
EMF().
Bx()(ix).real()
205 + eventuallychargeseparation[ix] * Yin.
EMF().
Ez()(ix).real());
208 Hslope.
vz(szx - 1) += Zeovermi *
209 ( netcurrent(0,szx - 1) * Yin.
EMF().
By()(szx - 1).real()
210 - netcurrent(1,szx - 1) * Yin.
EMF().
Bx()(szx - 1).real()
211 + eventuallychargeseparation[szx - 1] * Yin.
EMF().
Ez()(szx - 1).real());
222 for (
size_t ix(0);ix<
szx;++ix){
260 double pmin,
double pmax,
size_t Np,
261 double xmin,
double xmax,
size_t Nx)
265 : XX1(Nl+1,Nm+1), XX2(Nl+1,Nm+1), XX3(Nl+1,Nm+1), XX4(Nl+1,Nm+1),
266 A1(Nl+1,Nm+1), A2(Nl+1,Nm+1), fd1(Nl+1,Nm+1), fd2(Nl+1,Nm+1),
267 Hp0(Nl+1), H(Np,Nx), G(Np,Nx), TMP(Np,Nx),
269 static_cast<complex<double> >(pmax),
274 complex<double> lc, mc;
277 for (
size_t i(0); i <
pr.size(); ++i) {
280 idp = (-1.0)/ (2.0*(pmax-pmin)/
double(Np));
281 idx = (-1.0) / (2.0*(xmax-xmin)/
double(Nx));
287 for (
size_t l(0); l < Nl+1; ++l){
288 for (
size_t m=0; m<((Nm<l)?Nm:l)+1; ++m){
289 lc =
static_cast< complex<double>
>(l);
290 mc =
static_cast< complex<double>
>(m);
291 XX1(l,m) = (lc+mc ) * (lc-mc ) / (2.0*lc-1.0) / (2.0*lc+1.0) ;
292 XX2(l,m) = (lc-mc+1.0) * (lc+mc+1.0) / (2.0*lc+3.0) / (2.0*lc+1.0) ;
294 XX3(l,m) = (lc-mc+1.0) * (lc-mc+2.0) / (2.0*lc+3.0) / (2.0*lc+1.0) ;
295 XX4(l,m) = (lc+mc-1.0) * (lc+mc ) / (2.0*lc-1.0) / (2.0*lc+1.0) ;
300 Hp0[0] = 1.0 /
pr[0];
301 for (
size_t l(1); l < Nl+1; ++l) {
303 Hp0[l] =
Hp0[l-1] * (
pr[0]/
pr[1]) * (2.0*ld+1.0)/(2.0*ld-1.0);
314 valarray<complex<double> > vt(
pr); vt *= 1.0/Din.
mass();
315 valarray<complex<double> > tempv(vt);
318 valarray<complex<double> > Ux(0.0,(hydro.
vxarray()).size());
319 valarray<complex<double> > dUxdx(0.0,(hydro.
vxarray()).size());
323 dUxdx[0] =
idx*(hydro.
vx(1)-hydro.
vx(0));
327 for (
size_t i(1);i<
szx-1;++i)
331 dUxdx[i] =
idx*0.5*(hydro.
vx(i+1)-hydro.
vx(i-1));
346 tempv = vt *
XX1(0,0); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(0,0) += tH; tH =
H;
347 tempv = vt *
XX2(0,0); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(0,0) += tG; tG =
G;
348 tempv = vt *
XX3(0,0); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(2,0) += tG;
354 tempv = vt *
XX1(1,0); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(1,0) += tH; tH =
H;
355 tempv = vt *
XX2(1,0); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(1,0) += tG; tG =
G;
356 tempv = vt *
XX3(1,0); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(3,0) += tG;
362 tempv = vt *
XX1(1,1); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(1,1) += tH; tH =
H;
363 tempv = vt *
XX2(1,1); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(1,1) += tG; tG =
G;
364 tempv = vt *
XX3(1,1); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(3,1) += tG; tG =
G;
368 for (
size_t m(0); m<((m0<l0-1)?(m0+1):(l0-1)); ++m){
370 tempv = vt *
XX1(l0,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l0,m) += tH; tH =
H;
371 tempv = vt *
XX2(l0,m); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(l0,m) += tG; tG =
G;
372 tempv = vt *
XX4(l0,m); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(l0-2,m) += tG; tG =
G;
375 for (
size_t m(l0-2); m<((m0<l0)?(m0):(l0+1)); ++m){
377 tempv = vt *
XX1(l0,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l0,m) += tH; tH =
H;
378 tempv = vt *
XX2(l0,m); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(l0,m) += tG; tG =
G;
385 for (
size_t m(0); m<((m0<l0-2)?(m0+1):(l0-2)); ++m){
387 tempv = vt *
XX1(l0-1,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l0-1,m) += tH; tH =
H;
388 tempv = vt *
XX2(l0-1,m); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(l0-1,m) += tG; tG =
G;
389 tempv = vt *
XX4(l0-1,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l0-3,m) += tH; tH =
H;
393 for (
size_t m(l0-3); m<((m0<l0)?(m0+1):(l0+1)); ++m){
395 tempv = vt *
XX1(l0-1,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l0-1,m) += tH; tH =
H;
396 tempv = vt *
XX2(l0-1,m); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(l0-1,m) += tG; tG =
G;
400 for (
size_t l(2); l<l0-1; ++l){
402 for (
size_t m(0); m < ((m0<l+1)?(m0+1):(l+1)); ++m){
403 tempv = vt *
XX1(l,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l,m) += tH; tH =
H;
404 tempv = vt *
XX2(l,m); tG.mpaxis(tempv); tG.mxaxis(dUxdx); Dh(l,m) += tG; tG =
G;
408 for (
size_t m(0); m < ((m0<l-1)?(m0+1):(l-1)); ++m){
409 tempv = vt *
XX4(l,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l-2,m) += tH; tH =
H;
412 for (
size_t m(0); m < ((m0<l+3)?(m0+1):(l+3)); ++m){
413 tempv = vt *
XX3(l,m); tH.mpaxis(tempv); tH.mxaxis(dUxdx); Dh(l+2,m) += tH; tH =
H;
419 for (
size_t m(0); m < ((m0<l0)?(m0+1):m0); ++m){
421 tH = Din(m,m); tH = tH.Dx();
422 for (
int ip(0); ip<tH.nump(); ++ip) tH(ip,Din(0,0).numx()-1) = 0.0;
423 Dh(m,m) += tH.mxaxis(Ux);
425 for (
size_t l(m+1); l < l0; ++l) {
426 tH = Din(l,m); tH = tH.Dx();
427 for (
int ip(0); ip<tH.nump(); ++ip) tH(ip,Din(0,0).numx()-1) = 0.0;
429 Dh(l,m) += tH.mxaxis(Ux);
433 tH = Din(l0,m); tH = tH.Dx();
434 for (
int ip(0); ip<tH.nump(); ++ip) tH(ip,Din(0,0).numx()-1) = 0.0;
436 Dh(l0,m) += tH.mxaxis(Ux);
447 valarray<complex<double> > invpax(
invpr);
448 complex<double> ld(el);
450 invpax *= (-2.0)*(ld+1.0) * (
pr[1]-
pr[0]);
456 G *= -(2.0*ld+1.0)/ld;
459 for (
size_t i(0); i <
G.
numx(); ++i)
G(0,i) = 0.0;
460 for (
size_t i(0); i <
H.
numx(); ++i)
H(0,i) = f(1,i) *
Hp0[el];
468 complex<double> p0p1_sq(
pr[0]*
pr[0]/(
pr[1]*
pr[1]) ),
469 inv_mp0p1_sq( 1.0/(1.0-p0p1_sq) ),
470 g_r = -4.0*(pr[1]-pr[0]) * pr[0]/(pr[1]*pr[1]),
473 for (
size_t i(0); i < f.
numx(); ++i) {
474 f00 = ( f(0,i) - f(1,i) * p0p1_sq) * inv_mp0p1_sq;
475 G(0,i) = ( f(1,i) - f00) * g_r;
void velocity(const State1D &Yin, Hydro1D &Hslope, valarray< double > &electrondensity, valarray< double > &electronpressure, Array2D< double > &electroncurrent)
Fluid_Equation_1D(double xmin, double xmax, size_t Nx)
Constructors/Destructors.
valarray< double > getpressure()
valarray< double > df_4thorder(const valarray< double > &f)
Underlying data structures.
double idx
Evaluate Quantities from Distribution Functions.
Array2D< complex< double > > XX2
A Collection of relevant 1D Hydrodynamic Quantities.
void operator()(const DistFunc1D &Din, const Hydro1D &hydro, DistFunc1D &Dh)
void density(const Hydro1D &Hin, Hydro1D &Hslope)
Momentum (and Energy and Density?) Update.
valarray< complex< double > > pr
Array2D< complex< double > > A2
Array2D< complex< double > > XX1
Array2D< complex< double > > XX4
double & temperature(size_t i)
valarray< complex< double > > Hp0
void chargefraction(const Hydro1D &Hin, Hydro1D &Hslope)
DistFunc1D & DF(size_t s)
void MakeG00(SHarmonic1D &f)
void updateE(Hydro1D &HYDRO, EMF1D &EMF)
Electric Field Update.
Fields, Distributions, Harmonics, States - Declarations.
valarray< double > & densityarray() const
valarray< double > getdensity()
valarray< complex< double > > invpr
void operator()(const State1D &Hin, State1D &Hslope)
valarray< T > MakeCAxis(const T min, const T max, const size_t N)
double & density(size_t i)
valarray< double > & vxarray() const
Array2D< complex< double > > XX3
The 1D distribution function is the container for all SHarmonic1D per species.
Hydro_Functor(double xmin, double xmax, size_t numx)
Constructor for hydro equations.
Hydro_Advection_1D(size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
SHarmonic1D & mpaxis(const valarray< complex< double > > &shmulti)
void MakeGH(SHarmonic1D &f, size_t l)
Numerical Methods - Declarations.