Skip to content

Commit b573331

Browse files
committed
Tidy up mean charge state with new interface to radas
1 parent 4bd97da commit b573331

File tree

1 file changed

+11
-40
lines changed

1 file changed

+11
-40
lines changed

cfspopcon/formulas/impurities/impurity_charge_state.py

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55

66
from ...algorithm_class import Algorithm
77
from ...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
109
from ..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

Comments
 (0)