Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion examples/single_model_evaluation.ex.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ def run_impurities(w_imp_fracs):
single_run.models.physics.run()

# Evaluate constraint equation 15 (L-H threshold constraint)
con15_value = ConstraintManager.evaluate_constraint(15).normalised_residual
con15_value = ConstraintManager.evaluate_constraint(
15, single_run.data
).normalised_residual

# Need to copy values
p_plasma_rad_mw[i] = data_structure.physics_variables.p_plasma_rad_mw.item()
Expand Down
24 changes: 17 additions & 7 deletions process/core/caller.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from process.models.tfcoil.base import TFConductorModel

if TYPE_CHECKING:
from process.core.model import DataStructure
from process.main import Models

logger = logging.getLogger(__name__)
Expand All @@ -26,17 +27,21 @@
class Caller:
"""Calls physics and engineering models."""

def __init__(self, models: Models):
def __init__(self, models: Models, data: DataStructure):
"""Initialise all physics and engineering models.

To ensure that, at the start of a run, all physics/engineering
variables are fully initialised with consistent values, the models are
called with the initial optimisation paramters, x.
called with the initial optimisation parameters, x.

:param models: physics and engineering model objects
:type models: Models
:param data: data structure object to be passed on to the constraint
evaluators
:type data: DataStructure
"""
self.models = models
self.data = data

