aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Source/Initialization/PlasmaInjector.H2
-rw-r--r--Source/Initialization/PlasmaInjector.cpp6
-rw-r--r--Source/Initialization/WarpXInitData.cpp6
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp2
-rw-r--r--Source/Python/WarpXWrappers.cpp2
-rw-r--r--Source/WarpX.H22
-rw-r--r--Source/WarpX.cpp36
-rw-r--r--Source/main.cpp14
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();