femagtools 1.8.17__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.17/src/femagtools.egg-info → femagtools-1.8.18}/PKG-INFO +2 -2
  2. {femagtools-1.8.17 → femagtools-1.8.18}/pyproject.toml +1 -1
  3. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/__init__.py +1 -1
  4. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/airgap.py +5 -1
  5. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/area.py +35 -23
  6. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/areabuilder.py +69 -46
  7. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/converter.py +9 -1
  8. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/geom.py +233 -56
  9. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/machine.py +28 -8
  10. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/symmetry.py +20 -5
  11. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/femag.py +27 -16
  12. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/__init__.py +2 -0
  13. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/effloss.py +10 -4
  14. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/pm.py +72 -68
  15. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/sm.py +15 -15
  16. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/bch.py +3 -1
  17. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/char.py +5 -16
  18. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/nc.py +67 -34
  19. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/shortcircuit.py +10 -3
  20. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/utils.py +5 -4
  21. {femagtools-1.8.17 → femagtools-1.8.18/src/femagtools.egg-info}/PKG-INFO +2 -2
  22. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools.egg-info/requires.txt +1 -1
  23. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_machine.py +1 -2
  24. {femagtools-1.8.17 → femagtools-1.8.18}/LICENSE +0 -0
  25. {femagtools-1.8.17 → femagtools-1.8.18}/MANIFEST.in +0 -0
  26. {femagtools-1.8.17 → femagtools-1.8.18}/README.md +0 -0
  27. {femagtools-1.8.17 → femagtools-1.8.18}/setup.cfg +0 -0
  28. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/amazon.py +0 -0
  29. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/amela.py +0 -0
  30. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/asm.py +0 -0
  31. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/bch.py +0 -0
  32. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/bchxml.py +0 -0
  33. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/condor.py +0 -0
  34. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/conductor.py +0 -0
  35. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/config.py +0 -0
  36. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/convert.py +0 -0
  37. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dakota.py +0 -0
  38. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dakota_femag.py +0 -0
  39. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dakotaout.py +0 -0
  40. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/docker.py +0 -0
  41. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/__init__.py +0 -0
  42. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/concat.py +0 -0
  43. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/conv.py +0 -0
  44. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/corner.py +0 -0
  45. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  46. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/dxfparser.py +0 -0
  47. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/femparser.py +0 -0
  48. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/fslrenderer.py +0 -0
  49. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/functions.py +0 -0
  50. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/journal.py +0 -0
  51. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  52. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/shape.py +0 -0
  53. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/dxfsl/svgparser.py +0 -0
  54. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/ecloss.py +0 -0
  55. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/erg.py +0 -0
  56. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/forcedens.py +0 -0
  57. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/fsl.py +0 -0
  58. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/getset.py +0 -0
  59. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/gmsh.py +0 -0
  60. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/google.py +0 -0
  61. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/grid.py +0 -0
  62. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/heat_source_network.py +0 -0
  63. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/hxy.py +0 -0
  64. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/isa7.py +0 -0
  65. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/jhb.py +0 -0
  66. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/job.py +0 -0
  67. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/leakinduc.py +0 -0
  68. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/losscoeffs.py +0 -0
  69. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/afpm.py +0 -0
  70. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/im.py +0 -0
  71. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/sizing.py +0 -0
  72. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/machine/utils.py +0 -0
  73. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/magnet.py +0 -0
  74. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/mcv.py +0 -0
  75. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/me.py +0 -0
  76. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/model.py +0 -0
  77. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/__init__.py +0 -0
  78. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/algorithm.py +0 -0
  79. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/population.py +0 -0
  80. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/problem.py +0 -0
  81. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  82. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/test/PopulationTest.py +0 -0
  83. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moo/test/ProblemTest.py +0 -0
  84. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/moproblem.py +0 -0
  85. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/multiproc.py +0 -0
  86. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/mxw2msh.py +0 -0
  87. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/nc.py +0 -0
  88. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/netlist.py +0 -0
  89. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/ntib.py +0 -0
  90. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/opt.py +0 -0
  91. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/parstudy.py +0 -0
  92. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/__init__.py +0 -0
  93. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/fieldlines.py +0 -0
  94. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/fluxdens.py +0 -0
  95. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/forcedens.py +0 -0
  96. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/machine.py +0 -0
  97. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/mcv.py +0 -0
  98. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/phasor.py +0 -0
  99. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/plot/wdg.py +0 -0
  100. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/poc.py +0 -0
  101. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/semi_fea.py +0 -0
  102. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/svgfsl/converter.py +0 -0
  103. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/FE-losses.mako +0 -0
  104. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/afm_rotor.mako +0 -0
  105. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/afm_stator.mako +0 -0
  106. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/airgapinduc.mako +0 -0
  107. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/asyn_motor.mako +0 -0
  108. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/basic_modpar.mako +0 -0
  109. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/bertotti.mako +0 -0
  110. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/calc_field_ts.mako +0 -0
  111. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/calc_therm_field.mako +0 -0
  112. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/cogg_calc.mako +0 -0
  113. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/colorgrad.mako +0 -0
  114. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/com_motor_sim.mako +0 -0
  115. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/conduct-data.mako +0 -0
  116. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/connect_models.mako +0 -0
  117. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/cu_losses.mako +0 -0
  118. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  119. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  120. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/fe-contr.mako +0 -0
  121. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/fieldcalc.mako +0 -0
  122. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/gen_hairpin_winding.mako +0 -0
  123. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/gen_winding.mako +0 -0
  124. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/inductances.mako +0 -0
  125. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  126. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  127. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  128. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  129. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnet-data.mako +0 -0
  130. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetFC2.mako +0 -0
  131. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetIron.mako +0 -0
  132. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetIron2.mako +0 -0
  133. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetIron3.mako +0 -0
  134. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetIron4.mako +0 -0
  135. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetIron5.mako +0 -0
  136. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetIronV.mako +0 -0
  137. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetSector.mako +0 -0
  138. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  139. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetShell.mako +0 -0
  140. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/magnetShell2.mako +0 -0
  141. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/mesh-airgap.mako +0 -0
  142. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/modal_analysis.mako +0 -0
  143. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  144. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  145. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/new_model.mako +0 -0
  146. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  147. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/noloadflux.mako +0 -0
  148. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  149. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/open.mako +0 -0
  150. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/plots.mako +0 -0
  151. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  152. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  153. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  154. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/prepare_thermal.mako +0 -0
  155. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  156. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/psi-torq-rem-rot.mako +0 -0
  157. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/psi-torq-rem.mako +0 -0
  158. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/psi-torq-rot.mako +0 -0
  159. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/ring.mako +0 -0
  160. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/rot_hsm.mako +0 -0
  161. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/rotorAsyn.mako +0 -0
  162. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/rotorKs2.mako +0 -0
  163. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/rotor_msh.mako +0 -0
  164. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/rotor_winding.mako +0 -0
  165. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/shortcircuit.mako +0 -0
  166. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/srm.mako +0 -0
  167. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/stator1.mako +0 -0
  168. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/stator2.mako +0 -0
  169. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/stator3Linear.mako +0 -0
  170. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/stator4.mako +0 -0
  171. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/statorBG.mako +0 -0
  172. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/statorRing.mako +0 -0
  173. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/statorRotor3.mako +0 -0
  174. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/stator_msh.mako +0 -0
  175. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/therm-dynamic.mako +0 -0
  176. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/therm_static.mako +0 -0
  177. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/templates/torq_calc.mako +0 -0
  178. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/tks.py +0 -0
  179. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/ts.py +0 -0
  180. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/vbf.py +0 -0
  181. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/vtu.py +0 -0
  182. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/windings.py +0 -0
  183. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools/zmq.py +0 -0
  184. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools.egg-info/SOURCES.txt +0 -0
  185. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools.egg-info/dependency_links.txt +0 -0
  186. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools.egg-info/entry_points.txt +0 -0
  187. {femagtools-1.8.17 → femagtools-1.8.18}/src/femagtools.egg-info/top_level.txt +0 -0
  188. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/__init__.py +0 -0
  189. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/engines/__init__.py +0 -0
  190. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/engines/test_amazon.py +0 -0
  191. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/engines/test_config.py +0 -0
  192. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/geom/__init__.py +0 -0
  193. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/geom/test_functions.py +0 -0
  194. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/geom/test_point_inside.py +0 -0
  195. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/moo/__init__.py +0 -0
  196. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/moo/test_algorithm.py +0 -0
  197. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/moo/test_population.py +0 -0
  198. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/moo/test_problem.py +0 -0
  199. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_afpm.py +0 -0
  200. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_airgap_induction.py +0 -0
  201. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_amela.py +0 -0
  202. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_asm.py +0 -0
  203. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_bchreader.py +0 -0
  204. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_conductor.py +0 -0
  205. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_convert.py +0 -0
  206. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_dxfsl.py +0 -0
  207. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_effloss.py +0 -0
  208. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_erg.py +0 -0
  209. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_femag.py +0 -0
  210. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_forcedens.py +0 -0
  211. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_fsl.py +0 -0
  212. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_heat_source_network.py +0 -0
  213. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_hxy.py +0 -0
  214. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_im.py +0 -0
  215. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_isa7.py +0 -0
  216. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_jhb.py +0 -0
  217. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_job.py +0 -0
  218. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_losscoeffs.py +0 -0
  219. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_magncurv.py +0 -0
  220. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_magnet.py +0 -0
  221. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_mcv.py +0 -0
  222. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_mcvreader.py +0 -0
  223. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_me.py +0 -0
  224. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_model.py +0 -0
  225. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_nc.py +0 -0
  226. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_parident.py +0 -0
  227. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_parstudy.py +0 -0
  228. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_pocfile.py +0 -0
  229. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_sizing.py +0 -0
  230. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_sm.py +0 -0
  231. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_tksreader.py +0 -0
  232. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_ts.py +0 -0
  233. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_vbfreader.py +0 -0
  234. {femagtools-1.8.17 → femagtools-1.8.18}/src/tests/test_vtu.py +0 -0
  235. {femagtools-1.8.17 → 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.17
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.17'
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):
@@ -1189,6 +1207,11 @@ class Area(object):
1189
1207
  continue
