diff --git a/documentation/eng-models/superconductors.md b/documentation/eng-models/superconductors.md index d1d014901c..cbf303c754 100644 --- a/documentation/eng-models/superconductors.md +++ b/documentation/eng-models/superconductors.md @@ -375,6 +375,74 @@ The critical current density for a single REBCO strand can be seen below: ------------------------- + +### CroCo Cable Geometry | `calculate_croco_cable_geometry()` + +The geometry of a single CroCo cable is calculated as follows: + +1. The diameter of the circular internal tape region is given by the outer copper diameter minus its thickness: + + $$ + \overbrace{D_{\text{cable,internal}}}^{\texttt{dia_croco_strand_tape_region}} = \overbrace{D_{\text{cable}}}^{\texttt{dia_croco_strand}} - \overbrace{dx_{\text{cable,copper}}}^{\texttt{dx_croco_strand_copper}} + $$ + +2. The total thickness of the HTS tape is found: + + $$ + \overbrace{dx_{\text{tape}}}^{\texttt{dx_hts_tape_total}} = \overbrace{dx_{\text{tape,REBCO}}}^{\texttt{dx_hts_tape_rebco}} + \overbrace{dx_{\text{tape,copper}}}^{\texttt{dx_hts_tape_copper}} + \overbrace{dx_{\text{tape,Hastelloy}}}^{\texttt{dx_hts_tape_hastelloy}} + $$ + +3. The width of the tape is scaled to be: + + $$ + \overbrace{dr_{\text{tape}}^2}^{\texttt{dr_hts_tape}} = \frac{D_{\text{cable,internal}}\times 0.00375}{0.0054} + $$ + +4. The height of the tape stack at the centre of the cable is found using the tape width and diameter of the region: + + $$ + \overbrace{dx_{\text{tape,stack}}}^{\texttt{dx_croco_strand_tape_stack}} = \sqrt{D_{\text{cable,internal}}^2-\overbrace{dr_{\text{tape}}^2}^{\texttt{dr_hts_tape}}} + $$ + +5. The number of tapes in the stack is thus: + + $$ + \overbrace{N_{\text{cable,tapes}}}^{\texttt{n_croco_strand_hts_tapes}} = \frac{dx_{\text{tape,stack}}}{dx_{\text{tape}}} + $$ + +6. The total copper area in the strand (from the copper sheath and inside the tapes) is: + + $$ + \overbrace{A_{\text{cable,copper}}}^{\texttt{a_croco_strand_copper_total}} = \left(\left(\pi D_{\text{cable}} dx_{\text{cable,copper}}\right) - \pi dx_{\text{cable,copper}}^2\right)\\ + + \left(dx_{\text{tape,copper}}dr_{\text{tape}}N_{\text{cable,tapes}}\right) + $$ + +7. The total Hastelloy area in the strand is: + + $$ + \overbrace{A_{\text{cable,Hastelloy}}}^{\texttt{a_croco_strand_hastelloy}} = dx_{\text{tape,Hastelloy}}dr_{\text{tape}}N_{\text{cable,tapes}} + $$ + +8. The area of the solder surrounding the tape stack is: + + $$ + \overbrace{A_{\text{cable,solder}}}^{\texttt{a_croco_strand_solder}} = \frac{\pi}{4}D_{\text{cable,internal}}^2 - dx_{\text{tape,stack}}dr_{\text{tape}} + $$ + +9. The total area of REBCO in the tape stack is: + + $$ + \overbrace{A_{\text{cable,REBCO}}}^{\texttt{a_croco_strand_hts_tapes}} = dx_{\text{tape,REBCO}}dr_{\text{tape}}N_{\text{cable,tapes}} + $$ + +10. The total area of the cable is thus: + + $$ + \overbrace{A_{\text{cable}}}^{\texttt{a_croco_strand}} = \frac{\pi}{4}D_{\text{cable}}^2 + $$ + +------------------------ + ### Durham Ginzburg-Landau Model Derivation The Durham scaling law [^6] is derived from the well-known equation for the volume pinning force $F_p$: diff --git a/process/data_structure/numerics.py b/process/data_structure/numerics.py index e3a94efa25..c52ba408e0 100644 --- a/process/data_structure/numerics.py +++ b/process/data_structure/numerics.py @@ -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) fplhsep (f-value for equation 73) -* (138) rebco_thickness : thickness of REBCO layer in tape (m) -* (139) copper_thick : thickness of copper layer in tape (m) +* (138) dx_hts_tape_rebco : thickness of REBCO layer in tape (m) +* (139) dx_hts_tape_copper : thickness of copper layer in tape (m) * (140) dr_tf_wp_with_insulation : radial thickness of TFC winding pack (m) * (141) ftemp_croco_quench_max : TF coil quench temperature < temp_croco_quench_max (f-value for equation 74) * (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) fvs_cs_pf_total_ramp : F-value for available to required start up flux (con. 51) -* (158) croco_thick : Thickness of CroCo copper tube (m) +* (158) dx_croco_strand_copper : Thickness of CroCo copper tube (m) * (159) ftoroidalgap : F-value for toroidalgap > dx_tf_inboard_out_toroidal constraint (con. 82) * (160) f_avspace (f-value for equation 83) * (161) fbeta_min (f-value for equation 84) diff --git a/process/data_structure/rebco_variables.py b/process/data_structure/rebco_variables.py index 4cc508f5cd..420999564d 100644 --- a/process/data_structure/rebco_variables.py +++ b/process/data_structure/rebco_variables.py @@ -1,26 +1,26 @@ -rebco_thickness: float = None +dx_hts_tape_rebco: float = None """thickness of REBCO layer in tape (m) (`iteration variable 138`)""" -copper_thick: float = None +dx_hts_tape_copper: float = None """thickness of copper layer in tape (m) (`iteration variable 139`)""" -hastelloy_thickness: float = None +dx_hts_tape_hastelloy: float = None """thickness of Hastelloy layer in tape (m)""" -tape_width: float = None +dr_hts_tape: float = None """Mean width of tape (m)""" -tape_thickness: float = None +dx_hts_tape_total: float = None """thickness of tape, inc. all layers (hts, copper, substrate, etc.) (m)""" -croco_od: float = None +dia_croco_strand: float = None """Outer diameter of CroCo strand (m)""" -croco_id: float = None -"""Inner diameter of CroCo copper tube (m)""" +dia_croco_strand_tape_region: float = None +"""Inner diameter of CroCo strand tape region (m)""" -croco_thick: float = None -"""Thickness of CroCo copper tube (m) (`iteration variable 158`)""" +dx_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""" @@ -43,64 +43,72 @@ f_copperaoh_m2: float = None """f-value for constraint 88: CS coil current / copper area < copperA_m2_max""" -stack_thickness: float = None +dx_croco_strand_tape_stack: float = None +"""Width / thickness of tape stack in CroCo strand (m)""" -tapes: float = None +n_croco_strand_hts_tapes: float = None +"""Number of HTS tapes in CroCo strand""" -rebco_area: float = None +a_croco_strand_rebco: float = None +"""Area of REBCO in CroCo strand (m2)""" -copper_area: float = None +a_croco_strand_copper_total: float = None +"""Area of copper in CroCo strand (includes tapes and outer tube) (m2)""" -hastelloy_area: float = None +a_croco_strand_hastelloy: float = None +"""Area of Hastelloy in CroCo strand (m2)""" -solder_area: float = None +a_croco_strand_solder: float = None +"""Area of solder in CroCo strand (m2)""" -croco_area: float = None +a_croco_strand: float = None +"""Total area of a CroCo strand (m2)""" def init_rebco_variables(): """Initialise the REBCO variables""" - global rebco_thickness - global copper_thick - global hastelloy_thickness - global tape_width - global croco_od - global croco_id - global croco_thick + global dx_hts_tape_rebco + global dx_hts_tape_copper + global dx_hts_tape_hastelloy + global dr_hts_tape + global dia_croco_strand + global dia_croco_strand_tape_region + global dx_croco_strand_copper global copper_rrr global coppera_m2_max global f_coppera_m2 - global tape_thickness - global stack_thickness - global tapes - global rebco_area - global copper_area - global hastelloy_area - global solder_area - global croco_area + global dx_hts_tape_total + global dx_croco_strand_tape_stack + global n_croco_strand_hts_tapes + global a_croco_strand_rebco + global a_croco_strand_copper_total + global a_croco_strand_hastelloy + global a_croco_strand_solder + global a_croco_strand global copperA_m2 global copperaoh_m2_max global f_copperaoh_m2 global copperaoh_m2 - rebco_thickness = 1.0e-6 - copper_thick = 100.0e-6 - hastelloy_thickness = 50.0e-6 - tape_width = 4.0e-3 - croco_od = 0.0 - croco_id = 0.0 - croco_thick = 2.5e-3 + dx_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 coppera_m2_max = 1.0e8 f_coppera_m2 = 1.0 - tape_thickness = 6.5e-5 - stack_thickness = 0.0 - tapes = 0.0 - rebco_area = 0.0 - copper_area = 0.0 - hastelloy_area = 0.0 - solder_area = 0.0 - croco_area = 0.0 + dx_hts_tape_total = 6.5e-5 + dx_croco_strand_tape_stack = 0.0 + n_croco_strand_hts_tapes = 0.0 + a_croco_strand_rebco = 0.0 + a_croco_strand_copper_total = 0.0 + a_croco_strand_hastelloy = 0.0 + a_croco_strand_solder = 0.0 + a_croco_strand = 0.0 + copperA_m2 = 0.0 copperaoh_m2_max = 1.0e8 f_copperaoh_m2 = 1.0 diff --git a/process/input.py b/process/input.py index f5f7ed8404..264f199b15 100644 --- a/process/input.py +++ b/process/input.py @@ -360,7 +360,7 @@ def __post_init__(self): "copper_rrr": InputVariable( data_structure.rebco_variables, float, range=(1.0, 10000.0) ), - "copper_thick": InputVariable( + "dx_hts_tape_copper": InputVariable( data_structure.rebco_variables, float, range=(0.0, 0.001) ), "copperaoh_m2": InputVariable( @@ -417,7 +417,7 @@ def __post_init__(self): "crane_clrnc_v": InputVariable( data_structure.buildings_variables, float, range=(0.0, 10.0) ), - "croco_thick": InputVariable( + "dx_croco_strand_copper": InputVariable( data_structure.rebco_variables, float, range=(0.001, 0.1) ), "cryomag_h": InputVariable( @@ -1057,7 +1057,7 @@ def __post_init__(self): "n_ecrh_harmonic": InputVariable( data_structure.current_drive_variables, float, range=(1.0, 10.0) ), - "hastelloy_thickness": InputVariable( + "dx_hts_tape_hastelloy": InputVariable( data_structure.rebco_variables, float, range=(1e-08, 0.001) ), "hccl": InputVariable(data_structure.buildings_variables, float, range=(0.0, 10.0)), @@ -1448,7 +1448,7 @@ def __post_init__(self): "reactor_wall_thk": InputVariable( data_structure.buildings_variables, float, range=(0.25, 25.0) ), - "rebco_thickness": InputVariable( + "dx_hts_tape_rebco": InputVariable( data_structure.rebco_variables, float, range=(1e-08, 0.0001), @@ -1639,10 +1639,10 @@ def __post_init__(self): "t_turn_tf_max": InputVariable( data_structure.tfcoil_variables, float, range=(0.0, 1.0) ), - "tape_thickness": InputVariable( + "dx_hts_tape_total": InputVariable( data_structure.rebco_variables, float, range=(0.0, 0.1) ), - "tape_width": InputVariable( + "dr_hts_tape": InputVariable( data_structure.rebco_variables, float, range=(0.0, 0.1) ), "tauee_in": InputVariable( diff --git a/process/io/obsolete_vars.py b/process/io/obsolete_vars.py index 4af269207d..081e405ac8 100644 --- a/process/io/obsolete_vars.py +++ b/process/io/obsolete_vars.py @@ -451,6 +451,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", } OBS_VARS_HELP = { diff --git a/process/io/plot_proc.py b/process/io/plot_proc.py index b2a418eae5..42540791ec 100644 --- a/process/io/plot_proc.py +++ b/process/io/plot_proc.py @@ -10695,6 +10695,90 @@ def plot_plasma_poloidal_pressure_contours( axis.set_title("Plasma Poloidal Pressure Contours") +def plot_corc_cable_geometry( + axis, + 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, +): + """ + Plot the geometry of a CroCo strand cable. + + :param axis: The matplotlib axis to plot on. + :type axis: matplotlib.axes._axes.Axes + :param dia_croco_strand: Diameter of the CroCo strand (in meters). + :type dia_croco_strand: float + :param dx_croco_strand_copper: Thickness of the copper layer (in meters). + :type dx_croco_strand_copper: float + :param dr_hts_tape: Radius of the HTS tape stack (in meters). + :type dr_hts_tape: float + :param dx_croco_strand_tape_stack: Height of the HTS tape stack (in meters). + :type dx_croco_strand_tape_stack: float + :param n_croco_strand_hts_tapes: Number of HTS tape layers in the stack. + :type n_croco_strand_hts_tapes: int + """ + # Plot a circle with the given diameter and copper edges + circle = Circle( + (0, 0), + radius=(dia_croco_strand / 2) * 1000, + edgecolor="#B87333", + facecolor="#B87333", + linewidth=2, + label="Copper jacket", + ) + 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, + edgecolor="grey", + facecolor="grey", + linewidth=2, + label="Solder", + ) + 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", + ) + 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) + 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.minorticks_on() + axis.legend(loc="upper right") + + def main_plot( fig0, fig1, diff --git a/process/iteration_variables.py b/process/iteration_variables.py index e7e86ac400..6880205110 100644 --- a/process/iteration_variables.py +++ b/process/iteration_variables.py @@ -346,10 +346,10 @@ class IterationVariable: ), 137: IterationVariable("fplhsep", data_structure.physics_variables, 0.001, 1.0), 138: IterationVariable( - "rebco_thickness", data_structure.physics_variables, 0.01e-6, 100.0e-6 + "dx_hts_tape_rebco", data_structure.physics_variables, 0.01e-6, 100.0e-6 ), 139: IterationVariable( - "copper_thick", data_structure.rebco_variables, 1.0e-6, 1.0e-3 + "dx_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 @@ -388,7 +388,7 @@ class IterationVariable: "fvs_cs_pf_total_ramp", data_structure.pfcoil_variables, 1.0e-3, 1.0e1 ), 158: IterationVariable( - "croco_thick", data_structure.rebco_variables, 1.0e-3, 1.0e-1 + "dx_croco_strand_copper", data_structure.rebco_variables, 1.0e-3, 1.0e-1 ), 159: IterationVariable( "ftoroidalgap", data_structure.tfcoil_variables, 1.0e-4, 1.0 diff --git a/process/pfcoil.py b/process/pfcoil.py index d3badb0191..4da06af40f 100644 --- a/process/pfcoil.py +++ b/process/pfcoil.py @@ -4170,9 +4170,9 @@ def superconpf(bmax, fhe, fcu, jwp, isumat, fhts, strain, thelium, bcritsc, tcri bmax, bc20m, tc0m, - rcv.tape_width, - rcv.rebco_thickness, - rcv.tape_thickness, + rcv.dr_hts_tape, + rcv.dx_hts_tape_rebco, + rcv.dx_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/superconducting_tf_coil.py b/process/superconducting_tf_coil.py index f60eea9e1b..aa99dda4df 100644 --- a/process/superconducting_tf_coil.py +++ b/process/superconducting_tf_coil.py @@ -448,14 +448,14 @@ def supercon_croco( # 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.croco_od - # allowing for scaling of rebco_variables.croco_od - rebco_variables.croco_od = ( + # 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.croco_od**2 + 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 @@ -494,8 +494,8 @@ def supercon_croco( ) = superconductors.croco( j_crit_sc, superconducting_tf_coil_variables.conductor_area, - rebco_variables.croco_od, - rebco_variables.croco_thick, + rebco_variables.dia_croco_strand, + rebco_variables.dx_croco_strand_copper, ) rebco_variables.coppera_m2 = ( @@ -556,98 +556,98 @@ def supercon_croco( po.ovarre( self.outfile, "Thickness of REBCO layer in tape (m)", - "(rebco_thickness)", - rebco_variables.rebco_thickness, + "(dx_hts_tape_rebco)", + rebco_variables.dx_hts_tape_rebco, ) po.ovarre( self.outfile, "Thickness of copper layer in tape (m)", - "(copper_thick )", - rebco_variables.copper_thick, + "(dx_hts_tape_copper)", + rebco_variables.dx_hts_tape_copper, ) po.ovarre( self.outfile, "Thickness of Hastelloy layer in tape (m) ", - "(hastelloy_thickness)", - rebco_variables.hastelloy_thickness, + "(dx_hts_tape_hastelloy)", + rebco_variables.dx_hts_tape_hastelloy, ) po.ovarre( self.outfile, "Mean width of tape (m)", - "(tape_width)", - rebco_variables.tape_width, + "(dr_hts_tape)", + rebco_variables.dr_hts_tape, "OP ", ) po.ovarre( self.outfile, - "Outer diameter of CroCo copper tube (m) ", - "(croco_od)", - rebco_variables.croco_od, + "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) ", - "(croco_id)", - rebco_variables.croco_id, + "(dia_croco_strand_tape_region)", + rebco_variables.dia_croco_strand_tape_region, "OP ", ) po.ovarre( self.outfile, - "Thickness of CroCo copper tube (m) ", - "(croco_thick)", - rebco_variables.croco_thick, + "Thickness of of o copper tube (m) ", + "(dx_croco_strand_copper)", + rebco_variables.dx_croco_strand_copper, ) po.ovarre( self.outfile, "Thickness of each HTS tape ", - "(tape_thickness)", - rebco_variables.tape_thickness, + "(dx_hts_tape_total)", + rebco_variables.dx_hts_tape_total, "OP ", ) po.ovarre( self.outfile, - "Thickness of stack of rebco_variables.tapes (m) ", - "(stack_thickness)", - rebco_variables.stack_thickness, + "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.tapes in strand", - "(tapes)", - rebco_variables.tapes, + "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)", - "(rebco_area)", - rebco_variables.rebco_area, + "(a_croco_strand_rebco)", + rebco_variables.a_croco_strand_rebco, "OP ", ) po.ovarre( self.outfile, "Area of copper in strand (m2)", - "(copper_area)", - rebco_variables.copper_area, + "(a_croco_strand_copper_total)", + rebco_variables.a_croco_strand_copper_total, "OP ", ) po.ovarre( self.outfile, "Area of hastelloy substrate in strand (m2) ", - "(hastelloy_area)", - rebco_variables.hastelloy_area, + "(a_croco_strand_hastelloy)", + rebco_variables.a_croco_strand_hastelloy, "OP ", ) po.ovarre( self.outfile, "Area of solder in strand (m2) ", - "(solder_area)", - rebco_variables.solder_area, + "(a_croco_strand_solder)", + rebco_variables.a_croco_strand_solder, "OP ", ) po.ovarre( @@ -661,10 +661,10 @@ def supercon_croco( abs( superconducting_tf_coil_variables.croco_strand_area - ( - rebco_variables.rebco_area - + rebco_variables.copper_area - + rebco_variables.hastelloy_area - + rebco_variables.solder_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 @@ -711,7 +711,7 @@ def supercon_croco( po.ovarre( self.outfile, "REBCO area of conductor (mm2)", - "(rebco_area)", + "(a_croco_strand_rebco)", superconducting_tf_coil_variables.conductor_rebco_area, "OP ", ) @@ -725,21 +725,21 @@ def supercon_croco( po.ovarre( self.outfile, "Total copper area of conductor, total (mm2)", - "(copper_area)", + "(a_croco_strand_copper_total)", superconducting_tf_coil_variables.conductor_copper_area, "OP ", ) po.ovarre( self.outfile, "Hastelloy area of conductor (mm2)", - "(hastelloy_area)", + "(a_croco_strand_hastelloy)", superconducting_tf_coil_variables.conductor_hastelloy_area, "OP ", ) po.ovarre( self.outfile, "Solder area of conductor (mm2)", - "(solder_area)", + "(a_croco_strand_solder)", superconducting_tf_coil_variables.conductor_solder_area, "OP ", ) @@ -1250,9 +1250,9 @@ def tf_cable_in_conduit_superconductor_properties( b_conductor=b_tf_inboard_peak, b_c20max=bc20m, t_c0=tc0m, - tape_width=rebco_variables.tape_width, - rebco_thickness=rebco_variables.rebco_thickness, - tape_thickness=rebco_variables.tape_thickness, + 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, ) # Scale for the copper area fraction of the cable j_cables_critical = j_superconductor_critical * ( diff --git a/process/superconductors.py b/process/superconductors.py index 430d7fc13d..a800b8f1c0 100644 --- a/process/superconductors.py +++ b/process/superconductors.py @@ -522,9 +522,9 @@ def hijc_rebco( b_conductor: float, b_c20max: float, t_c0: float, - tape_width: float, - rebco_thickness: float, - tape_thickness: float, + dr_hts_tape: float, + dx_hts_tape_rebco: float, + dx_hts_tape_total: float, ) -> tuple[float, float, float]: """ Calculates the critical current density, critical field, and critical temperature @@ -539,12 +539,12 @@ def hijc_rebco( :type b_c20max: float :param t_c0: Critical temperature (K) at zero field and strain. :type t_c0: float - :param tape_width: Width of the tape (m). - :type tape_width: float - :param rebco_thickness: Thickness of the REBCO layer (m). - :type rebco_thickness: float - :param tape_thickness: Total thickness of the tape (m). - :type tape_thickness: float + :param dr_hts_tape: Width of the tape (m). + :type dr_hts_tape: float + :param dx_hts_tape_rebco: Thickness of the REBCO layer (m). + :type dx_hts_tape_rebco: float + :param dx_hts_tape_total: Total thickness of the tape (m). + :type dx_hts_tape_total: float :return: Tuple containing: - j_critical: Critical current density in superconductor (A/m²). - b_critical: Critical field (T). @@ -625,7 +625,9 @@ def hijc_rebco( # between tape stacks and CORC cable layouts. j_critical = ( - j_critical * (tape_width * rebco_thickness) / (tape_width * tape_thickness) + j_critical + * (dr_hts_tape * dx_hts_tape_rebco) + / (dr_hts_tape * dx_hts_tape_total) ) return j_critical, b_critical, temp_critical @@ -850,69 +852,156 @@ def bottura_scaling( return j_scaling, b_critical, temp_critical -def croco(j_crit_sc, conductor_area, croco_od, croco_thick): +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 +]: + """ + Calculate geometry and areas for a CroCo cable strand. + + :param dia_croco_strand: Diameter of CroCo strand (m) + :type dia_croco_strand: float + :param dx_croco_strand_copper: Thickness of copper layer in CroCo strand (m) + :type dx_croco_strand_copper: float + :param dx_hts_tape_rebco: Thickness of REBCO layer in HTS tape (m) + :type dx_hts_tape_rebco: float + :param dx_hts_tape_copper: Thickness of copper layer in HTS tape (m) + :type dx_hts_tape_copper: float + :param dx_hts_tape_hastelloy: Thickness of Hastelloy layer in HTS tape (m) + :type dx_hts_tape_hastelloy: float + + :return: 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) + :rtype: tuple[float, float, float, float, float, float, float, float] + """ + + # Calculate the inner diameter of the CroCo strand tape region + dia_croco_strand_tape_region = dia_croco_strand - 2.0 * dx_croco_strand_copper + if dia_croco_strand_tape_region <= 0.0: + logger.error("Negative inner CroCo cable diameter") + + # Total thickness of HTS tape + dx_hts_tape_total = dx_hts_tape_rebco + dx_hts_tape_copper + dx_hts_tape_hastelloy + + scaling = dia_croco_strand_tape_region / 5.4e-3 + dr_hts_tape = scaling * 3.75e-3 + + # Calculate the height of HTS tapes in the CroCo strand + dx_croco_strand_tape_stack = np.sqrt( + dia_croco_strand_tape_region**2 - dr_hts_tape**2 + ) + # Number of HTS tapes in the CroCo strand + n_croco_strand_hts_tapes = dx_croco_strand_tape_stack / dx_hts_tape_total + + # Area of copper in the CroCo strand (copper tube + copper in HTS tapes) + a_croco_strand_copper_total = ( + np.pi * dx_croco_strand_copper * dia_croco_strand + - np.pi * dx_croco_strand_copper**2 + + dx_hts_tape_copper * dr_hts_tape * n_croco_strand_hts_tapes + ) + # Area of Hastelloy in the CroCo strand + a_croco_strand_hastelloy = ( + dx_hts_tape_hastelloy * dr_hts_tape * n_croco_strand_hts_tapes + ) + # Area of solder in the CroCo strand surrounding the HTS tapes + a_croco_strand_solder = ( + np.pi / 4.0 * dia_croco_strand_tape_region**2 + - dx_croco_strand_tape_stack * dr_hts_tape + ) + + # Area of REBCO in the CroCo strand + a_croco_strand_rebco = dx_hts_tape_rebco * dr_hts_tape * n_croco_strand_hts_tapes + # 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. """ - d = croco_od - # d = conductor_width / 3.0d0 - dx_tf_turn_steel * ( 2.0d0 / 3.0d0 ) - - croco_id = d - 2.0 * croco_thick # scaling * 5.4d-3 - if croco_id <= 0.0: - logger.error("Negitive inner croco diameter") - - # Define the scaling factor for the input REBCO variable - # Ratio of new croco inner diameter and fixed base line value - scaling = croco_id / 5.4e-3 - tape_width = scaling * 3.75e-3 - # Properties of a single strand - tape_thickness = ( - rebco_variables.rebco_thickness - + rebco_variables.copper_thick - + rebco_variables.hastelloy_thickness - ) - stack_thickness = np.sqrt(croco_id**2 - tape_width**2) - tapes = stack_thickness / tape_thickness - - copper_area = ( - np.pi * croco_thick * d - - np.pi * croco_thick**2 - + rebco_variables.copper_thick - * tape_width - * tapes # copper tube # copper in tape + + ( + 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, ) - hastelloy_area = rebco_variables.hastelloy_thickness * tape_width * tapes - solder_area = np.pi / 4.0 * croco_id**2 - stack_thickness * tape_width - rebco_area = rebco_variables.rebco_thickness * tape_width * tapes - croco_strand_area = np.pi / 4.0 * d**2 - croco_strand_critical_current = j_crit_sc * rebco_area + 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)/croco_strand_area + # 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 = croco_strand_area - conductor_copper_area = copper_area * 6.0 + conductor_copper_bar_area + 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 * d**2 + conductor_helium_area = np.pi / 2.0 * dia_croco_strand**2 conductor_helium_fraction = conductor_helium_area / conductor_area - conductor_hastelloy_area = hastelloy_area * 6.0 + conductor_hastelloy_area = a_croco_strand_hastelloy * 6.0 conductor_hastelloy_fraction = conductor_hastelloy_area / conductor_area - conductor_solder_area = solder_area * 6.0 + conductor_solder_area = a_croco_strand_solder * 6.0 conductor_solder_fraction = conductor_solder_area / conductor_area - conductor_rebco_area = rebco_area * 6.0 + conductor_rebco_area = a_croco_strand_rebco * 6.0 conductor_rebco_fraction = conductor_rebco_area / conductor_area return ( - croco_strand_area, + a_croco_strand, croco_strand_critical_current, conductor_copper_area, conductor_copper_fraction, @@ -998,9 +1087,9 @@ def superconductor_current_density_margin( b_superconductor, bc20m, tc0m, - rebco_variables.tape_width, - rebco_variables.rebco_thickness, - rebco_variables.tape_thickness, + rebco_variables.dr_hts_tape, + rebco_variables.dx_hts_tape_rebco, + rebco_variables.dx_hts_tape_total, )[0], } diff --git a/tests/regression/input_files/st_regression.IN.DAT b/tests/regression/input_files/st_regression.IN.DAT index 77f88eb97b..2112d6b28a 100644 --- a/tests/regression/input_files/st_regression.IN.DAT +++ b/tests/regression/input_files/st_regression.IN.DAT @@ -910,27 +910,27 @@ i_tf_sc_mat = 9 * REBCO HTS SETTINGS * *--------------------* -*tape_width = +*dr_hts_tape = * DESCRIPTION: Mean width of tape (m) (default = 4.0E-3) * JUSTIFICATION: -*tape_thickness = +*dx_hts_tape_total = * DESCRIPTION: Thickness of tape, inc. all layers (hts, copper, substrate, etc.) (m) (default = 6.5E-5) * JUSTIFICATION: -*hastelloy_thickness = +*dx_hts_tape_hastelloy = * DESCRIPTION: Thickness of Hastelloy layer in HTS tape (m) (default = 50.0E-6) * JUSTIFICATION: *ixc = 138 -*rebco_thickness = 1.0E-6 +*dx_hts_tape_rebco = 1.0E-6 *boundl(138) = *boundu(138) = * DESCRIPTION: Thickness of REBCO layer in tape (m) (iteration variable 138) (default = 1.0E-6) * JUSTIFICATION: *ixc = 139 -*copper_thick = +*dx_hts_tape_copper = *boundl(139) = *boundu(139) = * DESCRIPTION: Thickness of copper layer in tape (m) (iteration variable 139) (default = 100.0E-6) diff --git a/tests/unit/test_superconductors.py b/tests/unit/test_superconductors.py index 63da8cd460..018c05c0e6 100644 --- a/tests/unit/test_superconductors.py +++ b/tests/unit/test_superconductors.py @@ -193,11 +193,75 @@ def test_hijc_rebco(): b_conductor=7.0, b_c20max=30.0, t_c0=25.0, - tape_width=4.0e-3, - rebco_thickness=1.0e-6, - tape_thickness=6.5e-5, + dr_hts_tape=4.0e-3, + dx_hts_tape_rebco=1.0e-6, + dx_hts_tape_total=6.5e-5, ) assert jcrit == pytest.approx(111046017.5) assert bcrit == pytest.approx(22.335736687814954) assert tcrit == pytest.approx(24.999125) + + +@pytest.mark.parametrize( + "dia_croco_strand, dx_croco_strand_copper, dx_hts_tape_rebco, dx_hts_tape_copper, dx_hts_tape_hastelloy, expected", + [ + ( + 0.010, # 10 mm + 0.001, # 1 mm + 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( + 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 + ), + ), + ( + 0.0054, # baseline diameter + 0.0005, # baseline copper thickness + 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), + ), + ), + ], +) +def test_calculate_croco_cable_geometry( + dia_croco_strand, + dx_croco_strand_copper, + dx_hts_tape_rebco, + dx_hts_tape_copper, + dx_hts_tape_hastelloy, + expected, +): + result = 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