diff options
Diffstat (limited to 'Source/Diagnostics/Diagnostics.cpp')
-rw-r--r-- | Source/Diagnostics/Diagnostics.cpp | 117 |
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 ); +} |