@@ -688,25 +688,42 @@ def setup_parse_momentum_functions(
688
688
)
689
689
690
690
691
- class UniformFluxDistribution (
692
- picmistandard .PICMI_UniformFluxDistribution , DensityDistributionBase
691
+ class UniformDistribution (
692
+ picmistandard .PICMI_UniformDistribution , DensityDistributionBase
693
693
):
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
+
694
710
def init (self , kw ):
695
711
self .inject_from_embedded_boundary = kw .pop (
696
712
"warpx_inject_from_embedded_boundary" , False
697
713
)
698
714
715
+ def initialize_flux_profile_func (self , species , density_scale , source_name ):
716
+ """Initialize the flux profile and flux function."""
717
+ pass
718
+
699
719
def distribution_initialize_inputs (
700
720
self , species_number , layout , species , density_scale , source_name
701
721
):
702
722
self .fill_in = False
703
723
self .set_mangle_dict ()
704
724
self .set_species_attributes (species , layout , source_name )
705
725
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 )
710
727
711
728
if not self .inject_from_embedded_boundary :
712
729
species .add_new_group_attr (
@@ -737,20 +754,62 @@ def distribution_initialize_inputs(
737
754
)
738
755
739
756
740
- class UniformDistribution (
741
- picmistandard .PICMI_UniformDistribution , DensityDistributionBase
757
+ class AnalyticFluxDistribution (
758
+ picmistandard .PICMI_AnalyticFluxDistribution ,
759
+ FluxDistributionBase ,
760
+ DensityDistributionBase ,
742
761
):
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
+ ----------
748
765
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" )
752
776
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 )
754
813
755
814
756
815
class AnalyticDistribution (
0 commit comments