femagtools 1.8.5__tar.gz → 1.8.6__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. {femagtools-1.8.5/src/femagtools.egg-info → femagtools-1.8.6}/PKG-INFO +1 -1
  2. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/__init__.py +1 -1
  3. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/bch.py +5 -2
  4. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/area.py +3 -0
  5. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/conv.py +1 -8
  6. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/converter.py +62 -144
  7. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/geom.py +49 -0
  8. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/femag.py +5 -2
  9. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/afpm.py +73 -21
  10. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/multiproc.py +2 -1
  11. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/__init__.py +1 -0
  12. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/bch.py +57 -3
  13. femagtools-1.8.6/src/femagtools/plot/machine.py +100 -0
  14. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/poc.py +10 -0
  15. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/utils.py +2 -0
  16. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/zmq.py +22 -4
  17. {femagtools-1.8.5 → femagtools-1.8.6/src/femagtools.egg-info}/PKG-INFO +1 -1
  18. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools.egg-info/SOURCES.txt +1 -0
  19. {femagtools-1.8.5 → femagtools-1.8.6}/LICENSE +0 -0
  20. {femagtools-1.8.5 → femagtools-1.8.6}/MANIFEST.in +0 -0
  21. {femagtools-1.8.5 → femagtools-1.8.6}/README.md +0 -0
  22. {femagtools-1.8.5 → femagtools-1.8.6}/pyproject.toml +0 -0
  23. {femagtools-1.8.5 → femagtools-1.8.6}/setup.cfg +0 -0
  24. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/airgap.py +0 -0
  25. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/amazon.py +0 -0
  26. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/amela.py +0 -0
  27. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/asm.py +0 -0
  28. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/bchxml.py +0 -0
  29. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/condor.py +0 -0
  30. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/conductor.py +0 -0
  31. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/config.py +0 -0
  32. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/convert.py +0 -0
  33. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dakota.py +0 -0
  34. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dakota_femag.py +0 -0
  35. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dakotaout.py +0 -0
  36. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/docker.py +0 -0
  37. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/__init__.py +0 -0
  38. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/areabuilder.py +0 -0
  39. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/concat.py +0 -0
  40. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/corner.py +0 -0
  41. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  42. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/dxfparser.py +0 -0
  43. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/femparser.py +0 -0
  44. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/fslrenderer.py +0 -0
  45. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/functions.py +0 -0
  46. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/journal.py +0 -0
  47. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/machine.py +0 -0
  48. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  49. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/shape.py +0 -0
  50. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/svgparser.py +0 -0
  51. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/dxfsl/symmetry.py +0 -0
  52. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/ecloss.py +0 -0
  53. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/erg.py +0 -0
  54. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/forcedens.py +0 -0
  55. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/fsl.py +0 -0
  56. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/getset.py +0 -0
  57. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/gmsh.py +0 -0
  58. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/google.py +0 -0
  59. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/grid.py +0 -0
  60. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/heat_source_network.py +0 -0
  61. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/hxy.py +0 -0
  62. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/isa7.py +0 -0
  63. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/jhb.py +0 -0
  64. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/job.py +0 -0
  65. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/losscoeffs.py +0 -0
  66. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/__init__.py +0 -0
  67. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/effloss.py +0 -0
  68. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/im.py +0 -0
  69. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/pm.py +0 -0
  70. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/sizing.py +0 -0
  71. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/sm.py +0 -0
  72. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/machine/utils.py +0 -0
  73. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/magnet.py +0 -0
  74. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/mcv.py +0 -0
  75. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/me.py +0 -0
  76. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/model.py +0 -0
  77. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/__init__.py +0 -0
  78. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/algorithm.py +0 -0
  79. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/population.py +0 -0
  80. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/problem.py +0 -0
  81. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  82. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/test/PopulationTest.py +0 -0
  83. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moo/test/ProblemTest.py +0 -0
  84. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/moproblem.py +0 -0
  85. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/mxw2msh.py +0 -0
  86. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/nc.py +0 -0
  87. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/netlist.py +0 -0
  88. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/ntib.py +0 -0
  89. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/opt.py +0 -0
  90. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/parstudy.py +0 -0
  91. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/char.py +0 -0
  92. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/fieldlines.py +0 -0
  93. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/fluxdens.py +0 -0
  94. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/forcedens.py +0 -0
  95. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/mcv.py +0 -0
  96. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/nc.py +0 -0
  97. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/phasor.py +0 -0
  98. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/plot/wdg.py +0 -0
  99. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/semi_fea.py +0 -0
  100. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/svgfsl/converter.py +0 -0
  101. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/FE-losses.mako +0 -0
  102. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/afm_rotor.mako +0 -0
  103. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/afm_stator.mako +0 -0
  104. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/airgapinduc.mako +0 -0
  105. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/asyn_motor.mako +0 -0
  106. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/basic_modpar.mako +0 -0
  107. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/bertotti.mako +0 -0
  108. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/calc_field_ts.mako +0 -0
  109. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/calc_therm_field.mako +0 -0
  110. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/cogg_calc.mako +0 -0
  111. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/colorgrad.mako +0 -0
  112. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/com_motor_sim.mako +0 -0
  113. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/conduct-data.mako +0 -0
  114. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/connect_models.mako +0 -0
  115. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/cu_losses.mako +0 -0
  116. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  117. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  118. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/fe-contr.mako +0 -0
  119. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/fieldcalc.mako +0 -0
  120. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/gen_hairpin_winding.mako +0 -0
  121. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/gen_winding.mako +0 -0
  122. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/inductances.mako +0 -0
  123. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  124. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  125. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  126. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  127. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnet-data.mako +0 -0
  128. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetFC2.mako +0 -0
  129. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetIron.mako +0 -0
  130. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetIron2.mako +0 -0
  131. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetIron3.mako +0 -0
  132. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetIron4.mako +0 -0
  133. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetIron5.mako +0 -0
  134. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetIronV.mako +0 -0
  135. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetSector.mako +0 -0
  136. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  137. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetShell.mako +0 -0
  138. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/magnetShell2.mako +0 -0
  139. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/mesh-airgap.mako +0 -0
  140. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/modal_analysis.mako +0 -0
  141. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  142. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  143. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/new_model.mako +0 -0
  144. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  145. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/noloadflux.mako +0 -0
  146. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  147. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/open.mako +0 -0
  148. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/plots.mako +0 -0
  149. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  150. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  151. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  152. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/prepare_thermal.mako +0 -0
  153. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  154. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/ring.mako +0 -0
  155. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/rot_hsm.mako +0 -0
  156. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/rotorAsyn.mako +0 -0
  157. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/rotorKs2.mako +0 -0
  158. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/rotor_msh.mako +0 -0
  159. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/rotor_winding.mako +0 -0
  160. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/shortcircuit.mako +0 -0
  161. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/srm.mako +0 -0
  162. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/stator1.mako +0 -0
  163. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/stator2.mako +0 -0
  164. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/stator3Linear.mako +0 -0
  165. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/stator4.mako +0 -0
  166. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/statorBG.mako +0 -0
  167. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/statorRing.mako +0 -0
  168. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/statorRotor3.mako +0 -0
  169. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/stator_msh.mako +0 -0
  170. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/therm-dynamic.mako +0 -0
  171. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/therm_static.mako +0 -0
  172. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/templates/torq_calc.mako +0 -0
  173. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/tks.py +0 -0
  174. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/ts.py +0 -0
  175. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/vbf.py +0 -0
  176. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/vtu.py +0 -0
  177. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools/windings.py +0 -0
  178. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools.egg-info/dependency_links.txt +0 -0
  179. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools.egg-info/entry_points.txt +0 -0
  180. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools.egg-info/requires.txt +0 -0
  181. {femagtools-1.8.5 → femagtools-1.8.6}/src/femagtools.egg-info/top_level.txt +0 -0
  182. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/__init__.py +0 -0
  183. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/engines/__init__.py +0 -0
  184. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/engines/test_amazon.py +0 -0
  185. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/engines/test_config.py +0 -0
  186. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/geom/__init__.py +0 -0
  187. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/geom/test_functions.py +0 -0
  188. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/geom/test_point_inside.py +0 -0
  189. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/moo/__init__.py +0 -0
  190. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/moo/test_algorithm.py +0 -0
  191. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/moo/test_population.py +0 -0
  192. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/moo/test_problem.py +0 -0
  193. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_afpm.py +0 -0
  194. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_airgap_induction.py +0 -0
  195. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_amela.py +0 -0
  196. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_asm.py +0 -0
  197. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_bchreader.py +0 -0
  198. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_conductor.py +0 -0
  199. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_convert.py +0 -0
  200. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_dxfsl.py +0 -0
  201. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_effloss.py +0 -0
  202. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_erg.py +0 -0
  203. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_femag.py +0 -0
  204. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_forcedens.py +0 -0
  205. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_fsl.py +0 -0
  206. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_heat_source_network.py +0 -0
  207. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_hxy.py +0 -0
  208. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_im.py +0 -0
  209. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_isa7.py +0 -0
  210. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_jhb.py +0 -0
  211. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_job.py +0 -0
  212. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_losscoeffs.py +0 -0
  213. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_machine.py +0 -0
  214. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_magncurv.py +0 -0
  215. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_magnet.py +0 -0
  216. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_mcv.py +0 -0
  217. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_mcvreader.py +0 -0
  218. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_me.py +0 -0
  219. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_model.py +0 -0
  220. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_nc.py +0 -0
  221. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_parident.py +0 -0
  222. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_parstudy.py +0 -0
  223. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_pocfile.py +0 -0
  224. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_sizing.py +0 -0
  225. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_sm.py +0 -0
  226. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_tksreader.py +0 -0
  227. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_ts.py +0 -0
  228. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_vbfreader.py +0 -0
  229. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_vtu.py +0 -0
  230. {femagtools-1.8.5 → femagtools-1.8.6}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: femagtools
