aboutsummaryrefslogtreecommitdiff
path: root/Source/Python/WarpXWrappers.cpp
diff options
context:
space:
mode:
authorGravatar Roelof Groenewald <40245517+roelof-groenewald@users.noreply.github.com> 2022-01-21 13:25:03 -0800
committerGravatar GitHub <noreply@github.com> 2022-01-21 13:25:03 -0800
commit23ff60beeaaa08263aaa9680f82cab20803ce9e7 (patch)
tree7662f99230a789f21f529bed40fea2829efbc76a /Source/Python/WarpXWrappers.cpp
parenta3561eedf9fc0ac58c067b95258fb9b69e5cf07a (diff)
downloadWarpX-23ff60beeaaa08263aaa9680f82cab20803ce9e7.tar.gz
WarpX-23ff60beeaaa08263aaa9680f82cab20803ce9e7.tar.zst
WarpX-23ff60beeaaa08263aaa9680f82cab20803ce9e7.zip
Access species specific charge density from python (#2710)
* added python wrapper function to deposit a specific species density in rho_fp * added 1D ES input file with MCC that uses the charge deposition functionality * reset rho_fp[lev] before depositing * updated documentation * switch to using simulation.extension in Poisson solver * Apply suggestion from code review Co-authored-by: Phil Miller <phil.miller@intensecomputing.com> * suggested changes from code review * add comment explaining why a direct Poisson solver is used * removed direct solver in 1D example since it is actually slower than the MLMG solver * Apply suggestions from code review Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja> * added docstring for warpx_depositChargeDensity * fixed order of imports in new PICMI input file Co-authored-by: Phil Miller <phil.miller@intensecomputing.com> Co-authored-by: Axel Huebl <axel.huebl@plasma.ninja>
Diffstat (limited to 'Source/Python/WarpXWrappers.cpp')
-rw-r--r--Source/Python/WarpXWrappers.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/Source/Python/WarpXWrappers.cpp b/Source/Python/WarpXWrappers.cpp
index 7350bbbb6..061e80c6a 100644
--- a/Source/Python/WarpXWrappers.cpp
+++ b/Source/Python/WarpXWrappers.cpp
@@ -606,6 +606,37 @@ namespace
particle_buffers.clearParticles();
}
+ void warpx_depositChargeDensity (const char* char_species_name, int lev) {
+ // this function is used to deposit a given species' charge density
+ // in the rho_fp multifab which can then be accessed from python via
+ // pywarpx.fields.RhoFPWrapper()
+ WarpX& warpx = WarpX::GetInstance();
+ const auto & mypc = warpx.GetPartContainer();
+ const std::string species_name(char_species_name);
+ auto & myspc = mypc.GetParticleContainerFromName(species_name);
+ auto * rho_fp = warpx.get_pointer_rho_fp(lev);
+
+ if (rho_fp == nullptr) {
+ warpx.RecordWarning(
+ "WarpXWrappers", "rho_fp is not allocated", WarnPriority::low
+ );
+ return;
+ }
+
+ // reset rho before depositing
+ rho_fp->setVal(0.);
+
+ for (WarpXParIter pti(myspc, lev); pti.isValid(); ++pti)
+ {
+ const long np = pti.numParticles();
+ auto& wp = pti.GetAttribs(PIdx::w);
+ myspc.DepositCharge(pti, wp, nullptr, rho_fp, 0, 0, np, 0, lev, lev);
+ }
+#ifdef WARPX_DIM_RZ
+ warpx.ApplyInverseVolumeScalingToChargeDensity(rho_fp, lev);
+#endif
+ }
+
void warpx_ComputeDt () {
WarpX& warpx = WarpX::GetInstance();
warpx.ComputeDt ();