From 0466145fc0edf14d23ec5acd3845e52f8c30127e Mon Sep 17 00:00:00 2001 From: Luca Fedeli Date: Mon, 1 Apr 2024 23:07:31 +0200 Subject: [PATCH] Clang tidy CI test: add several clang-analyzer-* checks to clang tidy CI test (#4684) * Clang tidy CI test: add several clang-analyzer-* checks to clang tidy CI test * address issues found with clang-tidy * fix bug * fix spaces * simplify * avoid using potentially confusing v[counter++] syntax * disable clang-analyzer-optin.mpi.MPI-Checker * make thread_required constexpr in mpi_init * make thread_required constexpr in mpi_init * disable clang-analyzer-optin.performance.Padding * start using get_field_pointer * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * introduce AMREX_ASSUME * update amrex * using get_field_pointer more * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * use new function get_field_pointer * use new functions to get fields and field pointers everywhere * fix bug * bugfixing * add missing [[nodiscard]] and remove redundant [[nodiscard]] * address issue related to auto* const found with clang-tidy * fix bug * fix issue found with clang tidy * fixed bug * fix bug --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .clang-tidy | 5 + Source/BoundaryConditions/PML.cpp | 37 +++-- Source/BoundaryConditions/PML_RZ.cpp | 8 +- .../WarpXFieldBoundaries.cpp | 48 +++--- Source/Diagnostics/BTDiagnostics.cpp | 40 ++--- .../BackTransformFunctor.cpp | 22 ++- .../ComputeDiagFunctors/CellCenterFunctor.cpp | 10 +- .../ComputeDiagFunctors/JFunctor.cpp | 17 +- .../ComputeDiagFunctors/JdispFunctor.cpp | 23 +-- .../FlushFormats/FlushFormatCheckpoint.cpp | 60 +++---- .../FlushFormats/FlushFormatPlotfile.cpp | 76 ++++----- Source/Diagnostics/FullDiagnostics.cpp | 127 +++++++-------- .../Diagnostics/ReducedDiags/ChargeOnEB.cpp | 6 +- .../ReducedDiags/ColliderRelevant.cpp | 12 +- .../Diagnostics/ReducedDiags/FieldEnergy.cpp | 12 +- .../Diagnostics/ReducedDiags/FieldMaximum.cpp | 12 +- .../ReducedDiags/FieldMomentum.cpp | 12 +- .../Diagnostics/ReducedDiags/FieldProbe.cpp | 12 +- .../Diagnostics/ReducedDiags/FieldReduction.H | 18 +- .../ReducedDiags/LoadBalanceCosts.cpp | 2 +- .../ReducedDiags/ParticleExtrema.cpp | 12 +- Source/Diagnostics/SliceDiagnostic.cpp | 12 +- Source/FieldSolver/ElectrostaticSolver.cpp | 12 +- .../HybridPICModel/HybridPICModel.cpp | 26 +-- .../MacroscopicProperties.cpp | 6 +- Source/Parallelization/GuardCellManager.cpp | 2 + Source/Parallelization/WarpXComm_K.H | 34 ++-- Source/Particles/MultiParticleContainer.cpp | 12 +- .../Particles/PhysicalParticleContainer.cpp | 10 +- Source/WarpX.H | 154 ++++++++++-------- Source/WarpX.cpp | 124 ++++++++++++++ .../ablastr/parallelization/MPIInitHelpers.H | 2 +- .../parallelization/MPIInitHelpers.cpp | 20 +-- 33 files changed, 574 insertions(+), 411 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 5d2422af214..04d1419c5c7 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -7,6 +7,11 @@ Checks: ' -bugprone-unchecked-optional-access, cert-*, -cert-err58-cpp, + clang-analyzer-*, + -clang-analyzer-optin.performance.Padding, + -clang-analyzer-optin.mpi.MPI-Checker, + -clang-analyzer-osx.*, + -clang-analyzer-optin.osx.*, clang-diagnostic-*, cppcoreguidelines-*, -cppcoreguidelines-avoid-c-arrays, diff --git a/Source/BoundaryConditions/PML.cpp b/Source/BoundaryConditions/PML.cpp index 805b4fec181..0b2806b3151 100644 --- a/Source/BoundaryConditions/PML.cpp +++ b/Source/BoundaryConditions/PML.cpp @@ -678,23 +678,23 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri const int ncompe = (m_dive_cleaning) ? 3 : 2; const int ncompb = (m_divb_cleaning) ? 3 : 2; - const amrex::BoxArray ba_Ex = amrex::convert(ba, WarpX::GetInstance().getEfield_fp(0,0).ixType().toIntVect()); - const amrex::BoxArray ba_Ey = amrex::convert(ba, WarpX::GetInstance().getEfield_fp(0,1).ixType().toIntVect()); - const amrex::BoxArray ba_Ez = amrex::convert(ba, WarpX::GetInstance().getEfield_fp(0,2).ixType().toIntVect()); + const amrex::BoxArray ba_Ex = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::Efield_fp, 0,0).ixType().toIntVect()); + const amrex::BoxArray ba_Ey = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::Efield_fp, 0,1).ixType().toIntVect()); + const amrex::BoxArray ba_Ez = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::Efield_fp, 0,2).ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_E_fp[0], ba_Ex, dm, ncompe, nge, lev, "pml_E_fp[x]", 0.0_rt); WarpX::AllocInitMultiFab(pml_E_fp[1], ba_Ey, dm, ncompe, nge, lev, "pml_E_fp[y]", 0.0_rt); WarpX::AllocInitMultiFab(pml_E_fp[2], ba_Ez, dm, ncompe, nge, lev, "pml_E_fp[z]", 0.0_rt); - const amrex::BoxArray ba_Bx = amrex::convert(ba, WarpX::GetInstance().getBfield_fp(0,0).ixType().toIntVect()); - const amrex::BoxArray ba_By = amrex::convert(ba, WarpX::GetInstance().getBfield_fp(0,1).ixType().toIntVect()); - const amrex::BoxArray ba_Bz = amrex::convert(ba, WarpX::GetInstance().getBfield_fp(0,2).ixType().toIntVect()); + const amrex::BoxArray ba_Bx = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::Bfield_fp, 0,0).ixType().toIntVect()); + const amrex::BoxArray ba_By = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::Bfield_fp, 0,1).ixType().toIntVect()); + const amrex::BoxArray ba_Bz = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::Bfield_fp, 0,2).ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_B_fp[0], ba_Bx, dm, ncompb, ngb, lev, "pml_B_fp[x]", 0.0_rt); WarpX::AllocInitMultiFab(pml_B_fp[1], ba_By, dm, ncompb, ngb, lev, "pml_B_fp[y]", 0.0_rt); WarpX::AllocInitMultiFab(pml_B_fp[2], ba_Bz, dm, ncompb, ngb, lev, "pml_B_fp[z]", 0.0_rt); - const amrex::BoxArray ba_jx = amrex::convert(ba, WarpX::GetInstance().getcurrent_fp(0,0).ixType().toIntVect()); - const amrex::BoxArray ba_jy = amrex::convert(ba, WarpX::GetInstance().getcurrent_fp(0,1).ixType().toIntVect()); - const amrex::BoxArray ba_jz = amrex::convert(ba, WarpX::GetInstance().getcurrent_fp(0,2).ixType().toIntVect()); + const amrex::BoxArray ba_jx = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::current_fp, 0,0).ixType().toIntVect()); + const amrex::BoxArray ba_jy = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::current_fp, 0,1).ixType().toIntVect()); + const amrex::BoxArray ba_jz = amrex::convert(ba, WarpX::GetInstance().getField(FieldType::current_fp, 0,2).ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_j_fp[0], ba_jx, dm, 1, ngb, lev, "pml_j_fp[x]", 0.0_rt); WarpX::AllocInitMultiFab(pml_j_fp[1], ba_jy, dm, 1, ngb, lev, "pml_j_fp[y]", 0.0_rt); WarpX::AllocInitMultiFab(pml_j_fp[2], ba_jz, dm, 1, ngb, lev, "pml_j_fp[z]", 0.0_rt); @@ -812,16 +812,17 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri } else { cdm.define(cba); } - const amrex::BoxArray cba_Ex = amrex::convert(cba, WarpX::GetInstance().getEfield_cp(1,0).ixType().toIntVect()); - const amrex::BoxArray cba_Ey = amrex::convert(cba, WarpX::GetInstance().getEfield_cp(1,1).ixType().toIntVect()); - const amrex::BoxArray cba_Ez = amrex::convert(cba, WarpX::GetInstance().getEfield_cp(1,2).ixType().toIntVect()); + + const amrex::BoxArray cba_Ex = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::Efield_cp, 1,0).ixType().toIntVect()); + const amrex::BoxArray cba_Ey = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::Efield_cp, 1,1).ixType().toIntVect()); + const amrex::BoxArray cba_Ez = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::Efield_cp, 1,2).ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_E_cp[0], cba_Ex, cdm, ncompe, nge, lev, "pml_E_cp[x]", 0.0_rt); WarpX::AllocInitMultiFab(pml_E_cp[1], cba_Ey, cdm, ncompe, nge, lev, "pml_E_cp[y]", 0.0_rt); WarpX::AllocInitMultiFab(pml_E_cp[2], cba_Ez, cdm, ncompe, nge, lev, "pml_E_cp[z]", 0.0_rt); - const amrex::BoxArray cba_Bx = amrex::convert(cba, WarpX::GetInstance().getBfield_cp(1,0).ixType().toIntVect()); - const amrex::BoxArray cba_By = amrex::convert(cba, WarpX::GetInstance().getBfield_cp(1,1).ixType().toIntVect()); - const amrex::BoxArray cba_Bz = amrex::convert(cba, WarpX::GetInstance().getBfield_cp(1,2).ixType().toIntVect()); + const amrex::BoxArray cba_Bx = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::Bfield_cp, 1,0).ixType().toIntVect()); + const amrex::BoxArray cba_By = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::Bfield_cp, 1,1).ixType().toIntVect()); + const amrex::BoxArray cba_Bz = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::Bfield_cp, 1,2).ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_B_cp[0], cba_Bx, cdm, ncompb, ngb, lev, "pml_B_cp[x]", 0.0_rt); WarpX::AllocInitMultiFab(pml_B_cp[1], cba_By, cdm, ncompb, ngb, lev, "pml_B_cp[y]", 0.0_rt); WarpX::AllocInitMultiFab(pml_B_cp[2], cba_Bz, cdm, ncompb, ngb, lev, "pml_B_cp[z]", 0.0_rt); @@ -842,9 +843,9 @@ PML::PML (const int lev, const BoxArray& grid_ba, const DistributionMapping& gri WarpX::AllocInitMultiFab( pml_G_cp, cba_G_nodal, cdm, 3, ngf, lev, "pml_G_cp", 0.0_rt); } - const amrex::BoxArray cba_jx = amrex::convert(cba, WarpX::GetInstance().getcurrent_cp(1,0).ixType().toIntVect()); - const amrex::BoxArray cba_jy = amrex::convert(cba, WarpX::GetInstance().getcurrent_cp(1,1).ixType().toIntVect()); - const amrex::BoxArray cba_jz = amrex::convert(cba, WarpX::GetInstance().getcurrent_cp(1,2).ixType().toIntVect()); + const amrex::BoxArray cba_jx = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::current_cp, 1,0).ixType().toIntVect()); + const amrex::BoxArray cba_jy = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::current_cp, 1,1).ixType().toIntVect()); + const amrex::BoxArray cba_jz = amrex::convert(cba, WarpX::GetInstance().getField(FieldType::current_cp, 1,2).ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_j_cp[0], cba_jx, cdm, 1, ngb, lev, "pml_j_cp[x]", 0.0_rt); WarpX::AllocInitMultiFab(pml_j_cp[1], cba_jy, cdm, 1, ngb, lev, "pml_j_cp[y]", 0.0_rt); WarpX::AllocInitMultiFab(pml_j_cp[2], cba_jz, cdm, 1, ngb, lev, "pml_j_cp[z]", 0.0_rt); diff --git a/Source/BoundaryConditions/PML_RZ.cpp b/Source/BoundaryConditions/PML_RZ.cpp index 7eb011a6bb2..5eb30f43cca 100644 --- a/Source/BoundaryConditions/PML_RZ.cpp +++ b/Source/BoundaryConditions/PML_RZ.cpp @@ -41,15 +41,15 @@ PML_RZ::PML_RZ (const int lev, const amrex::BoxArray& grid_ba, const amrex::Dist m_geom(geom) { - const amrex::MultiFab & Er_fp = WarpX::GetInstance().getEfield_fp(lev,0); - const amrex::MultiFab & Et_fp = WarpX::GetInstance().getEfield_fp(lev,1); + const amrex::MultiFab & Er_fp = WarpX::GetInstance().getField(FieldType::Efield_fp, lev,0); + const amrex::MultiFab & Et_fp = WarpX::GetInstance().getField(FieldType::Efield_fp, lev,1); const amrex::BoxArray ba_Er = amrex::convert(grid_ba, Er_fp.ixType().toIntVect()); const amrex::BoxArray ba_Et = amrex::convert(grid_ba, Et_fp.ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_E_fp[0], ba_Er, grid_dm, Er_fp.nComp(), Er_fp.nGrowVect(), lev, "pml_E_fp[0]", 0.0_rt); WarpX::AllocInitMultiFab(pml_E_fp[1], ba_Et, grid_dm, Et_fp.nComp(), Et_fp.nGrowVect(), lev, "pml_E_fp[1]", 0.0_rt); - const amrex::MultiFab & Br_fp = WarpX::GetInstance().getBfield_fp(lev,0); - const amrex::MultiFab & Bt_fp = WarpX::GetInstance().getBfield_fp(lev,1); + const amrex::MultiFab & Br_fp = WarpX::GetInstance().getField(FieldType::Bfield_fp, lev,0); + const amrex::MultiFab & Bt_fp = WarpX::GetInstance().getField(FieldType::Bfield_fp, lev,1); const amrex::BoxArray ba_Br = amrex::convert(grid_ba, Br_fp.ixType().toIntVect()); const amrex::BoxArray ba_Bt = amrex::convert(grid_ba, Bt_fp.ixType().toIntVect()); WarpX::AllocInitMultiFab(pml_B_fp[0], ba_Br, grid_dm, Br_fp.nComp(), Br_fp.nGrowVect(), lev, "pml_B_fp[0]", 0.0_rt); diff --git a/Source/BoundaryConditions/WarpXFieldBoundaries.cpp b/Source/BoundaryConditions/WarpXFieldBoundaries.cpp index 4844585cc90..ebf3d1e39eb 100644 --- a/Source/BoundaryConditions/WarpXFieldBoundaries.cpp +++ b/Source/BoundaryConditions/WarpXFieldBoundaries.cpp @@ -22,18 +22,18 @@ void WarpX::ApplyEfieldBoundary(const int lev, PatchType patch_type) { if (PEC::isAnyBoundaryPEC()) { if (patch_type == PatchType::fine) { - PEC::ApplyPECtoEfield( { get_pointer_Efield_fp(lev, 0), - get_pointer_Efield_fp(lev, 1), - get_pointer_Efield_fp(lev, 2) }, lev, patch_type); + PEC::ApplyPECtoEfield( { getFieldPointer(FieldType::Efield_fp, lev, 0), + getFieldPointer(FieldType::Efield_fp, lev, 1), + getFieldPointer(FieldType::Efield_fp, lev, 2) }, lev, patch_type); if (WarpX::isAnyBoundaryPML()) { // apply pec on split E-fields in PML region const bool split_pml_field = true; PEC::ApplyPECtoEfield( pml[lev]->GetE_fp(), lev, patch_type, split_pml_field); } } else { - PEC::ApplyPECtoEfield( { get_pointer_Efield_cp(lev, 0), - get_pointer_Efield_cp(lev, 1), - get_pointer_Efield_cp(lev, 2) }, lev, patch_type); + PEC::ApplyPECtoEfield( { getFieldPointer(FieldType::Efield_cp, lev, 0), + getFieldPointer(FieldType::Efield_cp, lev, 1), + getFieldPointer(FieldType::Efield_cp, lev, 2) }, lev, patch_type); if (WarpX::isAnyBoundaryPML()) { // apply pec on split E-fields in PML region const bool split_pml_field = true; @@ -44,13 +44,13 @@ void WarpX::ApplyEfieldBoundary(const int lev, PatchType patch_type) #ifdef WARPX_DIM_RZ if (patch_type == PatchType::fine) { - ApplyFieldBoundaryOnAxis(get_pointer_Efield_fp(lev, 0), - get_pointer_Efield_fp(lev, 1), - get_pointer_Efield_fp(lev, 2), lev); + ApplyFieldBoundaryOnAxis(getFieldPointer(FieldType::Efield_fp, lev, 0), + getFieldPointer(FieldType::Efield_fp, lev, 1), + getFieldPointer(FieldType::Efield_fp, lev, 2), lev); } else { - ApplyFieldBoundaryOnAxis(get_pointer_Efield_cp(lev, 0), - get_pointer_Efield_cp(lev, 1), - get_pointer_Efield_cp(lev, 2), lev); + ApplyFieldBoundaryOnAxis(getFieldPointer(FieldType::Efield_cp, lev, 0), + getFieldPointer(FieldType::Efield_cp, lev, 1), + getFieldPointer(FieldType::Efield_cp, lev, 2), lev); } #endif } @@ -59,13 +59,13 @@ void WarpX::ApplyBfieldBoundary (const int lev, PatchType patch_type, DtType a_d { if (PEC::isAnyBoundaryPEC()) { if (patch_type == PatchType::fine) { - PEC::ApplyPECtoBfield( { get_pointer_Bfield_fp(lev, 0), - get_pointer_Bfield_fp(lev, 1), - get_pointer_Bfield_fp(lev, 2) }, lev, patch_type); + PEC::ApplyPECtoBfield( { getFieldPointer(FieldType::Bfield_fp, lev, 0), + getFieldPointer(FieldType::Bfield_fp, lev, 1), + getFieldPointer(FieldType::Bfield_fp, lev, 2) }, lev, patch_type); } else { - PEC::ApplyPECtoBfield( { get_pointer_Bfield_cp(lev, 0), - get_pointer_Bfield_cp(lev, 1), - get_pointer_Bfield_cp(lev, 2) }, lev, patch_type); + PEC::ApplyPECtoBfield( { getFieldPointer(FieldType::Bfield_cp, lev, 0), + getFieldPointer(FieldType::Bfield_cp, lev, 1), + getFieldPointer(FieldType::Bfield_cp, lev, 2) }, lev, patch_type); } } @@ -92,13 +92,13 @@ void WarpX::ApplyBfieldBoundary (const int lev, PatchType patch_type, DtType a_d #ifdef WARPX_DIM_RZ if (patch_type == PatchType::fine) { - ApplyFieldBoundaryOnAxis(get_pointer_Bfield_fp(lev, 0), - get_pointer_Bfield_fp(lev, 1), - get_pointer_Bfield_fp(lev, 2), lev); + ApplyFieldBoundaryOnAxis(getFieldPointer(FieldType::Bfield_fp, lev, 0), + getFieldPointer(FieldType::Bfield_fp, lev, 1), + getFieldPointer(FieldType::Bfield_fp, lev, 2), lev); } else { - ApplyFieldBoundaryOnAxis(get_pointer_Bfield_cp(lev, 0), - get_pointer_Bfield_cp(lev, 1), - get_pointer_Bfield_cp(lev, 2), lev); + ApplyFieldBoundaryOnAxis(getFieldPointer(FieldType::Bfield_cp, lev, 0), + getFieldPointer(FieldType::Bfield_cp, lev, 1), + getFieldPointer(FieldType::Bfield_cp, lev, 2), lev); } #endif } diff --git a/Source/Diagnostics/BTDiagnostics.cpp b/Source/Diagnostics/BTDiagnostics.cpp index 2422d1324af..40a76eac946 100644 --- a/Source/Diagnostics/BTDiagnostics.cpp +++ b/Source/Diagnostics/BTDiagnostics.cpp @@ -565,23 +565,23 @@ BTDiagnostics::InitializeFieldFunctors (int lev) m_cell_center_functors.at(lev).size()); for (int comp=0; comp(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 0), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "Ey" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 1), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "Ez" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 2), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 2), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "Bx" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 0), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "By" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 1), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "Bz" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 2), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 2), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "jx" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_current_fp(lev, 0), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::current_fp, lev, 0), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "jy" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_current_fp(lev, 1), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::current_fp, lev, 1), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "jz" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_current_fp(lev, 2), lev, m_crse_ratio); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::current_fp, lev, 2), lev, m_crse_ratio); } else if ( m_cellcenter_varnames[comp] == "rho" ){ m_cell_center_functors[lev][comp] = std::make_unique(lev, m_crse_ratio); } @@ -596,7 +596,7 @@ BTDiagnostics::UpdateVarnamesForRZopenPMD () { #ifdef WARPX_DIM_RZ auto & warpx = WarpX::GetInstance(); - const int ncomp_multimodefab = warpx.get_pointer_Efield_aux(0,0)->nComp(); + const int ncomp_multimodefab = warpx.getFieldPointer(FieldType::Efield_aux, 0,0)->nComp(); const int ncomp = ncomp_multimodefab; @@ -655,7 +655,7 @@ BTDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev) { #ifdef WARPX_DIM_RZ auto & warpx = WarpX::GetInstance(); - const int ncomp_multimodefab = warpx.get_pointer_Efield_aux(0,0)->nComp(); + const int ncomp_multimodefab = warpx.getFieldPointer(FieldType::Efield_aux, 0,0)->nComp(); const int ncomp = ncomp_multimodefab; // Clear any pre-existing vector to release stored data // This ensures that when domain is load-balanced, the functors point @@ -681,23 +681,23 @@ BTDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev) const auto m_cell_center_functors_at_lev_size = static_cast(m_cell_center_functors.at(lev).size()); for (int comp=0; comp(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 0), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "Et" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 1), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "Ez" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 2), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 2), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "Br" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 0), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "Bt" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 1), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "Bz" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 2), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 2), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "jr" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_current_fp(lev, 0), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::current_fp, lev, 0), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "jt" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_current_fp(lev, 1), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::current_fp, lev, 1), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "jz" ){ - m_cell_center_functors[lev][comp] = std::make_unique(warpx.get_pointer_current_fp(lev, 2), lev, m_crse_ratio, false, ncomp); + m_cell_center_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::current_fp, lev, 2), lev, m_crse_ratio, false, ncomp); } else if ( m_cellcenter_varnames_fields[comp] == "rho" ){ m_cell_center_functors[lev][comp] = std::make_unique(lev, m_crse_ratio, false, -1, false, ncomp); } diff --git a/Source/Diagnostics/ComputeDiagFunctors/BackTransformFunctor.cpp b/Source/Diagnostics/ComputeDiagFunctors/BackTransformFunctor.cpp index c4809df11a3..199b785096d 100644 --- a/Source/Diagnostics/ComputeDiagFunctors/BackTransformFunctor.cpp +++ b/Source/Diagnostics/ComputeDiagFunctors/BackTransformFunctor.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -58,15 +59,22 @@ BackTransformFunctor::operator ()(amrex::MultiFab& mf_dst, int /*dcomp*/, const const bool interpolate = true; std::unique_ptr< amrex::MultiFab > slice = nullptr; const int scomp = 0; + + WARPX_ALWAYS_ASSERT_WITH_MESSAGE(m_mf_src != nullptr, "m_mf_src can't be a nullptr."); + AMREX_ASSUME(m_mf_src != nullptr); + // Generate slice of the cell-centered multifab containing boosted-frame field-data // at current z-boost location for the ith buffer - slice = amrex::get_slice_data(moving_window_dir, - m_current_z_boost[i_buffer], - *m_mf_src, - geom, - scomp, - m_mf_src->nComp(), - interpolate); + slice = amrex::get_slice_data( + moving_window_dir, + m_current_z_boost[i_buffer], + *m_mf_src, + geom, + scomp, + m_mf_src->nComp(), + interpolate); + + // Perform in-place Lorentz-transform of all the fields stored in the slice. LorentzTransformZ( *slice, gamma_boost, beta_boost); diff --git a/Source/Diagnostics/ComputeDiagFunctors/CellCenterFunctor.cpp b/Source/Diagnostics/ComputeDiagFunctors/CellCenterFunctor.cpp index fe503713141..8c2af223304 100644 --- a/Source/Diagnostics/ComputeDiagFunctors/CellCenterFunctor.cpp +++ b/Source/Diagnostics/ComputeDiagFunctors/CellCenterFunctor.cpp @@ -3,6 +3,7 @@ #include "WarpX.H" #include +#include #include #include @@ -17,6 +18,11 @@ void CellCenterFunctor::operator()(amrex::MultiFab& mf_dst, int dcomp, const int /*i_buffer*/) const { auto& warpx = WarpX::GetInstance(); - InterpolateMFForDiag(mf_dst, *m_mf_src, dcomp, warpx.DistributionMap(m_lev), - m_convertRZmodes2cartesian); + + WARPX_ALWAYS_ASSERT_WITH_MESSAGE(m_mf_src != nullptr, "m_mf_src can't be a nullptr."); + AMREX_ASSUME(m_mf_src != nullptr); + + InterpolateMFForDiag( + mf_dst, *m_mf_src, dcomp, + warpx.DistributionMap(m_lev),m_convertRZmodes2cartesian); } diff --git a/Source/Diagnostics/ComputeDiagFunctors/JFunctor.cpp b/Source/Diagnostics/ComputeDiagFunctors/JFunctor.cpp index 9938cf095bd..a8fd142815a 100644 --- a/Source/Diagnostics/ComputeDiagFunctors/JFunctor.cpp +++ b/Source/Diagnostics/ComputeDiagFunctors/JFunctor.cpp @@ -10,6 +10,7 @@ #include "WarpX.H" #include +#include #include #include @@ -27,7 +28,7 @@ JFunctor::operator() (amrex::MultiFab& mf_dst, int dcomp, const int /*i_buffer*/ { auto& warpx = WarpX::GetInstance(); /** pointer to source multifab (can be multi-component) */ - amrex::MultiFab* m_mf_src = warpx.get_pointer_current_fp(m_lev, m_dir); + amrex::MultiFab* m_mf_src = warpx.getFieldPointer(FieldType::current_fp, m_lev, m_dir); // Deposit current if no solver or the electrostatic solver is being used if (m_deposit_current) @@ -36,16 +37,16 @@ JFunctor::operator() (amrex::MultiFab& mf_dst, int dcomp, const int /*i_buffer*/ amrex::Vector, 3 > > current_fp_temp; current_fp_temp.resize(1); - const auto& current_fp_x = warpx.getcurrent_fp(m_lev,0); + const auto& current_fp_x = warpx.getField(FieldType::current_fp, m_lev,0); current_fp_temp[0][0] = std::make_unique( current_fp_x, amrex::make_alias, 0, current_fp_x.nComp() ); - const auto& current_fp_y = warpx.getcurrent_fp(m_lev,1); + const auto& current_fp_y = warpx.getField(FieldType::current_fp, m_lev,1); current_fp_temp[0][1] = std::make_unique( current_fp_y, amrex::make_alias, 0, current_fp_y.nComp() ); - const auto& current_fp_z = warpx.getcurrent_fp(m_lev,2); + const auto& current_fp_z = warpx.getField(FieldType::current_fp, m_lev,2); current_fp_temp[0][2] = std::make_unique( current_fp_z, amrex::make_alias, 0, current_fp_z.nComp() ); @@ -60,6 +61,10 @@ JFunctor::operator() (amrex::MultiFab& mf_dst, int dcomp, const int /*i_buffer*/ } } - InterpolateMFForDiag(mf_dst, *m_mf_src, dcomp, warpx.DistributionMap(m_lev), - m_convertRZmodes2cartesian); + WARPX_ALWAYS_ASSERT_WITH_MESSAGE(m_mf_src != nullptr, "m_mf_src can't be a nullptr."); + AMREX_ASSUME(m_mf_src != nullptr); + + InterpolateMFForDiag( + mf_dst, *m_mf_src, dcomp, + warpx.DistributionMap(m_lev), m_convertRZmodes2cartesian); } diff --git a/Source/Diagnostics/ComputeDiagFunctors/JdispFunctor.cpp b/Source/Diagnostics/ComputeDiagFunctors/JdispFunctor.cpp index 373004d4633..b73931814b6 100644 --- a/Source/Diagnostics/ComputeDiagFunctors/JdispFunctor.cpp +++ b/Source/Diagnostics/ComputeDiagFunctors/JdispFunctor.cpp @@ -10,6 +10,7 @@ #include "Particles/MultiParticleContainer.H" #include +#include #include #include @@ -28,24 +29,26 @@ JdispFunctor::operator() (amrex::MultiFab& mf_dst, int dcomp, const int /*i_buff auto* hybrid_pic_model = warpx.get_pointer_HybridPICModel(); /** pointer to total simulation current (J) multifab */ - amrex::MultiFab* mf_j = warpx.get_pointer_current_fp(m_lev, m_dir); - amrex::MultiFab* mf_curlB; - if (hybrid_pic_model) { - /** pointer to current calculated from Ampere's Law (Jamp) multifab */ - mf_curlB = hybrid_pic_model->get_pointer_current_fp_ampere(m_lev, m_dir); - } else { + amrex::MultiFab* mf_j = warpx.getFieldPointer(FieldType::current_fp, m_lev, m_dir); + + WARPX_ALWAYS_ASSERT_WITH_MESSAGE(hybrid_pic_model, + "Displacement current diagnostic is only implemented for the HybridPICModel."); + AMREX_ASSUME(hybrid_pic_model != nullptr); + + /** pointer to current calculated from Ampere's Law (Jamp) multifab */ + amrex::MultiFab* mf_curlB = hybrid_pic_model->get_pointer_current_fp_ampere(m_lev, m_dir);; + + //if (!hybrid_pic_model) { // To finish this implementation, we need to implement a method to // calculate (∇ x B). - mf_curlB = nullptr; // Remove when curlB implemented - WARPX_ABORT_WITH_MESSAGE( - "Displacement current diagnostic is only implemented for the HybridPICModel."); // Skeleton for future implementation for solvers other than HybridPIC. // Get curlB multifab // Divide curlB multifab by mu0 to get units of current // mf_curlB->mult(1.0/PhysConsts::mu0) - } + //} + // A Jdisp multifab is generated to hold displacement current. amrex::MultiFab Jdisp( mf_j->boxArray(), mf_j->DistributionMap(), 1, mf_j->nGrowVect() ); Jdisp.setVal(0); diff --git a/Source/Diagnostics/FlushFormats/FlushFormatCheckpoint.cpp b/Source/Diagnostics/FlushFormats/FlushFormatCheckpoint.cpp index b083e60529f..653ac0c26ba 100644 --- a/Source/Diagnostics/FlushFormats/FlushFormatCheckpoint.cpp +++ b/Source/Diagnostics/FlushFormats/FlushFormatCheckpoint.cpp @@ -62,85 +62,85 @@ FlushFormatCheckpoint::WriteToFile ( for (int lev = 0; lev < nlev; ++lev) { - VisMF::Write(warpx.getEfield_fp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Efield_fp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_fp")); - VisMF::Write(warpx.getEfield_fp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Efield_fp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_fp")); - VisMF::Write(warpx.getEfield_fp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Efield_fp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_fp")); - VisMF::Write(warpx.getBfield_fp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Bfield_fp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_fp")); - VisMF::Write(warpx.getBfield_fp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Bfield_fp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_fp")); - VisMF::Write(warpx.getBfield_fp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Bfield_fp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_fp")); if (WarpX::fft_do_time_averaging) { - VisMF::Write(warpx.getEfield_avg_fp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Efield_avg_fp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_avg_fp")); - VisMF::Write(warpx.getEfield_avg_fp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Efield_avg_fp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_avg_fp")); - VisMF::Write(warpx.getEfield_avg_fp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Efield_avg_fp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_avg_fp")); - VisMF::Write(warpx.getBfield_avg_fp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Bfield_avg_fp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_avg_fp")); - VisMF::Write(warpx.getBfield_avg_fp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Bfield_avg_fp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_avg_fp")); - VisMF::Write(warpx.getBfield_avg_fp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Bfield_avg_fp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_avg_fp")); } if (warpx.getis_synchronized()) { // Need to save j if synchronized because after restart we need j to evolve E by dt/2. - VisMF::Write(warpx.getcurrent_fp(lev, 0), + VisMF::Write(warpx.getField(FieldType::current_fp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jx_fp")); - VisMF::Write(warpx.getcurrent_fp(lev, 1), + VisMF::Write(warpx.getField(FieldType::current_fp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jy_fp")); - VisMF::Write(warpx.getcurrent_fp(lev, 2), + VisMF::Write(warpx.getField(FieldType::current_fp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jz_fp")); } if (lev > 0) { - VisMF::Write(warpx.getEfield_cp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Efield_cp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_cp")); - VisMF::Write(warpx.getEfield_cp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Efield_cp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_cp")); - VisMF::Write(warpx.getEfield_cp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Efield_cp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_cp")); - VisMF::Write(warpx.getBfield_cp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Bfield_cp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_cp")); - VisMF::Write(warpx.getBfield_cp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Bfield_cp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_cp")); - VisMF::Write(warpx.getBfield_cp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Bfield_cp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_cp")); if (WarpX::fft_do_time_averaging) { - VisMF::Write(warpx.getEfield_avg_cp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Efield_avg_cp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ex_avg_cp")); - VisMF::Write(warpx.getEfield_avg_cp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Efield_avg_cp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ey_avg_cp")); - VisMF::Write(warpx.getEfield_avg_cp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Efield_avg_cp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Ez_avg_cp")); - VisMF::Write(warpx.getBfield_avg_cp(lev, 0), + VisMF::Write(warpx.getField(FieldType::Bfield_avg_cp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bx_avg_cp")); - VisMF::Write(warpx.getBfield_avg_cp(lev, 1), + VisMF::Write(warpx.getField(FieldType::Bfield_avg_cp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "By_avg_cp")); - VisMF::Write(warpx.getBfield_avg_cp(lev, 2), + VisMF::Write(warpx.getField(FieldType::Bfield_avg_cp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "Bz_avg_cp")); } if (warpx.getis_synchronized()) { // Need to save j if synchronized because after restart we need j to evolve E by dt/2. - VisMF::Write(warpx.getcurrent_cp(lev, 0), + VisMF::Write(warpx.getField(FieldType::current_cp, lev, 0), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jx_cp")); - VisMF::Write(warpx.getcurrent_cp(lev, 1), + VisMF::Write(warpx.getField(FieldType::current_cp, lev, 1), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jy_cp")); - VisMF::Write(warpx.getcurrent_cp(lev, 2), + VisMF::Write(warpx.getField(FieldType::current_cp, lev, 2), amrex::MultiFabFileFullPrefix(lev, checkpointname, default_level_prefix, "jz_cp")); } } diff --git a/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp b/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp index 555ffb123e7..7b10edf0d2b 100644 --- a/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp +++ b/Source/Diagnostics/FlushFormats/FlushFormatPlotfile.cpp @@ -562,84 +562,84 @@ FlushFormatPlotfile::WriteAllRawFields( // Auxiliary patch - WriteRawMF( warpx.getEfield(lev, 0), dm, raw_pltname, default_level_prefix, "Ex_aux", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getEfield(lev, 1), dm, raw_pltname, default_level_prefix, "Ey_aux", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getEfield(lev, 2), dm, raw_pltname, default_level_prefix, "Ez_aux", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getBfield(lev, 0), dm, raw_pltname, default_level_prefix, "Bx_aux", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getBfield(lev, 1), dm, raw_pltname, default_level_prefix, "By_aux", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getBfield(lev, 2), dm, raw_pltname, default_level_prefix, "Bz_aux", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Efield_aux, lev, 0), dm, raw_pltname, default_level_prefix, "Ex_aux", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Efield_aux, lev, 1), dm, raw_pltname, default_level_prefix, "Ey_aux", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Efield_aux, lev, 2), dm, raw_pltname, default_level_prefix, "Ez_aux", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Bfield_aux, lev, 0), dm, raw_pltname, default_level_prefix, "Bx_aux", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Bfield_aux, lev, 1), dm, raw_pltname, default_level_prefix, "By_aux", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Bfield_aux, lev, 2), dm, raw_pltname, default_level_prefix, "Bz_aux", lev, plot_raw_fields_guards); // fine patch - WriteRawMF( warpx.getEfield_fp(lev, 0), dm, raw_pltname, default_level_prefix, "Ex_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getEfield_fp(lev, 1), dm, raw_pltname, default_level_prefix, "Ey_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getEfield_fp(lev, 2), dm, raw_pltname, default_level_prefix, "Ez_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getcurrent_fp(lev, 0), dm, raw_pltname, default_level_prefix, "jx_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getcurrent_fp(lev, 1), dm, raw_pltname, default_level_prefix, "jy_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getcurrent_fp(lev, 2), dm, raw_pltname, default_level_prefix, "jz_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getBfield_fp(lev, 0), dm, raw_pltname, default_level_prefix, "Bx_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getBfield_fp(lev, 1), dm, raw_pltname, default_level_prefix, "By_fp", lev, plot_raw_fields_guards); - WriteRawMF( warpx.getBfield_fp(lev, 2), dm, raw_pltname, default_level_prefix, "Bz_fp", lev, plot_raw_fields_guards); - if (warpx.get_pointer_F_fp(lev)) + WriteRawMF( warpx.getField(FieldType::Efield_fp, lev, 0), dm, raw_pltname, default_level_prefix, "Ex_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Efield_fp, lev, 1), dm, raw_pltname, default_level_prefix, "Ey_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Efield_fp, lev, 2), dm, raw_pltname, default_level_prefix, "Ez_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::current_fp, lev, 0), dm, raw_pltname, default_level_prefix, "jx_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::current_fp, lev, 1), dm, raw_pltname, default_level_prefix, "jy_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::current_fp, lev, 2), dm, raw_pltname, default_level_prefix, "jz_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Bfield_fp, lev, 0), dm, raw_pltname, default_level_prefix, "Bx_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Bfield_fp, lev, 1), dm, raw_pltname, default_level_prefix, "By_fp", lev, plot_raw_fields_guards); + WriteRawMF( warpx.getField(FieldType::Bfield_fp, lev, 2), dm, raw_pltname, default_level_prefix, "Bz_fp", lev, plot_raw_fields_guards); + if (warpx.isFieldInitialized(FieldType::F_fp, lev)) { - WriteRawMF(warpx.getF_fp(lev), dm, raw_pltname, default_level_prefix, "F_fp", lev, plot_raw_fields_guards); + WriteRawMF(warpx.getField(FieldType::F_fp, lev), dm, raw_pltname, default_level_prefix, "F_fp", lev, plot_raw_fields_guards); } - if (warpx.get_pointer_rho_fp(lev)) + if (warpx.isFieldInitialized(FieldType::rho_fp, lev)) { // rho_fp will have either ncomps or 2*ncomps (2 being the old and new). When 2, return the new so // there is time synchronization. - const int nstart = warpx.getrho_fp(lev).nComp() - WarpX::ncomps; - const MultiFab rho_new(warpx.getrho_fp(lev), amrex::make_alias, nstart, WarpX::ncomps); + const int nstart = warpx.getField(FieldType::rho_fp, lev).nComp() - WarpX::ncomps; + const MultiFab rho_new(warpx.getField(FieldType::rho_fp, lev), amrex::make_alias, nstart, WarpX::ncomps); WriteRawMF(rho_new, dm, raw_pltname, default_level_prefix, "rho_fp", lev, plot_raw_fields_guards); } - if (warpx.get_pointer_phi_fp(lev) != nullptr) { - WriteRawMF(warpx.getphi_fp(lev), dm, raw_pltname, default_level_prefix, "phi_fp", lev, plot_raw_fields_guards); + if (warpx.isFieldInitialized(FieldType::phi_fp, lev)) { + WriteRawMF(warpx.getField(FieldType::phi_fp, lev), dm, raw_pltname, default_level_prefix, "phi_fp", lev, plot_raw_fields_guards); } // Averaged fields on fine patch if (WarpX::fft_do_time_averaging) { - WriteRawMF(warpx.getEfield_avg_fp(lev, 0) , dm, raw_pltname, default_level_prefix, + WriteRawMF(warpx.getField(FieldType::Efield_avg_fp, lev, 0) , dm, raw_pltname, default_level_prefix, "Ex_avg_fp", lev, plot_raw_fields_guards); - WriteRawMF(warpx.getEfield_avg_fp(lev, 1) , dm, raw_pltname, default_level_prefix, + WriteRawMF(warpx.getField(FieldType::Efield_avg_fp, lev, 1) , dm, raw_pltname, default_level_prefix, "Ey_avg_fp", lev, plot_raw_fields_guards); - WriteRawMF(warpx.getEfield_avg_fp(lev, 2) , dm, raw_pltname, default_level_prefix, + WriteRawMF(warpx.getField(FieldType::Efield_avg_fp, lev, 2) , dm, raw_pltname, default_level_prefix, "Ez_avg_fp", lev, plot_raw_fields_guards); - WriteRawMF(warpx.getBfield_avg_fp(lev, 0) , dm, raw_pltname, default_level_prefix, + WriteRawMF(warpx.getField(FieldType::Bfield_avg_fp, lev, 0) , dm, raw_pltname, default_level_prefix, "Bx_avg_fp", lev, plot_raw_fields_guards); - WriteRawMF(warpx.getBfield_avg_fp(lev, 1) , dm, raw_pltname, default_level_prefix, + WriteRawMF(warpx.getField(FieldType::Bfield_avg_fp, lev, 1) , dm, raw_pltname, default_level_prefix, "By_avg_fp", lev, plot_raw_fields_guards); - WriteRawMF(warpx.getBfield_avg_fp(lev, 2) , dm, raw_pltname, default_level_prefix, + WriteRawMF(warpx.getField(FieldType::Bfield_avg_fp, lev, 2) , dm, raw_pltname, default_level_prefix, "Bz_avg_fp", lev, plot_raw_fields_guards); } // Coarse path if (lev > 0) { WriteCoarseVector( "E", - warpx.get_pointer_Efield_cp(lev, 0), warpx.get_pointer_Efield_cp(lev, 1), warpx.get_pointer_Efield_cp(lev, 2), - warpx.get_pointer_Efield_fp(lev, 0), warpx.get_pointer_Efield_fp(lev, 1), warpx.get_pointer_Efield_fp(lev, 2), + warpx.getFieldPointer(FieldType::Efield_cp, lev, 0), warpx.getFieldPointer(FieldType::Efield_cp, lev, 1), warpx.getFieldPointer(FieldType::Efield_cp, lev, 2), + warpx.getFieldPointer(FieldType::Efield_fp, lev, 0), warpx.getFieldPointer(FieldType::Efield_fp, lev, 1), warpx.getFieldPointer(FieldType::Efield_fp, lev, 2), dm, raw_pltname, default_level_prefix, lev, plot_raw_fields_guards); WriteCoarseVector( "B", - warpx.get_pointer_Bfield_cp(lev, 0), warpx.get_pointer_Bfield_cp(lev, 1), warpx.get_pointer_Bfield_cp(lev, 2), - warpx.get_pointer_Bfield_fp(lev, 0), warpx.get_pointer_Bfield_fp(lev, 1), warpx.get_pointer_Bfield_fp(lev, 2), + warpx.getFieldPointer(FieldType::Bfield_cp, lev, 0), warpx.getFieldPointer(FieldType::Bfield_cp, lev, 1), warpx.getFieldPointer(FieldType::Bfield_cp, lev, 2), + warpx.getFieldPointer(FieldType::Bfield_fp, lev, 0), warpx.getFieldPointer(FieldType::Bfield_fp, lev, 1), warpx.getFieldPointer(FieldType::Bfield_fp, lev, 2), dm, raw_pltname, default_level_prefix, lev, plot_raw_fields_guards); WriteCoarseVector( "j", - warpx.get_pointer_current_cp(lev, 0), warpx.get_pointer_current_cp(lev, 1), warpx.get_pointer_current_cp(lev, 2), - warpx.get_pointer_current_fp(lev, 0), warpx.get_pointer_current_fp(lev, 1), warpx.get_pointer_current_fp(lev, 2), + warpx.getFieldPointer(FieldType::current_cp, lev, 0), warpx.getFieldPointer(FieldType::current_cp, lev, 1), warpx.getFieldPointer(FieldType::current_cp, lev, 2), + warpx.getFieldPointer(FieldType::current_fp, lev, 0), warpx.getFieldPointer(FieldType::current_fp, lev, 1), warpx.getFieldPointer(FieldType::current_fp, lev, 2), dm, raw_pltname, default_level_prefix, lev, plot_raw_fields_guards); - if (warpx.get_pointer_F_fp(lev) && warpx.get_pointer_F_cp(lev)) + if (warpx.isFieldInitialized(FieldType::F_fp, lev) && warpx.isFieldInitialized(FieldType::F_cp, lev)) { - WriteCoarseScalar("F", warpx.get_pointer_F_cp(lev), warpx.get_pointer_F_fp(lev), + WriteCoarseScalar("F", warpx.getFieldPointer(FieldType::F_cp, lev), warpx.getFieldPointer(FieldType::F_fp, lev), dm, raw_pltname, default_level_prefix, lev, plot_raw_fields_guards, 0); } - if (warpx.get_pointer_rho_fp(lev) && warpx.get_pointer_rho_cp(lev)) + if (warpx.isFieldInitialized(FieldType::rho_fp, lev) && warpx.isFieldInitialized(FieldType::rho_cp, lev)) { // Use the component 1 of `rho_cp`, i.e. rho_new for time synchronization - WriteCoarseScalar("rho", warpx.get_pointer_rho_cp(lev), warpx.get_pointer_rho_fp(lev), + WriteCoarseScalar("rho", warpx.getFieldPointer(FieldType::rho_cp, lev), warpx.getFieldPointer(FieldType::rho_fp, lev), dm, raw_pltname, default_level_prefix, lev, plot_raw_fields_guards, 1); } } diff --git a/Source/Diagnostics/FullDiagnostics.cpp b/Source/Diagnostics/FullDiagnostics.cpp index bf4cd3f95fc..63683690483 100644 --- a/Source/Diagnostics/FullDiagnostics.cpp +++ b/Source/Diagnostics/FullDiagnostics.cpp @@ -170,15 +170,15 @@ FullDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev) #ifdef WARPX_DIM_RZ auto & warpx = WarpX::GetInstance(); - const int ncomp_multimodefab = warpx.get_pointer_Efield_aux(0, 0)->nComp(); + const int ncomp_multimodefab = warpx.getFieldPointer(FieldType::Efield_aux, 0, 0)->nComp(); // Make sure all multifabs have the same number of components for (int dim=0; dim<3; dim++){ AMREX_ALWAYS_ASSERT( - warpx.get_pointer_Efield_aux(lev, dim)->nComp() == ncomp_multimodefab ); + warpx.getFieldPointer(FieldType::Efield_aux, lev, dim)->nComp() == ncomp_multimodefab ); AMREX_ALWAYS_ASSERT( - warpx.get_pointer_Bfield_aux(lev, dim)->nComp() == ncomp_multimodefab ); + warpx.getFieldPointer(FieldType::Bfield_aux, lev, dim)->nComp() == ncomp_multimodefab ); AMREX_ALWAYS_ASSERT( - warpx.get_pointer_current_fp(lev, dim)->nComp() == ncomp_multimodefab ); + warpx.getFieldPointer(FieldType::current_fp, lev, dim)->nComp() == ncomp_multimodefab ); } // Species index to loop over species that dump rho per species @@ -211,37 +211,37 @@ FullDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev) const auto m_varname_fields_size = static_cast(m_varnames_fields.size()); for (int comp=0; comp(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 0), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("Er"), ncomp); } } else if ( m_varnames_fields[comp] == "Et" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 1), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("Et"), ncomp); } } else if ( m_varnames_fields[comp] == "Ez" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 2), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 2), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("Ez"), ncomp); } } else if ( m_varnames_fields[comp] == "Br" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 0), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("Br"), ncomp); } } else if ( m_varnames_fields[comp] == "Bt" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 1), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("Bt"), ncomp); } } else if ( m_varnames_fields[comp] == "Bz" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 2), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 2), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("Bz"), ncomp); @@ -301,19 +301,19 @@ FullDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev) } i++; } else if ( m_varnames_fields[comp] == "F" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_F_fp(lev), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::F_fp, lev), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("F"), ncomp); } } else if ( m_varnames_fields[comp] == "G" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_G_fp(lev), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::G_fp, lev), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("G"), ncomp); } } else if ( m_varnames_fields[comp] == "phi" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_phi_fp(lev), lev, m_crse_ratio, + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::phi_fp, lev), lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("phi"), ncomp); @@ -329,14 +329,16 @@ FullDiagnostics::InitializeFieldFunctorsRZopenPMD (int lev) m_varnames.push_back(std::string("part_per_grid")); } } else if ( m_varnames_fields[comp] == "divB" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_array_Bfield_aux(lev), lev, m_crse_ratio, - false, ncomp); + m_all_field_functors[lev][comp] = std::make_unique( + warpx.getFieldPointerArray(FieldType::Bfield_aux, lev), + lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("divB"), ncomp); } } else if ( m_varnames_fields[comp] == "divE" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_array_Efield_aux(lev), lev, m_crse_ratio, - false, ncomp); + m_all_field_functors[lev][comp] = std::make_unique( + warpx.getFieldPointerArray(FieldType::Efield_aux, lev), + lev, m_crse_ratio, false, ncomp); if (update_varnames) { AddRZModesToOutputNames(std::string("divE"), ncomp); } @@ -382,15 +384,15 @@ FullDiagnostics::AddRZModesToDiags (int lev) if (!m_dump_rz_modes) { return; } auto & warpx = WarpX::GetInstance(); - const int ncomp_multimodefab = warpx.get_pointer_Efield_aux(0, 0)->nComp(); + const int ncomp_multimodefab = warpx.getFieldPointer(FieldType::Efield_aux, 0, 0)->nComp(); // Make sure all multifabs have the same number of components for (int dim=0; dim<3; dim++){ AMREX_ALWAYS_ASSERT( - warpx.get_pointer_Efield_aux(lev, dim)->nComp() == ncomp_multimodefab ); + warpx.getFieldPointer(FieldType::Efield_aux, lev, dim)->nComp() == ncomp_multimodefab ); AMREX_ALWAYS_ASSERT( - warpx.get_pointer_Bfield_aux(lev, dim)->nComp() == ncomp_multimodefab ); + warpx.getFieldPointer(FieldType::Bfield_aux, lev, dim)->nComp() == ncomp_multimodefab ); AMREX_ALWAYS_ASSERT( - warpx.get_pointer_current_fp(lev, dim)->nComp() == ncomp_multimodefab ); + warpx.getFieldPointer(FieldType::current_fp, lev, dim)->nComp() == ncomp_multimodefab ); } // Check if divE is requested @@ -409,8 +411,6 @@ FullDiagnostics::AddRZModesToDiags (int lev) // diagnostic output bool deposit_current = !m_solver_deposits_current; - // First index of m_all_field_functors[lev] where RZ modes are stored - auto icomp =static_cast(m_all_field_functors[0].size()); const std::array coord {"r", "theta", "z"}; // Er, Etheta, Ez, Br, Btheta, Bz, jr, jtheta, jz @@ -422,48 +422,45 @@ FullDiagnostics::AddRZModesToDiags (int lev) if (rho_requested) { n_new_fields += 1; } - m_all_field_functors[lev].resize( m_all_field_functors[0].size() + n_new_fields ); + m_all_field_functors[lev].reserve( m_all_field_functors[0].size() + n_new_fields ); // E for (int dim=0; dim<3; dim++){ // 3 components, r theta z - m_all_field_functors[lev][icomp] = - std::make_unique(warpx.get_pointer_Efield_aux(lev, dim), lev, - m_crse_ratio, false, ncomp_multimodefab); + m_all_field_functors[lev].push_back(std::make_unique( + warpx.getFieldPointer(FieldType::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()); - icomp += 1; + warpx.getFieldPointer(FieldType::Efield_aux, 0, 0)->nComp()); } // B for (int dim=0; dim<3; dim++){ // 3 components, r theta z - m_all_field_functors[lev][icomp] = - std::make_unique(warpx.get_pointer_Bfield_aux(lev, dim), lev, - m_crse_ratio, false, ncomp_multimodefab); + m_all_field_functors[lev].push_back(std::make_unique( + warpx.getFieldPointer(FieldType::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()); - icomp += 1; + warpx.getFieldPointer(FieldType::Bfield_aux, 0, 0)->nComp()); } // j for (int dim=0; dim<3; dim++){ // 3 components, r theta z - m_all_field_functors[lev][icomp] = - std::make_unique(dim, lev, m_crse_ratio, false, deposit_current, ncomp_multimodefab); + m_all_field_functors[lev].push_back(std::make_unique( + dim, lev, m_crse_ratio, false, deposit_current, ncomp_multimodefab)); deposit_current = false; - icomp += 1; AddRZModesToOutputNames(std::string("J") + coord[dim], - warpx.get_pointer_current_fp(0, 0)->nComp()); + warpx.getFieldPointer(FieldType::current_fp, 0, 0)->nComp()); } // divE if (divE_requested) { - m_all_field_functors[lev][icomp] = std::make_unique(warpx.get_array_Efield_aux(lev), lev, - m_crse_ratio, false, ncomp_multimodefab); - icomp += 1; + m_all_field_functors[lev].push_back(std::make_unique( + warpx.getFieldPointerArray(FieldType::Efield_aux, lev), + lev, m_crse_ratio, false, ncomp_multimodefab)); AddRZModesToOutputNames(std::string("divE"), ncomp_multimodefab); } // rho if (rho_requested) { - m_all_field_functors[lev][icomp] = std::make_unique(lev, m_crse_ratio, true, -1, false, ncomp_multimodefab); - icomp += 1; + m_all_field_functors[lev].push_back(std::make_unique( + lev, m_crse_ratio, true, -1, false, ncomp_multimodefab)); AddRZModesToOutputNames(std::string("rho"), ncomp_multimodefab); } // Sum the number of components in input vector m_all_field_functors @@ -649,16 +646,16 @@ FullDiagnostics::InitializeFieldFunctors (int lev) // Fill vector of functors for all components except individual cylindrical modes. for (int comp=0; comp(warpx.get_pointer_Efield_aux(lev, 2), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 2), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Bz" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 2), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 2), lev, m_crse_ratio); } else if ( m_varnames[comp] == "jz" ){ m_all_field_functors[lev][comp] = std::make_unique(2, lev, m_crse_ratio, true, deposit_current); deposit_current = false; } else if ( m_varnames[comp] == "jz_displacement" ) { m_all_field_functors[lev][comp] = std::make_unique(2, lev, m_crse_ratio, true); } else if ( m_varnames[comp] == "Az" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_vector_potential_fp(lev, 2), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::vector_potential_fp, lev, 2), lev, m_crse_ratio); } else if ( m_varnames[comp] == "rho" ){ // Initialize rho functor to dump total rho m_all_field_functors[lev][comp] = std::make_unique(lev, m_crse_ratio, true); @@ -667,31 +664,31 @@ FullDiagnostics::InitializeFieldFunctors (int lev) m_all_field_functors[lev][comp] = std::make_unique(lev, m_crse_ratio, true, m_rho_per_species_index[i]); i++; } else if ( m_varnames[comp] == "F" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_F_fp(lev), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::F_fp, lev), lev, m_crse_ratio); } else if ( m_varnames[comp] == "G" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_G_fp(lev), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::G_fp, lev), lev, m_crse_ratio); } else if ( m_varnames[comp] == "phi" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_phi_fp(lev), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::phi_fp, lev), lev, m_crse_ratio); } else if ( m_varnames[comp] == "part_per_cell" ){ m_all_field_functors[lev][comp] = std::make_unique(nullptr, lev, m_crse_ratio); } else if ( m_varnames[comp] == "part_per_grid" ){ m_all_field_functors[lev][comp] = std::make_unique(nullptr, lev, m_crse_ratio); } else if ( m_varnames[comp] == "divB" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_array_Bfield_aux(lev), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointerArray(FieldType::Bfield_aux, lev), lev, m_crse_ratio); } else if ( m_varnames[comp] == "divE" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_array_Efield_aux(lev), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointerArray(FieldType::Efield_aux, lev), lev, m_crse_ratio); } else { #ifdef WARPX_DIM_RZ if ( m_varnames[comp] == "Er" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 0), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Et" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 1), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Br" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 0), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Bt" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 1), lev, m_crse_ratio); } else if ( m_varnames[comp] == "jr" ){ m_all_field_functors[lev][comp] = std::make_unique(0, lev, m_crse_ratio, true, deposit_current); deposit_current = false; @@ -703,24 +700,22 @@ FullDiagnostics::InitializeFieldFunctors (int lev) } else if (m_varnames[comp] == "jt_displacement" ){ m_all_field_functors[lev][comp] = std::make_unique(1, lev, m_crse_ratio, true); } else if ( m_varnames[comp] == "Ar" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_vector_potential_fp(lev, 0), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::vector_potential_fp, lev, 0), lev, m_crse_ratio); } else if ( m_varnames[comp] == "At" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_vector_potential_fp(lev, 1), lev, m_crse_ratio); - } - else { - std::cout << "Error on component " << m_varnames[comp] << std::endl; + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::vector_potential_fp, lev, 1), lev, m_crse_ratio); + } else { WARPX_ABORT_WITH_MESSAGE(m_varnames[comp] + " is not a known field output type for RZ geometry"); } #else // Valid transverse fields in Cartesian coordinates if ( m_varnames[comp] == "Ex" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 0), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 0), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Ey" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Efield_aux(lev, 1), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Efield_aux, lev, 1), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Bx" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 0), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 0), lev, m_crse_ratio); } else if ( m_varnames[comp] == "By" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_Bfield_aux(lev, 1), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::Bfield_aux, lev, 1), lev, m_crse_ratio); } else if ( m_varnames[comp] == "jx" ){ m_all_field_functors[lev][comp] = std::make_unique(0, lev, m_crse_ratio, true, deposit_current); deposit_current = false; @@ -732,9 +727,9 @@ FullDiagnostics::InitializeFieldFunctors (int lev) } else if ( m_varnames[comp] == "jy_displacement" ){ m_all_field_functors[lev][comp] = std::make_unique(1, lev, m_crse_ratio); } else if ( m_varnames[comp] == "Ax" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_vector_potential_fp(lev, 0), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::vector_potential_fp, lev, 0), lev, m_crse_ratio); } else if ( m_varnames[comp] == "Ay" ){ - m_all_field_functors[lev][comp] = std::make_unique(warpx.get_pointer_vector_potential_fp(lev, 1), lev, m_crse_ratio); + m_all_field_functors[lev][comp] = std::make_unique(warpx.getFieldPointer(FieldType::vector_potential_fp, lev, 1), lev, m_crse_ratio); } else { std::cout << "Error on component " << m_varnames[comp] << std::endl; WARPX_ABORT_WITH_MESSAGE(m_varnames[comp] + " is not a known field output type for this geometry"); diff --git a/Source/Diagnostics/ReducedDiags/ChargeOnEB.cpp b/Source/Diagnostics/ReducedDiags/ChargeOnEB.cpp index 1398072a84d..7e66061fa48 100644 --- a/Source/Diagnostics/ReducedDiags/ChargeOnEB.cpp +++ b/Source/Diagnostics/ReducedDiags/ChargeOnEB.cpp @@ -93,9 +93,9 @@ void ChargeOnEB::ComputeDiags (const int step) int const lev = 0; // get MultiFab data at lev - const amrex::MultiFab & Ex = warpx.getEfield_fp(lev,0); - const amrex::MultiFab & Ey = warpx.getEfield_fp(lev,1); - const amrex::MultiFab & Ez = warpx.getEfield_fp(lev,2); + const amrex::MultiFab & Ex = warpx.getField(FieldType::Efield_fp, lev,0); + const amrex::MultiFab & Ey = warpx.getField(FieldType::Efield_fp, lev,1); + const amrex::MultiFab & Ez = warpx.getField(FieldType::Efield_fp, lev,2); // get EB structures amrex::EBFArrayBoxFactory const& eb_box_factory = warpx.fieldEBFactory(lev); diff --git a/Source/Diagnostics/ReducedDiags/ColliderRelevant.cpp b/Source/Diagnostics/ReducedDiags/ColliderRelevant.cpp index 3229f10c89e..88dd0c0922b 100644 --- a/Source/Diagnostics/ReducedDiags/ColliderRelevant.cpp +++ b/Source/Diagnostics/ReducedDiags/ColliderRelevant.cpp @@ -441,12 +441,12 @@ void ColliderRelevant::ComputeDiags (int step) // define variables in preparation for field gathering const std::array& dx = WarpX::CellSize(std::max(lev, 0)); const amrex::GpuArray dx_arr = {dx[0], dx[1], dx[2]}; - const amrex::MultiFab & Ex = warpx.getEfield(lev,0); - const amrex::MultiFab & Ey = warpx.getEfield(lev,1); - const amrex::MultiFab & Ez = warpx.getEfield(lev,2); - const amrex::MultiFab & Bx = warpx.getBfield(lev,0); - const amrex::MultiFab & By = warpx.getBfield(lev,1); - const amrex::MultiFab & Bz = warpx.getBfield(lev,2); + const amrex::MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev,0); + const amrex::MultiFab & Ey = warpx.getField(FieldType::Efield_aux, lev,1); + const amrex::MultiFab & Ez = warpx.getField(FieldType::Efield_aux, lev,2); + const amrex::MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, lev,0); + const amrex::MultiFab & By = warpx.getField(FieldType::Bfield_aux, lev,1); + const amrex::MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, lev,2); // declare reduce_op ReduceOps reduce_op; diff --git a/Source/Diagnostics/ReducedDiags/FieldEnergy.cpp b/Source/Diagnostics/ReducedDiags/FieldEnergy.cpp index 1271e285c6c..65b33341d1a 100644 --- a/Source/Diagnostics/ReducedDiags/FieldEnergy.cpp +++ b/Source/Diagnostics/ReducedDiags/FieldEnergy.cpp @@ -89,12 +89,12 @@ void FieldEnergy::ComputeDiags (int step) for (int lev = 0; lev < nLevel; ++lev) { // get MultiFab data at lev - const MultiFab & Ex = warpx.getEfield(lev,0); - const MultiFab & Ey = warpx.getEfield(lev,1); - const MultiFab & Ez = warpx.getEfield(lev,2); - const MultiFab & Bx = warpx.getBfield(lev,0); - const MultiFab & By = warpx.getBfield(lev,1); - const MultiFab & Bz = warpx.getBfield(lev,2); + const MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev,0); + const MultiFab & Ey = warpx.getField(FieldType::Efield_aux, lev,1); + const MultiFab & Ez = warpx.getField(FieldType::Efield_aux, lev,2); + const MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, lev,0); + const MultiFab & By = warpx.getField(FieldType::Bfield_aux, lev,1); + const MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, lev,2); // get cell size Geometry const & geom = warpx.Geom(lev); diff --git a/Source/Diagnostics/ReducedDiags/FieldMaximum.cpp b/Source/Diagnostics/ReducedDiags/FieldMaximum.cpp index 8c66404056b..80979cd845e 100644 --- a/Source/Diagnostics/ReducedDiags/FieldMaximum.cpp +++ b/Source/Diagnostics/ReducedDiags/FieldMaximum.cpp @@ -114,12 +114,12 @@ void FieldMaximum::ComputeDiags (int step) for (int lev = 0; lev < nLevel; ++lev) { // get MultiFab data at lev - const MultiFab & Ex = warpx.getEfield(lev,0); - const MultiFab & Ey = warpx.getEfield(lev,1); - const MultiFab & Ez = warpx.getEfield(lev,2); - const MultiFab & Bx = warpx.getBfield(lev,0); - const MultiFab & By = warpx.getBfield(lev,1); - const MultiFab & Bz = warpx.getBfield(lev,2); + const MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev,0); + const MultiFab & Ey = warpx.getField(FieldType::Efield_aux, lev,1); + const MultiFab & Ez = warpx.getField(FieldType::Efield_aux, lev,2); + const MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, lev,0); + const MultiFab & By = warpx.getField(FieldType::Bfield_aux, lev,1); + const MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, lev,2); constexpr int noutputs = 8; // max of Ex,Ey,Ez,|E|,Bx,By,Bz and |B| constexpr int index_Ex = 0; diff --git a/Source/Diagnostics/ReducedDiags/FieldMomentum.cpp b/Source/Diagnostics/ReducedDiags/FieldMomentum.cpp index 3b3b7463593..901748bd6a9 100644 --- a/Source/Diagnostics/ReducedDiags/FieldMomentum.cpp +++ b/Source/Diagnostics/ReducedDiags/FieldMomentum.cpp @@ -106,12 +106,12 @@ void FieldMomentum::ComputeDiags (int step) for (int lev = 0; lev < nLevel; ++lev) { // Get MultiFab data at given refinement level - const amrex::MultiFab & Ex = warpx.getEfield(lev, 0); - const amrex::MultiFab & Ey = warpx.getEfield(lev, 1); - const amrex::MultiFab & Ez = warpx.getEfield(lev, 2); - const amrex::MultiFab & Bx = warpx.getBfield(lev, 0); - const amrex::MultiFab & By = warpx.getBfield(lev, 1); - const amrex::MultiFab & Bz = warpx.getBfield(lev, 2); + const amrex::MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev, 0); + const amrex::MultiFab & Ey = warpx.getField(FieldType::Efield_aux, lev, 1); + const amrex::MultiFab & Ez = warpx.getField(FieldType::Efield_aux, lev, 2); + const amrex::MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, lev, 0); + const amrex::MultiFab & By = warpx.getField(FieldType::Bfield_aux, lev, 1); + const amrex::MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, lev, 2); // Cell-centered index type const amrex::GpuArray cc{0,0,0}; diff --git a/Source/Diagnostics/ReducedDiags/FieldProbe.cpp b/Source/Diagnostics/ReducedDiags/FieldProbe.cpp index f0780622d54..4be5a928d96 100644 --- a/Source/Diagnostics/ReducedDiags/FieldProbe.cpp +++ b/Source/Diagnostics/ReducedDiags/FieldProbe.cpp @@ -391,12 +391,12 @@ void FieldProbe::ComputeDiags (int step) } // get MultiFab data at lev - const amrex::MultiFab &Ex = warpx.getEfield(lev, 0); - const amrex::MultiFab &Ey = warpx.getEfield(lev, 1); - const amrex::MultiFab &Ez = warpx.getEfield(lev, 2); - const amrex::MultiFab &Bx = warpx.getBfield(lev, 0); - const amrex::MultiFab &By = warpx.getBfield(lev, 1); - const amrex::MultiFab &Bz = warpx.getBfield(lev, 2); + const amrex::MultiFab &Ex = warpx.getField(FieldType::Efield_aux, lev, 0); + const amrex::MultiFab &Ey = warpx.getField(FieldType::Efield_aux, lev, 1); + const amrex::MultiFab &Ez = warpx.getField(FieldType::Efield_aux, lev, 2); + const amrex::MultiFab &Bx = warpx.getField(FieldType::Bfield_aux, lev, 0); + const amrex::MultiFab &By = warpx.getField(FieldType::Bfield_aux, lev, 1); + const amrex::MultiFab &Bz = warpx.getField(FieldType::Bfield_aux, lev, 2); /* * Prepare interpolation of field components to probe_position diff --git a/Source/Diagnostics/ReducedDiags/FieldReduction.H b/Source/Diagnostics/ReducedDiags/FieldReduction.H index 940222867b1..a2813bf51e8 100644 --- a/Source/Diagnostics/ReducedDiags/FieldReduction.H +++ b/Source/Diagnostics/ReducedDiags/FieldReduction.H @@ -99,15 +99,15 @@ public: const auto dx = geom.CellSizeArray(); // get MultiFab data - const amrex::MultiFab & Ex = warpx.getEfield(lev,0); - const amrex::MultiFab & Ey = warpx.getEfield(lev,1); - const amrex::MultiFab & Ez = warpx.getEfield(lev,2); - const amrex::MultiFab & Bx = warpx.getBfield(lev,0); - const amrex::MultiFab & By = warpx.getBfield(lev,1); - const amrex::MultiFab & Bz = warpx.getBfield(lev,2); - const amrex::MultiFab & jx = warpx.getcurrent_fp(lev,0); - const amrex::MultiFab & jy = warpx.getcurrent_fp(lev,1); - const amrex::MultiFab & jz = warpx.getcurrent_fp(lev,2); + const amrex::MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev,0); + const amrex::MultiFab & Ey = warpx.getField(FieldType::Efield_aux, lev,1); + const amrex::MultiFab & Ez = warpx.getField(FieldType::Efield_aux, lev,2); + const amrex::MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, lev,0); + const amrex::MultiFab & By = warpx.getField(FieldType::Bfield_aux, lev,1); + const amrex::MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, lev,2); + const amrex::MultiFab & jx = warpx.getField(FieldType::current_fp, lev,0); + const amrex::MultiFab & jy = warpx.getField(FieldType::current_fp, lev,1); + const amrex::MultiFab & jz = warpx.getField(FieldType::current_fp, lev,2); // General preparation of interpolation and reduction operations diff --git a/Source/Diagnostics/ReducedDiags/LoadBalanceCosts.cpp b/Source/Diagnostics/ReducedDiags/LoadBalanceCosts.cpp index 8af2c66711c..e5e8a7adc07 100644 --- a/Source/Diagnostics/ReducedDiags/LoadBalanceCosts.cpp +++ b/Source/Diagnostics/ReducedDiags/LoadBalanceCosts.cpp @@ -125,7 +125,7 @@ void LoadBalanceCosts::ComputeDiags (int step) for (int lev = 0; lev < nLevels; ++lev) { const amrex::DistributionMapping& dm = warpx.DistributionMap(lev); - const MultiFab & Ex = warpx.getEfield(lev,0); + const MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev,0); for (MFIter mfi(Ex, false); mfi.isValid(); ++mfi) { const Box& tbx = mfi.tilebox(); diff --git a/Source/Diagnostics/ReducedDiags/ParticleExtrema.cpp b/Source/Diagnostics/ReducedDiags/ParticleExtrema.cpp index 0414d9ce869..79b66a92e66 100644 --- a/Source/Diagnostics/ReducedDiags/ParticleExtrema.cpp +++ b/Source/Diagnostics/ReducedDiags/ParticleExtrema.cpp @@ -373,12 +373,12 @@ void ParticleExtrema::ComputeDiags (int step) // define variables in preparation for field gathering const std::array& dx = WarpX::CellSize(std::max(lev, 0)); const GpuArray dx_arr = {dx[0], dx[1], dx[2]}; - const MultiFab & Ex = warpx.getEfield(lev,0); - const MultiFab & Ey = warpx.getEfield(lev,1); - const MultiFab & Ez = warpx.getEfield(lev,2); - const MultiFab & Bx = warpx.getBfield(lev,0); - const MultiFab & By = warpx.getBfield(lev,1); - const MultiFab & Bz = warpx.getBfield(lev,2); + const MultiFab & Ex = warpx.getField(FieldType::Efield_aux, lev,0); + const MultiFab & Ey = warpx.getField(FieldType::Efield_aux, lev,1); + const MultiFab & Ez = warpx.getField(FieldType::Efield_aux, lev,2); + const MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, lev,0); + const MultiFab & By = warpx.getField(FieldType::Bfield_aux, lev,1); + const MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, lev,2); // declare reduce_op ReduceOps reduce_op; diff --git a/Source/Diagnostics/SliceDiagnostic.cpp b/Source/Diagnostics/SliceDiagnostic.cpp index f373e78c9b2..aaadac52610 100644 --- a/Source/Diagnostics/SliceDiagnostic.cpp +++ b/Source/Diagnostics/SliceDiagnostic.cpp @@ -195,27 +195,27 @@ CreateSlice( const MultiFab& mf, const Vector &dom_geom, amrex::amrex_avgdown_nodes(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio); } - if( SliceType == WarpX::GetInstance().getEfield(0,0).ixType().toIntVect() ) { + if( SliceType == WarpX::GetInstance().getField(FieldType::Efield_aux, 0,0).ixType().toIntVect() ) { amrex::amrex_avgdown_edges(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio, 0); } - if( SliceType == WarpX::GetInstance().getEfield(0,1).ixType().toIntVect() ) { + if( SliceType == WarpX::GetInstance().getField(FieldType::Efield_aux, 0,1).ixType().toIntVect() ) { amrex::amrex_avgdown_edges(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio, 1); } - if( SliceType == WarpX::GetInstance().getEfield(0,2).ixType().toIntVect() ) { + if( SliceType == WarpX::GetInstance().getField(FieldType::Efield_aux, 0,2).ixType().toIntVect() ) { amrex::amrex_avgdown_edges(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio, 2); } - if( SliceType == WarpX::GetInstance().getBfield(0,0).ixType().toIntVect() ) { + if( SliceType == WarpX::GetInstance().getField(FieldType::Bfield_aux, 0,0).ixType().toIntVect() ) { amrex::amrex_avgdown_faces(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio, 0); } - if( SliceType == WarpX::GetInstance().getBfield(0,1).ixType().toIntVect() ) { + if( SliceType == WarpX::GetInstance().getField(FieldType::Bfield_aux, 0,1).ixType().toIntVect() ) { amrex::amrex_avgdown_faces(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio, 1); } - if( SliceType == WarpX::GetInstance().getBfield(0,2).ixType().toIntVect() ) { + if( SliceType == WarpX::GetInstance().getField(FieldType::Bfield_aux, 0,2).ixType().toIntVect() ) { amrex::amrex_avgdown_faces(Dst_bx, Dst_fabox, Src_fabox, dcomp, scomp, ncomp, slice_cr_ratio, 2); } diff --git a/Source/FieldSolver/ElectrostaticSolver.cpp b/Source/FieldSolver/ElectrostaticSolver.cpp index f1bda102c8b..755c9d6e2a0 100644 --- a/Source/FieldSolver/ElectrostaticSolver.cpp +++ b/Source/FieldSolver/ElectrostaticSolver.cpp @@ -320,18 +320,18 @@ WarpX::computePhi (const amrex::Vector >& rho, e_field.push_back( # if defined(WARPX_DIM_1D_Z) amrex::Array{ - get_pointer_Efield_fp(lev, 2) + getFieldPointer(FieldType::Efield_fp, lev, 2) } # elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ) amrex::Array{ - get_pointer_Efield_fp(lev, 0), - get_pointer_Efield_fp(lev, 2) + getFieldPointer(FieldType::Efield_fp, lev, 0), + getFieldPointer(FieldType::Efield_fp, lev, 2) } # elif defined(WARPX_DIM_3D) amrex::Array{ - get_pointer_Efield_fp(lev, 0), - get_pointer_Efield_fp(lev, 1), - get_pointer_Efield_fp(lev, 2) + getFieldPointer(FieldType::Efield_fp, lev, 0), + getFieldPointer(FieldType::Efield_fp, lev, 1), + getFieldPointer(FieldType::Efield_fp, lev, 2) } # endif ); diff --git a/Source/FieldSolver/FiniteDifferenceSolver/HybridPICModel/HybridPICModel.cpp b/Source/FieldSolver/FiniteDifferenceSolver/HybridPICModel/HybridPICModel.cpp index e8330242fe8..228201886eb 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/HybridPICModel/HybridPICModel.cpp +++ b/Source/FieldSolver/FiniteDifferenceSolver/HybridPICModel/HybridPICModel.cpp @@ -149,15 +149,15 @@ void HybridPICModel::InitData () auto & warpx = WarpX::GetInstance(); // Get the grid staggering of the fields involved in calculating E - amrex::IntVect Jx_stag = warpx.getcurrent_fp(0,0).ixType().toIntVect(); - amrex::IntVect Jy_stag = warpx.getcurrent_fp(0,1).ixType().toIntVect(); - amrex::IntVect Jz_stag = warpx.getcurrent_fp(0,2).ixType().toIntVect(); - amrex::IntVect Bx_stag = warpx.getBfield_fp(0,0).ixType().toIntVect(); - amrex::IntVect By_stag = warpx.getBfield_fp(0,1).ixType().toIntVect(); - amrex::IntVect Bz_stag = warpx.getBfield_fp(0,2).ixType().toIntVect(); - amrex::IntVect Ex_stag = warpx.getEfield_fp(0,0).ixType().toIntVect(); - amrex::IntVect Ey_stag = warpx.getEfield_fp(0,1).ixType().toIntVect(); - amrex::IntVect Ez_stag = warpx.getEfield_fp(0,2).ixType().toIntVect(); + amrex::IntVect Jx_stag = warpx.getField(FieldType::current_fp, 0,0).ixType().toIntVect(); + amrex::IntVect Jy_stag = warpx.getField(FieldType::current_fp, 0,1).ixType().toIntVect(); + amrex::IntVect Jz_stag = warpx.getField(FieldType::current_fp, 0,2).ixType().toIntVect(); + amrex::IntVect Bx_stag = warpx.getField(FieldType::Bfield_fp, 0,0).ixType().toIntVect(); + amrex::IntVect By_stag = warpx.getField(FieldType::Bfield_fp, 0,1).ixType().toIntVect(); + amrex::IntVect Bz_stag = warpx.getField(FieldType::Bfield_fp, 0,2).ixType().toIntVect(); + amrex::IntVect Ex_stag = warpx.getField(FieldType::Efield_fp, 0,0).ixType().toIntVect(); + amrex::IntVect Ey_stag = warpx.getField(FieldType::Efield_fp, 0,1).ixType().toIntVect(); + amrex::IntVect Ez_stag = warpx.getField(FieldType::Efield_fp, 0,2).ixType().toIntVect(); // Check that the grid types are appropriate const bool appropriate_grids = ( @@ -224,9 +224,9 @@ void HybridPICModel::InitData () for (int lev = 0; lev <= warpx.finestLevel(); ++lev) { #ifdef AMREX_USE_EB - auto& edge_lengths_x = warpx.getedgelengths(lev, 0); - auto& edge_lengths_y = warpx.getedgelengths(lev, 1); - auto& edge_lengths_z = warpx.getedgelengths(lev, 2); + auto& edge_lengths_x = warpx.getField(FieldType::edge_lengths, lev, 0); + auto& edge_lengths_y = warpx.getField(FieldType::edge_lengths, lev, 1); + auto& edge_lengths_z = warpx.getField(FieldType::edge_lengths, lev, 2); const auto edge_lengths = std::array< std::unique_ptr, 3 >{ std::make_unique( @@ -499,7 +499,7 @@ void HybridPICModel::CalculateElectronPressure(const int lev, DtType a_dt_type) // charge density. if (a_dt_type == DtType::Full) { FillElectronPressureMF( - electron_pressure_fp[lev], warpx.get_pointer_rho_fp(lev) + electron_pressure_fp[lev], warpx.getFieldPointer(FieldType::rho_fp, lev) ); } else { FillElectronPressureMF( diff --git a/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/MacroscopicProperties.cpp b/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/MacroscopicProperties.cpp index 965db68a558..c60a0b4c4d5 100644 --- a/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/MacroscopicProperties.cpp +++ b/Source/FieldSolver/FiniteDifferenceSolver/MacroscopicProperties/MacroscopicProperties.cpp @@ -180,9 +180,9 @@ MacroscopicProperties::InitData () amrex::IntVect sigma_stag = m_sigma_mf->ixType().toIntVect(); amrex::IntVect epsilon_stag = m_eps_mf->ixType().toIntVect(); amrex::IntVect mu_stag = m_mu_mf->ixType().toIntVect(); - amrex::IntVect Ex_stag = warpx.getEfield_fp(0,0).ixType().toIntVect(); - amrex::IntVect Ey_stag = warpx.getEfield_fp(0,1).ixType().toIntVect(); - amrex::IntVect Ez_stag = warpx.getEfield_fp(0,2).ixType().toIntVect(); + amrex::IntVect Ex_stag = warpx.getField(FieldType::Efield_fp, 0,0).ixType().toIntVect(); + amrex::IntVect Ey_stag = warpx.getField(FieldType::Efield_fp, 0,1).ixType().toIntVect(); + amrex::IntVect Ez_stag = warpx.getField(FieldType::Efield_fp, 0,2).ixType().toIntVect(); for ( int idim = 0; idim < AMREX_SPACEDIM; ++idim) { sigma_IndexType[idim] = sigma_stag[idim]; diff --git a/Source/Parallelization/GuardCellManager.cpp b/Source/Parallelization/GuardCellManager.cpp index dc7800f490a..28157e09d8c 100644 --- a/Source/Parallelization/GuardCellManager.cpp +++ b/Source/Parallelization/GuardCellManager.cpp @@ -120,9 +120,11 @@ guardCellManager::Init ( #elif defined(WARPX_DIM_XZ) || defined(WARPX_DIM_RZ) ng_alloc_EB = IntVect(ngx,ngz); ng_alloc_J = IntVect(ngJx,ngJz); + amrex::ignore_unused(ngy, ngJy); #elif defined(WARPX_DIM_1D_Z) ng_alloc_EB = IntVect(ngz); ng_alloc_J = IntVect(ngJz); + amrex::ignore_unused(ngx, ngJx, ngy, ngJy); #endif // TODO Adding one cell for rho should not be necessary, given that the number of guard cells diff --git a/Source/Parallelization/WarpXComm_K.H b/Source/Parallelization/WarpXComm_K.H index 4cec33bc84f..a2b8fe38ed4 100644 --- a/Source/Parallelization/WarpXComm_K.H +++ b/Source/Parallelization/WarpXComm_K.H @@ -179,10 +179,6 @@ void warpx_interp (int j, int k, int l, amrex::Real fine = 0.0_rt; amrex::Real coarse = 0.0_rt; - amrex::Real wj; - amrex::Real wk; - amrex::Real wl; - // 1) Interpolation from coarse nodal to fine nodal nj = 2; @@ -197,20 +193,18 @@ void warpx_interp (int j, int k, int l, nl = 2; #endif - wj = 1.0_rt; - wk = 1.0_rt; - wl = 1.0_rt; for (int jj = 0; jj < nj; jj++) { for (int kk = 0; kk < nk; kk++) { for (int ll = 0; ll < nl; ll++) { - wj = (rj - amrex::Math::abs(j - (jc + jj) * rj)) / static_cast(rj); + auto c = arr_tmp_zeropad(jc+jj,kc+kk,lc+ll); + c *= (rj - amrex::Math::abs(j - (jc + jj) * rj)) / static_cast(rj); #if (AMREX_SPACEDIM >= 2) - wk = (rk - amrex::Math::abs(k - (kc + kk) * rk)) / static_cast(rk); + c *= (rk - amrex::Math::abs(k - (kc + kk) * rk)) / static_cast(rk); #endif #if (AMREX_SPACEDIM == 3) - wl = (rl - amrex::Math::abs(l - (lc + ll) * rl)) / static_cast(rl); + c *= (rl - amrex::Math::abs(l - (lc + ll) * rl)) / static_cast(rl); #endif - tmp += wj * wk * wl * arr_tmp_zeropad(jc+jj,kc+kk,lc+ll); + tmp += c; } } } @@ -237,20 +231,18 @@ void warpx_interp (int j, int k, int l, kc = amrex::coarsen(kn, rk); lc = amrex::coarsen(ln, rl); - wj = 1.0_rt; - wk = 1.0_rt; - wl = 1.0_rt; for (int jj = 0; jj < nj; jj++) { for (int kk = 0; kk < nk; kk++) { for (int ll = 0; ll < nl; ll++) { - wj = (rj - amrex::Math::abs(jn - (jc + jj) * rj)) / static_cast(rj); + auto c = arr_coarse_zeropad(jc+jj,kc+kk,lc+ll); + c *= (rj - amrex::Math::abs(jn - (jc + jj) * rj)) / static_cast(rj); #if (AMREX_SPACEDIM >= 2) - wk = (rk - amrex::Math::abs(kn - (kc + kk) * rk)) / static_cast(rk); + c *= (rk - amrex::Math::abs(kn - (kc + kk) * rk)) / static_cast(rk); #endif #if (AMREX_SPACEDIM == 3) - wl = (rl - amrex::Math::abs(ln - (lc + ll) * rl)) / static_cast(rl); + c *= (rl - amrex::Math::abs(ln - (lc + ll) * rl)) / static_cast(rl); #endif - coarse += wj * wk * wl * arr_coarse_zeropad(jc+jj,kc+kk,lc+ll); + coarse += c; } } } @@ -284,13 +276,11 @@ void warpx_interp (int j, int k, int l, for (int jj = 0; jj < nj; jj++) { for (int kk = 0; kk < nk; kk++) { for (int ll = 0; ll < nl; ll++) { - wj = 1.0_rt / static_cast(nj); - wk = 1.0_rt / static_cast(nk); - wl = 1.0_rt / static_cast(nl); - fine += wj * wk * wl * arr_fine_zeropad(jm+jj,km+kk,lm+ll); + fine += arr_fine_zeropad(jm+jj,km+kk,lm+ll); } } } + fine = fine/static_cast(nj*nk*nl); // Final result arr_aux(j,k,l) = tmp + (fine - coarse); diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index b70844a8d15..97c51c6350b 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -1344,12 +1344,12 @@ MultiParticleContainer::doQEDSchwinger () pc_product_ele->defineAllParticleTiles(); pc_product_pos->defineAllParticleTiles(); - const MultiFab & Ex = warpx.getEfield(level_0,0); - const MultiFab & Ey = warpx.getEfield(level_0,1); - const MultiFab & Ez = warpx.getEfield(level_0,2); - const MultiFab & Bx = warpx.getBfield(level_0,0); - const MultiFab & By = warpx.getBfield(level_0,1); - const MultiFab & Bz = warpx.getBfield(level_0,2); + const MultiFab & Ex = warpx.getField(FieldType::Efield_aux, level_0,0); + const MultiFab & Ey = warpx.getField(FieldType::Efield_aux, level_0,1); + const MultiFab & Ez = warpx.getField(FieldType::Efield_aux, level_0,2); + const MultiFab & Bx = warpx.getField(FieldType::Bfield_aux, level_0,0); + const MultiFab & By = warpx.getField(FieldType::Bfield_aux, level_0,1); + const MultiFab & Bz = warpx.getField(FieldType::Bfield_aux, level_0,2); #ifdef AMREX_USE_OMP #pragma omp parallel if (amrex::Gpu::notInLaunchRegion()) diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 9923d93a907..4b2d73c7d6a 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -2867,11 +2867,11 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti, // Using this version of ParallelFor with compile time options // improves performance when qed or external EB are not used by reducing // register pressure. - amrex::ParallelFor(TypeList, - CompileTimeOptions>{}, - {exteb_runtime_flag, qed_runtime_flag}, - np_to_push, [=] AMREX_GPU_DEVICE (long ip, auto exteb_control, - auto qed_control) + amrex::ParallelFor( + TypeList, CompileTimeOptions>{}, + {exteb_runtime_flag, qed_runtime_flag}, + np_to_push, + [=] AMREX_GPU_DEVICE (long ip, auto exteb_control, auto qed_control) { amrex::ParticleReal xp, yp, zp; getPosition(ip, xp, yp, zp); diff --git a/Source/WarpX.H b/Source/WarpX.H index 0c86a1c9afe..3be95f47865 100644 --- a/Source/WarpX.H +++ b/Source/WarpX.H @@ -69,12 +69,11 @@ #include #include #include +#include #include #include #include #include -#include - enum struct PatchType : int { @@ -82,6 +81,33 @@ enum struct PatchType : int coarse }; +enum struct FieldType : int +{ + Efield_aux, + Bfield_aux, + Efield_fp, + Bfield_fp, + current_fp, + current_fp_nodal, + rho_fp, + F_fp, + G_fp, + phi_fp, + vector_potential_fp, + Efield_cp, + Bfield_cp, + current_cp, + rho_cp, + F_cp, + G_cp, + edge_lengths, + face_areas, + Efield_avg_fp, + Bfield_avg_fp, + Efield_avg_cp, + Bfield_avg_cp +}; + class WARPX_EXPORT WarpX : public amrex::AmrCore { @@ -463,72 +489,56 @@ public: static std::map multifab_map; static std::map imultifab_map; - [[nodiscard]] std::array - get_array_Bfield_aux (const int lev) const { - return { - Bfield_aux[lev][0].get(), - Bfield_aux[lev][1].get(), - Bfield_aux[lev][2].get() - }; - } + /** + * \brief + * Check if a field is initialized. + * + * \param field_type[in] the field type + * \param lev[in] the mesh refinement level + * \param direction[in] the field component (0 by default) + * + * \return true if the field is initialized, false otherwise + */ + [[nodiscard]] bool + isFieldInitialized (FieldType field_type, int lev, int direction = 0) const; + + /** + * \brief + * Get a pointer to the field data. + * + * \param field_type[in] the field type + * \param lev[in] the mesh refinement level + * \param direction[in] the field component (0 by default) + * + * \return the pointer to an amrex::MultiFab containing the field data + */ + [[nodiscard]] amrex::MultiFab* + getFieldPointer (FieldType field_type, int lev, int direction = 0) const; + /** + * \brief + * For vector fields, get an array of three pointers to the field data. + * + * \param field_type[in] the field type + * \param lev[in] the mesh refinement level + * + * \return an array of three pointers amrex::MultiFab* containing the field data + */ [[nodiscard]] std::array - get_array_Efield_aux (const int lev) const { - return { - Efield_aux[lev][0].get(), - Efield_aux[lev][1].get(), - Efield_aux[lev][2].get() - }; - } + getFieldPointerArray (FieldType field_type, int lev) const; - [[nodiscard]] amrex::MultiFab * get_pointer_Efield_aux (int lev, int direction) const { return Efield_aux[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_aux (int lev, int direction) const { return Bfield_aux[lev][direction].get(); } - - [[nodiscard]] amrex::MultiFab * get_pointer_Efield_fp (int lev, int direction) const { return Efield_fp[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_fp (int lev, int direction) const { return Bfield_fp[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_current_fp (int lev, int direction) const { return current_fp[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_current_fp_nodal (int lev, int direction) const { return current_fp_nodal[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_rho_fp (int lev) const { return rho_fp[lev].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_F_fp (int lev) const { return F_fp[lev].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_G_fp (int lev) const { return G_fp[lev].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_phi_fp (int lev) const { return phi_fp[lev].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_vector_potential_fp (int lev, int direction) const { return vector_potential_fp_nodal[lev][direction].get(); } - - [[nodiscard]] amrex::MultiFab * get_pointer_Efield_cp (int lev, int direction) const { return Efield_cp[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_Bfield_cp (int lev, int direction) const { return Bfield_cp[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_current_cp (int lev, int direction) const { return current_cp[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_rho_cp (int lev) const { return rho_cp[lev].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_F_cp (int lev) const { return F_cp[lev].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_G_cp (int lev) const { return G_cp[lev].get(); } - - [[nodiscard]] amrex::MultiFab * get_pointer_edge_lengths (int lev, int direction) const { return m_edge_lengths[lev][direction].get(); } - [[nodiscard]] amrex::MultiFab * get_pointer_face_areas (int lev, int direction) const { return m_face_areas[lev][direction].get(); } - - const amrex::MultiFab& getEfield (int lev, int direction) {return *Efield_aux[lev][direction];} - const amrex::MultiFab& getBfield (int lev, int direction) {return *Bfield_aux[lev][direction];} - - const amrex::MultiFab& getcurrent_cp (int lev, int direction) {return *current_cp[lev][direction];} - const amrex::MultiFab& getEfield_cp (int lev, int direction) {return *Efield_cp[lev][direction];} - const amrex::MultiFab& getBfield_cp (int lev, int direction) {return *Bfield_cp[lev][direction];} - const amrex::MultiFab& getrho_cp (int lev) {return *rho_cp[lev];} - const amrex::MultiFab& getF_cp (int lev) {return *F_cp[lev];} - const amrex::MultiFab& getG_cp (int lev) {return *G_cp[lev];} - - const amrex::MultiFab& getcurrent_fp (int lev, int direction) {return *current_fp[lev][direction];} - const amrex::MultiFab& getEfield_fp (int lev, int direction) {return *Efield_fp[lev][direction];} - const amrex::MultiFab& getBfield_fp (int lev, int direction) {return *Bfield_fp[lev][direction];} - const amrex::MultiFab& getrho_fp (int lev) {return *rho_fp[lev];} - const amrex::MultiFab& getphi_fp (int lev) {return *phi_fp[lev];} - const amrex::MultiFab& getF_fp (int lev) {return *F_fp[lev];} - const amrex::MultiFab& getG_fp (int lev) {return *G_fp[lev];} - - const amrex::MultiFab& getEfield_avg_fp (int lev, int direction) {return *Efield_avg_fp[lev][direction];} - const amrex::MultiFab& getBfield_avg_fp (int lev, int direction) {return *Bfield_avg_fp[lev][direction];} - const amrex::MultiFab& getEfield_avg_cp (int lev, int direction) {return *Efield_avg_cp[lev][direction];} - const amrex::MultiFab& getBfield_avg_cp (int lev, int direction) {return *Bfield_avg_cp[lev][direction];} - - const amrex::MultiFab& getedgelengths (int lev, int direction) {return *m_edge_lengths[lev][direction];} - const amrex::MultiFab& getfaceareas (int lev, int direction) {return *m_face_areas[lev][direction];} + /** + * \brief + * Get a constant reference to the field data. + * + * \param field_type[in] the field type + * \param lev[in] the mesh refinement level + * \param direction[in] the field component (0 by default) + * + * \return a constant refernce to an amrex::MultiFab containing the field data + */ + [[nodiscard]] const amrex::MultiFab& + getField(FieldType field_type, int lev, int direction = 0) const; [[nodiscard]] bool DoPML () const {return do_pml;} [[nodiscard]] bool DoFluidSpecies () const {return do_fluid_species;} @@ -1586,6 +1596,20 @@ private: amrex::Vector, 3 > > current_buf; amrex::Vector > charge_buf; + /** + * \brief + * Get a pointer to the field data. Does not check if the pointer + * is not nullptr. + * + * \param field_type[in] the field type + * \param lev[in] the mesh refinement level + * \param direction[in] the field component (0 by default) + * + * \return the pointer to an amrex::MultiFab containing the field data + */ + [[nodiscard]] amrex::MultiFab* + getFieldPointerUnchecked (FieldType field_type, int lev, int direction = 0) const; + // PML int do_pml = 0; int do_silver_mueller = 0; diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index 83f48394400..11646927863 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -3370,3 +3370,127 @@ WarpX::AllocInitMultiFabFromModel ( } multifab_map[name_with_suffix] = mf.get(); } + +amrex::MultiFab* +WarpX::getFieldPointerUnchecked (const FieldType field_type, const int lev, const int direction) const +{ + // This function does *not* check if the returned field pointer is != nullptr + + amrex::MultiFab* field_pointer = nullptr; + + switch(field_type) + { + case FieldType::Efield_aux : + field_pointer = Efield_aux[lev][direction].get(); + break; + case FieldType::Bfield_aux : + field_pointer = Bfield_aux[lev][direction].get(); + break; + case FieldType::Efield_fp : + field_pointer = Efield_fp[lev][direction].get(); + break; + case FieldType::Bfield_fp : + field_pointer = Bfield_fp[lev][direction].get(); + break; + case FieldType::current_fp : + field_pointer = current_fp[lev][direction].get(); + break; + case FieldType::current_fp_nodal : + field_pointer = current_fp_nodal[lev][direction].get(); + break; + case FieldType::rho_fp : + field_pointer = rho_fp[lev].get(); + break; + case FieldType::F_fp : + field_pointer = F_fp[lev].get(); + break; + case FieldType::G_fp : + field_pointer = G_fp[lev].get(); + break; + case FieldType::phi_fp : + field_pointer = phi_fp[lev].get(); + break; + case FieldType::vector_potential_fp : + field_pointer = vector_potential_fp_nodal[lev][direction].get(); + break; + case FieldType::Efield_cp : + field_pointer = Efield_cp[lev][direction].get(); + break; + case FieldType::Bfield_cp : + field_pointer = Bfield_cp[lev][direction].get(); + break; + case FieldType::current_cp : + field_pointer = current_cp[lev][direction].get(); + break; + case FieldType::rho_cp : + field_pointer = rho_cp[lev].get(); + break; + case FieldType::F_cp : + field_pointer = F_cp[lev].get(); + break; + case FieldType::G_cp : + field_pointer = G_cp[lev].get(); + break; + case FieldType::edge_lengths : + field_pointer = m_edge_lengths[lev][direction].get(); + break; + case FieldType::face_areas : + field_pointer = m_face_areas[lev][direction].get(); + break; + case FieldType::Efield_avg_fp : + field_pointer = Efield_avg_fp[lev][direction].get(); + break; + case FieldType::Bfield_avg_fp : + field_pointer = Bfield_avg_fp[lev][direction].get(); + break; + case FieldType::Efield_avg_cp : + field_pointer = Efield_avg_cp[lev][direction].get(); + break; + case FieldType::Bfield_avg_cp : + field_pointer = Bfield_avg_cp[lev][direction].get(); + break; + default: + WARPX_ABORT_WITH_MESSAGE("Invalid field type"); + break; + } + + return field_pointer; +} + +bool +WarpX::isFieldInitialized (const FieldType field_type, const int lev, const int direction) const +{ + const bool is_field_init = (getFieldPointerUnchecked(field_type, lev, direction) != nullptr); + return is_field_init; +} + +amrex::MultiFab* +WarpX::getFieldPointer (const FieldType field_type, const int lev, const int direction) const +{ + auto* const field_pointer = getFieldPointerUnchecked(field_type, lev, direction); + WARPX_ALWAYS_ASSERT_WITH_MESSAGE( + field_pointer != nullptr, "Requested field is not initialized!"); + return field_pointer; +} + +std::array +WarpX::getFieldPointerArray (const FieldType field_type, const int lev) const +{ + WARPX_ALWAYS_ASSERT_WITH_MESSAGE( + (field_type == FieldType::Efield_aux) || (field_type == FieldType::Bfield_aux) || + (field_type == FieldType::Efield_fp) || (field_type == FieldType::Bfield_fp) || + (field_type == FieldType::current_fp) || (field_type == FieldType::current_fp_nodal) || + (field_type == FieldType::Efield_cp) || (field_type == FieldType::Bfield_cp) || + (field_type == FieldType::current_cp), "Requested field type is not a vector."); + + return std::array{ + getFieldPointer(field_type, lev, 0), + getFieldPointer(field_type, lev, 1), + getFieldPointer(field_type, lev, 2)}; +} + +const amrex::MultiFab& +WarpX::getField(FieldType field_type, const int lev, const int direction) const +{ + return *getFieldPointer(field_type, lev, direction); +} diff --git a/Source/ablastr/parallelization/MPIInitHelpers.H b/Source/ablastr/parallelization/MPIInitHelpers.H index 6b9bdfa4737..660e5e56d06 100644 --- a/Source/ablastr/parallelization/MPIInitHelpers.H +++ b/Source/ablastr/parallelization/MPIInitHelpers.H @@ -15,7 +15,7 @@ namespace ablastr::parallelization * * @return the MPI_THREAD_* level required for MPI_Init_thread */ - int + constexpr int mpi_thread_required (); /** Initialize MPI diff --git a/Source/ablastr/parallelization/MPIInitHelpers.cpp b/Source/ablastr/parallelization/MPIInitHelpers.cpp index 633c004c93a..513035c483c 100644 --- a/Source/ablastr/parallelization/MPIInitHelpers.cpp +++ b/Source/ablastr/parallelization/MPIInitHelpers.cpp @@ -29,20 +29,20 @@ namespace ablastr::parallelization { - int + constexpr int mpi_thread_required () { - int thread_required = -1; #ifdef AMREX_USE_MPI - thread_required = MPI_THREAD_SINGLE; // equiv. to MPI_Init -# ifdef AMREX_USE_OMP - thread_required = MPI_THREAD_FUNNELED; -# endif # ifdef AMREX_MPI_THREAD_MULTIPLE // i.e. for async_io - thread_required = MPI_THREAD_MULTIPLE; + return MPI_THREAD_MULTIPLE; +# elif AMREX_USE_OMP + return MPI_THREAD_FUNNELED; +# else + return MPI_THREAD_SINGLE; // equiv. to MPI_Init # endif +#else + return -1; #endif - return thread_required; } std::pair< int, int > @@ -58,7 +58,7 @@ namespace ablastr::parallelization } #endif - const int thread_required = mpi_thread_required(); + constexpr int thread_required = mpi_thread_required(); #ifdef AMREX_USE_MPI int thread_provided = -1; MPI_Init_thread(&argc, &argv, thread_required, &thread_provided); @@ -82,7 +82,7 @@ namespace ablastr::parallelization check_mpi_thread_level () { #ifdef AMREX_USE_MPI - const int thread_required = mpi_thread_required(); + constexpr int thread_required = mpi_thread_required(); int thread_provided = -1; MPI_Query_thread(&thread_provided); auto mtn = amrex::ParallelDescriptor::mpi_level_to_string;