OSHUN  beta
Arbitrary Order Spherical-Harmonic 1D-3P Vlasov-Fokker-Planck-Maxwell code
Hydro_Advection_1D Class Reference

#include <fluid.h>

Collaboration diagram for Hydro_Advection_1D:

Public Member Functions

 Hydro_Advection_1D (size_t Nl, size_t Nm, double pmin, double pmax, size_t Np, double xmin, double xmax, size_t Nx)
 
void operator() (const DistFunc1D &Din, const Hydro1D &hydro, DistFunc1D &Dh)
 

Private Member Functions

void MakeGH (SHarmonic1D &f, size_t l)
 
void MakeG00 (SHarmonic1D &f)
 

Private Attributes

SHarmonic1D H
 
SHarmonic1D G
 
SHarmonic1D TMP
 
SHarmonic1D fd1
 
SHarmonic1D fd2
 
Array2D< complex< double > > XX1
 
Array2D< complex< double > > XX2
 
Array2D< complex< double > > XX3
 
Array2D< complex< double > > XX4
 
Array2D< complex< double > > A1
 
Array2D< complex< double > > A2
 
valarray< complex< double > > pr
 
valarray< complex< double > > invpr
 
valarray< complex< double > > Hp0
 
size_t szx
 
size_t Nbc
 
double idp
 
double idx
 

Detailed Description

Definition at line 61 of file fluid.h.

Constructor & Destructor Documentation

◆ Hydro_Advection_1D()

Hydro_Advection_1D::Hydro_Advection_1D ( size_t  Nl,
size_t  Nm,
double  pmin,
double  pmax,
size_t  Np,
double  xmin,
double  xmax,
size_t  Nx 
)

Definition at line 259 of file fluid.cpp.

References A2, Input::Input_List::BoundaryCells, Hp0, idp, idx, invpr, Input::List(), Nbc, pr, XX1, XX2, XX3, and XX4.

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),
268  pr(Algorithms::MakeCAxis(static_cast<complex<double> >(pmin),
269  static_cast<complex<double> >(pmax),
270  Np)),
271  invpr(pr), szx(Nx)
272  {
273 // - - - - - - - - - - - - - - - - - - - - - - - - - - -
274  complex<double> lc, mc;
275 
276 // Inverted momentum axis
277  for (size_t i(0); i < pr.size(); ++i) {
278  invpr[i] = 1.0/pr[i];
279  }
280  idp = (-1.0)/ (2.0*(pmax-pmin)/double(Np)); // -1/(2dp)
281  idx = (-1.0) / (2.0*(xmax-xmin)/double(Nx)); // -1/(2dx)
282 
284 
285 // - - - - - - - - - - - - - - - - - - - - - - - - - - -
286 // Calculate the "A1, A2" parameters
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) ;
293 
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) ; //idx *(-1.0) * (lc-mc+1.0) / (2.0*lc+1.0);
296  }
297  }
298  A2(0,0) = 1.0;
299  // -2*Dp*H at the 0 momentum cell
300  Hp0[0] = 1.0 / pr[0];
301  for (size_t l(1); l < Nl+1; ++l) {
302  double ld(l);
303  Hp0[l] = Hp0[l-1] * (pr[0]/pr[1]) * (2.0*ld+1.0)/(2.0*ld-1.0);
304  }
305  Hp0 *= (-2.0)*(pr[1]-pr[0]);
306  }
SHarmonic1D H
Definition: fluid.h:76
double idp
Definition: fluid.h:82
Array2D< complex< double > > XX2
Definition: fluid.h:78
SHarmonic1D fd2
Definition: fluid.h:77
valarray< complex< double > > pr
Definition: fluid.h:80
Array2D< complex< double > > A1
Definition: fluid.h:79
SHarmonic1D fd1
Definition: fluid.h:77
Array2D< complex< double > > A2
Definition: fluid.h:79
size_t szx
Definition: fluid.h:81
double idx
Definition: fluid.h:82
Array2D< complex< double > > XX1
Definition: fluid.h:78
Array2D< complex< double > > XX4
Definition: fluid.h:78
valarray< complex< double > > Hp0
Definition: fluid.h:80
SHarmonic1D TMP
Definition: fluid.h:76
valarray< complex< double > > invpr
Definition: fluid.h:80
valarray< T > MakeCAxis(const T min, const T max, const size_t N)
Input_List & List()
Definition: input.cpp:1585
SHarmonic1D G
Definition: fluid.h:76
Array2D< complex< double > > XX3
Definition: fluid.h:78
size_t Nbc
Definition: fluid.h:81
int BoundaryCells
Definition: input.h:50
Here is the call graph for this function:

Member Function Documentation

◆ MakeG00()

void Hydro_Advection_1D::MakeG00 ( SHarmonic1D f)
private

Definition at line 464 of file fluid.cpp.

References SHarmonic1D::Dp(), G, SHarmonic1D::numx(), and pr.

Referenced by operator()().

