diff --git a/examples/single_model_evaluation.ex.py b/examples/single_model_evaluation.ex.py index 18fa0506a1..c873a99d28 100644 --- a/examples/single_model_evaluation.ex.py +++ b/examples/single_model_evaluation.ex.py @@ -58,8 +58,7 @@ def print_values(): """Function to print values of some variables""" print( - "W frac = " - f"{single_run.data.impurity_radiation.f_nd_impurity_electron_array[13]:.3e}" + f"W frac = {single_run.data.impurity_radiation.f_nd_impurity_electrons[13]:.3e}" ) print(f"p_plasma_rad_mw = {single_run.data.physics.p_plasma_rad_mw:.3e}") print( @@ -74,7 +73,7 @@ def print_values(): # the divertor power. # %% -single_run.data.impurity_radiation.f_nd_impurity_electron_array[13] = 5.0e-5 +single_run.data.impurity_radiation.f_nd_impurity_electrons[13] = 5.0e-5 single_run.models.physics.run() print_values() @@ -101,7 +100,7 @@ def run_impurities(w_imp_fracs): # Loop over W impurity values, evaluate model and store responses at each point for i, imp_frac in enumerate(w_imp_fracs): # Set W impurity fraction, then run physics model - single_run.data.impurity_radiation.f_nd_impurity_electron_array[13] = imp_frac + single_run.data.impurity_radiation.f_nd_impurity_electrons[13] = imp_frac single_run.models.physics.run() # Evaluate constraint equation 15 (L-H threshold constraint) diff --git a/process/core/init.py b/process/core/init.py index 4b5b537029..16165d9ac6 100644 --- a/process/core/init.py +++ b/process/core/init.py @@ -23,7 +23,6 @@ InboardBlanketConfiguration, TFCSRadialConfiguration, ) -from process.data_structure.impurity_radiation_variables import N_IMPURITIES from process.data_structure.numerics import FiguresOfMerit, PROCESSRunMode from process.data_structure.pfcoil_variables import PFConductorModel from process.data_structure.physics_variables import ( @@ -409,12 +408,6 @@ def check_process(inputs, data): # noqa: ARG001 " or set to the default value 0.1D0." ) - # Impurity fractions - for imp in range(N_IMPURITIES): - data.impurity_radiation.f_nd_impurity_electron_array[imp] = ( - data.impurity_radiation.f_nd_impurity_electrons[imp] - ) - # Stop the run if j_tf_coil_full_area is used as an optimisation variable # As the current density is now calculated from b_plasma_toroidal_on_axis # without constraint 10 diff --git a/process/core/scan.py b/process/core/scan.py index 436416368c..99dba07e61 100644 --- a/process/core/scan.py +++ b/process/core/scan.py @@ -105,8 +105,6 @@ def set(self, data: DataStructure, sweep_val: float): if "__" in self.name: name, index = self.name.split("__") getattr(var_area, name)[int(index) - 1] = sweep_val - if name == "f_nd_impurity_electrons": - var_area.f_nd_impurity_electron_array[int(index - 1)] = sweep_val else: setattr(var_area, self.name, sweep_val) name = self.name diff --git a/process/core/solver/iteration_variables.py b/process/core/solver/iteration_variables.py index 5b18d680a6..09a8a7fb59 100644 --- a/process/core/solver/iteration_variables.py +++ b/process/core/solver/iteration_variables.py @@ -108,7 +108,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=2, ), 126: IterationVariable( @@ -116,7 +116,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=3, ), 127: IterationVariable( @@ -124,7 +124,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=4, ), 128: IterationVariable( @@ -132,7 +132,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=5, ), 129: IterationVariable( @@ -140,7 +140,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=6, ), 130: IterationVariable( @@ -148,7 +148,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=7, ), 131: IterationVariable( @@ -156,7 +156,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=8, ), 132: IterationVariable( @@ -164,7 +164,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=9, ), 133: IterationVariable( @@ -172,7 +172,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=10, ), 134: IterationVariable( @@ -180,7 +180,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=11, ), 135: IterationVariable( @@ -188,7 +188,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=12, ), 136: IterationVariable( @@ -196,7 +196,7 @@ class IterationVariable: "impurity_radiation", 1e-8, 0.01, - target_name="f_nd_impurity_electron_array", + target_name="f_nd_impurity_electrons", array_index=13, ), 138: IterationVariable( diff --git a/process/data_structure/impurity_radiation_variables.py b/process/data_structure/impurity_radiation_variables.py index d1992a0145..674b684092 100644 --- a/process/data_structure/impurity_radiation_variables.py +++ b/process/data_structure/impurity_radiation_variables.py @@ -104,11 +104,6 @@ class ImpurityRadiationData: ) """Full ion charge of impurity species""" - impurity_arr_label: list[str] = field( - default_factory=lambda: np.full(N_IMPURITIES, " ") - ) - """Array of impurity labels for internal use""" - impurity_arr_z: list[float] = field(default_factory=lambda: np.zeros(N_IMPURITIES)) m_impurity_amu_array: list[float] = field( @@ -116,11 +111,6 @@ class ImpurityRadiationData: ) """2D array of impurity atomic masses in Atomic Mass Units (amu)""" - f_nd_impurity_electron_array: list[float] = field( - default_factory=lambda: np.zeros(N_IMPURITIES) - ) - """2D array of impurity relative densities (n_imp/n_e)""" - impurity_arr_len_tab: list[int] = field( default_factory=lambda: np.full(N_IMPURITIES, 0) ) diff --git a/process/models/physics/impurity_radiation.py b/process/models/physics/impurity_radiation.py index b89e0a746d..767a3f57a7 100644 --- a/process/models/physics/impurity_radiation.py +++ b/process/models/physics/impurity_radiation.py @@ -54,30 +54,22 @@ def initialise_imprad(data: DataStructure): """ errorflag = 0 - f_nd_species_electron = 1.0e0 - # Hydrogen - init_imp_element( n_species_index=1, name_label=data.impurity_radiation.imp_label[0], z=1, m_species_amu=constants.M_PROTIUM_AMU, # 1.00782503223 1H - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, ) - - f_nd_species_electron = 0.0e0 - # Helium init_imp_element( n_species_index=2, name_label=data.impurity_radiation.imp_label[1], z=2, m_species_amu=constants.M_HELIUM_AMU, # 4.002602 (3He,4He) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -89,7 +81,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[2], z=4, m_species_amu=constants.M_BERYLLIUM_AMU, # 9.0121831 9Be - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -101,7 +92,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[3], z=6, m_species_amu=constants.M_CARBON_AMU, # 12.0096, (12C,13C,14C) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -113,7 +103,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[4], z=7, m_species_amu=constants.M_NITROGEN_AMU, # 14.00643, (14N,15N) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -125,7 +114,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[5], z=8, m_species_amu=constants.M_OXYGEN_AMU, # 15.99903, (16O,17O,18O) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -137,7 +125,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[6], z=10, m_species_amu=constants.M_NEON_AMU, # 20.1797 (20Ne,21Ne,22Ne) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -149,7 +136,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[7], z=14, m_species_amu=constants.M_SILICON_AMU, # 28.084 (28Si,29Si,30Si) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -161,7 +147,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[8], z=18, m_species_amu=constants.M_ARGON_AMU, # 39.948 (40Ar,36Ar,38Ar) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -173,7 +158,6 @@ def initialise_imprad(data: DataStructure): name_label=data.impurity_radiation.imp_label[9], z=26, m_species_amu=constants.M_IRON_AMU, # 55.845 (56Fe,54Fe,57Fe,58Fe) Average mass - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -186,7 +170,6 @@ def initialise_imprad(data: DataStructure): z=28, # 58.6934 (58Ni,60Ni,61Ni,62Ni,64Ni) Average mass m_species_amu=constants.M_NICKEL_AMU, - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -199,7 +182,6 @@ def initialise_imprad(data: DataStructure): z=36, # 83.798 (84Kr,86Kr,82Kr,80Kr,78Kr) Average mass m_species_amu=constants.M_KRYPTON_AMU, - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -212,7 +194,6 @@ def initialise_imprad(data: DataStructure): z=54, # 131.293 (132Xe,129Xe,131Xe,134Xe,136Xe) Average mass m_species_amu=constants.M_XENON_AMU, - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -225,7 +206,6 @@ def initialise_imprad(data: DataStructure): z=74, # 183.84 (184W,186W,182W,183W,180W) Average mass m_species_amu=constants.M_TUNGSTEN_AMU, - f_nd_species_electron=f_nd_species_electron, len_tab=N_IMPURITIY_LOSS_FUNCTION_POINTS, error=errorflag, data=data, @@ -291,7 +271,6 @@ def init_imp_element( name_label: str, z: int, m_species_amu: float, - f_nd_species_electron: float, len_tab: int, error: int, data: DataStructure, @@ -312,8 +291,6 @@ def init_imp_element( Species charge number m_species_amu : float Species atomic mass [amu] - f_nd_species_electron : float - Number density / electron density len_tab : int Length of temperature and Lz tables error : int @@ -333,19 +310,15 @@ def init_imp_element( if error == 1: return - if n_species_index > len(data.impurity_radiation.impurity_arr_label): + if n_species_index > len(data.impurity_radiation.imp_label): raise ProcessValueError( "Illegal impurity number", number=n_species_index, - max=len(data.impurity_radiation.impurity_arr_label), + max=len(data.impurity_radiation.imp_label), ) - data.impurity_radiation.impurity_arr_label[n_species_index - 1] = name_label data.impurity_radiation.impurity_arr_z[n_species_index - 1] = z data.impurity_radiation.m_impurity_amu_array[n_species_index - 1] = m_species_amu - data.impurity_radiation.f_nd_impurity_electron_array[n_species_index - 1] = ( - f_nd_species_electron - ) data.impurity_radiation.impurity_arr_len_tab[n_species_index - 1] = len_tab if len_tab > N_IMPURITIY_LOSS_FUNCTION_POINTS: @@ -598,9 +571,9 @@ def calculate_impurity_radiation_power_density( ) # W/m³ = nᵢ * nₑ * L(Z, Tₑ) - # nᵢ = f_nd_species_electron * nₑ + # nᵢ = fᵢ * nₑ return ( - data.impurity_radiation.f_nd_impurity_electron_array[imp_element_index] + data.impurity_radiation.f_nd_impurity_electrons[imp_element_index] * nd_electron_profile * nd_electron_profile * power_loss_function @@ -624,20 +597,13 @@ def element2index(element: str, data: DataStructure) -> int: Raises ------ ProcessValueError - If the element is not found in impurity_arr_label + If the element is not found in imp_label """ try: - return ( - data.impurity_radiation.impurity_arr_label - .astype(str) - .tolist() - .index(element) - ) + return data.impurity_radiation.imp_label.astype(str).tolist().index(element) except ValueError as e: - raise ProcessValueError( - f"Element {element} is not found in impurity_arr_label" - ) from e + raise ProcessValueError(f"Element {element} is not found in imp_label") from e class ImpurityRadiation: @@ -659,7 +625,7 @@ def __init__(self, plasma_profile: PlasmaProfile, data_structure: DataStructure) self.data = data_structure self.plasma_profile = plasma_profile self.imp = np.nonzero( - self.data.impurity_radiation.f_nd_impurity_electron_array > 1.0e-30 + self.data.impurity_radiation.f_nd_impurity_electrons > 1.0e-30 )[0] self.pden_impurity_radiation_profile = np.zeros( @@ -712,7 +678,7 @@ def calculate_species_radiation_powers( p_plasma_rad_impurities_mw = 0.0 for index, label in enumerate(self.data.impurity_radiation.imp_label): pden_vol_avg_mw = 0.0 - if self.data.impurity_radiation.f_nd_impurity_electron_array[index] > 1e-30: + if self.data.impurity_radiation.f_nd_impurity_electrons[index] > 1e-30: pden_profile = calculate_impurity_radiation_power_density( imp_element_index=index, nd_electron_profile=self.plasma_profile.neprofile.profile_y, diff --git a/process/models/physics/physics.py b/process/models/physics/physics.py index 454a5824d1..3e2f6ce6cd 100644 --- a/process/models/physics/physics.py +++ b/process/models/physics/physics.py @@ -1134,7 +1134,7 @@ def run(self): " is at least notable" ) - impurity_frac = self.data.impurity_radiation.f_nd_impurity_electron_array[ + impurity_frac = self.data.impurity_radiation.f_nd_impurity_electrons[ self.data.reinke.impvardiv - 1 ] po.write( @@ -1263,7 +1263,7 @@ def plasma_composition(self): np.array([self.data.physics.temp_plasma_electron_vol_avg_kev]), self.data, ).squeeze() * ( - self.data.impurity_radiation.f_nd_impurity_electron_array[imp] + self.data.impurity_radiation.f_nd_impurity_electrons[imp] * self.data.physics.nd_plasma_electrons_vol_avg ) @@ -1300,7 +1300,7 @@ def plasma_composition(self): # Set hydrogen and helium relative impurity densities for # radiation calculations - self.data.impurity_radiation.f_nd_impurity_electron_array[ + self.data.impurity_radiation.f_nd_impurity_electrons[ impurity_radiation.element2index("H_", self.data) ] = ( self.data.physics.nd_plasma_protons_vol_avg @@ -1312,7 +1312,7 @@ def plasma_composition(self): + self.data.physics.nd_beam_ions ) / self.data.physics.nd_plasma_electrons_vol_avg - self.data.impurity_radiation.f_nd_impurity_electron_array[ + self.data.impurity_radiation.f_nd_impurity_electrons[ impurity_radiation.element2index("He", self.data) ] = ( self.data.physics.f_plasma_fuel_helium3 @@ -1328,7 +1328,7 @@ def plasma_composition(self): for imp in range(N_IMPURITIES): if self.data.impurity_radiation.impurity_arr_z[imp] > 2: self.data.physics.nd_plasma_impurities_vol_avg += ( - self.data.impurity_radiation.f_nd_impurity_electron_array[imp] + self.data.impurity_radiation.f_nd_impurity_electrons[imp] * self.data.physics.nd_plasma_electrons_vol_avg ) @@ -1348,20 +1348,20 @@ def plasma_composition(self): # Set some relative impurity density variables # for the benefit of other routines self.data.physics.f_nd_plasma_carbon_electron = ( - self.data.impurity_radiation.f_nd_impurity_electron_array[ + self.data.impurity_radiation.f_nd_impurity_electrons[ impurity_radiation.element2index("C_", self.data) ] ) self.data.physics.f_nd_plasma_oxygen_electron = ( - self.data.impurity_radiation.f_nd_impurity_electron_array[ + self.data.impurity_radiation.f_nd_impurity_electrons[ impurity_radiation.element2index("O_", self.data) ] ) self.data.physics.f_nd_plasma_iron_argon_electron = ( - self.data.impurity_radiation.f_nd_impurity_electron_array[ + self.data.impurity_radiation.f_nd_impurity_electrons[ impurity_radiation.element2index("Fe", self.data) ] - + self.data.impurity_radiation.f_nd_impurity_electron_array[ + + self.data.impurity_radiation.f_nd_impurity_electrons[ impurity_radiation.element2index("Ar", self.data) ] ) @@ -1374,7 +1374,7 @@ def plasma_composition(self): self.data.physics.n_charge_plasma_effective_vol_avg = 0.0 for imp in range(N_IMPURITIES): self.data.physics.n_charge_plasma_effective_vol_avg += ( - self.data.impurity_radiation.f_nd_impurity_electron_array[imp] + self.data.impurity_radiation.f_nd_impurity_electrons[imp] * impurity_radiation.calculate_average_charge_at_temp( imp, np.array([self.data.physics.temp_plasma_electron_vol_avg_kev]), @@ -1444,7 +1444,7 @@ def plasma_composition(self): if self.data.impurity_radiation.impurity_arr_z[imp] > 2: self.data.physics.m_ions_total_amu += ( self.data.physics.nd_plasma_electrons_vol_avg - * self.data.impurity_radiation.f_nd_impurity_electron_array[imp] + * self.data.impurity_radiation.f_nd_impurity_electrons[imp] * self.data.impurity_radiation.m_impurity_amu_array[imp] ) @@ -1493,7 +1493,7 @@ def plasma_composition(self): for imp in range(N_IMPURITIES): if self.data.impurity_radiation.impurity_arr_z[imp] > 2: self.data.physics.n_charge_plasma_effective_mass_weighted_vol_avg += ( - self.data.impurity_radiation.f_nd_impurity_electron_array[imp] + self.data.impurity_radiation.f_nd_impurity_electrons[imp] * impurity_radiation.calculate_average_charge_at_temp( imp, np.array([self.data.physics.temp_plasma_electron_vol_avg_kev]), @@ -1760,7 +1760,7 @@ def calculate_effective_charge_ionisation_profiles(self): zeff_profile[i] = 0.0 for imp in range(N_IMPURITIES): zeff_profile[i] += ( - self.data.impurity_radiation.f_nd_impurity_electron_array[imp] + self.data.impurity_radiation.f_nd_impurity_electrons[imp] * impurity_radiation.calculate_average_charge_at_temp( imp, np.array([self.plasma_profile.teprofile.profile_y[i]]), @@ -3154,16 +3154,8 @@ def output_temperature_density_profile_info(self) -> None: po.oblnkl(self.outfile) for imp in range(N_IMPURITIES): - # MDK Update f_nd_impurity_electrons, as this will make the ITV output - # work correctly. - self.data.impurity_radiation.f_nd_impurity_electrons[imp] = ( - self.data.impurity_radiation.f_nd_impurity_electron_array[imp] - ) str1 = ( - self.data.impurity_radiation - .impurity_arr_label[imp] - .item() - .replace("_", "") + self.data.impurity_radiation.imp_label[imp].item().replace("_", "") + " concentration" ) str2 = f"(f_nd_impurity_electrons({imp + 1:02}))" diff --git a/tests/unit/models/physics/test_physics.py b/tests/unit/models/physics/test_physics.py index ecb59f8792..30e4a0cf29 100644 --- a/tests/unit/models/physics/test_physics.py +++ b/tests/unit/models/physics/test_physics.py @@ -1233,7 +1233,7 @@ def test_conhas(physics): class PlasmaCompositionParam(NamedTuple): f_beam_tritium: Any = None - f_nd_impurity_electron_array: Any = None + f_nd_impurity_electrons: Any = None impurity_arr_z: Any = None @@ -1337,7 +1337,7 @@ class PlasmaCompositionParam(NamedTuple): [ PlasmaCompositionParam( f_beam_tritium=9.9999999999999995e-07, - f_nd_impurity_electron_array=np.array([ + f_nd_impurity_electrons=np.array([ 0.90000000000000002, 0.10000000000000001, 0, @@ -1449,7 +1449,7 @@ class PlasmaCompositionParam(NamedTuple): ), PlasmaCompositionParam( f_beam_tritium=9.9999999999999995e-07, - f_nd_impurity_electron_array=np.array([ + f_nd_impurity_electrons=np.array([ 0.78128535, 0.10000000000000001, 0, @@ -1576,7 +1576,7 @@ def test_plasma_composition(plasmacompositionparam, monkeypatch, physics): plasmacompositionparam.f_beam_tritium, ) for field in [ - "f_nd_impurity_electron_array", + "f_nd_impurity_electrons", "impurity_arr_z", "m_impurity_amu_array", ]: @@ -1625,7 +1625,7 @@ def test_plasma_composition(plasmacompositionparam, monkeypatch, physics): physics.plasma_composition() - assert physics.data.impurity_radiation.f_nd_impurity_electron_array == pytest.approx( + assert physics.data.impurity_radiation.f_nd_impurity_electrons == pytest.approx( plasmacompositionparam.expected_impurity_arr_frac )