Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
0ebee1e
Refactor SuperconductorModel to include critical field and temperatur…
chris-ashe Jul 27, 2026
f4bff95
Replace hardcoded bc20m and tc0m values with dynamic properties from …
chris-ashe Jul 27, 2026
8cff8db
Replace hardcoded bc20m and tc0m values with dynamic properties from …
chris-ashe Jul 27, 2026
6de7dcf
Update Durham NbTi parameters to use defined properties for critical …
chris-ashe Jul 27, 2026
ce6b906
Remove hardcoded bc20m and tc0m values from PFCoil and CSCoil models,…
chris-ashe Jul 27, 2026
a9a2b8b
Remove hardcoded b_crit_upper_nbti and t_crit_nbti values, replacing …
chris-ashe Jul 27, 2026
af1c782
Update process/models/superconductors.py
chris-ashe Jul 28, 2026
5c9f7d9
Requested changes
chris-ashe Jul 28, 2026
a879dc4
Refactor CROCOSuperconductingTFCoil to use dynamic critical field and…
chris-ashe Aug 11, 2026
72b889a
Refactor REBCO superconductor model to use dynamic critical field and…
chris-ashe Aug 11, 2026
049a3c2
Refactor tests to replace hardcoded bc20max and tc0max values with dy…
chris-ashe Aug 12, 2026
605a6f3
Refactor jcrit_from_material to use named parameters for clarity
chris-ashe Aug 12, 2026
1fef638
Refactor critical surface scripts to use dynamic values from Supercon…
chris-ashe Aug 12, 2026
19e1d15
Removed wrongly added due to rebase, HTS tapes in CICC class
chris-ashe Aug 13, 2026
cd2bce7
Update documentation/scripts/plotting_scripts/eutf4_nb3sn_critical_su…
chris-ashe Aug 13, 2026
1fabe57
Update documentation/scripts/plotting_scripts/western_nb3sn_critical_…
chris-ashe Aug 13, 2026
caca5fa
Update documentation/scripts/plotting_scripts/2nd_gen_rebco_critical_…
chris-ashe Aug 13, 2026
e879428
Update documentation/scripts/plotting_scripts/western_nb3sn_critical_…
chris-ashe Aug 13, 2026
eeb9420
Refactor: Replace hardcoded b_c20m and tc0m values with Superconducto…
chris-ashe Aug 14, 2026
a867b50
Update tests/unit/models/tfcoil/test_sctfcoil.py
chris-ashe Aug 14, 2026
4b59b1e
Update tests/unit/models/tfcoil/test_sctfcoil.py
chris-ashe Aug 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

temp_c0max = 90.0 # Critical temperature (K) at zero field and strain
temp_c0max = (
SuperconductorModel.CROCO_REBCO.temp_crit_zero_field_strain
) # Critical temperature (K) at zero field and strain
b_c20max = (
132.5 # Upper critical field (T) for superconductor at zero temperature and strain
)
SuperconductorModel.CROCO_REBCO.b_crit_zero_field_strain
) # Upper critical field (T) for superconductor at zero temperature and strain
epsilon = 0.00 # Strain in superconductor

# Create a grid of temperature and field values
Expand All @@ -26,7 +29,12 @@
_,
_,
_,
) = superconductors.jcrit_rebco(temp_grid[i, j], b_grid[i, j])
) = superconductors.jcrit_rebco(
temp_conductor=temp_grid[i, j],
b_conductor=b_grid[i, j],
b_c20_max=b_c20max,
temp_c0_max=temp_c0max,
)
# Convert from A/m² to kA/mm² (1 A/m² = 1e-6 A/mm²)
j_scaling[i, j] *= 1e-9
print(f"j_scaling[{i}, {j}] = {j_scaling[i, j]} kA/mm²")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

# Create a grid of temperature and field values
temp_conductor = np.linspace(1, 8.0, 50) # Temperature range (K)
Expand All @@ -23,8 +24,8 @@
temp_conductor=temp_grid[i, j],
b_conductor=b_grid[i, j],
strain=0.0,
b_c20max=14.9,
t_c0=9.0,
b_c20max=SuperconductorModel.DURHAM_NBTI.b_crit_zero_field_strain,
t_c0=SuperconductorModel.DURHAM_NBTI.temp_crit_zero_field_strain,
)
# Convert from A/m² to kA/mm² (1 A/m² = 1e-6 A/mm²)
j_scaling[i, j] *= 1e-9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

