femagtools 1.8.16__tar.gz → 1.8.18__tar.gz

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 (235) hide show
  1. {femagtools-1.8.16/src/femagtools.egg-info → femagtools-1.8.18}/PKG-INFO +2 -2
  2. {femagtools-1.8.16 → femagtools-1.8.18}/pyproject.toml +1 -1
  3. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/__init__.py +1 -1
  4. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/airgap.py +5 -1
  5. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/area.py +52 -23
  6. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/areabuilder.py +69 -46
  7. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/converter.py +25 -5
  8. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/fslrenderer.py +2 -2
  9. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/geom.py +264 -68
  10. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/machine.py +38 -8
  11. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/symmetry.py +20 -5
  12. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/femag.py +27 -16
  13. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/__init__.py +2 -0
  14. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/effloss.py +10 -4
  15. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/pm.py +72 -68
  16. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/sm.py +15 -15
  17. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/bch.py +3 -1
  18. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/char.py +5 -16
  19. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/nc.py +67 -34
  20. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/shortcircuit.py +10 -3
  21. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/utils.py +5 -4
  22. {femagtools-1.8.16 → femagtools-1.8.18/src/femagtools.egg-info}/PKG-INFO +2 -2
  23. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools.egg-info/requires.txt +1 -1
  24. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_machine.py +1 -2
  25. {femagtools-1.8.16 → femagtools-1.8.18}/LICENSE +0 -0
  26. {femagtools-1.8.16 → femagtools-1.8.18}/MANIFEST.in +0 -0
  27. {femagtools-1.8.16 → femagtools-1.8.18}/README.md +0 -0
  28. {femagtools-1.8.16 → femagtools-1.8.18}/setup.cfg +0 -0
  29. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/amazon.py +0 -0
  30. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/amela.py +0 -0
  31. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/asm.py +0 -0
  32. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/bch.py +0 -0
  33. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/bchxml.py +0 -0
  34. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/condor.py +0 -0
  35. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/conductor.py +0 -0
  36. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/config.py +0 -0
  37. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/convert.py +0 -0
  38. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dakota.py +0 -0
  39. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dakota_femag.py +0 -0
  40. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dakotaout.py +0 -0
  41. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/docker.py +0 -0
  42. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/__init__.py +0 -0
  43. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/concat.py +0 -0
  44. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/conv.py +0 -0
  45. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/corner.py +0 -0
  46. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  47. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/dxfparser.py +0 -0
  48. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/femparser.py +0 -0
  49. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/functions.py +0 -0
  50. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/journal.py +0 -0
  51. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  52. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/shape.py +0 -0
  53. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/dxfsl/svgparser.py +0 -0
  54. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/ecloss.py +0 -0
  55. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/erg.py +0 -0
  56. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/forcedens.py +0 -0
  57. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/fsl.py +0 -0
  58. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/getset.py +0 -0
  59. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/gmsh.py +0 -0
  60. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/google.py +0 -0
  61. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/grid.py +0 -0
  62. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/heat_source_network.py +0 -0
  63. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/hxy.py +0 -0
  64. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/isa7.py +0 -0
  65. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/jhb.py +0 -0
  66. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/job.py +0 -0
  67. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/leakinduc.py +0 -0
  68. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/losscoeffs.py +0 -0
  69. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/afpm.py +0 -0
  70. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/im.py +0 -0
  71. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/sizing.py +0 -0
  72. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/machine/utils.py +0 -0
  73. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/magnet.py +0 -0
  74. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/mcv.py +0 -0
  75. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/me.py +0 -0
  76. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/model.py +0 -0
  77. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/__init__.py +0 -0
  78. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/algorithm.py +0 -0
  79. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/population.py +0 -0
  80. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/problem.py +0 -0
  81. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  82. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/test/PopulationTest.py +0 -0
  83. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moo/test/ProblemTest.py +0 -0
  84. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/moproblem.py +0 -0
  85. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/multiproc.py +0 -0
  86. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/mxw2msh.py +0 -0
  87. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/nc.py +0 -0
  88. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/netlist.py +0 -0
  89. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/ntib.py +0 -0
  90. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/opt.py +0 -0
  91. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/parstudy.py +0 -0
  92. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/__init__.py +0 -0
  93. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/fieldlines.py +0 -0
  94. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/fluxdens.py +0 -0
  95. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/forcedens.py +0 -0
  96. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/machine.py +0 -0
  97. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/mcv.py +0 -0
  98. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/phasor.py +0 -0
  99. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/plot/wdg.py +0 -0
  100. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/poc.py +0 -0
  101. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/semi_fea.py +0 -0
  102. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/svgfsl/converter.py +0 -0
  103. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/FE-losses.mako +0 -0
  104. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/afm_rotor.mako +0 -0
  105. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/afm_stator.mako +0 -0
  106. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/airgapinduc.mako +0 -0
  107. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/asyn_motor.mako +0 -0
  108. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/basic_modpar.mako +0 -0
  109. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/bertotti.mako +0 -0
  110. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/calc_field_ts.mako +0 -0
  111. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/calc_therm_field.mako +0 -0
  112. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/cogg_calc.mako +0 -0
  113. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/colorgrad.mako +0 -0
  114. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/com_motor_sim.mako +0 -0
  115. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/conduct-data.mako +0 -0
  116. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/connect_models.mako +0 -0
  117. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/cu_losses.mako +0 -0
  118. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  119. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  120. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/fe-contr.mako +0 -0
  121. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/fieldcalc.mako +0 -0
  122. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/gen_hairpin_winding.mako +0 -0
  123. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/gen_winding.mako +0 -0
  124. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/inductances.mako +0 -0
  125. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  126. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  127. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  128. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  129. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnet-data.mako +0 -0
  130. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetFC2.mako +0 -0
  131. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetIron.mako +0 -0
  132. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetIron2.mako +0 -0
  133. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetIron3.mako +0 -0
  134. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetIron4.mako +0 -0
  135. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetIron5.mako +0 -0
  136. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetIronV.mako +0 -0
  137. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetSector.mako +0 -0
  138. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  139. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetShell.mako +0 -0
  140. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/magnetShell2.mako +0 -0
  141. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/mesh-airgap.mako +0 -0
  142. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/modal_analysis.mako +0 -0
  143. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  144. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  145. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/new_model.mako +0 -0
  146. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  147. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/noloadflux.mako +0 -0
  148. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  149. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/open.mako +0 -0
  150. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/plots.mako +0 -0
  151. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  152. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  153. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  154. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/prepare_thermal.mako +0 -0
  155. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  156. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/psi-torq-rem-rot.mako +0 -0
  157. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/psi-torq-rem.mako +0 -0
  158. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/psi-torq-rot.mako +0 -0
  159. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/ring.mako +0 -0
  160. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/rot_hsm.mako +0 -0
  161. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/rotorAsyn.mako +0 -0
  162. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/rotorKs2.mako +0 -0
  163. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/rotor_msh.mako +0 -0
  164. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/rotor_winding.mako +0 -0
  165. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/shortcircuit.mako +0 -0
  166. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/srm.mako +0 -0
  167. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/stator1.mako +0 -0
  168. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/stator2.mako +0 -0
  169. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/stator3Linear.mako +0 -0
  170. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/stator4.mako +0 -0
  171. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/statorBG.mako +0 -0
  172. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/statorRing.mako +0 -0
  173. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/statorRotor3.mako +0 -0
  174. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/stator_msh.mako +0 -0
  175. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/therm-dynamic.mako +0 -0
  176. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/therm_static.mako +0 -0
  177. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/templates/torq_calc.mako +0 -0
  178. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/tks.py +0 -0
  179. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/ts.py +0 -0
  180. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/vbf.py +0 -0
  181. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/vtu.py +0 -0
  182. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/windings.py +0 -0
  183. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools/zmq.py +0 -0
  184. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools.egg-info/SOURCES.txt +0 -0
  185. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools.egg-info/dependency_links.txt +0 -0
  186. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools.egg-info/entry_points.txt +0 -0
  187. {femagtools-1.8.16 → femagtools-1.8.18}/src/femagtools.egg-info/top_level.txt +0 -0
  188. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/__init__.py +0 -0
  189. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/engines/__init__.py +0 -0
  190. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/engines/test_amazon.py +0 -0
  191. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/engines/test_config.py +0 -0
  192. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/geom/__init__.py +0 -0
  193. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/geom/test_functions.py +0 -0
  194. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/geom/test_point_inside.py +0 -0
  195. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/moo/__init__.py +0 -0
  196. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/moo/test_algorithm.py +0 -0
  197. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/moo/test_population.py +0 -0
  198. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/moo/test_problem.py +0 -0
  199. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_afpm.py +0 -0
  200. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_airgap_induction.py +0 -0
  201. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_amela.py +0 -0
  202. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_asm.py +0 -0
  203. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_bchreader.py +0 -0
  204. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_conductor.py +0 -0
  205. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_convert.py +0 -0
  206. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_dxfsl.py +0 -0
  207. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_effloss.py +0 -0
  208. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_erg.py +0 -0
  209. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_femag.py +0 -0
  210. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_forcedens.py +0 -0
  211. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_fsl.py +0 -0
  212. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_heat_source_network.py +0 -0
  213. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_hxy.py +0 -0
  214. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_im.py +0 -0
  215. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_isa7.py +0 -0
  216. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_jhb.py +0 -0
  217. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_job.py +0 -0
  218. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_losscoeffs.py +0 -0
  219. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_magncurv.py +0 -0
  220. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_magnet.py +0 -0
  221. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_mcv.py +0 -0
  222. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_mcvreader.py +0 -0
  223. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_me.py +0 -0
  224. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_model.py +0 -0
  225. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_nc.py +0 -0
  226. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_parident.py +0 -0
  227. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_parstudy.py +0 -0
  228. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_pocfile.py +0 -0
  229. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_sizing.py +0 -0
  230. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_sm.py +0 -0
  231. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_tksreader.py +0 -0
  232. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_ts.py +0 -0
  233. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_vbfreader.py +0 -0
  234. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_vtu.py +0 -0
  235. {femagtools-1.8.16 → femagtools-1.8.18}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: femagtools
