Vlasiator ebf0dd394 on dev (v5.4.0 + 1054 commits)
Loading...
Searching...
No Matches
outflow.cpp
Go to the documentation of this file.
1/*
2 * This file is part of Vlasiator.
3 * Copyright 2010-2016 Finnish Meteorological Institute
4 *
5 * For details of usage, see the COPYING file and read the "Rules of the Road"
6 * at http://www.physics.helsinki.fi/vlasiator/
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program; if not, write to the Free Software Foundation, Inc.,
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
22
27
28#include <cstdlib>
29#include <iostream>
30
31#include "../object_wrapper.h"
32#include "outflow.h"
37#include "../grid.h"
38
39#ifdef DEBUG_VLASIATOR
40 #define DEBUG_OUTFLOW
41#endif
42#ifdef DEBUG_SYSBOUNDARY
43 #define DEBUG_OUTFLOW
44#endif
45
46using namespace std;
47
48namespace SBC {
51
53 const string defStr = "Copy";
54 Readparameters::addComposing( "outflow.faceNoFields", "List of faces on which no field outflow boundary conditions are to be applied ([xyz][+-]).");
55 Readparameters::add("outflow.precedence", "Precedence value of the outflow system boundary condition (integer), the higher the stronger.", 4);
56 Readparameters::add("outflow.reapplyUponRestart", "If 0 (default), keep going with the state existing in the restart file. If 1, calls again applyInitialState. Can be used to change boundary condition behaviour during a run.", 0);
57
58 // Per-population parameters
59 for (uint i = 0; i < getObjectWrapper().particleSpecies.size(); i++) {
60 const string& pop = getObjectWrapper().particleSpecies[i].name;
61
62 Readparameters::addComposing(pop + "_outflow.reapplyFaceUponRestart", "List of faces on which outflow boundary conditions are to be reapplied upon restart ([xyz][+-]).");
63 Readparameters::addComposing(pop + "_outflow.face", "List of faces on which outflow boundary conditions are to be applied ([xyz][+-]).");
64 Readparameters::add(pop + "_outflow.vlasovScheme_face_x+", "Scheme to use on the face x+ (Copy, None)", defStr);
65 Readparameters::add(pop + "_outflow.vlasovScheme_face_x-", "Scheme to use on the face x- (Copy, None)", defStr);
66 Readparameters::add(pop + "_outflow.vlasovScheme_face_y+", "Scheme to use on the face y+ (Copy, None)", defStr);
67 Readparameters::add(pop + "_outflow.vlasovScheme_face_y-", "Scheme to use on the face y- (Copy, None)", defStr);
68 Readparameters::add(pop + "_outflow.vlasovScheme_face_z+", "Scheme to use on the face z+ (Copy, None)", defStr);
69 Readparameters::add(pop + "_outflow.vlasovScheme_face_z-", "Scheme to use on the face z- (Copy, None)", defStr);
70
71 Readparameters::add(pop + "_outflow.quench", "Factor by which to quench the inflowing parts of the velocity distribution function.", 1.0);
72 }
73 }
74
76 int myRank;
77 MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
78 Readparameters::get("outflow.faceNoFields", this->faceNoFieldsList);
79 Readparameters::get("outflow.precedence", precedence);
80 uint reapply;
81 Readparameters::get("outflow.reapplyUponRestart", reapply);
82 this->applyUponRestart = false;
83 if (reapply == 1) {
84 this->applyUponRestart = true;
85 }
86
87 // Per-species parameters
88 for (uint i = 0; i < getObjectWrapper().particleSpecies.size(); i++) {
89 const string& pop = getObjectWrapper().particleSpecies[i].name;
91
92 // Unless we find out otherwise, we assume that this species will not be treated at any boundary
93 for (int j = 0; j < 6; j++) {
94 sP.facesToSkipVlasov[j] = true;
95 }
96
97 vector<string> thisSpeciesFaceList;
98 Readparameters::get(pop + "_outflow.face", thisSpeciesFaceList);
99
100 for (auto& face : thisSpeciesFaceList) {
101 if (face == "x+") {
102 facesToProcess[0] = true;
103 sP.facesToSkipVlasov[0] = false;
104 }
105 if (face == "x-") {
106 facesToProcess[1] = true;
107 sP.facesToSkipVlasov[1] = false;
108 }
109 if (face == "y+") {
110 facesToProcess[2] = true;
111 sP.facesToSkipVlasov[2] = false;
112 }
113 if (face == "y-") {
114 facesToProcess[3] = true;
115 sP.facesToSkipVlasov[3] = false;
116 }
117 if (face == "z+") {
118 facesToProcess[4] = true;
119 sP.facesToSkipVlasov[4] = false;
120 }
121 if (face == "z-") {
122 facesToProcess[5] = true;
123 sP.facesToSkipVlasov[5] = false;
124 }
125 }
126
127 Readparameters::get(pop + "_outflow.reapplyFaceUponRestart", sP.faceToReapplyUponRestartList);
128 array<string, 6> vlasovSysBoundarySchemeName;
129 Readparameters::get(pop + "_outflow.vlasovScheme_face_x+", vlasovSysBoundarySchemeName[0]);
130 Readparameters::get(pop + "_outflow.vlasovScheme_face_x-", vlasovSysBoundarySchemeName[1]);
131 Readparameters::get(pop + "_outflow.vlasovScheme_face_y+", vlasovSysBoundarySchemeName[2]);
132
133 Readparameters::get(pop + "_outflow.vlasovScheme_face_y-", vlasovSysBoundarySchemeName[3]);
134 Readparameters::get(pop + "_outflow.vlasovScheme_face_z+", vlasovSysBoundarySchemeName[4]);
135 Readparameters::get(pop + "_outflow.vlasovScheme_face_z-", vlasovSysBoundarySchemeName[5]);
136 for (uint j = 0; j < 6; j++) {
137 if (vlasovSysBoundarySchemeName[j] == "None") {
139 } else if (vlasovSysBoundarySchemeName[j] == "Copy") {
141 } else {
142 abort_mpi("ERROR: " + vlasovSysBoundarySchemeName[j] + " is an invalid Outflow Vlasov scheme!");
143 }
144 }
145
146 Readparameters::get(pop + "_outflow.quench", sP.quenchFactor);
147
148 speciesParams.push_back(sP);
149 }
150 }
151
153 /* The array of bool describes which of the x+, x-, y+, y-, z+, z- faces are to have outflow system boundary
154 * conditions. A true indicates the corresponding face will have outflow. The 6 elements correspond to x+, x-, y+,
155 * y-, z+, z- respectively.
156 */
157 for (uint i = 0; i < 6; i++) {
158 facesToProcess[i] = false;
159 facesToSkipFields[i] = false;
160 facesToReapply[i] = false;
161 }
162
163 this->getParameters();
164
165 dynamic = false;
166
167 vector<string>::const_iterator it;
168 for (it = faceNoFieldsList.begin(); it != faceNoFieldsList.end(); it++) {
169 if (*it == "x+") facesToSkipFields[0] = true;
170 if (*it == "x-") facesToSkipFields[1] = true;
171 if (*it == "y+") facesToSkipFields[2] = true;
172 if (*it == "y-") facesToSkipFields[3] = true;
173 if (*it == "z+") facesToSkipFields[4] = true;
174 if (*it == "z-") facesToSkipFields[5] = true;
175 }
176
177 for (uint i = 0; i < getObjectWrapper().particleSpecies.size(); i++) {
179 for (it = sP.faceToReapplyUponRestartList.begin(); it != sP.faceToReapplyUponRestartList.end(); it++) {
180 if (*it == "x+") facesToReapply[0] = true;
181 if (*it == "x-") facesToReapply[1] = true;
182 if (*it == "y+") facesToReapply[2] = true;
183 if (*it == "y-") facesToReapply[3] = true;
184 if (*it == "z+") facesToReapply[4] = true;
185 if (*it == "z-") facesToReapply[5] = true;
186 }
187 }
188 }
189
190 void Outflow::applyInitialState(dccrg::Dccrg<SpatialCell, dccrg::Cartesian_Geometry>& mpiGrid,
193 fsgrids::bgbspan bgb, Project& project) {
194 const vector<CellID>& cells = getLocalCells();
195 #pragma omp parallel for schedule(static)
196 for (uint i = 0; i < cells.size(); ++i) {
197 CellID id = cells[i];
198 SpatialCell* cell = mpiGrid[id];
199 if (cell->sysBoundaryFlag != this->getIndex()) {
200 continue;
201 }
202
203 bool doApply = true;
204
206 std::array<bool, 6> isThisCellOnAFace;
207 determineFace(isThisCellOnAFace, mpiGrid, id);
208
209 doApply = false;
210 // Comparison of the array defining which faces to use and the array telling on which faces this cell is
211 for (uint j = 0; j < 6; j++) {
212 doApply = doApply || (facesToReapply[j] && isThisCellOnAFace[j]);
213 }
214 }
215
216 if (doApply) {
217 project.setCell(cell); // We set everything including VDF even in L2 cells to avoid a pile of spaghetti. Won't get communicated.
226 }
227 }
228 }
229
230 void Outflow::updateState(dccrg::Dccrg<SpatialCell, dccrg::Cartesian_Geometry>& mpiGrid,
233 fsgrids::bgbspan bgb, creal t) {}
234
238 const std::array<Real, 3>& gridSpacing,
239 const std::array<fsgrid::FsSize_t, 3>& globalCoordinates,
240 const fsgrid::FsStencil& stencil, cuint component) {
241 return fieldBoundaryCopyFromSolvingNbrMagneticField(b, technical, stencil, component, 1 << component);
242 }
243
245 const fsgrid::FsStencil& stencil, cuint component) {
246 e[stencil.ooo()][fsgrids::efield::EX + component] = 0.0;
247 }
248
250 const fsgrid::FsStencil& stencil, cuint component) {
251 array<Real, fsgrids::ehall::N_EHALL>& cp = ehall[stencil.ooo()];
252 switch (component) {
253 case 0:
258 break;
259 case 1:
264 break;
265 case 2:
270 break;
271 default:
272 cerr << __FILE__ << ":" << __LINE__ << ":"
273 << " Invalid component" << endl;
274 }
275 }
276
278 fsgrids::egradpespan EGradPe, const fsgrid::FsStencil& stencil,
279 cuint component) {
280 EGradPe[stencil.ooo()][fsgrids::egradpe::EXGRADPE + component] = 0.0;
281 }
282
284 fsgrids::dmomentsspan dmoments,
285 const fsgrid::FsStencil& stencil, cuint RKCase, cuint component) {
286 this->setCellDerivativesToZero(dperb, dmoments, stencil, component);
287 }
288
290 const fsgrid::FsStencil& stencil, cuint component) {
291 this->setCellBVOLDerivativesToZero(vols, stencil, component);
292 }
293
299 void Outflow::vlasovBoundaryCondition(dccrg::Dccrg<SpatialCell, dccrg::Cartesian_Geometry>& mpiGrid,
300 const CellID& cellID, const uint popID, const bool calculate_V_moments) {
301
302 const OutflowSpeciesParameters& sP = this->speciesParams[popID];
303 if (mpiGrid[cellID]->sysBoundaryFlag != this->getIndex()) {
304 return;
305 }
306
307 std::array<bool, 6> isThisCellOnAFace;
308 determineFace(isThisCellOnAFace, mpiGrid, cellID, true);
309
310 for(uint i=0; i<6; i++) {
311 if(isThisCellOnAFace[i] && facesToProcess[i] && !sP.facesToSkipVlasov[i]) {
312 switch(sP.faceVlasovScheme[i]) {
314 break;
316 if(mpiGrid[cellID]->sysBoundaryLayer == 1) {
317 vlasovBoundaryCopyFromTheClosestNbr(mpiGrid,cellID,false,popID,calculate_V_moments); // copies VDF too
318 } else {
319 vlasovBoundaryCopyFromTheClosestNbr(mpiGrid,cellID,true,popID,calculate_V_moments); // no VDF copy
320 }
321 break;
322 default:
323 abort_mpi("ERROR: invalid Outflow Vlasov scheme", 1);
324 }
325 }
326 }
327 }
328
329 void Outflow::setupL2OutflowAtRestart(dccrg::Dccrg<SpatialCell, dccrg::Cartesian_Geometry>& mpiGrid) {
330 // These updates emulated from SysBoundary::applySysBoundaryVlasovConditions()
331 // Needs a call to updateRemoteVelocityBlockLists(), done in the SysBoundary class.
333 mpiGrid.update_copies_of_remote_neighbors(Neighborhoods::SYSBOUNDARIES_EXTENDED);
334
335 for (uint popID=0; popID<getObjectWrapper().particleSpecies.size(); ++popID) {
339 mpiGrid.update_copies_of_remote_neighbors(Neighborhoods::SYSBOUNDARIES);
340 }
341
342 const vector<CellID>& cells = getLocalCells();
343 #pragma omp parallel
344 {
345 #pragma omp for schedule(guided,1)
346 for(uint i=0; i<cells.size(); i++) {
347 const CellID cellID = cells[i];
348 // As of 20250505 the loop only does something for layer 1 in COPY mode so the check for layer 1 was moved here for earlier loop continuation.
349 if(mpiGrid[cellID]->sysBoundaryFlag != this->getIndex() || mpiGrid[cellID]->sysBoundaryLayer != 1) {
350 continue;
351 }
352
353 std::array<bool, 6> isThisCellOnAFace;
354 determineFace(isThisCellOnAFace, mpiGrid, cellID, true);
355
356 for (uint popID=0; popID<getObjectWrapper().particleSpecies.size(); ++popID) {
357 const OutflowSpeciesParameters& sP = this->speciesParams[popID];
358 for(uint i=0; i<6; i++) {
359 if(isThisCellOnAFace[i] && facesToProcess[i] && !sP.facesToSkipVlasov[i]) {
360 switch(sP.faceVlasovScheme[i]) {
362 break;
364 // if(mpiGrid[cellID]->sysBoundaryLayer == 1) { // This is actually now (20250505) moved up a few lines for earlier loop continuation. Reinstate if other cases change!
365 vlasovBoundaryCopyFromTheClosestNbr(mpiGrid,cellID,false,popID,true); // first false means copy VDF too, second true means V moments
366 vlasovBoundaryCopyFromTheClosestNbr(mpiGrid,cellID,false,popID,false); // first false means copy VDF too, second false means R moments
367 // } // see comment above
368 break;
369 default:
370 abort_mpi("ERROR: invalid Outflow Vlasov scheme", 1);
371 } // switch
372 } // if on face
373 } // faces
374 } // populations
375 } // cells
376
377 #pragma omp barrier
378 #pragma omp single
379 {
380 SpatialCell::set_mpi_transfer_type(Transfer::ALL_SPATIAL_DATA); // No need to update VDFs, we only copy the VDFs from L1 to L2 below.
381 mpiGrid.update_copies_of_remote_neighbors(Neighborhoods::SYSBOUNDARIES);
382 }
383 #pragma omp barrier // maybe useless
384
385 // then 2nd pass and copy from the closest L1 outflow neighbor
386 #pragma omp for schedule(guided,1)
387 for(uint i=0; i<cells.size(); i++) {
388 const CellID cellID = cells[i];
389 // As of 20250505 the loop only does something for layer 1 in COPY mode so the check for layer 2 was moved here for earlier loop continuation.
390 if(mpiGrid[cellID]->sysBoundaryFlag != this->getIndex() || mpiGrid[cellID]->sysBoundaryLayer != 2) {
391 continue;
392 }
393
394 std::array<bool, 6> isThisCellOnAFace;
395 determineFace(isThisCellOnAFace, mpiGrid, cellID, true);
396
397 for (uint popID=0; popID<getObjectWrapper().particleSpecies.size(); ++popID) {
398 const OutflowSpeciesParameters& sP = this->speciesParams[popID];
399 for(uint i=0; i<6; i++) {
400 if(isThisCellOnAFace[i] && facesToProcess[i] && !sP.facesToSkipVlasov[i]) {
401 switch(sP.faceVlasovScheme[i]) {
403 break;
405 // if(mpiGrid[cellID]->sysBoundaryLayer == 2) { // This is actually now (20250505) moved up a few lines for earlier loop continuation. Reinstate if other cases change!
406 vlasovBoundaryCopyFromTheClosestL1OutflowNbr(mpiGrid,cellID,true,popID,true); // first true means copy moments only, second true means V moments
407 vlasovBoundaryCopyFromTheClosestL1OutflowNbr(mpiGrid,cellID,true,popID,false); // first true means copy moments only, second false means R moments
408 // } // see comment above
409 break;
410 default:
411 abort_mpi("ERROR: invalid Outflow Vlasov scheme", 1);
412 } // switch
413 } // if on face
414 } // faces
415 } // populations
416 } // cells
417 } // pragma omp parallel
418 }
419
420 void Outflow::getFaces(bool* faces) {
421 for (uint i = 0; i < 6; i++) {
422 faces[i] = facesToProcess[i];
423 }
424 }
425
426 string Outflow::getName() const { return "Outflow"; }
428
429} // namespace SBC
for i
Definition Dispersion.m:24
static void addComposing(const std::string &name, const std::string &desc)
static void get(const std::string &name, std::string &value)
static void add(const std::string &name, const std::string &desc, const std::string &defValue)
std::array< bool, 6 > facesToProcess
virtual void initSysBoundary(creal &t, Project &project) override
Definition outflow.cpp:152
virtual void fieldSolverBoundaryCondDerivatives(fsgrids::dperbspan dperb, fsgrids::dmomentsspan dmoments, const fsgrid::FsStencil &stencil, cuint RKCase, cuint component) override
Definition outflow.cpp:283
virtual std::string getName() const override
Definition outflow.cpp:426
virtual void getParameters() override
Definition outflow.cpp:75
virtual void fieldSolverBoundaryCondGradPeElectricField(fsgrids::egradpespan EGradPe, const fsgrid::FsStencil &stencil, cuint component) override
Definition outflow.cpp:277
virtual void vlasovBoundaryCondition(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const CellID &cellID, const uint popID, const bool calculate_V_moments) override
Definition outflow.cpp:299
virtual void setupL2OutflowAtRestart(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid) override
Definition outflow.cpp:329
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) override
Definition outflow.cpp:235
virtual ~Outflow()
Definition outflow.cpp:50
virtual void fieldSolverBoundaryCondHallElectricField(fsgrids::ehallspan ehall, const fsgrid::FsStencil &stencil, cuint component) override
Definition outflow.cpp:249
static void addParameters()
Definition outflow.cpp:52
std::vector< OutflowSpeciesParameters > speciesParams
Definition outflow.h:114
bool facesToSkipFields[6]
Definition outflow.h:107
virtual void updateState(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid, fsgrids::perbspan perb, fsgrids::bgbspan bgb, creal t) override
Definition outflow.cpp:230
bool facesToReapply[6]
Definition outflow.h:109
virtual void fieldSolverBoundaryCondElectricField(fsgrids::efieldspan e, const fsgrid::FsStencil &stencil, cuint component) override
Definition outflow.cpp:244
std::vector< std::string > faceNoFieldsList
Definition outflow.h:113
virtual uint getIndex() const override
Definition outflow.cpp:427
virtual void applyInitialState(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid, fsgrids::perbspan perb, fsgrids::bgbspan bgb, Project &project) override
Definition outflow.cpp:190
virtual void fieldSolverBoundaryCondBVOLDerivatives(fsgrids::volspan vols, const fsgrid::FsStencil &stencil, cuint component) override
Definition outflow.cpp:289
virtual void getFaces(bool *faces) override
Definition outflow.cpp:420
static void setCellBVOLDerivativesToZero(fsgrids::volspan vols, const fsgrid::FsStencil &stencil, cuint component)
void determineFace(bool *isThisCellOnAFace, const creal x, const creal y, const creal z, const creal dx, const creal dy, const creal dz, const bool excludeSlicesAndPeriodicDimensions=false) const
Function used to determine on which face(s) if any the cell at given coordinates is.
void vlasovBoundaryCopyFromTheClosestNbr(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const CellID &cellID, const bool &copyMomentsOnly, const uint popID, const bool calculate_V_moments)
void vlasovBoundaryCopyFromTheClosestL1OutflowNbr(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const CellID &cellID, const bool &copyMomentsOnly, const uint popID, const bool calculate_V_moments)
Real fieldBoundaryCopyFromSolvingNbrMagneticField(fsgrids::perbspan b, fsgrids::consttechnicalspan technical, const fsgrid::FsStencil &stencil, cuint component, cuint mask)
static void setCellDerivativesToZero(fsgrids::dperbspan dperb, fsgrids::dmomentsspan dmoments, const fsgrid::FsStencil &stencil, cuint component)
void setCell(spatial_cell::SpatialCell *cell)
Set the perturbed fields and distribution of a cell according to the default simulation settings....
Definition project.cpp:150
static bool setCommunicatedSpecies(const uint popID)
static void set_mpi_transfer_type(const uint64_t type, bool atSysBoundaries=false)
std::array< Real, CellParams::N_SPATIAL_CELL_PARAMS > parameters
void abort_mpi(const std::string str, const int err_type)
Definition common.cpp:90
const std::vector< CellID > & getLocalCells()
Definition main.cpp:39
const uint32_t cuint
Definition definitions.h:50
float Real
Definition definitions.h:41
uint64_t CellID
Definition definitions.h:54
fsgrid::FsGrid< FS_STENCIL_WIDTH > FieldSolverGrid
Definition definitions.h:78
const float creal
Definition definitions.h:42
int myRank
Definition gpu_base.cpp:48
const int j
void updateRemoteVelocityBlockLists(dccrg::Dccrg< SpatialCell, dccrg::Cartesian_Geometry > &mpiGrid, const uint popID, const uint neighborhood)
Definition grid.cpp:919
ObjectWrapper & getObjectWrapper()
Definition main.cpp:33
@ SYSBOUNDARIES
Definition common.h:84
@ SYSBOUNDARIES_EXTENDED
Definition common.h:85
std::span< std::array< Real, fsgrids::bfield::N_BFIELD > > perbspan
Definition common.h:434
@ EXGRADPE
Definition common.h:305
std::span< const std::array< Real, bgbfield::N_BGB > > constbgbspan
Definition common.h:445
std::span< std::array< Real, fsgrids::egradpe::N_EGRADPE > > egradpespan
Definition common.h:440
std::span< std::array< Real, fsgrids::dmoments::N_DMOMENTS > > dmomentsspan
Definition common.h:448
std::span< technical > technicalspan
Definition common.h:452
@ EZHALL_010_011
Definition common.h:295
@ EYHALL_101_111
Definition common.h:299
@ EYHALL_100_110
Definition common.h:292
@ EXHALL_010_110
Definition common.h:294
@ EZHALL_110_111
Definition common.h:296
@ EZHALL_000_001
Definition common.h:291
@ EYHALL_001_011
Definition common.h:298
@ EXHALL_001_101
Definition common.h:297
@ EYHALL_000_010
Definition common.h:290
@ EXHALL_000_100
Definition common.h:289
@ EXHALL_011_111
Definition common.h:300
@ EZHALL_100_101
Definition common.h:293
std::span< std::array< Real, bgbfield::N_BGB > > bgbspan
Definition common.h:444
std::span< std::array< Real, fsgrids::dperb::N_DPERB > > dperbspan
Definition common.h:442
std::span< const technical > consttechnicalspan
Definition common.h:453
std::span< std::array< Real, fsgrids::efield::N_EFIELD > > efieldspan
Definition common.h:436
std::span< std::array< Real, fsgrids::volfields::N_VOL > > volspan
Definition common.h:450
std::span< std::array< Real, fsgrids::ehall::N_EHALL > > ehallspan
Definition common.h:438
static const uint64_t CELL_SYSBOUNDARYFLAG
static const uint64_t POP_METADATA
static const uint64_t ALL_SPATIAL_DATA
static const uint64_t VEL_BLOCK_DATA
static const uint64_t CELL_PARAMETERS
std::vector< species::Species > particleSpecies
static bool isRestart
Definition parameters.h:176
std::vector< std::string > faceToReapplyUponRestartList
Definition outflow.h:40
std::array< uint, 6 > faceVlasovScheme
Definition outflow.h:38
std::array< bool, 6 > facesToSkipVlasov
Definition outflow.h:36