diff --git a/process/core/init.py b/process/core/init.py index 69e878e2e..9b81fbfd5 100644 --- a/process/core/init.py +++ b/process/core/init.py @@ -46,7 +46,6 @@ ) from process.data_structure.pulse_variables import init_pulse_variables from process.data_structure.rebco_variables import init_rebco_variables -from process.data_structure.reinke_variables import init_reinke_variables from process.data_structure.scan_variables import init_scan_variables from process.data_structure.stellarator_variables import init_stellarator_variables from process.data_structure.superconducting_tf_coil_variables import ( @@ -287,7 +286,6 @@ def init_all_module_vars(): init_constraint_variables() init_pulse_variables() init_rebco_variables() - init_reinke_variables() init_dcll_module() init_power_variables() init_neoclassics_variables() diff --git a/process/core/input.py b/process/core/input.py index 745533ee0..83de8cb5e 100644 --- a/process/core/input.py +++ b/process/core/input.py @@ -782,7 +782,7 @@ def __post_init__(self): "fwdr": InputVariable(data_structure.ife_variables, float, range=(0.0, 10.0)), "fwdzl": InputVariable(data_structure.ife_variables, float, range=(0.0, 10.0)), "fwdzu": InputVariable(data_structure.ife_variables, float, range=(0.0, 10.0)), - "fzactual": InputVariable(data_structure.reinke_variables, float, range=(0.0, 1.0)), + "fzactual": InputVariable("reinke", float, range=(0.0, 1.0)), "eta_cd_norm_ecrh": InputVariable( data_structure.current_drive_variables, float, range=(0.0, 1.0) ), @@ -908,7 +908,7 @@ def __post_init__(self): "len_tf_bus": InputVariable( data_structure.tfcoil_variables, float, range=(0.01, 1000.0) ), - "lhat": InputVariable(data_structure.reinke_variables, float, range=(1.0, 15.0)), + "lhat": InputVariable("reinke", float, range=(1.0, 15.0)), "f_blkt_li6_enrichment": InputVariable("fwbs", float, range=(7.4, 100.0)), "life_dpa": InputVariable("costs", float, range=(10.0, 100.0)), "llw_storage_h": InputVariable( @@ -1794,7 +1794,7 @@ def __post_init__(self): "num_rh_systems": InputVariable("costs", int, range=(1, 10)), "output_costs": InputVariable("costs", int, choices=[0, 1]), "i_p_coolant_pumping": InputVariable("fwbs", int, range=(0, 3)), - "reinke_mode": InputVariable(data_structure.reinke_variables, int, choices=[0, 1]), + "reinke_mode": InputVariable("reinke", int, choices=[0, 1]), "scan_dim": InputVariable(data_structure.scan_variables, int, range=(1, 2)), "i_thermal_electric_conversion": InputVariable("fwbs", int, range=(0, 4)), "secondary_cycle_liq": InputVariable("fwbs", int, range=(2, 4)), @@ -1871,7 +1871,7 @@ def __post_init__(self): "sweep": InputVariable(data_structure.scan_variables, float, array=True), "sweep_2": InputVariable(data_structure.scan_variables, float, array=True), "impvardiv": InputVariable( - data_structure.reinke_variables, + "reinke", int, choices=range(3, data_structure.impurity_radiation_module.N_IMPURITIES + 1), ), diff --git a/process/core/model.py b/process/core/model.py index d6e6b8169..b2b57c254 100644 --- a/process/core/model.py +++ b/process/core/model.py @@ -7,6 +7,7 @@ from process.data_structure.cs_fatigue_variables import CSFatigueData from process.data_structure.first_wall_variables import FirstWallData from process.data_structure.fwbs_variables import FWBSData +from process.data_structure.reinke_variables import ReinkeData from process.data_structure.structure_variables import StructureData from process.data_structure.times_variables import TimesData from process.data_structure.vacuum_variables import VacuumData @@ -27,6 +28,7 @@ class DataStructure: blanket: BlanketData = initialise_later structure: StructureData = initialise_later times: TimesData = initialise_later + reinke: ReinkeData = initialise_later def __post_init__(self): for f in fields(self): diff --git a/process/core/solver/constraints.py b/process/core/solver/constraints.py index d4b0f6c3d..dccea3432 100644 --- a/process/core/solver/constraints.py +++ b/process/core/solver/constraints.py @@ -1604,15 +1604,15 @@ def constraint_equation_77(constraint_registration, _data): @ConstraintManager.register_constraint(78, "", ">=") -def constraint_equation_78(constraint_registration, _data): +def constraint_equation_78(constraint_registration, data): """Equation for Reinke criterion, divertor impurity fraction lower limit fzmin : input : minimum impurity fraction from Reinke model fzactual : input : actual impurity fraction """ return geq( - data_structure.reinke_variables.fzactual, - data_structure.reinke_variables.fzmin, + data.reinke.fzactual, + data.reinke.fzmin, constraint_registration, ) diff --git a/process/data_structure/reinke_variables.py b/process/data_structure/reinke_variables.py index 2ee9b84e7..7fb27b4c3 100644 --- a/process/data_structure/reinke_variables.py +++ b/process/data_structure/reinke_variables.py @@ -1,32 +1,29 @@ -impvardiv: int = None -"""Index of impurity to be iterated for Reinke divertor detachment criterion""" - -lhat: float = None -"""Connection length factor L|| = lhat qstar R for Reinke criterion, default value from -Post et al. 1995 J. Nucl. Mat. 220-2 1014 -""" - -fzmin: float = None -"""Minimum impurity fraction necessary for detachment. This is the impurity at the SOL/Div.""" - -fzactual: float = None -"""Actual impurity fraction of divertor impurity (impvardiv) in the SoL (taking -impurity_enrichment into account) (`iteration variable 148`) -""" - -reinke_mode: int = None -"""Switch for Reinke criterion H/I mode: -- =0 H-mode -- =1 I-mode -""" - - -def init_reinke_variables(): - """Initialise Reinke criterion variables""" - global impvardiv, lhat, fzmin, fzactual, reinke_mode - - impvardiv = 9 - lhat = 4.33 - fzmin = 0.0 - fzactual = 0.001 - reinke_mode = 0 +from dataclasses import dataclass + + +@dataclass +class ReinkeData: + impvardiv: int = 9 + """Index of impurity to be iterated for Reinke divertor detachment criterion""" + + lhat: float = 4.33 + """Connection length factor L|| = lhat qstar R for Reinke criterion, default value from + Post et al. 1995 J. Nucl. Mat. 220-2 1014 + """ + + fzmin: float = 0.0 + """Minimum impurity fraction necessary for detachment. This is the impurity at the SOL/Div.""" + + fzactual: float = 0.001 + """Actual impurity fraction of divertor impurity (impvardiv) in the SoL (taking + impurity_enrichment into account) (`iteration variable 148`) + """ + + reinke_mode: int = 0 + """Switch for Reinke criterion H/I mode: + - =0 H-mode + - =1 I-mode + """ + + +CREATE_DICTS_FROM_DATACLASS = ReinkeData diff --git a/process/models/physics/physics.py b/process/models/physics/physics.py index e19f93291..51970e067 100644 --- a/process/models/physics/physics.py +++ b/process/models/physics/physics.py @@ -25,7 +25,6 @@ numerics, physics_variables, pulse_variables, - reinke_variables, stellarator_variables, ) from process.models.physics import impurity_radiation @@ -1037,7 +1036,7 @@ def run(self): po.write( self.outfile, ( - f"reinke t and fz, physics = {physics_variables.temp_plasma_separatrix_kev} , {reinke_variables.fzmin}" + f"reinke t and fz, physics = {physics_variables.temp_plasma_separatrix_kev} , {self.data.reinke.fzmin}" ), ) fgw = ( @@ -1054,10 +1053,10 @@ def run(self): physics_variables.eps, fgw, physics_variables.kappa, - reinke_variables.lhat, + self.data.reinke.lhat, ) - if reinke_variables.fzmin >= 1.0e0: + if self.data.reinke.fzmin >= 1.0e0: logger.error( "REINKE IMPURITY MODEL: fzmin is greater than or equal to 1.0, this" " is at least notable" @@ -1066,9 +1065,9 @@ def run(self): po.write( self.outfile, ( - f" 'fzactual, frac, reinke_variables.impvardiv = {reinke_variables.fzactual}," - f" {impurity_radiation_module.f_nd_impurity_electron_array(reinke_variables.impvardiv)}," - f" {reinke_variables.impvardiv}" + f" 'fzactual, frac, impvardiv = {self.data.reinke.fzactual}," + f" {impurity_radiation_module.f_nd_impurity_electron_array(self.data.reinke.impvardiv)}," + f" {self.data.reinke.impvardiv}" ), ) @@ -2336,20 +2335,20 @@ def outplas(self): self.outfile, "index of impurity to be iterated for divertor detachment", "(impvardiv)", - reinke_variables.impvardiv, + self.data.reinke.impvardiv, ) po.ovarre( self.outfile, "Minimum Impurity fraction from Reinke", "(fzmin)", - reinke_variables.fzmin, + self.data.reinke.fzmin, "OP ", ) po.ovarre( self.outfile, "Actual Impurity fraction", "(fzactual)", - reinke_variables.fzactual, + self.data.reinke.fzactual, ) def output_temperature_density_profile_info(self) -> None: