fiqus 2025.12.0__py3-none-any.whl → 2026.1.1__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 (52) hide show
  1. fiqus/MainFiQuS.py +4 -8
  2. fiqus/data/DataConductor.py +108 -11
  3. fiqus/data/DataFiQuS.py +2 -1
  4. fiqus/data/DataFiQuSConductorAC_CC.py +345 -0
  5. fiqus/data/DataFiQuSConductorAC_Strand.py +3 -3
  6. fiqus/data/DataFiQuSMultipole.py +363 -165
  7. fiqus/data/DataModelCommon.py +30 -15
  8. fiqus/data/DataMultipole.py +33 -10
  9. fiqus/data/DataWindingsCCT.py +37 -37
  10. fiqus/data/RegionsModelFiQuS.py +1 -1
  11. fiqus/geom_generators/GeometryConductorAC_CC.py +1906 -0
  12. fiqus/geom_generators/GeometryMultipole.py +751 -54
  13. fiqus/getdp_runners/RunGetdpConductorAC_CC.py +123 -0
  14. fiqus/getdp_runners/RunGetdpMultipole.py +181 -31
  15. fiqus/mains/MainConductorAC_CC.py +148 -0
  16. fiqus/mains/MainMultipole.py +109 -17
  17. fiqus/mesh_generators/MeshCCT.py +209 -209
  18. fiqus/mesh_generators/MeshConductorAC_CC.py +1305 -0
  19. fiqus/mesh_generators/MeshMultipole.py +938 -263
  20. fiqus/parsers/ParserCOND.py +2 -1
  21. fiqus/parsers/ParserDAT.py +16 -16
  22. fiqus/parsers/ParserGetDPOnSection.py +212 -212
  23. fiqus/parsers/ParserGetDPTimeTable.py +134 -134
  24. fiqus/parsers/ParserMSH.py +53 -53
  25. fiqus/parsers/ParserRES.py +142 -142
  26. fiqus/plotters/PlotPythonCCT.py +133 -133
  27. fiqus/plotters/PlotPythonMultipole.py +18 -18
  28. fiqus/post_processors/PostProcessAC_CC.py +65 -0
  29. fiqus/post_processors/PostProcessMultipole.py +16 -6
  30. fiqus/pre_processors/PreProcessCCT.py +175 -175
  31. fiqus/pro_assemblers/ProAssembler.py +3 -3
  32. fiqus/pro_material_functions/ironBHcurves.pro +246 -246
  33. fiqus/pro_templates/combined/CAC_CC_template.pro +542 -0
  34. fiqus/pro_templates/combined/CC_Module.pro +1213 -0
  35. fiqus/pro_templates/combined/Multipole_template.pro +2738 -1338
  36. fiqus/pro_templates/combined/TSA_materials.pro +102 -2
  37. fiqus/pro_templates/combined/materials.pro +54 -3
  38. fiqus/utils/Utils.py +18 -25
  39. fiqus/utils/update_data_settings.py +1 -1
  40. {fiqus-2025.12.0.dist-info → fiqus-2026.1.1.dist-info}/METADATA +81 -77
  41. {fiqus-2025.12.0.dist-info → fiqus-2026.1.1.dist-info}/RECORD +52 -44
  42. {fiqus-2025.12.0.dist-info → fiqus-2026.1.1.dist-info}/WHEEL +1 -1
  43. tests/test_geometry_generators.py +47 -30
  44. tests/test_mesh_generators.py +69 -30
  45. tests/test_solvers.py +67 -29
  46. tests/utils/fiqus_test_classes.py +396 -147
  47. tests/utils/generate_reference_files_ConductorAC.py +57 -57
  48. tests/utils/helpers.py +76 -1
  49. /fiqus/pro_templates/combined/{ConductorACRutherford_template.pro → CAC_Rutherford_template.pro} +0 -0
  50. /fiqus/pro_templates/combined/{ConductorAC_template.pro → CAC_Strand_template.pro} +0 -0
  51. {fiqus-2025.12.0.dist-info → fiqus-2026.1.1.dist-info/licenses}/LICENSE.txt +0 -0
  52. {fiqus-2025.12.0.dist-info → fiqus-2026.1.1.dist-info}/top_level.txt +0 -0