@staticmethod
def check_agreement(
Expand Down Expand Up @@ -92,7 +97,7 @@ def call_models(self, xc: np.ndarray, m: int) -> tuple[float, np.ndarray]:
self._call_models_once(xc)
# Evaluate objective function and constraints
objf = objective_function(data_structure.numerics.minmax)
conf, _, _, _, _ = constraints.constraint_eqns(m, -1)
conf, _, _, _, _ = constraints.constraint_eqns(m, -1, self.data)

if objf_prev is None and conf_prev is None:
# First run: run again to check idempotence
Expand Down Expand Up @@ -156,7 +161,7 @@ def call_models_and_write_output(self, xc: np.ndarray, ifail: int):
OutputFileManager.open_idempotence_files()
self._call_models_once(xc)
# Write mfile
finalise(self.models, ifail)
finalise(self.models, self.data, ifail)

# Extract data from intermediate idempotence-checking mfile
mfile_path = (
Expand Down Expand Up @@ -198,7 +203,7 @@ def call_models_and_write_output(self, xc: np.ndarray, ifail: int):
# now idempotence checking complete
OutputFileManager.close_idempotence_files()
# Write final output file and mfile
finalise(self.models, ifail)
finalise(self.models, self.data, ifail)
return

# Mfiles not yet idempotent: need to re-evaluate models
Expand All @@ -225,6 +230,7 @@ def call_models_and_write_output(self, xc: np.ndarray, ifail: int):
OutputFileManager.close_idempotence_files()
finalise(
self.models,
self.data,
ifail,
non_idempotent_msg=non_idempotent_warning + "\n" + non_idempotent_table,
)
Expand Down Expand Up @@ -380,20 +386,24 @@ def _call_models_once(self, xc: np.ndarray):
# FISPACT and LOCA model (not used)- removed


def write_output_files(models: Models, ifail: int, *, runtime: float | None = None):
def write_output_files(
models: Models, data: DataStructure, ifail: int, *, runtime: float | None = None
):
"""Evaluate models and write output files (OUT.DAT and MFILE.DAT).

Parameters
----------
models : Models
physics and engineering models
data: DataStructure
data structure object
ifail : int
solver return code
"""
n = data_structure.numerics.nvar
x = data_structure.numerics.xcm[:n]
# Call models, ensuring output mfiles are fully idempotent
caller = Caller(models)
caller = Caller(models, data)
if runtime is not None:
ovarre(
constants.MFILE,
Expand Down
17 changes: 12 additions & 5 deletions process/core/final.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from process.data_structure import numerics


def finalise(models, ifail: int, non_idempotent_msg: str | None = None):
def finalise(models, data, ifail: int, non_idempotent_msg: str | None = None):
"""Routine to print out the final point in the scan.

Writes to OUT.DAT and MFILE.DAT.
Expand All @@ -19,6 +19,8 @@ def finalise(models, ifail: int, non_idempotent_msg: str | None = None):
----------
models : process.main.Models
physics and engineering model objects
data: DataStructure
data structure object to provide data to evaluate the constraints
ifail : int
error flag
non_idempotent_msg : None | str, optional
Expand All @@ -31,7 +33,7 @@ def finalise(models, ifail: int, non_idempotent_msg: str | None = None):

# Output relevant to no optimisation
if numerics.ioptimz == -2:
output_evaluation()
output_evaluation(data)

# Print non-idempotence warning to OUT.DAT only
if non_idempotent_msg:
Expand All @@ -42,8 +44,13 @@ def finalise(models, ifail: int, non_idempotent_msg: str | None = None):
op.write(models, constants.NOUT)


def output_evaluation():
"""Write output for an evaluation run of PROCESS"""
def output_evaluation(data):
"""Write output for an evaluation run of PROCESS
Parameters
----------
data: DataStructure
data structure object to provide data to evaluate the constraints
"""
po.oheadr(constants.NOUT, "Numerics")
po.ocmmnt(constants.NOUT, "PROCESS has performed an evaluation run.")
po.oblnkl(constants.NOUT)
Expand All @@ -55,7 +62,7 @@ def output_evaluation():
# Print the residuals of the constraint equations

residual_error, value, residual, symbols, units = constraints.constraint_eqns(
numerics.neqns + numerics.nineqns, -1
numerics.neqns + numerics.nineqns, -1, data
)

labels = [
Expand Down
2 changes: 0 additions & 2 deletions process/core/init.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
from process.data_structure.ccfe_hcpb_module import init_ccfe_hcpb_module
from process.data_structure.constraint_variables import init_constraint_variables
from process.data_structure.cost_variables import init_cost_variables
from process.data_structure.cs_fatigue_variables import init_cs_fatigue_variables
from process.data_structure.current_drive_variables import init_current_drive_variables
from process.data_structure.dcll_variables import init_dcll_module
from process.data_structure.divertor_variables import init_divertor_variables
Expand Down Expand Up @@ -299,7 +298,6 @@ def init_all_module_vars():
init_pulse_variables()
init_rebco_variables()
init_reinke_variables()
init_cs_fatigue_variables()
init_blanket_library()
init_dcll_module()
init_power_variables()
Expand Down
56 changes: 14 additions & 42 deletions process/core/input.py
Original file line number Diff line number Diff line change
Expand Up @@ -255,9 +255,7 @@ def __post_init__(self):
"bioshld_thk": InputVariable(
data_structure.buildings_variables, float, range=(0.25, 25.0)
),
"bkt_life_csf": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.0, 1.0)
),
"bkt_life_csf": InputVariable("cs_fatigue", float, range=(0.0, 1.0)),
"blbmith": InputVariable(data_structure.build_variables, float, range=(0.0, 2.0)),
"blbmoth": InputVariable(data_structure.build_variables, float, range=(0.0, 2.0)),
"blbpith": InputVariable(data_structure.build_variables, float, range=(0.0, 2.0)),
Expand Down Expand Up @@ -813,9 +811,7 @@ def __post_init__(self):
"f_p_shld_coolant_pump_total_heat": InputVariable(
data_structure.heat_transport_variables, float, range=(0.0, 0.2)
),
"fracture_toughness": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.1, 100000000.0)
),
"fracture_toughness": InputVariable("cs_fatigue", float, range=(0.1, 100000000.0)),
"fradpwr": InputVariable(
data_structure.constraint_variables, float, range=(0.0, 1.0)
),
Expand Down Expand Up @@ -1056,9 +1052,7 @@ def __post_init__(self):
"mvalim": InputVariable(
data_structure.constraint_variables, float, range=(0.0, 1000.0)
),
"n_cycle_min": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.0, 100000000.0)
),
"n_cycle_min": InputVariable("cs_fatigue", float, range=(0.0, 100000000.0)),
"n_tf_coils": InputVariable(
data_structure.tfcoil_variables, float, range=(0.0, 100.0)
),
Expand Down Expand Up @@ -1110,12 +1104,8 @@ def __post_init__(self):
"p_he": InputVariable(
data_structure.primary_pumping_variables, float, range=(0.0, 100000000.0)
),
"paris_coefficient": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1e-20, 10.0)
),
"paris_power_law": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1.0, 10.0)
),
"paris_coefficient": InputVariable("cs_fatigue", float, range=(1e-20, 10.0)),
"paris_power_law": InputVariable("cs_fatigue", float, range=(1.0, 10.0)),
"pres_vv_chamber_base": InputVariable(
data_structure.vacuum_variables, float, range=(1e-08, 0.001)
),
Expand Down Expand Up @@ -1281,9 +1271,7 @@ def __post_init__(self):
"redun_vacp": InputVariable(
data_structure.cost_variables, float, range=(0.0, 100.0)
),
"residual_sig_hoop": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.0, 1000000000.0)
),
"residual_sig_hoop": InputVariable("cs_fatigue", float, range=(0.0, 1000000000.0)),
"rho_tf_bus": InputVariable(
data_structure.tfcoil_variables, float, range=(0.0, 1e-05)
),
Expand Down Expand Up @@ -1339,15 +1327,9 @@ def __post_init__(self):
"sec_buildings_w": InputVariable(
data_structure.buildings_variables, float, range=(10.0, 1000.0)
),
"sf_fast_fracture": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1.0, 10.0)
),
"sf_radial_crack": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1.0, 10.0)
),
"sf_vertical_crack": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1.0, 10.0)
),
"sf_fast_fracture": InputVariable("cs_fatigue", float, range=(1.0, 10.0)),
"sf_radial_crack": InputVariable("cs_fatigue", float, range=(1.0, 10.0)),
"sf_vertical_crack": InputVariable("cs_fatigue", float, range=(1.0, 10.0)),
"shdr": InputVariable(data_structure.ife_variables, float, range=(0.0, 10.0)),
"shdzl": InputVariable(data_structure.ife_variables, float, range=(0.0, 10.0)),
"shdzu": InputVariable(data_structure.ife_variables, float, range=(0.0, 10.0)),
Expand Down Expand Up @@ -1413,12 +1395,8 @@ def __post_init__(self):
"dx_tf_turn_cable_space_general": InputVariable(
data_structure.tfcoil_variables, float, range=(0.0, 0.1)
),
"t_crack_radial": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1e-05, 1.0)
),
"t_crack_vertical": InputVariable(
data_structure.cs_fatigue_variables, float, range=(1e-05, 1.0)
),
"t_crack_radial": InputVariable("cs_fatigue", float, range=(1e-05, 1.0)),
"t_crack_vertical": InputVariable("cs_fatigue", float, range=(1e-05, 1.0)),
"t_crit_nbti": InputVariable(
data_structure.tfcoil_variables, float, range=(0.0, 15.0)
),
Expand All @@ -1443,12 +1421,8 @@ def __post_init__(self):
"t_plant_pulse_plasma_current_ramp_down": InputVariable(
data_structure.times_variables, float, range=(0.0, 10000.0)
),
"dr_cs_turn_conduit": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.001, 1.0)
),
"dz_cs_turn_conduit": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.001, 1.0)
),
"dr_cs_turn_conduit": InputVariable("cs_fatigue", float, range=(0.001, 1.0)),
"dz_cs_turn_conduit": InputVariable("cs_fatigue", float, range=(0.001, 1.0)),
"dx_tf_turn_general": InputVariable(
data_structure.tfcoil_variables, float, range=(0.0, 0.1)
),
Expand Down Expand Up @@ -1751,9 +1725,7 @@ def __post_init__(self):
"pflux_fw_neutron_max_mw": InputVariable(
data_structure.constraint_variables, float, range=(0.001, 50.0)
),
"walker_coefficient": InputVariable(
data_structure.cs_fatigue_variables, float, range=(0.1, 10.0)
),
"walker_coefficient": InputVariable("cs_fatigue", float, range=(0.1, 10.0)),
"wallpf": InputVariable(data_structure.fwbs_variables, float, range=(1.0, 2.0)),
"warm_shop_h": InputVariable(
data_structure.buildings_variables, float, range=(1.0, 100.0)
Expand Down
6 changes: 3 additions & 3 deletions process/core/io/plot/scans.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ def plot_scan(
62: "j_cs_flat_top_end",
63: "dr_cs",
64: "f_z_cs_tf_internal",
65: "csfv.n_cycle_min",
66: "pfv.f_a_cs_turn_steel",
67: "csfv.t_crack_vertical",
65: "n_cycle_min",
66: "f_a_cs_turn_steel",
67: "t_crack_vertical",
68: "inlet_temp_liq",
69: "outlet_temp_liq",
70: "blpressure_liq",
Expand Down
6 changes: 3 additions & 3 deletions process/core/io/variable_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,17 +299,17 @@ class VariableMetadata:
description="Minimum burn time",
units="s",
),
"pfv.f_a_cs_turn_steel": VariableMetadata(
"f_a_cs_turn_steel": VariableMetadata(
latex=r"$f_{\mathrm{Steel}}^{\mathrm{CS}}$",
description="Steel fraction in CS coil",
units="",
),
"csfv.dr_cs_turn_conduit": VariableMetadata(
"dr_cs_turn_conduit": VariableMetadata(
latex=r"$Turn_{\mathrm{radial}}^{\mathrm{CS}}[$m$]$",
description="Radial turn length",
units="m",
),
"csfv.t_crack_vertical": VariableMetadata(
"t_crack_vertical": VariableMetadata(
latex=r"$Crack_{\mathrm{vertical}}^{\mathrm{CS}}[$m$]$",
description="Vertical crack length",
units="m",
Expand Down
2 changes: 2 additions & 0 deletions process/core/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from dataclasses import dataclass, fields

from process.data_structure.cost_2015_variables import Cost2015Data
from process.data_structure.cs_fatigue_variables import CSFatigueData
from process.data_structure.water_usage_variables import WaterUseData

initialise_later = object()
Expand All @@ -11,6 +12,7 @@
class DataStructure:
water_use: WaterUseData = initialise_later
costs_2015: Cost2015Data = initialise_later
cs_fatigue: CSFatigueData = initialise_later

def __post_init__(self):
for f in fields(self):
Expand Down
Loading
Loading