3
- Version: 1.8.5
3
+ Version: 1.8.6
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.8.5'
5
+ __version__ = '1.8.6'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2024 Gamma Technology'
@@ -618,8 +618,8 @@ class Reader:
618
618
 
619
619
  def __read_peak_winding_currents(self, content):
620
620
  self.scData['peakWindingCurrents'] = [float(x)
621
- for x in re.findall(r'[-0-9.]+',
622
- ''.join(content))]
621
+ for x in self._numPattern.findall(
622
+ ''.join(content))]
623
623
 
624
624
  def __read_general_machine_data(self, content):
625
625
  mcfiles = []
@@ -1771,6 +1771,9 @@ class Reader:
1771
1771
  def __getattr__(self, k):
1772
1772
  return self.__dict__[k]
1773
1773
 
1774
+ def asdict(self):
1775
+ return {k[0]: k[1] for k in self.items()}
1776
+
1774
1777
  def items(self):
1775
1778
  return [(k, self.get(k)) for k in ('version',
1776
1779
  'type',
@@ -435,6 +435,9 @@ class Area(object):
435
435
  self.type == TYPE_WINDINGS or \
436
436
  self.type == TYPE_FD_WINDINGS
437
437
 
438
+ def is_field_winding(self):
439
+ return self.type == TYPE_FD_WINDINGS
440
+
438
441
  def is_magnet(self):
439
442
  return self.type == TYPE_MAGNET_AIRGAP or self.type == TYPE_MAGNET_RECT
440
443
 
@@ -180,12 +180,6 @@ def main():
180
180
  help='create full model (fsl only)',
181
181
  dest='full_model',
182
182
  action="store_true")
183
- argparser.add_argument('--no_processing',
184
- help=(argparse.SUPPRESS if not super_help else
185
- "omit multiprocessing"),
186
- dest='no_processing',
187
- action="store_true",
188
- default=False)
189
183
 
190
184
  args = argparser.parse_args()
191
185
 
@@ -282,8 +276,7 @@ def main():
282
276
  write_id=args.write_id,
283
277
  debug_mode=args.debugger,
284
278
  full_model=args.full_model,
285
- write_journal=args.journal,
286
- no_processing=args.no_processing)
279
+ write_journal=args.journal)
287
280
  keys = ('tot_num_slot', 'num_sl_gen', 'num_poles', 'nodedist',
288
281
  'dy1', 'da1', 'da2', 'dy2', 'agndst', 'name')