464  {
465 //--------------------------------------------------------------
466  G = f; G = G.Dp();
467 
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]),
471  f00;
472 
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;
476  }
477  }
valarray< complex< double > > pr
Definition: fluid.h:80
size_t numx() const
Definition: state.h:72
SHarmonic1D & Dp()
Definition: state.cpp:139
SHarmonic1D G
Definition: fluid.h:76
Here is the call graph for this function:
Here is the caller graph for this function:

◆ MakeGH()

void Hydro_Advection_1D::MakeGH ( SHarmonic1D f,
size_t  l 
)
private

Definition at line 445 of file fluid.cpp.

References SHarmonic1D::Dp(), G, H, Hp0, invpr, SHarmonic1D::mpaxis(), SHarmonic1D::numx(), and pr.

Referenced by operator()().

445  {
446 //--------------------------------------------------------------
447  valarray<complex<double> > invpax(invpr);
448  complex<double> ld(el);
449 
450  invpax *= (-2.0)*(ld+1.0) * (pr[1]-pr[0]);
451 
452  G = f; H = f;
453  G = G.Dp();
454  H = H.mpaxis(invpax);
455  H += G;
456  G *= -(2.0*ld+1.0)/ld;
457  G += H;
458 
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];
461  }
SHarmonic1D H
Definition: fluid.h:76
valarray< complex< double > > pr
Definition: fluid.h:80
size_t numx() const
Definition: state.h:72
SHarmonic1D & Dp()
Definition: state.cpp:139
valarray< complex< double > > Hp0
Definition: fluid.h:80
valarray< complex< double > > invpr
Definition: fluid.h:80
SHarmonic1D G
Definition: fluid.h:76
SHarmonic1D & mpaxis(const valarray< complex< double > > &shmulti)
Definition: state.cpp:122
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator()()

void Hydro_Advection_1D::operator() ( const DistFunc1D Din,
const Hydro1D hydro,
DistFunc1D Dh 
)

Definition at line 311 of file fluid.cpp.

References G, H, idx, DistFunc1D::l0(), DistFunc1D::m0(), MakeG00(), MakeGH(), DistFunc1D::mass(), pr, szx, TMP, Hydro1D::vx(), Hydro1D::vxarray(), XX1, XX2, XX3, and XX4.

311  {
312 //--------------------------------------------------------------
313 
314  valarray<complex<double> > vt(pr); vt *= 1.0/Din.mass();
315  valarray<complex<double> > tempv(vt);
316 
317 
318  valarray<complex<double> > Ux(0.0,(hydro.vxarray()).size());
319  valarray<complex<double> > dUxdx(0.0,(hydro.vxarray()).size());
320 
321 
322  Ux[0] = hydro.vx(0);
323  dUxdx[0] = idx*(hydro.vx(1)-hydro.vx(0));
324 
325  Ux[szx-1] = hydro.vx(szx-1);
326  dUxdx[szx-1] = idx*(hydro.vx(szx-1)-hydro.vx(szx-2));
327  for (size_t i(1);i<szx-1;++i)
328  {
329  Ux[i] = hydro.vx(i);
330  // dUxdx[i] = idx/12.0*(-hydro.vx(i+2)+8.0*(hydro.vx(i+1)-hydro.vx(i-1))+hydro.vx(i-2));
331  dUxdx[i] = idx*0.5*(hydro.vx(i+1)-hydro.vx(i-1));
332  // dUxdx[i] = idx/3.0*(-Cx[i+3]+6.0*Cx[i+2]-3.0*Cx[i+1]-2.0*Cx[i]);
333  }
334 
335 
336  // vt += fluidvx;
337  size_t l0(Din.l0());
338  size_t m0(Din.m0());
339 
340  SHarmonic1D tG(G), tH(H);
341 
342  // dCdx df/dv term
343  TMP = Din(0,0); //fd1 = fd1.Dx();
344  MakeGH(TMP, 0); MakeG00(TMP); tH=H;tG=G;
345 
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;
349 
350  // Dh.checknan();
351 
352  TMP = Din(1,0); //fd1 = fd1.Dx();
353  MakeGH(TMP,1); tH=H;tG=G;
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;
357 
358  // Dh.checknan();
359 
360  TMP = Din(1,1);
361  MakeGH(TMP,1); tH=H;tG=G;
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;
365  // tempv = vt * 1.0;
366 
367  MakeGH(TMP,l0); tH=H;tG=G;
368  for (size_t m(0); m<((m0<l0-1)?(m0+1):(l0-1)); ++m){
369  TMP = Din(l0,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;
373  // tempv = vt * 1.0);
374  }
375  for (size_t m(l0-2); m<((m0<l0)?(m0):(l0+1)); ++m){
376  // TMP = Din(l0,m); //fd1 = fd1.Dx();
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;
379  // tempv = vt * XX4(l0,m)); TMP = H.mpaxis(tempv); Dh(l0-2,m) += TMP;
380  // tempv = vt * 1.0);
381  }
382 
383 
384  MakeGH(TMP,l0-1); tH=H;tG=G;
385  for (size_t m(0); m<((m0<l0-2)?(m0+1):(l0-2)); ++m){
386  // TMP = Din(l0-1,m); //fd1 = fd1.Dx();
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;
390  // tempv = vt * 1.0;
391  }
392 
393  for (size_t m(l0-3); m<((m0<l0)?(m0+1):(l0+1)); ++m){
394  // TMP = Din(l0-1,m); //fd1 = fd1.Dx();
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;
397  // tempv = vt * 1.0,m);
398  }
399 
400  for (size_t l(2); l<l0-1; ++l){
401  MakeGH(TMP,l); tH=H;tG=G;
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;
405  // tempv = vt * 1.0;
406  }
407 
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;
410  }
411 
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;
414  // tempv = vt * 1.0;
415  }
416  }
417 
418  // C df/dr term
419  for (size_t m(0); m < ((m0<l0)?(m0+1):m0); ++m){
420 
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);
424 
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;
428 
429  Dh(l,m) += tH.mxaxis(Ux);
430 
431  }
432 
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;
435 
436  Dh(l0,m) += tH.mxaxis(Ux);
437 
438 
439  }
440 }
SHarmonic1D H
Definition: fluid.h:76
Array2D< complex< double > > XX2
Definition: fluid.h:78
double mass() const
Definition: state.h:400
valarray< complex< double > > pr
Definition: fluid.h:80
size_t szx
Definition: fluid.h:81
double idx
Definition: fluid.h:82
Array2D< complex< double > > XX1
Definition: fluid.h:78
A 1D Spherical Harmonic.
Definition: state.h:57
Array2D< complex< double > > XX4
Definition: fluid.h:78
size_t m0() const
Definition: state.h:397
void MakeG00(SHarmonic1D &f)
Definition: fluid.cpp:464
SHarmonic1D TMP
Definition: fluid.h:76
double & vx(size_t i)
Definition: state.h:530
size_t l0() const
Definition: state.h:396
SHarmonic1D G
Definition: fluid.h:76
valarray< double > & vxarray() const
Definition: state.h:546
Array2D< complex< double > > XX3
Definition: fluid.h:78
void MakeGH(SHarmonic1D &f, size_t l)
Definition: fluid.cpp:445
Here is the call graph for this function:

