Skip to content

Commit 28a8229

Browse files
committed
Enhance tf_step_vertical_tape_averaged_turn_geometry with detailed parameterization and validation checks
1 parent 35fa7c9 commit 28a8229

2 files changed

Lines changed: 274 additions & 113 deletions

File tree

process/superconducting_tf_coil.py

Lines changed: 138 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -3446,46 +3446,87 @@ def tf_cable_in_conduit_averaged_turn_geometry(
34463446

34473447
def tf_step_vertical_tape_averaged_turn_geometry(
34483448
self,
3449-
j_tf_wp,
3450-
dx_tf_turn_steel,
3451-
dx_tf_turn_insulation,
3452-
i_tf_sc_mat,
3453-
dx_tf_turn_general,
3454-
c_tf_turn,
3455-
i_dx_tf_turn_general_input,
3456-
i_dx_tf_turn_cable_space_general_input,
3457-
dx_tf_turn_cable_space_general,
3458-
layer_ins,
3459-
a_tf_wp_no_insulation,
3460-
dia_tf_turn_coolant_channel,
3461-
f_a_tf_turn_cable_space_extra_void,
3462-
):
3463-
"""
3464-
subroutine straight from Python, see comments in tf_averaged_turn_geom_wrapper
3465-
Authors : J. Morris, CCFE
3466-
Authors : S. Kahn, CCFE
3467-
Setting the TF WP turn geometry for SC magnets from the number
3468-
the current per turn.
3469-
This calculation has two purposes, first to check if a turn can exist
3470-
(positive cable space) and the second to provide its dimensions,
3471-
areas and the (float) number of turns
3449+
j_tf_wp: float,
3450+
dx_tf_turn_insulation: float,
3451+
dx_tf_turn_general: float,
3452+
c_tf_turn: float,
3453+
i_dx_tf_turn_general_input: bool,
3454+
dia_tf_turn_coolant_channel: float,
3455+
c_tf_coil: float,
3456+
a_tf_wp_no_insulation: float,
3457+
) -> tuple[
3458+
float, # dr_tf_turn
3459+
float, # dx_tf_turn
3460+
float, # c_tf_turn
3461+
float, # n_tf_coil_turns
3462+
float, # dr_tf_turn_stabiliser
3463+
float, # dx_tf_turn_stabiliser
3464+
float, # x_tf_turn_coolant_channel_centre
3465+
float, # dr_tf_turn_tape_stack
3466+
float, # dx_tf_turn_tape_stack
3467+
float, # a_tf_turn_tape_stack
3468+
float, # a_tf_turn_insulation
3469+
float, # a_tf_turn_stabiliser
3470+
]:
34723471
"""
3472+
Calculate the integer-turn geometry for TF coil turns using a vertical
3473+
stacked tape (REBCO-style) conductor.
34733474
3474-
# Turn dimension is a an input
3475-
if i_dx_tf_turn_general_input:
3476-
# Turn area [m2]
3477-
a_tf_turn = dx_tf_turn_general**2
3475+
:param float dr_tf_wp_with_insulation:
3476+
Radial thickness of the winding pack including insulation (m).
3477+
:param float dx_tf_wp_insulation:
3478+
Thickness of winding-pack insulation (m).
3479+
:param float dx_tf_wp_insertion_gap:
3480+
Insertion gap thickness inside the winding pack (m).
3481+
:param int n_tf_wp_layers:
3482+
Number of radial layers (turn rows).
3483+
:param float dx_tf_wp_toroidal_min:
3484+
Minimum toroidal thickness of the winding pack (m).
3485+
:param int n_tf_wp_pancakes:
3486+
Number of toroidal pancakes per radial layer.
3487+
:param float c_tf_coil:
3488+
Total TF coil current (A).
3489+
:param float dx_tf_turn_insulation:
3490+
Thickness of the turn (intra-turn) insulation (m).
3491+
:param float dia_tf_turn_coolant_channel:
3492+
Diameter of the coolant channel inside the conductor (m).
34783493
3479-
# Current per turn [A]
3480-
c_tf_turn = a_tf_turn * j_tf_wp
3494+
:returns: Tuple containing:
3495+
- dr_tf_turn (float): Radial turn dimension (m).
3496+
- dx_tf_turn (float): Toroidal turn dimension (m).
3497+
- c_tf_turn (float): Current per turn (A).
3498+
- n_tf_coil_turns (float): Total number of turns in a TF coil
3499+
(float, integer-valued).
3500+
- dr_tf_turn_stabiliser (float): Radial dimension of conductor
3501+
stabiliser region (m).
3502+
- dx_tf_turn_stabiliser (float): Toroidal dimension of conductor
3503+
stabiliser region (m).
3504+
- x_tf_turn_coolant_channel_centre (float): Centre position of the
3505+
coolant channel measured from the inner face (m).
3506+
- dr_tf_turn_tape_stack (float): Width of the tape stack in the
3507+
radial direction (m).
3508+
- dx_tf_turn_tape_stack (float): Height of the tape stack in the
3509+
toroidal direction (m).
3510+
- a_tf_turn_tape_stack (float): Cross-sectional area of the tape
3511+
stack per turn (m^2).
3512+
:rtype: tuple[float, float, float, float, float, float, float, float, float, float]
34813513
3482-
# Turn cable dimension is an input
3483-
elif i_dx_tf_turn_cable_space_general_input:
3484-
# Turn squared dimension [m]
3485-
dx_tf_turn_general = dx_tf_turn_cable_space_general + 2.0e0 * (
3486-
dx_tf_turn_insulation + dx_tf_turn_steel
3487-
)
3514+
:notes:
3515+
- Assumes rectangular turns and places the coolant channel near the
3516+
bottom of the conductor with a small clearance from the tape stack.
3517+
- Basic consistency checks are emitted via logger.error() if
3518+
calculated dimensions are non-positive or if the coolant channel
3519+
conflicts with the conductor geometry.
3520+
3521+
:references:
3522+
- E. Nasr, S. C. Wimbush, P. Noonan, P. Harris, R. Gowland, and A. Petrov,
3523+
“The magnetic cage,” Philosophical Transactions of the Royal Society A Mathematical Physical and Engineering Sciences,
3524+
vol. 382, no. 2280, Aug. 2024, doi: https://doi.org/10.1098/rsta.2023.0407.
3525+
3526+
"""
34883527

3528+
# Turn dimension is a an input
3529+
if i_dx_tf_turn_general_input:
34893530
# Turn area [m2]
34903531
a_tf_turn = dx_tf_turn_general**2
34913532

@@ -3504,105 +3545,89 @@ def tf_step_vertical_tape_averaged_turn_geometry(
35043545

35053546
# Square turn assumption
35063547
dr_tf_turn = dx_tf_turn_general
3548+
3549+
if dr_tf_turn <= (2.0e0 * dx_tf_turn_insulation):
3550+
logger.error(
3551+
"Negative cable space dimension; reduce conduit thicknesses or raise c_tf_turn. "
3552+
f"{dr_tf_turn=} {dx_tf_turn_insulation=}"
3553+
)
3554+
35073555
dx_tf_turn = dx_tf_turn_general
35083556

3509-
# See derivation in the following document
3510-
# k:\power plant physics and technology\process\hts\hts coil module for process.docx
3511-
t_conductor = (
3512-
-layer_ins + np.sqrt(layer_ins**2 + 4.0e00 * a_tf_turn)
3513-
) / 2 - 2.0e0 * dx_tf_turn_insulation
3557+
if dx_tf_turn <= (2.0e0 * dx_tf_turn_insulation):
3558+
logger.error(
3559+
"Negative cable space dimension; reduce conduit thicknesses or raise c_tf_turn. "
3560+
f"{dx_tf_turn=} {dx_tf_turn_insulation=}"
3561+
)
35143562

35153563
# Total number of turns per TF coil (not required to be an integer)
35163564
n_tf_coil_turns = a_tf_wp_no_insulation / a_tf_turn
35173565

3518-
# Area of inter-turn insulation: single turn [m2]
3519-
a_tf_turn_insulation = a_tf_turn - t_conductor**2
3520-
3521-
# NOTE: Fortran has a_tf_turn_cable_space_no_void as an intent(out) variable that was outputting
3522-
# into tfcoil_variables.a_tf_turn_cable_space_no_void. The local variable, however, appears to
3523-
# initially hold the value of tfcoil_variables.a_tf_turn_cable_space_no_void despite not being
3524-
# intent(in). I have replicated this behaviour in Python for now.
3525-
a_tf_turn_cable_space_no_void = copy.copy(
3526-
tfcoil_variables.a_tf_turn_cable_space_no_void
3527-
)
3528-
3529-
# ITER like turn structure
3530-
if i_tf_sc_mat != 6:
3531-
# Radius of rounded corners of cable space inside conduit [m]
3532-
radius_tf_turn_cable_space_corners = dx_tf_turn_steel * 0.75e0
3533-
3534-
# Dimension of square cable space inside conduit [m]
3535-
dx_tf_turn_cable_space_average = t_conductor - 2.0e0 * dx_tf_turn_steel
3566+
# Current per turn [A/turn]
3567+
c_tf_turn = c_tf_coil / n_tf_coil_turns
35363568

3537-
# Cross-sectional area of cable space per turn
3538-
# taking account of rounded inside corners [m2]
3539-
a_tf_turn_cable_space_no_void = (
3540-
dx_tf_turn_cable_space_average**2
3541-
- (4.0e0 - np.pi) * radius_tf_turn_cable_space_corners**2
3542-
)
3569+
# Radial and toroidal dimension of conductor region containing tape stack and cooling pipe [m]
3570+
dr_tf_turn_stabiliser = dr_tf_turn - 2.0e0 * dx_tf_turn_insulation
3571+
dx_tf_turn_stabiliser = dx_tf_turn - 2.0e0 * dx_tf_turn_insulation
35433572

3544-
# Calculate the true effective cable space by taking away the cooling
3545-
# channel and the extra void fraction
3573+
# Place coolant channel at bottom of turn with a gap equal to 10% of conductor height
3574+
x_tf_turn_coolant_channel_centre = (
3575+
dx_tf_turn_insulation
3576+
+ (0.1 * dx_tf_turn_stabiliser)
3577+
+ (dia_tf_turn_coolant_channel / 2)
3578+
)
35463579

3547-
a_tf_turn_cable_space_effective = (
3548-
a_tf_turn_cable_space_no_void
3549-
-
3550-
# Coolant channel area
3551-
(
3552-
(np.pi / 4.0e0)
3553-
* dia_tf_turn_coolant_channel
3554-
* dia_tf_turn_coolant_channel
3555-
)
3556-
# Additional void area deduction
3557-
- (a_tf_turn_cable_space_no_void * f_a_tf_turn_cable_space_extra_void)
3580+
# Check to make sure coolant channel leaves some gap to the tape stack
3581+
if x_tf_turn_coolant_channel_centre > (dx_tf_turn_stabiliser / 2) - (
3582+
0.1 * dx_tf_turn_stabiliser
3583+
) - (dia_tf_turn_coolant_channel / 2):
3584+
logger.error(
3585+
"Coolant channel too big for turn conductor dimension; reduce coolant channel diameter or increase turn dimensions."
3586+
f"{x_tf_turn_coolant_channel_centre=} {dx_tf_turn_stabiliser=}"
35583587
)
35593588

3560-
f_a_tf_turn_cable_space_cooling = 1 - (
3561-
a_tf_turn_cable_space_effective / a_tf_turn_cable_space_no_void
3562-
)
3589+
# Width of the tape stack allows for 10% of copper stabiliser on each side
3590+
dr_tf_turn_tape_stack = dr_tf_turn_stabiliser * 0.8
35633591

3564-
if a_tf_turn_cable_space_no_void <= 0.0e0:
3565-
if t_conductor < 0.0e0:
3566-
logger.error(
3567-
f"Negative cable space dimension. {a_tf_turn_cable_space_no_void=} "
3568-
f"{dx_tf_turn_cable_space_average=}"
3569-
)
3570-
else:
3571-
logger.error(
3572-
"Cable space area problem; artificially set rounded corner radius to 0. "
3573-
f"{a_tf_turn_cable_space_no_void=} {dx_tf_turn_cable_space_average=}"
3574-
)
3575-
radius_tf_turn_cable_space_corners = 0.0e0
3576-
a_tf_turn_cable_space_no_void = dx_tf_turn_cable_space_average**2
3592+
# Bottom of tape stack starts at the centre of the turn and allows for 10% of conductor height above
3593+
dx_tf_turn_tape_stack = (dx_tf_turn / 2) - (
3594+
dx_tf_turn_insulation + (0.1 * dx_tf_turn_stabiliser)
3595+
)
35773596

3578-
# Cross-sectional area of conduit jacket per turn [m2]
3579-
a_tf_turn_steel = t_conductor**2 - a_tf_turn_cable_space_no_void
3597+
# Cross-sectional area of tape stack per turn []
3598+
a_tf_turn_tape_stack = dr_tf_turn_tape_stack * dx_tf_turn_tape_stack
35803599

3581-
# REBCO turn structure
3582-
elif i_tf_sc_mat == 6:
3583-
# Diameter of circular cable space inside conduit [m]
3584-
dx_tf_turn_cable_space_average = t_conductor - 2.0e0 * dx_tf_turn_steel
3600+
# Area of inter-turn insulation: single turn [m²]
3601+
a_tf_turn_insulation = (dr_tf_turn * dx_tf_turn) - (
3602+
dr_tf_turn_stabiliser * dx_tf_turn_stabiliser
3603+
)
35853604

3586-
# Cross-sectional area of conduit jacket per turn [m2]
3587-
a_tf_turn_steel = t_conductor**2 - a_tf_turn_cable_space_no_void
3605+
# Area of stabiliser region per turn [m²]
3606+
a_tf_turn_stabiliser = (
3607+
dr_tf_turn_stabiliser * dx_tf_turn_stabiliser
3608+
- a_tf_turn_tape_stack
3609+
- (np.pi / 4.0e0)
3610+
* dia_tf_turn_coolant_channel
3611+
* dia_tf_turn_coolant_channel
3612+
)
35883613

35893614
return (
3590-
a_tf_turn_cable_space_no_void,
3591-
a_tf_turn_steel,
3592-
a_tf_turn_insulation,
3593-
n_tf_coil_turns,
3594-
dx_tf_turn_general,
3595-
c_tf_turn,
3596-
dx_tf_turn_general,
35973615
dr_tf_turn,
35983616
dx_tf_turn,
3599-
t_conductor,
3600-
radius_tf_turn_cable_space_corners,
3601-
dx_tf_turn_cable_space_average,
3602-
a_tf_turn_cable_space_effective,
3603-
f_a_tf_turn_cable_space_cooling,
3617+
c_tf_turn,
3618+
n_tf_coil_turns,
3619+
dr_tf_turn_stabiliser,
3620+
dx_tf_turn_stabiliser,
3621+
x_tf_turn_coolant_channel_centre,
3622+
dr_tf_turn_tape_stack,
3623+
dx_tf_turn_tape_stack,
3624+
a_tf_turn_tape_stack,
3625+
a_tf_turn_insulation,
3626+
a_tf_turn_stabiliser,
36043627
)
36053628

3629+
# -------------
3630+
36063631
def superconducting_tf_coil_areas_and_masses(self):
36073632
# Mass of case [kg]
36083633
# ***

0 commit comments

Comments
 (0)