diff options
-rw-r--r-- | Source/Initialization/PlasmaInjector.H | 2 | ||||
-rw-r--r-- | Source/Initialization/PlasmaInjector.cpp | 6 | ||||
-rw-r--r-- | Source/Initialization/WarpXInitData.cpp | 6 | ||||
-rw-r--r-- | Source/Particles/PhysicalParticleContainer.cpp | 2 | ||||
-rw-r--r-- | Source/Python/WarpXWrappers.cpp | 2 | ||||
-rw-r--r-- | Source/WarpX.H | 22 | ||||
-rw-r--r-- | Source/WarpX.cpp | 36 | ||||
-rw-r--r-- | Source/main.cpp | 14 |
8 files changed, 61 insertions, 29 deletions
diff --git a/Source/Initialization/PlasmaInjector.H b/Source/Initialization/PlasmaInjector.H index 1c2fc453d..d0c59f8d6 100644 --- a/Source/Initialization/PlasmaInjector.H +++ b/Source/Initialization/PlasmaInjector.H @@ -44,7 +44,7 @@ public: PlasmaInjector () = default; - PlasmaInjector (int ispecies, const std::string& name); + PlasmaInjector (int ispecies, const std::string& name, const amrex::Geometry& geom); ~PlasmaInjector (); diff --git a/Source/Initialization/PlasmaInjector.cpp b/Source/Initialization/PlasmaInjector.cpp index 4149ca4bc..115fbfca1 100644 --- a/Source/Initialization/PlasmaInjector.cpp +++ b/Source/Initialization/PlasmaInjector.cpp @@ -54,8 +54,9 @@ namespace { } } -PlasmaInjector::PlasmaInjector (int ispecies, const std::string& name) - : species_id{ispecies}, species_name{name} +PlasmaInjector::PlasmaInjector (int ispecies, const std::string& name, + const amrex::Geometry& geom): + species_id{ispecies}, species_name{name} { using namespace amrex::literals; @@ -83,7 +84,6 @@ PlasmaInjector::PlasmaInjector (int ispecies, const std::string& name) zmax = std::numeric_limits<amrex::Real>::max(); // NOTE: When periodic boundaries are used, default injection range is set to mother grid dimensions. - const amrex::Geometry& geom = WarpX::GetInstance().Geom(0); if( geom.isPeriodic(0) ) { # ifndef WARPX_DIM_1D_Z xmin = geom.ProbLo(0); diff --git a/Source/Initialization/WarpXInitData.cpp b/Source/Initialization/WarpXInitData.cpp index 3f37ef541..ed6490c82 100644 --- a/Source/Initialization/WarpXInitData.cpp +++ b/Source/Initialization/WarpXInitData.cpp @@ -411,6 +411,12 @@ WarpX::InitData () Print() << utils::logo::get_logo(); + // Diagnostics + multi_diags = std::make_unique<MultiDiagnostics>(); + + /** create object for reduced diagnostics */ + reduced_diags = std::make_unique<MultiReducedDiags>(); + // WarpX::computeMaxStepBoostAccelerator // needs to start from the initial zmin_domain_boost, // even if restarting from a checkpoint file diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp index 0ed851e9f..143847d4d 100644 --- a/Source/Particles/PhysicalParticleContainer.cpp +++ b/Source/Particles/PhysicalParticleContainer.cpp @@ -236,7 +236,7 @@ PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core, int isp { BackwardCompatibility(); - plasma_injector = std::make_unique<PlasmaInjector>(species_id, species_name); + plasma_injector = std::make_unique<PlasmaInjector>(species_id, species_name, amr_core->Geom(0)); physical_species = plasma_injector->getPhysicalSpecies(); charge = plasma_injector->getCharge(); mass = plasma_injector->getMass(); diff --git a/Source/Python/WarpXWrappers.cpp b/Source/Python/WarpXWrappers.cpp index cbee65b61..8d3be68be 100644 --- a/Source/Python/WarpXWrappers.cpp +++ b/Source/Python/WarpXWrappers.cpp @@ -173,7 +173,7 @@ namespace void warpx_finalize () { - WarpX::ResetInstance(); + WarpX::Finalize(); } void warpx_set_callback_py ( diff --git a/Source/WarpX.H b/Source/WarpX.H index f67a007d2..ae8f7dfca 100644 --- a/Source/WarpX.H +++ b/Source/WarpX.H @@ -83,9 +83,15 @@ public: friend class PML; static WarpX& GetInstance (); + static void ResetInstance (); - WarpX (); + /** + * \brief + * This method has to be called at the end of the simulation. It deletes the WarpX instance. + */ + static void Finalize(); + ~WarpX (); static std::string Version (); //!< Version of WarpX executable @@ -1116,6 +1122,20 @@ protected: private: + /** + * \brief + * WarpX constructor. This method should not be called directly, but rather through + * the static member function MakeWarpX(). MakeWarpX() is called by GetInstance () + * if an instance of the WarpX class does not currently exist. + */ + WarpX (); + + /** + * \brief + * This method creates a new instance of the WarpX class. + */ + static void MakeWarpX (); + // Singleton is used when the code is run from python static WarpX* m_instance; diff --git a/Source/WarpX.cpp b/Source/WarpX.cpp index a6e4f06a1..f5826fd93 100644 --- a/Source/WarpX.cpp +++ b/Source/WarpX.cpp @@ -232,11 +232,25 @@ bool WarpX::do_device_synchronize = false; WarpX* WarpX::m_instance = nullptr; +void WarpX::MakeWarpX () +{ + ParseGeometryInput(); + + ConvertLabParamsToBoost(); + ReadBCParams(); + +#ifdef WARPX_DIM_RZ + CheckGriddingForRZSpectral(); +#endif + + m_instance = new WarpX(); +} + WarpX& WarpX::GetInstance () { if (!m_instance) { - m_instance = new WarpX(); + MakeWarpX(); } return *m_instance; } @@ -244,14 +258,20 @@ WarpX::GetInstance () void WarpX::ResetInstance () { - delete m_instance; - m_instance = nullptr; + if (m_instance){ + delete m_instance; + m_instance = nullptr; + } } -WarpX::WarpX () +void +WarpX::Finalize() { - m_instance = this; + WarpX::ResetInstance(); +} +WarpX::WarpX () +{ ReadParameters(); BackwardCompatibility(); @@ -304,12 +324,6 @@ WarpX::WarpX () // Particle Boundary Buffer (i.e., scraped particles on boundary) m_particle_boundary_buffer = std::make_unique<ParticleBoundaryBuffer>(); - // Diagnostics - multi_diags = std::make_unique<MultiDiagnostics>(); - - /** create object for reduced diagnostics */ - reduced_diags = std::make_unique<MultiReducedDiags>(); - Efield_aux.resize(nlevs_max); Bfield_aux.resize(nlevs_max); diff --git a/Source/main.cpp b/Source/main.cpp index b889bb24a..3051539d8 100644 --- a/Source/main.cpp +++ b/Source/main.cpp @@ -11,7 +11,6 @@ #include "Initialization/WarpXAMReXInit.H" #include "Utils/WarpXProfilerWrapper.H" #include "Utils/WarpXrocfftUtil.H" -#include "Utils/WarpXUtil.H" #include <ablastr/parallelization/MPIInitHelpers.H> #include <ablastr/utils/timer/Timer.H> @@ -27,22 +26,13 @@ int main(int argc, char* argv[]) utils::rocfft::setup(); - ParseGeometryInput(); - - ConvertLabParamsToBoost(); - ReadBCParams(); - -#ifdef WARPX_DIM_RZ - CheckGriddingForRZSpectral(); -#endif - { WARPX_PROFILE_VAR("main()", pmain); auto timer = ablastr::utils::timer::Timer{}; timer.record_start_time(); - WarpX warpx; + auto& warpx = WarpX::GetInstance(); warpx.InitData(); @@ -58,6 +48,8 @@ int main(int argc, char* argv[]) } WARPX_PROFILE_VAR_STOP(pmain); + + WarpX::Finalize(); } utils::rocfft::cleanup(); |