aboutsummaryrefslogtreecommitdiff
path: root/Source/Diagnostics/Diagnostics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Diagnostics/Diagnostics.cpp')
-rw-r--r--Source/Diagnostics/Diagnostics.cpp117
1 files changed, 64 insertions, 53 deletions
diff --git a/Source/Diagnostics/Diagnostics.cpp b/Source/Diagnostics/Diagnostics.cpp
index a3a1c2889..26d737895 100644
--- a/Source/Diagnostics/Diagnostics.cpp
+++ b/Source/Diagnostics/Diagnostics.cpp
@@ -90,56 +90,15 @@ Diagnostics::InitData ()
{
Print()<<"Diagnostics::InitData\n";
auto & warpx = WarpX::GetInstance();
+ // Number of levels
nlev = warpx.finestLevel() + 1;
- // Initialize vector of pointers to the fields requested by the user.
- m_all_field_functors.resize( nlev );
- m_mf_output.resize( nlev );
+ // Maximum number of levels that will be allocated in the simulation
+ nmax_lev = warpx.maxLevel() + 1;
+ m_mf_output.resize( nmax_lev );
+ m_all_field_functors.resize( nmax_lev );
for ( int lev=0; lev<nlev; lev++ ){
- m_all_field_functors[lev].resize( m_varnames.size() );
- // Fill vector of functors for all components except individual cylindrical modes.
- for (int comp=0, n=m_all_field_functors[lev].size(); comp<n; comp++){
- if ( m_varnames[comp] == "Ex" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "Ey" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "Ez" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_Efield_aux(lev, 2), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "Bx" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "By" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "Bz" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_Bfield_aux(lev, 2), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "jx" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_current_fp(lev, 0), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "jy" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_current_fp(lev, 1), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "jz" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_current_fp(lev, 2), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "rho" ){
- // rho_new is stored in component 1 of rho_fp when using PSATD
-#ifdef WARPX_USE_PSATD
- MultiFab* rho_new = new MultiFab(*warpx.get_pointer_rho_fp(lev), amrex::make_alias, 1, 1);
- m_all_field_functors[lev][comp] = new CellCenterFunctor(rho_new, lev, m_crse_ratio);
-#else
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_rho_fp(lev), lev, m_crse_ratio);
-#endif
- } else if ( m_varnames[comp] == "F" ){
- m_all_field_functors[lev][comp] = new CellCenterFunctor(warpx.get_pointer_F_fp(lev), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "part_per_cell" ){
- m_all_field_functors[lev][comp] = new PartPerCellFunctor(nullptr, lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "part_per_grid" ){
- m_all_field_functors[lev][comp] = new PartPerGridFunctor(nullptr, lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "divB" ){
- m_all_field_functors[lev][comp] = new DivBFunctor(warpx.get_array_Bfield_aux(lev), lev, m_crse_ratio);
- } else if ( m_varnames[comp] == "divE" ){
- m_all_field_functors[lev][comp] = new DivEFunctor(warpx.get_array_Efield_aux(lev), lev, m_crse_ratio);
- }
- }
-
- AddRZModesToDiags( lev );
-
+ InitializeFieldFunctors( lev );
// At this point, m_varnames.size() >= m_all_field_functors[0].size()
// Initialize member variable m_mf_output depending on m_crse_ratio, m_lo and m_hi
@@ -248,8 +207,8 @@ Diagnostics::AddRZModesToDiags (int lev)
// E
for (int dim=0; dim<3; dim++){
// 3 components, r theta z
- m_all_field_functors[lev][icomp] = new
- CellCenterFunctor(warpx.get_pointer_Efield_aux(lev, dim), lev,
+ m_all_field_functors[lev][icomp] =
+ std::make_unique<CellCenterFunctor>(warpx.get_pointer_Efield_aux(lev, dim), lev,
m_crse_ratio, false, ncomp_multimodefab);
AddRZModesToOutputNames(std::string("E") + coord[dim],
warpx.get_pointer_Efield_aux(0, 0)->nComp());
@@ -258,8 +217,8 @@ Diagnostics::AddRZModesToDiags (int lev)
// B
for (int dim=0; dim<3; dim++){
// 3 components, r theta z
- m_all_field_functors[lev][icomp] = new
- CellCenterFunctor(warpx.get_pointer_Bfield_aux(lev, dim), lev,
+ m_all_field_functors[lev][icomp] =
+ std::make_unique<CellCenterFunctor>(warpx.get_pointer_Bfield_aux(lev, dim), lev,
m_crse_ratio, false, ncomp_multimodefab);
AddRZModesToOutputNames(std::string("B") + coord[dim],
warpx.get_pointer_Bfield_aux(0, 0)->nComp());
@@ -268,8 +227,8 @@ Diagnostics::AddRZModesToDiags (int lev)
// j
for (int dim=0; dim<3; dim++){
// 3 components, r theta z
- m_all_field_functors[lev][icomp] = new
- CellCenterFunctor(warpx.get_pointer_current_fp(lev, dim), lev,
+ m_all_field_functors[lev][icomp] =
+ std::make_unique<CellCenterFunctor>(warpx.get_pointer_current_fp(lev, dim), lev,
m_crse_ratio, false, ncomp_multimodefab);
icomp += 1;
AddRZModesToOutputNames(std::string("J") + coord[dim],
@@ -388,3 +347,55 @@ Diagnostics::DefineDiagMultiFab ( int lev ) {
// Allocate output MultiFab for diagnostics. The data will be stored at cell-centers.
m_mf_output[lev] = MultiFab(ba, dmap, m_varnames.size(), 0);
}
+
+
+void
+Diagnostics::InitializeFieldFunctors (int lev)
+{
+ auto & warpx = WarpX::GetInstance();
+ // Clear any pre-existing vector to release stored data.
+ m_all_field_functors[lev].clear();
+
+ m_all_field_functors[lev].resize( m_varnames.size() );
+ // Fill vector of functors for all components except individual cylindrical modes.
+ for (int comp=0, n=m_all_field_functors[lev].size(); comp<n; comp++){
+ if ( m_varnames[comp] == "Ex" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "Ey" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "Ez" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_Efield_aux(lev, 2), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "Bx" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "By" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "Bz" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_Bfield_aux(lev, 2), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "jx" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_current_fp(lev, 0), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "jy" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_current_fp(lev, 1), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "jz" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_current_fp(lev, 2), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "rho" ){
+ // rho_new is stored in component 1 of rho_fp when using PSATD
+#ifdef WARPX_USE_PSATD
+ std::unique_ptr<MultiFab> rho_new = std::make_unique<MultiFab>(*warpx.get_pointer_rho_fp(lev), amrex::make_alias, 1, 1);
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(rho_new.get(), lev, m_crse_ratio);
+#else
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_rho_fp(lev), lev, m_crse_ratio);
+#endif
+ } else if ( m_varnames[comp] == "F" ){
+ m_all_field_functors[lev][comp] = std::make_unique<CellCenterFunctor>(warpx.get_pointer_F_fp(lev), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "part_per_cell" ){
+ m_all_field_functors[lev][comp] = std::make_unique<PartPerCellFunctor>(nullptr, lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "part_per_grid" ){
+ m_all_field_functors[lev][comp] = std::make_unique<PartPerGridFunctor>(nullptr, lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "divB" ){
+ m_all_field_functors[lev][comp] = std::make_unique<DivBFunctor>(warpx.get_array_Bfield_aux(lev), lev, m_crse_ratio);
+ } else if ( m_varnames[comp] == "divE" ){
+ m_all_field_functors[lev][comp] = std::make_unique<DivEFunctor>(warpx.get_array_Efield_aux(lev), lev, m_crse_ratio);
+ }
+ }
+ AddRZModesToDiags( lev );
+}