diff options
author | 2023-06-27 14:20:07 -0700 | |
---|---|---|
committer | 2023-06-27 14:20:07 -0700 | |
commit | efd450ecc31dc651315c6350dd0104cba8e46c31 (patch) | |
tree | 092121c084d5515d2cc94b9e95821d81f5270ce1 /Source/Initialization/PlasmaInjector.cpp | |
parent | 61d7dc8412eb78b05a42a854085004caa47c35df (diff) | |
download | WarpX-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.cpp | 45 |
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 () { |