femagtools 1.7.1__tar.gz → 1.7.3__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 (224) hide show
  1. {femagtools-1.7.1/src/femagtools.egg-info → femagtools-1.7.3}/PKG-INFO +1 -1
  2. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/__init__.py +1 -1
  3. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/bch.py +52 -8
  4. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/converter.py +2 -1
  5. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/fslrenderer.py +2 -1
  6. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/fsl.py +13 -10
  7. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/pm.py +5 -4
  8. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/sizing.py +64 -35
  9. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/sm.py +5 -3
  10. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/nc.py +3 -3
  11. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/forcedens.py +15 -5
  12. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/tks.py +39 -3
  13. {femagtools-1.7.1 → femagtools-1.7.3/src/femagtools.egg-info}/PKG-INFO +1 -1
  14. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_bchreader.py +20 -1
  15. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_sizing.py +2 -2
  16. {femagtools-1.7.1 → femagtools-1.7.3}/LICENSE +0 -0
  17. {femagtools-1.7.1 → femagtools-1.7.3}/MANIFEST.in +0 -0
  18. {femagtools-1.7.1 → femagtools-1.7.3}/README.md +0 -0
  19. {femagtools-1.7.1 → femagtools-1.7.3}/pyproject.toml +0 -0
  20. {femagtools-1.7.1 → femagtools-1.7.3}/setup.cfg +0 -0
  21. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/airgap.py +0 -0
  22. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/amazon.py +0 -0
  23. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/amela.py +0 -0
  24. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/asm.py +0 -0
  25. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/bchxml.py +0 -0
  26. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/condor.py +0 -0
  27. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/conductor.py +0 -0
  28. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/config.py +0 -0
  29. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/convert.py +0 -0
  30. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dakota.py +0 -0
  31. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dakota_femag.py +0 -0
  32. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dakotaout.py +0 -0
  33. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/docker.py +0 -0
  34. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/__init__.py +0 -0
  35. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/area.py +0 -0
  36. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/areabuilder.py +0 -0
  37. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/concat.py +0 -0
  38. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/conv.py +0 -0
  39. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/corner.py +0 -0
  40. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  41. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/dxfparser.py +0 -0
  42. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/femparser.py +0 -0
  43. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/functions.py +0 -0
  44. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/geom.py +0 -0
  45. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/journal.py +0 -0
  46. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/machine.py +0 -0
  47. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  48. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/shape.py +0 -0
  49. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/svgparser.py +0 -0
  50. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/dxfsl/symmetry.py +0 -0
  51. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/ecloss.py +0 -0
  52. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/erg.py +0 -0
  53. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/femag.py +0 -0
  54. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/forcedens.py +0 -0
  55. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/getset.py +0 -0
  56. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/gmsh.py +0 -0
  57. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/google.py +0 -0
  58. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/grid.py +0 -0
  59. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/hxy.py +0 -0
  60. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/isa7.py +0 -0
  61. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/jhb.py +0 -0
  62. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/job.py +0 -0
  63. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/losscoeffs.py +0 -0
  64. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/__init__.py +0 -0
  65. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/afpm.py +0 -0
  66. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/effloss.py +0 -0
  67. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/im.py +0 -0
  68. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/machine/utils.py +0 -0
  69. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/magnet.py +0 -0
  70. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/mcv.py +0 -0
  71. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/me.py +0 -0
  72. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/model.py +0 -0
  73. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/__init__.py +0 -0
  74. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/algorithm.py +0 -0
  75. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/population.py +0 -0
  76. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/problem.py +0 -0
  77. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  78. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/test/PopulationTest.py +0 -0
  79. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moo/test/ProblemTest.py +0 -0
  80. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/moproblem.py +0 -0
  81. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/multiproc.py +0 -0
  82. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/mxw2msh.py +0 -0
  83. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/netlist.py +0 -0
  84. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/ntib.py +0 -0
  85. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/opt.py +0 -0
  86. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/parstudy.py +0 -0
  87. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/__init__.py +0 -0
  88. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/bch.py +0 -0
  89. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/char.py +0 -0
  90. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/fieldlines.py +0 -0
  91. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/fluxdens.py +0 -0
  92. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/mcv.py +0 -0
  93. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/nc.py +0 -0
  94. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/phasor.py +0 -0
  95. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/plot/wdg.py +0 -0
  96. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/poc.py +0 -0
  97. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/svgfsl/converter.py +0 -0
  98. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/FE-losses.mako +0 -0
  99. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/afm_rotor.mako +0 -0
  100. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/afm_stator.mako +0 -0
  101. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/airgapinduc.mako +0 -0
  102. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/asyn_motor.mako +0 -0
  103. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/basic_modpar.mako +0 -0
  104. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/bertotti.mako +0 -0
  105. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/calc_field_ts.mako +0 -0
  106. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/calc_therm_field.mako +0 -0
  107. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/cogg_calc.mako +0 -0
  108. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/colorgrad.mako +0 -0
  109. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/com_motor_sim.mako +0 -0
  110. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/conduct-data.mako +0 -0
  111. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/connect_models.mako +0 -0
  112. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/cu_losses.mako +0 -0
  113. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  114. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  115. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/fe-contr.mako +0 -0
  116. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/fieldcalc.mako +0 -0
  117. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/gen_winding.mako +0 -0
  118. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/inductances.mako +0 -0
  119. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  120. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  121. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  122. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  123. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnet-data.mako +0 -0
  124. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetFC2.mako +0 -0
  125. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetIron.mako +0 -0
  126. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetIron2.mako +0 -0
  127. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetIron3.mako +0 -0
  128. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetIron4.mako +0 -0
  129. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetIron5.mako +0 -0
  130. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetIronV.mako +0 -0
  131. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetSector.mako +0 -0
  132. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  133. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetShell.mako +0 -0
  134. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/magnetShell2.mako +0 -0
  135. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/mesh-airgap.mako +0 -0
  136. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/modal_analysis.mako +0 -0
  137. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  138. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  139. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/new_model.mako +0 -0
  140. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  141. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/noloadflux.mako +0 -0
  142. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  143. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/open.mako +0 -0
  144. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/plots.mako +0 -0
  145. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  146. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  147. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  148. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  149. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/ring.mako +0 -0
  150. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/rot_hsm.mako +0 -0
  151. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/rotorAsyn.mako +0 -0
  152. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/rotorKs2.mako +0 -0
  153. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/rotor_msh.mako +0 -0
  154. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/rotor_winding.mako +0 -0
  155. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/shortcircuit.mako +0 -0
  156. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/srm.mako +0 -0
  157. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/stator1.mako +0 -0
  158. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/stator2.mako +0 -0
  159. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/stator3Linear.mako +0 -0
  160. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/stator4.mako +0 -0
  161. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/statorBG.mako +0 -0
  162. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/statorRing.mako +0 -0
  163. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/statorRotor3.mako +0 -0
  164. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/stator_msh.mako +0 -0
  165. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/therm-dynamic.mako +0 -0
  166. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/therm-static.mako +0 -0
  167. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/templates/torq_calc.mako +0 -0
  168. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/ts.py +0 -0
  169. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/utils.py +0 -0
  170. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/vbf.py +0 -0
  171. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/vtu.py +0 -0
  172. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools/windings.py +0 -0
  173. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools.egg-info/SOURCES.txt +0 -0
  174. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools.egg-info/dependency_links.txt +0 -0
  175. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools.egg-info/entry_points.txt +0 -0
  176. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools.egg-info/requires.txt +0 -0
  177. {femagtools-1.7.1 → femagtools-1.7.3}/src/femagtools.egg-info/top_level.txt +0 -0
  178. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/__init__.py +0 -0
  179. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/engines/__init__.py +0 -0
  180. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/engines/test_amazon.py +0 -0
  181. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/engines/test_config.py +0 -0
  182. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/geom/__init__.py +0 -0
  183. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/geom/test_functions.py +0 -0
  184. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/geom/test_point_inside.py +0 -0
  185. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/moo/__init__.py +0 -0
  186. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/moo/test_algorithm.py +0 -0
  187. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/moo/test_population.py +0 -0
  188. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/moo/test_problem.py +0 -0
  189. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_afpm.py +0 -0
  190. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_airgap_induction.py +0 -0
  191. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_amela.py +0 -0
  192. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_asm.py +0 -0
  193. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_conductor.py +0 -0
  194. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_convert.py +0 -0
  195. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_dxfsl.py +0 -0
  196. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_effloss.py +0 -0
  197. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_erg.py +0 -0
  198. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_femag.py +0 -0
  199. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_forcedens.py +0 -0
  200. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_fsl.py +0 -0
  201. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_hxy.py +0 -0
  202. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_im.py +0 -0
  203. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_isa7.py +0 -0
  204. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_jhb.py +0 -0
  205. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_job.py +0 -0
  206. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_losscoeffs.py +0 -0
  207. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_machine.py +0 -0
  208. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_magncurv.py +0 -0
  209. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_magnet.py +0 -0
  210. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_mcv.py +0 -0
  211. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_mcvreader.py +0 -0
  212. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_mcvwriter.py +0 -0
  213. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_me.py +0 -0
  214. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_model.py +0 -0
  215. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_nc.py +0 -0
  216. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_parident.py +0 -0
  217. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_parstudy.py +0 -0
  218. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_pocfile.py +0 -0
  219. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_sm.py +0 -0
  220. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_tksreader.py +0 -0
  221. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_ts.py +0 -0
  222. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_vbfreader.py +0 -0
  223. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_vtu.py +0 -0
  224. {femagtools-1.7.1 → femagtools-1.7.3}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.7.1