1190
1208
  return r
1191
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
+
1192
1215
  def is_circle(self):
1193
1216
  e = self.area[0]
1194
1217
  if len(self.area) == 1:
@@ -1436,11 +1459,7 @@ class Area(object):
1436
1459
  opposite_radius = max_radius
1437
1460
 
1438
1461
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1439
-
1440
- self.close_to_startangle = np.isclose(self.min_angle, startangle,
1441
- 1e-04, 1e-04)
1442
- self.close_to_endangle = np.isclose(self.max_angle, endangle,
1443
- 1e-04, 1e-04)
1462
+ self.set_close_to_start_end_angles(startangle, endangle)
1444
1463
  self.surface = self.area_size()
1445
1464
 
1446
1465
  def mark_stator_subregions(self,
@@ -1471,10 +1490,7 @@ class Area(object):
1471
1490
  opposite_radius = r_out
1472
1491
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1473
1492
 
1474
- self.close_to_startangle = np.isclose(self.min_angle, 0.0,
1475
- 1e-04, 1e-04)
1476
- self.close_to_endangle = np.isclose(self.max_angle, alpha,
1477
- 1e-04, 1e-04)
1493
+ self.set_close_to_start_end_angles(0.0, alpha)
1478
1494
  self.surface = self.area_size()
1479
1495
 
1480
1496
  logger.debug("\n***** mark_stator_subregions [{}] *****"
@@ -1580,7 +1596,10 @@ class Area(object):
1580
1596
  logger.debug("***** air #3")
1581
1597
 
1582
1598
  if self.close_to_startangle or self.close_to_endangle:
1583
- f = self.surface / stator_size
1599
+ if stator_size > 0.0:
1600
+ f = self.surface / stator_size
1601
+ else:
1602
+ f = 0.0
1584
1603
  if f < 0.02: # area_size less then 2 percent of stator size
1585
1604
  # Luftloch
1586
1605
  self.type = TYPE_AIR # air
@@ -1624,10 +1643,7 @@ class Area(object):
1624
1643
  opposite_radius = r_out
1625
1644
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1626
1645
 
1627
- self.close_to_startangle = np.isclose(self.min_angle, startangle,
1628
- 1e-04, 1e-04)
1629
- self.close_to_endangle = np.isclose(self.max_angle, endangle,
1630
- 1e-04, 1e-04)
1646
+ self.set_close_to_start_end_angles(startangle, endangle)
1631
1647
 
1632
1648
  logger.debug("\n***** mark_EESM_rotor_subregions [{}] *****"
1633
1649
  .format(self.id))
@@ -1697,10 +1713,7 @@ class Area(object):
1697
1713
  opposite_radius = r_out
1698
1714
  airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1699
1715
 
1700
- self.close_to_startangle = np.isclose(self.min_angle, startangle,
1701
- 1e-04, 1e-04)
1702
- self.close_to_endangle = np.isclose(self.max_angle, endangle,
1703
- 1e-04, 1e-04)
1716
+ self.set_close_to_start_end_angles(startangle, endangle)
1704
1717
 
1705
1718
  logger.debug("\n***** mark_PMSM_rotor_subregions [{}] *****"
1706
1719
  .format(self.id))
@@ -1805,8 +1818,7 @@ class Area(object):
1805
1818
  logger.debug(">>> air is a circle")
1806
1819
  return self.type
1807
1820
 
1808
- self.close_to_startangle = np.isclose(self.min_angle, 0.0)
1809
- self.close_to_endangle = np.isclose(self.max_angle, alpha)
1821
+ self.set_close_to_start_end_angles(self, 0.0, alpha)
1810
1822
 
1811
1823
  if self.is_magnet_rectangle():
1812
1824
  self.type = TYPE_MAGNET_RECT # magnet embedded
@@ -1848,7 +1860,7 @@ class Area(object):
1848
1860
  return 0.0
1849
1861
  return np.pi * e.radius**2
1850
1862
 
1851
- nodes = [n for n in self.list_of_nodes()]
1863
+ nodes = [n for n in self.virtual_nodes(parts=4)]
1852
1864
  return area_size(nodes)
1853
1865
 
1854
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")
@@ -258,6 +262,10 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
258
262
  logger.debug("Begin of build_machine_stator")
259
263
  timer = Timer(start_it=True)
260
264
 
265
+ if machine.part == 1:
266
+ logger.error("Full stator without symmetrylines")
267
+ sys.exit(1)
268
+
261
269
  if not machine.geom.is_stator():
262
270
  logger.debug("Rotor with windings")
263
271
 
@@ -520,13 +528,13 @@ def convert(dxfile,
520
528
  p, basegeom,
521
529
  title="Before finding Machine")
522
530
 
523
- machine_base = basegeom.get_machine()
524
531
  if show_plots:
525
532
  p.render_elements(basegeom, Shape,
526
533
  title=input_file.name,
527
534
  with_hull=False,
528
535
  rows=3, cols=2, num=1, show=debug_mode)
529
536
 
537
+ machine_base = basegeom.get_machine()
530
538
  if not machine_base.is_a_machine():
531
539
  logger.warn("it's Not a Machine")
532
540
  return dict(error='machine not detected')