Field Documentation

◆ A1

Array2D< complex<double> > Hydro_Advection_1D::A1
private

Definition at line 79 of file fluid.h.

◆ A2

Array2D< complex<double> > Hydro_Advection_1D::A2
private

Definition at line 79 of file fluid.h.

Referenced by Hydro_Advection_1D().

◆ fd1

SHarmonic1D Hydro_Advection_1D::fd1
private

Definition at line 77 of file fluid.h.

◆ fd2

SHarmonic1D Hydro_Advection_1D::fd2
private

Definition at line 77 of file fluid.h.

◆ G

SHarmonic1D Hydro_Advection_1D::G
private

Definition at line 76 of file fluid.h.

Referenced by MakeG00(), MakeGH(), and operator()().

◆ H

SHarmonic1D Hydro_Advection_1D::H
private

Definition at line 76 of file fluid.h.

Referenced by MakeGH(), and operator()().

◆ Hp0

valarray< complex<double> > Hydro_Advection_1D::Hp0
private

Definition at line 80 of file fluid.h.

Referenced by Hydro_Advection_1D(), and MakeGH().

◆ idp

double Hydro_Advection_1D::idp
private

Definition at line 82 of file fluid.h.

Referenced by Hydro_Advection_1D().

◆ idx

double Hydro_Advection_1D::idx
private

Definition at line 82 of file fluid.h.

Referenced by Hydro_Advection_1D(), and operator()().

◆ invpr

valarray< complex<double> > Hydro_Advection_1D::invpr
private

Definition at line 80 of file fluid.h.

Referenced by Hydro_Advection_1D(), and MakeGH().

◆ Nbc

size_t Hydro_Advection_1D::Nbc
private

Definition at line 81 of file fluid.h.

Referenced by Hydro_Advection_1D().

◆ pr

valarray< complex<double> > Hydro_Advection_1D::pr
private

Definition at line 80 of file fluid.h.

Referenced by Hydro_Advection_1D(), MakeG00(), MakeGH(), and operator()().

◆ szx

size_t Hydro_Advection_1D::szx
private

Definition at line 81 of file fluid.h.

Referenced by operator()().

◆ TMP

SHarmonic1D Hydro_Advection_1D::TMP
private

Definition at line 76 of file fluid.h.

Referenced by operator()().

◆ XX1

Array2D< complex<double> > Hydro_Advection_1D::XX1
private

Definition at line 78 of file fluid.h.

Referenced by Hydro_Advection_1D(), and operator()().

◆ XX2

Array2D< complex<double> > Hydro_Advection_1D::XX2
private

Definition at line 78 of file fluid.h.

Referenced by Hydro_Advection_1D(), and operator()().

◆ XX3

Array2D< complex<double> > Hydro_Advection_1D::XX3
private

Definition at line 78 of file fluid.h.

Referenced by Hydro_Advection_1D(), and operator()().

◆ XX4

Array2D< complex<double> > Hydro_Advection_1D::XX4
private

Definition at line 78 of file fluid.h.

Referenced by Hydro_Advection_1D(), and operator()().


The documentation for this class was generated from the following files: