aboutsummaryrefslogtreecommitdiff
path: root/Source/Python/WarpXWrappers.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-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 ();