# Create a grid of temperature and field values
temp_conductor = np.linspace(4.2, 30.0, 50) # Temperature range (K)
Expand All @@ -23,8 +24,8 @@
temp_conductor=temp_grid[i, j],
b_conductor=b_grid[i, j],
strain=0.0,
b_c20max=429.0,
t_c0=185.0,
b_c20max=SuperconductorModel.DURHAM_REBCO.b_crit_zero_field_strain,
t_c0=SuperconductorModel.DURHAM_REBCO.temp_crit_zero_field_strain,
)
# Convert from A/m² to kA/mm² (1 A/m² = 1e-6 A/mm²)
j_scaling[i, j] *= 1e-9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

# Upper critical field (T) for superconductor at zero temperature and strain
b_c20max = SuperconductorModel.ITER_NB3SN.b_crit_zero_field_strain
Comment thread
chris-ashe marked this conversation as resolved.

temp_c0max = (
SuperconductorModel.ITER_NB3SN.temp_crit_zero_field_strain
) # Critical temperature (K) at zero field and strain

temp_c0max = 16.06 # Critical temperature (K) at zero field and strain
b_c20max = (
32.97 # Upper critical field (T) for superconductor at zero temperature and strain
)
epsilon = 0.00 # Strain in superconductor

# Create a grid of temperature and field values
Expand Down
Comment thread
chris-ashe marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

# Create a grid of temperature and field values
temp_conductor = np.linspace(4.2, 40.0, 50) # Temperature range (K)
Expand All @@ -22,8 +23,8 @@
) = superconductors.hijc_rebco(
temp_conductor=temp_grid[i, j],
b_conductor=b_grid[i, j],
b_c20max=138.0,
t_c0=92.0,
b_c20max=SuperconductorModel.HAZELTON_ZHAI_REBCO.b_crit_zero_field_strain,
t_c0=SuperconductorModel.HAZELTON_ZHAI_REBCO.temp_crit_zero_field_strain,
tape_width=1.0,
rebco_thickness=1.0,
tape_thickness=1.0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

# Create a grid of temperature and field values
temp_conductor = np.linspace(1, 10.0, 50) # Temperature range (K)
Expand All @@ -22,8 +23,8 @@
temp_conductor=temp_grid[i, j],
b_conductor=b_grid[i, j],
c0=1e10,
b_c20max=15.0,
temp_c0max=9.3,
b_c20max=SuperconductorModel.OLD_LUBELL_NBTI.b_crit_zero_field_strain,
temp_c0max=SuperconductorModel.OLD_LUBELL_NBTI.temp_crit_zero_field_strain,
)
# Convert from A/m² to kA/mm² (1 A/m² = 1e-6 A/mm²)
j_scaling[i, j] *= 1e-9
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@
import plotly.graph_objects as go

from process.models import superconductors
from process.models.superconductors import SuperconductorModel

temp_c0max = 16.34 # Critical temperature (K) at zero field and strain
temp_c0max = (
SuperconductorModel.WST_NB3SN.temp_crit_zero_field_strain
) # Critical temperature (K) at zero field and strain
b_c20max = (
33.24 # Upper critical field (T) for superconductor at zero temperature and strain
)
SuperconductorModel.WST_NB3SN.b_crit_zero_field_strain
) # Upper critical field (T) for superconductor at zero temperature and strain
epsilon = 0.00 # Strain in superconductor

# Create a grid of temperature and field values
Expand Down
2 changes: 0 additions & 2 deletions process/core/input.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,6 @@ def bounds(self) -> tuple[NumberType | None, NumberType | None]:
"auxcool_w": InputVariable("buildings", float, range=(10.0, 1000.0)),
"p_hcd_injected_min_mw": InputVariable("constraints", float, range=(0.01, 100.0)),
"f_t_plant_available_min": InputVariable("costs", float, range=(0.0, 1.0)),
"b_crit_upper_nbti": InputVariable("tfcoil", float, range=(0.0, 30.0)),
"p_plant_electric_base": InputVariable(
"heat_transport", float, range=(1000000.0, 10000000000.0)
),
Expand Down Expand Up @@ -781,7 +780,6 @@ def bounds(self) -> tuple[NumberType | None, NumberType | None]:
"dx_tf_turn_cable_space_general": InputVariable("tfcoil", float, range=(0.0, 0.1)),
"t_crack_radial": InputVariable("cs_fatigue", float, range=(1e-05, 1.0)),
"t_crack_vertical": InputVariable("cs_fatigue", float, range=(1e-05, 1.0)),
"t_crit_nbti": InputVariable("tfcoil", float, range=(0.0, 15.0)),
"t_plant_pulse_plasma_current_ramp_up": InputVariable(
"times", float, range=(0.0, 10000.0)
),
Expand Down
6 changes: 0 additions & 6 deletions process/data_structure/tfcoil_variables.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,12 +184,6 @@ class TFData:
e_tf_coil_magnetic_stored: float = 0.0
"""Stored magnetic energy in a single TF coil (J)"""

b_crit_upper_nbti: float = 14.86
"""upper critical field of GL_nbti"""