tests/test_solvers.py CHANGED
@@ -85,12 +85,12 @@ class TestSolvers(FiQuSSolverTests):
85
85
  # Compare the pro files:
86
86
  pro_file = self.get_path_to_generated_file(
87
87
  data_model=data_model,
88
- file_name=model_name,
88
+ model_name=model_name,
89
89
  file_extension="pro",
90
90
  )
91
91
  reference_pro_file = self.get_path_to_reference_file(
92
92
  data_model=data_model,
93
- file_name=model_name,
93
+ model_name=model_name,
94
94
  file_extension="pro",
95
95
  )
96
96
  self.compare_text_files(pro_file, reference_pro_file)
@@ -99,12 +99,12 @@ class TestSolvers(FiQuSSolverTests):
99
99
  if solve_type in ["electromagnetic", "weaklyCoupled", "stronglyCoupled"]:
100
100
  pos_file = self.get_path_to_generated_file(
101
101
  data_model=data_model,
102
- file_name="MagneticField-DefaultFormat",
102
+ model_name="MagneticField-DefaultFormat",
103
103
  file_extension="pos",
104
104
  )
105
105
  reference_pos_file = self.get_path_to_reference_file(
106
106
  data_model=data_model,
107
- file_name="MagneticField-DefaultFormat",
107
+ model_name="MagneticField-DefaultFormat",
108
108
  file_extension="pos",
109
109
  )
110
110
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1e-3)
@@ -112,12 +112,12 @@ class TestSolvers(FiQuSSolverTests):
112
112
  if solve_type in ["weaklyCoupled", "stronglyCoupled", "thermal"]:
113
113
  pos_file = self.get_path_to_generated_file(
114
114
  data_model=data_model,
115
- file_name="Temperature-DefaultFormat",
115
+ model_name="Temperature-DefaultFormat",
116
116
  file_extension="pos",
117
117
  )
118
118
  reference_pos_file = self.get_path_to_reference_file(
119
119
  data_model=data_model,
120
- file_name="Temperature-DefaultFormat",
120
+ model_name="Temperature-DefaultFormat",
121
121
  file_extension="pos",
122
122
  )
123
123
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1e-3)
@@ -152,12 +152,12 @@ class TestSolvers(FiQuSSolverTests):
152
152
  # Compare the pro files:
153
153
  pro_file = self.get_path_to_generated_file(
154
154
  data_model=data_model,
155
- file_name=model_name,
155
+ model_name=model_name,
156
156
  file_extension="pro",
157
157
  )
158
158
  reference_pro_file = self.get_path_to_reference_file(
159
159
  data_model=data_model,
160
- file_name=model_name,
160
+ model_name=model_name,
161
161
  file_extension="pro",
162
162
  )
163
163
  # This makes no sense as long as the development on the Strand model pro-template is ongoing ...
@@ -167,12 +167,12 @@ class TestSolvers(FiQuSSolverTests):
167
167
  # Compare the magnetic flux density files:
168
168
  pos_file = self.get_path_to_generated_file(
169
169
  data_model=data_model,
170
- file_name="b_Omega",
170
+ model_name="b_Omega",
171
171
  file_extension="pos",
172
172
  )
173
173
  reference_pos_file = self.get_path_to_reference_file(
174
174
  data_model=data_model,
175
- file_name="b_Omega",
175
+ model_name="b_Omega",
176
176
  file_extension="pos",
177
177
  )
178
178
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1e-10)
@@ -180,12 +180,12 @@ class TestSolvers(FiQuSSolverTests):
180
180
  # Compare the current density files:
