diff --git a/documentation/scripts/plotting_scripts/2nd_gen_rebco_critical_surface.py b/documentation/scripts/plotting_scripts/2nd_gen_rebco_critical_surface.py
index 55526eb29..2dbf0281a 100644
--- a/documentation/scripts/plotting_scripts/2nd_gen_rebco_critical_surface.py
+++ b/documentation/scripts/plotting_scripts/2nd_gen_rebco_critical_surface.py
@@ -22,6 +22,8 @@
(
j_scaling[i, j],
_,
+ _,
+ _,
) = superconductors.jcrit_rebco(temp_grid[i, j], b_grid[i, j])
# Convert from A/m² to kA/mm² (1 A/m² = 1e-6 A/mm²)
j_scaling[i, j] *= 1e-9
diff --git a/documentation/source/eng-models/tf-coil-superconducting.md b/documentation/source/eng-models/tf-coil-superconducting.md
index b375441b6..9ecadc14c 100644
--- a/documentation/source/eng-models/tf-coil-superconducting.md
+++ b/documentation/source/eng-models/tf-coil-superconducting.md
@@ -652,6 +652,6 @@ WIP
WIP
-### Superconductor properties | `supercon_croco()`
+### Superconductor properties | `tf_croco_superconductor_properties()`
### Quench voltage | `croco_voltage()`
\ No newline at end of file
diff --git a/process/core/init.py b/process/core/init.py
index 91921429c..79c900bef 100644
--- a/process/core/init.py
+++ b/process/core/init.py
@@ -383,7 +383,7 @@ def check_process(inputs, data): # noqa: ARG001
data_structure.impurity_radiation_module.f_nd_impurity_electrons[imp]
)
- # Stop the run if oacdcp is used as an optimisation variable
+ # 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
if (data_structure.numerics.ixc[: data_structure.numerics.nvar] == 12).any():
diff --git a/process/core/input.py b/process/core/input.py
index 8bedcfb05..940ecd828 100644
--- a/process/core/input.py
+++ b/process/core/input.py
@@ -298,7 +298,7 @@ def __post_init__(self):
"copper_rrr": InputVariable(
data_structure.rebco_variables, float, range=(1.0, 10000.0)
),
- "dx_hts_tape_copper": InputVariable(
+ "dx_tf_hts_tape_copper": InputVariable(
data_structure.rebco_variables, float, range=(0.0, 0.001)
),
"copperaoh_m2": InputVariable(
@@ -329,7 +329,7 @@ def __post_init__(self):
"crane_arm_h": InputVariable("buildings", float, range=(1.0, 100.0)),
"crane_clrnc_h": InputVariable("buildings", float, range=(0.0, 10.0)),
"crane_clrnc_v": InputVariable("buildings", float, range=(0.0, 10.0)),
- "dx_croco_strand_copper": InputVariable(
+ "dx_tf_croco_strand_copper": InputVariable(
data_structure.rebco_variables, float, range=(0.001, 0.1)
),
"cryomag_h": InputVariable("buildings", float, range=(1.0, 100.0)),
@@ -623,7 +623,7 @@ def __post_init__(self):
"gas_buildings_w": InputVariable("buildings", float, range=(10.0, 1000.0)),
"ground_clrnc": InputVariable("buildings", float, range=(0.0, 10.0)),
"n_ecrh_harmonic": InputVariable("current_drive", float, range=(1.0, 10.0)),
- "dx_hts_tape_hastelloy": InputVariable(
+ "dx_tf_hts_tape_hastelloy": InputVariable(
data_structure.rebco_variables, float, range=(1e-08, 0.001)
),
"hccl": InputVariable("buildings", float, range=(0.0, 10.0)),
@@ -740,7 +740,7 @@ def __post_init__(self):
data_structure.physics_variables, float, range=(0.0, 1e21)
),
"nflutfmax": InputVariable("constraints", float, range=(0.0, 1e24)),
- "oacdcp": InputVariable(
+ "j_tf_coil_full_area": InputVariable(
data_structure.tfcoil_variables, float, range=(10000.0, 1000000000.0)
),
"f_a_cs_turn_steel": InputVariable(
@@ -846,7 +846,7 @@ def __post_init__(self):
"reactor_hall_w": InputVariable("buildings", float, range=(10.0, 1000.0)),
"reactor_roof_thk": InputVariable("buildings", float, range=(0.25, 25.0)),
"reactor_wall_thk": InputVariable("buildings", float, range=(0.25, 25.0)),
- "dx_hts_tape_rebco": InputVariable(
+ "dx_tf_hts_tape_rebco": InputVariable(
data_structure.rebco_variables,
float,
range=(1e-08, 0.0001),
@@ -981,10 +981,10 @@ def __post_init__(self):
"t_turn_tf_max": InputVariable(
data_structure.tfcoil_variables, float, range=(0.0, 1.0)
),
- "dx_hts_tape_total": InputVariable(
+ "dx_tf_hts_tape_total": InputVariable(
data_structure.rebco_variables, float, range=(0.0, 0.1)
),
- "dr_hts_tape": InputVariable(
+ "dr_tf_hts_tape": InputVariable(
data_structure.rebco_variables, float, range=(0.0, 0.1)
),
"tauee_in": InputVariable(
@@ -1213,7 +1213,7 @@ def __post_init__(self):
"ccls_ma": InputVariable(data_structure.pfcoil_variables, float, array=True),
"cfind": InputVariable("costs", float, array=True),
"i_blkt_coolant_type": InputVariable("fwbs", int, choices=[1, 2]),
- "coppera_m2_max": InputVariable(
+ "tf_coppera_m2_max": InputVariable(
data_structure.rebco_variables, float, range=(1.0e6, 1.0e10)
),
"cost_model": InputVariable("costs", int, choices=[0, 1, 2]),
diff --git a/process/core/io/obsolete_vars.py b/process/core/io/obsolete_vars.py
index 4d0197d86..5e46aeb56 100644
--- a/process/core/io/obsolete_vars.py
+++ b/process/core/io/obsolete_vars.py
@@ -420,12 +420,12 @@
"t_structural_vertical": "dz_cs_turn_conduit",
"t_cable_tf": "dx_tf_turn_cable_space_general",
"t_turn_tf": "dx_tf_turn_general",
- "copper_thick": "dx_hts_tape_copper",
- "croco_thick": "dx_croco_strand_copper",
- "hastelloy_thickness": "dx_hts_tape_hastelloy",
- "rebco_thickness": "dx_hts_tape_rebco",
- "tape_thickness": "dx_hts_tape_total",
- "tape_width": "dr_hts_tape",
+ "copper_thick": "dx_tf_hts_tape_copper",
+ "croco_thick": "dx_tf_croco_strand_copper",
+ "hastelloy_thickness": "dx_tf_hts_tape_hastelloy",
+ "rebco_thickness": "dx_tf_hts_tape_rebco",
+ "tape_thickness": "dx_tf_hts_tape_total",
+ "tape_width": "dr_tf_hts_tape",
"beta": "beta_total_vol_avg",
"beta_max": "beta_vol_avg_max",
"beta_min": "beta_vol_avg_min",
diff --git a/process/core/io/plot/scans.py b/process/core/io/plot/scans.py
index b993fd568..09d7ea0d6 100644
--- a/process/core/io/plot/scans.py
+++ b/process/core/io/plot/scans.py
@@ -82,7 +82,7 @@ def plot_scan(
2: "pflux_div_heat_load_max_mw",
3: "p_plant_electric_net_mw",
4: "hfact",
- 5: "oacdcp",
+ 5: "j_tf_coil_full_area",
6: "pflux_fw_neutron_max_mw",
7: "beamfus0",
8: "Obsolete", # OBSOLETE
diff --git a/process/core/io/plot/summary.py b/process/core/io/plot/summary.py
index b340d0ab2..0439a9781 100644
--- a/process/core/io/plot/summary.py
+++ b/process/core/io/plot/summary.py
@@ -73,7 +73,12 @@
PlasmaShapeModelType,
)
from process.models.superconductors import SuperconductorModel
-from process.models.tfcoil.base import TFCoilShapeModel, TFPlasmaCaseType
+from process.models.tfcoil.base import (
+ TFCoilShapeModel,
+ TFConductorModel,
+ TFPlasmaCaseType,
+)
+from process.models.tfcoil.superconducting import SuperconductingTFTurnType
@dataclass
@@ -7504,6 +7509,284 @@ def _pack_strands_rectangular_with_obstacles(
)
+def plot_tf_croco_turn(axis: plt.Axes, fig, mfile: MFile, scan: int):
+ """Plots inboard TF coil CICC individual turn structure with croco cable layout."""
+ # Import the TF turn variables then multiply into mm
+ i_tf_turns_integer = mfile.get("i_tf_turns_integer", scan=scan)
+ # If integer turns switch is on then the turns can have non square dimensions
+ if i_tf_turns_integer == 1:
+ turn_width = mfile.get("dr_tf_turn", scan=scan)
+ turn_height = mfile.get("dx_tf_turn", scan=scan)
+ cable_space_width_radial = mfile.get("dr_tf_turn_cable_space", scan=scan)
+ cable_space_width_toroidal = mfile.get("dx_tf_turn_cable_space", scan=scan)
+
+ elif i_tf_turns_integer == 0:
+ turn_width = mfile.get("dx_tf_turn_general", scan=scan)
+ cable_space_width = mfile.get("dx_tf_turn_cable_space_average", scan=scan)
+
+ steel_thickness = mfile.get("dx_tf_turn_steel", scan=scan)
+ insulation_thickness = mfile.get("dx_tf_turn_insulation", scan=scan)
+
+ a_tf_turn_cable_space_no_void = mfile.get("a_tf_turn_cable_space_no_void", scan=scan)
+ radius_tf_turn_cable_space_corners = mfile.get(
+ "radius_tf_turn_cable_space_corners", scan=scan
+ )
+
+ a_tf_wp_coolant_channels = mfile.get("a_tf_wp_coolant_channels", scan=scan)
+
+ f_a_tf_turn_cable_space_extra_void = mfile.get(
+ "f_a_tf_turn_cable_space_extra_void", scan=scan
+ )
+ a_tf_turn_steel = mfile.get("a_tf_turn_steel", scan=scan)
+ a_tf_turn_cable_space_effective = mfile.get(
+ "a_tf_turn_cable_space_effective", scan=scan
+ )
+
+ he_pipe_diameter = mfile.get("dia_tf_turn_coolant_channel", scan=scan)
+ dia_tf_turn_croco_cable = mfile.get("dia_tf_turn_croco_cable", scan=scan)
+
+ # Plot the total turn shape
+ if i_tf_turns_integer == 0:
+ axis.add_patch(
+ Rectangle(
+ [0, 0],
+ turn_width,
+ turn_width,
+ facecolor="red",
+ edgecolor="black",
+ ),
+ )
+ # Plot the steel conduit
+ axis.add_patch(
+ Rectangle(
+ [insulation_thickness, insulation_thickness],
+ (turn_width - 2 * insulation_thickness),
+ (turn_width - 2 * insulation_thickness),
+ facecolor="grey",
+ edgecolor="black",
+ ),
+ )
+
+ # Plot the central cable space
+ axis.add_patch(
+ Circle(
+ [(turn_width / 2), (turn_width / 2)],
+ 1.5 * dia_tf_turn_croco_cable,
+ facecolor="white",
+ edgecolor="black",
+ linewidth=1.2,
+ ),
+ )
+
+ # PLot the central copper cyclinder
+ axis.add_patch(
+ Circle(
+ [(turn_width / 2), (turn_width / 2)],
+ dia_tf_turn_croco_cable / 2,
+ facecolor="#B87333",
+ edgecolor="black",
+ linewidth=1.2,
+ ),
+ )
+
+ # Plot six surrounding Croco cables in a hexagonal layout.
+ center_x = turn_width / 2
+ center_y = turn_width / 2
+ ring_radius = dia_tf_turn_croco_cable
+ for angle in np.linspace(0, 2 * np.pi, 6, endpoint=False):
+ plot_corc_cable_geometry(
+ axis=axis,
+ r_centre=center_x + ring_radius * np.cos(angle),
+ z_centre=center_y + ring_radius * np.sin(angle),
+ dia_croco_strand=mfile.get("dia_tf_turn_croco_cable", scan=scan),
+ dx_croco_strand_copper=mfile.get("dx_tf_croco_strand_copper", scan=scan),
+ dr_hts_tape=mfile.get("dr_tf_hts_tape", scan=scan),
+ dx_croco_strand_tape_stack=mfile.get(
+ "dx_tf_croco_strand_tape_stack", scan=scan
+ ),
+ n_croco_strand_hts_tapes=mfile.get(
+ "n_tf_croco_strand_hts_tapes", scan=scan
+ ),
+ dx_hts_tape_rebco=mfile.get("dx_tf_hts_tape_rebco", scan=scan),
+ dx_hts_tape_copper=mfile.get("dx_tf_hts_tape_copper", scan=scan),
+ dx_hts_tape_hastelloy=mfile.get("dx_tf_hts_tape_hastelloy", scan=scan),
+ show_legend=False,
+ )
+
+ axis.minorticks_on()
+ axis.set_title("WP Turn Structure")
+ axis.set_xlim(-turn_width * 0.025, turn_width * 1.025)
+ axis.set_ylim(-turn_width * 0.025, turn_width * 1.025)
+ axis.set_aspect("equal", adjustable="box")
+ axis.set_xlabel("r [m]")
+ axis.set_ylabel("x [m]")
+
+ # Add info about the steel casing surrounding the WP
+ textstr_turn_insulation = (
+ f"$\\mathbf{{Turn \\ Insulation:}}$\n\n$\\Delta r:${insulation_thickness:.3e} m"
+ )
+
+ axis.text(
+ 0.4,
+ 0.9,
+ textstr_turn_insulation,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "red",
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
+
+ # Add info about the steel casing surrounding the WP
+ textstr_turn_steel = (
+ f"$\\mathbf{{Steel \\ Conduit:}}$\n\n$\\Delta r:${steel_thickness:.3e} m\n"
+ f"$A$: {a_tf_turn_steel:.3e} m$^2$"
+ )
+
+ axis.text(
+ 0.65,
+ 0.9,
+ textstr_turn_steel,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "grey",
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
+
+ if i_tf_turns_integer == 0:
+ # Add info about the steel casing surrounding the WP
+ textstr_turn_cable_space = (
+ f"$\\mathbf{{Cable \\ Space:}}$\n\n"
+ f"$\\Delta r:$ {cable_space_width:.3e} m\n"
+ f"Corner radius, $r$: {radius_tf_turn_cable_space_corners:.3e} m\n"
+ f"Cable area with no cooling \nchannel or gaps: {a_tf_turn_cable_space_no_void:.3e} m$^2$\n"
+ f"Extra cable space area void fraction: {f_a_tf_turn_cable_space_extra_void}\n"
+ f"True cable space area: {a_tf_turn_cable_space_effective:.3e} m$^2$"
+ )
+ elif i_tf_turns_integer == 1:
+ textstr_turn_cable_space = (
+ f"$\\mathbf{{Cable \\ Space:}}$\n\n"
+ f"Cable space: \n$\\Delta r$: {cable_space_width_radial:.3e} m \n"
+ f"$\\Delta x$: {cable_space_width_toroidal:.3e} m \n"
+ f"Corner radius, $r$: {radius_tf_turn_cable_space_corners:.3e} m\n"
+ f"Cable area with no cooling channel or gaps: {a_tf_turn_cable_space_no_void:.3e} m$^2$\n"
+ f"Extra cable space area void fraction: {f_a_tf_turn_cable_space_extra_void}\n"
+ f"True cable space area: {a_tf_turn_cable_space_effective:.3e} m$^2$"
+ )
+
+ axis.text(
+ 0.40,
+ 0.7,
+ textstr_turn_cable_space,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "royalblue",
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
+
+ if i_tf_turns_integer == 0:
+ textstr_turn = (
+ f"$\\mathbf{{Turn:}}$\n\n"
+ f"$\\Delta r$: {turn_width:.3e} m\n"
+ f"$\\Delta x$: {turn_width:.3e} m"
+ )
+
+ if i_tf_turns_integer == 1:
+ textstr_turn = (
+ f"$\\mathbf{{Turn:}}$\n\n"
+ f"$\\Delta r$: {turn_width:.3e} m\n"
+ f"$\\Delta x$: {turn_height:.3e} m"
+ )
+
+ axis.text(
+ 0.525,
+ 0.9,
+ textstr_turn,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "wheat",
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
+
+ # Add info about the steel casing surrounding the WP
+ textstr_turn_cooling = (
+ f"$\\mathbf{{Cooling:}}$\n\n"
+ f"$\\varnothing$: {he_pipe_diameter:.3e} m\n"
+ f"Total area of all coolant channels: {a_tf_wp_coolant_channels:.4f} m$^2$"
+ )
+
+ axis.text(
+ 0.45,
+ 0.8,
+ textstr_turn_cooling,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "white",
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
+
+ textstr_superconductor = (
+ f"$\\mathbf{{Superconductor:}}$\n \n"
+ f"Superconductor used: {SuperconductorModel(mfile.get('i_tf_sc_mat', scan=scan)).full_name}\n"
+ f"Critical field at zero \ntemperature and strain: {mfile.get('b_tf_superconductor_critical_zero_temp_strain', scan=scan):.4f} T\n"
+ f"Critical temperature at \nzero field and strain: {mfile.get('temp_tf_superconductor_critical_zero_field_strain', scan=scan):.4f} K\n"
+ f"Temperature at conductor: {mfile.get('tftmp', scan=scan):.4f} K\n"
+ f"$I_{{\\text{{TF,turn critical}}}}$: {mfile.get('c_turn_cables_critical', scan=scan):,.2f} A\n"
+ f"$I_{{\\text{{TF,turn}}}}$: {mfile.get('c_tf_turn', scan=scan):,.2f} A\n"
+ f"Critcal current ratio: {mfile.get('f_c_tf_turn_operating_critical', scan=scan):,.4f}\n"
+ f"Superconductor temperature \nmargin: {mfile.get('temp_tf_superconductor_margin', scan=scan):,.4f} K\n"
+ f"\n$\\mathbf{{Quench:}}$\n \n"
+ f"Quench dump time: {mfile.get('t_tf_superconductor_quench', scan=scan):.4e} s\n"
+ f"Quench detection time: {mfile.get('t_tf_quench_detection', scan=scan):.4e} s\n"
+ f"User input max temperature \nduring quench: {mfile.get('temp_tf_conductor_quench_max', scan=scan):.2f} K\n"
+ f"Required maxium WP current \ndensity for heat protection:\n{mfile.get('j_tf_wp_quench_heat_max', scan=scan):.2e} A/m$^2$\n"
+ )
+ axis.text(
+ 0.75,
+ 0.9,
+ textstr_superconductor,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "#6dd3f7", # light blue for superconductors
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
+
+
def plot_cable_in_conduit_cable(axis: plt.Axes, fig, mfile: MFile, scan: int):
"""Plots TF coil CICC cable cross-section.
@@ -12111,11 +12394,17 @@ def interp1d_profile(profile, mfile: MFile, scan: int):
def plot_corc_cable_geometry(
axis,
+ r_centre: float,
+ z_centre: float,
dia_croco_strand: float,
dx_croco_strand_copper: float,
dr_hts_tape: float,
dx_croco_strand_tape_stack: float,
n_croco_strand_hts_tapes: int,
+ dx_hts_tape_rebco: float,
+ dx_hts_tape_copper: float,
+ dx_hts_tape_hastelloy: float,
+ show_legend: bool = True,
):
"""Plot the geometry of a CroCo strand cable.
@@ -12123,6 +12412,10 @@ def plot_corc_cable_geometry(
----------
axis : matplotlib.axes._axes.Axes
The matplotlib axis to plot on.
+ r_centre : float
+ Radial position of the strand centre (in meters).
+ z_centre : float
+ Vertical position of the strand centre (in meters).
dia_croco_strand : float
Diameter of the CroCo strand (in meters).
dx_croco_strand_copper : float
@@ -12134,64 +12427,198 @@ def plot_corc_cable_geometry(
n_croco_strand_hts_tapes : int
Number of HTS tape layers in the stack.
"""
+ legend_label = None if show_legend else "_nolegend_"
+
# Plot a circle with the given diameter and copper edges
circle = Circle(
- (0, 0),
- radius=(dia_croco_strand / 2) * 1000,
- edgecolor="#B87333",
+ (r_centre, z_centre),
+ radius=(dia_croco_strand / 2),
+ edgecolor="black",
facecolor="#B87333",
- linewidth=2,
- label="Copper jacket",
+ linewidth=0.5,
+ label="Copper jacket" if show_legend else legend_label,
)
axis.add_patch(circle)
# Plot an inner circle with copper edges
circle = Circle(
- (0, 0),
- radius=((dia_croco_strand / 2) - dx_croco_strand_copper) * 1000,
+ (r_centre, z_centre),
+ radius=((dia_croco_strand / 2) - dx_croco_strand_copper),
edgecolor="grey",
facecolor="grey",
linewidth=2,
- label="Solder",
+ label="Solder" if show_legend else legend_label,
)
axis.add_patch(circle)
# Plot a rectangular tape stack in the middle
rect = Rectangle(
- (-dr_hts_tape / 2 * 1000, -(dx_croco_strand_tape_stack / 2) * 1000),
- width=dr_hts_tape * 1000,
- height=dx_croco_strand_tape_stack * 1000,
- edgecolor="blue",
- facecolor="blue",
- linewidth=2,
- label="HTS Tape Stack",
+ (r_centre - dr_hts_tape / 2, z_centre - dx_croco_strand_tape_stack / 2),
+ width=dr_hts_tape,
+ height=dx_croco_strand_tape_stack,
+ edgecolor="black",
+ facecolor=None,
+ linewidth=0.1,
+ alpha=0.5,
+ linestyle="--",
+ label="HTS Tape Stack" if show_legend else legend_label,
)
axis.add_patch(rect)
# Slice the tape stack into n_croco_strand_hts_tapes layers
for i in range(int(n_croco_strand_hts_tapes)):
- y_start = -(dx_croco_strand_tape_stack / 2) * 1000 + i * (
- dx_croco_strand_tape_stack / n_croco_strand_hts_tapes * 1000
- )
- rect = Rectangle(
- (-dr_hts_tape / 2 * 1000, y_start),
- width=dr_hts_tape * 1000,
- height=(dx_croco_strand_tape_stack / n_croco_strand_hts_tapes) * 1000,
- edgecolor="black",
- facecolor="blue",
- linewidth=1,
- )
- axis.add_patch(rect)
-
- axis.set_xlim(-dia_croco_strand * 0.75 * 1000, dia_croco_strand * 0.75 * 1000)
- axis.set_ylim(-dia_croco_strand * 1000, dia_croco_strand * 1000)
+ y_start = (
+ z_centre
+ - (dx_croco_strand_tape_stack / 2)
+ + i * (dx_croco_strand_tape_stack / n_croco_strand_hts_tapes)
+ )
+ plot_hts_tape_geometry(
+ axis=axis,
+ r_left=r_centre - (dr_hts_tape / 2),
+ z_bottom=y_start,
+ dr_hts_tape=dr_hts_tape,
+ dx_hts_tape_rebco=dx_hts_tape_rebco,
+ dx_hts_tape_copper=dx_hts_tape_copper,
+ dx_hts_tape_hastelloy=dx_hts_tape_hastelloy,
+ show_legend=False,
+ )
+
+ axis.set_xlim(-dia_croco_strand * 0.75, dia_croco_strand * 0.75)
+ axis.set_ylim(-dia_croco_strand * 0.75, dia_croco_strand * 0.75)
axis.set_aspect("equal", adjustable="datalim")
axis.set_title("CroCo Strand Geometry")
axis.grid(True)
- axis.set_xlabel("X-axis (mm)")
- axis.set_ylabel("Y-axis (mm)")
+ axis.set_xlabel("X-axis (m)")
+ axis.set_ylabel("Y-axis (m)")
axis.minorticks_on()
- axis.legend(loc="upper right")
+ if show_legend:
+ axis.legend(loc="upper right")
+
+
+def plot_hts_tape_geometry(
+ axis,
+ r_left: float,
+ z_bottom: float,
+ dr_hts_tape: float,
+ dx_hts_tape_rebco: float,
+ dx_hts_tape_copper: float,
+ dx_hts_tape_hastelloy: float,
+ show_legend: bool = True,
+):
+
+ legend_label = None if show_legend else "_nolegend_"
+ # Plot a rectangular tape stack in the middle
+ rect = Rectangle(
+ (r_left, z_bottom),
+ width=dr_hts_tape,
+ height=dx_hts_tape_copper / 2,
+ edgecolor=None,
+ facecolor="#B87333",
+ linewidth=2,
+ label="Copper" if show_legend else legend_label,
+ )
+ axis.add_patch(rect)
+ rect = Rectangle(
+ (r_left, z_bottom + dx_hts_tape_copper / 2),
+ width=dr_hts_tape,
+ height=dx_hts_tape_hastelloy / 2,
+ edgecolor=None,
+ facecolor="grey",
+ linewidth=2,
+ label="Hastelloy" if show_legend else legend_label,
+ )
+ axis.add_patch(rect)
+ rect = Rectangle(
+ (r_left, z_bottom + dx_hts_tape_copper / 2 + dx_hts_tape_hastelloy / 2),
+ width=dr_hts_tape,
+ height=dx_hts_tape_rebco,
+ edgecolor=None,
+ facecolor="blue",
+ linewidth=2,
+ label="REBCO" if show_legend else legend_label,
+ )
+ axis.add_patch(rect)
+ rect = Rectangle(
+ (
+ r_left,
+ z_bottom
+ + dx_hts_tape_copper / 2
+ + dx_hts_tape_hastelloy / 2
+ + dx_hts_tape_rebco,
+ ),
+ width=dr_hts_tape,
+ height=dx_hts_tape_hastelloy / 2,
+ edgecolor=None,
+ facecolor="grey",
+ linewidth=2,
+ label="Hastelloy" if show_legend else legend_label,
+ )
+ axis.add_patch(rect)
+ rect = Rectangle(
+ (
+ r_left,
+ z_bottom
+ + dx_hts_tape_copper / 2
+ + dx_hts_tape_hastelloy / 2
+ + dx_hts_tape_rebco
+ + dx_hts_tape_hastelloy / 2,
+ ),
+ width=dr_hts_tape,
+ height=dx_hts_tape_copper / 2,
+ edgecolor=None,
+ facecolor="#B87333",
+ linewidth=2,
+ label="Copper" if show_legend else legend_label,
+ )
+ axis.add_patch(rect)
+
+ axis.set_title("HTS Tape Geometry")
+ axis.grid(True)
+ axis.set_xlabel("X-axis (m)")
+ axis.set_ylabel("Y-axis (m)")
+ axis.set_xlim(r_left * 0.9, dr_hts_tape * 1.1)
+ axis.set_ylim(
+ z_bottom * 0.9,
+ (dx_hts_tape_copper + dx_hts_tape_hastelloy + dx_hts_tape_rebco) * 1.1,
+ )
+ axis.minorticks_on()
+ axis.ticklabel_format(style="sci", axis="both", scilimits=(0, 0))
+ if show_legend:
+ axis.legend(loc="upper right")
+
+
+def plot_tf_corc_cable_summary_box(axis, fig, mfile: MFile, scan: int):
+
+ textstr_cable = (
+ f"$\\mathbf{{CroCo \\ Cable:}}$\n \n"
+ f"Cable diameter: {mfile.get('dia_tf_turn_croco_cable', scan=scan) * 1e3:,.4f} mm\n"
+ f"Copper width: {mfile.get('dx_tf_croco_strand_copper', scan=scan) * 1e3:,.4f} mm\n"
+ f"Diameter of solder tape region: {mfile.get('dia_tf_croco_strand_tape_region', scan=scan) * 1e3:,.4f} mm\n"
+ f"Height of tape stack: {mfile.get('dx_tf_croco_strand_tape_stack', scan=scan) * 1e3:,.4f} mm\n"
+ f"Width of HTS tape / tape stack: {mfile.get('dr_tf_hts_tape', scan=scan) * 1e3:,.4f} mm\n"
+ f"Number of HTS tape layers: {int(mfile.get('n_tf_croco_strand_hts_tapes', scan=scan))}\n \n"
+ f"Total copper area: {mfile.get('a_tf_croco_strand_copper_total', scan=scan) * 1e6:,.4f} mm²\n"
+ f"Total hastelloy area: {mfile.get('a_tf_croco_strand_hastelloy', scan=scan) * 1e6:,.4f} mm²\n"
+ f"Total solder area: {mfile.get('a_tf_croco_strand_solder', scan=scan) * 1e6:,.4f} mm²\n"
+ f"Total superconductor area: {mfile.get('a_tf_croco_strand_rebco', scan=scan) * 1e6:,.4f} mm²\n"
+ f"Total strand area: {mfile.get('a_tf_croco_strand', scan=scan) * 1e6:,.4f} mm²\n"
+ )
+
+ axis.text(
+ 0.4,
+ 0.4,
+ textstr_cable,
+ fontsize=9,
+ verticalalignment="top",
+ horizontalalignment="left",
+ transform=fig.transFigure,
+ bbox={
+ "boxstyle": "round",
+ "facecolor": "#cccccc", # grayish color
+ "alpha": 1.0,
+ "linewidth": 2,
+ },
+ )
def reaction_plot_grid(
@@ -14415,7 +14842,7 @@ def main_plot(
plot_lower_vertical_build(ax18b, m_file, colour_scheme)
# Can only plot WP and turn structure if superconducting coil at the moment
- if m_file.get("i_tf_sup", scan=scan) == 1:
+ if m_file.get("i_tf_sup", scan=scan) == TFConductorModel.SUPERCONDUCTING:
# TF coil with WP
ax19 = figs[24].add_subplot(221, aspect="equal")
ax19.set_position([
@@ -14426,13 +14853,68 @@ def main_plot(
]) # Half height, a bit wider, top left
plot_superconducting_tf_wp(ax19, m_file, scan, figs[24])
- # TF coil turn structure
- ax20 = figs[25].add_subplot(325, aspect="equal")
- ax20.set_position([0.025, 0.5, 0.4, 0.4])
- plot_tf_cable_in_conduit_turn(ax20, figs[25], m_file, scan)
- plot_205 = figs[25].add_subplot(223, aspect="equal")
- plot_205.set_position([0.075, 0.1, 0.3, 0.3])
- plot_cable_in_conduit_cable(plot_205, figs[25], m_file, scan)
+ if (
+ m_file.get("i_tf_turn_type", scan=scan)
+ == SuperconductingTFTurnType.CROSS_CONDUCTOR
+ ):
+ ax20 = figs[25].add_subplot(325, aspect="equal")
+ ax20.set_position([0.025, 0.5, 0.4, 0.4])
+ plot_tf_croco_turn(ax20, figs[25], m_file, scan)
+ elif (
+ m_file.get("i_tf_turn_type", scan=scan)
+ == SuperconductingTFTurnType.CABLE_IN_CONDUIT
+ ):
+ # TF coil turn structure
+ ax20 = figs[25].add_subplot(325, aspect="equal")
+ ax20.set_position([0.025, 0.5, 0.4, 0.4])
+ plot_tf_cable_in_conduit_turn(ax20, figs[25], m_file, scan)
+
+ if (
+ m_file.get("i_tf_turn_type", scan=scan)
+ == SuperconductingTFTurnType.CROSS_CONDUCTOR
+ ):
+ plot_205 = figs[25].add_subplot(223, aspect="equal")
+ plot_205.set_position([0.075, 0.1, 0.3, 0.3])
+ plot_corc_cable_geometry(
+ plot_205,
+ r_centre=0.0,
+ z_centre=0.0,
+ dia_croco_strand=m_file.get("dia_tf_turn_croco_cable", scan=scan),
+ dx_croco_strand_copper=m_file.get(
+ "dx_tf_croco_strand_copper", scan=scan
+ ),
+ dr_hts_tape=m_file.get("dr_tf_hts_tape", scan=scan),
+ dx_croco_strand_tape_stack=m_file.get(
+ "dx_tf_croco_strand_tape_stack", scan=scan
+ ),
+ n_croco_strand_hts_tapes=m_file.get(
+ "n_tf_croco_strand_hts_tapes", scan=scan
+ ),
+ dx_hts_tape_rebco=m_file.get("dx_tf_hts_tape_rebco", scan=scan),
+ dx_hts_tape_copper=m_file.get("dx_tf_hts_tape_copper", scan=scan),
+ dx_hts_tape_hastelloy=m_file.get("dx_tf_hts_tape_hastelloy", scan=scan),
+ show_legend=True,
+ )
+ plot_tf_corc_cable_summary_box(plot_205, figs[25], m_file, scan)
+ ax_hts_tape = figs[25].add_subplot(339)
+ ax_hts_tape.set_position([0.75, 0.1, 0.2, 0.2])
+ plot_hts_tape_geometry(
+ axis=ax_hts_tape,
+ r_left=0.0,
+ z_bottom=0.0,
+ dr_hts_tape=m_file.get("dr_tf_hts_tape", scan=scan),
+ dx_hts_tape_rebco=m_file.get("dx_tf_hts_tape_rebco", scan=scan),
+ dx_hts_tape_copper=m_file.get("dx_tf_hts_tape_copper", scan=scan),
+ dx_hts_tape_hastelloy=m_file.get("dx_tf_hts_tape_hastelloy", scan=scan),
+ show_legend=True,
+ )
+ elif (
+ m_file.get("i_tf_turn_type", scan=scan)
+ == SuperconductingTFTurnType.CABLE_IN_CONDUIT
+ ):
+ plot_205 = figs[25].add_subplot(223, aspect="equal")
+ plot_205.set_position([0.075, 0.1, 0.3, 0.3])
+ plot_cable_in_conduit_cable(plot_205, figs[25], m_file, scan)
else:
ax19 = figs[24].add_subplot(211, aspect="equal")
ax19.set_position([0.06, 0.55, 0.675, 0.4])
diff --git a/process/core/output.py b/process/core/output.py
index 6a2fc187e..98b718dfb 100644
--- a/process/core/output.py
+++ b/process/core/output.py
@@ -80,6 +80,7 @@ def write(models, data, _outfile):
models.cicc_sctfcoil.output()
elif tf_turn_type == SuperconductingTFTurnType.CROSS_CONDUCTOR:
models.croco_sctfcoil.output()
+ models.croco_sctfcoil.output_croco_info()
else:
raise ValueError(
"Unsupported superconducting TF turn type: "
diff --git a/process/core/scan.py b/process/core/scan.py
index 7588537e7..e3a74c872 100644
--- a/process/core/scan.py
+++ b/process/core/scan.py
@@ -60,7 +60,9 @@ def _missing_(cls, var):
"p_plant_electric_net_required_mw", "Net_electric_power_(MW)", 3
)
hfact = ScanVariable("hfact", "Confinement_H_factor", 4)
- oacdcp = ScanVariable("oacdcp", "TF_inboard_leg_J_(MA/m2)", 5)
+ j_tf_coil_full_area = ScanVariable(
+ "j_tf_coil_full_area", "TF_inboard_leg_J_(MA/m2)", 5
+ )
pflux_fw_neutron_max_mw = ScanVariable(
"pflux_fw_neutron_max_mw", "Allow._wall_load_(MW/m2)", 6
)
@@ -1079,7 +1081,7 @@ def scan_select(self, nwp, swp, iscn):
case 4:
physics_variables.hfact = swp[iscn - 1]
case 5:
- tfcoil_variables.oacdcp = swp[iscn - 1]
+ tfcoil_variables.j_tf_coil_full_area = swp[iscn - 1]
case 6:
self.data.constraints.pflux_fw_neutron_max_mw = swp[iscn - 1]
case 7:
diff --git a/process/core/solver/constraints.py b/process/core/solver/constraints.py
index 63c62150e..e456c2ac6 100644
--- a/process/core/solver/constraints.py
+++ b/process/core/solver/constraints.py
@@ -1541,7 +1541,7 @@ def constraint_equation_75(constraint_registration, _data):
"""
return leq(
data_structure.rebco_variables.coppera_m2,
- data_structure.rebco_variables.coppera_m2_max,
+ data_structure.superconducting_tf_coil_variables.tf_coppera_m2_max,
constraint_registration,
)
diff --git a/process/core/solver/iteration_variables.py b/process/core/solver/iteration_variables.py
index 4341296fa..8e0cd6e84 100644
--- a/process/core/solver/iteration_variables.py
+++ b/process/core/solver/iteration_variables.py
@@ -57,7 +57,9 @@ class IterationVariable:
1.0e-3,
1.0e3,
),
- 12: IterationVariable("oacdcp", data_structure.tfcoil_variables, 1.0e5, 1.50e8),
+ 12: IterationVariable(
+ "j_tf_coil_full_area", data_structure.tfcoil_variables, 1.0e5, 1.50e8
+ ),
13: IterationVariable("dr_tf_inboard", "build", 0.1, 5.0),
16: IterationVariable("dr_cs", "build", 0.01, 10.00),
17: IterationVariable("t_plant_pulse_dwell", "times", 0.1, 1.0e8),
@@ -226,10 +228,10 @@ class IterationVariable:
array_index=13,
),
138: IterationVariable(
- "dx_hts_tape_rebco", data_structure.physics_variables, 0.01e-6, 100.0e-6
+ "dx_tf_hts_tape_rebco", data_structure.physics_variables, 0.01e-6, 100.0e-6
),
139: IterationVariable(
- "dx_hts_tape_copper", data_structure.rebco_variables, 1.0e-6, 1.0e-3
+ "dx_tf_hts_tape_copper", data_structure.rebco_variables, 1.0e-6, 1.0e-3
),
140: IterationVariable(
"dr_tf_wp_with_insulation", data_structure.tfcoil_variables, 0.001, 2.0
@@ -249,7 +251,7 @@ class IterationVariable:
155: IterationVariable("pfusife", "ife", 5.0e2, 3.0e3),
156: IterationVariable("rrin", "ife", 1.0, 1.0e1),
158: IterationVariable(
- "dx_croco_strand_copper", data_structure.rebco_variables, 1.0e-3, 1.0e-1
+ "dx_tf_croco_strand_copper", data_structure.rebco_variables, 1.0e-3, 1.0e-1
),
162: IterationVariable("r_cp_top", "build", 0.0010, 10.0),
169: IterationVariable(
diff --git a/process/data_structure/numerics.py b/process/data_structure/numerics.py
index 79f1feb67..7ea370e1c 100644
--- a/process/data_structure/numerics.py
+++ b/process/data_structure/numerics.py
@@ -208,7 +208,7 @@
* ( 9) NOT USED
* (10) hfact
* (11) p_hcd_primary_extra_heat_mw
-* (12) oacdcp
+* (12) j_tf_coil_full_area
* (13) dr_tf_inboard (NOT RECOMMENDED)
* (14) NOT USED
* (15) NOT USED
@@ -333,8 +333,8 @@
* (135) f_nd_impurity_electrons(13) : Xenon density fraction relative to electron density
* (136) f_nd_impurity_electrons(14) : Tungsten density fraction relative to electron density
* (137) NOT USED
-* (138) dx_hts_tape_rebco : thickness of REBCO layer in tape (m)
-* (139) dx_hts_tape_copper : thickness of copper layer in tape (m)
+* (138) dx_tf_hts_tape_rebco : thickness of REBCO layer in tape (m)
+* (139) dx_tf_hts_tape_copper : thickness of copper layer in tape (m)
* (140) dr_tf_wp_with_insulation : radial thickness of TFC winding pack (m)
* (141) NOT USED
* (142) nd_plasma_separatrix_electron : electron density at separatrix [m-3]
@@ -353,7 +353,7 @@
* (155) pfusife : IFE input fusion power (MW) (ifedrv=3 only)
* (156) rrin : Input IFE repetition rate (Hz) (ifedrv=3 only)
* (157) NOT USED
-* (158) dx_croco_strand_copper : Thickness of CroCo copper tube (m)
+* (158) dx_tf_croco_strand_copper : Thickness of CroCo copper tube (m)
* (159) NOT USED
* (160) NOT USED
* (161) NOT USED
diff --git a/process/data_structure/rebco_variables.py b/process/data_structure/rebco_variables.py
index b5c1e2b2e..65f1d79c2 100644
--- a/process/data_structure/rebco_variables.py
+++ b/process/data_structure/rebco_variables.py
@@ -1,4 +1,4 @@
-dx_hts_tape_rebco: float = None
+dx_tf_hts_tape_rebco: float = None
"""thickness of REBCO layer in tape (m) (`iteration variable 138`)"""
dx_hts_tape_copper: float = None
@@ -13,8 +13,6 @@
dx_hts_tape_total: float = None
"""thickness of tape, inc. all layers (hts, copper, substrate, etc.) (m)"""
-dia_croco_strand: float = None
-"""Outer diameter of CroCo strand (m)"""
dia_croco_strand_tape_region: float = None
"""Inner diameter of CroCo strand tape region (m)"""
@@ -62,11 +60,10 @@
def init_rebco_variables():
"""Initialise the REBCO variables"""
global \
- dx_hts_tape_rebco, \
+ dx_tf_hts_tape_rebco, \
dx_hts_tape_copper, \
dx_hts_tape_hastelloy, \
dr_hts_tape, \
- dia_croco_strand, \
dia_croco_strand_tape_region, \
dx_croco_strand_copper, \
copper_rrr, \
@@ -83,11 +80,11 @@ def init_rebco_variables():
copperaoh_m2_max, \
copperaoh_m2
- dx_hts_tape_rebco = 1.0e-6
+ dx_tf_hts_tape_rebco = 1.0e-6
dx_hts_tape_copper = 100.0e-6
dx_hts_tape_hastelloy = 50.0e-6
dr_hts_tape = 4.0e-3
- dia_croco_strand = 0.0
+
dia_croco_strand_tape_region = 0.0
dx_croco_strand_copper = 2.5e-3
copper_rrr = 100.0
diff --git a/process/data_structure/scan_variables.py b/process/data_structure/scan_variables.py
index e289bedff..f4cdec5d5 100644
--- a/process/data_structure/scan_variables.py
+++ b/process/data_structure/scan_variables.py
@@ -39,7 +39,7 @@
2 pflux_div_heat_load_max_mw
3 p_plant_electric_net_required_mw
4 hfact
- 5 oacdcp
+ 5 j_tf_coil_full_area
6 pflux_fw_neutron_max_mw
7 beamfus0
8 NOT USED
diff --git a/process/data_structure/superconducting_tf_coil_variables.py b/process/data_structure/superconducting_tf_coil_variables.py
index 82ae7d2e3..0a20a4e25 100644
--- a/process/data_structure/superconducting_tf_coil_variables.py
+++ b/process/data_structure/superconducting_tf_coil_variables.py
@@ -27,22 +27,22 @@
a_tf_wp_with_insulation: float = None
"""Total cross-sectional area of winding pack including
-GW insulation and insertion gap [m2]
+GW insulation and insertion gap [m²]
"""
a_tf_wp_no_insulation: float = None
"""Total cross-sectional area of winding pack without
-ground insulation and insertion gap [m2]
+ground insulation and insertion gap [m²]
"""
a_tf_coil_inboard_steel: float = None
-"""Inboard coil steel coil cross-sectional area [m2]"""
+"""Inboard coil steel coil cross-sectional area [m²]"""
a_tf_coil_inboard_insulation: float = None
-"""Inboard coil insulation cross-section per coil [m2]"""
+"""Inboard coil insulation cross-section per coil [m²]"""
f_a_tf_coil_inboard_steel: float = None
@@ -108,27 +108,27 @@
a_tf_plasma_case: float = None
-"""Front casing area [m2]"""
+"""Front casing area [m²]"""
a_tf_coil_nose_case: float = None
-"""Nose casing area [m2]"""
+"""Nose casing area [m²]"""
a_tf_wp_ground_insulation: float = None
-"""Inboard mid-plane cross-section area of the WP ground insulation [m2]"""
+"""Inboard mid-plane cross-section area of the WP ground insulation [m²]"""
a_leg_ins: float = None
-"""TF ouboard leg turn insulation area per coil [m2]"""
+"""TF ouboard leg turn insulation area per coil [m²]"""
a_leg_gr_ins: float = None
-"""TF outboard leg ground insulation area per coil [m2]"""
+"""TF outboard leg ground insulation area per coil [m²]"""
a_leg_cond: float = None
-"""Exact TF ouboard leg conductor area [m2]"""
+"""Exact TF ouboard leg conductor area [m²]"""
rad_tf_coil_inboard_toroidal_half: float = None
@@ -172,7 +172,7 @@
a_tf_turn_cable_space_effective: float = None
-"""True cable area of WP turn. This includes the removal of the cooling pipe [m^2] """
+"""True cable area of WP turn. This includes the removal of the cooling pipe [m²] """
vforce_inboard_tot: float = None
"""Total inboard vertical tension (all coils) [N]"""
@@ -183,6 +183,9 @@
dia_tf_turn_superconducting_cable: float = None
"""Diameter of the superconducting cable in the TF turn [m]"""
+dia_tf_turn_croco_cable: float = None
+"""Diameter of the Croco cable in the TF turn [m]"""
+
n_tf_turn_superconducting_cables: int = None
"""Number of superconducting cables in the TF turn"""
@@ -193,13 +196,13 @@
"""Total length of superconducting cable in all TF coils [m]"""
j_tf_superconductor_critical: float = None
-"""Critical current density of the superconducting cable [A/m^2]"""
+"""Critical current density of the superconducting cable [A/m²]"""
f_c_tf_turn_operating_critical: float = None
"""Ratio of the TF operating current to the critical current"""
j_tf_coil_turn: float = None
-"""Current density in the TF coil turn [A/m^2]"""
+"""Current density in the TF coil turn [A/m²]"""
b_tf_superconductor_critical_zero_temp_strain: float = None
"""Critical magnetic field of the superconducting cable at zero temperature and strain [T]"""
@@ -211,10 +214,10 @@
"""Fraction of usable turn cable space area used for cooling"""
c_tf_turn_cables_critical: float = None
-"""Critical current density in the turn cables [A/m^2]"""
+"""Critical current density in the turn cables [A/m²]"""
j_tf_superconductor: float = None
-"""Current density in the superconducting cable [A/m^2]"""
+"""Current density in the superconducting cable [A/m²]"""
i_tf_turn_type: int = None
"""Switch for TF turn geometry type"""
@@ -224,19 +227,74 @@
vv_stress_quench: float = None
"""The Tresca stress experienced by the Vacuum Vessel when the SCTF coil quenches [Pa]"""
+# REBCO tape and CroCo strand variables
+
+dx_tf_hts_tape_rebco: float = None
+"""thickness of REBCO layer in tape (m) (`iteration variable 138`)"""
+
+dx_tf_hts_tape_copper: float = None
+"""thickness of copper layer in tape (m) (`iteration variable 139`)"""
+
+dx_tf_hts_tape_hastelloy: float = None
+"""thickness of Hastelloy layer in tape (m)"""
+
+dr_tf_hts_tape: float = None
+"""Mean width of tape (m)"""
+
+dx_tf_hts_tape_total: float = None
+"""thickness of tape, inc. all layers (hts, copper, substrate, etc.) (m)"""
+
+dia_tf_croco_strand_tape_region: float = None
+"""Inner diameter of CroCo strand tape region (m)"""
+
+dx_tf_croco_strand_copper: float = None
+"""Thickness of CroCo strand copper tube (m) (`iteration variable 158`)"""
+
+copper_rrr: float = None
+"""residual resistivity ratio copper in TF superconducting cable"""
+
+tf_coppera_m2: float = None
+"""TF coil current / copper area (A/m²)"""
+
+tf_coppera_m2_max: float = None
+"""Maximum TF coil current / copper area (A/m²)"""
+
+dx_tf_croco_strand_tape_stack: float = None
+"""Width / thickness of tape stack in CroCo strand (m)"""
+
+n_tf_croco_strand_hts_tapes: float = None
+"""Number of HTS tapes in CroCo strand"""
+
+a_tf_croco_strand_rebco: float = None
+"""Area of REBCO in CroCo strand (m²)"""
+
+a_tf_croco_strand_copper_total: float = None
+"""Area of copper in CroCo strand (includes tapes and outer tube) (m²)"""
+
+a_tf_croco_strand_hastelloy: float = None
+"""Area of Hastelloy in CroCo strand (m²)"""
+
+a_tf_croco_strand_solder: float = None
+"""Area of solder in CroCo strand (m²)"""
+
+a_tf_croco_strand: float = None
+"""Total area of a CroCo strand (m²)"""
+
# croco_strand
-croco_strand_area: float = None
-croco_strand_critical_current: float = None
+tf_croco_strand_area: float = None
+cur_tf_turn_croco_strand_critical: float = None
+"""Critical current in the TF turn CroCo strand (A)"""
# conductor
-conductor_copper_area: float = None
+a_tf_turn_croco_cable_space_copper: float = None
conductor_copper_fraction: float = None
-conductor_copper_bar_area: float = None
-conductor_hastelloy_area: float = None
+a_tf_turn_croco_copper_bar: float = None
+"""Area of the central copper strand in the CroCo TF turn [m²]"""
+a_tf_turn_croco_hastelloy: float = None
conductor_hastelloy_fraction: float = None
conductor_helium_area: float = None
conductor_helium_fraction: float = None
@@ -247,7 +305,6 @@
conductor_rebco_area: float = None
conductor_rebco_fraction: float = None
conductor_critical_current: float = None
-conductor_acs: float = None
conductor_area: float = None
"""Area of cable space inside jacket"""
@@ -258,8 +315,6 @@
tau2: float = None
-e_tf_magnetic_stored_total: float = None
-
is_leg_cp_temp_same: int = None
@@ -308,11 +363,11 @@ def init_superconducting_tf_coil_variables():
t1, \
time2, \
tau2, \
- e_tf_magnetic_stored_total, \
radius_tf_turn_cable_space_corners, \
a_tf_turn_cable_space_effective, \
dr_tf_wp_no_insulation, \
dia_tf_turn_superconducting_cable, \
+ dia_tf_turn_croco_cable, \
n_tf_turn_superconducting_cables, \
len_tf_coil_superconductor, \
len_tf_superconductor_total, \
@@ -325,7 +380,26 @@ def init_superconducting_tf_coil_variables():
c_tf_turn_cables_critical, \
j_tf_superconductor, \
i_tf_turn_type, \
- vv_stress_quench
+ vv_stress_quench, \
+ dx_tf_hts_tape_rebco, \
+ dx_tf_hts_tape_copper, \
+ dx_tf_hts_tape_hastelloy, \
+ dr_tf_hts_tape, \
+ dx_tf_hts_tape_total, \
+ dia_tf_croco_strand_tape_region, \
+ dx_tf_croco_strand_copper, \
+ copper_rrr, \
+ tf_coppera_m2, \
+ tf_coppera_m2_max, \
+ dx_tf_croco_strand_tape_stack, \
+ n_tf_croco_strand_hts_tapes, \
+ a_tf_croco_strand_rebco, \
+ a_tf_croco_strand_copper_total, \
+ a_tf_croco_strand_hastelloy, \
+ a_tf_croco_strand_solder, \
+ a_tf_croco_strand, \
+ tf_croco_strand_area, \
+ cur_tf_turn_croco_strand_critical
is_leg_cp_temp_same = 0
tf_fit_t = 0.0
@@ -370,11 +444,11 @@ def init_superconducting_tf_coil_variables():
t1 = 0.0
time2 = 0.0
tau2 = 0.0
- e_tf_magnetic_stored_total = 0.0
radius_tf_turn_cable_space_corners = 0.0
a_tf_turn_cable_space_effective = 0.0
dr_tf_wp_no_insulation = 0.0
dia_tf_turn_superconducting_cable = 0.00073
+ dia_tf_turn_croco_cable = 0.0
n_tf_turn_superconducting_cables = 0
len_tf_coil_superconductor = 0.0
len_tf_superconductor_total = 0.0
@@ -388,3 +462,23 @@ def init_superconducting_tf_coil_variables():
j_tf_superconductor = 0.0
i_tf_turn_type = 1
vv_stress_quench = 0.0
+
+ dx_tf_hts_tape_rebco = 1.0e-6
+ dx_tf_hts_tape_copper = 100.0e-6
+ dx_tf_hts_tape_hastelloy = 50.0e-6
+ dr_tf_hts_tape = 4.0e-3
+ dx_tf_hts_tape_total = 6.5e-5
+ dia_tf_croco_strand_tape_region = 0.0
+ dx_tf_croco_strand_copper = 2.5e-3
+ copper_rrr = 100.0
+ tf_coppera_m2 = 0.0
+ tf_coppera_m2_max = 1.0e8
+ dx_tf_croco_strand_tape_stack = 0.0
+ n_tf_croco_strand_hts_tapes = 0.0
+ a_tf_croco_strand_rebco = 0.0
+ a_tf_croco_strand_copper_total = 0.0
+ a_tf_croco_strand_hastelloy = 0.0
+ a_tf_croco_strand_solder = 0.0
+ a_tf_croco_strand = 0.0
+ tf_croco_strand_area = 0.0
+ cur_tf_turn_croco_strand_critical = 0.0
diff --git a/process/data_structure/tfcoil_variables.py b/process/data_structure/tfcoil_variables.py
index cd58cbee4..870a4c2b0 100644
--- a/process/data_structure/tfcoil_variables.py
+++ b/process/data_structure/tfcoil_variables.py
@@ -200,9 +200,11 @@
dia_tf_turn_coolant_channel: float = None
"""diameter of central helium channel in TF winding (m)"""
+e_tf_magnetic_stored_total: float = None
+"""Total magnetic stored energy in the toroidal field coils (J)"""
e_tf_magnetic_stored_total_gj: float = None
-"""total magnetic stored energy in the toroidal field coils (GJ)"""
+"""Total magnetic stored energy in the toroidal field coils (GJ)"""
e_tf_coil_magnetic_stored: float = None
"""Stored magnetic energy in a single TF coil (J)"""
@@ -417,10 +419,8 @@
"""winding pack engineering current density (A/m2)"""
-oacdcp: float = None
-"""Overall current density in TF coil inboard legs midplane (A/m2)
-Rem SK : Not used in tfcoil to set the current any more. Should not be used as
-iteration variable 12 any more. It is now calculated.
+j_tf_coil_full_area: float = None
+"""Inboard leg mid-plane full coil area current density (A/m²)
"""
@@ -615,7 +615,7 @@
a_tf_inboard_total: float = None
-"""Area of inboard midplane TF legs (m2)"""
+"""Total inboard area of all TF coils (m²)"""
len_tf_bus: float = None
@@ -751,7 +751,7 @@
dx_tf_inboard_out_toroidal: float = None
-"""TF coil toroidal thickness (m)"""
+"""Inboard leg toroidal thickness at outer edge (m)"""
dx_tf_turn_insulation: float = None
@@ -1122,6 +1122,7 @@ def init_tfcoil_variables():
dcond, \
den_tf_wp_turn_insulation, \
dia_tf_turn_coolant_channel, \
+ e_tf_magnetic_stored_total, \
e_tf_magnetic_stored_total_gj, \
e_tf_coil_magnetic_stored, \
b_crit_upper_nbti, \
@@ -1153,7 +1154,7 @@ def init_tfcoil_variables():
j_tf_wp_critical, \
j_tf_wp_quench_heat_max, \
j_tf_wp, \
- oacdcp, \
+ j_tf_coil_full_area, \
eyoung_ins, \
eyoung_steel, \
eyoung_cond_axial, \
@@ -1348,6 +1349,7 @@ def init_tfcoil_variables():
])
den_tf_wp_turn_insulation = 1800.0
dia_tf_turn_coolant_channel = 0.005
+ e_tf_magnetic_stored_total = 0.0
e_tf_magnetic_stored_total_gj = 0.0
e_tf_coil_magnetic_stored = 0.0
b_crit_upper_nbti = 14.86
@@ -1389,7 +1391,7 @@ def init_tfcoil_variables():
j_tf_wp_critical = 0.0
j_tf_wp_quench_heat_max = 0.0
j_tf_wp = 0.0
- oacdcp = 0.0
+ j_tf_coil_full_area = 0.0
eyoung_ins = 1.0e8
eyoung_steel = 2.05e11
eyoung_cond_axial = 6.6e8
diff --git a/process/models/cryostat.py b/process/models/cryostat.py
index adb83ed21..b461c6b14 100644
--- a/process/models/cryostat.py
+++ b/process/models/cryostat.py
@@ -111,14 +111,14 @@ def output(self):
)
po.ovarrf(
self.outfile,
- "Cryostat structure volume (m^3)",
+ "Cryostat structure volume (m³)",
"(vol_cryostat)",
self.data.fwbs.vol_cryostat,
"OP ",
)
po.ovarrf(
self.outfile,
- "Cryostat internal volume (m^3)",
+ "Cryostat internal volume (m³)",
"(vol_cryostat_internal)",
self.data.fwbs.vol_cryostat_internal,
"OP ",
diff --git a/process/models/pfcoil.py b/process/models/pfcoil.py
index 5e6801758..2bf3130c0 100644
--- a/process/models/pfcoil.py
+++ b/process/models/pfcoil.py
@@ -4193,7 +4193,7 @@ def superconpf(bmax, fhe, fcu, jwp, isumat, fhts, strain, thelium, bcritsc, tcri
elif isumat == 6:
# "REBCO" 2nd generation HTS superconductor in CrCo strand
- j_crit_sc, _ = superconductors.jcrit_rebco(thelium, bmax)
+ j_crit_sc, _, _, _ = superconductors.jcrit_rebco(thelium, bmax)
# j_crit_cable = j_crit_sc * non-copper fraction of conductor * conductor fraction of cable
j_crit_cable = j_crit_sc * (1.0e0 - fcu) * (1.0e0 - fhe)
@@ -4223,9 +4223,9 @@ def superconpf(bmax, fhe, fcu, jwp, isumat, fhts, strain, thelium, bcritsc, tcri
bmax,
bc20m,
tc0m,
- rcv.dr_hts_tape,
- rcv.dx_hts_tape_rebco,
- rcv.dx_hts_tape_total,
+ superconducting_tf_coil_variables.dr_tf_hts_tape,
+ superconducting_tf_coil_variables.dx_tf_hts_tape_rebco,
+ superconducting_tf_coil_variables.dx_tf_hts_tape_total,
)
# A0 calculated for tape cross section already
# j_crit_cable = j_crit_sc * non-copper fraction of conductor * conductor fraction of cable
diff --git a/process/models/stellarator/coils/calculate.py b/process/models/stellarator/coils/calculate.py
index 84481e2d3..764cfb215 100644
--- a/process/models/stellarator/coils/calculate.py
+++ b/process/models/stellarator/coils/calculate.py
@@ -278,7 +278,7 @@ def calculate_coils_summary_variables(coilcurrent, r_coil_major, r_coil_minor, a
# [A] Total current in ALL coils
tfcoil_variables.c_tf_total = tfcoil_variables.n_tf_coils * coilcurrent * 1.0e6
# [A / m^2] overall current density
- tfcoil_variables.oacdcp = (
+ tfcoil_variables.j_tf_coil_full_area = (
tfcoil_variables.c_tf_total / tfcoil_variables.a_tf_inboard_total
)
# [m] radius of peak field occurrence, average
diff --git a/process/models/stellarator/coils/coils.py b/process/models/stellarator/coils/coils.py
index 1fe177c6a..fa18632b5 100644
--- a/process/models/stellarator/coils/coils.py
+++ b/process/models/stellarator/coils/coils.py
@@ -120,7 +120,7 @@ def jcrit_from_material(
# j_crit_cable = j_crit_sc * non-copper fraction of conductor * conductor fraction of cable
j_crit_cable = j_crit_sc * (1 - f_tf_conductor_copper) * (1 - f_he)
elif i_tf_sc_mat == 6: # ! "REBCO" 2nd generation HTS superconductor in CrCo strand
- j_crit_sc, _validity = superconductors.jcrit_rebco(t_helium, b_max, 0)
+ j_crit_sc, _validity, _, _ = superconductors.jcrit_rebco(t_helium, b_max, 0)
j_crit_sc = max(1.0e-9, j_crit_sc)
# j_crit_cable = j_crit_sc * non-copper fraction of conductor * conductor fraction of cable
j_crit_cable = j_crit_sc * (1 - f_tf_conductor_copper) * (1 - f_he)
diff --git a/process/models/stellarator/coils/output.py b/process/models/stellarator/coils/output.py
index ba40cada6..72c09d6d8 100644
--- a/process/models/stellarator/coils/output.py
+++ b/process/models/stellarator/coils/output.py
@@ -197,8 +197,8 @@ def write(
po.ovarre(
stellarator.outfile,
"Overall current density (A/m2)",
- "(oacdcp)",
- tfcoil_variables.oacdcp,
+ "(j_tf_coil_full_area)",
+ tfcoil_variables.j_tf_coil_full_area,
)
po.ovarre(
stellarator.outfile,
diff --git a/process/models/stellarator/coils/quench.py b/process/models/stellarator/coils/quench.py
index fed5fd484..90c26efce 100644
--- a/process/models/stellarator/coils/quench.py
+++ b/process/models/stellarator/coils/quench.py
@@ -75,7 +75,7 @@ def calculate_quench_protection(coilcurrent, data: DataStructure):
)
# Also give the copper current density (copper A/m2) for REBCO quench calculations:
- rebco_variables.coppera_m2 = (
+ rebco_variables.tf_coppera_m2 = (
coilcurrent
* 1.0e6
/ (
diff --git a/process/models/superconductors.py b/process/models/superconductors.py
index ab9b120da..a191b2248 100644
--- a/process/models/superconductors.py
+++ b/process/models/superconductors.py
@@ -1,6 +1,7 @@
"""Module for superconductor types, materials, and models."""
import logging
+from dataclasses import dataclass
from enum import IntEnum
from types import DynamicClassAttribute
@@ -8,10 +9,14 @@
from scipy import optimize
from process.core.exceptions import ProcessValueError
-from process.data_structure import rebco_variables
+from process.data_structure import (
+ superconducting_tf_coil_variables,
+)
logger = logging.getLogger(__name__)
+N_CROCO_STRANDS_TURN = 6
+
class SuperconductorType(IntEnum):
"""Enumeration of superconductor types."""
@@ -113,7 +118,9 @@ def full_name(self):
return self._full_name_
-def jcrit_rebco(temp_conductor: float, b_conductor: float) -> tuple[float, bool]:
+def jcrit_rebco(
+ temp_conductor: float, b_conductor: float
+) -> tuple[float, bool, float, float]:
"""Calculate the critical current density for a "REBCO" 2nd generation HTS
superconductor.
@@ -126,11 +133,13 @@ def jcrit_rebco(temp_conductor: float, b_conductor: float) -> tuple[float, bool]
Returns
-------
- tuple[float, bool]
+ tuple[float, bool, float, float]
A tuple containing:
- j_critical: Critical current density in the superconductor (A/m²).
- validity: A boolean indicating whether the input parameters are within the
valid range.
+ - b_c20max: Upper critical field (T) for the superconductor at zero temperature and strain.
+ - temp_c0max: Critical temperature (K) at zero field and strain.
Notes
-----
@@ -191,7 +200,7 @@ def jcrit_rebco(temp_conductor: float, b_conductor: float) -> tuple[float, bool]
tcb = temp_c0max * (1 - (b_conductor / b_c20max) ** oneoveralpha)
j_critical = -(temp_conductor - tcb)
- return j_critical, validity
+ return j_critical, validity, b_c20max, temp_c0max
def current_sharing_rebco(bfield, j):
@@ -211,7 +220,7 @@ def current_sharing_rebco(bfield, j):
"""
def deltaj_rebco(temperature):
- jcritical, _ = jcrit_rebco(temperature, bfield)
+ jcritical, _, _, _ = jcrit_rebco(temperature, bfield)
return jcritical - j
# No additional arguments are required for deltaj_rebco since it only has one
@@ -1026,22 +1035,26 @@ def bottura_scaling(
return j_scaling, b_critical, temp_critical
+@dataclass
+class CroCoCableGeometry:
+ dia_croco_strand_tape_region: float
+ n_croco_strand_hts_tapes: float
+ a_croco_strand_copper_total: float
+ a_croco_strand_hastelloy: float
+ a_croco_strand_solder: float
+ a_croco_strand_rebco: float
+ a_croco_strand: float
+ dr_hts_tape: float
+ dx_croco_strand_tape_stack: float
+
+
def calculate_croco_cable_geometry(
dia_croco_strand: float,
dx_croco_strand_copper: float,
dx_hts_tape_rebco: float,
dx_hts_tape_copper: float,
dx_hts_tape_hastelloy: float,
-) -> tuple[
- float, # dia_croco_strand_tape_region
- float, # n_croco_strand_hts_tapes
- float, # a_croco_strand_copper_total
- float, # a_croco_strand_hastelloy
- float, # a_croco_strand_solder
- float, # a_croco_strand_rebco
- float, # a_croco_strand
- float, # dr_hts_tape
-]:
+) -> CroCoCableGeometry:
"""Calculate geometry and areas for a CroCo cable strand.
Parameters
@@ -1059,16 +1072,16 @@ def calculate_croco_cable_geometry(
Returns
-------
- tuple[float, float, float, float, float, float, float, float]
- Tuple containing:
- - dia_croco_strand_tape_region: Inner diameter of CroCo strand tape region (m)
- - n_croco_strand_hts_tapes: Number of HTS tapes in CroCo strand
- - a_croco_strand_copper_total: Total copper area in CroCo strand (m²)
- - a_croco_strand_hastelloy: Total Hastelloy area in CroCo strand (m²)
- - a_croco_strand_solder: Total solder area in CroCo strand (m²)
- - a_croco_strand_rebco: Total REBCO area in CroCo strand (m²)
- - a_croco_strand: Total area of CroCo strand (m²)
- - dr_hts_tape: Width of the tape (m)
+ CroCoCableGeometry
+ - dia_croco_strand_tape_region: Inner diameter of CroCo strand tape region (m)
+ - n_croco_strand_hts_tapes: Number of HTS tapes in CroCo strand
+ - a_croco_strand_copper_total: Total copper area in CroCo strand (m²)
+ - a_croco_strand_hastelloy: Total Hastelloy area in CroCo strand (m²)
+ - a_croco_strand_solder: Total solder area in CroCo strand (m²)
+ - a_croco_strand_rebco: Total REBCO area in CroCo strand (m²)
+ - a_croco_strand: Total area of CroCo strand (m²)
+ - dr_hts_tape: Width of the tape (m)
+ - dx_croco_strand_tape_stack: Height of the tape stack in the CroCo strand (m)
"""
# Calculate the inner diameter of the CroCo strand tape region
dia_croco_strand_tape_region = dia_croco_strand - 2.0 * dx_croco_strand_copper
@@ -1109,97 +1122,16 @@ def calculate_croco_cable_geometry(
# Total area of the CroCo strand
a_croco_strand = np.pi / 4.0 * dia_croco_strand**2
- return (
- dia_croco_strand_tape_region,
- n_croco_strand_hts_tapes,
- a_croco_strand_copper_total,
- a_croco_strand_hastelloy,
- a_croco_strand_solder,
- a_croco_strand_rebco,
- a_croco_strand,
- dr_hts_tape,
- )
-
-
-def croco(j_crit_sc, conductor_area, dia_croco_strand, dx_croco_strand_copper):
- """'CroCo' (cross-conductor) strand and cable design for
- 'REBCO' 2nd generation HTS superconductor
- Updated 13/11/18 using data from Lewandowska et al 2018.
-
- Parameters
- ----------
- j_crit_sc :
-
- conductor_area :
-
- dia_croco_strand :
-
- dx_croco_strand_copper :
-
- """
- (
- rebco_variables.dia_croco_strand_tape_region,
- rebco_variables.n_croco_strand_hts_tapes,
- a_croco_strand_copper_total,
- a_croco_strand_hastelloy,
- a_croco_strand_solder,
- a_croco_strand_rebco,
- a_croco_strand,
- rebco_variables.dr_hts_tape,
- ) = calculate_croco_cable_geometry(
- dia_croco_strand,
- dx_croco_strand_copper,
- rebco_variables.dx_hts_tape_rebco,
- rebco_variables.dx_hts_tape_copper,
- rebco_variables.dx_hts_tape_hastelloy,
- )
-
- rebco_variables.a_croco_strand_copper_total = a_croco_strand_copper_total
- rebco_variables.a_croco_strand_hastelloy = a_croco_strand_hastelloy
- rebco_variables.a_croco_strand_solder = a_croco_strand_solder
- rebco_variables.a_croco_strand_rebco = a_croco_strand_rebco
- rebco_variables.a_croco_strand = a_croco_strand
-
- croco_strand_critical_current = j_crit_sc * a_croco_strand_rebco
-
- # Conductor properties
- # conductor%number_croco = conductor%acs*(1.0-cable_helium_fraction-copper_bar)
- # /a_croco_strand
- conductor_critical_current = croco_strand_critical_current * 6.0
- # Area of core = area of strand
- conductor_copper_bar_area = a_croco_strand
- conductor_copper_area = a_croco_strand_copper_total * 6.0 + conductor_copper_bar_area
- conductor_copper_fraction = conductor_copper_area / conductor_area
-
- # Helium area is set by the user.
- # conductor_helium_area = cable_helium_fraction * conductor_acs
- conductor_helium_area = np.pi / 2.0 * dia_croco_strand**2
- conductor_helium_fraction = conductor_helium_area / conductor_area
-
- conductor_hastelloy_area = a_croco_strand_hastelloy * 6.0
- conductor_hastelloy_fraction = conductor_hastelloy_area / conductor_area
-
- conductor_solder_area = a_croco_strand_solder * 6.0
- conductor_solder_fraction = conductor_solder_area / conductor_area
-
- conductor_rebco_area = a_croco_strand_rebco * 6.0
- conductor_rebco_fraction = conductor_rebco_area / conductor_area
-
- return (
- a_croco_strand,
- croco_strand_critical_current,
- conductor_copper_area,
- conductor_copper_fraction,
- conductor_copper_bar_area,
- conductor_hastelloy_area,
- conductor_hastelloy_fraction,
- conductor_helium_area,
- conductor_helium_fraction,
- conductor_solder_area,
- conductor_solder_fraction,
- conductor_rebco_area,
- conductor_rebco_fraction,
- conductor_critical_current,
+ return CroCoCableGeometry(
+ dia_croco_strand_tape_region=dia_croco_strand_tape_region,
+ n_croco_strand_hts_tapes=n_croco_strand_hts_tapes,
+ a_croco_strand_copper_total=a_croco_strand_copper_total,
+ a_croco_strand_hastelloy=a_croco_strand_hastelloy,
+ a_croco_strand_solder=a_croco_strand_solder,
+ a_croco_strand_rebco=a_croco_strand_rebco,
+ a_croco_strand=a_croco_strand,
+ dr_hts_tape=dr_hts_tape,
+ dx_croco_strand_tape_stack=dx_croco_strand_tape_stack,
)
@@ -1277,9 +1209,9 @@ def superconductor_current_density_margin(
b_superconductor,
bc20m,
tc0m,
- rebco_variables.dr_hts_tape,
- rebco_variables.dx_hts_tape_rebco,
- rebco_variables.dx_hts_tape_total,
+ superconducting_tf_coil_variables.dr_tf_hts_tape,
+ superconducting_tf_coil_variables.dx_tf_hts_tape_rebco,
+ superconducting_tf_coil_variables.dx_tf_hts_tape_total,
)[0],
}
diff --git a/process/models/tfcoil/base.py b/process/models/tfcoil/base.py
index e34f13975..55c6ba969 100644
--- a/process/models/tfcoil/base.py
+++ b/process/models/tfcoil/base.py
@@ -19,13 +19,10 @@
from process.core.model import Model
from process.data_structure import (
global_variables,
- numerics,
physics_variables,
- rebco_variables,
superconducting_tf_coil_variables,
tfcoil_variables,
)
-from process.models.superconductors import SuperconductorModel
if TYPE_CHECKING:
from process.models.build import Build
@@ -180,7 +177,7 @@ def run_base_tf(self):
tfcoil_variables.b_tf_inboard_peak_symmetric,
tfcoil_variables.c_tf_total,
superconducting_tf_coil_variables.c_tf_coil,
- tfcoil_variables.oacdcp,
+ tfcoil_variables.j_tf_coil_full_area,
) = self.tf_current(
n_tf_coils=tfcoil_variables.n_tf_coils,
b_plasma_toroidal_on_axis=physics_variables.b_plasma_toroidal_on_axis,
@@ -407,8 +404,7 @@ def tf_current(
magnet [T].
- **c_tf_total** (*float*): Total current in TF coils [A].
- **c_tf_coil** (*float*): Current per TF coil [A].
- - **oacdcp** (*float*): Global inboard leg average current density in TF
- coils [A/m²].
+ - **j_tf_coil_full_area** (*float*): Global inboard leg average current density in TF coils [A/m²].
"""
# Calculation of the maximum B field on the magnet [T]
b_tf_inboard_peak_symmetric = (
@@ -426,9 +422,9 @@ def tf_current(
c_tf_coil = c_tf_total / n_tf_coils
# Global inboard leg average current in TF coils [A/m2]
- oacdcp = c_tf_total / a_tf_inboard_total
+ j_tf_coil_full_area = c_tf_total / a_tf_inboard_total
- return b_tf_inboard_peak_symmetric, c_tf_total, c_tf_coil, oacdcp
+ return b_tf_inboard_peak_symmetric, c_tf_total, c_tf_coil, j_tf_coil_full_area
def tf_coil_shape_inner(
self,
@@ -638,51 +634,86 @@ def tf_stored_magnetic_energy(
e_tf_coil_magnetic_stored,
)
- def outtf(self):
- """Writes superconducting TF coil output to file
-
- This routine writes the superconducting TF coil results
- to the output file.
- PROCESS Superconducting TF Coil Model, J. Morris, CCFE, 1st May 2014
+ def output_general_tf_info(self) -> None:
+ """Writes generic TF coil parameters used by all types of TF coils to
+ the output file.
+ This should only contain variables calculated in the `TFCoil` class
"""
# General coil parameters
- po.osubhd(self.outfile, "TF design")
+ po.oheadr(self.outfile, "General TF Coil Parameters")
po.ovarin(
self.outfile,
- "Conductor technology",
+ "TF conductor technology",
"(i_tf_sup)",
tfcoil_variables.i_tf_sup,
)
- po.ovarin(
+ po.ocmmnt(
self.outfile,
- "Superconducting TF coil turn type",
- "(i_tf_turn_type)",
- superconducting_tf_coil_variables.i_tf_turn_type,
+ f"TF conductor model selected: {TFConductorModel(tfcoil_variables.i_tf_sup).name}",
)
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+ po.oblnkl(self.outfile)
- if tfcoil_variables.i_tf_sup == TFConductorModel.WATER_COOLED_COPPER:
+ # Coil shape
+ po.ovarin(
+ self.outfile,
+ "TF coil shape model used",
+ "(i_tf_shape)",
+ tfcoil_variables.i_tf_shape,
+ )
+ if tfcoil_variables.i_tf_shape == TFCoilShapeModel.D_SHAPE:
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "D-shape coil, inner surface shape approximated by")
po.ocmmnt(
self.outfile,
- " -> resistive coil : Water cooled copper (GLIDCOP AL-15)",
+ "by a straight segment and elliptical arcs between the following points:",
)
- elif tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- po.ocmmnt(self.outfile, " -> Superconducting coil (SC)")
- elif tfcoil_variables.i_tf_sup == TFConductorModel.HELIUM_COOLED_ALUMINIUM:
- po.ocmmnt(self.outfile, " -> Resistive coil : Helium cooled aluminium")
-
- # SC material scaling
- if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- po.ovarin(
- self.outfile,
- "Superconductor material",
- "(i_tf_sc_mat)",
- tfcoil_variables.i_tf_sc_mat,
+ po.oblnkl(self.outfile)
+ elif tfcoil_variables.i_tf_shape == TFCoilShapeModel.PICTURE_FRAME:
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "Picture frame coil, inner surface approximated by")
+ po.ocmmnt(
+ self.outfile, "by a straight segment between the following points:"
)
+ po.oblnkl(self.outfile)
- po.ocmmnt(
+ po.write(self.outfile, " Point r(m) z(m)")
+ for ii in range(5):
+ po.write(
self.outfile,
- f" -> {SuperconductorModel(tfcoil_variables.i_tf_sc_mat).full_name}",
+ f" {ii} {tfcoil_variables.r_tf_arc[ii]:.6e} {tfcoil_variables.z_tf_arc[ii]:.6e}",
+ )
+ po.ovarre(
+ constants.MFILE,
+ f"TF coil arc point {ii} R (m)",
+ f"(r_tf_arc({ii + 1}))",
+ tfcoil_variables.r_tf_arc[ii],
+ )
+ po.ovarre(
+ constants.MFILE,
+ f"TF coil arc point {ii} Z (m)",
+ f"(z_tf_arc({ii + 1}))",
+ tfcoil_variables.z_tf_arc[ii],
)
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+ po.oblnkl(self.outfile)
+
+ po.ovarin(
+ self.outfile,
+ "TF plasma-facing case geometry type switch",
+ "(i_tf_case_geom)",
+ tfcoil_variables.i_tf_case_geom,
+ )
+ po.ocmmnt(
+ self.outfile,
+ f"{TFPlasmaCaseType(tfcoil_variables.i_tf_case_geom).description}",
+ )
+
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+ po.oblnkl(self.outfile)
# Joints strategy
po.ovarin(
@@ -699,10 +730,14 @@ def outtf(self):
else:
po.ocmmnt(self.outfile, " -> Coils without demountable joints")
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+ po.oblnkl(self.outfile)
+
# Centring forces support strategy
po.ovarin(
self.outfile,
- "TF inboard leg support strategy",
+ "TF inboard leg support strategy model switch",
"(i_tf_bucking)",
tfcoil_variables.i_tf_bucking,
)
@@ -738,6 +773,9 @@ def outtf(self):
self.outfile, " -> TF in contact with CS (bucked and weged design)"
)
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+
# TF coil geometry
po.osubhd(self.outfile, "TF coil Geometry :")
po.ovarin(
@@ -746,68 +784,63 @@ def outtf(self):
"(n_tf_coils)",
int(tfcoil_variables.n_tf_coils),
)
+
po.ovarre(
self.outfile,
- "Inboard TF half angle [rad]",
+ "Inboard TF coil toroidal half angle [rad]",
"(rad_tf_coil_inboard_toroidal_half)",
superconducting_tf_coil_variables.rad_tf_coil_inboard_toroidal_half,
"OP ",
)
+ po.oblnkl(self.outfile)
+
po.ovarre(
self.outfile,
- "Inboard leg centre radius (m)",
- "(r_tf_inboard_mid)",
- self.data.build.r_tf_inboard_mid,
- "OP ",
- )
- po.ovarre(
- constants.MFILE,
"Inboard leg inner radius (m)",
"(r_tf_inboard_in)",
self.data.build.r_tf_inboard_in,
"OP ",
)
po.ovarre(
- constants.MFILE,
+ self.outfile,
+ "Inboard leg centre radius (m)",
+ "(r_tf_inboard_mid)",
+ self.data.build.r_tf_inboard_mid,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
"Inboard leg outer radius (m)",
"(r_tf_inboard_out)",
self.data.build.r_tf_inboard_out,
"OP ",
)
- po.ovarin(
- self.outfile,
- "WP shape selection switch",
- "(i_tf_wp_geom)",
- tfcoil_variables.i_tf_wp_geom,
- )
+ po.oblnkl(self.outfile)
+
po.ovarre(
- constants.MFILE,
+ self.outfile,
"Radial position of inner edge and centre of winding pack (m)",
"(r_tf_wp_inboard_inner)",
superconducting_tf_coil_variables.r_tf_wp_inboard_inner,
"OP ",
)
+
po.ovarre(
- constants.MFILE,
- "Radial position of outer edge and of winding pack (m)",
- "(r_tf_wp_inboard_outer)",
- superconducting_tf_coil_variables.r_tf_wp_inboard_outer,
- "OP ",
- )
- po.ovarre(
- constants.MFILE,
+ self.outfile,
"Radial position of centre of winding pack (m)",
"(r_tf_wp_inboard_centre)",
superconducting_tf_coil_variables.r_tf_wp_inboard_centre,
"OP ",
)
po.ovarre(
- constants.MFILE,
- "Minimum toroidal thickness of winding pack (m)",
- "(dx_tf_wp_toroidal_min)",
- superconducting_tf_coil_variables.dx_tf_wp_toroidal_min,
+ self.outfile,
+ "Radial position of outer edge and of winding pack (m)",
+ "(r_tf_wp_inboard_outer)",
+ superconducting_tf_coil_variables.r_tf_wp_inboard_outer,
"OP ",
)
+ po.oblnkl(self.outfile)
+
po.ovarre(
self.outfile,
"Outboard leg inner radius (m)",
@@ -823,12 +856,7 @@ def outtf(self):
self.data.build.r_tf_outboard_mid,
"OP ",
)
- po.ovarin(
- self.outfile,
- "Outboard leg nose case type",
- "(i_tf_case_geom)",
- tfcoil_variables.i_tf_case_geom,
- )
+ po.oblnkl(self.outfile)
po.ovarre(
self.outfile,
"Total inboard leg radial thickness (m)",
@@ -843,25 +871,45 @@ def outtf(self):
)
po.ovarre(
self.outfile,
- "Full external coil width at mid-plane (m)",
+ "Inboard leg nose case radial thickness (m)",
+ "(dr_tf_nose_case)",
+ tfcoil_variables.dr_tf_nose_case,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard leg plasma side case thickness (m)",
+ "(dr_tf_plasma_case)",
+ tfcoil_variables.dr_tf_plasma_case,
+ )
+ po.ovarre(
+ self.outfile,
+ "Full external coil radial width at mid-plane (m)",
"(dr_tf_full_midplane)",
tfcoil_variables.dr_tf_full_midplane,
"OP ",
)
po.ovarre(
self.outfile,
- "Full internal coil width at mid-plane (m)",
+ "Full internal coil radial width at mid-plane (m)",
"(dr_tf_internal_midplane)",
tfcoil_variables.dr_tf_internal_midplane,
"OP ",
)
+ po.oblnkl(self.outfile)
+ po.ovarre(
+ self.outfile,
+ "Inboard leg case sidewall thickness at its narrowest point (m)",
+ "(dx_tf_side_case_min)",
+ tfcoil_variables.dx_tf_side_case_min,
+ )
po.ovarre(
self.outfile,
- "Outboard leg toroidal thickness (m)",
+ "Inboard leg toroidal thickness at outer edge (m)",
"(dx_tf_inboard_out_toroidal)",
tfcoil_variables.dx_tf_inboard_out_toroidal,
"OP ",
)
+ po.oblnkl(self.outfile)
po.ovarre(
self.outfile,
"Maximum inboard edge height (m)",
@@ -876,6 +924,7 @@ def outtf(self):
self.data.build.z_tf_top,
"OP ",
)
+ po.oblnkl(self.outfile)
po.ovarre(
self.outfile,
"Height difference in upper and lower TF from midplane (m)",
@@ -899,6 +948,7 @@ def outtf(self):
"OP ",
)
else:
+ po.oblnkl(self.outfile)
po.ovarre(
self.outfile,
"Mean coil circumference (including inboard leg length) (m)",
@@ -906,50 +956,19 @@ def outtf(self):
tfcoil_variables.len_tf_coil,
"OP ",
)
-
- # Vertical shape
- po.ovarin(
+ po.oblnkl(self.outfile)
+ po.ovarre(
self.outfile,
- "Vertical TF shape",
- "(i_tf_shape)",
- tfcoil_variables.i_tf_shape,
+ "Total inboard area of all TF coils (m²)",
+ "(a_tf_inboard_total)",
+ tfcoil_variables.a_tf_inboard_total,
+ )
+ po.ovarre(
+ self.outfile,
+ "Outboard leg area of single TF coil (m²)",
+ "(a_tf_leg_outboard)",
+ tfcoil_variables.a_tf_leg_outboard,
)
- if tfcoil_variables.i_tf_shape == TFCoilShapeModel.D_SHAPE:
- po.oblnkl(self.outfile)
- po.ocmmnt(self.outfile, "D-shape coil, inner surface shape approximated by")
- po.ocmmnt(
- self.outfile,
- "by a straight segment and elliptical arcs between the following "
- "points:",
- )
- po.oblnkl(self.outfile)
- elif tfcoil_variables.i_tf_shape == TFCoilShapeModel.PICTURE_FRAME:
- po.oblnkl(self.outfile)
- po.ocmmnt(self.outfile, "Picture frame coil, inner surface approximated by")
- po.ocmmnt(
- self.outfile, "by a straight segment between the following points:"
- )
- po.oblnkl(self.outfile)
-
- po.write(self.outfile, " point x(m) y(m)")
- for ii in range(5):
- po.write(
- self.outfile,
- f" {ii} {tfcoil_variables.r_tf_arc[ii]}"
- f" {tfcoil_variables.z_tf_arc[ii]}",
- )
- po.ovarre(
- constants.MFILE,
- f"TF coil arc point {ii} R (m)",
- f"(r_tf_arc({ii + 1}))",
- tfcoil_variables.r_tf_arc[ii],
- )
- po.ovarre(
- constants.MFILE,
- f"TF coil arc point {ii} Z (m)",
- f"(z_tf_arc({ii + 1}))",
- tfcoil_variables.z_tf_arc[ii],
- )
# CP tapering geometry
if (
@@ -988,775 +1007,138 @@ def outtf(self):
self.data.build.z_tf_inside_half + self.data.build.dr_tf_outboard,
)
- # Turn/WP gemoetry
- if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- # Total material fraction
- po.osubhd(self.outfile, "Global material area/fractions:")
- po.ovarre(
- self.outfile,
- "TF cross-section (total) (m2)",
- "(a_tf_inboard_total)",
- tfcoil_variables.a_tf_inboard_total,
- )
- po.ovarre(
- self.outfile,
- "Total steel cross-section (m2)",
- "(a_tf_coil_inboard_steel*n_tf_coils)",
- superconducting_tf_coil_variables.a_tf_coil_inboard_steel
- * tfcoil_variables.n_tf_coils,
- )
- po.ovarre(
- self.outfile,
- "Total steel TF fraction",
- "(f_a_tf_coil_inboard_steel)",
- superconducting_tf_coil_variables.f_a_tf_coil_inboard_steel,
- )
- po.ovarre(
- self.outfile,
- "Total Insulation cross-section (total) (m2)",
- "(a_tf_coil_inboard_insulation*n_tf_coils)",
- superconducting_tf_coil_variables.a_tf_coil_inboard_insulation
- * tfcoil_variables.n_tf_coils,
- )
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+
+ # TF current and field
+ po.osubhd(self.outfile, "Maximum B field and currents:")
+
+ po.ovarre(
+ self.outfile,
+ "Radius of maximum field position on inboard TF coil (m)",
+ "(r_b_tf_inboard_peak)",
+ tfcoil_variables.r_b_tf_inboard_peak,
+ "OP ",
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Nominal peak field on inboard TF coil assuming toroidal symmetry (T)",
+ "(b_tf_inboard_peak_symmetric)",
+ tfcoil_variables.b_tf_inboard_peak_symmetric,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Actual peak field at discrete conductor (T)",
+ "(b_tf_inboard_peak_with_ripple)",
+ tfcoil_variables.b_tf_inboard_peak_with_ripple,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Ratio of peak field with ripple to nominal axisymmetric peak field",
+ "(f_b_tf_inboard_peak_ripple_symmetric)",
+ superconducting_tf_coil_variables.f_b_tf_inboard_peak_ripple_symmetric,
+ "OP ",
+ )
+ po.oblnkl(self.outfile)
+ po.ovarre(
+ self.outfile,
+ "Current in a single TF coil (A)",
+ "(c_tf_coil)",
+ superconducting_tf_coil_variables.c_tf_coil,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total current in all TF coils (A)",
+ "(c_tf_total)",
+ tfcoil_variables.c_tf_total,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Inboard leg mid-plane full coil area current density (A/m²)",
+ "(j_tf_coil_full_area)",
+ tfcoil_variables.j_tf_coil_full_area,
+ )
+ if physics_variables.itart == 1:
po.ovarre(
self.outfile,
- "Total Insulation fraction",
- "(f_a_tf_coil_inboard_insulation)",
- superconducting_tf_coil_variables.f_a_tf_coil_inboard_insulation,
+ "Outboard leg conductor current density (A/m²)",
+ "(cdtfleg)",
+ tfcoil_variables.cdtfleg,
)
- # External casing
- po.osubhd(self.outfile, "External steel Case Information :")
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+
+ po.osubhd(self.outfile, "Self Inductances and Stored Magnetic Energy:")
+ po.ovarre(
+ self.outfile,
+ "Self inductance of a TF coil (H)",
+ "(ind_tf_coil)",
+ tfcoil_variables.ind_tf_coil,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total stored magnetic energy in a TF coil (J)",
+ "(e_tf_coil_magnetic_stored)",
+ tfcoil_variables.e_tf_coil_magnetic_stored,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total stored magnetic energy in all TF coils (J)",
+ "(e_tf_magnetic_stored_total)",
+ tfcoil_variables.e_tf_magnetic_stored_total,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total stored magnetic energy in all TF coils (GJ)",
+ "(e_tf_magnetic_stored_total_gj)",
+ tfcoil_variables.e_tf_magnetic_stored_total_gj,
+ "OP ",
+ )
+
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
+ # Ripple calculations
+ po.osubhd(
+ self.outfile, "Plasma outboard midplane toroidal ripple information (δₜ):"
+ )
+ if tfcoil_variables.i_tf_shape == TFCoilShapeModel.D_SHAPE:
po.ovarre(
self.outfile,
- "Casing cross section area (per leg) (m2)",
- "(a_tf_coil_inboard_case)",
- tfcoil_variables.a_tf_coil_inboard_case,
+ "Max allowed toroidal field ripple at plasma outboard midplane (%)",
+ "(ripple_b_tf_plasma_edge_max)",
+ tfcoil_variables.ripple_b_tf_plasma_edge_max,
)
po.ovarre(
self.outfile,
- "Inboard leg case plasma side wall thickness (m)",
- "(dr_tf_plasma_case)",
- tfcoil_variables.dr_tf_plasma_case,
+ "Toroidal field ripple at plasma outboard midplane (%)",
+ "(ripple_b_tf_plasma_edge)",
+ tfcoil_variables.ripple_b_tf_plasma_edge,
+ "OP ",
)
+ else:
po.ovarre(
self.outfile,
- "Inboard leg plasma case area (m^2)",
- "(a_tf_plasma_case)",
- superconducting_tf_coil_variables.a_tf_plasma_case,
+ "Max allowed toroidal field ripple at plasma outboard midplane (%)",
+ "(ripple_b_tf_plasma_edge_max)",
+ tfcoil_variables.ripple_b_tf_plasma_edge_max,
)
po.ovarre(
self.outfile,
- 'Inboard leg case inboard "nose" thickness (m)',
- "(dr_tf_nose_case)",
- tfcoil_variables.dr_tf_nose_case,
+ "Toroidal field ripple at plasma outboard midplane (%)",
+ "(ripple_b_tf_plasma_edge)",
+ tfcoil_variables.ripple_b_tf_plasma_edge,
)
- po.ovarre(
- self.outfile,
- 'Inboard leg case inboard "nose" area (m^2)',
- "(a_tf_coil_nose_case)",
- superconducting_tf_coil_variables.a_tf_coil_nose_case,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg case sidewall thickness at its narrowest point (m)",
- "(dx_tf_side_case_min)",
- tfcoil_variables.dx_tf_side_case_min,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg case sidewall average thickness (m)",
- "(dx_tf_side_case_average)",
- superconducting_tf_coil_variables.dx_tf_side_case_average,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg case sidewall peak thickness (m)",
- "(dx_tf_side_case_peak)",
- superconducting_tf_coil_variables.dx_tf_side_case_peak,
- )
- po.ovarre(
- self.outfile,
- "External case mass per coil (kg)",
- "(m_tf_coil_case)",
- tfcoil_variables.m_tf_coil_case,
- "OP ",
- )
-
- # Winding pack structure
- po.osubhd(self.outfile, "TF winding pack (WP) geometry:")
- po.ovarre(
- self.outfile,
- "WP cross section area with insulation and insertion (per coil) (m2)",
- "(a_tf_wp_with_insulation)",
- superconducting_tf_coil_variables.a_tf_wp_with_insulation,
- )
- po.ovarre(
- self.outfile,
- "WP cross section area with no insulation and insertion (per coil) (m2)",
- "(a_tf_wp_no_insulation)",
- superconducting_tf_coil_variables.a_tf_wp_no_insulation,
- )
- po.ovarre(
- self.outfile,
- "Total steel area in WP (per coil) (m2)",
- "(a_tf_wp_steel)",
- tfcoil_variables.a_tf_wp_steel,
- )
- po.ovarre(
- self.outfile,
- "Winding pack radial thickness (m)",
- "(dr_tf_wp_with_insulation)",
- tfcoil_variables.dr_tf_wp_with_insulation,
- "OP ",
- )
- if tfcoil_variables.i_tf_turns_integer == 1:
- po.ovarre(
- self.outfile,
- "Winding pack toroidal width (m)",
- "(dx_tf_wp_primary_toroidal)",
- tfcoil_variables.dx_tf_wp_primary_toroidal,
- "OP ",
- )
- else:
- po.ovarre(
- self.outfile,
- "Winding pack toroidal width 1 (m)",
- "(dx_tf_wp_primary_toroidal)",
- tfcoil_variables.dx_tf_wp_primary_toroidal,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Winding pack toroidal width 2 (m)",
- "(dx_tf_wp_secondary_toroidal)",
- tfcoil_variables.dx_tf_wp_secondary_toroidal,
- "OP ",
- )
-
- po.ovarre(
- self.outfile,
- "Ground wall insulation thickness (m)",
- "(dx_tf_wp_insulation)",
- tfcoil_variables.dx_tf_wp_insulation,
- )
- po.ovarre(
- self.outfile,
- "Ground wall insulation area (m^2)",
- "(a_tf_wp_ground_insulation)",
- superconducting_tf_coil_variables.a_tf_wp_ground_insulation,
- )
- po.ovarre(
- self.outfile,
- "Winding pack insertion gap (m)",
- "(dx_tf_wp_insertion_gap)",
- tfcoil_variables.dx_tf_wp_insertion_gap,
- )
-
- # WP material fraction
- po.osubhd(self.outfile, "TF winding pack (WP) material area/fractions:")
- po.ovarre(
- self.outfile,
- "Steel WP cross-section (total) (m2)",
- "(a_tf_wp_steel*n_tf_coils)",
- tfcoil_variables.a_tf_wp_steel * tfcoil_variables.n_tf_coils,
- )
- po.ovarre(
- self.outfile,
- "Steel WP fraction",
- "(a_tf_wp_steel/a_tf_wp_with_insulation)",
- tfcoil_variables.a_tf_wp_steel
- / superconducting_tf_coil_variables.a_tf_wp_with_insulation,
- )
- po.ovarre(
- self.outfile,
- "Insulation WP fraction",
- "(a_tf_coil_wp_turn_insulation/a_tf_wp_with_insulation)",
- tfcoil_variables.a_tf_coil_wp_turn_insulation
- / superconducting_tf_coil_variables.a_tf_wp_with_insulation,
- )
- po.ovarre(
- self.outfile,
- "Cable WP fraction",
- "((a_tf_wp_with_insulation-a_tf_wp_steel-a_tf_coil_wp_turn_insulation)"
- "/a_tf_wp_with_insulation)",
- (
- superconducting_tf_coil_variables.a_tf_wp_with_insulation
- - tfcoil_variables.a_tf_wp_steel
- - tfcoil_variables.a_tf_coil_wp_turn_insulation
- )
- / superconducting_tf_coil_variables.a_tf_wp_with_insulation,
- )
-
- # Number of turns
- po.osubhd(self.outfile, "WP turn information:")
- po.ovarin(
- self.outfile,
- "Turn parameterisation",
- "(i_tf_turns_integer)",
- tfcoil_variables.i_tf_turns_integer,
- )
- if tfcoil_variables.i_tf_turns_integer == 0:
- po.ocmmnt(self.outfile, " Non-integer number of turns")
- else:
- po.ocmmnt(self.outfile, " Integer number of turns")
-
- po.ovarre(
- self.outfile,
- "Number of turns per TF coil",
- "(n_tf_coil_turns)",
- tfcoil_variables.n_tf_coil_turns,
- "OP ",
- )
- if tfcoil_variables.i_tf_turns_integer == 1:
- po.ovarin(
- self.outfile,
- "Number of TF pancakes",
- "(n_tf_wp_pancakes)",
- tfcoil_variables.n_tf_wp_pancakes,
- )
- po.ovarin(
- self.outfile,
- "Number of TF layers",
- "(n_tf_wp_layers)",
- tfcoil_variables.n_tf_wp_layers,
- )
-
- po.oblnkl(self.outfile)
-
- if tfcoil_variables.i_tf_turns_integer == 1:
- po.ovarre(
- self.outfile,
- "Radial width of turn (m)",
- "(dr_tf_turn)",
- superconducting_tf_coil_variables.dr_tf_turn,
- )
- po.ovarre(
- self.outfile,
- "Toroidal width of turn (m)",
- "(dx_tf_turn)",
- superconducting_tf_coil_variables.dx_tf_turn,
- )
- po.ovarre(
- self.outfile,
- "Radial width of conductor (m)",
- "(t_conductor_radial)",
- superconducting_tf_coil_variables.t_conductor_radial,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Toroidal width of conductor (m)",
- "(t_conductor_toroidal)",
- superconducting_tf_coil_variables.t_conductor_toroidal,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Radial width of cable space",
- "(dr_tf_turn_cable_space)",
- superconducting_tf_coil_variables.dr_tf_turn_cable_space,
- )
- po.ovarre(
- self.outfile,
- "Toroidal width of cable space",
- "(dx_tf_turn_cable_space)",
- superconducting_tf_coil_variables.dx_tf_turn_cable_space,
- )
- po.ovarre(
- self.outfile,
- "Radius of turn cable space rounded corners (m)",
- "(radius_tf_turn_cable_space_corners)",
- superconducting_tf_coil_variables.radius_tf_turn_cable_space_corners,
- )
- else:
- po.ovarre(
- self.outfile,
- "Width of turn including inter-turn insulation (m)",
- "(dx_tf_turn_general)",
- tfcoil_variables.dx_tf_turn_general,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Width of conductor (square) (m)",
- "(t_conductor)",
- tfcoil_variables.t_conductor,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Width of space inside conductor (m)",
- "(dx_tf_turn_cable_space_average)",
- superconducting_tf_coil_variables.dx_tf_turn_cable_space_average,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Radius of turn cable space rounded corners (m)",
- "(radius_tf_turn_cable_space_corners)",
- superconducting_tf_coil_variables.radius_tf_turn_cable_space_corners,
- )
-
- po.ovarre(
- self.outfile,
- "Steel conduit thickness (m)",
- "(dx_tf_turn_steel)",
- tfcoil_variables.dx_tf_turn_steel,
- )
- po.ovarre(
- self.outfile,
- "Inter-turn insulation thickness (m)",
- "(dx_tf_turn_insulation)",
- tfcoil_variables.dx_tf_turn_insulation,
- )
-
- if tfcoil_variables.i_tf_sc_mat in {1, 2, 3, 4, 5, 7, 8, 9}:
- po.osubhd(self.outfile, "Conductor information:")
- po.ovarre(
- self.outfile,
- "Diameter of central helium channel in cable",
- "(dia_tf_turn_coolant_channel)",
- tfcoil_variables.dia_tf_turn_coolant_channel,
- )
- po.ovarre(
- self.outfile,
- "Diameter of superconducting cable",
- "(dia_tf_turn_superconducting_cable)",
- superconducting_tf_coil_variables.dia_tf_turn_superconducting_cable,
- )
- po.ovarre(
- self.outfile,
- "Number of superconducting cables per turn",
- "(n_tf_turn_superconducting_cables)",
- superconducting_tf_coil_variables.n_tf_turn_superconducting_cables,
- )
- po.ovarre(
- self.outfile,
- "Length of superconductor in TF coil (m)",
- "(len_tf_coil_superconductor)",
- superconducting_tf_coil_variables.len_tf_coil_superconductor,
- )
- po.ovarre(
- self.outfile,
- "Total length of superconductor in all TF coils (m)",
- "(len_tf_superconductor_total)",
- superconducting_tf_coil_variables.len_tf_superconductor_total,
- )
- po.ocmmnt(self.outfile, "Fractions by area")
- po.ovarre(
- self.outfile,
- "internal area of the cable space",
- "(a_tf_turn_cable_space_no_void)",
- tfcoil_variables.a_tf_turn_cable_space_no_void,
- )
- po.ovarre(
- self.outfile,
- "True area of turn cable space with gaps and channels removed",
- "(a_tf_turn_cable_space_effective)",
- superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
- )
-
- po.ovarre(
- self.outfile,
- "Coolant fraction in conductor excluding central channel",
- "(f_a_tf_turn_cable_space_extra_void)",
- tfcoil_variables.f_a_tf_turn_cable_space_extra_void,
- )
- po.ovarre(
- self.outfile,
- "Area of steel in turn",
- "(a_tf_turn_steel)",
- tfcoil_variables.a_tf_turn_steel,
- )
- po.ovarre(
- self.outfile,
- "Area of all turn insulation in WP",
- "(a_tf_coil_wp_turn_insulation)",
- tfcoil_variables.a_tf_coil_wp_turn_insulation,
- )
- po.ovarre(
- self.outfile,
- "Total insulation area in TF coil (turn and WP)",
- "(a_tf_coil_inboard_insulation)",
- superconducting_tf_coil_variables.a_tf_coil_inboard_insulation,
- )
- po.ovarre(
- self.outfile,
- "Total steel area in inboard TF coil (turn and case)",
- "(a_tf_coil_inboard_steel)",
- superconducting_tf_coil_variables.a_tf_coil_inboard_steel,
- )
- po.ovarre(
- self.outfile,
- "Total conductor area in WP",
- "(a_tf_wp_conductor)",
- tfcoil_variables.a_tf_wp_conductor,
- )
- po.ovarre(
- self.outfile,
- "Total additional void area in WP",
- "(a_tf_wp_extra_void)",
- tfcoil_variables.a_tf_wp_extra_void,
- )
-
- po.ovarre(
- self.outfile,
- "Area of all coolant channels in WP",
- "(a_tf_wp_coolant_channels)",
- tfcoil_variables.a_tf_wp_coolant_channels,
- )
-
- po.ovarre(
- self.outfile,
- "Copper fraction of conductor",
- "(f_a_tf_turn_cable_copper)",
- tfcoil_variables.f_a_tf_turn_cable_copper,
- )
- po.ovarre(
- self.outfile,
- "Superconductor fraction of conductor",
- "(1-f_a_tf_turn_cable_copper)",
- 1 - tfcoil_variables.f_a_tf_turn_cable_copper,
- )
- ap = (
- tfcoil_variables.a_tf_wp_conductor
- + tfcoil_variables.n_tf_coil_turns * tfcoil_variables.a_tf_turn_steel
- + tfcoil_variables.a_tf_coil_wp_turn_insulation
- + tfcoil_variables.a_tf_wp_extra_void
- + tfcoil_variables.a_tf_wp_coolant_channels
- )
- po.ovarrf(
- self.outfile,
- "Check total area fractions in winding pack = 1",
- "",
- (
- tfcoil_variables.a_tf_wp_conductor
- + tfcoil_variables.n_tf_coil_turns
- * tfcoil_variables.a_tf_turn_steel
- + tfcoil_variables.a_tf_coil_wp_turn_insulation
- + tfcoil_variables.a_tf_wp_extra_void
- + tfcoil_variables.a_tf_wp_coolant_channels
- )
- / ap,
- )
- po.ovarrf(
- self.outfile,
- "minimum TF conductor temperature margin (K)",
- "(temp_tf_superconductor_margin_min)",
- tfcoil_variables.temp_tf_superconductor_margin_min,
- )
- po.ovarrf(
- self.outfile,
- "TF conductor temperature margin (K)",
- "(temp_tf_superconductor_margin)",
- tfcoil_variables.temp_tf_superconductor_margin,
- )
-
- po.ovarin(
- self.outfile,
- "Elastic properties behavior",
- "(i_tf_cond_eyoung_axial)",
- tfcoil_variables.i_tf_cond_eyoung_axial,
- )
- if tfcoil_variables.i_tf_cond_eyoung_axial == 0:
- po.ocmmnt(self.outfile, " Conductor stiffness neglected")
- elif tfcoil_variables.i_tf_cond_eyoung_axial == 1:
- po.ocmmnt(self.outfile, " Conductor stiffness is user-input")
- elif tfcoil_variables.i_tf_cond_eyoung_axial == 2:
- po.ocmmnt(
- self.outfile,
- " Conductor stiffness is set by material-specific default",
- )
-
- po.ovarre(
- self.outfile,
- "Conductor axial Youngs modulus",
- "(eyoung_cond_axial)",
- tfcoil_variables.eyoung_cond_axial,
- )
- po.ovarre(
- self.outfile,
- "Conductor transverse Youngs modulus",
- "(eyoung_cond_trans)",
- tfcoil_variables.eyoung_cond_trans,
- )
- else:
- # External casing
- po.osubhd(self.outfile, "Bucking cylinder information:")
- po.ovarre(
- self.outfile,
- "Casing cross section area (per leg) (m2)",
- "(a_tf_coil_inboard_case)",
- tfcoil_variables.a_tf_coil_inboard_case,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg case plasma side wall thickness (m)",
- "(dr_tf_plasma_case)",
- tfcoil_variables.dr_tf_plasma_case,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg plasma case area (m^2)",
- "(a_tf_plasma_case)",
- superconducting_tf_coil_variables.a_tf_plasma_case,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg bucking cylinder thickness (m)",
- "(dr_tf_nose_case)",
- tfcoil_variables.dr_tf_nose_case,
- )
- po.ovarre(
- self.outfile,
- 'Inboard leg case inboard "nose" area (m^2)',
- "(a_tf_coil_nose_case)",
- superconducting_tf_coil_variables.a_tf_coil_nose_case,
- )
-
- # Conductor layer geometry
- po.osubhd(self.outfile, "Inboard TFC conductor sector geometry:")
- po.ovarre(
- self.outfile,
- "Inboard TFC conductor sector area with gr insulation (per leg) (m2)",
- "(a_tf_wp_with_insulation)",
- superconducting_tf_coil_variables.a_tf_wp_with_insulation,
- )
- po.ovarre(
- self.outfile,
- "Inboard TFC conductor sector area, NO ground & gap (per leg) (m2)",
- "(a_tf_wp_no_insulation)",
- superconducting_tf_coil_variables.a_tf_wp_no_insulation,
- )
- po.ovarre(
- self.outfile,
- "Ground wall insulation area (m^2)",
- "(a_tf_wp_ground_insulation)",
- superconducting_tf_coil_variables.a_tf_wp_ground_insulation,
- )
- po.ovarre(
- self.outfile,
- "Inboard conductor sector radial thickness (m)",
- "(dr_tf_wp_with_insulation)",
- tfcoil_variables.dr_tf_wp_with_insulation,
- )
- if physics_variables.itart == 1:
- po.ovarre(
- self.outfile,
- "Central collumn top conductor sector radial thickness (m)",
- "(dr_tf_wp_top)",
- superconducting_tf_coil_variables.dr_tf_wp_top,
- )
-
- po.ovarre(
- self.outfile,
- "Ground wall insulation thickness (m)",
- "(dx_tf_wp_insulation)",
- tfcoil_variables.dx_tf_wp_insulation,
- )
- # Turn info
- po.osubhd(self.outfile, "Coil turn information:")
- po.ovarre(
- self.outfile,
- "Number of turns per TF leg",
- "(n_tf_coil_turns)",
- tfcoil_variables.n_tf_coil_turns,
- )
- po.ovarre(
- self.outfile,
- "Turn insulation thickness",
- "(dx_tf_turn_insulation)",
- tfcoil_variables.dx_tf_turn_insulation,
- )
- po.ovarre(
- self.outfile,
- "Mid-plane CP cooling fraction",
- "(fcoolcp)",
- tfcoil_variables.fcoolcp,
- )
- po.ovarre(
- self.outfile,
- "Area of resistive conductor per coil",
- "(a_res_tf_coil_conductor)",
- tfcoil_variables.a_res_tf_coil_conductor,
- )
- po.ovarre(
- self.outfile,
- "Outboard leg current per turn (A)",
- "(c_tf_turn)",
- tfcoil_variables.c_tf_turn,
- )
- po.ovarre(
- self.outfile,
- "Inboard leg conductor volume (m3)",
- "(vol_cond_cp)",
- tfcoil_variables.vol_cond_cp,
- )
- po.ovarre(
- self.outfile,
- "Outboard leg volume per coil (m3)",
- "(voltfleg)",
- tfcoil_variables.voltfleg,
- )
-
- # Coil masses
- po.osubhd(self.outfile, "TF coil mass:")
- po.ovarre(
- self.outfile,
- "Superconductor mass per coil (kg)",
- "(m_tf_coil_superconductor)",
- tfcoil_variables.m_tf_coil_superconductor,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Copper mass per coil (kg)",
- "(m_tf_coil_copper)",
- tfcoil_variables.m_tf_coil_copper,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Steel conduit mass per coil (kg)",
- "(m_tf_wp_steel_conduit)",
- tfcoil_variables.m_tf_wp_steel_conduit,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Conduit insulation mass per coil (kg)",
- "(m_tf_coil_wp_turn_insulation)",
- tfcoil_variables.m_tf_coil_wp_turn_insulation,
- "OP ",
- )
- if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- po.ovarre(
- self.outfile,
- "Total conduit mass per coil (kg)",
- "(m_tf_coil_conductor)",
- tfcoil_variables.m_tf_coil_conductor,
- "OP ",
- )
-
- if physics_variables.itart == 1:
- po.ovarre(
- self.outfile,
- "Mass of inboard legs (kg)",
- "(whtcp)",
- tfcoil_variables.whtcp,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Mass of outboard legs (kg)",
- "(whttflgs)",
- tfcoil_variables.whttflgs,
- "OP ",
- )
-
- po.ovarre(
- self.outfile,
- "Mass of each TF coil (kg)",
- "(m_tf_coils_total/n_tf_coils)",
- tfcoil_variables.m_tf_coils_total / tfcoil_variables.n_tf_coils,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Total TF coil mass (kg)",
- "(m_tf_coils_total)",
- tfcoil_variables.m_tf_coils_total,
- "OP ",
- )
-
- # TF current and field
- po.osubhd(self.outfile, "Maximum B field and currents:")
- po.ovarre(
- self.outfile,
- "Nominal peak field assuming toroidal symmetry (T)",
- "(b_tf_inboard_peak_symmetric)",
- tfcoil_variables.b_tf_inboard_peak_symmetric,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Radius of maximum field position on inboard TF coil (m)",
- "(r_b_tf_inboard_peak)",
- tfcoil_variables.r_b_tf_inboard_peak,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Total current in all TF coils (MA)",
- "(c_tf_total/1.D6)",
- 1.0e-6 * tfcoil_variables.c_tf_total,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "TF coil current (summed over all coils) (A)",
- "(c_tf_total)",
- tfcoil_variables.c_tf_total,
- )
- if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- po.ovarre(
- self.outfile,
- "Actual peak field at discrete conductor (T)",
- "(b_tf_inboard_peak_with_ripple)",
- tfcoil_variables.b_tf_inboard_peak_with_ripple,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Ratio of peak field with ripple to nominal axisymmetric peak field",
- "(f_b_tf_inboard_peak_ripple_symmetric)",
- superconducting_tf_coil_variables.f_b_tf_inboard_peak_ripple_symmetric,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Winding pack current density (A/m2)",
- "(j_tf_wp)",
- tfcoil_variables.j_tf_wp,
- "OP ",
- )
-
- po.ovarre(
- self.outfile,
- "Inboard leg mid-plane conductor current density (A/m2)",
- "(oacdcp)",
- tfcoil_variables.oacdcp,
- )
- if physics_variables.itart == 1:
- po.ovarre(
- self.outfile,
- "Outboard leg conductor current density (A/m2)",
- "(cdtfleg)",
- tfcoil_variables.cdtfleg,
- )
- po.ovarre(
- self.outfile,
- "Self inductance of a TF coil (H)",
- "(ind_tf_coil)",
- tfcoil_variables.ind_tf_coil,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Total stored energy in TF coils (GJ)",
- "(e_tf_magnetic_stored_total_gj)",
- tfcoil_variables.e_tf_magnetic_stored_total_gj,
- "OP ",
- )
-
- po.ovarre(
- self.outfile,
- "Total magnetic energy in a TF coil (J)",
- "(e_tf_coil_magnetic_stored)",
- tfcoil_variables.e_tf_coil_magnetic_stored,
- "OP ",
- )
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "----------------------------")
# TF forces
po.osubhd(self.outfile, "TF Forces:")
@@ -1776,7 +1158,14 @@ def outtf(self):
)
po.ovarre(
self.outfile,
- "inboard vertical tension fraction (-)",
+ "Total inboard vertical tension (N)",
+ "(vforce_inboard_total)",
+ superconducting_tf_coil_variables.vforce_inboard_tot,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard vertical tension fraction (-)",
"(f_vforce_inboard)",
tfcoil_variables.f_vforce_inboard,
"OP ",
@@ -1788,468 +1177,7 @@ def outtf(self):
tfcoil_variables.cforce,
"OP ",
)
-
- # Resistive coil parameters
- if tfcoil_variables.i_tf_sup != TFConductorModel.SUPERCONDUCTING:
- po.osubhd(self.outfile, "Resitive loss parameters:")
- if tfcoil_variables.i_tf_sup == TFConductorModel.WATER_COOLED_COPPER:
- po.ocmmnt(
- self.outfile,
- "Resistive Material : GLIDCOP AL-15 - Dispersion "
- "Strengthened Copper",
- )
- elif tfcoil_variables.i_tf_sup == TFConductorModel.HELIUM_COOLED_ALUMINIUM:
- po.ocmmnt(
- self.outfile, "Resistive Material : Pure Aluminium (99.999+ %)"
- )
-
- if physics_variables.itart == 1:
- po.ovarre(
- self.outfile,
- "CP resistivity (ohm.m)",
- "(rho_cp)",
- tfcoil_variables.rho_cp,
- )
- po.ovarre(
- self.outfile,
- "Leg resistivity (ohm.m)",
- "(rho_tf_leg)",
- tfcoil_variables.rho_tf_leg,
- )
- po.ovarre(
- self.outfile,
- "CP resistive power loss (W)",
- "(p_cp_resistive)",
- tfcoil_variables.p_cp_resistive,
- )
- po.ovarre(
- self.outfile,
- "Total legs resitive power loss, (W)",
- "(p_tf_leg_resistive)",
- tfcoil_variables.p_tf_leg_resistive,
- )
- po.ovarre(
- self.outfile,
- "joints resistive power loss (W)",
- "(p_tf_joints_resistive)",
- tfcoil_variables.p_tf_joints_resistive,
- )
- po.ovarre(
- self.outfile,
- "Outboard leg resistance per coil (ohm)",
- "(res_tf_leg)",
- tfcoil_variables.res_tf_leg,
- )
- po.ovarre(
- self.outfile,
- "Average CP temperature (K)",
- "(temp_cp_average)",
- tfcoil_variables.temp_cp_average,
- )
- po.ovarre(
- self.outfile,
- "Average leg temperature (K)",
- "(temp_tf_legs_outboard)",
- tfcoil_variables.temp_tf_legs_outboard,
- )
-
- else:
- po.ovarre(
- self.outfile,
- "TF resistivity (ohm.m)",
- "(p_cp_resistive)",
- tfcoil_variables.rho_cp,
- )
- po.ovarre(
- self.outfile,
- "TF coil resistive power less (total) (ohm.m)",
- "(p_cp_resistive)",
- tfcoil_variables.p_cp_resistive,
- )
- po.ovarre(
- self.outfile,
- "Average coil temperature (K)",
- "(temp_cp_average)",
- tfcoil_variables.temp_cp_average,
- )
-
- # Ripple calculations
- po.osubhd(self.outfile, "Ripple information:")
- if tfcoil_variables.i_tf_shape == TFCoilShapeModel.D_SHAPE:
- po.ovarre(
- self.outfile,
- "Max allowed tfcoil_variables.ripple amplitude at plasma outboard "
- "midplane (%)",
- "(ripple_b_tf_plasma_edge_max)",
- tfcoil_variables.ripple_b_tf_plasma_edge_max,
- )
- po.ovarre(
- self.outfile,
- "Ripple amplitude at plasma outboard midplane (%)",
- "(ripple_b_tf_plasma_edge)",
- tfcoil_variables.ripple_b_tf_plasma_edge,
- "OP ",
- )
- else:
- po.ovarre(
- self.outfile,
- "Max allowed tfcoil_variables.ripple amplitude at plasma (%)",
- "(ripple_b_tf_plasma_edge_max)",
- tfcoil_variables.ripple_b_tf_plasma_edge_max,
- )
- po.ovarre(
- self.outfile,
- "Ripple at plasma edge (%)",
- "(ripple_b_tf_plasma_edge)",
- tfcoil_variables.ripple_b_tf_plasma_edge,
- )
- po.ocmmnt(
- self.outfile,
- " Ripple calculation to be re-defined for picure frame coils",
- )
-
- # Quench information
- if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- po.osubhd(self.outfile, "Quench information :")
- po.ovarre(
- self.outfile,
- "Actual quench time (or time constant) (s)",
- "(t_tf_superconductor_quench)",
- tfcoil_variables.t_tf_superconductor_quench,
- )
- po.ovarre(
- self.outfile,
- "Vacuum Vessel stress on quench (Pa)",
- "(vv_stress_quench)",
- superconducting_tf_coil_variables.vv_stress_quench,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Maximum allowed voltage during quench due to insulation (kV)",
- "(v_tf_coil_dump_quench_max_kv)",
- tfcoil_variables.v_tf_coil_dump_quench_max_kv,
- )
- po.ovarre(
- self.outfile,
- "Actual quench voltage (kV)",
- "(v_tf_coil_dump_quench_kv)",
- tfcoil_variables.v_tf_coil_dump_quench_kv,
- "OP ",
- )
-
- if tfcoil_variables.i_tf_sc_mat in {1, 2, 3, 4, 5}:
- po.ovarre(
- self.outfile,
- "Maximum allowed temp during a quench (K)",
- "(temp_tf_conductor_quench_max)",
- tfcoil_variables.temp_tf_conductor_quench_max,
- )
- elif tfcoil_variables == 6:
- po.ocmmnt(self.outfile, "CroCo cable with jacket: ")
-
- if 75 in numerics.icc:
- po.ovarre(
- self.outfile,
- "Maximum permitted TF coil current / copper area (A/m2)",
- "(copperA_m2_max)",
- rebco_variables.coppera_m2_max,
- )
-
- po.ovarre(
- self.outfile,
- "Actual TF coil current / copper area (A/m2)",
- "(copperA_m2)",
- rebco_variables.coppera_m2,
- )
-
- # TF coil radial build
- po.osubhd(self.outfile, "Radial build of TF coil centre-line :")
-
- radius = self.data.build.r_tf_inboard_in
- po.obuild(self.outfile, "Innermost edge of TF coil", radius, radius)
-
- # Radial build for SC TF coils
- if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
- radius += tfcoil_variables.dr_tf_nose_case
- po.obuild(
- self.outfile,
- 'Coil case ("nose")',
- tfcoil_variables.dr_tf_nose_case,
- radius,
- "(dr_tf_nose_case)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insertion_gap
- po.obuild(
- self.outfile,
- "Insertion gap for winding pack",
- tfcoil_variables.dx_tf_wp_insertion_gap,
- radius,
- "(dx_tf_wp_insertion_gap)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insulation
- po.obuild(
- self.outfile,
- "Winding pack ground insulation",
- tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dx_tf_wp_insulation)",
- )
-
- radius = (
- radius
- + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
- - tfcoil_variables.dx_tf_wp_insulation
- - tfcoil_variables.dx_tf_wp_insertion_gap
- )
- po.obuild(
- self.outfile,
- "Winding - first half",
- tfcoil_variables.dr_tf_wp_with_insulation / 2e0
- - tfcoil_variables.dx_tf_wp_insulation
- - tfcoil_variables.dx_tf_wp_insertion_gap,
- radius,
- "(dr_tf_wp_with_insulation/2-dx_tf_wp_insulation"
- "-dx_tf_wp_insertion_gap)",
- )
-
- radius = (
- radius
- + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
- - tfcoil_variables.dx_tf_wp_insulation
- - tfcoil_variables.dx_tf_wp_insertion_gap
- )
- po.obuild(
- self.outfile,
- "Winding - second half",
- tfcoil_variables.dr_tf_wp_with_insulation / 2e0
- - tfcoil_variables.dx_tf_wp_insulation
- - tfcoil_variables.dx_tf_wp_insertion_gap,
- radius,
- "(dr_tf_wp_with_insulation/2-dx_tf_wp_insulation"
- "-dx_tf_wp_insertion_gap)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insulation
- po.obuild(
- self.outfile,
- "Winding pack insulation",
- tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dx_tf_wp_insulation)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insertion_gap
- po.obuild(
- self.outfile,
- "Insertion gap for winding pack",
- tfcoil_variables.dx_tf_wp_insertion_gap,
- radius,
- "(dx_tf_wp_insertion_gap)",
- )
-
- radius += tfcoil_variables.dr_tf_plasma_case
- po.obuild(
- self.outfile,
- "Plasma side case min radius",
- tfcoil_variables.dr_tf_plasma_case,
- radius,
- "(dr_tf_plasma_case)",
- )
-
- po.obuild(
- self.outfile,
- "Plasma side case max radius",
- self.data.build.r_tf_inboard_out,
- radius,
- "(r_tf_inboard_out)",
- )
-
- # Radial build for restive coil
- else:
- radius += tfcoil_variables.dr_tf_nose_case
- po.obuild(
- self.outfile,
- "Coil bucking cylindre",
- tfcoil_variables.dr_tf_nose_case,
- radius,
- "(dr_tf_nose_case)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insulation
- po.obuild(
- self.outfile,
- "Conductor ground insulation",
- tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dx_tf_wp_insulation)",
- )
-
- radius = (
- radius
- + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
- - tfcoil_variables.dx_tf_wp_insulation
- )
- po.obuild(
- self.outfile,
- "Conductor - first half",
- tfcoil_variables.dr_tf_wp_with_insulation / 2e0
- - tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(tfcoil_variables.dr_tf_wp_with_insulation/2"
- "-tfcoil_variables.dx_tf_wp_insulation)",
- )
-
- radius = (
- radius
- + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
- - tfcoil_variables.dx_tf_wp_insulation
- )
- po.obuild(
- self.outfile,
- "Conductor - second half",
- tfcoil_variables.dr_tf_wp_with_insulation / 2e0
- - tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(tfcoil_variables.dr_tf_wp_with_insulation/2"
- "-tfcoil_variables.dx_tf_wp_insulation)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insulation
- po.obuild(
- self.outfile,
- "Conductor ground insulation",
- tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dx_tf_wp_insulation)",
- )
-
- radius += tfcoil_variables.dr_tf_plasma_case
- po.obuild(
- self.outfile,
- "Plasma side TF coil support",
- tfcoil_variables.dr_tf_plasma_case,
- radius,
- "(dr_tf_plasma_case)",
- )
-
- # Radial build consistency check
- if not (
- abs(radius - self.data.build.r_tf_inboard_in - self.data.build.dr_tf_inboard)
- < 10.0e0 * np.finfo(float(radius)).eps
- ):
- logger.error(
- "TF coil dimensions are not consistent. Radius of plasma-facing side "
- "of inner leg should be "
- f"{self.data.build.r_tf_inboard_in + self.data.build.dr_tf_inboard}m"
- )
-
- tf_total_height = (
- self.data.build.dh_tf_inner_bore + 2 * self.data.build.dr_tf_inboard
- )
- tf_total_width = (
- self.data.build.dr_tf_inner_bore
- + self.data.build.dr_tf_inboard
- + self.data.build.dr_tf_outboard
- )
po.oblnkl(self.outfile)
- po.obuild(
- self.outfile,
- "Total height and width of TFC [m]",
- tf_total_height,
- tf_total_width,
- )
-
- # Top section TF coil radial build (physics_variables.itart = 1 only)
- if (
- physics_variables.itart == 1
- and tfcoil_variables.i_tf_sup != TFConductorModel.SUPERCONDUCTING
- ):
- po.osubhd(self.outfile, "Radial build of TF coil at central collumn top :")
- # write(self.outfile,5)
-
- # Restart the radial build at bucking cylindre inner radius
- radius = self.data.build.r_tf_inboard_in
- po.obuild(self.outfile, "Innermost edge of TF coil", radius, radius)
-
- radius += tfcoil_variables.dr_tf_nose_case
- po.obuild(
- self.outfile,
- "Coil bucking cylindre",
- tfcoil_variables.dr_tf_nose_case,
- radius,
- "(dr_tf_nose_case)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insulation
- po.obuild(
- self.outfile,
- "Conductor ground insulation",
- tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dx_tf_wp_insulation)",
- )
-
- radius = (
- radius
- + 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
- - tfcoil_variables.dx_tf_wp_insulation
- )
- po.obuild(
- self.outfile,
- "Conductor - first half",
- 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
- - tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dr_tf_wp_top/2-dx_tf_wp_insulation)",
- )
-
- radius = (
- radius
- + 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
- - tfcoil_variables.dx_tf_wp_insulation
- )
- po.obuild(
- self.outfile,
- "Conductor - second half",
- 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
- - tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dr_tf_wp_top/2-dx_tf_wp_insulation)",
- )
-
- radius += tfcoil_variables.dx_tf_wp_insulation
- po.obuild(
- self.outfile,
- "Conductor ground insulation",
- tfcoil_variables.dx_tf_wp_insulation,
- radius,
- "(dx_tf_wp_insulation)",
- )
-
- radius += tfcoil_variables.dr_tf_plasma_case
- po.obuild(
- self.outfile,
- "Plasma side TF coil support",
- tfcoil_variables.dr_tf_plasma_case,
- radius,
- "(dr_tf_plasma_case)",
- )
-
- # Consistency check
- if abs(radius - self.data.build.r_cp_top) < np.finfo(float(radius)).eps:
- po.ocmmnt(self.outfile, "Top TF coil dimensions are consistent")
- else:
- po.ocmmnt(self.outfile, "ERROR: TF coil dimensions are NOT consistent:")
- po.ovarre(
- self.outfile,
- "Radius of plasma-facing side of inner leg SHOULD BE [m]",
- "",
- self.data.build.r_cp_top,
- )
- po.oblnkl(self.outfile)
@staticmethod
def circumference(aaa, bbb):
diff --git a/process/models/tfcoil/resistive.py b/process/models/tfcoil/resistive.py
index f121a44af..d743903dc 100644
--- a/process/models/tfcoil/resistive.py
+++ b/process/models/tfcoil/resistive.py
@@ -56,7 +56,7 @@ def run(self, output: bool = False):
)
(
- superconducting_tf_coil_variables.e_tf_magnetic_stored_total,
+ tfcoil_variables.e_tf_magnetic_stored_total,
tfcoil_variables.e_tf_magnetic_stored_total_gj,
tfcoil_variables.e_tf_coil_magnetic_stored,
) = self.tf_stored_magnetic_energy(
@@ -270,7 +270,7 @@ def run(self, output: bool = False):
tfcoil_variables.sig_tf_case = 0.0e0
tfcoil_variables.sig_tf_wp = 0.0e0
if output:
- self.outtf()
+ self.output_general_tf_info()
def res_tf_internal_geom(self):
"""
diff --git a/process/models/tfcoil/superconducting.py b/process/models/tfcoil/superconducting.py
index 21f2a2242..d654faafa 100644
--- a/process/models/tfcoil/superconducting.py
+++ b/process/models/tfcoil/superconducting.py
@@ -15,6 +15,7 @@
from process.data_structure import (
divertor_variables,
global_variables,
+ numerics,
pfcoil_variables,
physics_variables,
rebco_variables,
@@ -22,9 +23,15 @@
tfcoil_variables,
)
from process.models import superconductors
-from process.models.superconductors import SuperconductorMaterial, SuperconductorModel
+from process.models.superconductors import (
+ N_CROCO_STRANDS_TURN,
+ CroCoCableGeometry,
+ SuperconductorMaterial,
+ SuperconductorModel,
+ calculate_croco_cable_geometry,
+)
from process.models.tfcoil import quench
-from process.models.tfcoil.base import TFCoil, TFPlasmaCaseType
+from process.models.tfcoil.base import TFCoil, TFConductorModel, TFPlasmaCaseType
logger = logging.getLogger(__name__)
@@ -94,6 +101,18 @@ class TFWPGeometry:
a_tf_wp_ground_insulation: float
+@dataclass
+class TFSuperconductorLimits:
+ j_tf_wp_critical: float
+ j_superconductor_critical: float
+ f_c_tf_turn_operating_critical: float
+ j_superconductor: float
+ j_tf_coil_turn: float
+ bc20m: float
+ tc0m: float
+ c_turn_cables_critical: float
+
+
class SuperconductingTFCoil(TFCoil):
"""Class for superconducting TF coil model, inheriting from the base TFCoil
class.
@@ -104,8 +123,9 @@ def __init__(self):
def output(self):
"""Output routine for superconducting TF coil model."""
- self.outtf()
+ self.output_general_tf_info()
self.run_base_superconducting_tf()
+ self.output_general_superconducting_tf_info()
self.output_tf_superconductor_info()
tfcoil_variables.n_rad_per_layer = 500
@@ -377,7 +397,7 @@ def run_base_superconducting_tf(self):
)
(
- superconducting_tf_coil_variables.e_tf_magnetic_stored_total,
+ tfcoil_variables.e_tf_magnetic_stored_total,
tfcoil_variables.e_tf_magnetic_stored_total_gj,
tfcoil_variables.e_tf_coil_magnetic_stored,
) = self.tf_stored_magnetic_energy(
@@ -423,192 +443,1322 @@ def run_base_superconducting_tf(self):
)
# ======================================================
- def output_tf_superconductor_info(self):
- """Output TF superconductor information"""
- po.oheadr(self.outfile, "TF Coils Superconductor Information")
- po.ovarin(
- self.outfile,
- "TF superconductor switch",
- "(i_tf_sc_mat)",
- tfcoil_variables.i_tf_sc_mat,
- )
+ def output_general_superconducting_tf_info(self) -> None:
+ """Output general TF coil information that is relevant for superconducting
+ TF coils.
+ Should only be info calculated in the `SuperconductingTFCoil` class, not the
+ base `TFCoil` class, which is relevant for all TF coil types.
- po.ocmmnt(
- self.outfile,
- f"Superconductor used: "
- f"{SuperconductorModel(tfcoil_variables.i_tf_sc_mat).full_name}",
- )
+ """
+ po.oheadr(self.outfile, "General Superconducting TF Coil Parameters ")
+ # Turn/WP gemoetry
+ if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
+ # Total material fraction
+ po.osubhd(self.outfile, "Global material area/fractions:")
- po.ovarre(
- self.outfile,
- "Critical field at zero temperature and strain (T)",
- "(b_tf_superconductor_critical_zero_temp_strain)",
- superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain,
- )
- po.ovarre(
- self.outfile,
- "Critical temperature at zero field and strain (K)",
- "(temp_tf_superconductor_critical_zero_field_strain)",
- superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain,
- )
+ po.ovarre(
+ self.outfile,
+ "Total steel cross-section (m²)",
+ "(a_tf_coil_inboard_steel*n_tf_coils)",
+ superconducting_tf_coil_variables.a_tf_coil_inboard_steel
+ * tfcoil_variables.n_tf_coils,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total steel TF fraction",
+ "(f_a_tf_coil_inboard_steel)",
+ superconducting_tf_coil_variables.f_a_tf_coil_inboard_steel,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total Insulation cross-section (total) (m²)",
+ "(a_tf_coil_inboard_insulation*n_tf_coils)",
+ superconducting_tf_coil_variables.a_tf_coil_inboard_insulation
+ * tfcoil_variables.n_tf_coils,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total Insulation fraction",
+ "(f_a_tf_coil_inboard_insulation)",
+ superconducting_tf_coil_variables.f_a_tf_coil_inboard_insulation,
+ )
- if global_variables.run_tests == 1:
- po.oblnkl(self.outfile)
- po.ocmmnt(
+ # External casing
+ po.osubhd(self.outfile, "External steel Case Information :")
+ po.ovarre(
self.outfile,
- "PROCESS TF Coil peak field fit. Values for t, z and y:",
+ "Casing cross section area (per leg) (m²)",
+ "(a_tf_coil_inboard_case)",
+ tfcoil_variables.a_tf_coil_inboard_case,
)
- po.oblnkl(self.outfile)
+
po.ovarre(
self.outfile,
- "Dimensionless winding pack width",
- "(tf_fit_t)",
- superconducting_tf_coil_variables.tf_fit_t,
+ "Inboard leg plasma case area (m²)",
+ "(a_tf_plasma_case)",
+ superconducting_tf_coil_variables.a_tf_plasma_case,
+ )
+
+ po.ovarre(
+ self.outfile,
+ 'Inboard leg case inboard "nose" area (m^2)',
+ "(a_tf_coil_nose_case)",
+ superconducting_tf_coil_variables.a_tf_coil_nose_case,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Inboard leg case sidewall average thickness (m)",
+ "(dx_tf_side_case_average)",
+ superconducting_tf_coil_variables.dx_tf_side_case_average,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard leg case sidewall peak thickness (m)",
+ "(dx_tf_side_case_peak)",
+ superconducting_tf_coil_variables.dx_tf_side_case_peak,
+ )
+ po.ovarre(
+ self.outfile,
+ "External case mass per coil (kg)",
+ "(m_tf_coil_case)",
+ tfcoil_variables.m_tf_coil_case,
"OP ",
)
+
+ # Winding pack structure
+ po.osubhd(self.outfile, "TF winding pack (WP) geometry:")
po.ovarre(
self.outfile,
- "Dimensionless winding pack radial thickness",
- "(tf_fit_z)",
- superconducting_tf_coil_variables.tf_fit_z,
+ "WP cross section area with insulation and insertion (per coil) (m²)",
+ "(a_tf_wp_with_insulation)",
+ superconducting_tf_coil_variables.a_tf_wp_with_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Minimum toroidal thickness of winding pack (m)",
+ "(dx_tf_wp_toroidal_min)",
+ superconducting_tf_coil_variables.dx_tf_wp_toroidal_min,
"OP ",
)
po.ovarre(
self.outfile,
- "Ratio of peak field with ripple to nominal axisymmetric peak field",
- "(f_b_tf_inboard_peak_ripple_symmetric)",
- superconducting_tf_coil_variables.f_b_tf_inboard_peak_ripple_symmetric,
+ "WP cross section area with no insulation and insertion (per coil) (m²)",
+ "(a_tf_wp_no_insulation)",
+ superconducting_tf_coil_variables.a_tf_wp_no_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total steel area in WP (per coil) (m²)",
+ "(a_tf_wp_steel)",
+ tfcoil_variables.a_tf_wp_steel,
+ )
+ po.ovarre(
+ self.outfile,
+ "Winding pack radial thickness (m)",
+ "(dr_tf_wp_with_insulation)",
+ tfcoil_variables.dr_tf_wp_with_insulation,
"OP ",
)
+ if tfcoil_variables.i_tf_turns_integer == 1:
+ po.ovarre(
+ self.outfile,
+ "Winding pack toroidal width (m)",
+ "(dx_tf_wp_primary_toroidal)",
+ tfcoil_variables.dx_tf_wp_primary_toroidal,
+ "OP ",
+ )
+ else:
+ po.ovarre(
+ self.outfile,
+ "Winding pack toroidal width 1 (m)",
+ "(dx_tf_wp_primary_toroidal)",
+ tfcoil_variables.dx_tf_wp_primary_toroidal,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Winding pack toroidal width 2 (m)",
+ "(dx_tf_wp_secondary_toroidal)",
+ tfcoil_variables.dx_tf_wp_secondary_toroidal,
+ "OP ",
+ )
- po.oblnkl(self.outfile)
- po.ovarre(
- self.outfile,
- "Helium temperature at peak field (= superconductor temperature) (K)",
- "(tftmp)",
- tfcoil_variables.tftmp,
- )
- po.ovarre(
- self.outfile,
- "Total cooling area fraction inside cable space",
- "(f_a_tf_turn_cable_space_cooling)",
- superconducting_tf_coil_variables.f_a_tf_turn_cable_space_cooling,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Copper fraction of conductor",
- "(f_a_tf_turn_cable_copper)",
- tfcoil_variables.f_a_tf_turn_cable_copper,
- )
- po.ovarre(
- self.outfile,
- "Residual manufacturing strain on superconductor",
- "(str_tf_con_res)",
- tfcoil_variables.str_tf_con_res,
- )
- po.ovarre(
- self.outfile,
- "Self-consistent strain on superconductor",
- "(str_wp)",
- tfcoil_variables.str_wp,
- )
- po.ovarre(
- self.outfile,
- "Critical current density in superconductor (A/m2)",
- "(j_tf_superconductor_critical)",
- superconducting_tf_coil_variables.j_tf_superconductor_critical,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Critical current density in winding pack (A/m2)",
- "(j_tf_wp_critical)",
- tfcoil_variables.j_tf_wp_critical,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Actual current density in winding pack (A/m2)",
- "(j_tf_coil_turn)",
- superconducting_tf_coil_variables.j_tf_coil_turn,
- "OP ",
- )
-
- po.ovarre(
- self.outfile,
- "Minimum allowed temperature margin in superconductor (K)",
- "(temp_tf_superconductor_margin_min)",
- tfcoil_variables.temp_tf_superconductor_margin_min,
- )
- po.ovarre(
- self.outfile,
- "Actual temperature margin in superconductor (K)",
- "(temp_tf_superconductor_margin)",
- tfcoil_variables.temp_tf_superconductor_margin,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Critical current (A)",
- "(c_turn_cables_critical)",
- superconducting_tf_coil_variables.c_tf_turn_cables_critical,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Actual current (A)",
- "(c_tf_turn)",
- tfcoil_variables.c_tf_turn,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Actual current / critical current",
- "(f_c_tf_turn_operating_critical)",
- superconducting_tf_coil_variables.f_c_tf_turn_operating_critical,
- "OP ",
- )
- if superconducting_tf_coil_variables.f_c_tf_turn_operating_critical > 0.7:
- logger.error(
- "f_c_tf_turn_operating_critical shouldn't be above 0.7 for engineering "
- "reliability"
+ po.ovarre(
+ self.outfile,
+ "Ground wall insulation thickness (m)",
+ "(dx_tf_wp_insulation)",
+ tfcoil_variables.dx_tf_wp_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Ground wall insulation area (m²)",
+ "(a_tf_wp_ground_insulation)",
+ superconducting_tf_coil_variables.a_tf_wp_ground_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Winding pack insertion gap (m)",
+ "(dx_tf_wp_insertion_gap)",
+ tfcoil_variables.dx_tf_wp_insertion_gap,
)
- po.ovarre(
- self.outfile,
- "TF Superconductor quench dump time (s)",
- "(t_tf_superconductor_quench)",
- tfcoil_variables.t_tf_superconductor_quench,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "TF Superconductor quench detection time (s)",
- "(t_tf_quench_detection)",
- tfcoil_variables.t_tf_quench_detection,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Maximum winding pack current density for protection (A/m2)",
- "(j_tf_wp_quench_heat_max)",
- tfcoil_variables.j_tf_wp_quench_heat_max,
- "OP ",
- )
+ # WP material fraction
+ po.osubhd(self.outfile, "TF winding pack (WP) material area/fractions:")
+ po.ovarre(
+ self.outfile,
+ "Steel WP cross-section (total) (m²)",
+ "(a_tf_wp_steel*n_tf_coils)",
+ tfcoil_variables.a_tf_wp_steel * tfcoil_variables.n_tf_coils,
+ )
+ po.ovarre(
+ self.outfile,
+ "Steel WP fraction",
+ "(a_tf_wp_steel/a_tf_wp_with_insulation)",
+ tfcoil_variables.a_tf_wp_steel
+ / superconducting_tf_coil_variables.a_tf_wp_with_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Insulation WP fraction",
+ "(a_tf_coil_wp_turn_insulation/a_tf_wp_with_insulation)",
+ tfcoil_variables.a_tf_coil_wp_turn_insulation
+ / superconducting_tf_coil_variables.a_tf_wp_with_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Cable WP fraction",
+ "((a_tf_wp_with_insulation-a_tf_wp_steel-a_tf_coil_wp_turn_insulation)/a_tf_wp_with_insulation)",
+ (
+ superconducting_tf_coil_variables.a_tf_wp_with_insulation
+ - tfcoil_variables.a_tf_wp_steel
+ - tfcoil_variables.a_tf_coil_wp_turn_insulation
+ )
+ / superconducting_tf_coil_variables.a_tf_wp_with_insulation,
+ )
- @staticmethod
- def calculate_superconductor_temperature_margin(
- i_tf_superconductor: int,
- j_superconductor: float,
- b_tf_inboard_peak: float,
- strain: float,
- bc20m: float,
- tc0m: float,
- c0: float,
- temp_tf_coolant_peak_field: float,
- ):
- """Calculate the temperature margin of the TF superconductor.
+ # Number of turns
+ po.osubhd(self.outfile, "WP turn information:")
+ po.ovarin(
+ self.outfile,
+ "Turn parameterisation",
+ "(i_tf_turns_integer)",
+ tfcoil_variables.i_tf_turns_integer,
+ )
+ if tfcoil_variables.i_tf_turns_integer == 0:
+ po.ocmmnt(self.outfile, " Non-integer number of turns")
+ else:
+ po.ocmmnt(self.outfile, " Integer number of turns")
+
+ po.ovarre(
+ self.outfile,
+ "Number of turns per TF coil",
+ "(n_tf_coil_turns)",
+ tfcoil_variables.n_tf_coil_turns,
+ "OP ",
+ )
+ if tfcoil_variables.i_tf_turns_integer == 1:
+ po.ovarin(
+ self.outfile,
+ "Number of TF pancakes",
+ "(n_tf_wp_pancakes)",
+ tfcoil_variables.n_tf_wp_pancakes,
+ )
+ po.ovarin(
+ self.outfile,
+ "Number of TF layers",
+ "(n_tf_wp_layers)",
+ tfcoil_variables.n_tf_wp_layers,
+ )
+
+ po.oblnkl(self.outfile)
+
+ if tfcoil_variables.i_tf_turns_integer == 1:
+ po.ovarre(
+ self.outfile,
+ "Radial width of turn (m)",
+ "(dr_tf_turn)",
+ superconducting_tf_coil_variables.dr_tf_turn,
+ )
+ po.ovarre(
+ self.outfile,
+ "Toroidal width of turn (m)",
+ "(dx_tf_turn)",
+ superconducting_tf_coil_variables.dx_tf_turn,
+ )
+ po.ovarre(
+ self.outfile,
+ "Radial width of conductor (m)",
+ "(t_conductor_radial)",
+ superconducting_tf_coil_variables.t_conductor_radial,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Toroidal width of conductor (m)",
+ "(t_conductor_toroidal)",
+ superconducting_tf_coil_variables.t_conductor_toroidal,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Radial width of cable space",
+ "(dr_tf_turn_cable_space)",
+ superconducting_tf_coil_variables.dr_tf_turn_cable_space,
+ )
+ po.ovarre(
+ self.outfile,
+ "Toroidal width of cable space",
+ "(dx_tf_turn_cable_space)",
+ superconducting_tf_coil_variables.dx_tf_turn_cable_space,
+ )
+ po.ovarre(
+ self.outfile,
+ "Radius of turn cable space rounded corners (m)",
+ "(radius_tf_turn_cable_space_corners)",
+ superconducting_tf_coil_variables.radius_tf_turn_cable_space_corners,
+ )
+ else:
+ po.ovarre(
+ self.outfile,
+ "Width of turn including inter-turn insulation (m)",
+ "(dx_tf_turn_general)",
+ tfcoil_variables.dx_tf_turn_general,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Width of conductor (square) (m)",
+ "(t_conductor)",
+ tfcoil_variables.t_conductor,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Width of space inside conductor (m)",
+ "(dx_tf_turn_cable_space_average)",
+ superconducting_tf_coil_variables.dx_tf_turn_cable_space_average,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Radius of turn cable space rounded corners (m)",
+ "(radius_tf_turn_cable_space_corners)",
+ superconducting_tf_coil_variables.radius_tf_turn_cable_space_corners,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Steel conduit thickness (m)",
+ "(dx_tf_turn_steel)",
+ tfcoil_variables.dx_tf_turn_steel,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inter-turn insulation thickness (m)",
+ "(dx_tf_turn_insulation)",
+ tfcoil_variables.dx_tf_turn_insulation,
+ )
+
+ if tfcoil_variables.i_tf_sc_mat in {1, 2, 3, 4, 5, 7, 8, 9}:
+ po.osubhd(self.outfile, "Conductor information:")
+ po.ovarre(
+ self.outfile,
+ "Diameter of central helium channel in cable",
+ "(dia_tf_turn_coolant_channel)",
+ tfcoil_variables.dia_tf_turn_coolant_channel,
+ )
+ po.ovarre(
+ self.outfile,
+ "Diameter of superconducting cable",
+ "(dia_tf_turn_superconducting_cable)",
+ superconducting_tf_coil_variables.dia_tf_turn_superconducting_cable,
+ )
+ po.ovarre(
+ self.outfile,
+ "Number of superconducting cables per turn",
+ "(n_tf_turn_superconducting_cables)",
+ superconducting_tf_coil_variables.n_tf_turn_superconducting_cables,
+ )
+ po.ovarre(
+ self.outfile,
+ "Length of superconductor in TF coil (m)",
+ "(len_tf_coil_superconductor)",
+ superconducting_tf_coil_variables.len_tf_coil_superconductor,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total length of superconductor in all TF coils (m)",
+ "(len_tf_superconductor_total)",
+ superconducting_tf_coil_variables.len_tf_superconductor_total,
+ )
+ po.ocmmnt(self.outfile, "Fractions by area")
+ po.ovarre(
+ self.outfile,
+ "internal area of the cable space",
+ "(a_tf_turn_cable_space_no_void)",
+ tfcoil_variables.a_tf_turn_cable_space_no_void,
+ )
+ po.ovarre(
+ self.outfile,
+ "True area of turn cable space with gaps and channels removed",
+ "(a_tf_turn_cable_space_effective)",
+ superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Coolant fraction in conductor excluding central channel",
+ "(f_a_tf_turn_cable_space_extra_void)",
+ tfcoil_variables.f_a_tf_turn_cable_space_extra_void,
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of steel in turn",
+ "(a_tf_turn_steel)",
+ tfcoil_variables.a_tf_turn_steel,
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of all turn insulation in WP",
+ "(a_tf_coil_wp_turn_insulation)",
+ tfcoil_variables.a_tf_coil_wp_turn_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total insulation area in TF coil (turn and WP)",
+ "(a_tf_coil_inboard_insulation)",
+ superconducting_tf_coil_variables.a_tf_coil_inboard_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total steel area in inboard TF coil (turn and case)",
+ "(a_tf_coil_inboard_steel)",
+ superconducting_tf_coil_variables.a_tf_coil_inboard_steel,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total conductor area in WP",
+ "(a_tf_wp_conductor)",
+ tfcoil_variables.a_tf_wp_conductor,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total additional void area in WP",
+ "(a_tf_wp_extra_void)",
+ tfcoil_variables.a_tf_wp_extra_void,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Area of all coolant channels in WP",
+ "(a_tf_wp_coolant_channels)",
+ tfcoil_variables.a_tf_wp_coolant_channels,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Copper fraction of conductor",
+ "(f_a_tf_turn_cable_copper)",
+ tfcoil_variables.f_a_tf_turn_cable_copper,
+ )
+ po.ovarre(
+ self.outfile,
+ "Superconductor fraction of conductor",
+ "(1-f_a_tf_turn_cable_copper)",
+ 1 - tfcoil_variables.f_a_tf_turn_cable_copper,
+ )
+ ap = (
+ tfcoil_variables.a_tf_wp_conductor
+ + tfcoil_variables.n_tf_coil_turns * tfcoil_variables.a_tf_turn_steel
+ + tfcoil_variables.a_tf_coil_wp_turn_insulation
+ + tfcoil_variables.a_tf_wp_extra_void
+ + tfcoil_variables.a_tf_wp_coolant_channels
+ )
+ po.ovarrf(
+ self.outfile,
+ "Check total area fractions in winding pack = 1",
+ "",
+ (
+ tfcoil_variables.a_tf_wp_conductor
+ + tfcoil_variables.n_tf_coil_turns
+ * tfcoil_variables.a_tf_turn_steel
+ + tfcoil_variables.a_tf_coil_wp_turn_insulation
+ + tfcoil_variables.a_tf_wp_extra_void
+ + tfcoil_variables.a_tf_wp_coolant_channels
+ )
+ / ap,
+ )
+ po.ovarrf(
+ self.outfile,
+ "minimum TF conductor temperature margin (K)",
+ "(temp_tf_superconductor_margin_min)",
+ tfcoil_variables.temp_tf_superconductor_margin_min,
+ )
+ po.ovarrf(
+ self.outfile,
+ "TF conductor temperature margin (K)",
+ "(temp_tf_superconductor_margin)",
+ tfcoil_variables.temp_tf_superconductor_margin,
+ )
+
+ po.ovarin(
+ self.outfile,
+ "Elastic properties behavior",
+ "(i_tf_cond_eyoung_axial)",
+ tfcoil_variables.i_tf_cond_eyoung_axial,
+ )
+ if tfcoil_variables.i_tf_cond_eyoung_axial == 0:
+ po.ocmmnt(self.outfile, " Conductor stiffness neglected")
+ elif tfcoil_variables.i_tf_cond_eyoung_axial == 1:
+ po.ocmmnt(self.outfile, " Conductor stiffness is user-input")
+ elif tfcoil_variables.i_tf_cond_eyoung_axial == 2:
+ po.ocmmnt(
+ self.outfile,
+ " Conductor stiffness is set by material-specific default",
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Conductor axial Youngs modulus",
+ "(eyoung_cond_axial)",
+ tfcoil_variables.eyoung_cond_axial,
+ )
+ po.ovarre(
+ self.outfile,
+ "Conductor transverse Youngs modulus",
+ "(eyoung_cond_trans)",
+ tfcoil_variables.eyoung_cond_trans,
+ )
+ else:
+ # External casing
+ po.osubhd(self.outfile, "Bucking cylinder information:")
+ po.ovarre(
+ self.outfile,
+ "Casing cross section area (per leg) (m2)",
+ "(a_tf_coil_inboard_case)",
+ tfcoil_variables.a_tf_coil_inboard_case,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard leg case plasma side wall thickness (m)",
+ "(dr_tf_plasma_case)",
+ tfcoil_variables.dr_tf_plasma_case,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard leg plasma case area (m^2)",
+ "(a_tf_plasma_case)",
+ superconducting_tf_coil_variables.a_tf_plasma_case,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard leg bucking cylinder thickness (m)",
+ "(dr_tf_nose_case)",
+ tfcoil_variables.dr_tf_nose_case,
+ )
+ po.ovarre(
+ self.outfile,
+ 'Inboard leg case inboard "nose" area (m^2)',
+ "(a_tf_coil_nose_case)",
+ superconducting_tf_coil_variables.a_tf_coil_nose_case,
+ )
+
+ # Conductor layer geometry
+ po.osubhd(self.outfile, "Inboard TFC conductor sector geometry:")
+ po.ovarre(
+ self.outfile,
+ "Inboard TFC conductor sector area with gr insulation (per leg) (m2)",
+ "(a_tf_wp_with_insulation)",
+ superconducting_tf_coil_variables.a_tf_wp_with_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard TFC conductor sector area, NO ground & gap (per leg) (m2)",
+ "(a_tf_wp_no_insulation)",
+ superconducting_tf_coil_variables.a_tf_wp_no_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Ground wall insulation area (m^2)",
+ "(a_tf_wp_ground_insulation)",
+ superconducting_tf_coil_variables.a_tf_wp_ground_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard conductor sector radial thickness (m)",
+ "(dr_tf_wp_with_insulation)",
+ tfcoil_variables.dr_tf_wp_with_insulation,
+ )
+ if physics_variables.itart == 1:
+ po.ovarre(
+ self.outfile,
+ "Central collumn top conductor sector radial thickness (m)",
+ "(dr_tf_wp_top)",
+ superconducting_tf_coil_variables.dr_tf_wp_top,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Ground wall insulation thickness (m)",
+ "(dx_tf_wp_insulation)",
+ tfcoil_variables.dx_tf_wp_insulation,
+ )
+ # Turn info
+ po.osubhd(self.outfile, "Coil turn information:")
+ po.ovarre(
+ self.outfile,
+ "Number of turns per TF leg",
+ "(n_tf_coil_turns)",
+ tfcoil_variables.n_tf_coil_turns,
+ )
+ po.ovarre(
+ self.outfile,
+ "Turn insulation thickness",
+ "(dx_tf_turn_insulation)",
+ tfcoil_variables.dx_tf_turn_insulation,
+ )
+ po.ovarre(
+ self.outfile,
+ "Mid-plane CP cooling fraction",
+ "(fcoolcp)",
+ tfcoil_variables.fcoolcp,
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of resistive conductor per coil",
+ "(a_res_tf_coil_conductor)",
+ tfcoil_variables.a_res_tf_coil_conductor,
+ )
+ po.ovarre(
+ self.outfile,
+ "Outboard leg current per turn (A)",
+ "(c_tf_turn)",
+ tfcoil_variables.c_tf_turn,
+ )
+ po.ovarre(
+ self.outfile,
+ "Inboard leg conductor volume (m3)",
+ "(vol_cond_cp)",
+ tfcoil_variables.vol_cond_cp,
+ )
+ po.ovarre(
+ self.outfile,
+ "Outboard leg volume per coil (m3)",
+ "(voltfleg)",
+ tfcoil_variables.voltfleg,
+ )
+
+ # Coil masses
+ po.osubhd(self.outfile, "TF coil mass:")
+ po.ovarre(
+ self.outfile,
+ "Superconductor mass per coil (kg)",
+ "(m_tf_coil_superconductor)",
+ tfcoil_variables.m_tf_coil_superconductor,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Copper mass per coil (kg)",
+ "(m_tf_coil_copper)",
+ tfcoil_variables.m_tf_coil_copper,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Steel conduit mass per coil (kg)",
+ "(m_tf_wp_steel_conduit)",
+ tfcoil_variables.m_tf_wp_steel_conduit,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Conduit insulation mass per coil (kg)",
+ "(m_tf_coil_wp_turn_insulation)",
+ tfcoil_variables.m_tf_coil_wp_turn_insulation,
+ "OP ",
+ )
+ if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
+ po.ovarre(
+ self.outfile,
+ "Total conduit mass per coil (kg)",
+ "(m_tf_coil_conductor)",
+ tfcoil_variables.m_tf_coil_conductor,
+ "OP ",
+ )
+
+ if physics_variables.itart == 1:
+ po.ovarre(
+ self.outfile,
+ "Mass of inboard legs (kg)",
+ "(whtcp)",
+ tfcoil_variables.whtcp,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Mass of outboard legs (kg)",
+ "(whttflgs)",
+ tfcoil_variables.whttflgs,
+ "OP ",
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Mass of each TF coil (kg)",
+ "(m_tf_coils_total/n_tf_coils)",
+ tfcoil_variables.m_tf_coils_total / tfcoil_variables.n_tf_coils,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total TF coil mass (kg)",
+ "(m_tf_coils_total)",
+ tfcoil_variables.m_tf_coils_total,
+ "OP ",
+ )
+
+ # Resistive coil parameters
+ if tfcoil_variables.i_tf_sup != TFConductorModel.SUPERCONDUCTING:
+ po.osubhd(self.outfile, "Resitive loss parameters:")
+ if tfcoil_variables.i_tf_sup == TFConductorModel.WATER_COOLED_COPPER:
+ po.ocmmnt(
+ self.outfile,
+ "Resistive Material : GLIDCOP AL-15 - Dispersion Strengthened Copper",
+ )
+ elif tfcoil_variables.i_tf_sup == TFConductorModel.HELIUM_COOLED_ALUMINIUM:
+ po.ocmmnt(
+ self.outfile, "Resistive Material : Pure Aluminium (99.999+ %)"
+ )
+
+ if physics_variables.itart == 1:
+ po.ovarre(
+ self.outfile,
+ "CP resistivity (ohm.m)",
+ "(rho_cp)",
+ tfcoil_variables.rho_cp,
+ )
+ po.ovarre(
+ self.outfile,
+ "Leg resistivity (ohm.m)",
+ "(rho_tf_leg)",
+ tfcoil_variables.rho_tf_leg,
+ )
+ po.ovarre(
+ self.outfile,
+ "CP resistive power loss (W)",
+ "(p_cp_resistive)",
+ tfcoil_variables.p_cp_resistive,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total legs resitive power loss, (W)",
+ "(p_tf_leg_resistive)",
+ tfcoil_variables.p_tf_leg_resistive,
+ )
+ po.ovarre(
+ self.outfile,
+ "joints resistive power loss (W)",
+ "(p_tf_joints_resistive)",
+ tfcoil_variables.p_tf_joints_resistive,
+ )
+ po.ovarre(
+ self.outfile,
+ "Outboard leg resistance per coil (ohm)",
+ "(res_tf_leg)",
+ tfcoil_variables.res_tf_leg,
+ )
+ po.ovarre(
+ self.outfile,
+ "Average CP temperature (K)",
+ "(temp_cp_average)",
+ tfcoil_variables.temp_cp_average,
+ )
+ po.ovarre(
+ self.outfile,
+ "Average leg temperature (K)",
+ "(temp_tf_legs_outboard)",
+ tfcoil_variables.temp_tf_legs_outboard,
+ )
+
+ else:
+ po.ovarre(
+ self.outfile,
+ "TF resistivity (ohm.m)",
+ "(p_cp_resistive)",
+ tfcoil_variables.rho_cp,
+ )
+ po.ovarre(
+ self.outfile,
+ "TF coil resistive power less (total) (ohm.m)",
+ "(p_cp_resistive)",
+ tfcoil_variables.p_cp_resistive,
+ )
+ po.ovarre(
+ self.outfile,
+ "Average coil temperature (K)",
+ "(temp_cp_average)",
+ tfcoil_variables.temp_cp_average,
+ )
+
+ # Quench information
+ if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
+ po.osubhd(self.outfile, "Quench information :")
+ po.ovarre(
+ self.outfile,
+ "Actual quench time (or time constant) (s)",
+ "(t_tf_superconductor_quench)",
+ tfcoil_variables.t_tf_superconductor_quench,
+ )
+ po.ovarre(
+ self.outfile,
+ "Vacuum Vessel stress on quench (Pa)",
+ "(vv_stress_quench)",
+ superconducting_tf_coil_variables.vv_stress_quench,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Maximum allowed voltage during quench due to insulation (kV)",
+ "(v_tf_coil_dump_quench_max_kv)",
+ tfcoil_variables.v_tf_coil_dump_quench_max_kv,
+ )
+ po.ovarre(
+ self.outfile,
+ "Actual quench voltage (kV)",
+ "(v_tf_coil_dump_quench_kv)",
+ tfcoil_variables.v_tf_coil_dump_quench_kv,
+ "OP ",
+ )
+
+ if tfcoil_variables.i_tf_sc_mat in {1, 2, 3, 4, 5}:
+ po.ovarre(
+ self.outfile,
+ "Maximum allowed temp during a quench (K)",
+ "(temp_tf_conductor_quench_max)",
+ tfcoil_variables.temp_tf_conductor_quench_max,
+ )
+ elif tfcoil_variables == 6:
+ po.ocmmnt(self.outfile, "CroCo cable with jacket: ")
+
+ if 75 in numerics.icc:
+ po.ovarre(
+ self.outfile,
+ "Maximum permitted TF coil current / copper area (A/m2)",
+ "(copperA_m2_max)",
+ rebco_variables.tf_coppera_m2_max,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Actual TF coil current / copper area (A/m2)",
+ "(copperA_m2)",
+ rebco_variables.tf_coppera_m2,
+ )
+
+ # TF coil radial build
+ po.osubhd(self.outfile, "Radial build of TF coil centre-line :")
+
+ radius = self.data.build.r_tf_inboard_in
+ po.obuild(self.outfile, "Innermost edge of TF coil", radius, radius)
+
+ # Radial build for SC TF coils
+ if tfcoil_variables.i_tf_sup == TFConductorModel.SUPERCONDUCTING:
+ radius += tfcoil_variables.dr_tf_nose_case
+ po.obuild(
+ self.outfile,
+ 'Coil case ("nose")',
+ tfcoil_variables.dr_tf_nose_case,
+ radius,
+ "(dr_tf_nose_case)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insertion_gap
+ po.obuild(
+ self.outfile,
+ "Insertion gap for winding pack",
+ tfcoil_variables.dx_tf_wp_insertion_gap,
+ radius,
+ "(dx_tf_wp_insertion_gap)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insulation
+ po.obuild(
+ self.outfile,
+ "Winding pack ground insulation",
+ tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dx_tf_wp_insulation)",
+ )
+
+ radius = (
+ radius
+ + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
+ - tfcoil_variables.dx_tf_wp_insulation
+ - tfcoil_variables.dx_tf_wp_insertion_gap
+ )
+ po.obuild(
+ self.outfile,
+ "Winding - first half",
+ tfcoil_variables.dr_tf_wp_with_insulation / 2e0
+ - tfcoil_variables.dx_tf_wp_insulation
+ - tfcoil_variables.dx_tf_wp_insertion_gap,
+ radius,
+ "(dr_tf_wp_with_insulation/2-dx_tf_wp_insulation-dx_tf_wp_insertion_gap)",
+ )
+
+ radius = (
+ radius
+ + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
+ - tfcoil_variables.dx_tf_wp_insulation
+ - tfcoil_variables.dx_tf_wp_insertion_gap
+ )
+ po.obuild(
+ self.outfile,
+ "Winding - second half",
+ tfcoil_variables.dr_tf_wp_with_insulation / 2e0
+ - tfcoil_variables.dx_tf_wp_insulation
+ - tfcoil_variables.dx_tf_wp_insertion_gap,
+ radius,
+ "(dr_tf_wp_with_insulation/2-dx_tf_wp_insulation-dx_tf_wp_insertion_gap)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insulation
+ po.obuild(
+ self.outfile,
+ "Winding pack insulation",
+ tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dx_tf_wp_insulation)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insertion_gap
+ po.obuild(
+ self.outfile,
+ "Insertion gap for winding pack",
+ tfcoil_variables.dx_tf_wp_insertion_gap,
+ radius,
+ "(dx_tf_wp_insertion_gap)",
+ )
+
+ radius += tfcoil_variables.dr_tf_plasma_case
+ po.obuild(
+ self.outfile,
+ "Plasma side case min radius",
+ tfcoil_variables.dr_tf_plasma_case,
+ radius,
+ "(dr_tf_plasma_case)",
+ )
+
+ po.obuild(
+ self.outfile,
+ "Plasma side case max radius",
+ self.data.build.r_tf_inboard_out,
+ radius,
+ "(r_tf_inboard_out)",
+ )
+
+ # Radial build for restive coil
+ else:
+ radius += tfcoil_variables.dr_tf_nose_case
+ po.obuild(
+ self.outfile,
+ "Coil bucking cylindre",
+ tfcoil_variables.dr_tf_nose_case,
+ radius,
+ "(dr_tf_nose_case)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insulation
+ po.obuild(
+ self.outfile,
+ "Conductor ground insulation",
+ tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dx_tf_wp_insulation)",
+ )
+
+ radius = (
+ radius
+ + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
+ - tfcoil_variables.dx_tf_wp_insulation
+ )
+ po.obuild(
+ self.outfile,
+ "Conductor - first half",
+ tfcoil_variables.dr_tf_wp_with_insulation / 2e0
+ - tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(tfcoil_variables.dr_tf_wp_with_insulation/2-tfcoil_variables.dx_tf_wp_insulation)",
+ )
+
+ radius = (
+ radius
+ + 0.5e0 * tfcoil_variables.dr_tf_wp_with_insulation
+ - tfcoil_variables.dx_tf_wp_insulation
+ )
+ po.obuild(
+ self.outfile,
+ "Conductor - second half",
+ tfcoil_variables.dr_tf_wp_with_insulation / 2e0
+ - tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(tfcoil_variables.dr_tf_wp_with_insulation/2-tfcoil_variables.dx_tf_wp_insulation)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insulation
+ po.obuild(
+ self.outfile,
+ "Conductor ground insulation",
+ tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dx_tf_wp_insulation)",
+ )
+
+ radius += tfcoil_variables.dr_tf_plasma_case
+ po.obuild(
+ self.outfile,
+ "Plasma side TF coil support",
+ tfcoil_variables.dr_tf_plasma_case,
+ radius,
+ "(dr_tf_plasma_case)",
+ )
+
+ # Radial build consistency check
+ if not (
+ abs(radius - self.data.build.r_tf_inboard_in - self.data.build.dr_tf_inboard)
+ < 10.0e0 * np.finfo(float(radius)).eps
+ ):
+ logger.error(
+ "TF coil dimensions are not consistent. Radius of plasma-facing side of inner leg should be "
+ f"{self.data.build.r_tf_inboard_in + self.data.build.dr_tf_inboard}m"
+ )
+
+ tf_total_height = (
+ self.data.build.dh_tf_inner_bore + 2 * self.data.build.dr_tf_inboard
+ )
+ tf_total_width = (
+ self.data.build.dr_tf_inner_bore
+ + self.data.build.dr_tf_inboard
+ + self.data.build.dr_tf_outboard
+ )
+ po.oblnkl(self.outfile)
+ po.obuild(
+ self.outfile,
+ "Total height and width of TFC [m]",
+ tf_total_height,
+ tf_total_width,
+ )
+
+ # Top section TF coil radial build (physics_variables.itart = 1 only)
+ if (
+ physics_variables.itart == 1
+ and tfcoil_variables.i_tf_sup != TFConductorModel.SUPERCONDUCTING
+ ):
+ po.osubhd(self.outfile, "Radial build of TF coil at central collumn top :")
+ # write(self.outfile,5)
+
+ # Restart the radial build at bucking cylindre inner radius
+ radius = self.data.build.r_tf_inboard_in
+ po.obuild(self.outfile, "Innermost edge of TF coil", radius, radius)
+
+ radius += tfcoil_variables.dr_tf_nose_case
+ po.obuild(
+ self.outfile,
+ "Coil bucking cylindre",
+ tfcoil_variables.dr_tf_nose_case,
+ radius,
+ "(dr_tf_nose_case)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insulation
+ po.obuild(
+ self.outfile,
+ "Conductor ground insulation",
+ tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dx_tf_wp_insulation)",
+ )
+
+ radius = (
+ radius
+ + 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
+ - tfcoil_variables.dx_tf_wp_insulation
+ )
+ po.obuild(
+ self.outfile,
+ "Conductor - first half",
+ 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
+ - tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dr_tf_wp_top/2-dx_tf_wp_insulation)",
+ )
+
+ radius = (
+ radius
+ + 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
+ - tfcoil_variables.dx_tf_wp_insulation
+ )
+ po.obuild(
+ self.outfile,
+ "Conductor - second half",
+ 0.5e0 * superconducting_tf_coil_variables.dr_tf_wp_top
+ - tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dr_tf_wp_top/2-dx_tf_wp_insulation)",
+ )
+
+ radius += tfcoil_variables.dx_tf_wp_insulation
+ po.obuild(
+ self.outfile,
+ "Conductor ground insulation",
+ tfcoil_variables.dx_tf_wp_insulation,
+ radius,
+ "(dx_tf_wp_insulation)",
+ )
+
+ radius += tfcoil_variables.dr_tf_plasma_case
+ po.obuild(
+ self.outfile,
+ "Plasma side TF coil support",
+ tfcoil_variables.dr_tf_plasma_case,
+ radius,
+ "(dr_tf_plasma_case)",
+ )
+
+ # Consistency check
+ if abs(radius - self.data.build.r_cp_top) < np.finfo(float(radius)).eps:
+ po.ocmmnt(self.outfile, "Top TF coil dimensions are consistent")
+ else:
+ po.ocmmnt(self.outfile, "ERROR: TF coil dimensions are NOT consistent:")
+ po.ovarre(
+ self.outfile,
+ "Radius of plasma-facing side of inner leg SHOULD BE [m]",
+ "",
+ self.data.build.r_cp_top,
+ )
+ po.oblnkl(self.outfile)
+
+ def output_tf_superconductor_info(self):
+ """Output TF superconductor information"""
+ po.oheadr(self.outfile, "TF Coils Superconductor Information")
+ po.ovarin(
+ self.outfile,
+ "TF superconductor switch",
+ "(i_tf_sc_mat)",
+ tfcoil_variables.i_tf_sc_mat,
+ )
+
+ po.ocmmnt(
+ self.outfile,
+ f"Superconductor used: "
+ f"{SuperconductorModel(tfcoil_variables.i_tf_sc_mat).full_name}",
+ )
+
+ po.ovarin(
+ self.outfile,
+ "Superconducting TF coil turn type",
+ "(i_tf_turn_type)",
+ superconducting_tf_coil_variables.i_tf_turn_type,
+ )
+ po.ovarin(
+ self.outfile,
+ "WP shape selection switch",
+ "(i_tf_wp_geom)",
+ tfcoil_variables.i_tf_wp_geom,
+ )
+
+ po.ovarin(
+ self.outfile,
+ "Superconducting TF coil turn type",
+ "(i_tf_turn_type)",
+ superconducting_tf_coil_variables.i_tf_turn_type,
+ )
+ po.ovarin(
+ self.outfile,
+ "WP shape selection switch",
+ "(i_tf_wp_geom)",
+ tfcoil_variables.i_tf_wp_geom,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Critical field at zero temperature and strain (T)",
+ "(b_tf_superconductor_critical_zero_temp_strain)",
+ superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain,
+ )
+ po.ovarre(
+ self.outfile,
+ "Critical temperature at zero field and strain (K)",
+ "(temp_tf_superconductor_critical_zero_field_strain)",
+ superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain,
+ )
+
+ if global_variables.run_tests == 1:
+ po.oblnkl(self.outfile)
+ po.ocmmnt(
+ self.outfile,
+ "PROCESS TF Coil peak field fit. Values for t, z and y:",
+ )
+ po.oblnkl(self.outfile)
+ po.ovarre(
+ self.outfile,
+ "Dimensionless winding pack width",
+ "(tf_fit_t)",
+ superconducting_tf_coil_variables.tf_fit_t,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Dimensionless winding pack radial thickness",
+ "(tf_fit_z)",
+ superconducting_tf_coil_variables.tf_fit_z,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Ratio of peak field with ripple to nominal axisymmetric peak field",
+ "(f_b_tf_inboard_peak_ripple_symmetric)",
+ superconducting_tf_coil_variables.f_b_tf_inboard_peak_ripple_symmetric,
+ "OP ",
+ )
+
+ po.oblnkl(self.outfile)
+ po.ovarre(
+ self.outfile,
+ "Helium temperature at peak field (= superconductor temperature) (K)",
+ "(tftmp)",
+ tfcoil_variables.tftmp,
+ )
+ po.ovarre(
+ self.outfile,
+ "Total cooling area fraction inside cable space",
+ "(f_a_tf_turn_cable_space_cooling)",
+ superconducting_tf_coil_variables.f_a_tf_turn_cable_space_cooling,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Copper fraction of conductor",
+ "(f_a_tf_turn_cable_copper)",
+ tfcoil_variables.f_a_tf_turn_cable_copper,
+ )
+ po.ovarre(
+ self.outfile,
+ "Residual manufacturing strain on superconductor",
+ "(str_tf_con_res)",
+ tfcoil_variables.str_tf_con_res,
+ )
+ po.ovarre(
+ self.outfile,
+ "Self-consistent strain on superconductor",
+ "(str_wp)",
+ tfcoil_variables.str_wp,
+ )
+ po.ovarre(
+ self.outfile,
+ "Critical current density in superconductor (A/m2)",
+ "(j_tf_superconductor_critical)",
+ superconducting_tf_coil_variables.j_tf_superconductor_critical,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Critical current density in winding pack (A/m2)",
+ "(j_tf_wp_critical)",
+ tfcoil_variables.j_tf_wp_critical,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Winding pack current density (A/m2)",
+ "(j_tf_wp)",
+ tfcoil_variables.j_tf_wp,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Actual current density in winding pack (A/m2)",
+ "(j_tf_coil_turn)",
+ superconducting_tf_coil_variables.j_tf_coil_turn,
+ "OP ",
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Minimum allowed temperature margin in superconductor (K)",
+ "(temp_tf_superconductor_margin_min)",
+ tfcoil_variables.temp_tf_superconductor_margin_min,
+ )
+ po.ovarre(
+ self.outfile,
+ "Actual temperature margin in superconductor (K)",
+ "(temp_tf_superconductor_margin)",
+ tfcoil_variables.temp_tf_superconductor_margin,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Critical current (A)",
+ "(c_turn_cables_critical)",
+ superconducting_tf_coil_variables.c_tf_turn_cables_critical,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Actual current (A)",
+ "(c_tf_turn)",
+ tfcoil_variables.c_tf_turn,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Actual current / critical current",
+ "(f_c_tf_turn_operating_critical)",
+ superconducting_tf_coil_variables.f_c_tf_turn_operating_critical,
+ "OP ",
+ )
+ if superconducting_tf_coil_variables.f_c_tf_turn_operating_critical > 0.7:
+ logger.error(
+ "f_c_tf_turn_operating_critical shouldn't be above 0.7 for engineering "
+ "reliability"
+ )
+
+ po.ovarre(
+ self.outfile,
+ "TF Superconductor quench dump time (s)",
+ "(t_tf_superconductor_quench)",
+ tfcoil_variables.t_tf_superconductor_quench,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "TF Superconductor quench detection time (s)",
+ "(t_tf_quench_detection)",
+ tfcoil_variables.t_tf_quench_detection,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Maximum winding pack current density for protection (A/m2)",
+ "(j_tf_wp_quench_heat_max)",
+ tfcoil_variables.j_tf_wp_quench_heat_max,
+ "OP ",
+ )
+
+ @staticmethod
+ def calculate_superconductor_temperature_margin(
+ i_tf_superconductor: int,
+ j_superconductor: float,
+ b_tf_inboard_peak: float,
+ strain: float,
+ bc20m: float,
+ tc0m: float,
+ c0: float,
+ temp_tf_coolant_peak_field: float,
+ ):
+ """Calculate the temperature margin of the TF superconductor.
Parameters
----------
@@ -1600,14 +2750,11 @@ def run(self, output: bool = False):
# Setting the WP turn geometry / areas
if tfcoil_variables.i_tf_turns_integer == 0:
- avg_turn_geometry = CICCAveragedTurnGeometry
-
# Non-ingeger number of turns
- avg_turn_geometry = self.tf_cable_in_conduit_averaged_turn_geometry(
+ avg_turn_geometry: CICCAveragedTurnGeometry = self.tf_cable_in_conduit_averaged_turn_geometry(
j_tf_wp=tfcoil_variables.j_tf_wp,
dx_tf_turn_steel=tfcoil_variables.dx_tf_turn_steel,
dx_tf_turn_insulation=tfcoil_variables.dx_tf_turn_insulation,
- i_tf_sc_mat=tfcoil_variables.i_tf_sc_mat,
dx_tf_turn_general=tfcoil_variables.dx_tf_turn_general,
c_tf_turn=tfcoil_variables.c_tf_turn,
i_dx_tf_turn_general_input=tfcoil_variables.i_dx_tf_turn_general_input,
@@ -1648,8 +2795,7 @@ def run(self, output: bool = False):
else:
# Integer number of turns
- int_turn_geometry = CICCIntegerTurnGeometry
- (int_turn_geometry) = self.tf_cable_in_conduit_integer_turn_geometry(
+ int_turn_geometry: CICCIntegerTurnGeometry = self.tf_cable_in_conduit_integer_turn_geometry(
dr_tf_wp_with_insulation=tfcoil_variables.dr_tf_wp_with_insulation,
dx_tf_wp_insulation=tfcoil_variables.dx_tf_wp_insulation,
dx_tf_wp_insertion_gap=tfcoil_variables.dx_tf_wp_insertion_gap,
@@ -1694,24 +2840,21 @@ def run(self, output: bool = False):
# Calculate number of cables in turn if CICC conductor
# ---------------------------------------------------
- if (
- SuperconductorModel(tfcoil_variables.i_tf_sc_mat)
- != SuperconductorModel.CROCO_REBCO
- ):
- superconducting_tf_coil_variables.n_tf_turn_superconducting_cables = self.calculate_cable_in_conduit_strand_count(
- a_cable_space=superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
- dia_superconductor_strand=superconducting_tf_coil_variables.dia_tf_turn_superconducting_cable,
- )
- (
- superconducting_tf_coil_variables.len_tf_coil_superconductor,
- superconducting_tf_coil_variables.len_tf_superconductor_total,
- ) = self.calculate_cable_in_conduit_superconductor_length(
- n_tf_coils=tfcoil_variables.n_tf_coils,
- n_tf_coil_turns=tfcoil_variables.n_tf_coil_turns,
- len_tf_coil=tfcoil_variables.len_tf_coil,
- n_tf_turn_superconducting_cables=superconducting_tf_coil_variables.n_tf_turn_superconducting_cables,
- )
+ superconducting_tf_coil_variables.n_tf_turn_superconducting_cables = self.calculate_cable_in_conduit_strand_count(
+ a_cable_space=superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
+ dia_superconductor_strand=superconducting_tf_coil_variables.dia_tf_turn_superconducting_cable,
+ )
+
+ (
+ superconducting_tf_coil_variables.len_tf_coil_superconductor,
+ superconducting_tf_coil_variables.len_tf_superconductor_total,
+ ) = self.calculate_cable_in_conduit_superconductor_length(
+ n_tf_coils=tfcoil_variables.n_tf_coils,
+ n_tf_coil_turns=tfcoil_variables.n_tf_coil_turns,
+ len_tf_coil=tfcoil_variables.len_tf_coil,
+ n_tf_turn_superconducting_cables=superconducting_tf_coil_variables.n_tf_turn_superconducting_cables,
+ )
# Areas and fractions
# -------------------
@@ -1987,16 +3130,7 @@ def run(self, output: bool = False):
* tfcoil_variables.n_tf_coil_turns
)
- (
- tfcoil_variables.j_tf_wp_critical,
- superconducting_tf_coil_variables.j_tf_superconductor_critical,
- superconducting_tf_coil_variables.f_c_tf_turn_operating_critical,
- superconducting_tf_coil_variables.j_tf_superconductor,
- superconducting_tf_coil_variables.j_tf_coil_turn,
- superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain,
- superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain,
- superconducting_tf_coil_variables.c_tf_turn_cables_critical,
- ) = self.tf_cable_in_conduit_superconductor_properties(
+ critical_superconductor_info: TFSuperconductorLimits = self.tf_cable_in_conduit_superconductor_properties(
a_tf_turn_cable_space=tfcoil_variables.a_tf_turn_cable_space_no_void,
a_tf_turn=a_tf_turn,
a_tf_turn_cable_space_effective=superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
@@ -2012,6 +3146,25 @@ def run(self, output: bool = False):
tcritsc=tfcoil_variables.tcritsc,
)
+ tfcoil_variables.j_tf_wp_critical = critical_superconductor_info.j_tf_wp_critical
+ superconducting_tf_coil_variables.j_tf_superconductor_critical = (
+ critical_superconductor_info.j_superconductor_critical
+ )
+ superconducting_tf_coil_variables.f_c_tf_turn_operating_critical = (
+ critical_superconductor_info.f_c_tf_turn_operating_critical
+ )
+ superconducting_tf_coil_variables.j_tf_superconductor = (
+ critical_superconductor_info.j_superconductor
+ )
+ superconducting_tf_coil_variables.j_tf_coil_turn = (
+ critical_superconductor_info.j_tf_coil_turn
+ )
+ superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain = critical_superconductor_info.bc20m
+ superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain = critical_superconductor_info.tc0m
+ superconducting_tf_coil_variables.c_tf_turn_cables_critical = (
+ critical_superconductor_info.c_turn_cables_critical
+ )
+
if tfcoil_variables.i_str_wp == 0:
strain = tfcoil_variables.str_tf_con_res
else:
@@ -2064,7 +3217,7 @@ def run(self, output: bool = False):
) # TFC Quench voltage in kV
if output:
- self.outtf()
+ self.output_general_tf_info()
@staticmethod
def tf_cable_in_conduit_superconductor_properties(
@@ -2081,7 +3234,7 @@ def tf_cable_in_conduit_superconductor_properties(
temp_tf_coolant_peak_field: float,
bcritsc: float,
tcritsc: float,
- ) -> tuple[float, float, float, float, float, float, float, float]:
+ ) -> TFSuperconductorLimits:
"""Calculates the properties of the TF superconducting conductor.
Parameters
@@ -2126,29 +3279,15 @@ def tf_cable_in_conduit_superconductor_properties(
Returns
-------
- type
- tuple (float, float, float, float, float, float, float, float, float)
- - j_tf_wp_critical (float): Critical winding pack current density (A/m²).
- - j_superconductor_critical (float): Critical current density in
- superconductor (A/m²).
- - f_c_tf_turn_operating_critical (float): Ratio of
- operating / critical current.
- - j_superconductor_turn (float): Actual current density in
- superconductor (A/m²).
- - j_tf_coil_turn (float): Actual current density in superconductor (A/m²).
- - b_tf_superconductor_critical_zero_temp_strain (float): Critical field at
- zero temperature and strain (T).
- - temp_tf_superconductor_critical_zero_field_strain (float): Critical
- temperature at zero field and strain (K).
- - c_tf_turn_cables_critical (float): Critical current in cable (A).
-
- Raises
- ------
- ProcessValueError
- If an invalid superconductor type is selected, including when
- ``i_tf_superconductor`` is not a valid ``SuperconductorModel``
- enum value.
-
+ TFSuperconductorLimits
+ - j_tf_wp_critical (float): Critical winding pack current density (A/m²).
+ - j_superconductor_critical (float): Critical current density in superconductor (A/m²).
+ - f_c_tf_turn_operating_critical (float): Ratio of operating / critical current.
+ - j_superconductor_turn (float): Actual current density in superconductor (A/m²).
+ - j_tf_coil_turn (float): Actual current density in superconductor (A/m²).
+ - b_tf_superconductor_critical_zero_temp_strain (float): Critical field at zero temperature and strain (T).
+ - temp_tf_superconductor_critical_zero_field_strain (float): Critical temperature at zero field and strain (K).
+ - c_tf_turn_cables_critical (float): Critical current in cable (A).
Notes
-----
@@ -2458,9 +3597,9 @@ def tf_cable_in_conduit_superconductor_properties(
b_conductor=b_tf_inboard_peak,
b_c20max=bc20m,
t_c0=tc0m,
- dr_hts_tape=rebco_variables.dr_hts_tape,
- dx_hts_tape_rebco=rebco_variables.dx_hts_tape_rebco,
- dx_hts_tape_total=rebco_variables.dx_hts_tape_total,
+ dr_hts_tape=superconducting_tf_coil_variables.dr_tf_hts_tape,
+ dx_hts_tape_rebco=superconducting_tf_coil_variables.dx_tf_hts_tape_rebco,
+ dx_hts_tape_total=superconducting_tf_coil_variables.dx_tf_hts_tape_total,
)
# Scale for the copper area fraction of the cable
j_cables_critical = j_superconductor_critical * (
@@ -2517,15 +3656,15 @@ def tf_cable_in_conduit_superconductor_properties(
"""
)
- return (
- j_tf_wp_critical,
- j_superconductor_critical,
- f_c_tf_turn_operating_critical,
- j_superconductor,
- j_tf_coil_turn,
- bc20m,
- tc0m,
- c_turn_cables_critical,
+ return TFSuperconductorLimits(
+ j_tf_wp_critical=j_tf_wp_critical,
+ j_superconductor_critical=j_superconductor_critical,
+ f_c_tf_turn_operating_critical=f_c_tf_turn_operating_critical,
+ j_superconductor=j_superconductor,
+ j_tf_coil_turn=j_tf_coil_turn,
+ bc20m=bc20m,
+ tc0m=tc0m,
+ c_turn_cables_critical=c_turn_cables_critical,
)
@staticmethod
@@ -2603,7 +3742,6 @@ def tf_cable_in_conduit_averaged_turn_geometry(
j_tf_wp: float,
dx_tf_turn_steel: float,
dx_tf_turn_insulation: float,
- i_tf_sc_mat: int,
dx_tf_turn_general: float,
c_tf_turn: float,
i_dx_tf_turn_general_input: bool,
@@ -2632,9 +3770,6 @@ def tf_cable_in_conduit_averaged_turn_geometry(
dx_tf_turn_insulation : float
Thickness of the insulation layer in the TF turn (in meters).
- i_tf_sc_mat : int
- Identifier for the superconducting material type.
-
dx_tf_turn_general : float
General dimension of the TF turn (in meters).
@@ -2742,68 +3877,54 @@ def tf_cable_in_conduit_averaged_turn_geometry(
tfcoil_variables.a_tf_turn_cable_space_no_void
)
- # ITER like turn structure
- if i_tf_sc_mat != 6:
- # Radius of rounded corners of cable space inside conduit [m]
- radius_tf_turn_cable_space_corners = dx_tf_turn_steel * 0.75e0
-
- # Dimension of square cable space inside conduit [m]
- dx_tf_turn_cable_space_average = t_conductor - 2.0e0 * dx_tf_turn_steel
-
- # Cross-sectional area of cable space per turn
- # taking account of rounded inside corners [m2]
- a_tf_turn_cable_space_no_void = (
- dx_tf_turn_cable_space_average**2
- - (4.0e0 - np.pi) * radius_tf_turn_cable_space_corners**2
- )
+ # Radius of rounded corners of cable space inside conduit [m]
+ radius_tf_turn_cable_space_corners = dx_tf_turn_steel * 0.75e0
- # Calculate the true effective cable space by taking away the cooling
- # channel and the extra void fraction
+ # Dimension of square cable space inside conduit [m]
+ dx_tf_turn_cable_space_average = t_conductor - 2.0e0 * dx_tf_turn_steel
- a_tf_turn_cable_space_effective = (
- a_tf_turn_cable_space_no_void
- -
- # Coolant channel area
- (
- (np.pi / 4.0e0)
- * dia_tf_turn_coolant_channel
- * dia_tf_turn_coolant_channel
- )
- # Additional void area deduction
- - (a_tf_turn_cable_space_no_void * f_a_tf_turn_cable_space_extra_void)
- )
+ # Cross-sectional area of cable space per turn
+ # taking account of rounded inside corners [m2]
+ a_tf_turn_cable_space_no_void = (
+ dx_tf_turn_cable_space_average**2
+ - (4.0e0 - np.pi) * radius_tf_turn_cable_space_corners**2
+ )
- f_a_tf_turn_cable_space_cooling = 1 - (
- a_tf_turn_cable_space_effective / a_tf_turn_cable_space_no_void
- )
+ # Calculate the true effective cable space by taking away the cooling
+ # channel and the extra void fraction
- if a_tf_turn_cable_space_no_void <= 0.0e0:
- if t_conductor < 0.0e0:
- logger.error(
- "Negative cable space dimension. %s %s",
- a_tf_turn_cable_space_no_void,
- dx_tf_turn_cable_space_average,
- )
- else:
- logger.error(
- "Cable space area problem; artificially set rounded corner "
- "radius to 0. %s %s",
- a_tf_turn_cable_space_no_void,
- dx_tf_turn_cable_space_average,
- )
- radius_tf_turn_cable_space_corners = 0.0e0
- a_tf_turn_cable_space_no_void = dx_tf_turn_cable_space_average**2
+ a_tf_turn_cable_space_effective = (
+ a_tf_turn_cable_space_no_void
+ -
+ # Coolant channel area
+ ((np.pi / 4.0e0) * dia_tf_turn_coolant_channel * dia_tf_turn_coolant_channel)
+ # Additional void area deduction
+ - (a_tf_turn_cable_space_no_void * f_a_tf_turn_cable_space_extra_void)
+ )
- # Cross-sectional area of conduit jacket per turn [m2]
- a_tf_turn_steel = t_conductor**2 - a_tf_turn_cable_space_no_void
+ f_a_tf_turn_cable_space_cooling = 1 - (
+ a_tf_turn_cable_space_effective / a_tf_turn_cable_space_no_void
+ )
- # REBCO turn structure
- elif i_tf_sc_mat == 6:
- # Diameter of circular cable space inside conduit [m]
- dx_tf_turn_cable_space_average = t_conductor - 2.0e0 * dx_tf_turn_steel
+ if a_tf_turn_cable_space_no_void <= 0.0e0:
+ if t_conductor < 0.0e0:
+ logger.error(
+ "Negative cable space dimension. %s %s",
+ a_tf_turn_cable_space_no_void,
+ dx_tf_turn_cable_space_average,
+ )
+ else:
+ logger.error(
+ "Cable space area problem; artificially set rounded corner "
+ "radius to 0. %s %s",
+ a_tf_turn_cable_space_no_void,
+ dx_tf_turn_cable_space_average,
+ )
+ radius_tf_turn_cable_space_corners = 0.0e0
+ a_tf_turn_cable_space_no_void = dx_tf_turn_cable_space_average**2
- # Cross-sectional area of conduit jacket per turn [m2]
- a_tf_turn_steel = t_conductor**2 - a_tf_turn_cable_space_no_void
+ # Cross-sectional area of conduit jacket per turn [m2]
+ a_tf_turn_steel = t_conductor**2 - a_tf_turn_cable_space_no_void
return CICCAveragedTurnGeometry(
a_tf_turn_cable_space_no_void=a_tf_turn_cable_space_no_void,
@@ -3011,6 +4132,31 @@ def tf_cable_in_conduit_integer_turn_geometry(
# -------------
+@dataclass
+class CROCOAveragedTurnGeometry:
+ a_tf_turn_cable_space_no_void: float
+ a_tf_turn_steel: float
+ a_tf_turn_insulation: float
+ n_tf_coil_turns: int
+ c_tf_turn: float
+ dx_tf_turn_general: float
+ dr_tf_turn: float
+ dx_tf_turn: float
+ t_conductor: float
+ dx_tf_turn_cable_space_average: float
+
+
+@dataclass
+class CroCoCableSpaceGeometry:
+ dia_tf_turn_croco_cable: float
+ a_tf_turn_cable_space_no_void: float
+ a_tf_turn_cable_space_effective: float
+ a_tf_turn_steel: float
+ conductor_area: float
+ conductor_jacket_area: float
+ conductor_jacket_fraction: float
+
+
class CROCOSuperconductingTFCoil(SuperconductingTFCoil):
"""Cross Conductor Superconducting TF Coil class."""
@@ -3027,26 +4173,11 @@ def run(self, output: bool = False):
# Setting the WP turn geometry / areas
if tfcoil_variables.i_tf_turns_integer == 0:
# Non-ingeger number of turns
- (
- tfcoil_variables.a_tf_turn_cable_space_no_void,
- tfcoil_variables.a_tf_turn_steel,
- tfcoil_variables.a_tf_turn_insulation,
- tfcoil_variables.n_tf_coil_turns,
- tfcoil_variables.dx_tf_turn_general,
- tfcoil_variables.c_tf_turn,
- tfcoil_variables.dx_tf_turn_general,
- superconducting_tf_coil_variables.dr_tf_turn,
- superconducting_tf_coil_variables.dx_tf_turn,
- tfcoil_variables.t_conductor,
- superconducting_tf_coil_variables.radius_tf_turn_cable_space_corners,
- superconducting_tf_coil_variables.dx_tf_turn_cable_space_average,
- superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
- superconducting_tf_coil_variables.f_a_tf_turn_cable_space_cooling,
- ) = self.tf_cable_in_conduit_averaged_turn_geometry(
+
+ avg_turn_geometry: CROCOAveragedTurnGeometry = self.tf_croco_averaged_turn_geometry(
j_tf_wp=tfcoil_variables.j_tf_wp,
dx_tf_turn_steel=tfcoil_variables.dx_tf_turn_steel,
dx_tf_turn_insulation=tfcoil_variables.dx_tf_turn_insulation,
- i_tf_sc_mat=tfcoil_variables.i_tf_sc_mat,
dx_tf_turn_general=tfcoil_variables.dx_tf_turn_general,
c_tf_turn=tfcoil_variables.c_tf_turn,
i_dx_tf_turn_general_input=tfcoil_variables.i_dx_tf_turn_general_input,
@@ -3054,58 +4185,29 @@ def run(self, output: bool = False):
dx_tf_turn_cable_space_general=tfcoil_variables.dx_tf_turn_cable_space_general,
layer_ins=tfcoil_variables.layer_ins,
a_tf_wp_no_insulation=superconducting_tf_coil_variables.a_tf_wp_no_insulation,
- dia_tf_turn_coolant_channel=tfcoil_variables.dia_tf_turn_coolant_channel,
- f_a_tf_turn_cable_space_extra_void=tfcoil_variables.f_a_tf_turn_cable_space_extra_void,
)
- else:
- # Integer number of turns
- (
- superconducting_tf_coil_variables.radius_tf_turn_cable_space_corners,
- superconducting_tf_coil_variables.dr_tf_turn,
- superconducting_tf_coil_variables.dx_tf_turn,
- tfcoil_variables.a_tf_turn_cable_space_no_void,
- tfcoil_variables.a_tf_turn_steel,
- tfcoil_variables.a_tf_turn_insulation,
- tfcoil_variables.c_tf_turn,
- tfcoil_variables.n_tf_coil_turns,
- superconducting_tf_coil_variables.t_conductor_radial,
- superconducting_tf_coil_variables.t_conductor_toroidal,
- tfcoil_variables.t_conductor,
- superconducting_tf_coil_variables.dr_tf_turn_cable_space,
- superconducting_tf_coil_variables.dx_tf_turn_cable_space,
- superconducting_tf_coil_variables.dx_tf_turn_cable_space_average,
- ) = self.tf_cable_in_conduit_integer_turn_geometry(
- dr_tf_wp_with_insulation=tfcoil_variables.dr_tf_wp_with_insulation,
- dx_tf_wp_insulation=tfcoil_variables.dx_tf_wp_insulation,
- dx_tf_wp_insertion_gap=tfcoil_variables.dx_tf_wp_insertion_gap,
- n_tf_wp_layers=tfcoil_variables.n_tf_wp_layers,
- dx_tf_wp_toroidal_min=superconducting_tf_coil_variables.dx_tf_wp_toroidal_min,
- n_tf_wp_pancakes=tfcoil_variables.n_tf_wp_pancakes,
- c_tf_coil=superconducting_tf_coil_variables.c_tf_coil,
- dx_tf_turn_steel=tfcoil_variables.dx_tf_turn_steel,
- dx_tf_turn_insulation=tfcoil_variables.dx_tf_turn_insulation,
+ tfcoil_variables.a_tf_turn_cable_space_no_void = (
+ avg_turn_geometry.a_tf_turn_cable_space_no_void
)
-
- # Calculate number of cables in turn if CICC conductor
- # ---------------------------------------------------
- if (
- SuperconductorModel(tfcoil_variables.i_tf_sc_mat)
- != SuperconductorModel.CROCO_REBCO
- ):
- superconducting_tf_coil_variables.n_tf_turn_superconducting_cables = self.calculate_cable_in_conduit_strand_count(
- a_cable_space=superconducting_tf_coil_variables.a_tf_turn_cable_space_effective,
- dia_superconductor_strand=superconducting_tf_coil_variables.dia_tf_turn_superconducting_cable,
+ tfcoil_variables.a_tf_turn_steel = avg_turn_geometry.a_tf_turn_steel
+ tfcoil_variables.a_tf_turn_insulation = (
+ avg_turn_geometry.a_tf_turn_insulation
+ )
+ tfcoil_variables.n_tf_coil_turns = avg_turn_geometry.n_tf_coil_turns
+ tfcoil_variables.dx_tf_turn_general = avg_turn_geometry.dx_tf_turn_general
+ tfcoil_variables.c_tf_turn = avg_turn_geometry.c_tf_turn
+ tfcoil_variables.dx_tf_turn_general = avg_turn_geometry.dx_tf_turn_general
+ superconducting_tf_coil_variables.dr_tf_turn = avg_turn_geometry.dr_tf_turn
+ superconducting_tf_coil_variables.dx_tf_turn = avg_turn_geometry.dx_tf_turn
+ tfcoil_variables.t_conductor = avg_turn_geometry.t_conductor
+ superconducting_tf_coil_variables.dx_tf_turn_cable_space_average = (
+ avg_turn_geometry.dx_tf_turn_cable_space_average
)
- (
- superconducting_tf_coil_variables.len_tf_coil_superconductor,
- superconducting_tf_coil_variables.len_tf_superconductor_total,
- ) = self.calculate_cable_in_conduit_superconductor_length(
- n_tf_coils=tfcoil_variables.n_tf_coils,
- n_tf_coil_turns=tfcoil_variables.n_tf_coil_turns,
- len_tf_coil=tfcoil_variables.len_tf_coil,
- n_tf_turn_superconducting_cables=superconducting_tf_coil_variables.n_tf_turn_superconducting_cables,
+ elif tfcoil_variables.i_tf_turns_integer == 1:
+ raise ProcessValueError(
+ "Integer turn geometry not implemented for CroCo conductor."
)
# Areas and fractions
@@ -3169,6 +4271,187 @@ def run(self, output: bool = False):
/ tfcoil_variables.a_tf_inboard_total
)
+ croco_cable_space_geometry: CroCoCableSpaceGeometry = (
+ self.tf_turn_croco_cable_space_properties(
+ t_conductor=tfcoil_variables.t_conductor,
+ dx_tf_turn_steel=tfcoil_variables.dx_tf_turn_steel,
+ )
+ )
+
+ superconducting_tf_coil_variables.dia_tf_turn_croco_cable = (
+ croco_cable_space_geometry.dia_tf_turn_croco_cable
+ )
+ tfcoil_variables.a_tf_turn_cable_space_no_void = (
+ croco_cable_space_geometry.a_tf_turn_cable_space_no_void
+ )
+ superconducting_tf_coil_variables.a_tf_turn_cable_space_effective = (
+ croco_cable_space_geometry.a_tf_turn_cable_space_effective
+ )
+ tfcoil_variables.a_tf_turn_steel = croco_cable_space_geometry.a_tf_turn_steel
+ superconducting_tf_coil_variables.conductor_area = (
+ croco_cable_space_geometry.conductor_area
+ )
+ superconducting_tf_coil_variables.conductor_jacket_area = (
+ croco_cable_space_geometry.conductor_jacket_area
+ )
+ superconducting_tf_coil_variables.conductor_jacket_fraction = (
+ croco_cable_space_geometry.conductor_jacket_fraction
+ )
+
+ croco_cable_geometry: CroCoCableGeometry = calculate_croco_cable_geometry(
+ dia_croco_strand=superconducting_tf_coil_variables.dia_tf_turn_croco_cable,
+ dx_croco_strand_copper=superconducting_tf_coil_variables.dx_tf_croco_strand_copper,
+ dx_hts_tape_rebco=superconducting_tf_coil_variables.dx_tf_hts_tape_rebco,
+ dx_hts_tape_copper=superconducting_tf_coil_variables.dx_tf_hts_tape_copper,
+ dx_hts_tape_hastelloy=superconducting_tf_coil_variables.dx_tf_hts_tape_hastelloy,
+ )
+
+ superconducting_tf_coil_variables.dia_tf_croco_strand_tape_region = (
+ croco_cable_geometry.dia_croco_strand_tape_region
+ )
+ superconducting_tf_coil_variables.n_tf_croco_strand_hts_tapes = (
+ croco_cable_geometry.n_croco_strand_hts_tapes
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_copper_total = (
+ croco_cable_geometry.a_croco_strand_copper_total
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_hastelloy = (
+ croco_cable_geometry.a_croco_strand_hastelloy
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_solder = (
+ croco_cable_geometry.a_croco_strand_solder
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_rebco = (
+ croco_cable_geometry.a_croco_strand_rebco
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand = (
+ croco_cable_geometry.a_croco_strand
+ )
+ superconducting_tf_coil_variables.dr_tf_hts_tape = (
+ croco_cable_geometry.dr_hts_tape
+ )
+ superconducting_tf_coil_variables.dx_tf_croco_strand_tape_stack = (
+ croco_cable_geometry.dx_croco_strand_tape_stack
+ )
+
+ superconducting_tf_coil_variables.a_tf_croco_strand_copper_total = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_copper_total
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_hastelloy = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_hastelloy
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_solder = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_solder
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand_rebco = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_rebco
+ )
+ superconducting_tf_coil_variables.a_tf_croco_strand = (
+ superconducting_tf_coil_variables.a_tf_croco_strand
+ )
+
+ # Area of core = area of strand
+ superconducting_tf_coil_variables.a_tf_turn_croco_copper_bar = (
+ superconducting_tf_coil_variables.a_tf_croco_strand
+ )
+ superconducting_tf_coil_variables.a_tf_turn_croco_cable_space_copper = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_copper_total
+ * N_CROCO_STRANDS_TURN
+ + superconducting_tf_coil_variables.a_tf_turn_croco_copper_bar
+ )
+ superconducting_tf_coil_variables.conductor_copper_fraction = (
+ superconducting_tf_coil_variables.a_tf_turn_croco_cable_space_copper
+ / superconducting_tf_coil_variables.conductor_area
+ )
+
+ # Helium area is set by the user.
+ # conductor_helium_area = cable_helium_fraction * tfcoil_variables.a_tf_turn_cable_space_no_void
+ superconducting_tf_coil_variables.conductor_helium_area = (
+ np.pi / 2.0 * superconducting_tf_coil_variables.dia_tf_turn_croco_cable**2
+ )
+ superconducting_tf_coil_variables.conductor_helium_fraction = (
+ superconducting_tf_coil_variables.conductor_helium_area
+ / superconducting_tf_coil_variables.conductor_area
+ )
+
+ superconducting_tf_coil_variables.a_tf_turn_croco_hastelloy = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_hastelloy
+ * N_CROCO_STRANDS_TURN
+ )
+ superconducting_tf_coil_variables.conductor_hastelloy_fraction = (
+ superconducting_tf_coil_variables.a_tf_turn_croco_hastelloy
+ / superconducting_tf_coil_variables.conductor_area
+ )
+
+ superconducting_tf_coil_variables.conductor_solder_area = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_solder
+ * N_CROCO_STRANDS_TURN
+ )
+ superconducting_tf_coil_variables.conductor_solder_fraction = (
+ superconducting_tf_coil_variables.conductor_solder_area
+ / superconducting_tf_coil_variables.conductor_area
+ )
+
+ superconducting_tf_coil_variables.conductor_rebco_area = (
+ superconducting_tf_coil_variables.a_tf_croco_strand_rebco
+ * N_CROCO_STRANDS_TURN
+ )
+ superconducting_tf_coil_variables.conductor_rebco_fraction = (
+ superconducting_tf_coil_variables.conductor_rebco_area
+ / superconducting_tf_coil_variables.conductor_area
+ )
+
+ # Cross-sectional area per turn
+ a_tf_turn = tfcoil_variables.c_tf_total / (
+ tfcoil_variables.j_tf_wp
+ * tfcoil_variables.n_tf_coils
+ * tfcoil_variables.n_tf_coil_turns
+ )
+
+ if (
+ SuperconductorModel(tfcoil_variables.i_tf_sc_mat)
+ == SuperconductorModel.CROCO_REBCO
+ ):
+ superconductor_critical_properties: TFSuperconductorLimits = (
+ self.tf_croco_superconductor_properties(
+ a_tf_turn=a_tf_turn,
+ b_tf_inboard_peak=tfcoil_variables.b_tf_inboard_peak_with_ripple,
+ cur_tf_turn=tfcoil_variables.c_tf_turn,
+ temp_tf_peak=tfcoil_variables.tftmp,
+ i_tf_superconductor=tfcoil_variables.i_tf_sc_mat,
+ output=output,
+ )
+ )
+
+ tfcoil_variables.j_tf_wp_critical = (
+ superconductor_critical_properties.j_tf_wp_critical
+ )
+ j_superconductor_critical = (
+ superconductor_critical_properties.j_superconductor_critical
+ )
+ superconducting_tf_coil_variables.f_c_tf_turn_operating_critical = (
+ superconductor_critical_properties.f_c_tf_turn_operating_critical
+ )
+ j_superconductor = superconductor_critical_properties.j_superconductor
+ superconducting_tf_coil_variables.j_tf_coil_turn = (
+ superconductor_critical_properties.j_tf_coil_turn
+ )
+
+ superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain = superconductor_critical_properties.bc20m
+ superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain = superconductor_critical_properties.tc0m
+ superconducting_tf_coil_variables.c_tf_turn_cables_critical = (
+ superconductor_critical_properties.c_turn_cables_critical
+ )
+
+ tfcoil_variables.v_tf_coil_dump_quench_kv = (
+ self.croco_voltage() / 1.0e3
+ ) # TFC Quench voltage in kV
+
+ if tfcoil_variables.i_str_wp == 0:
+ strain = tfcoil_variables.str_tf_con_res
+ else:
+ strain = tfcoil_variables.str_wp
+
# Negative areas or fractions error reporting
if (
tfcoil_variables.a_tf_wp_conductor <= 0.0e0
@@ -3375,47 +4658,16 @@ def run(self, output: bool = False):
self.vv_stress_on_quench()
- # Cross-sectional area per turn
- a_tf_turn = tfcoil_variables.c_tf_total / (
- tfcoil_variables.j_tf_wp
- * tfcoil_variables.n_tf_coils
- * tfcoil_variables.n_tf_coil_turns
- )
-
- if (
- SuperconductorModel(tfcoil_variables.i_tf_sc_mat)
- == SuperconductorModel.CROCO_REBCO
- ):
- (
- tfcoil_variables.j_tf_wp_critical,
- tfcoil_variables.temp_tf_superconductor_margin,
- ) = self.supercon_croco(
- a_tf_turn,
- tfcoil_variables.b_tf_inboard_peak_with_ripple,
- tfcoil_variables.c_tf_turn,
- tfcoil_variables.tftmp,
- output=output,
- )
-
- tfcoil_variables.v_tf_coil_dump_quench_kv = (
- self.croco_voltage() / 1.0e3
- ) # TFC Quench voltage in kV
-
- if tfcoil_variables.i_str_wp == 0:
- strain = tfcoil_variables.str_tf_con_res
- else:
- strain = tfcoil_variables.str_wp
-
- tfcoil_variables.temp_tf_superconductor_margin = self.calculate_superconductor_temperature_margin(
- i_tf_superconductor=tfcoil_variables.i_tf_sc_mat,
- j_superconductor=superconducting_tf_coil_variables.j_tf_superconductor,
- b_tf_inboard_peak=tfcoil_variables.b_tf_inboard_peak_with_ripple,
- strain=strain,
- bc20m=superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain,
- tc0m=superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain,
- c0=1.0e10,
- temp_tf_coolant_peak_field=tfcoil_variables.tftmp,
- )
+ # tfcoil_variables.temp_tf_superconductor_margin = self.calculate_superconductor_temperature_margin(
+ # i_tf_superconductor=tfcoil_variables.i_tf_sc_mat,
+ # j_superconductor=superconducting_tf_coil_variables.j_tf_superconductor,
+ # b_tf_inboard_peak=tfcoil_variables.b_tf_inboard_peak_with_ripple,
+ # strain=strain,
+ # bc20m=superconducting_tf_coil_variables.b_tf_superconductor_critical_zero_temp_strain,
+ # tc0m=superconducting_tf_coil_variables.temp_tf_superconductor_critical_zero_field_strain,
+ # c0=1.0e10,
+ # temp_tf_coolant_peak_field=tfcoil_variables.tftmp,
+ # )
# Do current density protection calculation
# Only setup for Nb3Sn at present.
@@ -3448,404 +4700,238 @@ def run(self, output: bool = False):
)
)
- tfcoil_variables.v_tf_coil_dump_quench_kv = (
- v_tf_coil_dump_quench / 1.0e3
- ) # TFC Quench voltage in kV
+ tfcoil_variables.v_tf_coil_dump_quench_kv = (
+ v_tf_coil_dump_quench / 1.0e3
+ ) # TFC Quench voltage in kV
+
+ if output:
+ self.output_general_tf_info()
+ self.output_croco_info()
+
+ def tf_croco_averaged_turn_geometry(
+ self,
+ j_tf_wp: float,
+ dx_tf_turn_steel: float,
+ dx_tf_turn_insulation: float,
+ dx_tf_turn_general: float,
+ c_tf_turn: float,
+ i_dx_tf_turn_general_input: bool,
+ i_dx_tf_turn_cable_space_general_input: bool,
+ dx_tf_turn_cable_space_general: float,
+ layer_ins: float,
+ a_tf_wp_no_insulation: float,
+ ) -> CROCOAveragedTurnGeometry:
+ """Subroutine straight from Python, see comments in tf_averaged_turn_geom_wrapper
+ Setting the TF WP turn geometry for SC magnets from the number
+ the current per turn.
+ This calculation has two purposes, first to check if a turn can exist
+ (positive cable space) and the second to provide its dimensions,
+ areas and the (float) number of turns
+
+ Parameters
+ ----------
+ j_tf_wp : float
+ Current density in the TF winding pack (in A/m²).
- if output:
- self.outtf()
+ dx_tf_turn_steel : float
+ Thickness of the steel layer in the TF turn (in meters).
- def supercon_croco(
- self, a_tf_turn, b_tf_inboard_peak_symmetric, iop, thelium, output: bool
- ):
- """TF superconducting CroCo conductor using REBCO tape
+ dx_tf_turn_insulation : float
+ Thickness of the insulation layer in the TF turn (in meters).
- Parameters
- ----------
- a_tf_turn :
+ i_tf_sc_mat : int
+ Identifier for the superconducting material type.
- b_tf_inboard_peak_symmetric :
- Peak field at conductor (T)
- iop :
- Operating current per turn (A)
- thelium :
- He temperature at peak field point (K)
- output:
+ dx_tf_turn_general : float
+ General dimension of the TF turn (in meters).
- """
- j_crit_sc: float = 0.0
- # Find critical current density in superconducting cable, j_crit_cable
- j_crit_sc, _ = superconductors.jcrit_rebco(thelium, b_tf_inboard_peak_symmetric)
- # tfcoil_variables.a_tf_turn_cable_space_no_void : Cable space - inside area (m2)
- # Set new rebco_variables.dia_croco_strand
- # allowing for scaling of rebco_variables.dia_croco_strand
- rebco_variables.dia_croco_strand = (
- tfcoil_variables.t_conductor / 3.0e0
- - tfcoil_variables.dx_tf_turn_steel * (2.0e0 / 3.0e0)
- )
- superconducting_tf_coil_variables.conductor_acs = (
- 9.0e0 / 4.0e0 * np.pi * rebco_variables.dia_croco_strand**2
- )
- tfcoil_variables.a_tf_turn_cable_space_no_void = (
- superconducting_tf_coil_variables.conductor_acs
- )
- superconducting_tf_coil_variables.conductor_area = (
- tfcoil_variables.t_conductor**2
- ) # does this not assume it's a sqaure???
+ c_tf_turn : float
+ Current per turn in the TF coil (in Amperes).
- superconducting_tf_coil_variables.conductor_jacket_area = (
- superconducting_tf_coil_variables.conductor_area
- - superconducting_tf_coil_variables.conductor_acs
- )
- tfcoil_variables.a_tf_turn_steel = (
- superconducting_tf_coil_variables.conductor_jacket_area
- )
+ i_dx_tf_turn_general_input : bool
+ Flag indicating if the general turn dimension is provided as input.
- superconducting_tf_coil_variables.conductor_jacket_fraction = (
- superconducting_tf_coil_variables.conductor_jacket_area
- / superconducting_tf_coil_variables.conductor_area
- )
- (
- superconducting_tf_coil_variables.croco_strand_area,
- superconducting_tf_coil_variables.croco_strand_critical_current,
- superconducting_tf_coil_variables.conductor_copper_area,
- superconducting_tf_coil_variables.conductor_copper_fraction,
- superconducting_tf_coil_variables.conductor_copper_bar_area,
- superconducting_tf_coil_variables.conductor_hastelloy_area,
- superconducting_tf_coil_variables.conductor_hastelloy_fraction,
- superconducting_tf_coil_variables.conductor_helium_area,
- superconducting_tf_coil_variables.conductor_helium_fraction,
- superconducting_tf_coil_variables.conductor_solder_area,
- superconducting_tf_coil_variables.conductor_solder_fraction,
- superconducting_tf_coil_variables.conductor_rebco_area,
- superconducting_tf_coil_variables.conductor_rebco_fraction,
- superconducting_tf_coil_variables.conductor_critical_current,
- ) = superconductors.croco(
- j_crit_sc,
- superconducting_tf_coil_variables.conductor_area,
- rebco_variables.dia_croco_strand,
- rebco_variables.dx_croco_strand_copper,
- )
+ i_dx_tf_turn_cable_space_general_input : bool
+ Flag indicating if the cable space dimension is provided as input.
- rebco_variables.coppera_m2 = (
- iop / superconducting_tf_coil_variables.conductor_copper_area
- )
+ dx_tf_turn_cable_space_general : float
+ General dimension of the cable space in the TF turn (in meters).
- icrit = superconducting_tf_coil_variables.conductor_critical_current
- j_crit_cable = (
- superconducting_tf_coil_variables.croco_strand_critical_current
- / superconducting_tf_coil_variables.croco_strand_area
- )
+ layer_ins : float
+ Thickness of the insulation layer in the TF turn (in meters).
- # Critical current density in winding pack
- # a_tf_turn : Area per turn (i.e. entire jacketed conductor with insulation) (m2)
- j_tf_wp_critical = icrit / a_tf_turn
- # Ratio of operating / critical current
- iooic = iop / icrit
- # Operating current density
- jwdgop = iop / a_tf_turn
- # Actual current density in superconductor,
- # which should be equal to jcrit(thelium+tmarg)
+ a_tf_wp_no_insulation : float
+ Area of the TF winding pack without insulation (in square meters).
- # when we have found the desired value of tmarg
- jsc = iooic * j_crit_sc
+ dia_tf_turn_coolant_channel : float
+ Diameter of the coolant channel in the TF turn (in meters).
- # Temperature margin
- current_sharing_t = superconductors.current_sharing_rebco(
- b_tf_inboard_peak_symmetric, jsc
- )
- tmarg = current_sharing_t - thelium
- tfcoil_variables.temp_margin = (
- tmarg # Only used in the availabilty routine - see comment to Issue #526
- )
+ f_a_tf_turn_cable_space_extra_void : float
+ Fraction of extra void space in the cable space of the TF turn.
- if output: # Output ----------------------------------
- total = (
- superconducting_tf_coil_variables.conductor_copper_area
- + superconducting_tf_coil_variables.conductor_hastelloy_area
- + superconducting_tf_coil_variables.conductor_solder_area
- + superconducting_tf_coil_variables.conductor_jacket_area
- + superconducting_tf_coil_variables.conductor_helium_area
- + superconducting_tf_coil_variables.conductor_rebco_area
- )
+ Returns
+ -------
+ CROCOAveragedTurnGeometry
+ A dataclass containing the calculated geometry of the TF turn, including:
+ - a_tf_turn: Area of the TF turn (in square meters).
+ - dx_tf_turn: Dimension of the TF turn (in meters).
+ - dr_tf_turn: Dimension of the TF turn (in meters).
+ - t_conductor: Thickness of the conductor in the TF turn (in meters).
+ - n_tf_coil_turns: Number of turns in the TF coil (not necessarily an integer).
+ - a_tf_turn_insulation: Area of the insulation in the TF turn (in square meters).
+ - a_tf_turn_cable_space_no_void: Area of the cable space in the TF turn without voids (in square meters).
+ - a_tf_turn_steel: Area of the steel in the TF turn (in square meters).
+ - a_tf_turn_cable_space_effective: Effective area of the cable space in the TF turn after accounting for cooling channels and voids (in square meters).
+ - f_a_tf_turn_cable_space_cooling: Fraction of the cable space used for cooling.
- if tfcoil_variables.temp_margin <= 0.0e0:
- logger.error(
- f"""Negative TFC temperature margin
- temp_margin: {tfcoil_variables.temp_margin}
- b_tf_inboard_peak_symmetric: {b_tf_inboard_peak_symmetric}"""
- )
+ """
+ # Turn dimension is a an input
+ if i_dx_tf_turn_general_input:
+ # Turn area [m2]
+ a_tf_turn = dx_tf_turn_general**2
- po.oheadr(self.outfile, "Superconducting TF Coils")
- po.ovarin(self.outfile, "Superconductor switch", "(isumat)", 6)
- po.ocmmnt(
- self.outfile, "Superconductor used: REBCO HTS tape in CroCo strand"
- )
+ # Current per turn [A]
+ c_tf_turn = a_tf_turn * j_tf_wp
- po.ovarre(
- self.outfile,
- "Thickness of REBCO layer in tape (m)",
- "(dx_hts_tape_rebco)",
- rebco_variables.dx_hts_tape_rebco,
- )
- po.ovarre(
- self.outfile,
- "Thickness of copper layer in tape (m)",
- "(dx_hts_tape_copper)",
- rebco_variables.dx_hts_tape_copper,
- )
- po.ovarre(
- self.outfile,
- "Thickness of Hastelloy layer in tape (m) ",
- "(dx_hts_tape_hastelloy)",
- rebco_variables.dx_hts_tape_hastelloy,
+ # Turn cable dimension is an input
+ elif i_dx_tf_turn_cable_space_general_input:
+ # Turn squared dimension [m]
+ dx_tf_turn_general = dx_tf_turn_cable_space_general + 2.0e0 * (
+ dx_tf_turn_insulation + dx_tf_turn_steel
)
- po.ovarre(
- self.outfile,
- "Mean width of tape (m)",
- "(dr_hts_tape)",
- rebco_variables.dr_hts_tape,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Diameter of a CroCo strand (m) ",
- "(dia_croco_strand)",
- rebco_variables.dia_croco_strand,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Inner diameter of CroCo copper tube (m) ",
- "(dia_croco_strand_tape_region)",
- rebco_variables.dia_croco_strand_tape_region,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Thickness of of o copper tube (m) ",
- "(dx_croco_strand_copper)",
- rebco_variables.dx_croco_strand_copper,
- )
+ # Turn area [m2]
+ a_tf_turn = dx_tf_turn_general**2
- po.ovarre(
- self.outfile,
- "Thickness of each HTS tape ",
- "(dx_hts_tape_total)",
- rebco_variables.dx_hts_tape_total,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Thickness of stack of rebco_variables.n_croco_strand_hts_tapes (m) ",
- "(dx_croco_strand_tape_stack)",
- rebco_variables.dx_croco_strand_tape_stack,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Number of rebco_variables.n_croco_strand_hts_tapes in strand",
- "(n_croco_strand_hts_tapes)",
- rebco_variables.n_croco_strand_hts_tapes,
- "OP ",
- )
- po.oblnkl(self.outfile)
- po.ovarre(
- self.outfile,
- "Area of REBCO in strand (m2)",
- "(a_croco_strand_rebco)",
- rebco_variables.a_croco_strand_rebco,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Area of copper in strand (m2)",
- "(a_croco_strand_copper_total)",
- rebco_variables.a_croco_strand_copper_total,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Area of hastelloy substrate in strand (m2) ",
- "(a_croco_strand_hastelloy)",
- rebco_variables.a_croco_strand_hastelloy,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Area of solder in strand (m2) ",
- "(a_croco_strand_solder)",
- rebco_variables.a_croco_strand_solder,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Total: area of CroCo strand (m2) ",
- "(croco_strand_area)",
- superconducting_tf_coil_variables.croco_strand_area,
- "OP ",
- )
- if (
- abs(
- superconducting_tf_coil_variables.croco_strand_area
- - (
- rebco_variables.a_croco_strand_rebco
- + rebco_variables.a_croco_strand_copper_total
- + rebco_variables.a_croco_strand_hastelloy
- + rebco_variables.a_croco_strand_solder
- )
- )
- > 1e-6
- ):
- po.ocmmnt(self.outfile, "ERROR: Areas in CroCo strand do not add up")
- logger.error("Areas in CroCo strand do not add up - see OUT.DAT")
+ # Current per turn [A]
+ c_tf_turn = a_tf_turn * j_tf_wp
- po.oblnkl(self.outfile)
- po.ocmmnt(self.outfile, "Cable information")
- po.ovarin(
- self.outfile,
- "Number of CroCo strands in the cable (fixed) ",
- "",
- 6,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Total area of cable space (m2)",
- "(a_tf_turn_cable_space_no_void)",
- tfcoil_variables.a_tf_turn_cable_space_no_void,
- "OP ",
- )
+ # Current per turn is an input
+ else:
+ # Turn area [m2]
+ # Allow for additional inter-layer insulation MDK 13/11/18
+ # Area of turn including conduit and inter-layer insulation
+ a_tf_turn = c_tf_turn / j_tf_wp
- po.oblnkl(self.outfile)
- po.ocmmnt(
- self.outfile,
- "Conductor information (includes jacket, not including insulation)",
- )
- po.ovarre(
- self.outfile,
- "Width of square conductor (cable + steel jacket) (m)",
- "(t_conductor)",
- tfcoil_variables.t_conductor,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Area of conductor (m2)",
- "(area)",
- superconducting_tf_coil_variables.conductor_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "REBCO area of conductor (mm2)",
- "(a_croco_strand_rebco)",
- superconducting_tf_coil_variables.conductor_rebco_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Area of central copper bar (mm2)",
- "(copper_bar_area)",
- superconducting_tf_coil_variables.conductor_copper_bar_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Total copper area of conductor, total (mm2)",
- "(a_croco_strand_copper_total)",
- superconducting_tf_coil_variables.conductor_copper_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Hastelloy area of conductor (mm2)",
- "(a_croco_strand_hastelloy)",
- superconducting_tf_coil_variables.conductor_hastelloy_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Solder area of conductor (mm2)",
- "(a_croco_strand_solder)",
- superconducting_tf_coil_variables.conductor_solder_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Jacket area of conductor (mm2)",
- "(jacket_area)",
- superconducting_tf_coil_variables.conductor_jacket_area,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Helium area of conductor (mm2)",
- "(helium_area)",
- superconducting_tf_coil_variables.conductor_helium_area,
- "OP ",
- )
- if abs(total - superconducting_tf_coil_variables.conductor_area) > 1e-8:
- po.ovarre(
- self.outfile,
- "ERROR: conductor areas do not add up:",
- "(total)",
- total,
- "OP ",
- )
- logger.error(f"conductor areas do not add up. total: {total}")
+ # Dimension of square cross-section of each turn including inter-turn insulation [m]
+ dx_tf_turn_general = np.sqrt(a_tf_turn)
+
+ # Square turn assumption
+ dr_tf_turn = dx_tf_turn_general
+ dx_tf_turn = dx_tf_turn_general
+
+ # See derivation in the following document
+ # k:\power plant physics and technology\process\hts\hts coil module for process.docx
+ t_conductor = (
+ -layer_ins + np.sqrt(layer_ins**2 + 4.0e00 * a_tf_turn)
+ ) / 2 - 2.0e0 * dx_tf_turn_insulation
+
+ # Total number of turns per TF coil (not required to be an integer)
+ n_tf_coil_turns = a_tf_wp_no_insulation / a_tf_turn
+
+ # Area of inter-turn insulation: single turn [m2]
+ a_tf_turn_insulation = a_tf_turn - t_conductor**2
+
+ a_tf_turn_cable_space_no_void = copy.copy(
+ tfcoil_variables.a_tf_turn_cable_space_no_void
+ )
+
+ # Diameter of circular cable space inside conduit [m]
+ dx_tf_turn_cable_space_average = t_conductor - 2.0e0 * dx_tf_turn_steel
+
+ # Cross-sectional area of conduit jacket per turn [m2]
+ a_tf_turn_steel = t_conductor**2 - a_tf_turn_cable_space_no_void
+
+ return CROCOAveragedTurnGeometry(
+ a_tf_turn_cable_space_no_void=a_tf_turn_cable_space_no_void,
+ a_tf_turn_steel=a_tf_turn_steel,
+ a_tf_turn_insulation=a_tf_turn_insulation,
+ n_tf_coil_turns=n_tf_coil_turns,
+ c_tf_turn=c_tf_turn,
+ dx_tf_turn_general=dx_tf_turn_general,
+ dr_tf_turn=dr_tf_turn,
+ dx_tf_turn=dx_tf_turn,
+ t_conductor=t_conductor,
+ dx_tf_turn_cable_space_average=dx_tf_turn_cable_space_average,
+ )
- po.ovarre(
- self.outfile,
- "Critical current of CroCo strand (A)",
- "(croco_strand_critical_current)",
- superconducting_tf_coil_variables.croco_strand_critical_current,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Critical current of conductor (A) ",
- "(conductor_critical_current)",
- superconducting_tf_coil_variables.conductor_critical_current,
- "OP ",
- )
+ def tf_croco_superconductor_properties(
+ self,
+ a_tf_turn: float,
+ b_tf_inboard_peak: float,
+ cur_tf_turn: float,
+ temp_tf_peak: float,
+ i_tf_superconductor: int,
+ output: bool,
+ ) -> TFSuperconductorLimits:
+ """TF superconducting CroCo conductor using REBCO tape
- if global_variables.run_tests == 1:
- po.oblnkl(self.outfile)
- po.ocmmnt(
- self.outfile,
- "PROCESS TF Coil peak field fit. Values for t, z and y:",
- )
- po.oblnkl(self.outfile)
- po.ovarre(
- self.outfile,
- "Dimensionless winding pack width",
- "(tf_fit_t)",
- superconducting_tf_coil_variables.tf_fit_t,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Dimensionless winding pack radial thickness",
- "(tf_fit_z)",
- superconducting_tf_coil_variables.tf_fit_z,
- "OP ",
- )
- po.ovarre(
- self.outfile,
- "Ratio of actual peak field to nominal axisymmetric peak field",
- "(f_b_tf_inboard_peak_ripple_symmetric)",
- superconducting_tf_coil_variables.f_b_tf_inboard_peak_ripple_symmetric,
- "OP ",
- )
+ Parameters
+ ----------
+ a_tf_turn :
+
+ b_tf_inboard_peak :
+ Peak field at conductor (T)
+ cur_tf_turn :
+ Operating current per turn (A)
+ temp_tf_peak :
+ He temperature at peak field point (K)
+ output:
+
+ """
+ # Find critical current density in superconducting cable, j_crit_cable
+ j_crit_sc, _, bc20m, tc0m = superconductors.jcrit_rebco(
+ temp_conductor=temp_tf_peak, b_conductor=b_tf_inboard_peak
+ )
+
+ superconducting_tf_coil_variables.cur_tf_turn_croco_strand_critical = (
+ j_crit_sc * superconducting_tf_coil_variables.a_tf_croco_strand
+ )
+
+ # Conductor properties
+ superconducting_tf_coil_variables.conductor_critical_current = (
+ superconducting_tf_coil_variables.cur_tf_turn_croco_strand_critical
+ * N_CROCO_STRANDS_TURN
+ )
+
+ superconducting_tf_coil_variables.tf_coppera_m2 = (
+ cur_tf_turn
+ / superconducting_tf_coil_variables.a_tf_turn_croco_cable_space_copper
+ )
+
+ cur_critical = superconducting_tf_coil_variables.conductor_critical_current
+ j_crit_cable = (
+ superconducting_tf_coil_variables.cur_tf_turn_croco_strand_critical
+ / superconducting_tf_coil_variables.a_tf_croco_strand
+ )
+
+ # Critical current density in winding pack
+ # a_tf_turn : Area per turn (i.e. entire jacketed conductor with insulation) (m2)
+ j_tf_wp_critical = cur_critical / a_tf_turn
+ # Ratio of operating / critical current
+ iooic = cur_tf_turn / cur_critical
+ # Operating current density
+ jwdgop = cur_tf_turn / a_tf_turn
+ # Actual current density in superconductor,
+ # which should be equal to jcrit(thelium+tmarg)
+
+ # when we have found the desired value of tmarg
+ jsc = iooic * j_crit_sc
+
+ # Temperature margin
+ current_sharing_t = superconductors.current_sharing_rebco(b_tf_inboard_peak, jsc)
+ tmarg = current_sharing_t - temp_tf_peak
+ tfcoil_variables.temp_margin = (
+ tmarg # Only used in the availabilty routine - see comment to Issue #526
+ )
+ if output: # Output ----------------------------------
po.oblnkl(self.outfile)
po.ovarre(
self.outfile,
"Helium temperature at peak field (= superconductor temperature) (K)",
- "(thelium)",
- thelium,
+ "(temp_tf_peak)",
+ temp_tf_peak,
)
po.ovarre(
self.outfile,
@@ -3897,7 +4983,6 @@ def supercon_croco(
current_sharing_t,
"OP ",
)
- po.ovarre(self.outfile, "Critical current (A)", "(icrit)", icrit, "OP ")
po.ovarre(
self.outfile,
"Actual current (A)",
@@ -3913,17 +4998,53 @@ def supercon_croco(
"OP ",
)
- return j_tf_wp_critical, tmarg
+ return TFSuperconductorLimits(
+ j_tf_wp_critical=j_tf_wp_critical,
+ j_superconductor_critical=j_crit_sc,
+ f_c_tf_turn_operating_critical=iooic,
+ j_superconductor=jsc,
+ j_tf_coil_turn=jwdgop,
+ bc20m=bc20m,
+ tc0m=tc0m,
+ c_turn_cables_critical=0.0,
+ )
@staticmethod
- def croco_voltage() -> float:
- """Calculate the CROCO voltage.
+ def tf_turn_croco_cable_space_properties(
+ t_conductor: float, dx_tf_turn_steel: float
+ ) -> CroCoCableSpaceGeometry:
- Returns
- -------
- float
- The calculated CROCO voltage based on the quench model.
- """
+ dia_tf_turn_croco_cable = t_conductor / 3.0e0 - dx_tf_turn_steel * (
+ 2.0e0 / 3.0e0
+ )
+
+ # Area of the full cable circle in the turn
+ a_tf_turn_cable_space_no_void = (
+ 9.0e0 / 4.0e0 * np.pi * dia_tf_turn_croco_cable**2
+ )
+ # Area of the full cable spac circle minus the central copper strand
+ a_tf_turn_cable_space_effective = (
+ a_tf_turn_cable_space_no_void - 0.25e0 * np.pi * dia_tf_turn_croco_cable**2
+ )
+
+ conductor_area = t_conductor**2 # does this not assume it's a sqaure???
+
+ conductor_jacket_area = conductor_area - a_tf_turn_cable_space_no_void
+ a_tf_turn_steel = conductor_jacket_area
+
+ conductor_jacket_fraction = conductor_jacket_area / conductor_area
+
+ return CroCoCableSpaceGeometry(
+ dia_tf_turn_croco_cable=dia_tf_turn_croco_cable,
+ a_tf_turn_cable_space_no_void=a_tf_turn_cable_space_no_void,
+ a_tf_turn_cable_space_effective=a_tf_turn_cable_space_effective,
+ a_tf_turn_steel=a_tf_turn_steel,
+ conductor_area=conductor_area,
+ conductor_jacket_area=conductor_jacket_area,
+ conductor_jacket_fraction=conductor_jacket_fraction,
+ )
+
+ def croco_voltage(self) -> float:
if tfcoil_variables.quench_model == "linear":
superconducting_tf_coil_variables.time2 = (
tfcoil_variables.t_tf_superconductor_quench
@@ -3932,7 +5053,7 @@ def croco_voltage() -> float:
2.0e0
/ superconducting_tf_coil_variables.time2
* (
- superconducting_tf_coil_variables.e_tf_magnetic_stored_total
+ tfcoil_variables.e_tf_magnetic_stored_total
/ tfcoil_variables.n_tf_coils
)
/ tfcoil_variables.c_tf_turn
@@ -3945,7 +5066,7 @@ def croco_voltage() -> float:
2.0e0
/ superconducting_tf_coil_variables.tau2
* (
- superconducting_tf_coil_variables.e_tf_magnetic_stored_total
+ tfcoil_variables.e_tf_magnetic_stored_total
/ tfcoil_variables.n_tf_coils
)
/ tfcoil_variables.c_tf_turn
@@ -3955,6 +5076,277 @@ def croco_voltage() -> float:
return croco_voltage
+ def output_croco_info(self):
+
+ po.oheadr(self.outfile, "Superconducting TF Coils")
+ po.ovarin(self.outfile, "Superconductor switch", "(isumat)", 6)
+ po.ocmmnt(self.outfile, "Superconductor used: REBCO HTS tape in CroCo strand")
+
+ po.ovarre(
+ self.outfile,
+ "Thickness of REBCO layer in tape (m)",
+ "(dx_tf_hts_tape_rebco)",
+ superconducting_tf_coil_variables.dx_tf_hts_tape_rebco,
+ )
+ po.ovarre(
+ self.outfile,
+ "Thickness of copper layer in tape (m)",
+ "(dx_tf_hts_tape_copper)",
+ superconducting_tf_coil_variables.dx_tf_hts_tape_copper,
+ )
+ po.ovarre(
+ self.outfile,
+ "Thickness of Hastelloy layer in tape (m) ",
+ "(dx_tf_hts_tape_hastelloy)",
+ superconducting_tf_coil_variables.dx_tf_hts_tape_hastelloy,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Mean width of tape (m)",
+ "(dr_tf_hts_tape)",
+ superconducting_tf_coil_variables.dr_tf_hts_tape,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Diameter of a CroCo strand (m) ",
+ "(dia_tf_turn_croco_cable)",
+ superconducting_tf_coil_variables.dia_tf_turn_croco_cable,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Inner diameter of CroCo copper tube (m) ",
+ "(dia_tf_croco_strand_tape_region)",
+ superconducting_tf_coil_variables.dia_tf_croco_strand_tape_region,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Thickness of of o copper tube (m) ",
+ "(dx_tf_croco_strand_copper)",
+ superconducting_tf_coil_variables.dx_tf_croco_strand_copper,
+ )
+
+ po.ovarre(
+ self.outfile,
+ "Thickness of each HTS tape ",
+ "(dx_tf_hts_tape_total)",
+ superconducting_tf_coil_variables.dx_tf_hts_tape_total,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Thickness of stack of rebco_variables.n_croco_strand_hts_tapes (m) ",
+ "(dx_tf_croco_strand_tape_stack)",
+ superconducting_tf_coil_variables.dx_tf_croco_strand_tape_stack,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Number of rebco_variables.n_tf_croco_strand_hts_tapes in strand",
+ "(n_tf_croco_strand_hts_tapes)",
+ superconducting_tf_coil_variables.n_tf_croco_strand_hts_tapes,
+ "OP ",
+ )
+ po.oblnkl(self.outfile)
+ po.ovarre(
+ self.outfile,
+ "Area of total CroCo strand (m2)",
+ "(a_tf_croco_strand)",
+ superconducting_tf_coil_variables.a_tf_croco_strand,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of REBCO in strand (m2)",
+ "(a_tf_croco_strand_rebco)",
+ superconducting_tf_coil_variables.a_tf_croco_strand_rebco,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of copper in strand (m2)",
+ "(a_tf_croco_strand_copper_total)",
+ superconducting_tf_coil_variables.a_tf_croco_strand_copper_total,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of hastelloy substrate in strand (m2) ",
+ "(a_tf_croco_strand_hastelloy)",
+ superconducting_tf_coil_variables.a_tf_croco_strand_hastelloy,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of solder in strand (m2) ",
+ "(a_tf_croco_strand_solder)",
+ superconducting_tf_coil_variables.a_tf_croco_strand_solder,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total: area of CroCo strand (m2) ",
+ "(a_tf_croco_strand)",
+ superconducting_tf_coil_variables.a_tf_croco_strand,
+ "OP ",
+ )
+ if (
+ abs(
+ superconducting_tf_coil_variables.a_tf_croco_strand
+ - (
+ superconducting_tf_coil_variables.a_tf_croco_strand_rebco
+ + superconducting_tf_coil_variables.a_tf_croco_strand_copper_total
+ + superconducting_tf_coil_variables.a_tf_croco_strand_hastelloy
+ + superconducting_tf_coil_variables.a_tf_croco_strand_solder
+ )
+ )
+ > 1e-6
+ ):
+ po.ocmmnt(self.outfile, "ERROR: Areas in CroCo strand do not add up")
+ logger.error("Areas in CroCo strand do not add up - see OUT.DAT")
+
+ po.oblnkl(self.outfile)
+ po.ocmmnt(self.outfile, "Cable information")
+ po.ovarin(
+ self.outfile,
+ "Number of CroCo strands in the cable (fixed) ",
+ "",
+ N_CROCO_STRANDS_TURN,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total area of cable space (m2)",
+ "(a_tf_turn_cable_space_no_void)",
+ tfcoil_variables.a_tf_turn_cable_space_no_void,
+ "OP ",
+ )
+
+ po.oblnkl(self.outfile)
+ po.ocmmnt(
+ self.outfile,
+ "Conductor information (includes jacket, not including insulation)",
+ )
+ po.ovarre(
+ self.outfile,
+ "Width of square conductor (cable + steel jacket) (m)",
+ "(t_conductor)",
+ tfcoil_variables.t_conductor,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of conductor (m2)",
+ "(area)",
+ superconducting_tf_coil_variables.conductor_area,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "REBCO area of conductor (mm2)",
+ "(a_tf_croco_strand_rebco)",
+ superconducting_tf_coil_variables.conductor_rebco_area,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Area of central copper bar (mm2)",
+ "(copper_bar_area)",
+ superconducting_tf_coil_variables.a_tf_turn_croco_copper_bar,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Total copper area of conductor, total (mm2)",
+ "(a_tf_croco_strand_copper_total)",
+ superconducting_tf_coil_variables.a_tf_turn_croco_cable_space_copper,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Hastelloy area of conductor (mm2)",
+ "(a_tf_croco_strand_hastelloy)",
+ superconducting_tf_coil_variables.a_tf_turn_croco_hastelloy,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Solder area of conductor (mm2)",
+ "(a_tf_croco_strand_solder)",
+ superconducting_tf_coil_variables.conductor_solder_area,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Jacket area of conductor (mm2)",
+ "(jacket_area)",
+ superconducting_tf_coil_variables.conductor_jacket_area,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Helium area of conductor (mm2)",
+ "(helium_area)",
+ superconducting_tf_coil_variables.conductor_helium_area,
+ "OP ",
+ )
+ # if abs(total - superconducting_tf_coil_variables.conductor_area) > 1e-8:
+ # po.ovarre(
+ # self.outfile,
+ # "ERROR: conductor areas do not add up:",
+ # "(total)",
+ # total,
+ # "OP ",
+ # )
+ # logger.error(f"conductor areas do not add up. total: {total}")
+
+ po.ovarre(
+ self.outfile,
+ "Critical current of CroCo strand (A)",
+ "(cur_tf_turn_croco_strand_critical)",
+ superconducting_tf_coil_variables.cur_tf_turn_croco_strand_critical,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Critical current of conductor (A) ",
+ "(conductor_critical_current)",
+ superconducting_tf_coil_variables.conductor_critical_current,
+ "OP ",
+ )
+
+ if global_variables.run_tests == 1:
+ po.oblnkl(self.outfile)
+ po.ocmmnt(
+ self.outfile,
+ "PROCESS TF Coil peak field fit. Values for t, z and y:",
+ )
+ po.oblnkl(self.outfile)
+ po.ovarre(
+ self.outfile,
+ "Dimensionless winding pack width",
+ "(tf_fit_t)",
+ superconducting_tf_coil_variables.tf_fit_t,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Dimensionless winding pack radial thickness",
+ "(tf_fit_z)",
+ superconducting_tf_coil_variables.tf_fit_z,
+ "OP ",
+ )
+ po.ovarre(
+ self.outfile,
+ "Ratio of actual peak field to nominal axisymmetric peak field",
+ "(f_b_tf_inboard_peak_ripple_symmetric)",
+ superconducting_tf_coil_variables.f_b_tf_inboard_peak_ripple_symmetric,
+ "OP ",
+ )
+
@staticmethod
def lambda_term(tau: float, omega: float) -> float:
diff --git a/tests/unit/models/test_superconductors.py b/tests/unit/models/test_superconductors.py
index 62477530b..a425fa152 100644
--- a/tests/unit/models/test_superconductors.py
+++ b/tests/unit/models/test_superconductors.py
@@ -3,6 +3,7 @@
import pytest
from process.models import superconductors
+from process.models.superconductors import CroCoCableGeometry
class IterscParam(NamedTuple):
@@ -144,7 +145,7 @@ def test_jcrit_nbti(jcritnbtiparam):
def test_jcrit_rebco():
- jcrit_rebco, validity = superconductors.jcrit_rebco(4.75, 7.0)
+ jcrit_rebco, validity, _, _ = superconductors.jcrit_rebco(4.75, 7.0)
assert jcrit_rebco == pytest.approx(55870234414.171684)
assert validity
@@ -221,19 +222,18 @@ def test_hijc_rebco():
1e-6, # 1 um
2e-6, # 2 um
3e-6, # 3 um
- (
- 0.008, # dia_croco_strand_tape_region
- pytest.approx(959.3950997769347, rel=1e-3), # n_croco_strand_hts_tapes
- pytest.approx(
+ CroCoCableGeometry(
+ dia_croco_strand_tape_region=0.008,
+ n_croco_strand_hts_tapes=pytest.approx(959.3950997769347, rel=1e-3),
+ a_croco_strand_copper_total=pytest.approx(
3.8934279435385194e-05, rel=1e-3
- ), # a_croco_strand_copper_total
- pytest.approx(
- 1.5989918329615573e-05, rel=1e-3
- ), # a_croco_strand_hastelloy
- pytest.approx(1.8285645798205533e-05, rel=1e-3), # a_croco_strand_solder
- pytest.approx(5.329972776538525e-06, rel=1e-3), # a_croco_strand_rebco
- pytest.approx(7.85398e-5, rel=1e-3), # croco_strand_area
- pytest.approx(5.5556e-3, rel=1e-3), # dr_hts_tape
+ ),
+ a_croco_strand_hastelloy=pytest.approx(1.5989918329615573e-05, rel=1e-3),
+ a_croco_strand_solder=pytest.approx(1.8285645798205533e-05, rel=1e-3),
+ a_croco_strand_rebco=pytest.approx(5.329972776538525e-06, rel=1e-3),
+ a_croco_strand=pytest.approx(7.85398e-5, rel=1e-3),
+ dr_hts_tape=pytest.approx(5.5556e-3, rel=1e-3),
+ dx_croco_strand_tape_stack=pytest.approx(0.005756370598661608, rel=1e-3),
),
),
(
@@ -242,15 +242,20 @@ def test_hijc_rebco():
1e-6,
2e-6,
3e-6,
- (
- 0.0044,
- pytest.approx(527.6673048773141, rel=1e-6),
- pytest.approx(1.0921535531100803e-05, rel=1e-6),
- pytest.approx(4.836950294708712e-06, rel=1e-6),
- pytest.approx(5.531407853957174e-06, rel=1e-6),
- pytest.approx(1.612316764902904e-06, rel=1e-6),
- pytest.approx(2.2902210444669593e-05, rel=1e-6),
- pytest.approx(0.0030555555555555553, rel=1e-6),
+ CroCoCableGeometry(
+ dia_croco_strand_tape_region=0.0044,
+ n_croco_strand_hts_tapes=pytest.approx(527.6673048773141, rel=1e-6),
+ a_croco_strand_copper_total=pytest.approx(
+ 1.0921535531100803e-05, rel=1e-6
+ ),
+ a_croco_strand_hastelloy=pytest.approx(4.836950294708712e-06, rel=1e-6),
+ a_croco_strand_solder=pytest.approx(5.531407853957174e-06, rel=1e-6),
+ a_croco_strand_rebco=pytest.approx(1.612316764902904e-06, rel=1e-6),
+ a_croco_strand=pytest.approx(2.2902210444669593e-05, rel=1e-6),
+ dr_hts_tape=pytest.approx(0.0030555555555555553, rel=1e-6),
+ dx_croco_strand_tape_stack=pytest.approx(
+ 0.0031660038292638847, rel=1e-6
+ ),
),
),
],
@@ -263,12 +268,11 @@ def test_calculate_croco_cable_geometry(
dx_hts_tape_hastelloy,
expected,
):
- result = superconductors.calculate_croco_cable_geometry(
+ result: CroCoCableGeometry = superconductors.calculate_croco_cable_geometry(
dia_croco_strand,
dx_croco_strand_copper,
dx_hts_tape_rebco,
dx_hts_tape_copper,
dx_hts_tape_hastelloy,
)
- for r, e in zip(result, expected, strict=True):
- assert r == e
+ assert result == expected
diff --git a/tests/unit/models/tfcoil/test_sctfcoil.py b/tests/unit/models/tfcoil/test_sctfcoil.py
index 3bb4fe104..d031e13c1 100644
--- a/tests/unit/models/tfcoil/test_sctfcoil.py
+++ b/tests/unit/models/tfcoil/test_sctfcoil.py
@@ -15,6 +15,7 @@
CICCAveragedTurnGeometry,
CICCIntegerTurnGeometry,
SuperconductingTFCoil,
+ TFSuperconductorLimits,
)
@@ -434,16 +435,7 @@ def test_supercon(superconparam, monkeypatch, cicc_sctfcoil):
monkeypatch.setattr(global_variables, "run_tests", superconparam.run_tests)
- (
- j_tf_wp_critical,
- j_superconductor_critical,
- f_c_tf_turn_operating_critical,
- j_superconductor,
- j_tf_coil_turn,
- bc20m,
- tc0m,
- c_turn_cables_critical,
- ) = cicc_sctfcoil.tf_cable_in_conduit_superconductor_properties(
+ tf_limits: TFSuperconductorLimits = cicc_sctfcoil.tf_cable_in_conduit_superconductor_properties(
i_tf_superconductor=superconparam.i_tf_superconductor,
a_tf_turn_cable_space=superconparam.a_tf_turn_cable_space,
a_tf_turn=superconparam.a_tf_turn,
@@ -459,25 +451,31 @@ def test_supercon(superconparam, monkeypatch, cicc_sctfcoil):
tcritsc=superconparam.tcritsc,
)
- assert j_superconductor == pytest.approx(superconparam.expected_j_superconductor)
+ assert tf_limits.j_superconductor == pytest.approx(
+ superconparam.expected_j_superconductor
+ )
- assert j_tf_wp_critical == pytest.approx(superconparam.expected_j_tf_wp_critical)
+ assert tf_limits.j_tf_wp_critical == pytest.approx(
+ superconparam.expected_j_tf_wp_critical
+ )
- assert j_superconductor_critical == pytest.approx(
+ assert tf_limits.j_superconductor_critical == pytest.approx(
superconparam.expected_j_superconductor_critical
)
- assert f_c_tf_turn_operating_critical == pytest.approx(
+ assert tf_limits.f_c_tf_turn_operating_critical == pytest.approx(
superconparam.expected_f_c_tf_turn_operating_critical
)
- assert j_tf_coil_turn == pytest.approx(superconparam.expected_j_tf_coil_turn)
+ assert tf_limits.j_tf_coil_turn == pytest.approx(
+ superconparam.expected_j_tf_coil_turn
+ )
- assert bc20m == pytest.approx(superconparam.expected_bc20m)
+ assert tf_limits.bc20m == pytest.approx(superconparam.expected_bc20m)
- assert tc0m == pytest.approx(superconparam.expected_tc0m)
+ assert tf_limits.tc0m == pytest.approx(superconparam.expected_tc0m)
- assert c_turn_cables_critical == pytest.approx(
+ assert tf_limits.c_turn_cables_critical == pytest.approx(
superconparam.expected_c_turn_cables_critical
)
@@ -1241,8 +1239,6 @@ class TfAveragedTurnGeomParam(NamedTuple):
dx_tf_turn_cable_space_average: Any = None
- i_tf_sc_mat: Any = None
-
j_tf_wp: Any = None
dx_tf_turn_steel: Any = None
@@ -1283,7 +1279,6 @@ class TfAveragedTurnGeomParam(NamedTuple):
dr_tf_turn=0,
dx_tf_turn=0,
dx_tf_turn_cable_space_average=0,
- i_tf_sc_mat=5,
j_tf_wp=26493137.688284047,
dx_tf_turn_steel=0.0080000000000000019,
dx_tf_turn_insulation=0.00080000000000000004,
@@ -1309,7 +1304,6 @@ class TfAveragedTurnGeomParam(NamedTuple):
dr_tf_turn=0.049532469413859428,
dx_tf_turn=0.049532469413859428,
dx_tf_turn_cable_space_average=0.031932469413859424,
- i_tf_sc_mat=5,
j_tf_wp=26493137.688284047,
dx_tf_turn_steel=0.0080000000000000019,
dx_tf_turn_insulation=0.00080000000000000004,
@@ -1335,7 +1329,6 @@ class TfAveragedTurnGeomParam(NamedTuple):
dr_tf_turn=0.05872,
dx_tf_turn=0.05872,
dx_tf_turn_cable_space_average=0.04109,
- i_tf_sc_mat=1,
j_tf_wp=2.301e07,
dx_tf_turn_steel=8.015e-03,
dx_tf_turn_insulation=8.0e-4,
@@ -1361,7 +1354,6 @@ class TfAveragedTurnGeomParam(NamedTuple):
dr_tf_turn=0.05872,
dx_tf_turn=0.05872,
dx_tf_turn_cable_space_average=0.04109,
- i_tf_sc_mat=1,
j_tf_wp=2.673e07,
dx_tf_turn_steel=8.148e-03,
dx_tf_turn_insulation=8.0e-4,
@@ -1399,7 +1391,6 @@ def test_tf_cable_in_conduit_averaged_turn_geometry(
j_tf_wp=tfaveragedturngeomparam.j_tf_wp,
dx_tf_turn_steel=tfaveragedturngeomparam.dx_tf_turn_steel,
dx_tf_turn_insulation=tfaveragedturngeomparam.dx_tf_turn_insulation,
- i_tf_sc_mat=tfaveragedturngeomparam.i_tf_sc_mat,
dx_tf_turn_general=tfaveragedturngeomparam.dx_tf_turn_general,
c_tf_turn=tfaveragedturngeomparam.c_tf_turn,
i_dx_tf_turn_general_input=tfaveragedturngeomparam.i_dx_tf_turn_general_input,
diff --git a/tests/unit/models/tfcoil/test_tfcoil.py b/tests/unit/models/tfcoil/test_tfcoil.py
index 6b4072304..fe8a6ff50 100644
--- a/tests/unit/models/tfcoil/test_tfcoil.py
+++ b/tests/unit/models/tfcoil/test_tfcoil.py
@@ -304,7 +304,7 @@ def test_tf_global_geometry(
pytest.approx(12.4), # b_tf_inboard_peak_symmetric
pytest.approx(154999999.93042317), # c_tf_total
pytest.approx(9687499.995651448), # c_tf_coil
- pytest.approx(193749999.91302896), # oacdcp
+ pytest.approx(193749999.91302896), # j_tf_coil_full_area
),
),
(
@@ -317,7 +317,7 @@ def test_tf_global_geometry(
pytest.approx(8.333333333), # b_tf_inboard_peak_symmetric
pytest.approx(74999999.9663338), # c_tf_total
pytest.approx(6249999.997194484), # c_tf_coil
- pytest.approx(149999999.9326676), # oacdcp
+ pytest.approx(149999999.9326676), # j_tf_coil_full_area
),
),
],