3
- Version: 1.8.16
3
+ Version: 1.8.18
4
4
  Summary: Python API for FEMAG
5
5
  Author-email: Ronald Tanner <tar@semafor.ch>, Dapu Zhang <dzhang@gtisoft.com>, Beat Holm <hob@semafor.ch>, Günther Amsler <amg@semafor.ch>, Nicolas Mauchle <mau@semafor.ch>
6
6
  License: Copyright (c) 2016-2023, Semafor Informatik & Energie AG, Basel
@@ -38,7 +38,7 @@ Requires-Python: >=3.7
38
38
  Description-Content-Type: text/markdown
39
39
  License-File: LICENSE
40
40
  Requires-Dist: numpy
41
- Requires-Dist: scipy
41
+ Requires-Dist: scipy<=1.14.1
42
42
  Requires-Dist: mako
43
43
  Requires-Dist: six
44
44
  Requires-Dist: lmfit
@@ -23,7 +23,7 @@ classifiers = [
23
23
  ]
24
24
  dependencies = [
25
25
  'numpy',
26
- 'scipy',
26
+ 'scipy<=1.14.1', # Singular matrix C in mtpv_tmech
27
27
  'mako',
28
28
  'six',
29
29
  'lmfit',
@@ -2,7 +2,7 @@
2
2
 
3
3
  """
4
4
  __title__ = 'femagtools'
5
- __version__ = '1.8.16'
5
+ __version__ = '1.8.18'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2025 Gamma Technology'
@@ -24,7 +24,11 @@ def fft(pos: list, b: list, pmod=0) -> dict:
24
24
  Bamp = r['a']
25
25
  alfa0 = r['alfa0']
26
26
  T0 = r['T0']
27
- npoles = 2*round(360/T0)
27
+ try:
28
+ npoles = 2*round(360/T0)
29
+ except ZeroDivisionError:
30
+ npoles=0
31
+ pass
28
32
  logger.info("flux density: %s poles B amp %f ",
29
33
  npoles, r['a'])
30
34
  return dict(Bamp=Bamp, npoles=npoles,
@@ -475,6 +475,19 @@ class Area(object):
475
475
 
476
476
  self.alpha = round(alpha_angle(self.min_angle, self.max_angle), 3)
477
477
 
478
+ def set_close_to_start_end_angles(self, startangle, endangle):
479
+ logger.debug("set_close_to_start_end_angles(%s, %s)",startangle, endangle)
480
+ logger.debug(">> %s: min/max = %s/%s", self.identifier(), self.min_angle, self.max_angle)
481
+ if np.isclose(startangle, endangle): # full
482
+ self.close_to_startangle = True
483
+ self.close_to_endangle = True
484
+ return
485
+
486
+ self.close_to_startangle = np.isclose(self.min_angle, startangle,
487
+ 1e-04, 1e-04)
488
+ self.close_to_endangle = np.isclose(self.max_angle, endangle,
489
+ 1e-04, 1e-04)
490
+
478
491
  def center_is_inside(self, center):
479
492
  if less(self.min_x, center[0], rtol=1e-03, atol=1e-04) and \
480
493
  greater(self.max_x, center[0], rtol=1e-03, atol=1e-04) and \
@@ -552,12 +565,17 @@ class Area(object):
552
565
  return (self.close_to_startangle and self.close_to_endangle)
553
566
 
554
567
  def is_in_touch_with_area(self, geom, a):
568
+ if self.is_one_circle_element():
569
+ return False
570
+ if a.is_one_circle_element():
571
+ return False
572
+
555
573
  n1 = self.area[0].n1
556
574
  n2 = a.area[0].n2
557
575
  try:
558
576
  return nx.has_path(geom.g, n1, n2)
559
- except nx.NetworkXError:
560
- logger.warning("has_path() failed")
577
+ except nx.NetworkXError as e:
578
+ logger.warning("has_path() failed: %s", e)
561
579
  return False
562
580
 
563
581
  def has_connection(self, geom, a, ndec):
@@ -958,6 +976,23 @@ class Area(object):
958
976
  return False
959
977
  return True
960
978
 
979
+ def is_line_inside(self, p1, p2):
980
+ if self.is_point_inside(p1):
981
+ if self.is_point_inside(p2):
982
+ logger.debug("Border: Type of area %s is %s",
983
+ self.identifier(), self.type)
984
+ return True
985
+ if self.the_point_is_inside_area(p2):
986
+ logger.debug("Inside: Type of area %s is %s",
987
+ self.identifier(), self.type)
988
+ return True
989
+ elif self.is_point_inside(p2):
990
+ if self.the_point_is_inside_area(p1):
991
+ logger.debug("Inside: Type of area %s is %s",
992
+ self.identifier(), self.type)
993
+ return True
994
+ return False
995
+
961
996
  def get_best_point_inside(self, geom):
962
997
  px1 = self.min_x - 5
963
998
  px2 = self.max_x + 5
@@ -1172,6 +1207,11 @@ class Area(object):
1172
1207
  continue
1173
1208
  return r
1174
1209
 
1210
+ def is_one_circle_element(self):
1211
+ if len(self.area) == 1:
1212
+ return is_Circle(self.area[0])
1213
+ return False
1214
+
1175
1215
  def is_circle(self):
1176
1216
  e = self.area[0]
1177
1217
  if len(self.area) == 1:
@@ -1419,11 +1459,7 @@ class Area(object):
1419
1459
  opposite_radius = max_radius
1420
1460
 
1421
1461
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1422
-
1423
- self.close_to_startangle = np.isclose(self.min_angle, startangle,
1424
- 1e-04, 1e-04)
1425
- self.close_to_endangle = np.isclose(self.max_angle, endangle,
1426
- 1e-04, 1e-04)
1462
+ self.set_close_to_start_end_angles(startangle, endangle)
1427
1463
  self.surface = self.area_size()
1428
1464
 
1429
1465
  def mark_stator_subregions(self,
@@ -1454,10 +1490,7 @@ class Area(object):
1454
1490
  opposite_radius = r_out
1455
1491
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1456
1492
 
1457
- self.close_to_startangle = np.isclose(self.min_angle, 0.0,
1458
- 1e-04, 1e-04)
1459
- self.close_to_endangle = np.isclose(self.max_angle, alpha,
1460
- 1e-04, 1e-04)
1493
+ self.set_close_to_start_end_angles(0.0, alpha)
1461
1494
  self.surface = self.area_size()
1462
1495
 
1463
1496
  logger.debug("\n***** mark_stator_subregions [{}] *****"
@@ -1563,7 +1596,10 @@ class Area(object):
1563
1596
  logger.debug("***** air #3")
1564
1597
 
1565
1598
  if self.close_to_startangle or self.close_to_endangle:
1566
- f = self.surface / stator_size
1599
+ if stator_size > 0.0:
1600
+ f = self.surface / stator_size
1601
+ else:
1602
+ f = 0.0
1567
1603
  if f < 0.02: # area_size less then 2 percent of stator size
1568
1604
  # Luftloch
1569
1605
  self.type = TYPE_AIR # air
@@ -1607,10 +1643,7 @@ class Area(object):
1607
1643
  opposite_radius = r_out
1608
1644
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1609
1645
 
1610
- self.close_to_startangle = np.isclose(self.min_angle, startangle,
1611
- 1e-04, 1e-04)
1612
- self.close_to_endangle = np.isclose(self.max_angle, endangle,
1613
- 1e-04, 1e-04)
1646
+ self.set_close_to_start_end_angles(startangle, endangle)
1614
1647
 
1615
1648
  logger.debug("\n***** mark_EESM_rotor_subregions [{}] *****"
1616
1649
  .format(self.id))
@@ -1680,10 +1713,7 @@ class Area(object):
1680
1713
  opposite_radius = r_out
1681
1714
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1682
1715
 
1683
- self.close_to_startangle = np.isclose(self.min_angle, startangle,
1684
- 1e-04, 1e-04)
1685
- self.close_to_endangle = np.isclose(self.max_angle, endangle,
1686
- 1e-04, 1e-04)
1716
+ self.set_close_to_start_end_angles(startangle, endangle)
1687
1717
 
1688
1718
  logger.debug("\n***** mark_PMSM_rotor_subregions [{}] *****"
1689
1719
  .format(self.id))
@@ -1788,8 +1818,7 @@ class Area(object):
1788
1818
  logger.debug(">>> air is a circle")
1789
1819
  return self.type
1790
1820
 
1791
- self.close_to_startangle = np.isclose(self.min_angle, 0.0)
1792
- self.close_to_endangle = np.isclose(self.max_angle, alpha)
1821
+ self.set_close_to_start_end_angles(self, 0.0, alpha)
1793
1822
 
1794
1823
  if self.is_magnet_rectangle():
1795
1824
  self.type = TYPE_MAGNET_RECT # magnet embedded
@@ -1831,7 +1860,7 @@ class Area(object):
1831
1860
  return 0.0
1832
1861
  return np.pi * e.radius**2
1833
1862
 
1834
- nodes = [n for n in self.list_of_nodes()]
1863
+ nodes = [n for n in self.virtual_nodes(parts=4)]
1835
1864
  return area_size(nodes)
1836
1865
 
1837
1866
  def set_surface(self, mirrored):
@@ -730,31 +730,12 @@ class AreaBuilder(object):
730
730
  logger.debug("end of create_inner_corner_auxiliary_areas")
731
731
  return created
732
732
 
733
- def get_airgap_line(self, start_node, end_node, area):
733
+ def get_airgap_line(self, n1, n2, end_node):
734
734
  logger.debug("get_airgap_line")
735
735
 
736
736
  self.set_edge_attributes()
737
737
 
738
- nodes = [n for n in area.list_of_nodes()]
739
- if not nodes:
740
- logger.debug("end of get_airgap_line: no nodes found")
741
- return [], []
742
-
743
- n1 = nodes[0]
744
- if points_are_close(start_node, n1):
745
- n2 = nodes[-1]
746
- else:
747
- n2 = n1
748
- for n1 in nodes[1:]:
749
- if points_are_close(start_node, n1):
750
- break
751
- n2 = n1
752
-
753
- if not points_are_close(start_node, n1):
754
- logger.debug("end of get_airgap_line: not close to start-node")
755
- return [], []
756
-
757
- logger.debug("START EDGE FOUND: %s - %s", n1, n2)
738
+ logger.debug("START EDGE IS: %s - %s", n1, n2)
758
739
  nodes = [n1, n2]
759
740
  info = self.get_edge_info(n1, n2)
760
741
  elements = [info.element]
@@ -768,28 +749,37 @@ class AreaBuilder(object):
768
749
  nodes.append(n2)
769
750
  elements.append(info.element)
770
751
 
771
- logger.debug("end of get_airgap_line #%s", len(nodes))
752
+ logger.debug("end of get_airgap_line: %s nodes", len(nodes))
772
753
  return nodes, elements
773
754
 
755
+ def get_upper_border_line(self):
756
+ start_node = self.geom.end_corners[-1]
757
+ end_node = self.geom.start_corners[-1]
758
+ next_node = self.get_right_neighbor(start_node)
759
+ logger.debug("UPPER NODES start=%s, next=%s, end=%s", start_node, next_node, end_node)
760
+ return self.get_airgap_line(start_node, next_node, end_node)
761
+
762
+ def get_lower_border_line(self):
763
+ start_node = self.geom.start_corners[0]
764
+ end_node = self.geom.end_corners[0]
765
+ next_node = self.get_left_neighbor(start_node)
766
+ logger.debug("LOWER NODES start=%s, next=%s, end=%s", start_node, next_node, end_node)
767
+ return self.get_airgap_line(start_node, next_node, end_node)
768
+
774
769
  def get_inner_airgap_line(self):
775
- logger.debug("begin of get_inner_airgap_line")
770
+ logger.debug("get_inner_airgap_line()")
776
771
  assert(self.geom.is_inner)
777
772
  assert(self.geom.area_list)
773
+ return self.get_upper_border_line()
778
774
 
779
- area = [a for a in self.geom.area_list if a.close_to_ag_endcorner]
780
- if len(area) != 1:
781
- logger.debug("end of get_inner_airgap_line: %s areas found", len(area))
782
- return [], []
783
-
784
- start_node = self.geom.end_corners[-1]
785
- logger.debug("START NODE %s", start_node)
786
- end_node = self.geom.start_corners[-1]
787
- logger.debug("END NODE %s", end_node)
788
-
789
- return self.get_airgap_line(start_node, end_node, area[0])
775
+ def get_inner_opposite_airgap_line(self):
776
+ logger.debug("get_inner_opposite_airgap_line()")
777
+ assert(self.geom.is_inner)
778
+ assert(self.geom.area_list)
779
+ return self.get_lower_border_line()
790
780
 
791
781
  def close_outer_winding_areas(self):
792
- logger.debug("close_outer_winding_areas")
782
+ logger.debug("begin close_outer_winding_areas")
793
783
 
794
784
  airgap_line, airgap_el = self.get_outer_airgap_line()
795
785
  logger.debug("Outer Airgap with %s Nodes", len(airgap_line))
@@ -830,24 +820,53 @@ class AreaBuilder(object):
830
820
  dist_prev = dist
831
821
  alpha_prev = alpha
832
822
 
823
+ logger.debug("end close_outer_winding_areas: lines=%s", lines_created)
833
824
  return lines_created > 0
834
825
 
826
+ def get_left_neighbor(self, start_node):
827
+ nbrs = self.geom.get_neighbors(start_node)
828
+ start_alpha = normalise_angle(alpha_line(start_node, self.geom.center))
829
+ next_angle = 0.0
830
+ next_node = None
831
+ for n in nbrs:
832
+ alpha = normalise_angle(alpha_line(start_node, n))
833
+ angle = alpha_angle(start_alpha, alpha)
834
+ if angle > next_angle:
835
+ next_angle = angle
836
+ next_node = n
837
+
838
+ logger.debug("Left neighbor is %s", next_node)
839
+ return next_node
840
+
841
+ def get_right_neighbor(self, start_node):
842
+ nbrs = self.geom.get_neighbors(start_node)
843
+ start_alpha = normalise_angle(alpha_line(start_node, self.geom.center))
844
+ next_angle = 99
845
+ next_node = None
846
+ for n in nbrs:
847
+ alpha = normalise_angle(alpha_line(start_node, n))
848
+ angle = alpha_angle(start_alpha, alpha)
849
+ if angle < next_angle:
850
+ next_angle = angle
851
+ next_node = n
852
+
853
+ logger.debug("Right neighbor is %s", next_node)
854
+ return next_node
855
+
835
856
  def get_outer_airgap_line(self):
836
- logger.debug("begin of get_outer_airgap_line")
857
+ logger.debug("get_outer_airgap_line()")
837
858
  assert(self.geom.is_outer)
838
859
  assert(self.geom.area_list)
860
+ return self.get_lower_border_line()
839
861
 
840
- area = [a for a in self.geom.area_list if a.close_to_ag_startcorner]
841
- if len(area) != 1:
842
- logger.debug("end of get_outer_airgap_line: %s areas found", len(area))
843
- return [], []
844
-
845
- start_node = self.geom.start_corners[0]
846
- logger.debug("START NODE %s", start_node)
847
- end_node = self.geom.end_corners[0]
848
- logger.debug("END NODE %s", end_node)
862
+ def get_outer_opposite_airgap_line(self):
863
+ logger.debug("get_outer_opposite_airgap_line()")
864
+ assert(self.geom.is_outer)
865
+ assert(self.geom.area_list)
866
+ return self.get_upper_border_line()
849
867
 
850
- return self.get_airgap_line(start_node, end_node, area[0])
868
+ # same procedure as inner airgap line
869
+ return self.get_inner_airgap_line()
851
870
 
852
871
  def create_one_area_group(self, areas):
853
872
  logger.debug("begin of create_one_area_group")
@@ -915,9 +934,13 @@ class AreaBuilder(object):
915
934
  max_x = 0
916
935
  area = None
917
936
  for a in area_list:
937
+ if a.is_one_circle_element():
938
+ continue
918
939
  if a.max_x > max_x:
919
940
  max_x = a.max_x
920
941
  area = a
942
+ if area is None:
943
+ return False
921
944
 
922
945
  x0, y0 = -9999.0, 0.0
923
946
  for x, y in area.list_of_nodes():
@@ -168,6 +168,10 @@ def symmetry_search(machine,
168
168
  def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
169
169
  logger.debug("Begin of build_machine_rotor")
170
170
 
171
+ if machine.part == 1:
172
+ logger.error("Full machine rotor without symmetrylines")
173
+ sys.exit(1)
174
+
171
175
  if machine.has_windings():
172
176
  logger.debug("do nothing here with windings in rotor")
173
177
  logger.debug("End of build_machine_rotor")
@@ -202,6 +206,18 @@ def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
202
206
  title="Rotor Magnet Slice after Rebuild")
203
207
 
204
208
  rebuild = False
209
+ if machine_temp.magnets_missing(EESM):
210
+ mag = machine_temp.looking_for_one_possible_magnet()
211
+ if mag:
212
+ if machine.is_mirrored():
213
+ rebuild = machine_temp.create_mirror_lines_outside_magnets()
214
+ if machine_temp.create_auxiliary_lines():
215
+ rebuild = True
216
+ if rebuild:
217
+ machine_temp.rebuild_subregions(EESM, single=single)
218
+ machine_temp.geom.force_area_as_magnet(mag)
219
+ return machine_temp
220
+
205
221
  if machine_temp.has_magnets_in_the_middle():
206
222
  logger.debug("Magnets cut")
207
223
  rebuild = machine_temp.create_mirror_lines_outside_magnets()
@@ -246,6 +262,10 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
246
262
  logger.debug("Begin of build_machine_stator")
247
263
  timer = Timer(start_it=True)
248
264
 
265
+ if machine.part == 1:
266
+ logger.error("Full stator without symmetrylines")
267
+ sys.exit(1)
268
+
249
269
  if not machine.geom.is_stator():
250
270
  logger.debug("Rotor with windings")
251
271
 
@@ -432,10 +452,10 @@ def convert(dxfile,
432
452
  return dict(error='unknown location {}'.format(part[1]))
433
453
  else:
434
454
  if da:
435
- logger.warn("distance airgap (da) ignored")
455
+ logger.warning("distance airgap (da) ignored")
436
456
  da = 0.0
437
457
  if dy:
438
- logger.warn("distance yoke (dy) ignored")
458
+ logger.warning("distance yoke (dy) ignored")
439
459
  dy = 0.0
440
460
 
441
461
  split_ini = split
@@ -508,13 +528,13 @@ def convert(dxfile,
508
528
  p, basegeom,
509
529
  title="Before finding Machine")
510
530
 
511
- machine_base = basegeom.get_machine()
512
531
  if show_plots:
513
532
  p.render_elements(basegeom, Shape,
514
533
  title=input_file.name,
515
534
  with_hull=False,
516
535
  rows=3, cols=2, num=1, show=debug_mode)
517
536
 
537
+ machine_base = basegeom.get_machine()
518
538
  if not machine_base.is_a_machine():
519
539
  logger.warn("it's Not a Machine")
520
540
  return dict(error='machine not detected')
@@ -1064,7 +1084,7 @@ def create_femag_parameters_stator(motor, position):
1064
1084
  params['da1'] = 2*motor.geom.min_radius
1065
1085
  params['slot_area'] = motor.slot_area()
1066
1086
  params['stator'] = _create_stator_parameters(motor)
1067
- params['machine'] = motor
1087
+ #params['machine'] = motor
1068
1088
  return params
1069
1089
 
1070
1090
 
@@ -1080,5 +1100,5 @@ def create_femag_parameters_rotor(motor, position):
1080
1100
  params['da1'] = 2*motor.geom.min_radius
1081
1101
  params['slot_area'] = motor.slot_area()
1082
1102
  params['rotor'] = _create_rotor_parameters(motor)
1083
- params['machine'] = motor
1103
+ #params['machine'] = motor
1084
1104
  return params
@@ -270,7 +270,7 @@ class FslRenderer(object):
270
270
  for area in geom.list_of_areas():
271
271
  if area.number_of_elements() > 1:
272
272
  p = area.get_point_inside(geom)
273
- if p:
273
+ if p and area.type > 0:
274
274
  self.content.append("x0, y0 = {}, {}".format(p[0], p[1]))
275
275
  # self.content.append("point(x0, y0, red, 4)") # for debugging
276
276
  self.content.append("create_mesh_se(x0, y0)")
@@ -324,7 +324,7 @@ class FslRenderer(object):
324
324
  self.content.append(
325
325
  'x0_shaft, y0_shaft = x0, y0')
326
326
 
327
- self.content.append("\n")
327
+ self.content.append("create_mesh(x0, y0)\n")
328
328
 
329
329
  txt = ["if x0_iron_yoke > 0.0 then",
330
330
  " if mcvkey_yoke ~= 'dummy' then",