3
+ Version: 1.7.3
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.7.1'
5
+ __version__ = '1.7.3'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2024 Gamma Technology'
@@ -70,7 +70,7 @@ def sttylosses(losses):
70
70
  except KeyError:
71
71
  pass
72
72
  return d
73
-
73
+
74
74
  if sregs == {'StYoke', 'StTeeth'}:
75
75
  return hysteddy('StYoke', 'StTeeth', losses)
76
76
  if sregs == {'StJo', 'StZa'}:
@@ -95,6 +95,22 @@ def sttylosses(losses):
95
95
  return l
96
96
  return {}
97
97
 
98
+ def losses_mapping_external_rotor(losses):
99
+ styoke = 'rotor'
100
+ rotor = 'Iron'
101
+ d = {}
102
+ try:
103
+ d['styoke'] = losses[styoke]
104
+ d['styoke_hyst'] = losses[styoke+'_hyst']
105
+ d['rotor_hyst'] = losses[rotor+'_hyst']
106
+ d['styoke_eddy'] = losses[styoke+'_eddy']
107
+ d['rotor_eddy'] = losses[rotor+'_eddy']
108
+ d['styoke_excess'] = losses[styoke+'_excess']
109
+ d['rotor_excess'] = losses[rotor+'_excess']
110
+ except KeyError:
111
+ pass
112
+ return d
113
+
98
114
 