289
282
  logger.info("%s", {k: res[k] for k in keys if k in res})
@@ -10,7 +10,7 @@ from femagtools.dxfsl.shape import Shape
10
10
  from femagtools.dxfsl.fslrenderer import FslRenderer, agndst
11
11
  from femagtools.dxfsl.plotrenderer import PlotRenderer
12
12
  from femagtools.dxfsl.concat import Concatenation
13
- from femagtools.dxfsl.functions import Timer, SimpleProcess, middle_angle
13
+ from femagtools.dxfsl.functions import Timer, middle_angle
14
14
  from femagtools.dxfsl.journal import Journal, getJournal
15
15
  from femagtools.dxfsl.area import TYPE_WINDINGS
16
16
  from femagtools.dxfsl.areabuilder import disable_logging, enable_logging
@@ -18,7 +18,6 @@ import logging
18
18
  import logging.config
19
19
  import numpy as np
20
20
  import sys
21
- import multiprocessing
22
21
 
23
22
  logger = logging.getLogger(__name__)
24
23
 
@@ -43,117 +42,6 @@ def plot_geom(doit, plt, geom, title="Plot", areas=True):
43
42
  fill_areas=areas)
44
43
 
45
44
 
46
- class SymSearchProcess(SimpleProcess):
47
- def __init__(self,
48
- name=None,
49
- queue=None,
50
- machine=None,
51
- plt=None, # plotter
52
- kind="",
53
- mindist=0.01,
54
- symtol=0.0,
55
- sympart=0,
56
- is_inner=False,
57
- is_outer=False,
58
- show_plots=True,
59
- debug_mode=False,
60
- rows=1,
61
- cols=1,
62
- num=1,
63
- no_processing=False):
64
- SimpleProcess.__init__(self,
65
- name=name,
66
- no_processing=no_processing)
67
- self.queue = queue
68
- self.mach_in = machine
69
- self.mach_out = None
70
- self.plt = plt
71
- self.kind = kind
72
- self.mindist = mindist
73
- self.symtol = symtol
74
- self.sympart = sympart
75
- self.is_inner = is_inner
76
- self.is_outer = is_outer
77
- self.show_plots = show_plots
78
- self.debug_mode = debug_mode
79
- self.rows = rows
80
- self.cols = cols
81
- self.num = num
82
- pass
83
-
84
- def run(self):
85
- if not self.without_processing():
86
- logger.info("Process is running")
87
- self.plt = None
88
- self.show_plots = False
89
- else:
90
- logger.info("without multiprocessing")
91
-
92
- try:
93
- self.mach_out = symmetry_search(
94
- self.mach_in,
95
- plt=self.plt,
96
- kind=self.kind,
97
- mindist=self.mindist,
98
- symtol=self.symtol,
99
- sympart=self.sympart,
100
- is_inner=self.is_inner,
101
- is_outer=self.is_outer,
102
- show_plots=self.show_plots,
103
- debug_mode=self.debug_mode,
104
- rows=self.rows,
105
- cols=self.cols,
106
- num=self.num)
107
- except Exception as e:
108
- logger.warning("Exception in symmetry_search: %s", e)
109
- if not self.mach_out:
110
- logger.error("NO MACHINE AFTER PROCESS")
111
- self.queue.put(self.mach_out)
112
- if not self.without_processing():
113
- logger.info("Process is finished")
114
-
115
-
116
- class BuildInnerProcess(SimpleProcess):
117
- def __init__(self,
118
- name=None,
119
- queue=None,
120
- machine=None,
121
- mindist=0.01,
122
- plt=None, # plotter
123
- EESM=False,
124
- no_processing=False):
125
- SimpleProcess.__init__(self,
126
- name=name,
127
- no_processing=no_processing)
128
- self.queue = queue
129
- self.mach_in = machine
130
- self.mach_out = None
131
- self.plt = plt
132
- self.mindist = mindist
133
- self.EESM = EESM
134
- pass
135
-
136
- def run(self):
137
- if not self.without_processing():
138
- logger.info("Process is running")
139
- self.plt = None
140
- else:
141
- logger.info("without multiprocessing")
142
-
143
- try:
144
- self.mach_out = build_inner_machine(
145
- self.mach_in,
146
- mindist=self.mindist,
147
- plt=self.plt,
148
- EESM=self.EESM)
149
- except Exception as e:
150
- logger.warning("Exception in symmetry_search: %s", e)
151
-
152
- self.queue.put(self.mach_out)
153
- if not self.without_processing():
154
- logger.info("Process is finished")
155
-
156
-
157
45
  def symmetry_search(machine,
158
46
  plt=None, # plotter
159
47
  kind="single",
@@ -348,6 +236,7 @@ def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
348
236
  title="Final Rotor")
