aboutsummaryrefslogtreecommitdiff
path: root/Examples/Modules
diff options
context:
space:
mode:
Diffstat (limited to 'Examples/Modules')
-rw-r--r--Examples/Modules/ParticleBoundaryScrape/PICMI_inputs_scrape.py131
-rwxr-xr-xExamples/Modules/ParticleBoundaryScrape/analysis_scrape.py13
2 files changed, 142 insertions, 2 deletions
diff --git a/Examples/Modules/ParticleBoundaryScrape/PICMI_inputs_scrape.py b/Examples/Modules/ParticleBoundaryScrape/PICMI_inputs_scrape.py
new file mode 100644
index 000000000..79cf01a57
--- /dev/null
+++ b/Examples/Modules/ParticleBoundaryScrape/PICMI_inputs_scrape.py
@@ -0,0 +1,131 @@
+# --- Input file to test the particle scraper and the Python wrappers
+# --- to access the buffer of scraped particles.
+
+from pywarpx import picmi
+
+##########################
+# numerics parameters
+##########################
+
+# --- Number of time steps
+max_steps = 60
+diagnostic_intervals = 20
+
+# --- Grid
+nx = 64
+ny = 64
+nz = 128
+
+cfl = 0.99
+
+xmin = -125e-6
+ymin = -125e-6
+zmin = -149e-6
+xmax = 125e-6
+ymax = 125e-6
+zmax = 1e-6
+
+##########################
+# physics components
+##########################
+
+uniform_plasma_elec = picmi.UniformDistribution(
+ density = 1e23, # number of electrons per m^3
+ lower_bound = [-1e-5, -1e-5, -149e-6],
+ upper_bound = [1e-5, 1e-5, -129e-6],
+ directed_velocity = [0., 0., 2000.*picmi.constants.c] # uth the std of the (unitless) momentum
+)
+
+electrons = picmi.Species(
+ particle_type='electron', name='electrons',
+ initial_distribution=uniform_plasma_elec,
+ warpx_save_particles_at_xhi=1, warpx_save_particles_at_eb=1
+)
+
+##########################
+# numerics components
+##########################
+
+grid = picmi.Cartesian3DGrid(
+ number_of_cells = [nx, ny, nz],
+ lower_bound = [xmin, ymin, zmin],
+ upper_bound = [xmax, ymax, zmax],
+ lower_boundary_conditions=['none', 'none', 'none'],
+ upper_boundary_conditions=['none', 'none', 'none'],
+ lower_boundary_conditions_particles=['open', 'open', 'open'],
+ upper_boundary_conditions_particles=['open', 'open', 'open'],
+ warpx_max_grid_size = 128
+)
+
+solver = picmi.ElectromagneticSolver(
+ grid=grid, cfl=cfl
+)
+
+embedded_boundary = picmi.EmbeddedBoundary(
+ implicit_function="-max(max(max(x-12.5e-6,-12.5e-6-x),max(y-12.5e-6,-12.5e-6-y)),max(z-(-6.15e-5),-8.65e-5-z))"
+)
+
+##########################
+# diagnostics
+##########################
+
+field_diag = picmi.FieldDiagnostic(
+ name = 'diag1',
+ grid = grid,
+ period = diagnostic_intervals,
+ data_list = ['Ex', 'Ey', 'Ez', 'Bx', 'By', 'Bz'],
+ write_dir = '.',
+ warpx_file_prefix = 'Python_particle_scrape_plt'
+)
+
+##########################
+# simulation setup
+##########################
+
+sim = picmi.Simulation(
+ solver = solver,
+ max_steps = max_steps,
+ warpx_embedded_boundary=embedded_boundary,
+ verbose=True
+)
+
+sim.add_species(
+ electrons,
+ layout = picmi.GriddedLayout(
+ n_macroparticle_per_cell=[1, 1, 1], grid=grid
+ )
+)
+
+sim.add_diagnostic(field_diag)
+
+##########################
+# simulation run
+##########################
+
+# sim.write_input_file(file_name = 'inputs_from_PICMI')
+sim.step(max_steps)
+
+################################################
+# check that the wrappers to access the particle
+# buffer functions as intended
+################################################
+
+from pywarpx import _libwarpx
+
+n = _libwarpx.get_particle_boundary_buffer_size("electrons", 'eb')
+print("Number of electrons in buffer:", n)
+assert n == 612
+
+scraped_steps = _libwarpx.get_particle_boundary_buffer("electrons", 'eb', 'step_scraped', 0)
+for arr in scraped_steps:
+ assert all(arr > 40)
+
+weights = _libwarpx.get_particle_boundary_buffer("electrons", 'eb', 'w', 0)
+assert sum(len(arr) for arr in weights) == 612
+
+# clear the particle buffer
+_libwarpx.libwarpx.warpx_clearParticleBoundaryBuffer()
+# confirm that the buffer was cleared
+n = _libwarpx.get_particle_boundary_buffer_size("electrons", 'eb')
+print("Number of electrons in buffer:", n)
+assert n == 0
diff --git a/Examples/Modules/ParticleBoundaryScrape/analysis_scrape.py b/Examples/Modules/ParticleBoundaryScrape/analysis_scrape.py
index b970c4933..c325495db 100755
--- a/Examples/Modules/ParticleBoundaryScrape/analysis_scrape.py
+++ b/Examples/Modules/ParticleBoundaryScrape/analysis_scrape.py
@@ -1,6 +1,7 @@
#! /usr/bin/env python
import yt
+from pathlib import Path
# This test shoots a beam of electrons at cubic embedded boundary geometry
# At time step 40, none of the particles have hit the boundary yet. At time
@@ -9,11 +10,19 @@ import yt
# the problem domain yet.
# all particles are still there
-ds40 = yt.load("particle_scrape_plt00040")
+if Path("particle_scrape_plt00040").is_dir():
+ filename = "particle_scrape_plt00040"
+else:
+ filename = "Python_particle_scrape_plt00040"
+ds40 = yt.load(filename)
np40 = ds40.index.particle_headers['electrons'].num_particles
assert(np40 == 612)
# all particles have been removed
-ds60 = yt.load("particle_scrape_plt00060")
+if Path("particle_scrape_plt00060").is_dir():
+ filename = "particle_scrape_plt00060"
+else:
+ filename = "Python_particle_scrape_plt00060"
+ds60 = yt.load(filename)
np60 = ds60.index.particle_headers['electrons'].num_particles
assert(np60 == 0)