@@ -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
756815class AnalyticDistribution (
0 commit comments