349
237
 
350
238
  t = timer.stop("-- rotor created in %0.4f seconds --")
239
+ journal.put('time_rotor_created', t)
351
240
 
352
241
  logger.debug("End of build_machine_rotor")
353
242
  return machine_temp
@@ -420,6 +309,7 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
420
309
  title="Final Stator")
421
310
 
422
311
  t = timer.stop("-- stator created in %0.4f seconds --")
312
+ journal.put('time_stator_created', t)
423
313
 
424
314
  logger.debug("End of build_machine_stator")
425
315
  return machine_temp
@@ -504,8 +394,7 @@ def convert(dxfile,
504
394
  write_id=False,
505
395
  full_model=False,
506
396
  debug_mode=False,
507
- write_journal=False,
508
- no_processing=False):
397
+ write_journal=False):
509
398
  global journal
510
399
  layers = ()
511
400
  conv = {}
@@ -724,23 +613,19 @@ def convert(dxfile,
724
613
  machine_outer.set_outer()
725
614
 
726
615
  start_timer.stop("-- first part in %0.4f seconds --", info=True)
616
+
727
617
  process_timer = Timer(start_it=True)
728
618
  # inner part
729
- inner_queue = multiprocessing.Queue()
730
- inner_proc = SymSearchProcess(name="Inner", # for logger
731
- queue=inner_queue,
732
- machine=machine_inner,
733
- plt=None, # plot
734
- kind=inner_name,
735
- is_inner=True,
736
- mindist=mindist,
737
- symtol=symtol,
738
- show_plots=show_plots,
739
- rows=3, # rows
740
- cols=2, # columns
741
- num=3, # start num
742
- no_processing=no_processing)
743
- inner_proc.start_task()
619
+ machine_inner = symmetry_search(machine=machine_inner,
620
+ plt=p, # plot
621
+ kind=inner_name,
622
+ is_inner=True,
623
+ mindist=mindist,
624
+ symtol=symtol,
625
+ show_plots=show_plots,
626
+ rows=3, # rows
627
+ cols=2, # columns
628
+ num=3) # start num
744
629
 
745
630
  # outer part
746
631
  machine_outer = symmetry_search(machine_outer,
@@ -754,29 +639,20 @@ def convert(dxfile,
754
639
  cols=2, # columns
755
640
  num=4) # start num
756
641
 
757
- machine_inner = inner_queue.get()
758
- inner_proc.wait()
759
642
  process_timer.stop("-- symmetry search in %0.4f seconds --", info=True)
760
643
 
761
644
  machine_inner.sync_with_counterpart(machine_outer)
762
645
 
763
646
  final_timer = Timer(start_it=True)
764
- inner_queue = multiprocessing.Queue()
765
- inner_proc = BuildInnerProcess(name="Inner", # for logger
766
- queue=inner_queue,
767
- machine=machine_inner,
768
- mindist=mindist,
769
- plt=p,
770
- EESM=EESM,
771
- no_processing=no_processing)
772
- inner_proc.start_task()
647
+ machine_inner = build_inner_machine(machine_inner,
648
+ mindist=mindist,
649
+ plt=p,
650
+ EESM=EESM)
773
651
 
774
652
  machine_outer = build_outer_machine(machine_outer,
775
653
  mindist,
776
654
  p,
777
655
  EESM=EESM)
778
- machine_inner = inner_queue.get()
779
- inner_proc.wait()
780
656
  final_timer.stop("-- final part in %0.4f seconds --", info=True)
781
657
 
782
658
  machine_inner.sync_with_counterpart(machine_outer)
@@ -958,7 +834,7 @@ def convert(dxfile,
958
834
  r_out = 0.0
959
835
  r_in = 0.0
960
836
  if machine.cut_is_possible(r_in, r_out):
961
- logger.info("make a cut")
837
+ logger.debug("make a cut")
962
838
  machine = machine.cut(r_in, r_out)
963
839
 
964
840
  if part:
@@ -1080,6 +956,37 @@ def convert(dxfile,
1080
956
  return conv
1081
957
 
1082
958
 
959
+ def _create_rotor_parameters(machine):
960
+ rotor = {
961
+ 'min_radius': machine.geom.min_radius,
962
+ 'max_radius': machine.geom.max_radius,
963
+ 'mags': machine.geom.magnets_minmax_list(),
964
+ 'fd_wnds': machine.geom.fd_windings_minmax_list()
965
+ }
966
+ shaft_min, shaft_max = machine.geom.shaft_minmax()
967
+ if shaft_max > 0.0:
968
+ rotor['shaft_min'] = shaft_min
969
+ rotor['shaft_max'] = shaft_max
970
+ if shaft_max > rotor['min_radius']:
971
+ rotor['min_radius'] = shaft_max
972
+ return rotor
973
+
974
+
975
+ def _create_stator_parameters(machine):
976
+ stator = {
977
+ 'min_radius': machine.geom.min_radius,
978
+ 'max_radius': machine.geom.max_radius,
979
+ 'wnds': machine.geom.windings_minmax_list()
980
+ }
981
+ shaft_min, shaft_max = machine.geom.shaft_minmax()
982
+ if shaft_max > 0.0:
983
+ stator['shaft_min'] = shaft_min
984
+ stator['shaft_max'] = shaft_max
985
+ if shaft_max > stator['min_radius']:
986
+ stator['min_radius'] = shaft_max
987
+ return stator
988
+
989
+
1083
990
  def create_femag_parameters(m_inner, m_outer, nodedist=1):
1084
991
  if not (m_inner and m_outer):
1085
992
  logger.warning("inner %s outer %s", m_inner, m_outer)
@@ -1122,6 +1029,13 @@ def create_femag_parameters(m_inner, m_outer, nodedist=1):
1122
1029
  params['alfa_slot'] = alfa_slot
1123
1030
  params['alfa_pole'] = alfa_pole
1124
1031
 
1032
+ if m_inner.geom.is_rotor():
1033
+ params['rotor'] = _create_rotor_parameters(m_inner)
1034
+ params['stator'] = _create_stator_parameters(m_outer)
1035
+ else:
1036
+ params['rotor'] = _create_rotor_parameters(m_outer)
1037
+ params['stator'] = _create_stator_parameters(m_inner)
1038
+
1125
1039
  if num_slots == 0 or num_poles == 0:
1126
1040
  if num_slots == 0:
1127
1041
  logger.warning("No slots found")
@@ -1149,6 +1063,8 @@ def create_femag_parameters_stator(motor, position):
1149
1063
  params['dy1'] = 2*motor.geom.max_radius
1150
1064
  params['da1'] = 2*motor.geom.min_radius
1151
1065
  params['slot_area'] = motor.slot_area()
1066
+ params['stator'] = _create_stator_parameters(motor)
1067
+ params['machine'] = motor
1152
1068
  return params
1153
1069
 
1154
1070
 
@@ -1163,4 +1079,6 @@ def create_femag_parameters_rotor(motor, position):
1163
1079
  params['dy1'] = 2*motor.geom.max_radius
1164
1080
  params['da1'] = 2*motor.geom.min_radius
1165
1081
  params['slot_area'] = motor.slot_area()
1082
+ params['rotor'] = _create_rotor_parameters(motor)
1083
+ params['machine'] = motor
1166
1084
  return params
@@ -4528,6 +4528,55 @@ class Geometry(object):
4528
4528
  add_element(e)
4529
4529
  self.area_list += area_list
4530
4530
 
4531
+ def areas_minmax_list(self, area_list):
4532
+ if not area_list:
4533
+ return []
4534
+
4535
+ dist_list = []
4536
+ for n, a in enumerate(area_list):
4537
+ dist_list.append((a.min_dist, a.max_dist, n))
4538
+ dist_list.sort()
4539
+
4540
+ minmax_list = []
4541
+ d1_this, d2_this, n = dist_list [0]
4542
+ for d1_next, d2_next, n in dist_list[1:]:
4543
+ if d1_next > d2_this:
4544
+ minmax_list.append((d1_this, d2_this))
4545
+ d1_this = d1_next
4546
+ d2_this = d2_next
4547
+ else:
4548
+ d2_this = max(d2_this, d2_next)
4549
+ minmax_list.append((d1_this, d2_this))
4550
+ return minmax_list
4551
+
4552
+ def magnets_minmax_list(self):
4553
+ magnets = [a for a in self.list_of_areas()
4554
+ if a.is_magnet()]
4555
+ return self.areas_minmax_list(magnets)
4556
+
4557
+ def windings_minmax_list(self):
4558
+ windings = [a for a in self.list_of_areas()
4559
+ if a.is_winding()]
4560
+ return self.areas_minmax_list(windings)
4561
+
4562
+ def fd_windings_minmax_list(self):
4563
+ windings = [a for a in self.list_of_areas()
4564
+ if a.is_field_winding()]
4565
+ return self.areas_minmax_list(windings)
4566
+
4567
+ def shaft_minmax(self):
4568
+ shafts = [a for a in self.list_of_areas()
4569
+ if a.is_shaft()]
4570
+ if not shafts:
4571
+ return (0.0, 0.0)
4572
+
4573
+ dmin = shafts[0].min_dist
4574
+ dmax = shafts[0].max_dist
4575
+ for s in shafts[1:]:
4576
+ dmin = min(dmin, s.min_dist)
4577
+ dmax = max(dmax, s.max_dist)
4578
+ return (dmin, dmax)
4579
+
4531
4580
  def check_airgap_connecting_nodes(self, geom, startangle, endangle):
4532
4581
  logger.info("check_airgap_connecting_nodes")
4533
4582
 
@@ -802,8 +802,10 @@ class ZmqFemag(BaseFemag):
802
802
  """attaches a notify function"""
803
803
  logger.info("Subscribe on '%s' port %d", self.femaghost, self.port+1)
804
804
  if self.subscriber is None:
805
+ # progress/xyplot at a configured timestep published
806
+ header = [b'progress', b'xyplot', b'license']
805
807
  self.subscriber = femagtools.zmq.SubscriberTask(
806
- port=self.port+1, host=self.femaghost, notify=notify)
808
+ port=self.port+1, host=self.femaghost, notify=notify, header=header)
807
809
  self.subscriber.start()
808
810
  else:
809
811
  # reattach?
@@ -1087,7 +1089,7 @@ class ZmqFemag(BaseFemag):
1087
1089
  response = self.send_request(
1088
1090
  ['CONTROL', f'getfile = {filename}'], timeout=1000)
1089
1091
  return [response[0].decode('latin1'),
1090
- response[1] if len(response) else b'']
1092
+ response[1] if len(response) > 1 else b'']
1091
1093
 
1092
1094
  def exportsvg(self, fslcmds, timeout=10000):
1093
1095
  """get svg format from fsl commands (if any graphic created)
@@ -1156,6 +1158,7 @@ class ZmqFemag(BaseFemag):
1156
1158
  logger.info("Interrupt %s", self.femaghost)
1157
1159
  ctrl.send_string('interrupt')
1158
1160
  ctrl.close()
1161
+ femagtools.zmq.SubscriberTask.clear()
1159
1162
 
1160
1163
  def copy_winding_file(self, name, wdg):
1161
1164
  wdg.write(name, self.workdir)
@@ -15,6 +15,7 @@ from scipy.interpolate import make_interp_spline, RegularGridInterpolator, RectB
15
15
  from scipy.integrate import quad
16
16
  import copy
17
17
  from matplotlib.colors import to_rgb
18
+ from multiprocessing import Pool
18
19
 
19
20
  logger = logging.getLogger(__name__)
20
21
 
@@ -54,7 +55,8 @@ def _integrate(radius, pos, val):
54
55
  interp = RegularGridInterpolator((radius, pos), val)
55
56
  def func(x, y):
56
57
  return interp((x, y))
57
- return [quad(func, radius[0], radius[-1], args=(p,))[0]
58
+ return [quad(func, radius[0], radius[-1],
59
+ args=(p,), limit=200)[0]
58
60
  for p in pos]
59
61
 
60
62
 
@@ -62,7 +64,7 @@ def _integrate1d(radius, val):
62
64
  interp = make_interp_spline(radius, val, k=1)
63
65
  def func(x):
64
66
  return interp((x))
65
- return quad(func, radius[0], radius[-1])[0]
67
+ return quad(func, radius[0], radius[-1], limit=100)[0]
66
68
 
67
69
  def ld_interpol(i1, beta, v):
68
70
  '''interpolate Ld at beta angle 0°, -180°'''
@@ -152,7 +154,17 @@ def parident(workdir, engine, temp, machine,
152
154
  machine[wdgk].get('num_par_wdgs', 1))
153
155
 
154
156
  p = machine['poles']
155
- num_slices = kwargs.get('num_slices', 3)
157
+ if np.isscalar(machine['magnet']['afm_rotor']['rel_magn_width']):
158
+ num_slices = kwargs.get('num_slices', 3)
159
+ rmagw = num_slices*[machine['magnet']['afm_rotor']['rel_magn_width']]
160
+ else:
161
+ rmagw = machine['magnet']['afm_rotor']['rel_magn_width']
162
+ if len(rmagw) == 1:
163
+ num_slices = kwargs.get('num_slices', 3)
164
+ rmagw = num_slices*list(rmagw)
165
+ else:
166
+ num_slices = len(rmagw)
167
+
156
168
  lfe = get_arm_lengths(machine['outer_diam'],
157
169
  machine['inner_diam'],
158
170
  num_slices)
@@ -172,6 +184,8 @@ def parident(workdir, engine, temp, machine,
172
184
  "decision_vars": [
173
185
  {"values": pole_width,
174
186
  "name": "pole_width"},
187
+ {"values": rmagw,
188
+ "name": "magnet.afm_rotor.rel_magn_width"},
175
189
  {"values": lfe,
176
190
  "name": "lfe"},
177
191
  {"values": linspeed, "name": "speed"}
@@ -216,9 +230,11 @@ def parident(workdir, engine, temp, machine,
216
230
  else:
217
231
  nlresults = {"x": [], "f": []}
218
232
  i = 0
219
- for pw, le, sp in zip(pole_width, lfe, linspeed):
233
+
234
+ for pw, le, sp, rmw in zip(pole_width, lfe, linspeed, rmagw):
220
235
  nlmachine = {k: machine[k] for k in machine}
221
236
  nlmachine['pole_width'] = pw
237
+ nlmachine['magnet']['afm_rotor']['rel_magn_width'] = rmw
222
238
  nlmachine['lfe'] = le
223
239
  nlcalc.update({"speed": sp})
224
240
  nlsubdir = f'{workdir}/{i}'
@@ -237,10 +253,11 @@ def parident(workdir, engine, temp, machine,
237
253
  current_angles = nlresults['f'][0]['current_angles']
238
254
  results = []
239
255
  i = 0
240
- for l, pw in zip(lfe, pole_width):
256
+ for l, pw, rmw in zip(lfe, pole_width, rmagw):
241
257
  mpart = {k: machine[k] for k in machine if k != 'afm_rotor'}
242
258
  mpart['pole_width'] = pw
243
259
  mpart['lfe'] = l
260
+ mpart['magnet']['afm_rotor']['rel_magn_width'] = rmw
244
261
  subdir = f"{workdir}/{i}"
245
262
 
246
263
  simulation = dict(
@@ -296,12 +313,23 @@ def parident(workdir, engine, temp, machine,
296
313
  i += 1
297
314
 
298
315
  postp = []
299
- for results in [process(lfe, pole_width, machine, bch)
300
- for bch in zip(*[r['f'] for r in results])]:
301
- torque = np.mean(results.pop('torque'))
302
- results['torque'] = torque
303
- results.update(_psidq_ldq(results, nlresults))
304
- postp.append(results)
316
+ if kwargs.get('use_multiprocessing', True):
317
+ with Pool() as p:
318
+ for r in p.starmap(process,
319
+ [(lfe, pole_width, machine, bch)
320
+ for bch in zip(*[r['f']
321
+ for r in results])]):
322
+ torque = np.mean(r.pop('torque'))
323
+ r['torque'] = torque
324
+ r.update(_psidq_ldq(r, nlresults))
325
+ postp.append(r)
326
+ else:
327
+ for r in [process(lfe, pole_width, machine, bch)
328
+ for bch in zip(*[r['f'] for r in results])]:
329
+ torque = np.mean(r.pop('torque'))
330
+ r['torque'] = torque
331
+ r.update(_psidq_ldq(r, nlresults))
332
+ postp.append(r)
305
333
 
306
334
  r1 = postp[0]['r1']
307
335
  i1 = [r['i1'] for r in postp][::num_beta_steps]
@@ -396,6 +424,7 @@ def process(lfe, pole_width, machine, bch):
396
424
  n = len(rotpos[0])
397
425
  currents = [bch[0]['flux'][k][0]['current_k'][:n]
398
426
  for k in bch[0]['flux']]
427
+
399
428
  if len(pole_width) > 1:
400
429
  # check homogenity:
401
430
  if np.diff([len(d) for d in displ]).any():
@@ -427,6 +456,9 @@ def process(lfe, pole_width, machine, bch):
427
456
  for ux in bch[0]['flux'][k][0]['voltage_dpsi'][:-1]]
428
457
  for k in bch[0]['flux']}
429
458
  emf = [voltage[k][:n] for k in voltage]
459
+ fluxxy = {k: [scale_factor * np.array(flx)
460
+ for flx in bch[0]['flux'][k][0]['flux_k']]
461
+ for k in bch[0]['flux']}
430
462
  flux = [fluxxy[k][:n] for k in fluxxy]
431
463
 
432
464
  pos = (rotpos[0]/np.pi*180)
@@ -485,7 +517,6 @@ def process(lfe, pole_width, machine, bch):
485
517
  except KeyError as exc:
486
518
  #logger.warning("missing key %s", exc)
487
519
  pass
488
-
489
520
  return {
490
521
  'weights': weights.tolist(),
491
522
  'pos': pos.tolist(), 'r1': r1,
@@ -646,13 +677,20 @@ def _draw_vertical_slots(ax,
646
677
  color = _get_colors(color, delta)
647
678
  taus = 2*np.pi/Q
648
679
  for n in range(Q):
649
- beta = np.array([[n*taus+alpha[0], (n+1)*taus-alpha[0]],
650
- [(n+1)*taus-alpha[1], n*taus+alpha[1]]])
651
- ax.fill(np.hstack((r * np.cos(beta[0, 0]),
652
- (r[::-1] * np.cos(beta[0, 1]))))+xoff,
653
- np.hstack((r * np.sin(beta[0, 0]),
654
- (r[::-1] * np.sin(beta[0, 1]))))+yoff,
655
- facecolor=color[0], edgecolor=color[0])
680
+ beta0 = np.linspace(n*taus, n*taus + taus/2-alpha[0], 5)
681
+ beta1 = np.linspace(n*taus, n*taus + taus/2-alpha[1], 5)
682
+ xr = np.concatenate((
683
+ r[0]*np.cos(beta0), r[1]*np.cos(beta1[::-1])))+xoff
684
+ yr = np.concatenate((
685
+ r[0]*np.sin(beta0), r[1]*np.sin(beta1[::-1])))+yoff
686
+ ax.fill(xr, yr, color=color[0])
687
+ beta0 = np.linspace(n*taus + taus/2+alpha[0], (n+1)*taus, 5)
688
+ beta1 = np.linspace(n*taus + taus/2+alpha[1], (n+1)*taus, 5)
689
+ xr = np.concatenate((
690
+ r[0]*np.cos(beta0), r[1]*np.cos(beta1[::-1])))
691
+ yr = np.concatenate((
692
+ r[0]*np.sin(beta0), r[1]*np.sin(beta1[::-1])))
693
+ ax.fill(xr, yr, color=color[0])
656
694
 
657
695
 
658
696
  def vertical_plot(machine, ax):
@@ -669,7 +707,7 @@ def vertical_plot(machine, ax):
669
707
  model_type = machine['afmtype'][0:4]
670
708
  dy1 = machine['outer_diam']*1e3
671
709
  dy2 = machine['inner_diam']*1e3
672
- rel_magn_width = machine['magnet']['afm_rotor']['rel_magn_width']
710
+ rel_magn_width = max(machine['magnet']['afm_rotor']['rel_magn_width'])
673
711
  Q = machine['stator']['num_slots']
674
712
  slot_width = machine['stator']['afm_stator']['slot_width']*1e3
675
713
  poles = machine['poles']
@@ -818,7 +856,7 @@ def horizontal_plot(machine, ax):
818
856
  model_type = machine['afmtype'][0:4]
819
857
  dy1 = machine['outer_diam']*1e3
820
858
  dy2 = machine['inner_diam']*1e3
821
- rel_magn_width = machine['magnet']['afm_rotor']['rel_magn_width']
859
+ rel_magn_width = max(machine['magnet']['afm_rotor']['rel_magn_width'])
822
860
  magn_height = machine['magnet']['afm_rotor']['magn_height']*1e3
823
861
  magn_yoke_height = machine['magnet']['afm_rotor']['yoke_height']*1e3
824
862
 
@@ -911,6 +949,14 @@ class AFPM:
911
949
  except KeyError:
912
950
  raise ValueError("missing key afmtype")
913
951
 
952
+ if np.isscalar(machine['magnet']['afm_rotor']['rel_magn_width']):
953
+ rmagw = num_slices*[machine['magnet']['afm_rotor']['rel_magn_width']]
954
+ else:
955
+ rmagw = machine['magnet']['afm_rotor']['rel_magn_width']
956
+ if len(rmagw) == 1:
957
+ rmagw = num_slices*list(rmagw)
958
+ elif num_slices != len(rmagw):
959
+ num_slices = len(rmagw)
914
960
  lfe = get_arm_lengths(machine['outer_diam'],
915
961
  machine['inner_diam'],
916
962
  num_slices)
@@ -934,11 +980,17 @@ class AFPM:
934
980
  "name": "pole_width"},
935
981
  {"values": lfe,
936
982
  "name": "lfe"},
983
+ {"values": rmagw,
984
+ "name": "magnet.afm_rotor.rel_magn_width"},
937
985
  {"values": linspeed, "name": "speed"}
938
986
  ]
939
987
  }
988
+
940
989
  machine['pole_width'] = np.pi * machine['inner_diam']/machine['poles']
941
990
  machine['lfe'] = machine['outer_diam'] - machine['inner_diam']
991
+ machine['magnet']['afm_rotor']['rel_magn_width'] = max(
992
+ machine['magnet']['afm_rotor']['rel_magn_width'])
993
+
942
994
  simulation['skew_displ'] = (simulation.get('skew_angle', 0)/180 * np.pi
943
995
  * machine['inner_diam'])
944
996
  nlresults = {}