Skip to content

Commit 5bc4790

Browse files
oshapovalpre-commit-ci[bot]dpgrote
authored
Added AnalyticFluxDistribution class (#5422)
Added an AnalyticFluxDistribution class with a parsed `flux_expression`. Depends on picmi-standard/picmi#121 --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: David Grote <grote1@llnl.gov>
1 parent f68415a commit 5bc4790

File tree

6 files changed

+84
-21
lines changed

6 files changed

+84
-21
lines changed

Docs/requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ openpmd-viewer # for checksumAPI
1313

1414
# PICMI API docs
1515
# note: keep in sync with version in ../requirements.txt
16-
picmistandard==0.31.0
16+
picmistandard==0.33.0
1717
# for development against an unreleased PICMI version, use:
1818
# picmistandard @ git+https://github.com/picmi-standard/picmi.git#subdirectory=PICMI_Python
1919

Docs/source/usage/python.rst

+4
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,10 @@ Particle distributions can be used for to initialize particles in a particle spe
146146

147147
.. autoclass:: pywarpx.picmi.AnalyticDistribution
148148

149+
.. autoclass:: pywarpx.picmi.UniformFluxDistribution
150+
151+
.. autoclass:: pywarpx.picmi.AnalyticFluxDistribution
152+
149153
.. autoclass:: pywarpx.picmi.ParticleListDistribution
150154

151155
Particle layouts determine how to microscopically place macro particles in a grid cell.

Python/pywarpx/picmi.py

+76-17
Original file line numberDiff line numberDiff line change
@@ -688,25 +688,42 @@ def setup_parse_momentum_functions(
688688
)
689689

690690

691-
class UniformFluxDistribution(
692-
picmistandard.PICMI_UniformFluxDistribution, DensityDistributionBase
691+
class UniformDistribution(
692+
picmistandard.PICMI_UniformDistribution, DensityDistributionBase
693693
):
694+
def distribution_initialize_inputs(
695+
self, species_number, layout, species, density_scale, source_name
696+
):
697+
self.set_mangle_dict()
698+
self.set_species_attributes(species, layout, source_name)
699+
700+
# --- Only constant density is supported by this class
701+
species.add_new_group_attr(source_name, "profile", "constant")
702+
species.add_new_group_attr(source_name, "density", self.density)
703+
if density_scale is not None:
704+
species.add_new_group_attr(source_name, "density", density_scale)
705+
706+
707+
class FluxDistributionBase(object):
708+
"""This is a base class for both uniform and analytic flux distributions."""
709+
694710
def init(self, kw):
695711
self.inject_from_embedded_boundary = kw.pop(
696712
"warpx_inject_from_embedded_boundary", False
697713
)
698714

715+
def initialize_flux_profile_func(self, species, density_scale, source_name):
716+
"""Initialize the flux profile and flux function."""
717+
pass
718+
699719
def distribution_initialize_inputs(
700720
self, species_number, layout, species, density_scale, source_name
701721
):
702722
self.fill_in = False
703723
self.set_mangle_dict()
704724
self.set_species_attributes(species, layout, source_name)
705725

706-
species.add_new_group_attr(source_name, "flux_profile", "constant")
707-
species.add_new_group_attr(source_name, "flux", self.flux)
708-
if density_scale is not None:
709-
species.add_new_group_attr(source_name, "flux", density_scale)
726+
self.initialize_flux_profile_func(species, density_scale, source_name)
710727

711728
if not self.inject_from_embedded_boundary:
712729
species.add_new_group_attr(
@@ -737,20 +754,62 @@ def distribution_initialize_inputs(
737754
)
738755

739756

740-
class UniformDistribution(
741-
picmistandard.PICMI_UniformDistribution, DensityDistributionBase
757+
class AnalyticFluxDistribution(
758+
picmistandard.PICMI_AnalyticFluxDistribution,
759+
FluxDistributionBase,
760+
DensityDistributionBase,
742761
):
743-
def distribution_initialize_inputs(
744-
self, species_number, layout, species, density_scale, source_name
745-
):
746-
self.set_mangle_dict()
747-
self.set_species_attributes(species, layout, source_name)
762+
"""
763+
Parameters
764+
----------
748765
749-
# --- Only constant density is supported by this class
750-
species.add_new_group_attr(source_name, "profile", "constant")
751-
species.add_new_group_attr(source_name, "density", self.density)
766+
warpx_inject_from_embedded_boundary: bool
767+
When true, the flux is injected from the embedded boundaries instead
768+
of a plane.
769+
"""
770+
771+
def init(self, kw):
772+
FluxDistributionBase.init(self, kw)
773+
774+
def initialize_flux_profile_func(self, species, density_scale, source_name):
775+
species.add_new_group_attr(source_name, "flux_profile", "parse_flux_function")
752776
if density_scale is not None:
753-
species.add_new_group_attr(source_name, "density", density_scale)
777+
species.add_new_group_attr(source_name, "flux", density_scale)
778+
expression = pywarpx.my_constants.mangle_expression(self.flux, self.mangle_dict)
779+
if density_scale is None:
780+
species.add_new_group_attr(
781+
source_name, "flux_function(x,y,z,t)", expression
782+
)
783+
else:
784+
species.add_new_group_attr(
785+
source_name,
786+
"flux_function(x,y,z,t)",
787+
"{}*({})".format(density_scale, expression),
788+
)
789+
790+
791+
class UniformFluxDistribution(
792+
picmistandard.PICMI_UniformFluxDistribution,
793+
FluxDistributionBase,
794+
DensityDistributionBase,
795+
):
796+
"""
797+
Parameters
798+
----------
799+
800+
warpx_inject_from_embedded_boundary: bool
801+
When true, the flux is injected from the embedded boundaries instead
802+
of a plane.
803+
"""
804+
805+
def init(self, kw):
806+
FluxDistributionBase.init(self, kw)
807+
808+
def initialize_flux_profile_func(self, species, density_scale, source_name):
809+
species.add_new_group_attr(source_name, "flux_profile", "constant")
810+
species.add_new_group_attr(source_name, "flux", self.flux)
811+
if density_scale is not None:
812+
species.add_new_group_attr(source_name, "flux", density_scale)
754813

755814

756815
class AnalyticDistribution(

Python/setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
package_dir={"pywarpx": "pywarpx"},
7171
description="""Wrapper of WarpX""",
7272
package_data=package_data,
73-
install_requires=["numpy", "picmistandard==0.31.0", "periodictable"],
73+
install_requires=["numpy", "picmistandard==0.33.0", "periodictable"],
7474
python_requires=">=3.8",
7575
zip_safe=False,
7676
)

Tools/machines/karolina-it4i/install_dependencies.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ python -m pip install --user --upgrade matplotlib
5353
#python -m pip install --user --upgrade yt
5454

5555
# install or update WarpX dependencies
56-
python -m pip install --user --upgrade picmistandard==0.31.0
56+
python -m pip install --user --upgrade picmistandard==0.33.0
5757
python -m pip install --user --upgrade lasy
5858

5959
# optional: for optimas (based on libEnsemble & ax->botorch->gpytorch->pytorch)

requirements.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ periodictable~=1.5
44

55
# PICMI
66
# note: don't forget to update the version in Docs/requirements.txt, too
7-
picmistandard==0.31.0
7+
picmistandard==0.33.0
88
# for development against an unreleased PICMI version, use:
99
#picmistandard @ git+https://github.com/picmi-standard/picmi.git#subdirectory=PICMI_Python
1010

0 commit comments

Comments
 (0)