fiqus 2025.1.1__py3-none-any.whl → 2025.2.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.
@@ -199,7 +199,7 @@ class regions:
199
199
  :param filename: Name of the regions file (with extension).
200
200
  :type filename: str
201
201
  """
202
- FilesAndFolders.write_data_to_yaml(filename, self.rm.dict())
202
+ FilesAndFolders.write_data_to_yaml(filename, self.rm.model_dump())
203
203
 
204
204
 
205
205
  class curveType(Enum):
@@ -970,9 +970,12 @@ class Mesh(Base):
970
970
  # Start logger:
971
971
  gmsh.logger.start()
972
972
 
973
+ gmsh.option.setNumber("Mesh.Algorithm", 6)
974
+ gmsh.option.setNumber("Mesh.Algorithm3D", 1)
975
+
973
976
  # Mesh:
974
977
  gmsh.model.mesh.generate()
975
- gmsh.model.mesh.optimize()
978
+ gmsh.model.mesh.optimize("Netgen")
976
979
 
977
980
  # Print the log:
978
981
  log = gmsh.logger.get()
@@ -2899,12 +2902,12 @@ class Mesh(Base):
2899
2902
  self.mesh_data_file, Pancake3DMesh
2900
2903
  )
2901
2904
 
2902
- if previousGeo.dict() != self.geo.dict():
2905
+ if previousGeo.model_dump() != self.geo.model_dump():
2903
2906
  raise ValueError(
2904
2907
  "Geometry data has been changed. Please regenerate the geometry or load"
2905
2908
  " the previous geometry data."
2906
2909
  )
2907
- elif previousMesh.dict() != self.mesh.dict():
2910
+ elif previousMesh.model_dump() != self.mesh.model_dump():
2908
2911
  raise ValueError(
2909
2912
  "Mesh data has been changed. Please regenerate the mesh or load the"
2910
2913
  " previous mesh data."
@@ -497,15 +497,23 @@ Function {
497
497
  {% endfor %}
498
498
  {% endif %}
499
499
 
500
- {% for name, current in zip(rm_EM.powered['r1_a1'].vol.names + rm_EM.powered['r1_a2'].vol.names + rm_EM.powered['r2_a1'].vol.names + rm_EM.powered['r2_a2'].vol.names,
501
- rm_EM.powered['r1_a1'].vol.currents + rm_EM.powered['r1_a2'].vol.currents + rm_EM.powered['r2_a1'].vol.currents + rm_EM.powered['r2_a2'].vol.currents) %}
502
- js_fct[ <<name>> ] = <<current>>/SurfaceArea[];
500
+ {% for name, current, number in zip(rm_EM.powered['r1_a1'].vol.names + rm_EM.powered['r1_a2'].vol.names + rm_EM.powered['r2_a1'].vol.names + rm_EM.powered['r2_a2'].vol.names,
501
+ rm_EM.powered['r1_a1'].vol.currents + rm_EM.powered['r1_a2'].vol.currents + rm_EM.powered['r2_a1'].vol.currents + rm_EM.powered['r2_a2'].vol.currents,
502
+ rm_EM.powered['r1_a1'].vol.numbers + rm_EM.powered['r1_a2'].vol.numbers + rm_EM.powered['r2_a1'].vol.numbers + rm_EM.powered['r2_a2'].vol.numbers
503
+ ) %}
504
+ js_fct[ <<name>> ] = <<current>>/SurfaceArea[]{ <<number>> };
503
505
  {% endfor %}
504
506
 
505
507
  {% endif %}
506
508
 
507
509
  {% if dm.magnet.solve.thermal.solve_type %}
508
510
 
511
+ {% for name, number in zip(rm_TH.powered['r1_a1'].vol.names + rm_TH.powered['r1_a2'].vol.names + rm_TH.powered['r2_a1'].vol.names + rm_TH.powered['r2_a2'].vol.names,
512
+ rm_TH.powered['r1_a1'].vol.numbers + rm_TH.powered['r1_a2'].vol.numbers + rm_TH.powered['r2_a1'].vol.numbers + rm_TH.powered['r2_a2'].vol.numbers
513
+ ) %}
514
+ area_fct[ <<name>> ] = SurfaceArea[]{ <<number>> };
515
+ {% endfor %}
516
+
509
517
  {% if dm.magnet.geometry.thermal.use_TSA %}
510
518
  {% for nr, tags in enumerate(rm_TH.boundaries.thermal.temperature.bc.numbers) %}
511
519
  bnd_dirichlet_<<nr + 1>>() = {<<tags|join(', ')>>};
@@ -696,9 +704,9 @@ Function {
696
704
 
697
705
  // joule losses of bare part
698
706
  {% if dm.magnet.solve.electromagnetics.solve_type %}
699
- jouleLosses[] = CFUN_quenchState_Ic[criticalCurrentDensity[$1, $2] * SurfaceArea[]]{source_current} * rho[$1, $2] * SquNorm[source_current/SurfaceArea[]];
707
+ jouleLosses[] = CFUN_quenchState_Ic[criticalCurrentDensity[$1, $2] * area_fct[]]{source_current} * rho[$1, $2] * SquNorm[source_current/area_fct[]];
700
708
  {% else %}
701
- jouleLosses[] = CFUN_quenchState_Ic[criticalCurrentDensity[$1] * SurfaceArea[]]{source_current} * rho[$1] * SquNorm[source_current/SurfaceArea[]];
709
+ jouleLosses[] = CFUN_quenchState_Ic[criticalCurrentDensity[$1] * area_fct[]]{source_current} * rho[$1] * SquNorm[source_current/area_fct[]];
702
710
  {% endif %}
703
711
 
704
712
  {% if dm.magnet.geometry.thermal.with_wedges %}
@@ -1664,10 +1672,10 @@ PostProcessing {
1664
1672
  { Name jOverJc ;
1665
1673
  Value {
1666
1674
  {% if dm.magnet.solve.electromagnetics.solve_type %}
1667
- Term { [ source_current/SurfaceArea[] * 1/(criticalCurrentDensity[{T}, GetVariable[ElementNum[], QuadraturePointIndex[]]{$Bnorm}] + 1) ] ;
1675
+ Term { [ source_current/area_fct[] * 1/(criticalCurrentDensity[{T}, GetVariable[ElementNum[], QuadraturePointIndex[]]{$Bnorm}] + 1) ] ;
1668
1676
  In <<nc.omega>>_TH ; Jacobian Jac_Vol_TH ; }
1669
1677
  {% else %}
1670
- Term { [ source_current/SurfaceArea[] * 1/(criticalCurrentDensity[{T}] + 1) ] ;
1678
+ Term { [ source_current/area_fct[] * 1/(criticalCurrentDensity[{T}] + 1) ] ;
1671
1679
  In <<nc.omega>>_TH ; Jacobian Jac_Vol_TH ; }
1672
1680
  {% endif %}
1673
1681
  }
@@ -1676,11 +1684,11 @@ PostProcessing {
1676
1684
  // Temperature average as integral quantity
1677
1685
  { Name T_avg ;
1678
1686
  Value {
1679
- Integral { [ {T} / SurfaceArea[] ] ;
1687
+ Integral { [ {T} / area_fct[] ] ;
1680
1688
  In Region[ {<<nc.omega>><<nc.powered>>_TH{% if dm.magnet.geometry.thermal.with_iron_yoke %}, <<nc.omega>><<nc.iron>>{% endif %}{% if dm.magnet.geometry.thermal.with_wedges %}, <<nc.omega>><<nc.induced>>_TH{% endif %} } ] ; Jacobian Jac_Vol_TH ; Integration Int_conducting_TH; }
1681
1689
 
1682
1690
  {% if not dm.magnet.geometry.thermal.use_TSA %}
1683
- Integral { [ {T} / SurfaceArea[] ] ;
1691
+ Integral { [ {T} / area_fct[] ] ;
1684
1692
  In <<nc.omega>><<nc.insulator>>_TH ; Jacobian Jac_Vol_TH ; Integration Int_insulating_TH; }
1685
1693
  {% endif %}
1686
1694
  }
@@ -606,9 +606,6 @@ Integral {
606
606
  {% set cryocooler_quantity = "LOCALQUANT_T" %}
607
607
  {% endif %}
608
608
  Integral {
609
- // Division by area to compute Watts per meter squared
610
- // SurfaceArea function does not allow DOM_*** as argument, so we need to use
611
- // the actual ids
612
609
  [ cryocoolerCoolingPower[{<<cryocooler_quantity>>}], {<<cryocooler_quantity>>} ];
613
610
  In DOM_terminalSurfaces;
614
611
  Jacobian JAC_sur;
@@ -723,7 +720,11 @@ Integral {
723
720
  {% set quantityName = "LOCALQUANT_electricScalarPotentialThinShell" %}
724
721
  {% set temperatureArgument = "LOCALQUANT_TThinShell" %}
725
722
  {% set functionKey = "electricScalarPotential" %}
723
+ {% if dm.magnet.solve.contactLayer.resistivity == "perfectlyInsulating" %}
726
724
  {% set integrationDomain = "DOM_terminalContactLayerSurface_WithoutNotch" %}
725
+ {% else %}
726
+ {% set integrationDomain = "DOM_allInsulationSurface_WithoutNotch" %}
727
+ {% endif %}
727
728
  {% elif type == "resistiveHeating" %}
728
729
  {% set temperatureArgument = "LOCALQUANT_TThinShell" %}
729
730
  {% if dm.magnet.solve.contactLayer.resistivity == "perfectlyInsulating" %}
@@ -1403,6 +1404,7 @@ Group{
1403
1404
  DOM_terminalContactLayerSurface_WithoutNotch = Region[{ <<rm.insulator.surf.numbers[1::3]|join(', ')>> }];
1404
1405
  DOM_terminalContactLayerSurface_Notch = Region[{ <<rm.insulator.surf.numbers[2::3]|join(', ')>> }];
1405
1406
  DOM_terminalContactLayerSurface = Region[{ DOM_terminalContactLayerSurface_WithoutNotch, DOM_terminalContactLayerSurface_Notch }];
1407
+ DOM_allInsulationSurface_WithoutNotch = Region[ {DOM_insulationSurface, DOM_terminalContactLayerSurface_WithoutNotch} ];
1406
1408
 
1407
1409
  {% if dm.magnet.solve.convectiveCooling.heatTransferCoefficient %}
1408
1410
  DOM_allWindingSurface = Region[{ <<rm.powered["Pancake3D"].surf_th.numbers[2::]|join(', ')>> }];
@@ -1439,7 +1441,7 @@ Group{
1439
1441
  DOM_resistiveHeating = Region[{ DOM_allWindings }];
1440
1442
  {% endif %}
1441
1443
  DOM_thermal = Region[{ {% if dm.magnet.solve.solveHeatEquationTerminalsTransitionNotch %}DOM_powered{% else %}DOM_allWindings{% endif %}}];
1442
- {% else %}
1444
+ {% else %}
1443
1445
  DOM_thermal = Region[{ {% if dm.magnet.solve.solveHeatEquationTerminalsTransitionNotch %}DOM_powered, DOM_allInsulations{% else %}DOM_allWindings, DOM_allInsulations{% endif %}}];
1444
1446
  DOM_allConducting = Region[{ DOM_powered, DOM_terminalContactLayer}];
1445
1447
  {% if dm.magnet.solve.resistiveHeatingTerminals %}
@@ -1679,7 +1681,7 @@ if (
1679
1681
  {% if dm.magnet.solve.terminals.cryocoolerOptions.lumpedMass.volume %}
1680
1682
  // Cryocooler TSA parameters start ==================================================
1681
1683
  INPUT_NumOfCryocoolerTSAElements = <<dm.magnet.solve.terminals.cryocoolerOptions.lumpedMass.numberOfThinShellElements>>;
1682
- cryocooler_thickness[] = <<dm.magnet.solve.terminals.cryocoolerOptions.lumpedMass.volume>>/SurfaceArea[]{<< rm.powered['Pancake3D'].surf_in.numbers | join(', ') >>, << rm.powered['Pancake3D'].surf_out.numbers | join(', ') >> } ;
1684
+ cryocooler_thickness[] = <<dm.magnet.solve.terminals.cryocoolerOptions.lumpedMass.volume>>/ GetVariable[]{$areaCryocooler} ;
1683
1685
  th_cryocooler_k[] = cryocooler_thickness[]/INPUT_NumOfCryocoolerTSAElements;
1684
1686
  // Cryocooler TSA parameters end ====================================================
1685
1687
  {% endif %}
@@ -2113,6 +2115,38 @@ if (
2113
2115
  {% endif %}
2114
2116
  {% endif %}
2115
2117
  // Insulation resistivity ends =====================================================
2118
+
2119
+ {% if dm.magnet.solve.voltageTapPositions %}
2120
+ // Insulation conductivity starts ===================================================
2121
+ {% if dm.magnet.solve.terminals.terminalContactLayer.resistivity and dm.magnet.geometry.contactLayer.thinShellApproximation and dm.magnet.solve.contactLayer.resistivity != "perfectlyInsulating" %}
2122
+ // Linear:
2123
+ INPUT_insulationConductivity = 1./<<dm.magnet.solve.contactLayer.resistivity>>; // conductivity of the insulation, [S/m]
2124
+
2125
+ // Thin-shell insulation:
2126
+ {% for a in range(1,3) %}
2127
+ {% for b in range(1,3) %}
2128
+ electricScalarPotentialMassFunctionNoDta<<a>>b<<b>>[DOM_insulationSurface] = TSA_constantMaterial_constantThickness_mass[]{
2129
+ th_terminal_k, INPUT_insulationConductivity, <<a>>, <<b>>
2130
+ };
2131
+
2132
+ electricScalarPotentialStiffnessFunctiona<<a>>b<<b>>[DOM_insulationSurface] = TSA_constantMaterial_constantThickness_stiffness[]{
2133
+ th_terminal_k, INPUT_insulationConductivity, <<a>>, <<b>>
2134
+ };
2135
+ {% endfor %}
2136
+ {% endfor %}
2137
+
2138
+
2139
+
2140
+ {% elif not dm.magnet.solve.contactLayer.resistivity %}
2141
+ // Nonlinear:
2142
+
2143
+ // Thin-shell insulation:
2144
+ {# Non-linear TSA conductivity not considered yet. #}
2145
+ <<0/0>>;
2146
+
2147
+ {% endif %}
2148
+ // Insulation conductivity ends =====================================================
2149
+ {% endif %}
2116
2150
 
2117
2151
  // Transition layer resistivity starts =============================================
2118
2152
  {% if dm.magnet.solve.terminals.terminalContactLayer.resistivity %}
@@ -2625,10 +2659,10 @@ if (
2625
2659
  // SurfaceArea function does not allow DOM_*** as argument, so we need to use
2626
2660
  // the actual ids
2627
2661
  cryocoolerCoolingPower[] =
2628
- (<<dm.magnet.solve.terminals.cryocoolerOptions.coolingPowerMultiplier>> * CFUN_P2vsT2_cryocooler_SHI_SRDE_418D4_T[$1] - <<dm.magnet.solve.terminals.cryocoolerOptions.staticHeatLoadPower>>)/SurfaceArea[]{<< rm.powered['Pancake3D'].surf_in.numbers | join(', ') >>, << rm.powered['Pancake3D'].surf_out.numbers | join(', ') >> };
2662
+ (<<dm.magnet.solve.terminals.cryocoolerOptions.coolingPowerMultiplier>> * CFUN_P2vsT2_cryocooler_SHI_SRDE_418D4_T[$1] - <<dm.magnet.solve.terminals.cryocoolerOptions.staticHeatLoadPower>>)/ GetVariable[]{$areaCryocooler} ;
2629
2663
 
2630
2664
  cryocoolerCoolingPowerDerivativeT[] =
2631
- <<dm.magnet.solve.terminals.cryocoolerOptions.coolingPowerMultiplier>> * CFUN_P2vsT2_cryocooler_SHI_SRDE_418D4_dT_T[$1]/SurfaceArea[]{<< rm.powered['Pancake3D'].surf_in.numbers | join(', ') >>, << rm.powered['Pancake3D'].surf_out.numbers | join(', ')>>};
2665
+ <<dm.magnet.solve.terminals.cryocoolerOptions.coolingPowerMultiplier>> * CFUN_P2vsT2_cryocooler_SHI_SRDE_418D4_dT_T[$1]/ GetVariable[]{$areaCryocooler};
2632
2666
  {% endif %}
2633
2667
  }
2634
2668
 
@@ -3259,7 +3293,11 @@ FunctionSpace{
3259
3293
  Name BASISFUN_sn~{i};
3260
3294
  NameOfCoef sn~{i};
3261
3295
  Function BF_Node;
3296
+ {% if dm.magnet.solve.contactLayer.resistivity == "perfectlyInsulating" %}
3262
3297
  Support DOM_terminalContactLayerSurface;
3298
+ {% else %}
3299
+ Support DOM_allInsulationSurface;
3300
+ {% endif %}
3263
3301
  Entity NodesOf[ All ];
3264
3302
  }
3265
3303
  EndFor
@@ -3531,6 +3569,9 @@ Resolution{
3531
3569
  }
3532
3570
 
3533
3571
  Operation{
3572
+ {% if dm.magnet.solve.terminals.cooling == "cryocooler" %}
3573
+ Evaluate[SetVariable[SurfaceArea[]{<< rm.powered['Pancake3D'].surf_in.numbers | join(', ') >>, << rm.powered['Pancake3D'].surf_out.numbers | join(', ') >> }]{$areaCryocooler}];
3574
+ {% endif %}
3534
3575
  {% if dm.magnet.solve.type == "weaklyCoupled" %}
3535
3576
  {% set systemNames = ["SYSTEM_electromagnetic", "SYSTEM_thermal"] %}
3536
3577
  {% set solveAfterThisTimes = [0, 0]%}
@@ -3657,8 +3698,46 @@ PostProcessing{
3657
3698
  }
3658
3699
  }
3659
3700
  }
3660
-
3661
-
3701
+ {% if dm.magnet.geometry.contactLayer.thinShellApproximation %}
3702
+ {
3703
+ Name RESULT_arcLengthContactLayer;
3704
+ Value{
3705
+ Local{
3706
+ [Pancake3DGetContinuousArcLength_contactLayer[XYZ[]]{
3707
+ <<dm.magnet.geometry.winding.innerRadius>>,
3708
+ <<windingThickness>>,
3709
+ <<gapThickness>>,
3710
+ <<dm.magnet.geometry.winding.theta_i>>,
3711
+ <<dm.magnet.mesh.winding.azimuthalNumberOfElementsPerTurn[0]>>,
3712
+ <<dm.magnet.geometry.numberOfPancakes>>,
3713
+ <<dm.magnet.geometry.winding.height>>,
3714
+ <<dm.magnet.geometry.gapBetweenPancakes>>
3715
+ }];
3716
+ In DOM_allInsulationSurface;
3717
+ Jacobian JAC_sur;
3718
+ }
3719
+ }
3720
+ }
3721
+ {
3722
+ Name RESULT_turnNumberContactLayer;
3723
+ Value{
3724
+ Local{
3725
+ [Pancake3DGetContinuousTurnNumber_contactLayer[XYZ[]]{
3726
+ <<dm.magnet.geometry.winding.innerRadius>>,
3727
+ <<windingThickness>>,
3728
+ <<gapThickness>>,
3729
+ <<dm.magnet.geometry.winding.theta_i>>,
3730
+ <<dm.magnet.mesh.winding.azimuthalNumberOfElementsPerTurn[0]>>,
3731
+ <<dm.magnet.geometry.numberOfPancakes>>,
3732
+ <<dm.magnet.geometry.winding.height>>,
3733
+ <<dm.magnet.geometry.gapBetweenPancakes>>
3734
+ }];
3735
+ In DOM_allInsulationSurface;
3736
+ Jacobian JAC_sur;
3737
+ }
3738
+ }
3739
+ }
3740
+ {% endif %}
3662
3741
  {
3663
3742
  Name RESULT_turnNumber;
3664
3743
  Value{
@@ -3915,7 +3994,7 @@ PostProcessing{
3915
3994
  Term {
3916
3995
  Type Global;
3917
3996
  [ #999 ];
3918
- In DOM_thermal;
3997
+ In DOM_powered;
3919
3998
  }
3920
3999
  }
3921
4000
  }
@@ -3970,9 +4049,6 @@ PostProcessing{
3970
4049
  Value{
3971
4050
  Integral{
3972
4051
  Type Global;
3973
- // Division by area to compute Watts per meter squared
3974
- // SurfaceArea function does not allow DOM_*** as argument, so we need to use
3975
- // the actual ids
3976
4052
  {% if dm.magnet.solve.terminals.cryocoolerOptions.lumpedMass.volume %}
3977
4053
  {% set cryocooler_quantity = "LOCALQUANT_cryocooler_TThinShell~{INPUT_NumOfCryocoolerTSAElements}" %}
3978
4054
  {% else %}
@@ -4001,7 +4077,7 @@ PostProcessing{
4001
4077
  {% set cryocooler_quantity = "LOCALQUANT_T" %}
4002
4078
  {% endif %}
4003
4079
 
4004
- [ {<<cryocooler_quantity>>}/SurfaceArea[]{<< rm.powered['Pancake3D'].surf_in.numbers | join(', ') >>, << rm.powered['Pancake3D'].surf_out.numbers | join(', ') >> } ];
4080
+ [ {<<cryocooler_quantity>>}/ GetVariable[]{$areaCryocooler}];
4005
4081
  In DOM_terminalSurfaces;
4006
4082
  Jacobian JAC_sur;
4007
4083
  Integration Int;
@@ -4058,7 +4134,7 @@ PostProcessing{
4058
4134
  {% if dm.magnet.solve.contactLayer.resistivity == "perfectlyInsulating" %}
4059
4135
  In DOM_terminalContactLayerSurface_WithoutNotch;
4060
4136
  {% else %}
4061
- In DOM_allInsulationSurface;
4137
+ In DOM_allInsulationSurface_WithoutNotch;
4062
4138
  {% endif %}
4063
4139
  Integration Int;
4064
4140
  Jacobian JAC_sur;
@@ -4075,7 +4151,7 @@ PostProcessing{
4075
4151
  {% if dm.magnet.solve.contactLayer.resistivity == "perfectlyInsulating" %}
4076
4152
  In DOM_terminalContactLayerSurface_WithoutNotch;
4077
4153
  {% else %}
4078
- In DOM_allInsulationSurface;
4154
+ In DOM_allInsulationSurface_WithoutNotch;
4079
4155
  {% endif %}
4080
4156
  Integration Int;
4081
4157
  Jacobian JAC_sur;
@@ -4235,6 +4311,34 @@ PostOperation{
4235
4311
  )|indent(12)>>
4236
4312
  }
4237
4313
  }
4314
+ {% if dm.magnet.geometry.contactLayer.thinShellApproximation %}
4315
+ {
4316
+ Name POSTOP_arcLengthContactLayer;
4317
+ NameOfPostProcessing POSTPRO_<<dm.magnet.solve.type>>;
4318
+ Operation{
4319
+ <<POSTOPERATION_printResults(
4320
+ quantity="RESULT_arcLengthContactLayer",
4321
+ onElementsOf="DOM_allInsulationSurface",
4322
+ name="Arc Length Contact Layer [m]",
4323
+ fileName="arcLengthContactLayer",
4324
+ lastTimeStepOnly=True
4325
+ )|indent(12)>>
4326
+ }
4327
+ }
4328
+ {
4329
+ Name POSTOP_turnNumberContactLayer;
4330
+ NameOfPostProcessing POSTPRO_<<dm.magnet.solve.type>>;
4331
+ Operation{
4332
+ <<POSTOPERATION_printResults(
4333
+ quantity="RESULT_turnNumberContactLayer",
4334
+ onElementsOf="DOM_allInsulationSurface",
4335
+ name="Turn number contact layer [m]",
4336
+ fileName="turnNumberContactLayer",
4337
+ lastTimeStepOnly=True
4338
+ )|indent(12)>>
4339
+ }
4340
+ }
4341
+ {% endif %}
4238
4342
  {
4239
4343
  Name POSTOP_turnNumber;
4240
4344
  NameOfPostProcessing POSTPRO_<<dm.magnet.solve.type>>;
@@ -4452,7 +4556,7 @@ PostOperation{
4452
4556
  NameOfPostProcessing POSTPRO_<<dm.magnet.solve.type>>;
4453
4557
  Operation {
4454
4558
  Print[ RESULT_temperature,
4455
- OnElementsOf DOM_thermal,
4559
+ OnElementsOf DOM_powered,
4456
4560
  StoreMaxInRegister 999,
4457
4561
  Format Table,
4458
4562
  LastTimeStepOnly 1,
@@ -4629,14 +4733,14 @@ PostOperation{
4629
4733
  {% endif %}
4630
4734
  // convergence criteria as postoperations:
4631
4735
  {% for tolerance in (dm.magnet.solve.nonlinearSolver.postOperationTolerances + dm.magnet.solve.time.adaptiveSteppingSettings.postOperationTolerances)|unique(attribute="quantity") %}
4632
- {% if tolerance.quantity == "totalResistiveHeating" %}
4736
+ {% if tolerance.quantity in ["totalResistiveHeating", "magneticEnergy"] %}
4633
4737
  {
4634
4738
  // Does this work properly without explicitly specifying AtGaussPoints? Expectation: yes, since it should do the integration over the whole by Gaussian Integration
4635
- Name POSTOP_CONV_totalResistiveHeating;
4739
+ Name POSTOP_CONV_<<tolerance.quantity>>;
4636
4740
  NameOfPostProcessing POSTPRO_<<dm.magnet.solve.type>>;
4637
4741
  LastTimeStepOnly 1;
4638
4742
  Operation {
4639
- Print[RESULT_totalResistiveHeating, OnGlobal];
4743
+ Print[RESULT_<<tolerance.quantity>>, OnGlobal];
4640
4744
  }
4641
4745
  }
4642
4746
  {% elif tolerance.quantity in ["voltageBetweenTerminals", "currentThroughCoil"] %}
@@ -4655,7 +4759,7 @@ PostOperation{
4655
4759
  NameOfPostProcessing POSTPRO_<<dm.magnet.solve.type>>;
4656
4760
  Operation {
4657
4761
  Print[ RESULT_temperature,
4658
- OnElementsOf DOM_thermal,
4762
+ OnElementsOf DOM_powered,
4659
4763
  StoreMaxInRegister 999,
4660
4764
  Format Table,
4661
4765
  LastTimeStepOnly 1,
@@ -4664,7 +4768,7 @@ PostOperation{
4664
4768
 
4665
4769
  <<POSTOPERATION_printResults(
4666
4770
  quantity="RESULT_maximumTemperature",
4667
- onRegion="DOM_thermal",
4771
+ onRegion="DOM_powered",
4668
4772
  format="TimeTable",
4669
4773
  name="Maximum temperature [K]",
4670
4774
  appendToExistingFile=True,
@@ -4777,8 +4881,8 @@ PostOperation{
4777
4881
  )|indent(12)>>
4778
4882
  {% endfor %}
4779
4883
 
4780
- // Print[RESULT_electricScalarPotential, OnElementsOf Region[{DOM_terminals, DOM_allWindings {% if not dm.magnet.geometry.contactLayer.thinShellApproximation %}, DOM_insulation{% endif %} }], File "electricScalarPotential.pos"];
4781
- // Print[RESULT_currentFromElectricScalarPotential, OnElementsOf DOM_allWindings, File "currentFromElectricScalarPotential.pos", AtGaussPoints 6];
4884
+ Print[RESULT_electricScalarPotential, OnElementsOf Region[{DOM_terminals, DOM_allWindings {% if not dm.magnet.geometry.contactLayer.thinShellApproximation %}, DOM_insulation{% endif %} }], File "electricScalarPotential.pos"];
4885
+ //Print[RESULT_currentFromElectricScalarPotential, OnElementsOf DOM_allWindings, File "currentFromElectricScalarPotential.pos", AtGaussPoints 6];
4782
4886
  }
4783
4887
  }
4784
4888
  {% endif %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fiqus
3
- Version: 2025.1.1
3
+ Version: 2025.2.0
4
4
  Summary: Source code for STEAM FiQuS tool
5
5
  Home-page: https://gitlab.cern.ch/steam/fiqus
6
6
  Author: STEAM Team
@@ -86,13 +86,14 @@ Source code for STEAM **FiQuS** (**Fi**nite Element **Qu**ench **S**imulator).
86
86
 
87
87
  ## Describing FiQuS Modules
88
88
  - S. Atalay et al, "An open-source 3D FE quench simulation tool for no-insulation HTS pancake coils", in Superconductor Science and Technology, doi: [10.1088/1361-6668/ad3f83](https://doi.org/10.1088/1361-6668/ad3f83)
89
- - J. Dular et al, "Coupled Axial and Transverse Currents Method for Finite Element Modelling of Periodic Superconductors", arXiv preprint, doi:[10.48550/arXiv.2404.09775](https://doi.org/10.48550/arXiv.2404.09775).
89
+ - J. Dular et al, "Coupled Axial and Transverse Currents Method for Finite Element Modelling of Periodic Superconductors", in Superconductor Science and Technology, doi: [10.1088/1361-6668/ad650d](https://doi.org/10.1088/1361-6668/ad650d).
90
+ - E. Schnaubelt et al, "Transient Finite Element Simulation of Accelerator Magnets Using Thermal Thin Shell Approximation", arXiV preprint, doi: [10.48550/arXiv.2501.15871](https://doi.org/10.48550/arXiv.2501.15871).
90
91
  - A. Vitrano et al, "An Open-Source Finite Element Quench Simulation Tool for Superconducting Magnets," in IEEE Transactions on Applied Superconductivity, vol. 33, no. 5, pp. 1-6, Aug. 2023, Art no. 4702006, doi: [10.1109/TASC.2023.3259332](https://ieeexplore.ieee.org/abstract/document/10077402).
91
92
 
92
93
  ## Using FiQuS
93
94
 
94
- - J. Dular et al, "Simulation of Rutherford Cable AC Loss and Magnetization with the Coupled Axial and Transverse Currents Method", accepted for publication in IEEE Transactions on Applied Superconductivity, [arXiv:2411.13347](https://arxiv.org/abs/2411.13347).
95
- - M. Wozniak et al, "Influence of Critical Current Distribution on Operation, Quench Detection and Protection of HTS Pancake Coils, submitted for publication in IEEE Transactions on Applied Superconductivity, [arXiv:2411.18124](https://arxiv.org/abs/2411.18124).
95
+ - J. Dular et al, "Simulation of Rutherford Cable AC Loss and Magnetization with the Coupled Axial and Transverse Currents Method", in IEEE Transactions on Applied Superconductivity, [10.1109/TASC.2024.3520941](https://doi.org/10.1109/TASC.2024.3520941).
96
+ - M. Wozniak et al, "Influence of Critical Current Distribution on Operation, Quench Detection and Protection of HTS Pancake Coils, in IEEE Transactions on Applied Superconductivity, [10.1109/TASC.2025.3532246](https://doi.org/10.1109/TASC.2025.3532246).
96
97
  - Laura AM D’Angelo et al, "Efficient Reduced Magnetic Vector Potential Formulation for the Magnetic Field Simulation of Accelerator Magnets", in IEEE Transactions on Magnetics, vol. 60, no. 3, pp. 1-8, Jan. 2024, Art no. 7000808, doi: [10.1109/TMAG.2024.3352113](https://ieeexplore.ieee.org/abstract/document/10387412).
97
98
  - M. Wozniak et al, "Quench Co-Simulation of Canted Cos-Theta Magnets," in IEEE Transactions on Applied Superconductivity, vol. 34, no. 3, pp. 1-5, Dec. 2023, Art no. 4900105, doi: [10.1109/TASC.2023.3338142](https://ieeexplore.ieee.org/document/10337614).
98
99
  - M. Wozniak et al, "Fast Quench Propagation Conductor for Protecting Canted Cos-Theta Magnets," in IEEE Transactions on Applied Superconductivity, vol. 33, no. 5, pp. 1-5, Aug. 2023, Art no. 4701705, doi: [10.1109/TASC.2023.3247997](https://ieeexplore.ieee.org/document/10050158).
@@ -32,7 +32,7 @@ fiqus/mains/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  fiqus/mesh_generators/MeshCCT.py,sha256=e2oERrb2Vp7W8eAptijFq1vi-cUbYS_T3jCDqH3foIg,11227
33
33
  fiqus/mesh_generators/MeshConductorAC_Strand.py,sha256=bz8kzFDd_XnRA892ifuCp11zMTZMQ5NdsNKSslP7gZc,42466
34
34
  fiqus/mesh_generators/MeshMultipole.py,sha256=mjdjzw5RGlggoXAVvUqFM43yGXSwDNbta0z1l76c7uc,97181
35
- fiqus/mesh_generators/MeshPancake3D.py,sha256=dIL-F070C5xlSK6m4kSA8D3OeKuVRoy0Ptz-4KHz4CI,126821
35
+ fiqus/mesh_generators/MeshPancake3D.py,sha256=u31glrOUPGityJ5S0z4n3SvI_Vqqyh62jv7OXIq3-lY,126975
36
36
  fiqus/mesh_generators/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  fiqus/parsers/ParserCOND.py,sha256=nQyRRZf2Jbvf6ri5rdhq2P6b52Qbp2tTHuDRT4ChxHI,41376
38
38
  fiqus/parsers/ParserDAT.py,sha256=SPJHDbPuk1e7F9FZ3i7oRvOvYGO4LIkpy-ROGJBUEQ0,659
@@ -59,8 +59,8 @@ fiqus/pro_material_functions/ironBHcurves.pro,sha256=-4xfRg4BYefTEoNawPo3nbsrJJm
59
59
  fiqus/pro_templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
60
  fiqus/pro_templates/combined/CCT_template.pro,sha256=6r_fz9bH7AReCfDn33lyu472kjB0rkTma9_r4vBqV0U,13558
61
61
  fiqus/pro_templates/combined/ConductorAC_template.pro,sha256=8aZwuRveHY2R0bEvC9Ysz_SISPLU7eNvi5szO_RUEtA,60694
62
- fiqus/pro_templates/combined/Multipole_template.pro,sha256=5FOXwPpxQKpGYFEswrFj5lL9t652i6mWz4PYDp5q4mg,97396
63
- fiqus/pro_templates/combined/Pancake3D_template.pro,sha256=CAmIVgzygFJSXDozuNeCL8eyId1HnMjVeyQOl-O4Suk,211330
62
+ fiqus/pro_templates/combined/Multipole_template.pro,sha256=Hbmh9NbZNAGsf9kUzdFEnoOnCRnIbmxdqa93jQCFsGw,97959
63
+ fiqus/pro_templates/combined/Pancake3D_template.pro,sha256=OjWWWAZel5Yk_k4FEFFNkkSFkCv1N0rM2-DRvilH6dc,215797
64
64
  fiqus/pro_templates/combined/TSA_materials.pro,sha256=I8zVOP2ZEFqR0y3JcpSQJWaE6I4UeeMU22PtSD8ExCc,12244
65
65
  fiqus/pro_templates/combined/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
66
  fiqus/pro_templates/combined/materials.pro,sha256=D-cBOIMaQyYffIfoR4yRiK69Z6sxHu2QtyjhDIKFiXc,7038
@@ -78,8 +78,8 @@ tests/utils/fiqus_test_classes.py,sha256=i7G0wWA7MNdj-pAnXnGrpnv3KXx9JMDRUbKwFMR
78
78
  tests/utils/generate_reference_files_ConductorAC.py,sha256=F5KK1AmHg1AmjZL6wRoR4R4kPpQu5KyLZtk1EnDsS1I,1619
79
79
  tests/utils/generate_reference_files_Pancake3D.py,sha256=9sULcDOmbotrbYHz8DqGv6Km7ThfltnCHFojHUx193U,3126
80
80
  tests/utils/helpers.py,sha256=bX3jz6Cux175TVWMpeaMo1SspQAewCSzKsC4ZwRBRR4,4052
81
- fiqus-2025.1.1.dist-info/LICENSE.txt,sha256=gcuuhKKc5-dwvyvHsXjlC9oM6N5gZ6umYbC8ewW1Yvg,35821
82
- fiqus-2025.1.1.dist-info/METADATA,sha256=j8fv8nUs6lZnzXzRd1TQvnsCuQMXcvlgdd8uAnCW7oU,7915
83
- fiqus-2025.1.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
84
- fiqus-2025.1.1.dist-info/top_level.txt,sha256=oGzSIyoVc1zYg14o67zI3QFwWsJvqNzNT0-te9WbUQc,12
85
- fiqus-2025.1.1.dist-info/RECORD,,
81
+ fiqus-2025.2.0.dist-info/LICENSE.txt,sha256=gcuuhKKc5-dwvyvHsXjlC9oM6N5gZ6umYbC8ewW1Yvg,35821
82
+ fiqus-2025.2.0.dist-info/METADATA,sha256=WYaVeRxe2Y8fnmJr9LBx5ROdrKbmHSl_wLwxKru2weQ,8143
83
+ fiqus-2025.2.0.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
84
+ fiqus-2025.2.0.dist-info/top_level.txt,sha256=oGzSIyoVc1zYg14o67zI3QFwWsJvqNzNT0-te9WbUQc,12
85
+ fiqus-2025.2.0.dist-info/RECORD,,