99
115
  def _readSections(f):
100
116
  """return list of bch sections
@@ -1150,6 +1166,10 @@ class Reader:
1150
1166
  m = []
1151
1167
  subregs = [name.split()[-1]
1152
1168
  for name in content[2].split('\t') if name][2:]
1169
+ # outer rotor motor
1170
+ if 'Iron' in subregs and \
1171
+ 'Rotor' in subregs:
1172
+ self.external_rotor = True
1153
1173
  logger.info("Stator Subregions: %s", subregs)
1154
1174
  speed = float(content[0].split()[-1])/60.
1155
1175
  logger.info('losses for speed %f', speed)
@@ -1209,7 +1229,10 @@ class Reader:
1209
1229
  (nrows, ncols)).T.tolist()
1210
1230
  for k, v in zip(cols, m[2:])})
1211
1231
  ls['speed'] = speed
1212
- ls.update(sttylosses(ls))
1232
+ if self.external_rotor:
1233
+ ls.update(losses_mapping_external_rotor(ls))
1234
+ else:
1235
+ ls.update(sttylosses(ls))
1213
1236
  if self.ldq:
1214
1237
  self.ldq['losses'] = ls
1215
1238
  elif self.psidq:
@@ -1464,6 +1487,10 @@ class Reader:
1464
1487
  def __read_losses(self, content):
1465
1488
  losses = {}
1466
1489
  i = 0
1490
+ # check if external rotor
1491
+ if self.weights[0][1] == 0.0 and \
1492
+ self.weights[0][-1] > 0:
1493
+ self.external_rotor = True
1467
1494
  # find results for angle:
1468
1495
  while True:
1469
1496
  try:
@@ -1521,8 +1548,12 @@ class Reader:
1521
1548
  losses['total'] += losses['staza']+losses['stajo']
1522
1549
  elif len(rec) == 1:
1523
1550
  t = l.split(':')[-1].strip()
1524
- if t == 'Iron':
1525
- losses['staza'] = floatnan(rec[0])
1551
+ if t == 'Iron':
1552
+ if self.external_rotor:
1553
+ losses['rotfe'] = floatnan(rec[0])
1554
+ losses['total'] += losses['rotfe']
1555
+ else:
1556
+ losses['staza'] = floatnan(rec[0])
1526
1557
  else:
1527
1558
  losses['stajo'] += floatnan(rec[0])
1528
1559
  losses['total'] += losses['staza']+losses['stajo']
@@ -1530,11 +1561,17 @@ class Reader:
1530
1561
  continue
1531
1562
 
1532
1563
  if _rotloss.search(l):
1564
+ if l.find('StZa') > -1:
1565
+ self.external_rotor = True
1533
1566
  rec = self.__findNums(content[i+2])
1534
1567
  if len(rec) == 1:
1535
- rotfe = floatnan(rec[0])
1536
- losses['rotfe'] += rotfe
1537
- losses['total'] += rotfe
1568
+ if self.external_rotor:
1569
+ losses['staza'] = floatnan(rec[0])
1570
+ losses['total'] += losses['staza']
1571
+ else:
1572
+ rotfe = floatnan(rec[0])
1573
+ losses['rotfe'] += rotfe
1574
+ losses['total'] += rotfe
1538
1575
  i += 3
1539
1576
  continue
1540
1577
 
@@ -1565,6 +1602,10 @@ class Reader:
1565
1602
  if content[i+1].split() == ['rotf', '----']:
1566
1603
  losses['rotfe'] = sum([floatnan(x) for x in rec])
1567
1604
  losses['total'] += losses['rotfe']
1605
+
1606
+ if content[i+1].split() == ['Iron', '----']: # external rotor
1607
+ losses['rotfe'] = sum([floatnan(x) for x in rec])
1608
+ losses['total'] += losses['rotfe']
1568
1609
  i += 4
1569
1610
  continue
1570
1611
 
@@ -1622,7 +1663,10 @@ class Reader:
1622
1663
  l.find('RoZa') > -1:
1623
1664
  k = 'staza'
1624
1665
  elif l.find('Iron') > -1 and l.find('Stator') > -1:
1625
- k = 'staza'
1666
+ if self.external_rotor:
1667
+ k = 'rotor'
1668
+ else:
1669
+ k = 'staza'
1626
1670
  elif l.find('Iron') > -1:
1627
1671
  if self.external_rotor:
1628
1672
  k = 'staza'
@@ -643,7 +643,8 @@ def convert(dxfile,
643
643
  params['agndst'] = agndst(params.get('da1'),
644
644
  params.get('da2'),
645
645
  params.get('tot_num_slot'),
646
- params.get('num_poles'), 1)
646
+ params.get('num_poles'),
647
+ params.get('nodedist'))
647
648
 
648
649
  if params['external_rotor']:
649
650
  conv['fsl_magnet'] = outer
@@ -35,6 +35,7 @@ def agndst(da1, da2, Q, p, nodedist=1):
35
35
  num_nodes = [i*lcm for i in range(nmin, nmax) if i*lcm%6==0]
36
36
  dagset = [2*np.pi/p/i for i in num_nodes]
37
37
  i = max(np.argmin(np.abs(np.array(dagset) - np.arctan2(ag, r))), 1)
38
+ # nodedist 0.5, 2, 4, 6
38
39
  nd = min(round(nodedist), i)
39
40
  try:
40
41
  logger.info("Num nodes/p %d Num nodes/slot %g nodedist %g",
@@ -550,7 +551,7 @@ class FslRenderer(object):
550
551
  'ndt(agndst)',
551
552
  'r1 = m.fc_radius - ag/6',
552
553
  'x1, y1 = pr2c(r1, alfa)',
553
- 'n = math.floor(r1*alfa/agndst + 1.5)',
554
+ 'n = math.floor(m.fc_radius*alfa/agndst + 1.5)',
554
555
  'nc_circle_m(r1, 0, x1, y1, 0.0, 0.0, n)\n',
555
556
  'r2 = m.fc_radius + ag/6',
556
557
  'x2, y2 = pr2c(r2, alfa)',
@@ -352,7 +352,7 @@ class Builder:
352
352
  '-- thermal properties in airgap',
353
353
  'ag_cond = 0.063',
354
354
  'thcap = 1007',
355
- 'beta = np.pi*m.npols_gen/m.num_poles + m.zeroangl/180*np.pi',
355
+ 'beta = math.pi*m.npols_gen/m.num_poles + m.zeroangl/180*math.pi',
356
356
  'xai, yai = pr2c((da1+da2)/4, beta)',
357
357
  'def_mat_therm(xai,yai,"cyan",1.19,ag_cond,thcap,1)',
358
358
  'xai, yai = pr2c((da1+da2)/4-ag/4, beta)',
@@ -540,7 +540,7 @@ class Builder:
540
540
  model.get('bore_diam') - 2*ag,
541
541
  model.stator.get('num_slots'),
542
542
  model.get('poles'),
543
- model.stator.get('nodedist') or 1.0))
543
+ model.dxffile.get('nodedist')))
544
544
 
545
545
  logger.info(" num poles %d num slots %d outer diameter %.4f m",
546
546
  model.poles, model.stator['num_slots'],
@@ -553,14 +553,17 @@ class Builder:
553
553
  self.prepare_diameter(model)
554
554
  if self.fsl_stator and model.get('num_agnodes', 0) == 0:
555
555
  from femagtools.dxfsl.fslrenderer import agndst
556
- ag = model.get('airgap')
557
- model.set_value(
558
- 'agndst',
559
- agndst(model.get('bore_diam'),
560
- model.get('bore_diam') - 2*ag,
561
- model.stator.get('num_slots'),
562
- model.get('poles'),
563
- model.stator.get('nodedist') or 1.0))
556
+ if model.get('agndst'):
557
+ pass
558
+ else:
559
+ ag = model.get('airgap')
560
+ model.set_value(
561
+ 'agndst',
562
+ agndst(model.get('bore_diam'),
563
+ model.get('bore_diam') - 2*ag,
564
+ model.stator.get('num_slots'),
565
+ model.get('poles'),
566
+ model.stator.get('nodedist') or 1.0))
564
567
 
565
568
  model.set_num_slots_gen()
566
569
  if hasattr(model, 'magnet'):
@@ -569,10 +569,9 @@ class PmRelMachine(object):
569
569
  if abs(du) > 0.1:
570
570
  logger.debug('oops? iqd_imax_umax one more torque reduction')
571
571
  if with_tmech:
572
- iq, id = self.iqd_tmech(torque, w1/2/np.pi/self.p,
573
- iq, id)[:2]
572
+ iq, id = self.iqd_tmech_umax(torque, w1, u1max)[:2]
574
573
  else:
575
- iq, id = self.iqd_torque(torque)[:2]
574
+ iq, id = self.iqd_torque_umax(torque, w1, u1max)[:2]
576
575
  if with_mtpv:
577
576
  try:
578
577
  if with_tmech:
@@ -779,7 +778,7 @@ class PmRelMachine(object):
779
778
  maxtorque=T > 0)[:2])
780
779
  w, _, ier, _ = so.fsolve(voltw1, wx, full_output=True)
781
780
  logger.debug("fsolve ier %d T %f w %f w1 %f", ier, T, w, wx)
782
- if ier in (1, 4, 5):
781
+ if ier == 1: #in (1, 4, 5):
783
782
  if abs(w[0]) <= wx:
784
783
  self.check_extrapolation = True
785
784
  return [w/2/np.pi/self.p
@@ -788,6 +787,8 @@ class PmRelMachine(object):
788
787
  wl += (wu-wl)/4
789
788
  else:
790
789
  wl = w[0]
790
+ else:
791
+ break
791
792
  except ValueError as e:
792
793
  logger.debug("%s: wx %f wl %f wu %f", e, wx, wl, wu)
793
794
  wl = wx
@@ -5,6 +5,8 @@
5
5
  """
