femagtools 1.5.0__tar.gz → 1.5.2__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 (213) hide show
  1. {femagtools-1.5.0/src/femagtools.egg-info → femagtools-1.5.2}/PKG-INFO +1 -1
  2. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/__init__.py +1 -1
  3. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/amela.py +5 -1
  4. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/femag.py +23 -5
  5. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/fsl.py +1 -1
  6. femagtools-1.5.2/src/femagtools/hxy.py +181 -0
  7. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/isa7.py +3 -1
  8. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/afpm.py +131 -17
  9. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/sizing.py +3 -1
  10. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/utils.py +12 -8
  11. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/multiproc.py +1 -1
  12. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/nc.py +15 -10
  13. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/afm_stator.mako +11 -2
  14. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/fieldcalc.mako +1 -3
  15. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/vtu.py +72 -3
  16. {femagtools-1.5.0 → femagtools-1.5.2/src/femagtools.egg-info}/PKG-INFO +1 -1
  17. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/SOURCES.txt +1 -0
  18. femagtools-1.5.2/src/tests/test_hxy.py +19 -0
  19. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_sizing.py +1 -1
  20. femagtools-1.5.2/src/tests/test_vtu.py +42 -0
  21. femagtools-1.5.0/src/femagtools/hxy.py +0 -126
  22. femagtools-1.5.0/src/tests/test_vtu.py +0 -25
  23. {femagtools-1.5.0 → femagtools-1.5.2}/LICENSE +0 -0
  24. {femagtools-1.5.0 → femagtools-1.5.2}/MANIFEST.in +0 -0
  25. {femagtools-1.5.0 → femagtools-1.5.2}/README.md +0 -0
  26. {femagtools-1.5.0 → femagtools-1.5.2}/pyproject.toml +0 -0
  27. {femagtools-1.5.0 → femagtools-1.5.2}/setup.cfg +0 -0
  28. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/airgap.py +0 -0
  29. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/amazon.py +0 -0
  30. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/asm.py +0 -0
  31. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/bch.py +0 -0
  32. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/bchxml.py +0 -0
  33. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/condor.py +0 -0
  34. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/conductor.py +0 -0
  35. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/config.py +0 -0
  36. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/convert.py +0 -0
  37. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dakota.py +0 -0
  38. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dakota_femag.py +0 -0
  39. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dakotaout.py +0 -0
  40. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/docker.py +0 -0
  41. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/__init__.py +0 -0
  42. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/area.py +0 -0
  43. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/conv.py +0 -0
  44. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/converter.py +0 -0
  45. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/corner.py +0 -0
  46. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  47. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/fslrenderer.py +0 -0
  48. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/functions.py +0 -0
  49. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/geom.py +0 -0
  50. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/machine.py +0 -0
  51. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  52. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/shape.py +0 -0
  53. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/ecloss.py +0 -0
  54. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/erg.py +0 -0
  55. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/forcedens.py +0 -0
  56. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/getset.py +0 -0
  57. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/gmsh.py +0 -0
  58. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/google.py +0 -0
  59. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/grid.py +0 -0
  60. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/jhb.py +0 -0
  61. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/job.py +0 -0
  62. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/losscoeffs.py +0 -0
  63. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/__init__.py +0 -0
  64. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/effloss.py +0 -0
  65. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/im.py +0 -0
  66. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/pm.py +0 -0
  67. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/sm.py +0 -0
  68. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/magnet.py +0 -0
  69. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/mcv.py +0 -0
  70. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/me.py +0 -0
  71. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/model.py +0 -0
  72. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/__init__.py +0 -0
  73. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/algorithm.py +0 -0
  74. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/population.py +0 -0
  75. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/problem.py +0 -0
  76. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  77. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/test/PopulationTest.py +0 -0
  78. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/test/ProblemTest.py +0 -0
  79. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moproblem.py +0 -0
  80. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/mxw2msh.py +0 -0
  81. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/nc.py +0 -0
  82. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/netlist.py +0 -0
  83. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/ntib.py +0 -0
  84. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/opt.py +0 -0
  85. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/parstudy.py +0 -0
  86. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/__init__.py +0 -0
  87. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/bch.py +0 -0
  88. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/char.py +0 -0
  89. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/fluxdens.py +0 -0
  90. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/forcedens.py +0 -0
  91. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/mcv.py +0 -0
  92. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/phasor.py +0 -0
  93. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/wdg.py +0 -0
  94. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/poc.py +0 -0
  95. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/FE-losses.mako +0 -0
  96. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/afm_rotor.mako +0 -0
  97. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/airgapinduc.mako +0 -0
  98. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/asyn_motor.mako +0 -0
  99. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/basic_modpar.mako +0 -0
  100. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/calc_field_ts.mako +0 -0
  101. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/calc_therm_field.mako +0 -0
  102. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/cogg_calc.mako +0 -0
  103. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/colorgrad.mako +0 -0
  104. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/com_motor_sim.mako +0 -0
  105. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/conduct-data.mako +0 -0
  106. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/connect_models.mako +0 -0
  107. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/cu_losses.mako +0 -0
  108. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  109. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/fe-contr.mako +0 -0
  110. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/gen_winding.mako +0 -0
  111. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/inductances.mako +0 -0
  112. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  113. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  114. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  115. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  116. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnet-data.mako +0 -0
  117. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetFC2.mako +0 -0
  118. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron.mako +0 -0
  119. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron2.mako +0 -0
  120. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron3.mako +0 -0
  121. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron4.mako +0 -0
  122. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron5.mako +0 -0
  123. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIronV.mako +0 -0
  124. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetSector.mako +0 -0
  125. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  126. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetShell.mako +0 -0
  127. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetShell2.mako +0 -0
  128. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/mesh-airgap.mako +0 -0
  129. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/modal_analysis.mako +0 -0
  130. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  131. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/new_model.mako +0 -0
  132. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  133. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/noloadflux.mako +0 -0
  134. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  135. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/open.mako +0 -0
  136. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/plots.mako +0 -0
  137. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  138. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  139. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  140. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  141. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/ring.mako +0 -0
  142. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rot_hsm.mako +0 -0
  143. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotorAsyn.mako +0 -0
  144. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotorKs2.mako +0 -0
  145. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotor_msh.mako +0 -0
  146. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotor_winding.mako +0 -0
  147. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/shortcircuit.mako +0 -0
  148. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/srm.mako +0 -0
  149. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator1.mako +0 -0
  150. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator2.mako +0 -0
  151. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator3Linear.mako +0 -0
  152. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator4.mako +0 -0
  153. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/statorBG.mako +0 -0
  154. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/statorRing.mako +0 -0
  155. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/statorRotor3.mako +0 -0
  156. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator_msh.mako +0 -0
  157. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/therm-dynamic.mako +0 -0
  158. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/therm-static.mako +0 -0
  159. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/torq_calc.mako +0 -0
  160. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/tks.py +0 -0
  161. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/ts.py +0 -0
  162. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/utils.py +0 -0
  163. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/vbf.py +0 -0
  164. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/windings.py +0 -0
  165. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/dependency_links.txt +0 -0
  166. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/entry_points.txt +0 -0
  167. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/requires.txt +0 -0
  168. {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/top_level.txt +0 -0
  169. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/__init__.py +0 -0
  170. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/engines/__init__.py +0 -0
  171. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/engines/test_amazon.py +0 -0
  172. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/engines/test_config.py +0 -0
  173. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/geom/__init__.py +0 -0
  174. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/geom/test_functions.py +0 -0
  175. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/geom/test_point_inside.py +0 -0
  176. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/__init__.py +0 -0
  177. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/test_algorithm.py +0 -0
  178. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/test_population.py +0 -0
  179. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/test_problem.py +0 -0
  180. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_afpm.py +0 -0
  181. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_airgap_induction.py +0 -0
  182. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_amela.py +0 -0
  183. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_asm.py +0 -0
  184. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_bchreader.py +0 -0
  185. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_conductor.py +0 -0
  186. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_convert.py +0 -0
  187. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_effloss.py +0 -0
  188. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_erg.py +0 -0
  189. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_femag.py +0 -0
  190. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_forcedens.py +0 -0
  191. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_fsl.py +0 -0
  192. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_im.py +0 -0
  193. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_isa7.py +0 -0
  194. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_jhb.py +0 -0
  195. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_job.py +0 -0
  196. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_losscoeffs.py +0 -0
  197. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_machine.py +0 -0
  198. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_magncurv.py +0 -0
  199. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_magnet.py +0 -0
  200. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_mcv.py +0 -0
  201. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_mcvreader.py +0 -0
  202. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_mcvwriter.py +0 -0
  203. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_me.py +0 -0
  204. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_model.py +0 -0
  205. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_nc.py +0 -0
  206. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_parident.py +0 -0
  207. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_parstudy.py +0 -0
  208. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_pocfile.py +0 -0
  209. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_sm.py +0 -0
  210. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_tksreader.py +0 -0
  211. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_ts.py +0 -0
  212. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_vbfreader.py +0 -0
  213. {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.5.0
3
+ Version: 1.5.2
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  """
4
4
  __title__ = 'femagtools'
5
- __version__ = '1.5.0'
5
+ __version__ = '1.5.2'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2016-2022 SEMAFOR Informatik & Energie AG'
@@ -200,7 +200,11 @@ class Amela():
200
200
  for k, i in enumerate(mag_spels):
201
201
 
202
202
  cond = i.conduc
203
- mur = 1/i.elements[0].reluc[0]
203
+ if cond == 0:
204
+ cond = 625000
205
+ logger.info('Magnet conductivity equals 0, using 625000 S/m')
206
+
207
+ mur = np.abs(1/i.elements[0].reluc[0])
204
208
  logger.debug('Magnet: mur=%s, conductivity=%s', mur, cond)
205
209
 
206
210
  pm_elem_key.append([j.key for j in i.elements])
@@ -41,7 +41,7 @@ def handle_process_output(filedes, outfile, log):
41
41
  """read from file descriptor and direct lines to logger and outfile"""
42
42
  with open(outfile, 'w') as fp:
43
43
  for line in filedes:
44
- fp.write(str(line))
44
+ fp.write(line.decode())
45
45
  if log:
46
46
  if (b'' == line or
47
47
  b'\x1b' in line or # ignore terminal escape seq
@@ -482,7 +482,7 @@ class Femag(BaseFemag):
482
482
  basename = pathlib.Path(filename).name
483
483
  outname = os.path.join(self.workdir, basename+'.out')
484
484
  errname = os.path.join(self.workdir, basename+'.err')
485
- with open(outname, 'w') as out, open(errname, 'w') as err:
485
+ with open(errname, 'w') as err:
486
486
  logger.info('invoking %s', ' '.join([str(a) for a in args]))
487
487
  proc = subprocess.Popen(
488
488
  args,
@@ -495,9 +495,15 @@ class Femag(BaseFemag):
495
495
  errs = []
496
496
  # print femag output
497
497
  with io.open(outname, encoding='latin1', errors='ignore') as outfile:
498
+ errLine = False
498
499
  for l in outfile:
499
500
  if l.find('ERROR') > -1:
500
501
  errs.append(l.strip())
502
+ errLine = True
503
+ elif errLine and l.startswith(' '): # additional error line
504
+ errs.append(l)
505
+ else:
506
+ errLine = False
501
507
 
502
508
  rc = proc.returncode
503
509
  logger.info("%s exited with returncode %d (num errs=%d)",
@@ -508,7 +514,7 @@ class Femag(BaseFemag):
508
514
  for l in errfile:
509
515
  errs.append(l.strip())
510
516
  errs.insert(0, 'Exit code {}'.format(rc))
511
- raise FemagError(errs)
517
+ raise FemagError("\n".join(errs))
512
518
 
513
519
  def cleanup(self):
514
520
  "removes all created files in workdir"
@@ -805,8 +811,8 @@ class ZmqFemag(BaseFemag):
805
811
  logger.error("send_fsl: %s", str(e))
806
812
  if timeout: # only first call raises zmq.error.Again
807
813
  return ['{"status":"error", "message":"Femag is not running"}', '{}']
808
- msg = str(e)
809
- return ['{"status":"error", "message":"'+msg+'"}', '{}']
814
+ msg = json.dumps(str(e))
815
+ return ['{"status":"error", "message":'+msg+'}', '{}']
810
816
 
811
817
  def run(self, options=['-b'], restart=False, procId=None,
812
818
  stateofproblem='mag_static'): # noqa: C901
@@ -1003,6 +1009,18 @@ class ZmqFemag(BaseFemag):
1003
1009
  logger.warning(response[0])
1004
1010
  return [s.decode('latin1') for s in response]
1005
1011
 
1012
+ def exportmesh(self, fslcmds, timeout=120000):
1013
+ """get svg format (with mesh) from fsl commands (if any graphic created)
1014
+ (since FEMAG v2024.1-17) """
1015
+ response = self.send_request(['SVG+Mesh', fslcmds], timeout=timeout)
1016
+ try:
1017
+ rc = json.loads(response[0].decode('latin1'))
1018
+ if rc['status'] == 'ok':
1019
+ return self.getfile(rc['result_file'][0])
1020
+ except json.decoder.JSONDecodeError:
1021
+ logger.warning(response[0])
1022
+ return [s.decode('latin1') for s in response]
1023
+
1006
1024
  def interrupt(self):
1007
1025
  """send push message to control port to stop current calculation"""
1008
1026
  context = zmq.Context.instance()
@@ -634,7 +634,7 @@ class Builder:
634
634
  def create_analysis(self, sim):
635
635
  pfefunc = sim.get('loss_funct', '')
636
636
  if pfefunc:
637
- sim['loss_funct'] = 2 # 3?
637
+ sim['loss_funct'] = 1 # 3?
638
638
  airgap_induc = (self.create_airgap_induc()
639
639
  if sim.get('airgap_induc', 0) else [])
640
640
  felosses = pfefunc.split('\n') + self.create_fe_losses(sim)
@@ -0,0 +1,181 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ femagtools.hxy
4
+ ~~~~~~~~~~~~~~
5
+
6
+ Reading HXY files (EXPERIMENTAL)
7
+ Build cluster of magnets
8
+ """
9
+
10
+ import numpy as np
11
+ import logging
12
+
13
+ # K-means clustering
14
+ # https://dev.to/sajal2692/coding-k-means-clustering-using-python-and-numpy-fg1
15
+ # Sajal Sharma
16
+ # with adaptions by Ronald Tanner
17
+ def initialize_random_centroids(K, X):
18
+ """Initializes and returns k random centroids"""
19
+ m, n = np.shape(X)
20
+ # a centroid should be of shape (1, n), so the centroids array will be of shape (K, n)
21
+ centroids = np.empty((K, n))
22
+ for i in range(K):
23
+ # pick a random data point from X as the centroid
24
+ centroids[i] = X[np.random.choice(range(m))]
25
+ return centroids
26
+
27
+
28
+ def initialize_centroids(K, X):
29
+ """Initializes and returns k centroids"""
30
+ c = np.mean(X, axis=0)
31
+ if K < 2:
32
+ return [c]
33
+ alfa = np.arctan2(c[1], c[0]) # angle of center axis
34
+ T = np.array([[np.cos(alfa), -np.sin(alfa)],
35
+ [np.sin(alfa), np.cos(alfa)]])
36
+ p = (np.asarray(X)-c).dot(T) # rotate X
37
+ d = np.linalg.norm(p, axis=1) # distance to center
38
+ a = np.arctan2(p[:, 1], p[:, 0]) # angle to center
39
+ h, b = np.histogram(a, bins=K)
40
+ return [np.mean(X[(a>r[0]) & (a<r[1])], axis=0)
41
+ for r in np.array((b[:-1], b[1:])).T]
42
+
43
+
44
+ def closest_centroid(x, centroids, K):
45
+ """Finds and returns the index of the closest centroid for a given vector x"""
46
+ distances = np.empty(K)
47
+ for i in range(K):
48
+ distances[i] = np.linalg.norm(centroids[i] - x)
49
+ return np.argmin(distances) # return the index of the lowest distance
50
+
51
+
52
+ def create_clusters(centroids, K, X):
53
+ """Returns an array of cluster indices for all the data samples"""
54
+ m, _ = np.shape(X)
55
+ cluster_idx = np.empty(m, dtype=int)
56
+ for i in range(m):
57
+ cluster_idx[i] = closest_centroid(X[i], centroids, K)
58
+ return cluster_idx
59
+
60
+
61
+ def compute_means(cluster_idx, K, X):
62
+ """Computes and returns the new centroids of the clusters"""
63
+ _, n = np.shape(X)
64
+ centroids = np.empty((K, n))
65
+ for i in range(K):
66
+ points = X[cluster_idx == i] # gather points for the cluster i
67
+ centroids[i] = np.mean(points, axis=0) # use axis=0 to compute means across points
68
+ return centroids
69
+
70
+
71
+ def run_Kmeans(K, X, max_iterations=500):
72
+ """Runs the K-means algorithm and computes the final clusters"""
73
+ # initialize centroids
74
+ centroids = initialize_centroids(K, X)
75
+ # loop till max_iterations or convergance
76
+ logging.debug(f"initial centroids: {centroids}")
77
+ for _ in range(max_iterations):
78
+ # create clusters by assigning the samples to the closet centroids
79
+ clusters = create_clusters(centroids, K, X)
80
+ previous_centroids = centroids
81
+ # compute means of the clusters and assign to centroids
82
+ centroids = compute_means(clusters, K, X)
83
+ # if the new_centroids are the same as the old centroids, return clusters
84
+ diff = previous_centroids - centroids
85
+ if not diff.any():
86
+ return clusters
87
+ return clusters
88
+
89
+ """references properties i to magnet k"""
90
+ class point():
91
+ def __init__(self, index, k, coord):
92
+ self.index = index
93
+ self.coord = coord
94
+ self.k = k
95
+
96
+ def readSections(f):
97
+ section = []
98
+ movepos = False
99
+ for line in f:
100
+ if line.startswith(' MOVE POSITION'):
101
+ movepos = True
102
+ if section:
103
+ # skip empty lines
104
+ i = 0
105
+ try:
106
+ while not section[i]:
107
+ i = i+1
108
+ except IndexError:
109
+ i = i-1
110
+ yield section[i:]
111
+ section = []
112
+ if movepos:
113
+ section.append(line.strip())
114
+ yield section
115
+
116
+
117
+ def read(filename, num_magnets):
118
+ """read hxy file and return values grouped to magnets
119
+ returns:
120
+ list of m=num_magnets dicts
121
+ pos: list of n positions in degree
122
+ e: n lists of center coordinates of elements in m
123
+ hxy: n lists of field strengths in kA/m
124
+ bxy: n lists of flux densities in T
125
+ mxy: n lists of magnetization in T
126
+ havg: average of field strengths kA/m
127
+ hmax: maximum of field strengths kA/m
128
+ """
129
+ hxy = []
130
+ with open(filename, encoding='latin1', errors='ignore') as f:
131
+ n = 0
132
+ k = 0
133
+ for s in readSections(f):
134
+ pos = float(s[0].split()[-1])
135
+ num = np.array([[float(x) for x in l.split()] for l in s[5:] if l])
136
+ hxy.append({'pos': pos, 'e': num[:, :2], 'hxy': num[:, 2:4],
137
+ 'bxy': num[:, 4:6], 'mxy':num[:, 6:]})
138
+ logging.info("HXY Section %d: pos %f shape %s", n, pos, num.shape)
139
+ n += 1
140
+ if k == 0:
141
+ k = num.shape[1]
142
+ K = num_magnets
143
+ y_preds = run_Kmeans(num_magnets, np.array(hxy[0]['e']))
144
+ logging.info("Kmeans: %s",
145
+ [y_preds[y_preds==k].shape[0] for k in range(K)])
146
+ points = [point(i, k, hxy[0]['e'][i]) for i, k in enumerate(y_preds)]
147
+ # move values to magnets:
148
+ magnets = [{'e': [[h['e'][p.index]*1e-3
149
+ for p in points if p.k == k]
150
+ for h in hxy]}
151
+ for k in range(K)]
152
+
153
+ for k, mag in enumerate(magnets):
154
+ mag['pos'] = [h['pos'] for h in hxy]
155
+ for mk in ['hxy', 'bxy', 'mxy']:
156
+ mag[mk] = [[h[mk][p.index] for p in points if p.k == k]
157
+ for h in hxy]
158
+ hxyabs = [np.linalg.norm(hxy, axis=1)
159
+ for hxy in mag['hxy']]
160
+ mag['havg'] = [np.mean(a) for a in hxyabs]
161
+ mag['hmax'] = [np.max(a) for a in hxyabs]
162
+
163
+ return magnets
164
+
165
+ if __name__ == '__main__':
166
+ import sys
167
+ import matplotlib.pyplot as plt
168
+ logging.basicConfig(level=logging.INFO,
169
+ format='%(asctime)s %(message)s')
170
+ magnets = read(sys.argv[1], int(sys.argv[2]))
171
+ for m in magnets:
172
+ print(f"{len(m['e'][0])}: Havg {m['havg']} Hmax {m['hmax']}")
173
+
174
+ fig, ax = plt.subplots()
175
+ for m in magnets:
176
+ b = np.array(m['e'][0])
177
+ ax.scatter(*b.T)
178
+ ax.set_aspect('equal')
179
+ ax.autoscale(enable=True)
180
+ ax.axis('off')
181
+ plt.show()
@@ -1357,13 +1357,15 @@ class Element(BaseEntity):
1357
1357
 
1358
1358
  def demagnetization(self, temperature=20):
1359
1359
  """return demagnetization Hx, Hy of this element"""
1360
- return self.demag_b(self.flux_density(cosys='cartes'), temperature)
1360
+ return self.demag_b(self.flux_density(cosys='polar'), temperature)
1361
1361
 
1362
1362
  def demag_b(self, b, temperature):
1363
1363
  """return demagnetization Hx, Hy of this element at flux density b
1364
1364
  and temperature"""
1365
1365
  if self.is_magnet():
1366
+ # assume polar coordinates of b
1366
1367
  pos = np.arctan2(self.center[1], self.center[0])
1368
+ #pos = 0 # cartesian
1367
1369
  br_temp_corr = 1. + self.br_temp_coef*(temperature - 20.)
1368
1370
  magn = np.sqrt(self.mag[0]**2 + self.mag[1]**2)*br_temp_corr
1369
1371
  alfa = np.arctan2(self.mag[1], self.mag[0]) - pos
@@ -4,13 +4,16 @@
4
4
  import logging
5
5
  import numpy as np
6
6
  from pathlib import Path
7
+ import shutil
7
8
  from .. import poc
8
9
  from .. import parstudy
9
10
  from .. import model
10
11
  from .. import utils
11
12
  from .. import windings
12
- from scipy.interpolate import RegularGridInterpolator, interp1d
13
+ from .. import femag
14
+ from scipy.interpolate import RegularGridInterpolator, interp1d, RectBivariateSpline
13
15
  from scipy.integrate import quad
16
+ import copy
14
17
 
15
18
  logger = logging.getLogger(__name__)
16
19
 
@@ -36,6 +39,50 @@ def _integrate1d(radius, val):
36
39
  return interp((x))
37
40
  return quad(func, radius[0], radius[-1])[0]
38
41
 
42
+ def ld_interpol(i1, beta, v):
43
+ '''interpolate Ld at beta angle 0°, -180°'''
44
+ # ld
45
+ cur = copy.deepcopy(i1)
46
+ betad = copy.deepcopy(beta)
47
+ if np.amin(beta) < -90 and \
48
+ np.amax(beta) > -90:
49
+ # motor and generator
50
+ v[0] = v[1]
51
+ v[-1] = v[-2]
52
+
53
+ dbeta = np.abs(beta[0][0] - beta[1][0])
54
+ bp = [[beta[0][0]-dbeta for i in range(len(np.unique(i1)))]] + beta[1:-1] + \
55
+ [[dbeta for i in range(len(np.unique(i1)))]]
56
+ else:
57
+ v[-1] = v[-2]
58
+ dbeta = np.abs(beta[0][0] - beta[1][0])
59
+ bp = beta[0:-1] + \
60
+ [[dbeta for i in range(len(np.unique(i1)))]]
61
+
62
+ return RectBivariateSpline(np.unique(bp), np.unique(cur), \
63
+ np.array(v)).ev(*[betad, i1]).tolist()
64
+
65
+ def lq_interpol(i1, beta, v):
66
+ '''interpolate Lq at beta -90°'''
67
+ if -90 not in np.unique(beta):
68
+ return v
69
+ # lq
70
+ betad = copy.deepcopy(beta)
71
+ if np.amin(beta) < -90 and \
72
+ np.amax(beta) > -90:
73
+ # motor and generator
74
+ inx = np.argwhere(np.array(beta) == -90).squeeze()
75
+ v.pop(inx[0, 0])
76
+ bp = beta[0:inx[0, 0]] + beta[inx[0, 0]+1:]
77
+ cp = i1[0:inx[0, 0]] + i1[inx[0, 0]+1:]
78
+ else:
79
+ v[0] = v[1]
80
+ dbeta = np.abs(beta[0][0] - beta[1][0])
81
+ bp = [[-90-dbeta for i in i1[0]]] + beta[1::]
82
+ cp = i1
83
+ cur = copy.deepcopy(cp)
84
+ return RectBivariateSpline(np.unique(bp), np.unique(cur), \
85
+ np.array(v)).ev(*[betad, i1]).tolist()
39
86
 
40
87
  def parident(workdir, engine, temp, machine,
41
88
  magnetizingCurves, magnetMat=[], condMat=[],
@@ -124,10 +171,6 @@ def parident(workdir, engine, temp, machine,
124
171
  ]
125
172
  }
126
173
 
127
- pstudy = parstudy.List(
128
- workdir, condMat=condMat, magnets=magnetMat,
129
- magnetizingCurves=magnetizingCurves,
130
- cmd=kwargs.get('cmd', None))
131
174
 
132
175
  ldq = []
133
176
  for magtemp in temp:
@@ -138,12 +181,37 @@ def parident(workdir, engine, temp, machine,
138
181
  poc=poc.Poc(999),
139
182
  speed=0)
140
183
  logging.info("Noload simulation")
141
- nlresults = pstudy(nlparvardef, machine, nlcalc, engine)
142
- if nlresults['status'].count('C') != len(nlresults['status']):
143
- raise ValueError('Noload simulation failed %s', nlresults['status'])
184
+ if kwargs.get('use_multiprocessing', True):
185
+ pstudy = parstudy.List(
186
+ workdir, condMat=condMat, magnets=magnetMat,
187
+ magnetizingCurves=magnetizingCurves,
188
+ cmd=kwargs.get('cmd', None))
189
+
190
+ nlresults = pstudy(nlparvardef, machine, nlcalc, engine)
191
+ if nlresults['status'].count('C') != len(nlresults['status']):
192
+ raise ValueError('Noload simulation failed %s', nlresults['status'])
193
+ else:
194
+ nlresults = {"x": [], "f": []}
195
+ i = 0
196
+ for pw, le, sp in zip(pole_width, lfe, linspeed):
197
+ nlmachine = {k: machine[k] for k in machine}
198
+ nlmachine['pole_width'] = pw
199
+ nlmachine['lfe'] = le
200
+ nlcalc.update({"speed": sp})
201
+ nlsubdir = f'{workdir}/{i}'
202
+ nlworkdir = Path(nlsubdir)
203
+ if nlworkdir.exists():
204
+ shutil.rmtree(nlworkdir)
205
+ nlworkdir.mkdir(exist_ok=True)
206
+ noloadsim = femag.Femag(nlworkdir, condMat=condMat, magnets=magnetMat,
207
+ magnetizingCurves=magnetizingCurves,
208
+ cmd=kwargs.get('cmd', None))
209
+ r = noloadsim(nlmachine, nlcalc)
210
+ nlresults['f'].append({k: v for k, v in r.items()})
211
+ i = i + 1
144
212
  nlresults.update(process(lfe, pole_width, machine, nlresults['f']))
145
- current_angles = nlresults['f'][0]['current_angles']
146
213
 
214
+ current_angles = nlresults['f'][0]['current_angles']
147
215
  results = []
148
216
  i = 0
149
217
  for l, pw in zip(lfe, pole_width):
@@ -152,17 +220,11 @@ def parident(workdir, engine, temp, machine,
152
220
  mpart['lfe'] = l
153
221
  subdir = f"{workdir}/{i}"
154
222
 
155
- gpstudy = parstudy.Grid(
156
- subdir, condMat=condMat, magnets=magnetMat,
157
- magnetizingCurves=magnetizingCurves,
158
- cmd=kwargs.get('cmd', None))
159
-
160
223
  simulation = dict(
161
224
  calculationMode="torq_calc",
162
225
  wind_temp=20.0,
163
226
  magn_temp=magtemp,
164
227
  angl_i_up=0.0,
165
- magnet_loss=True,
166
228
  magn_height=machine['magnet']['afm_rotor']['magn_height'],
167
229
  yoke_height=machine['magnet']['afm_rotor'].get(
168
230
  'yoke_height', 0),
@@ -173,8 +235,36 @@ def parident(workdir, engine, temp, machine,
173
235
  num_move_steps=60,
174
236
  speed=linspeed[i],
175
237
  num_par_wdgs=machine[wdgk].get('num_par_wdgs', 1))
176
-
177
- lresults = gpstudy(parvardef, mpart, simulation, engine)
238
+
239
+ if kwargs.get('use_multiprocessing', True):
240
+ gpstudy = parstudy.Grid(
241
+ subdir, condMat=condMat, magnets=magnetMat,
242
+ magnetizingCurves=magnetizingCurves,
243
+ cmd=kwargs.get('cmd', None))
244
+ lresults = gpstudy(parvardef, mpart, simulation, engine)
245
+
246
+ else:
247
+ lresults = {"x": [], "f": []}
248
+ domain_beta = np.linspace(beta_min, 0, num_beta_steps).tolist()
249
+ domain_cur = np.linspace(i1_max/num_cur_steps, i1_max, num_cur_steps).tolist()
250
+ dir_index = 0
251
+ for cur in domain_cur:
252
+ for be in domain_beta:
253
+ simulation['angl_i_up'] = be
254
+ simulation['current'] = cur
255
+ lresults['x'].append([be, cur])
256
+ subsubdir = subdir + f'/{dir_index}'
257
+ dir_index = dir_index + 1
258
+ lworkdir = Path(subsubdir)
259
+ if lworkdir.exists():
260
+ shutil.rmtree(lworkdir)
261
+ lworkdir.mkdir(exist_ok=True)
262
+ loadsim = femag.Femag(lworkdir, condMat=condMat, magnets=magnetMat,
263
+ magnetizingCurves=magnetizingCurves,
264
+ cmd=kwargs.get('cmd', None))
265
+ r = loadsim(mpart, simulation)
266
+ lresults['f'].append({k: v for k, v in r.items()})
267
+
178
268
  f = [{k: bch[k]
179
269
  for k in ('linearForce', 'flux', 'losses', 'lossPar')}
180
270
  for bch in lresults['f']]
@@ -198,6 +288,29 @@ def parident(workdir, engine, temp, machine,
198
288
  (-1, num_beta_steps)).T/np.sqrt(2)
199
289
  psiq = np.reshape([r['psiq'] for r in postp],
200
290
  (-1, num_beta_steps)).T/np.sqrt(2)
291
+
292
+ ld = np.reshape([r['Ld'] for r in postp],
293
+ (-1, num_beta_steps)).T.tolist()
294
+ lq = np.reshape([r['Lq'] for r in postp],
295
+ (-1, num_beta_steps)).T.tolist()
296
+ # interpolation ld, lq
297
+ curr, angl = [], []
298
+ for cr in range(len(beta)):
299
+ curr.append(i1)
300
+ for al in beta:
301
+ tmp = []
302
+ for cr in range(len(i1)):
303
+ tmp.append(al)
304
+ angl.append(tmp)
305
+ try:
306
+ xx, yy = copy.deepcopy(curr), copy.deepcopy(angl)
307
+ ld = ld_interpol(xx, yy, ld)
308
+ xx, yy = copy.deepcopy(curr), copy.deepcopy(angl)
309
+ lq = lq_interpol(xx, yy, lq)
310
+ except:
311
+ ld = np.zeros_like(psid).tolist()
312
+ lq = np.zeros_like(psid).tolist()
313
+
201
314
  torque = np.reshape([r['torque'] for r in postp],
202
315
  (-1, num_beta_steps)).T
203
316
  losses = {k: np.flip(np.reshape([r['plfe'][k] for r in postp],
@@ -214,6 +327,7 @@ def parident(workdir, engine, temp, machine,
214
327
  ldq.append({'temperature': magtemp,
215
328
  'i1':i1, 'beta':beta,
216
329
  'psid': psid.tolist(), 'psiq': psiq.tolist(),
330
+ 'ld': ld, 'lq': lq,
217
331
  'torque': torque.tolist(),
218
332
  'losses': losses})
219
333
  # T = 3/2 p (Psid iq - Psiq id)
@@ -736,8 +736,10 @@ def im(pnom: float, speed: float, p: int, **kwargs) -> dict:
736
736
  slots = []
737
737
  r = get_stator_dimensions(par, slots=slots)
738
738
  # rotor parameters
739
+ rtype = kwargs.get('rtype', 'rotorKs2')
739
740
  r['rotor'] = get_im_rotor_dimensions(
740
- par['cos_phi']*r['A'], r['Da2'], r['psi1'], r['lfe'], par)
741
+ par['cos_phi']*r['A'], r['Da2'], r['psi1'], r['lfe'],
742
+ par, rtype=rtype)
741
743
  _set_genpars(r, 2*par['p'])
742
744
  r['name'] = f"IM-{r['poles']}"
743
745
  return r
@@ -350,21 +350,27 @@ def dqparident(workdir, engine, temp, machine,
350
350
  """
351
351
  import pathlib
352
352
 
353
- da1 = machine['outer_diam']
353
+ wdgk = 'windings' if 'windings' in machine else 'winding'
354
+ da1 = machine['bore_diam']
354
355
  Q1 = machine['stator']['num_slots']
356
+ lfe = machine['lfe']
357
+ g = machine[wdgk].get('num_par_wdgs', 1)
355
358
  slotmodel = [k for k in machine['stator'] if isinstance(
356
359
  machine['stator'][k], dict)][-1]
357
360
  if slotmodel == 'stator1':
358
361
  hs = machine['stator']['stator1']['slot_rf1'] - \
359
362
  machine['stator']['stator1']['tip_rh1']
360
363
  else:
361
- hs = machine['stator'][slotmodel].get('slot_height', 0)
362
- wdgk = 'windings' if 'windings' in machine else 'winding'
364
+ dy1 = machine['outer_diam']
365
+ hs = machine['stator'][slotmodel].get(
366
+ 'slot_height', 0.6*(dy1-da1)/2)
367
+
363
368
  N = machine[wdgk]['num_wires']
364
- Jmax = 15 # max current density in A/mm2
369
+ Jmax = 20e6 # max current density in A/m2
370
+ f = machine[wdgk].get('fillfac', 0.42)
371
+ Acu = f*0.5*np.pi*(da1+hs)*hs
372
+ i1_max = round(Acu/Q1/N*Jmax/10)*10
365
373
 
366
- i1_max = round(0.28*np.pi*hs*(da1+hs)/Q1/N*Jmax*1e5)*10 * \
367
- machine[wdgk].get('num_par_wdgs', 1)
368
374
  period_frac = kwargs.get('period_frac', 6)
369
375
  if machine.get('external_rotor', False):
370
376
  period_frac = 1 # TODO: missing femag support
@@ -381,8 +387,6 @@ def dqparident(workdir, engine, temp, machine,
381
387
 
382
388
  wdg = windings.Winding(wpar)
383
389
 
384
- lfe = machine['lfe']
385
- g = machine[wdgk].get('num_par_wdgs', 1)
386
390
  if 'wire_gauge' in machine[wdgk]:
387
391
  aw = machine[wdgk]['wire_gauge']
388
392
  elif 'dia_wire' in machine[wdgk]:
@@ -256,5 +256,5 @@ class Engine:
256
256
  try:
257
257
  self.pool.terminate()
258
258
  self.pool.close()
259
- except AttributeError:
259
+ except AttributeError as e:
260
260
  logger.warn("%s", e)
@@ -14,16 +14,21 @@ DEFAULT_CMAP='viridis'
14
14
  """default colormap (see https://matplotlib.org/stable/users/explain/colors/colormaps.html)"""
15
15
 
16
16
 
17
- def spel(isa, with_axis=False, ax=0):
17
+ def spel(isa, superelements=[], with_axis=False, ax=0):
18
18
  """plot super elements of I7/ISA7 model
19
19
  Args:
20
20
  isa: Isa7 object
21
+ superelements: list of super elements (all if empty)
21
22
  """
22
23
  from matplotlib.patches import Polygon
23
24
  if ax == 0:
24
25
  ax = plt.gca()
25
26
  ax.set_aspect('equal')
26
- for se in isa.superelements:
27
+ if superelements:
28
+ spels = superelements
29
+ else:
30
+ spels = isa.superelements
31
+ for se in spels:
27
32
  ax.add_patch(Polygon([n.xy
28
33
  for nc in se.nodechains
29
34
  for n in nc.nodes],
@@ -79,17 +84,16 @@ def _contour(ax, title, elements, values, label='',
79
84
  for n in nc.nodes],
80
85
  color='gray', alpha=0.1, lw=0))
81
86
  valid_values = np.logical_not(np.isnan(values))
82
- patches = np.array([Polygon([v.xy for v in e.vertices])
83
- for e in elements])[valid_values]
87
+ vertices = [[v.xy for v in e.vertices] for e in elements]
88
+ patches = np.array([Polygon(xy) for xy in vertices])[valid_values]
84
89
  p = PatchCollection(patches, match_original=False,
85
90
  cmap=cmap, alpha=alpha)
86
91
  p.set_array(np.asarray(values)[valid_values])
87
92
  ax.add_collection(p)
88
93
  cb = plt.colorbar(p, shrink=0.9)
89
94
 
90
- for patch in np.array([Polygon([v.xy for v in e.vertices],
91
- fc='white', alpha=1.0)
92
- for e in elements])[np.isnan(values)]:
95
+ for patch in np.array([Polygon(xy, fc='white', alpha=1.0)
96
+ for xy in vertices])[np.isnan(values)]:
93
97
  ax.add_patch(patch)
94
98
  if label:
95
99
  cb.set_label(label=label)
@@ -130,9 +134,10 @@ def demag_pos(isa, pos=-1, icur=-1, ibeta=-1, cmap=DEFAULT_CMAP, ax=0):
130
134
  x = isa.pos_el_fe_induction[i]
131
135
 
132
136
  hpol = demag[:, i]
137
+ hmax = np.max(hpol)
133
138
  hpol[hpol == 0] = np.nan
134
- _contour(ax, f'Demagnetization at pos. {round(x/np.pi*180):.1f}°,'
135
- f'{isa.MAGN_TEMPERATURE} °C (max -{np.max(hpol):.1f} kA/m)',
139
+ _contour(ax, f'Demagnetization at pos. {round(x/np.pi*180):.1f}°, '
140
+ f'{isa.MAGN_TEMPERATURE} °C (max -{hmax:.1f} kA/m)',
136
141
  emag, hpol, '-H / kA/m', cmap, isa)
137
142
  logger.info("Max demagnetization %f kA/m", np.nanmax(hpol))
138
143
 
@@ -232,7 +237,7 @@ def flux_density_pos(isa, ipos, subreg=[], icur=-1, ibeta=-1, cmap=DEFAULT_CMAP,
232
237
  for e in elements:
233
238
  fd = isa.flux_density(e, icur, ibeta)
234
239
  b.append(np.linalg.norm(
235
- (fd['bx'][ipos], fd['bx'][ipos])))
240
+ (fd['bx'][ipos], fd['by'][ipos])))
236
241
  fluxd = np.array(b)
237
242
  pos = isa.pos_el_fe_induction[ipos]*180/np.pi
238
243
  isa.rotate(isa.pos_el_fe_induction[ipos])