55
66from ...algorithm_class import Algorithm
77from ...helpers import get_item
8- from ...named_options import AtomicSpecies
9- from ...unit_handling import Unitfull , ureg , wraps_ufunc
8+ from ...unit_handling import Unitfull
109from ..atomic_data import AtomicData
1110
1211
@@ -15,7 +14,7 @@ def calc_impurity_charge_state(
1514 average_electron_density : Unitfull ,
1615 average_electron_temp : Unitfull ,
1716 impurity_concentration : xr .DataArray ,
18- atomic_data : xr .DataArray ,
17+ atomic_data : AtomicData | xr .DataArray ,
1918) -> Unitfull :
2019 """Calculate the impurity charge state for each species in impurity_concentration.
2120
@@ -28,43 +27,15 @@ def calc_impurity_charge_state(
2827 Returns:
2928 :term:`impurity_charge_state`
3029 """
31- return _calc_impurity_charge_state (
32- average_electron_density , average_electron_temp , impurity_concentration .dim_species , get_item (atomic_data )
33- )
30+ atomic_data = get_item (atomic_data )
3431
32+ def calc_mean_z (impurity_concentration : xr .DataArray ) -> xr .DataArray :
33+ species = get_item (impurity_concentration .dim_species )
34+ interpolator = atomic_data .get_coronal_Z_interpolator (species )
35+ mean_z = interpolator .eval (electron_density = average_electron_density , electron_temp = average_electron_temp , allow_extrap = True )
3536
36- @wraps_ufunc (
37- return_units = dict (mean_charge_state = ureg .dimensionless ),
38- input_units = dict (
39- average_electron_density = ureg .m ** - 3 ,
40- average_electron_temp = ureg .eV ,
41- impurity_species = None ,
42- atomic_data = None ,
43- ),
44- pass_as_kwargs = ("atomic_data" ,),
45- )
46- def _calc_impurity_charge_state (
47- average_electron_density : float ,
48- average_electron_temp : float ,
49- impurity_species : AtomicSpecies ,
50- atomic_data : AtomicData ,
51- ) -> float :
52- """Calculate the impurity charge state of the specified impurity species.
37+ mean_z = np .minimum (mean_z , atomic_data .datasets [species ].atomic_number )
38+ mean_z = np .maximum (mean_z , 0.0 )
39+ return mean_z # type:ignore[no-any-return]
5340
54- Args:
55- average_electron_density: [m^-3] :term:`glossary link<average_electron_density>`
56- average_electron_temp: [eV] :term:`glossary link<average_electron_temp>`
57- impurity_species: [] :term:`glossary link<impurity_species>`
58- atomic_data: :term:`glossary link<atomic_data>`
59-
60- Returns:
61- :term:`impurity_charge_state`
62- """
63- interpolator = atomic_data .get_coronal_Z_interpolator (impurity_species )
64- interpolated_values = interpolator (electron_density = average_electron_density , electron_temp = average_electron_temp , allow_extrap = True )
65-
66- atomic_number = atomic_data .datasets [impurity_species ].atomic_number
67-
68- interpolated_values = np .minimum (interpolated_values , atomic_number )
69- interpolated_values = np .maximum (interpolated_values , 0.0 )
70- return interpolated_values # type:ignore[no-any-return]
41+ return impurity_concentration .groupby ("dim_species" ).map (calc_mean_z ).transpose (..., "dim_species" )
0 commit comments