6
6
  import numpy as np
7
7
  import logging
8
+ from ..windings import Winding
9
+ from .utils import wdg_resistance
8
10
 
9
11
  logger = logging.getLogger("femagools.machine.sizing")
10
12
 
@@ -14,7 +16,7 @@ PM_DEFAULTS = dict(
14
16
  eta=0.92, # efficiency
15
17
  cos_phi=0.95, # power factor
16
18
  m=3, # number of phases
17
- ui_u=0.62, # U ind / U
19
+ ui_u=0.64, # U ind / U
18
20
  lda=1.33, # length/taup ratio 0.5 .. sqrt(p)
19
21
  J=3.8e6, # current density 3 .. 6 A/mm²
20
22
  sigmas=17e3, # shear force 10 .. 45 kN/m2
@@ -25,10 +27,10 @@ PM_DEFAULTS = dict(
25
27
  mag_width=0.8, # rel magnet width 0.6 .. 1
26
28
  Hc=700, # max. coercitive field strength, 500 .. 900 kA/m
27
29
  brem=1.15, # remanence 0.3 .. 1.3 T
28
- demag=1.5, # safety factor for demagnetisation
30
+ demag=6, # safety factor for demagnetisation (nom current)
29
31
  external_rotor=False,
30
32
  coil_span=0,
31
- hfe=1e-3 # iron height between magnet and airgap (IPM)
33
+ hfe=1.5e-3 # iron height between magnet and airgap (IPM)
32
34
  )
33
35
  """default sizing parameters for PM"""
34
36
 
@@ -88,10 +90,10 @@ def iron_losses(dy, lfe, hy, wt, ht, q1, B, f):
88
90
  return Wfe * dens*vol
89
91
 
90
92
 
91
- def wdg_resistance(w1, l, d):
92
- S = 56e6 # conductivity of copper 1/Ohm m
93
- a = np.pi*d**2/4
94
- return 2*w1*l/S/a
93
+ #def wdg_resistance(w1, l, d):
94
+ # S = 56e6 # conductivity of copper 1/Ohm m
95
+ # a = np.pi*d**2/4
96
+ # return 2*w1*l/S/a
95
97
 
96
98
 
97
99
  def check_symmetry_conditions(Q1, p, layers, m):
@@ -202,18 +204,22 @@ def _stator_slots(par, slots):
202
204
  par['Q1'] = Q1
203
205
  r = get_stator_dimensions(par)
204
206
  hb = r['hns']/r['bns']
207
+ logging.debug(f"Q1 {Q1} hs/bs {hb}")
205
208
  if hb > 5:
206
209
  break
207
- if hb > 3:
208
- q.append((Q1, Q1//np.gcd(Q1, p), abs(4-hb), r['kw']))
210
+ if hb > 2.5:
211
+ # ideal height/width ratio: 3.2
212
+ q.append((Q1, Q1//np.gcd(Q1, p), abs(3.2-hb), r['kw']))
209
213
 
210
214
  if q:
211
215
  qhbmin = np.argmin(q, axis=0)
212
- logger.debug("q %s", q)
213
- # check sim factor, height/width ratio, winding factor
216
+ logger.debug("q %s qhbmin %s", q, qhbmin)
217
+ # check sim factor, height/width ratio
214
218
  if qhbmin[1] == len(q)-1:
215
- return q[qhbmin[1]][0]
219
+ # last has smallest sim factor
220
+ return q[qhbmin[1]][0]
216
221
  elif q[qhbmin[1]][2] < q[qhbmin[1]+1][2]:
222
+ # select ideal height/width ratio (3.2)
217
223
  return q[qhbmin[1]][0]
218
224
  return q[qhbmin[1]+1][0]
219
225
  return slotset[0]
@@ -222,7 +228,6 @@ def _stator_slots(par, slots):
222
228
  def get_stator_dimensions(par, slots=[]):
223
229
  # Check symmetry
224
230
  if 'Q1' in par:
225
- from ..windings import Winding
226
231
  wdg = Winding({'Q': par['Q1'], 'p': par['p'], 'm': 3})
227
232
  # nominal (rated) operating parameters
228
233
  pnom = par['pnom']
@@ -237,7 +242,8 @@ def get_stator_dimensions(par, slots=[]):
237
242
 
238
243
  # pole width
239
244
  taup = np.pi * Da/(2*p)
240
- lfe = taup*lda
245
+ lfe_q = par.get('lfe_q', 0.001)
246
+ lfe = lfe_q * round(taup*lda/lfe_q)
241
247
 
242
248
  if 'udc' in par:
243
249
  u1nom = 0.9*par['udc']/np.sqrt(2)/np.sqrt(3) # phase voltage
@@ -254,8 +260,6 @@ def get_stator_dimensions(par, slots=[]):
254
260
  else:
255
261
  Q1 = par['Q1']
256
262
  coil_span = par.get('coil_span', 0)
257
- if np.gcd(Q1, 2*p) == coil_span:
258
- coil_span = 0
259
263
  layers = 1 if coil_span == 0 else 2
260
264
  req_poles = np.gcd(Q1, 2*p)
261
265
  if req_poles != 2*p:
@@ -282,7 +286,7 @@ def get_stator_dimensions(par, slots=[]):
282
286
  kw = kwz * kws
283
287
 
284
288
  # flux density amplitude of base harmonic
285
- if 'brem' in par:
289
+ if 'mag_width' in par:
286
290
  mag_width = par['mag_width']
287
291
  Bd1 = 4.0/np.pi*Ba*np.sin(np.pi/2.0*mag_width)
288
292
  else:
@@ -293,8 +297,36 @@ def get_stator_dimensions(par, slots=[]):
293
297
  # stator winding
294
298
  psi1 = 2.0/np.pi*taup*lfe*Bd1
295
299
 
300
+ # number of turns per phase, first estimation
296
301
  Ui = Ui_U * u1nom
297
- N = round(np.sqrt(2)*Ui/(2*np.pi*f1nom*kw*psi1), 1)
302
+ N = np.sqrt(2)*Ui/(2*np.pi*f1nom*kw*psi1)
303
+
304
+ # coils per phase and pole
305
+ # q = Q/2/p/m
306
+ # num wires per coil side (number of coil groups a)
307
+ # n = a*N / 2 / p / q
308
+
309
+ # feasible number of turns per coil...
310
+ ncoils = Q1 // 2 // m * layers
311
+ ngroups = [1] + [g for g in range(2, layers*p + 1) if layers * p % g == 0]
312
+ ndiff = [abs(N - ncoils // a * a * round(N / ncoils))
313
+ for a in ngroups]
314
+ logger.debug("N %f ngroups %s ndiffs %s",
315
+ N, ngroups, ndiff)
316
+ a_calc = ngroups[np.argmin(ndiff)]
317
+ a = par.get("a", a_calc)
318
+ if not a in ngroups:
319
+ logger.warning("Check given number %s of parallel wdg groups. Valid ngroups are: %s",
320
+ a, ngroups)
321
+ num_wires = round(a * N / ncoils)
322
+
323
+ # correction of number of turns per phase
324
+ N_old = N
325
+ N = num_wires * ncoils / a
326
+
327
+ # correction of voltage
328
+ Ui = Ui/N_old*N
329
+ u1nom = Ui/Ui_U
298
330
 
299
331
  # current loading
300
332
  # A = np.sqrt(2)*sigmas/kw/Ba
@@ -312,6 +344,12 @@ def get_stator_dimensions(par, slots=[]):
312
344
  hns = (-bns + np.sqrt(bns**2 + 4*ans*np.tan(taus)))/2/np.tan(taus)
313
345
  hys = psi1/2/lfe/By
314
346
 
347
+ aw = ans * kq / layers / num_wires
348
+ # round wire: pi*d²/4
349
+ dwire = 2 * np.sqrt(aw/np.pi)
350
+ wdg = Winding({'Q': Q1, 'p': p, 'm': 3, 'yd': coil_span, 'l': layers})
351
+ r1 = wdg_resistance(wdg, num_wires, a, aw, Da, hns, lfe)
352
+ relculen = 1.4
315
353
  # airgap and yoke diameter
316
354
  airgap = par['airgap']
317
355
  if par['external_rotor']:
@@ -336,9 +374,11 @@ def get_stator_dimensions(par, slots=[]):
336
374
  trv=round(1e-3*pnom/(2*np.pi*speednom)/(np.pi*Da1**2/4*lfe), 1),
337
375
  w1=int(N),
338
376
  kw=round(kw, 4),
339
- q=qt,
377
+ q=wdg.q,
340
378
  i1=round(I1, 3), # np.pi*Da1*A/2/m/N
341
- psi1=round(psi1, 5))
379
+ psi1=round(psi1, 5),
380
+ u1=u1nom,
381
+ ui=Ui)
342
382
 
343
383
  slotwidth = np.floor(0.3*np.pi*Da1/Q1*2000+0.5)/2000.0
344
384
  tw = bds # np.pi*(Da1+hns)/Q1 - bns
@@ -375,25 +415,14 @@ def get_stator_dimensions(par, slots=[]):
375
415
  wedge_width1=0, # bns1,
376
416
  wedge_width2=0,
377
417
  middle_line=0 if layers < 2 else middle_line))
378
- # coils per phase and pole
379
- # q = Q/2/p/m
380
- # num wires per coil side (number of coil groups a)
381
- # n = a*N / 2 / p / q
382
- ncoils = Q1//2//m*layers
383
- ngroups = [1] + [g for g in range(2, p+1) if p%g == 0]
384
- a = ngroups[np.argmin([abs(N-ncoils//a*round(a*N/ncoils))
385
- for a in ngroups])]
386
- num_wires = round(a*N/ncoils)
387
- dwire = 2*np.sqrt(ans*kq/layers/np.pi/num_wires)
388
- relculen = 1.4
389
- r1 = wdg_resistance(N, relculen*lfe, dwire)/a
418
+
390
419
  r['pcu'] = round(m*r1*I1**2, 1)
391
420
 
392
421
  r['winding'] = dict(
393
422
  wire_diam=round(dwire, 5),
394
423
  num_phases=m,
395
424
  cufilfact=kq,
396
- culength=1.4,
425
+ culength=relculen,
397
426
  num_par_wdgs=a,
398
427
  num_layers=layers,
399
428
  resistance=round(r1, 4),
@@ -413,8 +442,7 @@ def _get_magnet_height(I1, N, kw, par):
413
442
  Hc = Hc*1e3 # unit kA/m
414
443
  # Safety Factor for demagnetization
415
444
  demag = par['demag']
416
- I1max = 4*I1
417
- THETA1 = m/np.pi*np.sqrt(2)*I1max*N*kw/p
445
+ THETA1 = m/np.pi*np.sqrt(2)*I1*N*kw/p
418
446
  # minimal magnet height with safety factor
419
447
  hM = THETA1/Hc*demag
420
448
  Br = par['brem']
@@ -698,6 +726,7 @@ def ipm(pnom: float, speed: float, p: int, **kwargs) -> dict:
698
726
  pnom=pnom, speed=speed, p=p)
699
727
  par.update(kwargs)
700
728
  _set_pm_defaults(par)
729
+ par.pop('mag_width')
701
730
 
702
731
  # stator and magnet parameters of interior mounted magnet machine
703
732
  r = get_stator_dimensions(par)
@@ -102,6 +102,8 @@ def parident(workdir, engine, machine,
102
102
  num_cur_steps=kwargs.get('num_cur_steps', 5),
103
103
  num_beta_steps=kwargs.get('num_beta_steps', 13),
104
104
  num_par_wdgs=machine[wdgk].get('num_par_wdgs', 1),
105
+ skew_angle=kwargs.get('skew_angle', 0.0),
106
+ num_skew_steps=kwargs.get('num_skew_steps', 0.0),
105
107
  period_frac=kwargs.get('period_frac', 6),
106
108
  speed=kwargs.get('speed', 50))
107
109
 
@@ -338,9 +340,9 @@ class SynchronousMachine(object):
338
340
  def torquemax(self, i1, iex):
339
341
  "returns maximum torque of i1, iex (nan if i1 out of range)"
340
342
  def torquei1b(b):
341
- return -self.torque_iqd(*iqd(b[0], i1), iex)
343
+ return self.torque_iqd(*iqd(b[0], i1), iex)
342
344
  res = so.minimize(torquei1b, (0,))
343
- return -res.fun
345
+ return res.fun
344
346
 
345
347
  def torquemin(self, i1, iex):
346
348
  "returns minimum torque of i1, iex (nan if i1 out of range)"
@@ -576,7 +578,7 @@ class SynchronousMachine(object):
576
578
  i1max: max. phase current (RMS)
577
579
  """
578
580
  if kwargs.get('i1max', 0):
579
- w1type, T = self.w1_imax_umax(kwargs['i1max'], u1max)
581
+ w1type, T = self.w1_imax_umax(kwargs['i1max'], u1max)
580
582
  try:
581
583
  iq, id, iex = self.iqd_torque(T)
582
584
  except ValueError:
@@ -195,7 +195,7 @@ class Reader(object):
195
195
  grp.variables['delta_node_angle'].getValue().data)
196
196
  self.poles_sim = int(grp.variables['poles_sim'].getValue().data)
197
197
  self.slots = int(grp.variables['num_slots'].getValue().data)
198
- self.arm_length = int(grp.variables['arm_length'].getValue().data)
198
+ self.arm_length = float(grp.variables['arm_length'].getValue().data)
199
199
  except:
200
200
  pass
201
201
 
@@ -281,10 +281,10 @@ class Reader(object):
281
281
  cw = float(mcgrp.variables['cw'][i].data)
282
282
  cw_freq_exp = float(mcgrp.variables['cw_exp'][i].data)
283
283
  cw_ind_exp = float(mcgrp.variables['ind_exp'][i].data)
284
- try:
284
+ try:
285
285
  ce = float(mcgrp.variables['ce'][i].data)
286
286
  cw_ind_beta_exp = float(mcgrp.variables['ind_beta_exp'][i].data)
287
- except:
287
+ except:
288
288
  pass
289
289
  spec_weight = float(mcgrp.variables['spec_weight'][i].data)
290
290
  fillfactor = float(mcgrp.variables['fillfac'][i].data)
@@ -8,7 +8,17 @@
8
8
  """
9
9
  import numpy as np
10
10
  import matplotlib.pyplot as plt
11
- from matplotlib import colormaps
11
+ try:
12
+ from matplotlib import colormaps
13
+ cmap_viridis = colormaps['viridis']
14
+ cmap_jet = colormaps['jet']
15
+ cmap_YlOrBr = colormaps['YlOrBr']
16
+ except: # older matplotlib
17
+ from matplotlib import cm
18
+ cmap_viridis = cm.viridis
19
+ cmap_jet = cm.jet
20
+ cmap_YlOrBr = cm.YlOrBr
21
+
12
22
 
13
23
  def _create_3d_axis():
14
24
  """creates a subplot with 3d projection if one does not already exist"""
@@ -24,7 +34,7 @@ def _create_3d_axis():
24
34
  plt.subplot(111, projection='3d')
25
35
 
26
36
 
27
- def _plot_surface(ax, x, y, z, labels, azim=None, cmap=colormaps['viridis']):
37
+ def _plot_surface(ax, x, y, z, labels, azim=None, cmap=cmap_viridis):
28
38
  """helper function for surface plots"""
29
39
  # ax.tick_params(axis='both', which='major', pad=-3)
30
40
  assert np.size(x) > 1 and np.size(y) > 1 and np.size(z) > 1
@@ -60,7 +70,7 @@ def forcedens(title, pos, fdens, ax=0):
60
70
  ax.set_ylabel('Force Density / kN/m²')
61
71
 
62
72
 
63
- def forcedens_surface(fdens, attr='FN', ax=0, cmap=colormaps['jet']):
73
+ def forcedens_surface(fdens, attr='FN', ax=0, cmap=cmap_jet):
64
74
  if ax == 0:
65
75
  _create_3d_axis()
66
76
  ax = plt.gca()
@@ -72,7 +82,7 @@ def forcedens_surface(fdens, attr='FN', ax=0, cmap=colormaps['jet']):
72
82
  ('Rotor pos/°', 'Pos/°', f'{attr} / kN/m²'),
73
83
  cmap=cmap)
74
84
 
75
- def forcedens_contour(fdens, attr='FN', ax=0, cmap=colormaps['jet']):
85
+ def forcedens_contour(fdens, attr='FN', ax=0, cmap=cmap_jet):
76
86
  if ax == 0:
77
87
  ax = plt.gca()
78
88
  z = 1e-3*np.array(getattr(fdens, attr))
@@ -91,7 +101,7 @@ def forcedens_contour(fdens, attr='FN', ax=0, cmap=colormaps['jet']):
91
101
  cbar.ax.set_ylabel('kN/m²')
92
102
 
93
103
  def forcedens_fft(title, fdens, harmmax=(), #(200, 40),
94
- cmap=colormaps['YlOrBr'],
104
+ cmap=cmap_YlOrBr,
95
105
  ax=0):
96
106
  """plot force densities FFT
97
107
  Args:
@@ -21,6 +21,17 @@ numPattern = re.compile(r'([+-]?\d+(?:\.\d+)?(?:[eE][+-]\d+)?)')
21
21
  HBpattern = re.compile(r'H.+\s+B')
22
22
  BPpattern = re.compile(r'B.+\s+P')
23
23
 
24
+ _tranlate = {
25
+ "ch": "Hysteresis Loss Factor",
26
+ "cw": "Eddy Current Loss Factor",
27
+ "ce": "Excess Loss Factor",
28
+ "ch_freq": "Hyteresis Exponent",
29
+ "cw_freq": "Eddy Current Exponent",
30
+ "b_coeff": "Induction Loss Exponent",
31
+ "alpha": "Induction Loss Exponent (Bertotti)",
32
+ "Bo": "Reference Induction",
33
+ "fo": "Reference Frequency",
34
+ }
24
35
 
25
36
  def readlist(section):
26
37
  x = []
@@ -109,7 +120,8 @@ class Reader(object):
109
120
  self.cw = z[2]
110
121
  self.cw_freq = z[3]
111
122
  self.b_coeff = z[4]
112
-
123
+ self.jordan = {'ch': z[0], 'cw': z[2], 'ch_freq': z[1], 'cw_freq': z[3], 'b_coeff': z[4],
124
+ 'Bo': self.Bo, 'fo': self.fo}
113
125
  z = lc.fitsteinmetz(
114
126
  self.losses['f'],
115
127
  self.losses['B'],
@@ -122,11 +134,15 @@ class Reader(object):
122
134
  self.losses['cw_freq'] = z[1]
123
135
  self.losses['b_coeff'] = z[2]
124
136
 
137
+ self.steinmetz = {'cw': z[0], 'cw_freq': z[1], 'b_coeff': z[2],
138
+ 'Bo': self.Bo, 'fo': self.fo}
139
+
125
140
  self.losses['Bo'] = self.Bo
126
141
  self.losses['fo'] = self.fo
127
142
  z = lc.fit_bertotti(self.losses['f'],
128
143
  self.losses['B'], pfe)
129
- self.bertotti = {'ch': z[0], 'alpha': 2.0, 'cw': z[1], 'ce': z[2]}
144
+ self.bertotti = {'ch': z[0], 'cw': z[1], 'ce': z[2],
145
+ 'alpha': 2.0, 'Bo': 1, 'fo': 1}
130
146
  logger.info("Bertotti loss coeffs %s", z)
131
147
 
132
148
  # must normalize pfe matrix:
@@ -156,7 +172,27 @@ class Reader(object):
156
172
  'b_coeff': self.b_coeff,
157
173
  'rho': self.rho,
158
174
  'losses': self.losses}
159
-
175
+
176
+ def tableview(Reader):
177
+ """pretty print loss coeff table"""
178
+ losscoeff = [Reader.jordan, Reader.steinmetz, Reader.bertotti]
179
+ # Title
180
+ strlen = 101
181
+ print('='*strlen)
182
+ print('| {:^34} '.format(' ') + '| {:^18} | {:^18} | {:^18} |'.format(*["Jordan", "Steinmetz", 'Bertotti']))
183
+ print('='*strlen)
184
+ # data
185
+ for key, item in _tranlate.items():
186
+ fout = ''
187
+ for i in losscoeff:
188
+ if key in i:
189
+ fout += '| ' + f'{i[key]:^18.8e} '
190
+ else:
191
+ tmp = '-'
192
+ fout += '| ' + f'{tmp:^18} '
193
+ print(f'| {item:^34}' + ' ' + fout + '|')
194
+ print('='*strlen)
195
+ return
160
196
 
161
197
  def read(filename, filecontent=None):
162
198
  """read Thyssen File TKS and return mc dict"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.7.1
3
+ Version: 1.7.3
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