181
181
  pos_file = self.get_path_to_generated_file(
182
182
  data_model=data_model,
183
- file_name="j_OmegaC",
183
+ model_name="j_OmegaC",
184
184
  file_extension="pos",
185
185
  )
186
186
  reference_pos_file = self.get_path_to_reference_file(
187
187
  data_model=data_model,
188
- file_name="j_OmegaC",
188
+ model_name="j_OmegaC",
189
189
  file_extension="pos",
190
190
  )
191
191
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1e-10)
@@ -218,12 +218,12 @@ class TestSolvers(FiQuSSolverTests):
218
218
  # Compare the current density files:
219
219
  pos_file = self.get_path_to_generated_file(
220
220
  data_model=data_model,
221
- file_name="jz",
221
+ model_name="jz",
222
222
  file_extension="pos",
223
223
  )
224
224
  reference_pos_file = self.get_path_to_reference_file(
225
225
  data_model=data_model,
226
- file_name="jz",
226
+ model_name="jz",
227
227
  file_extension="pos",
228
228
  )
229
229
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1E-10)
@@ -231,16 +231,53 @@ class TestSolvers(FiQuSSolverTests):
231
231
  # Compare the power loss files:
232
232
  pos_file = self.get_path_to_generated_file(
233
233
  data_model=data_model,
234
- file_name="m",
234
+ model_name="m",
235
235
  file_extension="pos",
236
236
  )
237
237
  reference_pos_file = self.get_path_to_reference_file(
238
238
  data_model=data_model,
239
- file_name="m",
239
+ model_name="m",
240
240
  file_extension="pos",
241
241
  )
242
242
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1E-10)
243
243
 
244
+ def test_ConductorAC_CC(self):
245
+ """
246
+ Checks if ConductorAC Coated Conductor solver works correctly by comparing the results to the
247
+ reference results that were checked manually.
248
+ """
249
+ if os.getenv("CERNGETDP_VERSION_CAC_CC") is not None:
250
+ os_name = platform.system()
251
+
252
+ if os_name == "Linux":
253
+ self.getdp_path = linux_getdp_prefix_path / Path(f"cac_cc/bin/getdp_{os.getenv('CERNGETDP_VERSION_CAC_CC')}")
254
+ else:
255
+ self.getdp_path = windows_getdp_prefix_path / Path(f"cac_cc/getdp_{os.getenv('CERNGETDP_VERSION_CAC_CC')}.exe")
256
+ else:
257
+ print("CERNGETDP_VERSION_CAC_CC is not set. Using default getdp path from data settings.")
258
+
259
+ model_names = [
260
+ "TEST_CAC_CC",
261
+ ]
262
+ for model_name in model_names:
263
+ with self.subTest(model_name=model_name):
264
+ data_model: FDM = self.get_data_model(model_name)
265
+
266
+ self.solve(data_model, model_name)
267
+
268
+ # Compare the current density files:
269
+ pos_file = self.get_path_to_generated_file(
270
+ data_model=data_model,
271
+ model_name="last_magnetic_field",
272
+ file_extension="pos",
273
+ )
274
+ reference_pos_file = self.get_path_to_reference_file(
275
+ data_model=data_model,
276
+ model_name="last_magnetic_field",
277
+ file_extension="pos",
278
+ )
279
+ self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-2, abs_tolerance=1E-10)
280
+
244
281
  def test_HomogenizedConductor(self):
