fiqus 2025.2.0__py3-none-any.whl → 2025.10.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. fiqus/MainFiQuS.py +4 -9
  2. fiqus/data/DataConductor.py +350 -301
  3. fiqus/data/DataFiQuS.py +42 -115
  4. fiqus/data/DataFiQuSCCT.py +150 -150
  5. fiqus/data/DataFiQuSConductor.py +97 -84
  6. fiqus/data/DataFiQuSConductorAC_Strand.py +701 -565
  7. fiqus/data/DataModelCommon.py +439 -0
  8. fiqus/data/DataMultipole.py +0 -13
  9. fiqus/data/DataRoxieParser.py +7 -0
  10. fiqus/data/DataWindingsCCT.py +37 -37
  11. fiqus/data/RegionsModelFiQuS.py +61 -104
  12. fiqus/geom_generators/GeometryCCT.py +904 -905
  13. fiqus/geom_generators/GeometryConductorAC_Strand.py +1863 -1391
  14. fiqus/geom_generators/GeometryMultipole.py +5 -4
  15. fiqus/geom_generators/GeometryPancake3D.py +1 -1
  16. fiqus/getdp_runners/RunGetdpCCT.py +13 -4
  17. fiqus/getdp_runners/RunGetdpConductorAC_Strand.py +341 -201
  18. fiqus/getdp_runners/RunGetdpPancake3D.py +2 -2
  19. fiqus/mains/MainConductorAC_Strand.py +141 -133
  20. fiqus/mains/MainMultipole.py +6 -5
  21. fiqus/mains/MainPancake3D.py +3 -4
  22. fiqus/mesh_generators/MeshCCT.py +209 -209
  23. fiqus/mesh_generators/MeshConductorAC_Strand.py +709 -656
  24. fiqus/mesh_generators/MeshMultipole.py +43 -46
  25. fiqus/parsers/ParserDAT.py +16 -16
  26. fiqus/parsers/ParserGetDPOnSection.py +212 -212
  27. fiqus/parsers/ParserGetDPTimeTable.py +134 -134
  28. fiqus/parsers/ParserMSH.py +53 -53
  29. fiqus/parsers/ParserPOS.py +214 -214
  30. fiqus/parsers/ParserRES.py +142 -142
  31. fiqus/plotters/PlotPythonCCT.py +133 -133
  32. fiqus/plotters/PlotPythonConductorAC.py +1079 -855
  33. fiqus/plotters/PlotPythonMultipole.py +18 -18
  34. fiqus/post_processors/PostProcessCCT.py +444 -440
  35. fiqus/post_processors/PostProcessConductorAC.py +997 -49
  36. fiqus/post_processors/PostProcessMultipole.py +19 -19
  37. fiqus/pre_processors/PreProcessCCT.py +175 -175
  38. fiqus/pro_material_functions/ironBHcurves.pro +246 -246
  39. fiqus/pro_templates/combined/CCT_template.pro +275 -274
  40. fiqus/pro_templates/combined/ConductorAC_template.pro +1474 -1025
  41. fiqus/pro_templates/combined/Multipole_template.pro +5 -5
  42. fiqus/utils/Utils.py +12 -7
  43. {fiqus-2025.2.0.dist-info → fiqus-2025.10.0.dist-info}/METADATA +65 -63
  44. fiqus-2025.10.0.dist-info/RECORD +86 -0
  45. {fiqus-2025.2.0.dist-info → fiqus-2025.10.0.dist-info}/WHEEL +1 -1
  46. tests/test_geometry_generators.py +4 -0
  47. tests/test_mesh_generators.py +5 -0
  48. tests/test_solvers.py +41 -4
  49. tests/utils/fiqus_test_classes.py +15 -6
  50. tests/utils/generate_reference_files_ConductorAC.py +57 -57
  51. tests/utils/helpers.py +97 -97
  52. fiqus-2025.2.0.dist-info/RECORD +0 -85
  53. {fiqus-2025.2.0.dist-info → fiqus-2025.10.0.dist-info}/LICENSE.txt +0 -0
  54. {fiqus-2025.2.0.dist-info → fiqus-2025.10.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,439 @@
1
+ from pydantic import BaseModel, Field
2
+
3
+ from typing import List, Union, Optional, Literal
4
+
5
+
6
+ ############################
7
+ # Circuit
8
+ class Circuit_Class(BaseModel):
9
+ """
10
+ Level 1: Class for the circuit parameters
11
+ """
12
+ field_circuit: Optional[bool] = Field(
13
+ default = False,
14
+ description = "Allows to use Field-Circuit Coupling equations in the model.")
15
+ R_circuit: Optional[float] = None # R_circuit
16
+ L_circuit: Optional[float] = None # Lcir (SIGMA)
17
+ R_parallel: Optional[float] = None
18
+
19
+
20
+ ############################
21
+ # Power Supply (aka Power Converter)
22
+ class PowerSupplyClass(BaseModel):
23
+ """
24
+ Level 1: Class for the power supply (aka power converter)
25
+ """
26
+ I_initial: Optional[float] = Field(
27
+ default=None,
28
+ description="Initial current in the magnet. Propagated differently in various tools and obsolete # I00 (LEDET), I_0 (SIGMA), I0 (BBQ)")
29
+ t_off: Optional[float] = Field(
30
+ default=None,
31
+ description="Time of switching off the switch next to current controlled source. t_PC (LEDET)")
32
+ t_control_LUT: List[float] = Field(
33
+ default=[],
34
+ description="List of time values [s] for linear piece wise time function of current controlled source. t_PC_LUT (LEDET)")
35
+ I_control_LUT: List[float] = Field(
36
+ default=[],
37
+ description="List of current values [A] for linear piece wise time function of current controlled source. I_PC_LUT (LEDET)")
38
+ R_crowbar: Optional[float] = Field(
39
+ default=0,
40
+ description="Crowbar resistance in forward direction [Ohm]. Rcrow (SIGMA), RCrowbar (ProteCCT)")
41
+ L_crowbar: Optional[float] = Field(
42
+ default=0,
43
+ description="Crowbar inductance in forward direction [H].")
44
+ Ud_crowbar: Optional[float] = Field(
45
+ default=0,
46
+ description="Crowbar diode voltage in forward direction [V].")
47
+ R_c_r: Optional[float] = Field(
48
+ default=0,
49
+ description="Crowbar resistance in reverse direction [Ohm].")
50
+ L_c_r: Optional[float] = Field(
51
+ default=0,
52
+ description="Crowbar inductance in reverse direction [H].")
53
+ Ud_c_r: Optional[float] = Field(
54
+ default=0,
55
+ description="Crowbar diode voltage in reverse direction [V].")
56
+ R_1: Optional[float] = Field(
57
+ default=0,
58
+ description="Resistance R1 [Ohm].")
59
+ L_1: Optional[float] = Field(
60
+ default=0,
61
+ description="Inductance L1 [H].")
62
+ R_2: Optional[float] = Field(
63
+ default=0,
64
+ description="Resistance R2 [Ohm].")
65
+ L_2: Optional[float] = Field(
66
+ default=0,
67
+ description="Inductance L2 [H].")
68
+ C: Optional[float] = Field(
69
+ default=0,
70
+ description="Capacitance C [F].")
71
+ R_3: Optional[float] = Field(
72
+ default=0,
73
+ description="Resistance R3 [Ohm].")
74
+ L_3: Optional[float] = Field(
75
+ default=0,
76
+ description="Inductance L3 [H].")
77
+
78
+ ############################
79
+ # Quench Protection
80
+ class EnergyExtraction(BaseModel):
81
+ """
82
+ Level 2: Class for the energy extraction parameters
83
+ """
84
+ t_trigger: Optional[float] = Field(
85
+ default=99999.0,
86
+ description="Trigger time on the positive lead [s]. tEE (LEDET), tSwitchDelay (ProteCCT)")
87
+ R_EE: Optional[float] = Field(
88
+ default=0,
89
+ description="Energy extraction resistance on the positive lead [Ohm]. R_EE_triggered (ProteCCT)")
90
+ power_R_EE: Optional[float] = Field(
91
+ default=0.0,
92
+ description="Varistor power component, R(I) = R_EE*abs(I)^power_R_EE on the positive lead [-]. RDumpPower (ProteCCT)")
93
+ L: Optional[float] = Field(
94
+ default=0,
95
+ description="Inductance in series with resistor on the positive lead [H].")
96
+ C: Optional[float] = Field(
97
+ default=0,
98
+ description="Snubber capacitance in parallel to the EE switch on the positive lead [F].")
99
+ L_c: Optional[float] = Field(
100
+ default=0,
101
+ description="Inductance in the snubber capacitance branch in parallel to the EE switch on the positive lead [H].")
102
+ R_c: Optional[float] = Field(
103
+ default=0,
104
+ description="Resistance in the snubber capacitance branch in parallel to the EE switch on the positive lead [Ohm].")
105
+ Ud_snubber: Optional[float] = Field(
106
+ default=0,
107
+ description="Forward voltage of diode in the snubber capacitance branch in parallel to the EE switch on the positive lead [V].")
108
+ L_s: Optional[float] = Field(
109
+ default=0,
110
+ description="Inductance in the EE switch branch on the positive lead [H].")
111
+ R_s: Optional[float] = Field(
112
+ default=0,
113
+ description="Resistance in the EE switch branch on the positive lead [Ohm].")
114
+ Ud_switch: Optional[float] = Field(
115
+ default=0,
116
+ description="Forward voltage of diode in the EE switch branch on the positive lead [V].")
117
+
118
+ t_trigger_n: Optional[float] = Field(
119
+ default=99999.0,
120
+ description="Trigger time on the negative lead [s]. tEE (LEDET), tSwitchDelay (ProteCCT)")
121
+ R_EE_n: Optional[float] = Field(
122
+ default=0,
123
+ description="Energy extraction resistance on the negative lead [Ohm]. R_EE_triggered (ProteCCT)")
124
+ power_R_EE_n: Optional[float] = Field(
125
+ default=0.0,
126
+ description="Varistor power component, R(I) = R_EE*abs(I)^power_R_EE on the negative lead [-]. RDumpPower (ProteCCT)")
127
+ L_n: Optional[float] = Field(
128
+ default=0,
129
+ description="Inductance in series with resistor on the negative lead [H].")
130
+ C_n: Optional[float] = Field(
131
+ default=0,
132
+ description="Snubber capacitance in parallel to the EE switch on the negative lead [F].")
133
+ L_c_n: Optional[float] = Field(
134
+ default=0,
135
+ description="Inductance in the snubber capacitance branch in parallel to the EE switch on the negative lead [H].")
136
+ R_c_n: Optional[float] = Field(
137
+ default=0,
138
+ description="Resistance in the snubber capacitance branch in parallel to the EE switch on the negative lead [Ohm].")
139
+ Ud_snubber_n: Optional[float] = Field(
140
+ default=0,
141
+ description="Forward voltage of diode in the snubber capacitance branch in parallel to the EE switch on the negative lead [V].")
142
+ L_s_n: Optional[float] = Field(
143
+ default=0,
144
+ description="Inductance in the EE switch branch on the negative lead [H].")
145
+ R_s_n: Optional[float] = Field(
146
+ default=0,
147
+ description="Resistance in the EE switch branch on the negative lead [Ohm].")
148
+ Ud_switch_n: Optional[float] = Field(
149
+ default=0,
150
+ description="Forward voltage of diode in the EE switch branch on the negative lead [V].")
151
+
152
+
153
+ class QuenchHeater(BaseModel):
154
+ """
155
+ Level 2: Class for the quench heater parameters
156
+ """
157
+ N_strips: Optional[int] = Field(
158
+ default=None,
159
+ description="Number of quench heater traces (typically 2 traces make one pad)")
160
+ t_trigger: List[float] = Field(
161
+ default=[],
162
+ description="Trigger times list of of quench heaters [s]")
163
+ U0: List[float] = Field(
164
+ default=[],
165
+ description="Initial charging voltages list of capacitor for the trance (not full pad!) [V]")
166
+ C: List[float] = Field(
167
+ default=[],
168
+ description="Capacitances list of quench heater power supply for the trance (not full pad!) [H]")
169
+ R_warm: List[float] = Field(
170
+ default=[],
171
+ description="Internal resistances list of quench heater power supply and/or additional resistance added to limit the heater current for the trance (not full pad!) [Ohm]")
172
+ w: List[float] = Field(
173
+ default=[],
174
+ description="Widths list of quench heater trance stainless steel part [m]")
175
+ h: List[float] = Field(
176
+ default=[],
177
+ description="Thickness list of quench heater trance stainless steel part [m]")
178
+ h_ins: Union[List[float], List[List[float]]] = Field(
179
+ default=[],
180
+ description="Thickness list of quench heater insulation between the stainless steel part and conductor insulation [m]"
181
+ "This could be a list of list to specify multiple material thicknesses")
182
+ type_ins: Union[List[str], List[List[str]]] = Field(
183
+ default=[],
184
+ description="Material names list of quench heater insulation between the stainless steel part and conductor insulation [-]"
185
+ "This could be a list of list to specify multiple material names")
186
+ h_ground_ins: Union[List[float], List[List[float]]] = Field(
187
+ default=[],
188
+ description="Material names list of quench heater insulation between the stainless steel part and helium bath [-]"
189
+ "This could be a list of list to specify multiple material thicknesses")
190
+ type_ground_ins: Union[List[str], List[List[str]]] = Field(
191
+ default=[],
192
+ description="Material names list of quench heater insulation between the stainless steel part and helium bath [-]"
193
+ "This could be a list of list to specify multiple material names")
194
+ l: List[float] = Field(
195
+ default=[],
196
+ description="Lengths list of quench heaters [m]. Typically equal to magnet length.")
197
+ l_copper: List[float] = Field(
198
+ default=[],
199
+ description="Lengths list of copper laminations of quench heaters [m].")
200
+ l_stainless_steel: List[float] = Field(
201
+ default=[],
202
+ description="Lengths list of stainless steel only sections of quench heaters [m].")
203
+ f_cover: List[float] = Field(
204
+ default=[],
205
+ description="List of fraction of stainless steel cover. This is l_stainless_steel/(l_stainless_steel+l_copper). Marked as obsolete, but still specified in some models [-].")
206
+ ids: List[int] = Field(
207
+ default=[],
208
+ description="List of heater numbers (1 based) equal to the length of turns that are covered by (i.e. thermally connected to) quench heaters.")
209
+ turns: List[int] = Field(
210
+ default=[],
211
+ description="List of turn numbers (1 based) that are covered by (i.e. thermally connected to) quench heaters.")
212
+ turns_sides: List[str] = Field(
213
+ default=[],
214
+ description="List of letters specifying side of turn where quench heater is placed. Only used in FiQuS Multipole module."
215
+ "Possible sides are: 'o' - outer, 'i' - inner, 'l' - lower angle, 'h' - higher angle.")
216
+ quench_propagation: Optional[Literal['2Dx1D','full']] = Field(
217
+ default = "full",
218
+ description = 'Enables to have a variable length for the quench heater, different from the full magnet length.')
219
+ quench_prop_model: Optional[Literal['Wilson','Ts']] = Field(
220
+ default = "Ts",
221
+ description = 'Selects the model used for the material properties of the quench propagation. "Wilson" uses a scaled cv and Ts uses the cv at Ts.')
222
+ NZPV_multiplier: Optional[float] = Field(
223
+ default = 1.0,
224
+ description = 'Factor that multiplies the Normal Zone Propagation Velocity')
225
+ L_QH_offset: Optional[List[float]] = Field(
226
+ default = [],
227
+ description= 'Offset of the quench heater strip from the referrence point located at the middle of the magnet length. Positive values move the quench heater towards higher z values (move quench heater strip towards the front ofthe magnet).')
228
+
229
+ class CLIQ_Class(BaseModel):
230
+ """
231
+ Level 2: Class for the CLIQ parameters
232
+ """
233
+ t_trigger: Optional[float] = Field(
234
+ default=99999.0,
235
+ description="Trigger time of CLIQ unit [s].")
236
+ current_direction: List[int] = Field(
237
+ default=[],
238
+ description="Polarity of current in groups specified as a list with length equal to the number of groups [-].")
239
+ sym_factor: Optional[float] = Field(
240
+ default=None,
241
+ description="Obsolete.")
242
+ N_units: Optional[int] = Field(
243
+ default=None,
244
+ description="Obsolete.")
245
+ U0: Optional[float] = Field(
246
+ default=0,
247
+ description="Initial charging voltage of CLIQ unit [V].")
248
+ C: Optional[float] = Field(
249
+ default=0,
250
+ description="Capacitance of CLIQ unit [F].")
251
+ R: Optional[float] = Field(
252
+ default=0,
253
+ description="Resistance of CLIQ unit [Ohm].")
254
+ L: Optional[float] = Field(
255
+ default=0,
256
+ description="Inductance of CLIQ unit [H].")
257
+ I0: Optional[float] = Field(
258
+ default=None,
259
+ description="Obsolete.")
260
+
261
+
262
+ class ESC_Class(BaseModel):
263
+ """
264
+ Level 2: Class for the ESC parameters
265
+ """
266
+ t_trigger: List[float] = Field(
267
+ default=[],
268
+ description="Trigger time of ESC units [s] given as a list with length corresponding to the number of ESC units.")
269
+ U0: List[float] = Field(
270
+ default=[],
271
+ description="Initial charging voltage of ESC units [V] given as a list with length corresponding to the number of ESC units."
272
+ "The unit is grounded in the middle, so the voltage to ground is half of this value")
273
+ C: List[float] = Field(
274
+ default=[],
275
+ description="Capacitance of ESC units [F] given as a list with length corresponding to the number of ESC units."
276
+ "The unit is grounded in the middle, with two capacitors in series with value of 2C")
277
+ L: List[float] = Field(
278
+ default=[],
279
+ description="Parasitic inductance of ESC units [H] given as a list with length corresponding to the number of ESC units."
280
+ "The unit is grounded in the middle, with two capacitors in series with value of 2C")
281
+ R_unit: List[float] = Field(
282
+ default=[],
283
+ description="Internal resistance of ESC units [Ohm] given as a list with length corresponding to the number of ESC units.")
284
+ R_leads: List[float] = Field(
285
+ default=[],
286
+ description="Resistance of leads from ESC coil to ESC diode connections [Ohm] given as a list with length corresponding to the number of ESC units.")
287
+ Ud_Diode: List[float] = Field(
288
+ default=[],
289
+ description="Forward diodes voltage across ESC coils [V] given as a list with length corresponding to the number of ESC units.")
290
+ L_Diode: List[float] = Field(
291
+ default=[],
292
+ description="Inductance in series with diodes across ESC coils [V] given as a list with length corresponding to the number of ESC units.")
293
+
294
+
295
+ class FQPCs_Class(BaseModel):
296
+ """
297
+ Level 2: Class for the FQPLs parameters for protection
298
+ """
299
+ enabled: Optional[List[bool]] = Field(
300
+ default=None,
301
+ description="List of booleans specifying which FQPC is enabled.")
302
+ names: Optional[List[str]] = Field(
303
+ default=None,
304
+ description="List of names to use in gmsh and getdp. Any unique ASCII strings would work")
305
+ fndpls: Optional[List[int]] = Field(
306
+ default=None,
307
+ description="List of FQPC number of divisions per length at geometry level [-]")
308
+ fwws: Optional[List[float]] = Field(
309
+ default=None,
310
+ description="List of FQPC wire widths (assuming rectangular). For theta = 0 this is x dimension. Works at geometry level [-]")
311
+ fwhs: Optional[List[float]] = Field(
312
+ default=None,
313
+ description="List of FQPC wire heights (assuming rectangular). For theta = 0 this is y dimension. Works at geometry level [-]")
314
+ r_ins: Optional[List[float]] = Field(
315
+ default=None,
316
+ description="List of FQPC inner diameter of (e.g. for CCT magnet). For theta = 0 this is x dimension. Works at geometry level [-]")
317
+ r_bs: Optional[List[float]] = Field(
318
+ default=None,
319
+ description="List of FQPC radiuses for bending the fqpl by 180 degrees at the end of the magnet to go backward. Works at geometry level [-]")
320
+ n_sbs: Optional[List[int]] = Field(
321
+ default=None,
322
+ description="List of FQPC number of 'bending segments' for the 180 degrees turn. Works at geometry level [-]")
323
+ thetas: Optional[List[float]] = Field(
324
+ default=None,
325
+ description="List of FQPC rotation in deg from x+ axis towards y+ axis about z axis. Works at geometry level [-]")
326
+ z_starts: Optional[List[str]] = Field(
327
+ default=None,
328
+ description="List of z coordinates for the air boundary to start at. These are string with either: z_min or z_max key from the Air region. Works at geometry level [-]")
329
+ z_ends: Optional[List[float]] = Field(
330
+ default=None,
331
+ description="List of z coordinates for the air boundary to end at. These are string with either: z_min or z_max key from the Air region. Works at geometry level [-]")
332
+ currents: Optional[List[float]] = Field(
333
+ default=None,
334
+ description="List of FQPC currents for a magnetostatic solution. Works at solve level [-]")
335
+ sigmas: Optional[List[float]] = Field(
336
+ default=None,
337
+ description="List of FQPC electrical conductivity for a magnetostatic solution. Works at solve level [-]")
338
+ mu_rs: Optional[List[float]] = Field(
339
+ default=None,
340
+ description="List of FQPC magnetic permeability for a magnetostatic solution. Works at solve level [-]")
341
+ th_conns_def: Optional[List[List]] = Field(
342
+ default=None,
343
+ description="List of lists specifying thermal connections for LEDET to connect the FQPCs to the other turns of the magnet")
344
+
345
+ class SourceSine(BaseModel):
346
+ """
347
+ Level 3: Class for Sine source parameters for E-CLIQ
348
+ """
349
+ frequency: Optional[float] = Field(default=None, description="Frequency of the sine source (Hz).")
350
+ current_amplitude: Optional[float] = Field(default=None, description="Amplitude of the sine current (A).")
351
+ number_of_periods: Optional[float] = Field(default=None, description="Amplitude of the sine current (A).")
352
+
353
+ class SourcePiecewise(BaseModel):
354
+ """
355
+ Level 3 Class for piecewise (linear) source parameters for E-CLIQ
356
+ """
357
+ csv_file: Optional[str] = Field(default=None, description="File name for the from_file source type defining the time evolution of current. Multipliers are used for each of them. The file should contain two columns: 'time' (s) and 'current' (A), with these headers. If this field is set, times and currents are ignored.")
358
+ times: Optional[List[float]] = Field(default=None, description="Time instants (s) defining the piecewise linear sources. Used only if source_csv_file is not set. Can be scaled by time_multiplier.")
359
+ currents: Optional[List[float]] = Field(default=None, description="E-CLIQ coil currents relative to current_multiplier at the time instants 'times'. Used only if source_csv_file is not set.")
360
+ time_multiplier: Optional[float] = Field(default=None, description="Multiplier for the time values in times (scales the time values). Also used for the time values in the source_csv_file.")
361
+ current_multiplier: Optional[float] = Field(default=None, description="Multiplier for the E-CLIQ coil currents in currents. Also used for the values in the source_csv_file.")
362
+
363
+ class E_CLIQ_Class(BaseModel):
364
+ """
365
+ Level 2: Class for the E-CLIQ parameters for protection
366
+ """
367
+ t_trigger: Optional[List[float]] = Field(
368
+ default=[],
369
+ description="Trigger time of E-CLIQ current sources [s] given as a list with length corresponding to the number of E-CLIQ units.")
370
+ R_leads: Optional[List[float]] = Field(
371
+ default=None,
372
+ description="List of E-CLIQ unit lead resistances [Ohm]. List length corresponding to the number of E-CLIQ units.")
373
+ L_leads: Optional[List[float]] = Field(
374
+ default=None,
375
+ description="List of E-CLIQ unit lead inductances [H]. List length corresponding to the number of E-CLIQ units.")
376
+ source_type: Literal['sine', 'piecewise', None] = Field(
377
+ default=None,
378
+ description="Time evolution of applied current. Supported options are: sine, piecewise.")
379
+ sine: SourceSine = Field(
380
+ default=SourceSine(),
381
+ description="Definition of sine current source parameters.")
382
+ piecewise: SourcePiecewise = Field(
383
+ default=SourcePiecewise(),
384
+ description="Definition of piecewise current source parameters.")
385
+ quench_propagation: Optional[Literal['2Dx1D','full']] = Field(
386
+ default = "full",
387
+ description = 'Enables to have a variable length for the ecliq implementation, different from the full magnet length. It only affects the Thermal Behaviour of the model.')
388
+ quench_prop_model: Optional[Literal['Wilson','Ts']] = Field(
389
+ default = "Ts",
390
+ description = 'Selects the model used for the material properties of the quench propagation. "Wilson" uses a scaled cv with a function of T_bath and Ts and Ts uses the cv at Ts.')
391
+ NZPV_multiplier: Optional[float] = Field(
392
+ default = 1.0,
393
+ description = 'Factor that multiplies the Normal Zone Propagation Velocity')
394
+ N_units: Optional[List[int]] = Field(
395
+ default = [],
396
+ description= 'Number of E-CLIQ units along the magnet length per ecliq coil. It must be an odd number for symmetry reasons.')
397
+ h_ecliq: Optional[List[float]] = Field(
398
+ default = [],
399
+ description = 'Spacing between the ecliq coils along the magnet length (m).')
400
+ l_ecliq: Optional[List[float]] = Field(
401
+ default = [],
402
+ description = 'length of the ecliq coils along the magnet length (m).')
403
+ L_ecliq_offset: Optional[List[float]] = Field(
404
+ default = [],
405
+ description = 'Offset of the quench heater strip from the referrence point located at the middle of the magnet length. Positive values move the quench heater towards higher z values (move quench heater strip towards the front ofthe magnet).')
406
+
407
+ class QuenchDetection(BaseModel):
408
+ """
409
+ Level 2: Class for FiQuS
410
+ """
411
+
412
+ voltage_thresholds: Optional[List[float]] = Field(
413
+ default=None,
414
+ title="List of quench detection voltage thresholds",
415
+ description="Voltage thresholds for quench detection. The quench detection will be triggered when the voltage exceeds these thresholds continuously for a time larger than the discrimination time.",
416
+ )
417
+
418
+ discrimination_times: Optional[List[float]] = Field(
419
+ default=None,
420
+ title="List of quench detection discrimination times",
421
+ description="Discrimination times for quench detection. The quench detection will be triggered when the voltage exceeds the thresholds continuously for a time larger than these discrimination times.",
422
+ )
423
+
424
+ voltage_tap_pairs: Optional[List[List[int]]] = Field(
425
+ default=None,
426
+ title="List of quench detection voltage tap pairs",
427
+ description="Voltage tap pairs for quench detection. The voltage difference between these pairs will be used for quench detection.",
428
+ )
429
+
430
+ class QuenchProtection(BaseModel):
431
+ """
432
+ Level 1: Class for quench protection
433
+ """
434
+ Energy_Extraction: EnergyExtraction = EnergyExtraction()
435
+ Quench_Heaters: QuenchHeater = QuenchHeater()
436
+ CLIQ: CLIQ_Class = CLIQ_Class()
437
+ ESC: ESC_Class = ESC_Class()
438
+ FQPCs: FQPCs_Class = FQPCs_Class()
439
+ E_CLIQ: E_CLIQ_Class = E_CLIQ_Class()
@@ -249,16 +249,3 @@ class MultipoleRegionCoordinate(BaseModel):
249
249
  neighbouring_nodes: NeighbourNode = NeighbourNode()
250
250
 
251
251
 
252
- # if __name__ == "__main__":
253
- # write = True
254
- # read = False
255
- #
256
- # def read_regions(regions_file_name):
257
- # with open(regions_file_name, 'r') as stream:
258
- # yaml_str = ruamel.yaml.safe_load(stream)
259
- # return MultipoleData(**yaml_str)
260
- #
261
- # if write:
262
- # model = MultipoleData()
263
- # with open('FiQuS_data.yaml', 'w') as yaml_file:
264
- # ruamel.yaml.dump(model.dict(), yaml_file, default_flow_style=False)
@@ -413,3 +413,10 @@ class RoxieData(BaseModel):
413
413
  iron: Iron = Iron()
414
414
  coil: CoilData = CoilData()
415
415
  wedges: Dict[int, Wedge] = {}
416
+
417
+ class FiQuSGeometry(BaseModel):
418
+ """
419
+ Class for Roxie data
420
+ """
421
+
422
+ Roxie_Data: RoxieData = RoxieData()
@@ -1,37 +1,37 @@
1
- from pydantic import BaseModel
2
- from typing import List, Optional
3
-
4
-
5
- class Terminal(BaseModel):
6
- vol_st: Optional[List[int]] = None # volume number for terminal in for straightening
7
- surf_st: Optional[List[int]] = None # surface number for terminal in for straightening
8
- vol_et: Optional[List[int]] = None # volume number for terminal in for extending
9
- surf_et: Optional[List[int]] = None # surface number for terminal in for extending
10
- lc_st: Optional[List[List[List[int]]]] = None # line connections for straightening terminals
11
- lc_et: Optional[List[List[List[int]]]] = None # line connections for extending terminals
12
- z_air: Optional[float] = None
13
- z_add: Optional[float] = None
14
- ndpterms: Optional[List[int]] = None # number of divisions per terminal
15
-
16
-
17
- class Winding(BaseModel):
18
- names: Optional[List[str]] = None # name to use in gmsh and getdp
19
- t_in: Terminal = Terminal() # Terminal in
20
- t_out: Terminal = Terminal() # Terminal in
21
-
22
-
23
- class WindingsInformation(BaseModel):
24
- magnet_name: Optional[str] = None
25
- windings_avg_length: Optional[float] = None
26
- windings: Winding = Winding()
27
- w_names: Optional[List[str]] = None
28
- f_names: Optional[List[str]] = None
29
- formers: Optional[List[str]] = None
30
- air: Optional[str] = None
31
-
32
-
33
- class SpliterBrep(BaseModel): # Brep file model splitter data
34
- magnet_name: Optional[str] = None
35
- file_name: Optional[str] = None # full file name for the brep file
36
- vol_firsts: Optional[List[int]] = None # list of first volumes for the partitioned model
37
- vol_lasts: Optional[List[int]] = None # list of last volumes for the partitioned model
1
+ from pydantic import BaseModel
2
+ from typing import List, Optional
3
+
4
+
5
+ class Terminal(BaseModel):
6
+ vol_st: Optional[List[int]] = None # volume number for terminal in for straightening
7
+ surf_st: Optional[List[int]] = None # surface number for terminal in for straightening
8
+ vol_et: Optional[List[int]] = None # volume number for terminal in for extending
9
+ surf_et: Optional[List[int]] = None # surface number for terminal in for extending
10
+ lc_st: Optional[List[List[List[int]]]] = None # line connections for straightening terminals
11
+ lc_et: Optional[List[List[List[int]]]] = None # line connections for extending terminals
12
+ z_air: Optional[float] = None
13
+ z_add: Optional[float] = None
14
+ ndpterms: Optional[List[int]] = None # number of divisions per terminal
15
+
16
+
17
+ class Winding(BaseModel):
18
+ names: Optional[List[str]] = None # name to use in gmsh and getdp
19
+ t_in: Terminal = Terminal() # Terminal in
20
+ t_out: Terminal = Terminal() # Terminal in
21
+
22
+
23
+ class WindingsInformation(BaseModel):
24
+ magnet_name: Optional[str] = None
25
+ windings_avg_length: Optional[float] = None
26
+ windings: Winding = Winding()
27
+ w_names: Optional[List[str]] = None
28
+ f_names: Optional[List[str]] = None
29
+ formers: Optional[List[str]] = None
30
+ air: Optional[str] = None
31
+
32
+
33
+ class SpliterBrep(BaseModel): # Brep file model splitter data
34
+ magnet_name: Optional[str] = None
35
+ file_name: Optional[str] = None # full file name for the brep file
36
+ vol_firsts: Optional[List[int]] = None # list of first volumes for the partitioned model
37
+ vol_lasts: Optional[List[int]] = None # list of last volumes for the partitioned model