t_crit_nbti: float = 9.04
"""critical temperature of GL_nbti"""

max_force_density: float = 0.0
"""Maximal (WP averaged) force density in TF coils at 1 point. (MN/m3)"""

Expand Down
73 changes: 47 additions & 26 deletions process/models/pfcoil.py
Original file line number Diff line number Diff line change
Expand Up @@ -886,8 +886,6 @@ def pfcoil(self):
temp_pf_peak_field=self.data.tfcoil.tftmp,
bcritsc=self.data.tfcoil.bcritsc,
tcritsc=self.data.tfcoil.tcritsc,
b_crit_upper_nbti=self.data.tfcoil.b_crit_upper_nbti,
t_crit_nbti=self.data.tfcoil.t_crit_nbti,
dr_hts_tape=self.data.superconducting_tfcoil.dr_tf_hts_tape,
dx_hts_tape_rebco=self.data.superconducting_tfcoil.dx_tf_hts_tape_rebco,
dx_hts_tape_total=self.data.superconducting_tfcoil.dx_tf_hts_tape_total,
Expand Down Expand Up @@ -3610,8 +3608,6 @@ def ohcalc(self):
temp_pf_peak_field=self.data.pf_coil.temp_cs_superconductor_operating,
bcritsc=self.data.tfcoil.bcritsc,
tcritsc=self.data.tfcoil.tcritsc,
b_crit_upper_nbti=self.data.tfcoil.b_crit_upper_nbti,
t_crit_nbti=self.data.tfcoil.t_crit_nbti,
dr_hts_tape=self.data.superconducting_tfcoil.dr_tf_hts_tape,
dx_hts_tape_rebco=self.data.superconducting_tfcoil.dx_tf_hts_tape_rebco,
dx_hts_tape_total=self.data.superconducting_tfcoil.dx_tf_hts_tape_total,
Expand Down Expand Up @@ -3660,8 +3656,6 @@ def ohcalc(self):
temp_pf_peak_field=self.data.pf_coil.temp_cs_superconductor_operating,
bcritsc=self.data.tfcoil.bcritsc,
tcritsc=self.data.tfcoil.tcritsc,
b_crit_upper_nbti=self.data.tfcoil.b_crit_upper_nbti,
t_crit_nbti=self.data.tfcoil.t_crit_nbti,
dr_hts_tape=self.data.superconducting_tfcoil.dr_tf_hts_tape,
dx_hts_tape_rebco=self.data.superconducting_tfcoil.dx_tf_hts_tape_rebco,
dx_hts_tape_total=self.data.superconducting_tfcoil.dx_tf_hts_tape_total,
Expand Down Expand Up @@ -4649,8 +4643,6 @@ def superconpf(
temp_pf_peak_field: float,
bcritsc: float,
tcritsc: float,
b_crit_upper_nbti: float,
t_crit_nbti: float,
dr_hts_tape: float,
dx_hts_tape_rebco: float,
dx_hts_tape_total: float,
Expand Down Expand Up @@ -4698,10 +4690,6 @@ def superconpf(
Critical field at zero temperature and strain [T] (isumat=4 only)
tcritsc : float
Critical temperature at zero field and strain [K] (isumat=4 only)
b_crit_upper_nbti: float
upper critical field of GL_nbti [T]
t_crit_nbti: float
critical temperature of GL_nbti [K]
dr_hts_tape: float
Mean width of tape [m]
dx_hts_tape_rebco: float
Expand Down Expand Up @@ -4733,8 +4721,12 @@ def j_crit_cable_frac(j_crit_sc, fcu, fhe):
# Find critical current density in superconducting strand, jcritstr
if isumat == SuperconductorModel.ITER_NB3SN:
# ITER Nb3Sn critical surface parameterization
bc20m = 32.97e0 # [T] critical field at 0 K and 0 strain
tc0m = 16.06e0 # [K] critical temperature at 0 T and 0 strain
bc20m = (
SuperconductorModel.ITER_NB3SN.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
tc0m = (
SuperconductorModel.ITER_NB3SN.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain

# j_crit_sc returned by superconductors.itersc is
# the critical current density in the superconductor
Expand Down Expand Up @@ -4772,8 +4764,12 @@ def j_crit_cable_frac(j_crit_sc, fcu, fhe):

elif isumat == SuperconductorModel.OLD_LUBELL_NBTI:
# NbTi data
bc20m = 15.0e0 # [T] critical field at 0 K and 0 strain
tc0m = 9.3e0 # [K] critical temperature at 0 T and 0 strain
bc20m = (
SuperconductorModel.OLD_LUBELL_NBTI.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
tc0m = (
SuperconductorModel.OLD_LUBELL_NBTI.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain
c0 = 1.0e10 # # [A/m²]
j_crit_sc, _ = superconductors.jcrit_nbti(
temp_conductor=temp_pf_peak_field,
Expand All @@ -4799,8 +4795,12 @@ def j_crit_cable_frac(j_crit_sc, fcu, fhe):

elif isumat == SuperconductorModel.WST_NB3SN:
# WST Nb3Sn parameterisation
bc20m = 32.97e0 # [T] critical field at 0 K and 0 strain
tc0m = 16.06e0 # [K] critical temperature at 0 T and 0 strain
bc20m = (
SuperconductorModel.WST_NB3SN.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
tc0m = (
SuperconductorModel.WST_NB3SN.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain

# j_crit_sc returned by superconductors.itersc is the critical current density
# in the superconductor - not the whole strand, which contains copper
Expand All @@ -4815,16 +4815,29 @@ def j_crit_cable_frac(j_crit_sc, fcu, fhe):
j_crit_cable = j_crit_cable_frac(j_crit_sc, fcu, fhe)

elif isumat == SuperconductorModel.CROCO_REBCO:
# "REBCO" 2nd generation HTS superconductor in CroCo strand
# "REBCO" 2nd generation HTS superconductor in CrCo strand
b_c20m = (
SuperconductorModel.CROCO_REBCO.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
t_c0m = (
SuperconductorModel.CROCO_REBCO.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain
j_crit_sc, _, _, _ = superconductors.jcrit_rebco(
temp_conductor=temp_pf_peak_field, b_conductor=b_pf_peak
temp_conductor=temp_pf_peak_field,
b_conductor=b_pf_peak,
b_c20_max=b_c20m,
temp_c0_max=t_c0m,
)
j_crit_cable = j_crit_cable_frac(j_crit_sc, fcu, fhe)

elif isumat == SuperconductorModel.DURHAM_NBTI:
# Durham Ginzburg-Landau critical surface model for Nb-Ti
bc20m = b_crit_upper_nbti # [T] critical field at 0 K and 0 strain
tc0m = t_crit_nbti # [K] critical temperature at 0 T and 0 strain
bc20m = (
SuperconductorModel.DURHAM_NBTI.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
tc0m = (
SuperconductorModel.DURHAM_NBTI.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain
j_crit_sc, _, _ = superconductors.gl_nbti(
temp_conductor=temp_pf_peak_field,
b_conductor=b_pf_peak,
Expand All @@ -4836,8 +4849,12 @@ def j_crit_cable_frac(j_crit_sc, fcu, fhe):

elif isumat == SuperconductorModel.DURHAM_REBCO:
# Durham Ginzburg-Landau critical surface model for REBCO
bc20m = 429e0 # [T] critical field at 0 K and 0 strain
tc0m = 185e0 # [K] critical temperature at 0 T and 0 strain
bc20m = (
SuperconductorModel.DURHAM_REBCO.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
tc0m = (
SuperconductorModel.DURHAM_REBCO.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain
j_crit_sc, _, _ = superconductors.gl_rebco(
temp_conductor=temp_pf_peak_field,
b_conductor=b_pf_peak,
Expand All @@ -4850,8 +4867,12 @@ def j_crit_cable_frac(j_crit_sc, fcu, fhe):

elif isumat == SuperconductorModel.HAZELTON_ZHAI_REBCO:
# Hazelton experimental data + Zhai conceptual model for REBCO
bc20m = 138 # [T] critical field at 0 K and 0 strain
tc0m = 92 # [K] critical temperature at 0 T and 0 strain
bc20m = (
SuperconductorModel.HAZELTON_ZHAI_REBCO.b_crit_zero_field_strain
) # [T] critical field at 0 K and 0 strain
tc0m = (
SuperconductorModel.HAZELTON_ZHAI_REBCO.temp_crit_zero_field_strain
) # [K] critical temperature at 0 T and 0 strain
j_crit_sc, _, _ = superconductors.hijc_rebco(
temp_conductor=temp_pf_peak_field,
b_conductor=b_pf_peak,
Expand Down
2 changes: 0 additions & 2 deletions process/models/stellarator/coils/calculate.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,11 +419,9 @@ def winding_pack_total_size(
b_max_k[k],
data.tfcoil.tftmp + data.tfcoil.tmargmin,
data.tfcoil.i_tf_sc_mat,
data.tfcoil.b_crit_upper_nbti,
data.tfcoil.bcritsc,
data.tfcoil.f_a_tf_turn_cable_copper,
data.tfcoil.fhts,
data.tfcoil.t_crit_nbti,
data.tfcoil.tcritsc,
data.tfcoil.f_a_tf_turn_cable_space_extra_void,
data.tfcoil.j_tf_wp,
Expand Down
Loading
Loading