245
282
  """
246
283
  Checks if HomogenizedConductor solver works correctly by comparing the results to the
@@ -268,12 +305,12 @@ class TestSolvers(FiQuSSolverTests):
268
305
  # Compare the current density files:
269
306
  pos_file = self.get_path_to_generated_file(
270
307
  data_model=data_model,
271
- file_name="js",
308
+ model_name="js",
272
309
  file_extension="pos",
273
310
  )
274
311
  reference_pos_file = self.get_path_to_reference_file(
275
312
  data_model=data_model,
276
- file_name="js",
313
+ model_name="js",
277
314
  file_extension="pos",
278
315
  )
279
316
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1E-10)
@@ -281,12 +318,12 @@ class TestSolvers(FiQuSSolverTests):
281
318
  # Compare the power loss files:
282
319
  pos_file = self.get_path_to_generated_file(
283
320
  data_model=data_model,
284
- file_name="p_tot",
321
+ model_name="p_tot",
285
322
  file_extension="pos",
286
323
  )
287
324
  reference_pos_file = self.get_path_to_reference_file(
288
325
  data_model=data_model,
289
- file_name="p_tot",
326
+ model_name="p_tot",
290
327
  file_extension="pos",
291
328
  )
292
329
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1E-10)
@@ -314,6 +351,7 @@ class TestSolvers(FiQuSSolverTests):
314
351
  "TEST_MULTIPOLE_SMC_TSA",
315
352
  "TEST_MULTIPOLE_SMC_REF",
316
353
  "TEST_MULTIPOLE_4COND_TSA",
354
+ "TEST_MULTIPOLE_FALCOND_C_TSA_COLLAR_POLE"
317
355
  ]
318
356
  for model_name in model_names:
319
357
  with self.subTest(model_name=model_name):
@@ -324,26 +362,26 @@ class TestSolvers(FiQuSSolverTests):
324
362
  # Compare the pro files:
325
363
  pro_file = self.get_path_to_generated_file(
326
364
  data_model=data_model,
327
- file_name=model_name,
365
+ model_name=model_name,
328
366
  file_extension="pro",
329
367
  )
330
368
  reference_pro_file = self.get_path_to_reference_file(
331
369
  data_model=data_model,
332
- file_name=model_name,
370
+ model_name=model_name,
333
371
  file_extension="pro",
334
372
  )
335
373
 
336
- self.compare_text_files(pro_file, reference_pro_file, exclude_lines_keywords=["NameOfMesh"], exclude_first_n_lines=1)
374
+ self.compare_text_files(pro_file, reference_pro_file, exclude_lines_keywords=["NameOfMesh", "Include"], exclude_first_n_lines=1)
337
375
 
338
376
  # Compare the magnetic flux density files:
339
377
  pos_file = self.get_path_to_generated_file(
340
378
  data_model=data_model,
341
- file_name="b_Omega",
379
+ model_name="b_Omega",
342
380
  file_extension="pos",
343
381
  )
344
382
  reference_pos_file = self.get_path_to_reference_file(
345
383
  data_model=data_model,
346
- file_name="b_Omega",
384
+ model_name="b_Omega",
347
385
  file_extension="pos",
348
386
  )
349
387
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1e-2)
@@ -351,12 +389,12 @@ class TestSolvers(FiQuSSolverTests):
351
389
  # Compare the temperature files:
352
390
  pos_file = self.get_path_to_generated_file(
353
391
  data_model=data_model,
354
- file_name="T_Omega_c",
392
+ model_name="T_Omega_c",
355
393
  file_extension="pos",
356
394
  )
357
395
  reference_pos_file = self.get_path_to_reference_file(
358
396
  data_model=data_model,
359
- file_name="T_Omega_c",
397
+ model_name="T_Omega_c",
360
398
  file_extension="pos",
361
399
  )
362
400
  self.compare_pos_files(pos_file, reference_pos_file, rel_tolerance=1e-3, abs_tolerance=1e-2)
@@ -364,12 +402,12 @@ class TestSolvers(FiQuSSolverTests):
364
402
  # Compare the solve yaml files
365
403
  solve_file = self.get_path_to_generated_file(
366
404
  data_model=data_model,
367
- file_name="solve",
405
+ model_name="solve",
368
406
  file_extension="yaml",
369
407
  )
370
408
  reference_solve_file = self.get_path_to_reference_file(
371
409
  data_model=data_model,
372
- file_name="solve",
410
+ model_name="solve",
373
411
  file_extension="yaml",
374
412
  )
375
413
  self.compare_json_or_yaml_files(solve_file, reference_solve_file)