28#include <Eigen/Geometry>
31 const std::array<T, N>&
ooo = {};
32 const std::array<T, N>&
poo = {};
33 const std::array<T, N>&
moo = {};
34 const std::array<T, N>&
opo = {};
35 const std::array<T, N>&
omo = {};
36 const std::array<T, N>&
oop = {};
37 const std::array<T, N>&
oom = {};
42 const fsgrid::FsStencil& stencil,
const bool atSysBoundary) {
46 std::array<Real, dmo::N_DMOMENTS>& dMoments = dmoments[stencil.ooo()];
48 auto computeDiff = [](
const auto&
i,
const auto&
right,
const auto&
left) {
return 0.5 * (
right[
i] -
left[
i]); };
50 auto computeLimiter = [](
const auto&
i,
const auto&
right,
const auto&
left,
const auto& center) {
58 auto computeGradPeLimiter = [=](
const auto&
right,
const auto&
left,
const auto& center) {
65 auto computeGradPeDiff = [=](
const auto&
right,
const auto&
left) {
70 moments[stencil.ooo()],
71 moments[stencil.poo()], moments[stencil.moo()],
72 moments[stencil.opo()], moments[stencil.omo()],
73 moments[stencil.oop()], moments[stencil.oom()],
78 const auto& cv = momData.
ooo[mom::RHOM];
80 std::cerr << __FILE__ <<
":" << __LINE__ << (cv < 0 ?
" Negative" :
" Zero") <<
" density in fsgrid cell " << stencil.indexFromOffset( 0,0,0) << std::endl;
84 const auto& lv = momData.
moo[mom::RHOM];
86 std::cerr << __FILE__ <<
":" << __LINE__ << (lv < 0 ?
" Negative" :
" Zero") <<
" density in fsgrid cell " << stencil.indexFromOffset(-1,0,0) << std::endl;
90 const auto& rv = momData.
poo[mom::RHOM];
92 std::cerr << __FILE__ <<
":" << __LINE__ << (rv < 0 ?
" Negative" :
" Zero") <<
" density in fsgrid cell " << stencil.indexFromOffset( 1,0,0) << std::endl;
98 static constexpr std::array moms{mom::RHOM, mom::RHOQ, mom::P_11, mom::P_22, mom::P_33, mom::VX, mom::VY, mom::VZ};
99 static constexpr std::array dmix{dmo::drhomdx, dmo::drhoqdx, dmo::dp11dx, dmo::dp22dx, dmo::dp33dx, dmo::dVxdx, dmo::dVydx, dmo::dVzdx};
100 static constexpr std::array dmiy{dmo::drhomdy, dmo::drhoqdy, dmo::dp11dy, dmo::dp22dy, dmo::dp33dy, dmo::dVxdy, dmo::dVydy, dmo::dVzdy};
101 static constexpr std::array dmiz{dmo::drhomdz, dmo::drhoqdz, dmo::dp11dz, dmo::dp22dz, dmo::dp33dz, dmo::dVxdz, dmo::dVydz, dmo::dVzdz};
104 for (
size_t i = 0;
i < moms.size();
i++) {
105 dMoments[dmix[
i]] = computeDiff(moms[
i], momData.
poo, momData.
moo);
106 dMoments[dmiy[
i]] = computeDiff(moms[
i], momData.
opo, momData.
omo);
107 dMoments[dmiz[
i]] = computeDiff(moms[
i], momData.
oop, momData.
oom);
109 dMoments[dmo::dPedx] = computeGradPeDiff(momData.
poo, momData.
moo);
110 dMoments[dmo::dPedy] = computeGradPeDiff(momData.
opo, momData.
omo);
111 dMoments[dmo::dPedz] = computeGradPeDiff(momData.
oop, momData.
oom);
113 for (
size_t i = 0;
i < moms.size();
i++) {
114 dMoments[dmix[
i]] = computeLimiter(moms[
i], momData.
poo, momData.
moo, momData.
ooo);
115 dMoments[dmiy[
i]] = computeLimiter(moms[
i], momData.
opo, momData.
omo, momData.
ooo);
116 dMoments[dmiz[
i]] = computeLimiter(moms[
i], momData.
oop, momData.
oom, momData.
ooo);
118 dMoments[dmo::dPedx] = computeGradPeLimiter(momData.
poo, momData.
moo, momData.
ooo);
119 dMoments[dmo::dPedy] = computeGradPeLimiter(momData.
opo, momData.
omo, momData.
ooo);
120 dMoments[dmo::dPedz] = computeGradPeLimiter(momData.
oop, momData.
oom, momData.
ooo);
126 bool dontCompute2ndDerivatives,
bool atSysBoundary,
cuint sysBoundaryFlag) {
129 std::array<Real, dpb::N_DPERB>& dPerB = dperb[stencil.ooo()];
131 auto computeDiff = [](
const auto&
i,
const auto&
right,
const auto&
left) {
return 0.5 * (
right[
i] -
left[
i]); };
133 auto computeLimiter = [](
const auto&
i,
const auto&
right,
const auto&
left,
const auto& center) {
137 perb[stencil.ooo()], perb[stencil.poo()], perb[stencil.moo()], perb[stencil.opo()],
138 perb[stencil.omo()], perb[stencil.oop()], perb[stencil.oom()],
142 dPerB[dpb::dPERBydx] = computeDiff(bfi::PERBY, perbData.
poo, perbData.
moo);
143 dPerB[dpb::dPERBzdx] = computeDiff(bfi::PERBZ, perbData.
poo, perbData.
moo);
144 dPerB[dpb::dPERBxdy] = computeDiff(bfi::PERBX, perbData.
opo, perbData.
omo);
145 dPerB[dpb::dPERBzdy] = computeDiff(bfi::PERBZ, perbData.
opo, perbData.
omo);
146 dPerB[dpb::dPERBxdz] = computeDiff(bfi::PERBX, perbData.
oop, perbData.
oom);
147 dPerB[dpb::dPERBydz] = computeDiff(bfi::PERBY, perbData.
oop, perbData.
oom);
149 dPerB[dpb::dPERBydx] = computeLimiter(bfi::PERBY, perbData.
poo, perbData.
moo, perbData.
ooo);
150 dPerB[dpb::dPERBzdx] = computeLimiter(bfi::PERBZ, perbData.
poo, perbData.
moo, perbData.
ooo);
151 dPerB[dpb::dPERBxdy] = computeLimiter(bfi::PERBX, perbData.
opo, perbData.
omo, perbData.
ooo);
152 dPerB[dpb::dPERBzdy] = computeLimiter(bfi::PERBZ, perbData.
opo, perbData.
omo, perbData.
ooo);
153 dPerB[dpb::dPERBxdz] = computeLimiter(bfi::PERBX, perbData.
oop, perbData.
oom, perbData.
ooo);
154 dPerB[dpb::dPERBydz] = computeLimiter(bfi::PERBY, perbData.
oop, perbData.
oom, perbData.
ooo);
157 if (dontCompute2ndDerivatives) {
158 dPerB[dpb::dPERBydxx] = 0.0;
159 dPerB[dpb::dPERBzdxx] = 0.0;
160 dPerB[dpb::dPERBxdyy] = 0.0;
161 dPerB[dpb::dPERBzdyy] = 0.0;
162 dPerB[dpb::dPERBxdzz] = 0.0;
163 dPerB[dpb::dPERBydzz] = 0.0;
164 dPerB[dpb::dPERBxdyz] = 0.0;
165 dPerB[dpb::dPERBydxz] = 0.0;
166 dPerB[dpb::dPERBzdxy] = 0.0;
168 auto compute2ndDerivative = [](
auto i,
const auto&
right,
const auto&
left,
const auto& center) {
171 dPerB[dpb::dPERBydxx] = compute2ndDerivative(bfi::PERBY, perbData.
poo, perbData.
moo, perbData.
ooo);
172 dPerB[dpb::dPERBzdxx] = compute2ndDerivative(bfi::PERBZ, perbData.
poo, perbData.
moo, perbData.
ooo);
173 dPerB[dpb::dPERBxdyy] = compute2ndDerivative(bfi::PERBX, perbData.
opo, perbData.
omo, perbData.
ooo);
174 dPerB[dpb::dPERBzdyy] = compute2ndDerivative(bfi::PERBZ, perbData.
opo, perbData.
omo, perbData.
ooo);
175 dPerB[dpb::dPERBxdzz] = compute2ndDerivative(bfi::PERBX, perbData.
oop, perbData.
oom, perbData.
ooo);
176 dPerB[dpb::dPERBydzz] = compute2ndDerivative(bfi::PERBY, perbData.
oop, perbData.
oom, perbData.
ooo);
179 auto crossDerivative = [&perb](
auto bl,
auto br,
auto tl,
auto tr,
auto i) {
180 const auto& botLeft = perb[bl];
181 const auto& botRght = perb[br];
182 const auto& topLeft = perb[tl];
183 const auto& topRght = perb[tr];
184 return FOURTH * (botLeft[
i] + topRght[
i] - botRght[
i] - topLeft[
i]);
187 dPerB[dpb::dPERBxdyz] = crossDerivative(stencil.omm(), stencil.opm(), stencil.omp(), stencil.opp(), bfi::PERBX);
188 dPerB[dpb::dPERBydxz] = crossDerivative(stencil.mom(), stencil.pom(), stencil.mop(), stencil.pop(), bfi::PERBY);
189 dPerB[dpb::dPERBzdxy] = crossDerivative(stencil.mmo(), stencil.pmo(), stencil.mpo(), stencil.ppo(), bfi::PERBZ);
213 const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer,
214 const bool doMoments) {
259 const bool doMoments) {
260 phiprof::Timer derivativesTimer{
"Calculate face derivatives"};
261 const size_t numCells =
fsgrid.getNumCells();
263 phiprof::Timer mpiTimer{
"FS derivatives ghost updates MPI", {
"MPI"}};
264 fsgrid.updateGhostCells(perb);
266 fsgrid.updateGhostCells(moments);
271 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
272 phiprof::initializeTimer(
"FS derivatives compute cells"), technical,
273 [=](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
274 calculateDerivatives(perb, moments, dperb, dmoments, stencil, sysBoundaryFlag, sysBoundaryLayer, doMoments);
277 derivativesTimer.stop(numCells,
"Spatial Cells");
297 const auto& tech = technical[stencil.ooo()];
299 cuint sysBoundaryFlag = tech.sysBoundaryFlag;
300 cuint sysBoundaryLayer = tech.sysBoundaryLayer;
301 const bool atSysBoundary =
306 auto computeDiff = [](
const auto&
i,
const auto&
right,
const auto&
left) {
return 0.5 * (
right[
i] -
left[
i]); };
308 auto computeLimiter = [](
const auto&
i,
const auto&
right,
const auto&
left,
const auto& center) {
312 auto& volCenter = vol[stencil.ooo()];
313 const auto poo = stencil.poo();
314 const auto moo = stencil.moo();
316 volCenter[vf::dPERBXVOLdx] = computeDiff(vf::PERBXVOL, vol[poo], vol[moo]);
317 volCenter[vf::dPERBYVOLdx] = computeDiff(vf::PERBYVOL, vol[poo], vol[moo]);
318 volCenter[vf::dPERBZVOLdx] = computeDiff(vf::PERBZVOL, vol[poo], vol[moo]);
320 volCenter[vf::dPERBXVOLdx] = computeLimiter(vf::PERBXVOL, vol[poo], vol[moo], volCenter);
321 volCenter[vf::dPERBYVOLdx] = computeLimiter(vf::PERBYVOL, vol[poo], vol[moo], volCenter);
322 volCenter[vf::dPERBZVOLdx] = computeLimiter(vf::PERBZVOL, vol[poo], vol[moo], volCenter);
325 const auto opo = stencil.opo();
326 const auto omo = stencil.omo();
328 volCenter[vf::dPERBXVOLdy] = computeDiff(vf::PERBXVOL, vol[opo], vol[omo]);
329 volCenter[vf::dPERBYVOLdy] = computeDiff(vf::PERBYVOL, vol[opo], vol[omo]);
330 volCenter[vf::dPERBZVOLdy] = computeDiff(vf::PERBZVOL, vol[opo], vol[omo]);
332 volCenter[vf::dPERBXVOLdy] = computeLimiter(vf::PERBXVOL, vol[opo], vol[omo], volCenter);
333 volCenter[vf::dPERBYVOLdy] = computeLimiter(vf::PERBYVOL, vol[opo], vol[omo], volCenter);
334 volCenter[vf::dPERBZVOLdy] = computeLimiter(vf::PERBZVOL, vol[opo], vol[omo], volCenter);
337 const auto oop = stencil.oop();
338 const auto oom = stencil.oom();
340 volCenter[vf::dPERBXVOLdz] = computeDiff(vf::PERBXVOL, vol[oop], vol[oom]);
341 volCenter[vf::dPERBYVOLdz] = computeDiff(vf::PERBYVOL, vol[oop], vol[oom]);
342 volCenter[vf::dPERBZVOLdz] = computeDiff(vf::PERBZVOL, vol[oop], vol[oom]);
344 volCenter[vf::dPERBXVOLdz] = computeLimiter(vf::PERBXVOL, vol[oop], vol[oom], volCenter);
345 volCenter[vf::dPERBYVOLdz] = computeLimiter(vf::PERBYVOL, vol[oop], vol[oom], volCenter);
346 volCenter[vf::dPERBZVOLdz] = computeLimiter(vf::PERBZVOL, vol[oop], vol[oom], volCenter);
363 phiprof::Timer derivsTimer{
"Calculate volume derivatives"};
364 const size_t numCells =
fsgrid.getNumCells();
366 phiprof::Timer commTimer{
"BVOL derivatives ghost updates MPI", {
"MPI"}};
367 fsgrid.updateGhostCells(vol);
368 commTimer.stop(numCells,
"Spatial Cells");
371 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
372 phiprof::initializeTimer(
"FS derivatives BVOL compute cells"), technical,
373 [=](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
377 derivsTimer.stop(numCells,
"Spatial Cells");
395 const fsgrid::FsStencil& stencil,
const std::array<Real, 3>& gridSpacing) {
396 auto normalize = [&vol, &bgb](
auto i) -> std::array<Real, 3> {
397 const auto& b = bgb[
i];
398 const auto& v = vol[
i];
402 const Real bnorm =
sqrt(bx*bx + by*by + bz*bz);
411 const auto [bx, by, bz] = normalize(stencil.ooo());
412 const auto [left_x_bx, left_x_by, left_x_bz] = normalize(stencil.moo());
413 const auto [rght_x_bx, rght_x_by, rght_x_bz] = normalize(stencil.poo());
414 const auto [left_y_bx, left_y_by, left_y_bz] = normalize(stencil.omo());
415 const auto [rght_y_bx, rght_y_by, rght_y_bz] = normalize(stencil.opo());
416 const auto [left_z_bx, left_z_by, left_z_bz] = normalize(stencil.oom());
417 const auto [rght_z_bx, rght_z_by, rght_z_bz] = normalize(stencil.oop());
419 auto& volCenter = vol[stencil.ooo()];
421 by * 0.5 * (rght_y_bx - left_y_bx) / gridSpacing[1] +
422 bz * 0.5 * (rght_z_bx - left_z_bx) / gridSpacing[2];
424 by * 0.5 * (rght_y_by - left_y_by) / gridSpacing[1] +
425 bz * 0.5 * (rght_z_by - left_z_by) / gridSpacing[2];
427 by * 0.5 * (rght_y_bz - left_y_bz) / gridSpacing[1] +
428 bz * 0.5 * (rght_z_bz - left_z_bz) / gridSpacing[2];
443 phiprof::Timer curvatureTimer{
"Calculate curvature"};
444 const size_t numCells =
fsgrid.getNumCells();
446 phiprof::Timer commTimer{
"Calculate curvature ghost updates MPI", {
"MPI"}};
447 fsgrid.updateGhostCells(vol);
448 commTimer.stop(numCells,
"Spatial Cells");
450 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
451 phiprof::initializeTimer(
"Calculate curvature compute cells"), technical,
452 [=](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
454 sysBoundaryLayer != 1 && sysBoundaryLayer != 2);
459 curvatureTimer.stop(numCells,
"Spatial Cells");
496 std::array<Real, 3> B =
getBVol(cell);
509 Eigen::Matrix3d Ptensor{
515 Eigen::Matrix3d transposerot = rot.transpose();
516 Eigen::Matrix3d Pprime = rot * Ptensor * transposerot;
518 Real Panisotropy{0.0};
519 if (Pprime(2, 2) >
EPS) {
520 Panisotropy = (Pprime(0, 0) + Pprime(1, 1)) / (2 * Pprime(2, 2));
549 std::array<Real, 3> myB =
getBVol(cell);
557 std::array<Real, 3> otherB =
getBVol(neighbor);
558 Real deltaBsq = pow(myB[0]-otherB[0], 2) + pow(myB[1]-otherB[1], 2) + pow(myB[2]-otherB[2], 2);
561 maxV = std::max(maxV, otherV);
563 Real maxRho = std::max(myRho, otherRho);
565 dRho = std::max(fabs(myRho - otherRho) / maxRho, dRho);
567 Real maxU = std::max(myU, otherU);
569 dU = std::max(fabs(myU - otherU) / maxU, dU);
572 dPsq = std::max((pow(myP[0]-otherP[0], 2) + pow(myP[1]-otherP[1], 2) + pow(myP[2] - otherP[2], 2)) / (2 * myRho * maxU), dPsq);
575 Real maxB =
sqrt(std::max(pow(myB[0], 2) + pow(myB[1], 2) + pow(myB[2], 2), pow(otherB[0], 2) + pow(otherB[1], 2) + pow(otherB[2], 2)));
577 dB = std::max(
sqrt(deltaBsq) / maxB, dB);
597 std::array<Real, 3> myJ = {dBZdy - dBYdz, dBXdz - dBZdx, dBYdx - dBXdy};
601 for (
int i = 0;
i < 3; ++
i) {
602 BdotJ += myB[
i] * myJ[
i];
603 Bsq += myB[
i] * myB[
i];
604 J += myJ[
i] * myJ[
i];
610 for (
int i = 0;
i < 3; ++
i) {
611 Bperp += std::pow(myB[
i] * (1 - BdotJ / Bsq), 2);
613 Bperp = std::sqrt(Bperp);
625 Real amr_vorticity {-1.0};
633 Eigen::Matrix3d rot =
634 Eigen::Quaterniond::FromTwoVectors(Eigen::Vector3d{myB[0], myB[1], myB[2]}, Eigen::Vector3d{0, 0, 1})
640 std::array<Real, 6> popP{pop.P[0], pop.P[1], pop.P[2], pop.P[3], pop.P[4], pop.P[5]};
643 Panisotropy = std::min(Panisotropy, popPanisotropy);
666 int N_cells = cells.size();
667 phiprof::Timer gradientsTimer{
"Calculate volume gradients"};
668 int computeTimerId{phiprof::initializeTimer(
"Calculate volume gradients compute cells")};
670 phiprof::Timer commTimer{
"Calculate volume gradients ghost updates MPI", {
"MPI"}};
674 commTimer.stop(N_cells,
"Spatial Cells");
679 phiprof::Timer computeTimer{computeTimerId};
681 for (uint
i = 0;
i < cells.size(); ++
i) {
684 std::vector<SpatialCell*> neighbors;
685 for (
const auto& [neighbor, dir] : mpiGrid.get_face_neighbors_of(
id)) {
686 neighbors.push_back(mpiGrid[neighbor]);
690 computeTimer.stop(N_cells,
"Spatial Cells");
693 gradientsTimer.stop(N_cells,
"Spatial Cells");
sqrt(1.0+vA *vA/(c *c))) % Ion-acoustic wave cS
static void setCellDerivativesToZero(fsgrids::dperbspan dperb, fsgrids::dmomentsspan dmoments, const fsgrid::FsStencil &stencil, cuint component)
std::array< Real, vderivatives::N_V_DERIVATIVES > derivativesV
static void set_mpi_transfer_type(const uint64_t type, bool atSysBoundaries=false)
std::vector< Population > & get_populations()
std::array< Real, bvolderivatives::N_BVOL_DERIVATIVES > derivativesBVOL
std::array< Real, CellParams::N_SPATIAL_CELL_PARAMS > parameters
const std::vector< CellID > & getLocalCells()
fsgrid::FsGrid< FS_STENCIL_WIDTH > FieldSolverGrid
void calculateBVOLDerivativesSimple(fsgrids::volspan vol, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid)
High-level derivative calculation wrapper function.
void calculateCurvatureSimple(fsgrids::volspan vol, fsgrids::constbgbspan bgb, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid)
High-level curvature calculation wrapper function.
void calculateDerivatives(fsgrids::perbspan perb, fsgrids::constmomentsspan moments, fsgrids::dperbspan dperb, fsgrids::dmomentsspan dmoments, const fsgrid::FsStencil &stencil, cuint sysBoundaryFlag, cuint sysBoundaryLayer, const bool doMoments)
Low-level spatial derivatives calculation.
void calculateDerivativesSimple(fsgrids::perbspan perb, fsgrids::momentsspan moments, fsgrids::dperbspan dperb, fsgrids::dmomentsspan dmoments, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid, const bool doMoments)
High-level derivative calculation wrapper function.
static std::array< Real, 3 > getBVol(SpatialCell *cell)
Returns volumetric B of cell.
void computePerbDerivatives(fsgrids::perbspan perb, fsgrids::dperbspan dperb, const fsgrid::FsStencil &stencil, bool dontCompute2ndDerivatives, bool atSysBoundary, cuint sysBoundaryFlag)
static Real calculateU(SpatialCell *cell)
Calculates energy density for spatial cell.
void calculateScaledDeltasSimple(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid)
High-level scaled gradient calculation wrapper function.
void calculateCurvature(fsgrids::volspan vol, fsgrids::constbgbspan bgb, const fsgrid::FsStencil &stencil, const std::array< Real, 3 > &gridSpacing)
Low-level curvature calculation.
static Real calculateAnisotropy(const Eigen::Matrix3d &rot, const std::array< Real, 6 > &P)
Calculates pressure anistotropy from B and Pi.
static std::array< Real, 3 > getPerBVol(SpatialCell *cell)
Returns perturbed volumetric B of cell.
void calculateScaledDeltas(SpatialCell *cell, std::vector< SpatialCell * > &neighbors)
Low-level scaled gradients calculation.
void calculateBVOLDerivatives(fsgrids::volspan vol, fsgrids::consttechnicalspan technical, const fsgrid::FsStencil &stencil)
Low-level spatial derivatives calculation.
static std::array< Real, 3 > getMomentumDensity(SpatialCell *cell)
Calculates momentum density of cell.
void computeMomentsDerivatives(fsgrids::constmomentsspan moments, fsgrids::dmomentsspan dmoments, const fsgrid::FsStencil &stencil, const bool atSysBoundary)
Definitions of the limiter functions used in the field solver.
T limiter(const T &left, const T ¢, const T &rght)
std::span< std::array< Real, fsgrids::bfield::N_BFIELD > > perbspan
std::span< const std::array< Real, bgbfield::N_BGB > > constbgbspan
std::span< const std::array< Real, fsgrids::moments::N_MOMENTS > > constmomentsspan
std::span< std::array< Real, fsgrids::moments::N_MOMENTS > > momentsspan
std::span< std::array< Real, fsgrids::dmoments::N_DMOMENTS > > dmomentsspan
std::span< technical > technicalspan
std::span< std::array< Real, fsgrids::dperb::N_DPERB > > dperbspan
std::span< const technical > consttechnicalspan
std::span< std::array< Real, fsgrids::volfields::N_VOL > > volspan
static const uint64_t ALL_SPATIAL_DATA
const std::array< T, N > & oom
const std::array< T, N > & poo
const std::array< T, N > & opo
const std::array< T, N > & omo
const std::array< T, N > & oop
const std::array< T, N > & moo
const std::array< T, N > & ooo
static Real alphaDRhoWeight
static Real alphaDBSqWeight
static bool fieldSolverFiniteDifferencingAtBoundaries
static Real alphaDBWeight
static Real electronDensity
static Real alphaDUWeight
static Real alphaDPSqWeight
static Real electronTemperature
static Real electronPTindex