femagtools 1.5.1__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.1/src/femagtools.egg-info → femagtools-1.5.2}/PKG-INFO +1 -1
  2. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/__init__.py +1 -1
  3. femagtools-1.5.2/src/femagtools/hxy.py +181 -0
  4. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/afpm.py +70 -1
  5. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/sizing.py +3 -1
  6. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/utils.py +12 -8
  7. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/nc.py +7 -7
  8. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/vtu.py +72 -3
  9. {femagtools-1.5.1 → femagtools-1.5.2/src/femagtools.egg-info}/PKG-INFO +1 -1
  10. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools.egg-info/SOURCES.txt +1 -0
  11. femagtools-1.5.2/src/tests/test_hxy.py +19 -0
  12. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_sizing.py +1 -1
  13. femagtools-1.5.2/src/tests/test_vtu.py +42 -0
  14. femagtools-1.5.1/src/femagtools/hxy.py +0 -126
  15. femagtools-1.5.1/src/tests/test_vtu.py +0 -25
  16. {femagtools-1.5.1 → femagtools-1.5.2}/LICENSE +0 -0
  17. {femagtools-1.5.1 → femagtools-1.5.2}/MANIFEST.in +0 -0
  18. {femagtools-1.5.1 → femagtools-1.5.2}/README.md +0 -0
  19. {femagtools-1.5.1 → femagtools-1.5.2}/pyproject.toml +0 -0
  20. {femagtools-1.5.1 → femagtools-1.5.2}/setup.cfg +0 -0
  21. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/airgap.py +0 -0
  22. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/amazon.py +0 -0
  23. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/amela.py +0 -0
  24. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/asm.py +0 -0
  25. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/bch.py +0 -0
  26. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/bchxml.py +0 -0
  27. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/condor.py +0 -0
  28. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/conductor.py +0 -0
  29. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/config.py +0 -0
  30. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/convert.py +0 -0
  31. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dakota.py +0 -0
  32. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dakota_femag.py +0 -0
  33. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dakotaout.py +0 -0
  34. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/docker.py +0 -0
  35. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/__init__.py +0 -0
  36. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/area.py +0 -0
  37. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/conv.py +0 -0
  38. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/converter.py +0 -0
  39. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/corner.py +0 -0
  40. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  41. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/fslrenderer.py +0 -0
  42. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/functions.py +0 -0
  43. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/geom.py +0 -0
  44. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/machine.py +0 -0
  45. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  46. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/dxfsl/shape.py +0 -0
  47. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/ecloss.py +0 -0
  48. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/erg.py +0 -0
  49. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/femag.py +0 -0
  50. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/forcedens.py +0 -0
  51. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/fsl.py +0 -0
  52. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/getset.py +0 -0
  53. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/gmsh.py +0 -0
  54. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/google.py +0 -0
  55. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/grid.py +0 -0
  56. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/isa7.py +0 -0
  57. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/jhb.py +0 -0
  58. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/job.py +0 -0
  59. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/losscoeffs.py +0 -0
  60. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/__init__.py +0 -0
  61. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/effloss.py +0 -0
  62. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/im.py +0 -0
  63. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/pm.py +0 -0
  64. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/machine/sm.py +0 -0
  65. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/magnet.py +0 -0
  66. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/mcv.py +0 -0
  67. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/me.py +0 -0
  68. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/model.py +0 -0
  69. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/__init__.py +0 -0
  70. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/algorithm.py +0 -0
  71. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/population.py +0 -0
  72. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/problem.py +0 -0
  73. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  74. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/test/PopulationTest.py +0 -0
  75. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moo/test/ProblemTest.py +0 -0
  76. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/moproblem.py +0 -0
  77. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/multiproc.py +0 -0
  78. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/mxw2msh.py +0 -0
  79. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/nc.py +0 -0
  80. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/netlist.py +0 -0
  81. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/ntib.py +0 -0
  82. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/opt.py +0 -0
  83. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/parstudy.py +0 -0
  84. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/__init__.py +0 -0
  85. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/bch.py +0 -0
  86. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/char.py +0 -0
  87. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/fluxdens.py +0 -0
  88. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/forcedens.py +0 -0
  89. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/mcv.py +0 -0
  90. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/phasor.py +0 -0
  91. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/plot/wdg.py +0 -0
  92. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/poc.py +0 -0
  93. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/FE-losses.mako +0 -0
  94. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/afm_rotor.mako +0 -0
  95. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/afm_stator.mako +0 -0
  96. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/airgapinduc.mako +0 -0
  97. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/asyn_motor.mako +0 -0
  98. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/basic_modpar.mako +0 -0
  99. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/calc_field_ts.mako +0 -0
  100. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/calc_therm_field.mako +0 -0
  101. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/cogg_calc.mako +0 -0
  102. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/colorgrad.mako +0 -0
  103. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/com_motor_sim.mako +0 -0
  104. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/conduct-data.mako +0 -0
  105. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/connect_models.mako +0 -0
  106. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/cu_losses.mako +0 -0
  107. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  108. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/fe-contr.mako +0 -0
  109. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/fieldcalc.mako +0 -0
  110. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/gen_winding.mako +0 -0
  111. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/inductances.mako +0 -0
  112. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  113. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  114. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  115. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  116. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnet-data.mako +0 -0
  117. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetFC2.mako +0 -0
  118. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetIron.mako +0 -0
  119. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetIron2.mako +0 -0
  120. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetIron3.mako +0 -0
  121. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetIron4.mako +0 -0
  122. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetIron5.mako +0 -0
  123. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetIronV.mako +0 -0
  124. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetSector.mako +0 -0
  125. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  126. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetShell.mako +0 -0
  127. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/magnetShell2.mako +0 -0
  128. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/mesh-airgap.mako +0 -0
  129. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/modal_analysis.mako +0 -0
  130. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  131. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/new_model.mako +0 -0
  132. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  133. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/noloadflux.mako +0 -0
  134. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  135. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/open.mako +0 -0
  136. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/plots.mako +0 -0
  137. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  138. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  139. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  140. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  141. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/ring.mako +0 -0
  142. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/rot_hsm.mako +0 -0
  143. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/rotorAsyn.mako +0 -0
  144. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/rotorKs2.mako +0 -0
  145. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/rotor_msh.mako +0 -0
  146. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/rotor_winding.mako +0 -0
  147. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/shortcircuit.mako +0 -0
  148. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/srm.mako +0 -0
  149. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/stator1.mako +0 -0
  150. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/stator2.mako +0 -0
  151. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/stator3Linear.mako +0 -0
  152. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/stator4.mako +0 -0
  153. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/statorBG.mako +0 -0
  154. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/statorRing.mako +0 -0
  155. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/statorRotor3.mako +0 -0
  156. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/stator_msh.mako +0 -0
  157. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/therm-dynamic.mako +0 -0
  158. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/therm-static.mako +0 -0
  159. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/templates/torq_calc.mako +0 -0
  160. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/tks.py +0 -0
  161. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/ts.py +0 -0
  162. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/utils.py +0 -0
  163. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/vbf.py +0 -0
  164. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools/windings.py +0 -0
  165. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools.egg-info/dependency_links.txt +0 -0
  166. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools.egg-info/entry_points.txt +0 -0
  167. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools.egg-info/requires.txt +0 -0
  168. {femagtools-1.5.1 → femagtools-1.5.2}/src/femagtools.egg-info/top_level.txt +0 -0
  169. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/__init__.py +0 -0
  170. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/engines/__init__.py +0 -0
  171. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/engines/test_amazon.py +0 -0
  172. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/engines/test_config.py +0 -0
  173. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/geom/__init__.py +0 -0
  174. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/geom/test_functions.py +0 -0
  175. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/geom/test_point_inside.py +0 -0
  176. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/moo/__init__.py +0 -0
  177. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/moo/test_algorithm.py +0 -0
  178. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/moo/test_population.py +0 -0
  179. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/moo/test_problem.py +0 -0
  180. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_afpm.py +0 -0
  181. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_airgap_induction.py +0 -0
  182. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_amela.py +0 -0
  183. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_asm.py +0 -0
  184. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_bchreader.py +0 -0
  185. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_conductor.py +0 -0
  186. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_convert.py +0 -0
  187. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_effloss.py +0 -0
  188. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_erg.py +0 -0
  189. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_femag.py +0 -0
  190. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_forcedens.py +0 -0
  191. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_fsl.py +0 -0
  192. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_im.py +0 -0
  193. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_isa7.py +0 -0
  194. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_jhb.py +0 -0
  195. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_job.py +0 -0
  196. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_losscoeffs.py +0 -0
  197. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_machine.py +0 -0
  198. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_magncurv.py +0 -0
  199. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_magnet.py +0 -0
  200. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_mcv.py +0 -0
  201. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_mcvreader.py +0 -0
  202. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_mcvwriter.py +0 -0
  203. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_me.py +0 -0
  204. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_model.py +0 -0
  205. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_nc.py +0 -0
  206. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_parident.py +0 -0
  207. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_parstudy.py +0 -0
  208. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_pocfile.py +0 -0
  209. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_sm.py +0 -0
  210. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_tksreader.py +0 -0
  211. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_ts.py +0 -0
  212. {femagtools-1.5.1 → femagtools-1.5.2}/src/tests/test_vbfreader.py +0 -0
  213. {femagtools-1.5.1 → 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.1
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.1'
5
+ __version__ = '1.5.2'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2016-2022 SEMAFOR Informatik & Energie AG'
@@ -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()
@@ -11,8 +11,9 @@ from .. import model
11
11
  from .. import utils
12
12
  from .. import windings
13
13
  from .. import femag
14
- from scipy.interpolate import RegularGridInterpolator, interp1d
14
+ from scipy.interpolate import RegularGridInterpolator, interp1d, RectBivariateSpline
15
15
  from scipy.integrate import quad
16
+ import copy
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
@@ -38,6 +39,50 @@ def _integrate1d(radius, val):
38
39
  return interp((x))
39
40
  return quad(func, radius[0], radius[-1])[0]
40
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()
41
86
 
42
87
  def parident(workdir, engine, temp, machine,
43
88
  magnetizingCurves, magnetMat=[], condMat=[],
@@ -243,6 +288,29 @@ def parident(workdir, engine, temp, machine,
243
288
  (-1, num_beta_steps)).T/np.sqrt(2)
244
289
  psiq = np.reshape([r['psiq'] for r in postp],
245
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
+
246
314
  torque = np.reshape([r['torque'] for r in postp],
247
315
  (-1, num_beta_steps)).T
248
316
  losses = {k: np.flip(np.reshape([r['plfe'][k] for r in postp],
@@ -259,6 +327,7 @@ def parident(workdir, engine, temp, machine,
259
327
  ldq.append({'temperature': magtemp,
260
328
  'i1':i1, 'beta':beta,
261
329
  'psid': psid.tolist(), 'psiq': psiq.tolist(),
330
+ 'ld': ld, 'lq': lq,
262
331
  'torque': torque.tolist(),
263
332
  'losses': losses})
264
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]:
@@ -84,17 +84,16 @@ def _contour(ax, title, elements, values, label='',
84
84
  for n in nc.nodes],
85
85
  color='gray', alpha=0.1, lw=0))
86
86
  valid_values = np.logical_not(np.isnan(values))
87
- patches = np.array([Polygon([v.xy for v in e.vertices])
88
- 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]
89
89
  p = PatchCollection(patches, match_original=False,
90
90
  cmap=cmap, alpha=alpha)
91
91
  p.set_array(np.asarray(values)[valid_values])
92
92
  ax.add_collection(p)
93
93
  cb = plt.colorbar(p, shrink=0.9)
94
94
 
95
- for patch in np.array([Polygon([v.xy for v in e.vertices],
96
- fc='white', alpha=1.0)
97
- 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)]:
98
97
  ax.add_patch(patch)
99
98
  if label:
100
99
  cb.set_label(label=label)
@@ -135,9 +134,10 @@ def demag_pos(isa, pos=-1, icur=-1, ibeta=-1, cmap=DEFAULT_CMAP, ax=0):
135
134
  x = isa.pos_el_fe_induction[i]
136
135
 
137
136
  hpol = demag[:, i]
137
+ hmax = np.max(hpol)
138
138
  hpol[hpol == 0] = np.nan
139
- _contour(ax, f'Demagnetization at pos. {round(x/np.pi*180):.1f}°,'
140
- 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)',
141
141
  emag, hpol, '-H / kA/m', cmap, isa)
142
142
  logger.info("Max demagnetization %f kA/m", np.nanmax(hpol))
143
143
 
@@ -1,9 +1,11 @@
1
1
  """Read FEMAG vtu files
2
2
 
3
3
  """
4
- import vtk
4
+ import logging
5
5
  import pathlib
6
6
  import numpy as np
7
+ import vtk
8
+ from vtkmodules.util.numpy_support import vtk_to_numpy
7
9
 
8
10
 
9
11
  class Reader(object):
@@ -23,11 +25,13 @@ class Reader(object):
23
25
  self.field_data_names = []
24
26
  self.point_data_names = []
25
27
  self.cell_data_names = []
28
+ assert pathlib.Path(pathname).exists(), f"{pathname} not found"
26
29
  if pathlib.Path(pathname).suffix == '.vtu':
27
30
  self.filenames = [pathlib.Path(pathname)]
28
31
  else:
29
32
  self.filenames = sorted(pathlib.Path(pathname).glob(
30
33
  "*.vtu"))
34
+
31
35
  self.reader.SetFileName(str(self.filenames[0]))
32
36
  self.reader.Update()
33
37
  self.field_data_names = [
@@ -181,7 +185,7 @@ class Reader(object):
181
185
  point_vec.append(self.data[pnt_data][i].GetValue(pnt-1))
182
186
  return point_vec
183
187
 
184
- def get_cell_vector(self, cell_data, cell) -> list:
188
+ def get_cell_vector(self, cell_data, cell=0) -> list:
185
189
  '''Read cell data
186
190
 
187
191
  Args:
@@ -195,6 +199,9 @@ class Reader(object):
195
199
  if cell_data not in self.data:
196
200
  self.read_data([cell_data])
197
201
 
202
+ if cell<=0:
203
+ return vtk_to_numpy(
204
+ self.output.GetCellData().GetAbstractArray(cell_data))
198
205
  i = self.cell_data_names.index(cell_data)
199
206
  noc = self.output.GetCellData().GetAbstractArray(i).GetNumberOfComponents()
200
207
  if noc == 1:
@@ -228,12 +235,64 @@ class Reader(object):
228
235
  else:
229
236
  return [cell_vec_x, cell_vec_y, cell_vec_z]
230
237
 
238
+ def hrphi(self, scf, elements, magtemp):
239
+ """return H values for each element in polar coord system
240
+ (experimental)
241
+ Args:
242
+ elements: list of model elements
243
+ magtemp: magnet temperature in degree Celsius
244
+ scf: scale factor (poles/poles in model)
245
+ """
246
+ MUE0 = 4e-7*np.pi
247
+ b = vtk_to_numpy(
248
+ self.output.GetCellData().GetAbstractArray("b"))[:, :2]
249
+ e = elements[0]
250
+ x, y = np.mean(vtk_to_numpy(
251
+ self.output.GetCell(e.key-1).GetPoints().GetData()), axis=0)[:2]
252
+ rotpos = np.arctan2(y, x) - np.arctan2(e.center[1], e.center[0])
253
+ psign = 1 if rotpos / scf > 1 else -1
254
+
255
+ h = np.empty((len(elements), 2))
256
+ for i, e in enumerate(elements):
257
+ x, y = e.center
258
+ alfa = np.arctan2(y, x)
259
+ b1, b2 = b[e.key-1]
260
+ btempc = 1. + e.br_temp_coef*(magtemp - 20.)
261
+ m1 = e.mag[0]*np.cos(alfa) + e.mag[1]*np.sin(alfa)
262
+ m2 = -e.mag[0]*np.sin(alfa) + e.mag[1]*np.cos(alfa)
263
+ h[i] = abs(e.reluc[0])/MUE0*np.array((
264
+ (b1 - psign*btempc*m1), (b2 - psign*btempc*m2)))
265
+ logging.debug("H shape %s", h.shape)
266
+ return h
267
+
268
+
269
+ def demag(self, elements):
270
+ """return demag values for each element in kA/m
271
+ Args:
272
+ elements: list of model elements
273
+ Returns:
274
+ list of demags from each vtu file in set
275
+ """
276
+ dlist = []
277
+ for filename in self.filenames:
278
+ self.reader.SetFileName(str(filename))
279
+ self.reader.Update()
280
+ d = vtk_to_numpy(
281
+ self.output.GetCellData().GetAbstractArray("demagnetization"))
282
+ dm = np.empty((len(elements)))
283
+ for i, e in enumerate(elements):
284
+ dm[i] = d[e.key-1]
285
+ dlist.append(dm)
286
+ logging.debug("Demag shape %s", np.array(dlist).shape)
287
+ return dlist
288
+
289
+
231
290
  def get_data_vector(self, data_name, key=0) -> list:
232
291
  '''Read data of fiels, point or cell
233
292
 
234
293
  Args:
235
294
  data_name : str Name of data to read
236
- hey : int (optional) Key of point or cell
295
+ key : int (optional) Key of point or cell
237
296
 
238
297
  Returns:
239
298
  List of values within the time window
@@ -246,6 +305,16 @@ class Reader(object):
246
305
  return self.get_cell_vector(data_name, key)
247
306
  return []
248
307
 
308
+ def __repr__(self):
309
+ fmt = [f"N Cells {self.output.GetNumberOfCells()} N Points {self.output.GetNumberOfPoints()}"]
310
+ fmt += [
311
+ f"{self.output.GetPointData().GetAbstractArray(i).GetName()} Points"
312
+ for i in range(self.output.GetPointData().GetNumberOfArrays())]
313
+ fmt += [
314
+ f"{self.output.GetCellData().GetAbstractArray(i).GetName()} Cells"
315
+ for i in range(self.output.GetCellData().GetNumberOfArrays())]
316
+ return '\n'.join(fmt)
317
+
249
318
 
250
319
  def read(filename) -> Reader:
251
320
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.5.1
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
@@ -172,6 +172,7 @@ src/tests/test_erg.py
172
172
  src/tests/test_femag.py
173
173
  src/tests/test_forcedens.py
174
174
  src/tests/test_fsl.py
175
+ src/tests/test_hxy.py
175
176
  src/tests/test_im.py
176
177
  src/tests/test_isa7.py
177
178
  src/tests/test_jhb.py
@@ -0,0 +1,19 @@
1
+ import femagtools.hxy
2
+ import pathlib
3
+ import pytest
4
+
5
+
6
+ @pytest.fixture
7
+ def data_dir():
8
+ return pathlib.Path(__file__).with_name('data') / 'hxy'
9
+
10
+
11
+ def test_read(data_dir):
12
+ num_magnets = 2
13
+ magnets = femagtools.hxy.read(data_dir / 'PM270L8_011.hxy',
14
+ num_magnets)
15
+ assert len(magnets) == num_magnets
16
+ assert set([len(m['e'][0]) for m in magnets]) == {169, 189}
17
+ assert [m['pos'][0] for m in magnets] == [0.0, 0.0]
18
+ assert sorted([m['havg'][0] for m in magnets]) == pytest.approx([156.3, 156.5], 0.1)
19
+ assert sorted([m['hmax'][0] for m in magnets]) == pytest.approx([195.6, 304.4], 0.1)
@@ -15,7 +15,7 @@ def test_im():
15
15
  r = femagtools.machine.sizing.im(P, n, p, udc=udc,
16
16
  sigmas=fs, Ba=0.77,
17
17
  cos_phi=0.8, eta=0.8,
18
- lda=0.9)
18
+ lda=0.9, rtype='statorRotor3')
19
19
  assert round(r['outer_diam'], 3) == 0.19
20
20
  assert r['stator']['num_slots'] == 36
21
21
 
@@ -0,0 +1,42 @@
1
+ import pytest
2
+ import pathlib
3
+ from femagtools import vtu
4
+
5
+
6
+ @pytest.fixture
7
+ def ts_data_dir():
8
+ return pathlib.Path(__file__).with_name('data') / 'zzz_pm_model_ts_results_1/'
9
+
10
+ @pytest.fixture
11
+ def demag_data_dir():
12
+ return pathlib.Path(__file__).with_name('data') / 'demag-vtu/'
13
+
14
+
15
+ def test_read(ts_data_dir):
16
+ vtu_data = vtu.read(ts_data_dir / 'zzz_pm_model_ts_0000.vtu')
17
+ assert vtu_data.field_data_names == [
18
+ 'time [s]', 'angle [rad]',
19
+ 'speed [rad/s]', 'torque [Nm]',
20
+ 'winding 1 current [A]', 'winding 1 voltage [V]',
21
+ 'winding 2 current [A]', 'winding 2 voltage [V]',
22
+ 'winding 3 current [A]', 'winding 3 voltage [V]', 'branch names']
23
+ assert vtu_data.point_data_names == ['vector potential']
24
+ assert vtu_data.cell_data_names == [
25
+ 'b', 'curd', 'demagnetization', 'current [A]', 'voltage [V]']
26
+
27
+ b = vtu_data.get_data_vector('b', 1)
28
+ assert b[0] == pytest.approx([-0.003114], abs=1e-5)
29
+ assert b[1] == pytest.approx([-0.00313], abs=1e-5)
30
+ assert b[2] == [0.0]
31
+
32
+ def test_demag(demag_data_dir):
33
+ vtu_data = vtu.read(demag_data_dir / 'PM_130_L10_0000.vtu')
34
+ keys = [7412, 7413, 7414, 7415, 7416]
35
+ class Element:
36
+ def __init__(self, key):
37
+ self.key = key
38
+ elements = [Element(k) for k in keys]
39
+ expected = [241.5, 250.2, 262.3, 276.5, 390.5]
40
+ actual = vtu_data.demag(elements)
41
+ assert len(actual) == 1
42
+ assert actual[0] == pytest.approx(expected, abs=0.1)