33 const fsgrid::FsStencil& stencil,
Real dt, int32_t RKCase,
bool doX,
bool doY,
bool doZ,
34 const std::array<Real, 3>& gridSpacing) {
35 creal dtdx =
dt / gridSpacing[0];
36 creal dtdy =
dt / gridSpacing[1];
37 creal dtdz =
dt / gridSpacing[2];
39 std::array<Real, fsgrids::bfield::N_BFIELD>& perBGrid0 = perb[stencil.ooo()];
44 const auto& EGrid0 = e[stencil.ooo()];
45 const auto& EGrid1 = e[stencil.opo()];
46 const auto& EGrid2 = e[stencil.oop()];
53 auto& perBDt2Grid0 = perbdt2[stencil.ooo()];
54 const auto& EGrid0 = e[stencil.ooo()];
55 const auto& EGrid1 = e[stencil.opo()];
56 const auto& EGrid2 = e[stencil.oop()];
64 const auto& EGrid0 = edt2[stencil.ooo()];
65 const auto& EGrid1 = edt2[stencil.opo()];
66 const auto& EGrid2 = edt2[stencil.oop()];
73 std::cerr << __FILE__ <<
":" << __LINE__ <<
":" <<
"Invalid RK case." << std::endl;
81 const auto& EGrid0 = e[stencil.ooo()];
82 const auto& EGrid1 = e[stencil.oop()];
83 const auto& EGrid2 = e[stencil.poo()];
89 auto& perBDt2Grid0 = perbdt2[stencil.ooo()];
90 const auto& EGrid0 = e[stencil.ooo()];
91 const auto& EGrid1 = e[stencil.oop()];
92 const auto& EGrid2 = e[stencil.poo()];
99 const auto& EGrid0 = edt2[stencil.ooo()];
100 const auto& EGrid1 = edt2[stencil.oop()];
101 const auto& EGrid2 = edt2[stencil.poo()];
107 std::cerr << __FILE__ <<
":" << __LINE__ <<
":" <<
"Invalid RK case." << std::endl;
115 const auto& EGrid0 = e[stencil.ooo()];
116 const auto& EGrid1 = e[stencil.poo()];
117 const auto& EGrid2 = e[stencil.opo()];
123 auto& perBDt2Grid0 = perbdt2[stencil.ooo()];
124 const auto& EGrid0 = e[stencil.ooo()];
125 const auto& EGrid1 = e[stencil.poo()];
126 const auto& EGrid2 = e[stencil.opo()];
133 const auto& EGrid0 = edt2[stencil.ooo()];
134 const auto& EGrid1 = edt2[stencil.poo()];
135 const auto& EGrid2 = edt2[stencil.opo()];
141 std::cerr << __FILE__ <<
":" << __LINE__ <<
":" <<
"Invalid RK case." << std::endl;
168 const std::array<Real, 3>& gridSpacing,
169 const std::array<fsgrid::FsSize_t, 3>& globalCoordinates,
170 const fsgrid::FsStencil& stencil,
SysBoundary& sysBoundaries, int32_t RKCase,
171 uint32_t component) {
173 auto& out = case0 ? perb[stencil.ooo()] : perbdt2[stencil.ooo()];
174 const auto& pb = case0 ? perb : perbdt2;
177 sysBoundaries.
getSysBoundary(technical[stencil.ooo()].sysBoundaryFlag)
206 phiprof::Timer propagateBTimer{
"Propagate magnetic field"};
207 const auto* localSize = &
fsgrid.getLocalSize()[0];
208 const auto& gridSpacing =
fsgrid.getGridSpacing();
209 const size_t numCells =
fsgrid.getNumCells();
211 int sysBoundaryTimerId{phiprof::initializeTimer(
"Magnetic Field compute sysboundary cells")};
212 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
213 phiprof::initializeTimer(
"Magnetic Field compute cells"), technical,
214 [=](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
215 cuint bitfield = technical[stencil.ooo()].SOLVE;
224 phiprof::Timer mpiTimer{
"MPI", {
"MPI"}};
227 fsgrid.updateGhostCells(perb);
230 fsgrid.updateGhostCells(perbdt2);
241 phiprof::Timer sysBoundaryTimer {sysBoundaryTimerId};
244 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
245 phiprof::initializeTimer(
"Magnetic field L1 pass"), technical,
246 [=, &sysBoundaries](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
247 if (sysBoundaryLayer == 1) {
248 cuint bitfield = technical[stencil.ooo()].SOLVE;
249 const auto globalCoordinates = coordinates.localToGlobal(stencil.i, stencil.j, stencil.k);
261 sysBoundaryTimer.stop();
266 fsgrid.updateGhostCells(perb);
269 fsgrid.updateGhostCells(perbdt2);
273 sysBoundaryTimer.start();
275 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
276 phiprof::initializeTimer(
"Magnetic field L2 pass"), technical,
277 [=, &sysBoundaries](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
279 sysBoundaryLayer == 2
281 cuint bitfield = technical[stencil.ooo()].SOLVE;
282 const auto globalCoordinates = coordinates.localToGlobal(stencil.i, stencil.j, stencil.k);
294 sysBoundaryTimer.stop();
295 propagateBTimer.stop(numCells,
"Spatial Cells");
virtual Real fieldSolverBoundaryCondMagneticField(fsgrids::perbspan b, fsgrids::constbgbspan bgb, fsgrids::consttechnicalspan technical, const std::array< Real, 3 > &gridSpacing, const std::array< fsgrid::FsSize_t, 3 > &globalCoordinates, const fsgrid::FsStencil &stencil, cuint component)=0
void propagateMagneticFieldSimple(fsgrids::perbspan perb, fsgrids::perbspan perbdt2, fsgrids::bgbspan bgb, fsgrids::efieldspan e, fsgrids::efieldspan edt2, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid, SysBoundary &sysBoundaries, creal &dt, cint &RKCase)
High-level magnetic field propagation function.
void propagateMagneticField(fsgrids::perbspan perb, fsgrids::perbspan perbdt2, fsgrids::constefieldspan e, fsgrids::constefieldspan edt2, const fsgrid::FsStencil &stencil, Real dt, int32_t RKCase, bool doX, bool doY, bool doZ, const std::array< Real, 3 > &gridSpacing)
void propagateSysBoundaryMagneticField(fsgrids::perbspan perb, fsgrids::perbspan perbdt2, fsgrids::constbgbspan bgb, fsgrids::consttechnicalspan technical, const std::array< Real, 3 > &gridSpacing, const std::array< fsgrid::FsSize_t, 3 > &globalCoordinates, const fsgrid::FsStencil &stencil, SysBoundary &sysBoundaries, int32_t RKCase, uint32_t component)
Low-level magnetic field propagation function.