aboutsummaryrefslogtreecommitdiff
path: root/Source/Initialization/PlasmaInjector.cpp
diff options
context:
space:
mode:
authorGravatar Remi Lehe <remi.lehe@normalesup.org> 2023-06-27 14:20:07 -0700
committerGravatar GitHub <noreply@github.com> 2023-06-27 14:20:07 -0700
commitefd450ecc31dc651315c6350dd0104cba8e46c31 (patch)
tree092121c084d5515d2cc94b9e95821d81f5270ce1 /Source/Initialization/PlasmaInjector.cpp
parent61d7dc8412eb78b05a42a854085004caa47c35df (diff)
downloadWarpX-efd450ecc31dc651315c6350dd0104cba8e46c31.tar.gz
WarpX-efd450ecc31dc651315c6350dd0104cba8e46c31.tar.zst
WarpX-efd450ecc31dc651315c6350dd0104cba8e46c31.zip
Define new `InjectorFlux` object, and use it in `AddPlasmaFlux` (#4040)
* Create flux injector object * Call new flux injector in AddPlasmaFlux * Update syntax in tests * Also test the flux parser * Remove the use of `density_min` and `density_max` for flux injection * Update PICMI interface * Update documentation * Remove .cpp file
Diffstat (limited to 'Source/Initialization/PlasmaInjector.cpp')
-rw-r--r--Source/Initialization/PlasmaInjector.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/Source/Initialization/PlasmaInjector.cpp b/Source/Initialization/PlasmaInjector.cpp
index 22c72f580..865e531e7 100644
--- a/Source/Initialization/PlasmaInjector.cpp
+++ b/Source/Initialization/PlasmaInjector.cpp
@@ -342,7 +342,7 @@ PlasmaInjector::PlasmaInjector (int ispecies, const std::string& name)
(InjectorPositionRandomPlane*)nullptr,
xmin, xmax, ymin, ymax, zmin, zmax,
flux_normal_axis);
- parseDensity(pp_species_name);
+ parseFlux(pp_species_name);
parseMomentum(pp_species_name);
} else if (injection_style == "nuniformpercell") {
// Note that for RZ, three numbers are expected, r, theta, and z.
@@ -504,6 +504,16 @@ PlasmaInjector::PlasmaInjector (int ispecies, const std::string& name)
#endif
}
+ if (h_inj_flux) {
+#ifdef AMREX_USE_GPU
+ d_inj_flux = static_cast<InjectorFlux*>
+ (amrex::The_Arena()->alloc(sizeof(InjectorFlux)));
+ amrex::Gpu::htod_memcpy_async(d_inj_flux, h_inj_flux.get(), sizeof(InjectorFlux));
+#else
+ d_inj_flux = h_inj_flux.get();
+#endif
+ }
+
if (h_inj_mom) {
#ifdef AMREX_USE_GPU
d_inj_mom = static_cast<InjectorMomentum*>
@@ -569,6 +579,33 @@ void PlasmaInjector::parseDensity (const amrex::ParmParse& pp)
}
}
+// Depending on injection type at runtime, initialize inj_flux
+// so that inj_flux->getFlux calls
+// InjectorFlux[Constant or Parser or etc.].getFlux.
+void PlasmaInjector::parseFlux (const amrex::ParmParse& pp)
+{
+ // parse flux information
+ std::string flux_prof_s;
+ pp.get("flux_profile", flux_prof_s);
+ std::transform(flux_prof_s.begin(), flux_prof_s.end(),
+ flux_prof_s.begin(), ::tolower);
+ if (flux_prof_s == "constant") {
+ utils::parser::getWithParser(pp, "flux", flux);
+ // Construct InjectorFlux with InjectorFluxConstant.
+ h_inj_flux.reset(new InjectorFlux((InjectorFluxConstant*)nullptr, flux));
+ } else if (flux_prof_s == "parse_flux_function") {
+ utils::parser::Store_parserString(
+ pp, "flux_function(x,y,z,t)", str_flux_function);
+ // Construct InjectorFlux with InjectorFluxParser.
+ flux_parser = std::make_unique<amrex::Parser>(
+ utils::parser::makeParser(str_flux_function,{"x","y","z","t"}));
+ h_inj_flux.reset(new InjectorFlux((InjectorFluxParser*)nullptr,
+ flux_parser->compile<4>()));
+ } else {
+ StringParseAbortMessage("Flux profile type", flux_prof_s);
+ }
+}
+
// Depending on injection type at runtime, initialize inj_mom
// so that inj_mom->getMomentum calls
// InjectorMomentum[Constant or Gaussian or etc.].getMomentum.
@@ -731,6 +768,12 @@ PlasmaInjector::getInjectorDensity ()
return d_inj_rho;
}
+InjectorFlux*
+PlasmaInjector::getInjectorFlux ()
+{
+ return d_inj_flux;
+}
+
InjectorMomentum*
PlasmaInjector::getInjectorMomentum ()
{