femagtools 1.8.14__tar.gz → 1.8.16__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 (236) hide show
  1. {femagtools-1.8.14/src/femagtools.egg-info → femagtools-1.8.16}/PKG-INFO +1 -1
  2. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/__init__.py +1 -1
  3. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/bch.py +6 -4
  4. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/femag.py +6 -1
  5. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/fsl.py +10 -1
  6. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/isa7.py +39 -7
  7. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/afpm.py +12 -2
  8. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/effloss.py +27 -14
  9. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/im.py +81 -69
  10. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/sm.py +50 -13
  11. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/char.py +12 -5
  12. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/nc.py +9 -0
  13. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/wdg.py +26 -5
  14. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/ec-rotorbar.mako +4 -0
  15. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/statorRing.mako +1 -1
  16. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/torq_calc.mako +4 -0
  17. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/windings.py +32 -14
  18. {femagtools-1.8.14 → femagtools-1.8.16/src/femagtools.egg-info}/PKG-INFO +1 -1
  19. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_effloss.py +1 -1
  20. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_fsl.py +1 -1
  21. femagtools-1.8.16/src/tests/test_im.py +49 -0
  22. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_machine.py +1 -1
  23. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_nc.py +17 -0
  24. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_windings.py +11 -0
  25. femagtools-1.8.14/src/tests/test_im.py +0 -23
  26. {femagtools-1.8.14 → femagtools-1.8.16}/LICENSE +0 -0
  27. {femagtools-1.8.14 → femagtools-1.8.16}/MANIFEST.in +0 -0
  28. {femagtools-1.8.14 → femagtools-1.8.16}/README.md +0 -0
  29. {femagtools-1.8.14 → femagtools-1.8.16}/pyproject.toml +0 -0
  30. {femagtools-1.8.14 → femagtools-1.8.16}/setup.cfg +0 -0
  31. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/airgap.py +0 -0
  32. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/amazon.py +0 -0
  33. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/amela.py +0 -0
  34. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/asm.py +0 -0
  35. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/bchxml.py +0 -0
  36. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/condor.py +0 -0
  37. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/conductor.py +0 -0
  38. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/config.py +0 -0
  39. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/convert.py +0 -0
  40. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dakota.py +0 -0
  41. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dakota_femag.py +0 -0
  42. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dakotaout.py +0 -0
  43. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/docker.py +0 -0
  44. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/__init__.py +0 -0
  45. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/area.py +0 -0
  46. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/areabuilder.py +0 -0
  47. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/concat.py +0 -0
  48. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/conv.py +0 -0
  49. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/converter.py +0 -0
  50. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/corner.py +0 -0
  51. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  52. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/dxfparser.py +0 -0
  53. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/femparser.py +0 -0
  54. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/fslrenderer.py +0 -0
  55. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/functions.py +0 -0
  56. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/geom.py +0 -0
  57. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/journal.py +0 -0
  58. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/machine.py +0 -0
  59. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  60. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/shape.py +0 -0
  61. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/svgparser.py +0 -0
  62. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/dxfsl/symmetry.py +0 -0
  63. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/ecloss.py +0 -0
  64. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/erg.py +0 -0
  65. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/forcedens.py +0 -0
  66. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/getset.py +0 -0
  67. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/gmsh.py +0 -0
  68. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/google.py +0 -0
  69. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/grid.py +0 -0
  70. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/heat_source_network.py +0 -0
  71. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/hxy.py +0 -0
  72. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/jhb.py +0 -0
  73. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/job.py +0 -0
  74. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/leakinduc.py +0 -0
  75. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/losscoeffs.py +0 -0
  76. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/__init__.py +0 -0
  77. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/pm.py +0 -0
  78. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/sizing.py +0 -0
  79. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/machine/utils.py +0 -0
  80. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/magnet.py +0 -0
  81. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/mcv.py +0 -0
  82. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/me.py +0 -0
  83. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/model.py +0 -0
  84. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/__init__.py +0 -0
  85. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/algorithm.py +0 -0
  86. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/population.py +0 -0
  87. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/problem.py +0 -0
  88. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  89. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/test/PopulationTest.py +0 -0
  90. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moo/test/ProblemTest.py +0 -0
  91. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/moproblem.py +0 -0
  92. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/multiproc.py +0 -0
  93. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/mxw2msh.py +0 -0
  94. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/nc.py +0 -0
  95. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/netlist.py +0 -0
  96. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/ntib.py +0 -0
  97. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/opt.py +0 -0
  98. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/parstudy.py +0 -0
  99. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/__init__.py +0 -0
  100. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/bch.py +0 -0
  101. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/fieldlines.py +0 -0
  102. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/fluxdens.py +0 -0
  103. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/forcedens.py +0 -0
  104. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/machine.py +0 -0
  105. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/mcv.py +0 -0
  106. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/plot/phasor.py +0 -0
  107. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/poc.py +0 -0
  108. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/semi_fea.py +0 -0
  109. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/shortcircuit.py +0 -0
  110. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/svgfsl/converter.py +0 -0
  111. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/FE-losses.mako +0 -0
  112. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/afm_rotor.mako +0 -0
  113. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/afm_stator.mako +0 -0
  114. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/airgapinduc.mako +0 -0
  115. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/asyn_motor.mako +0 -0
  116. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/basic_modpar.mako +0 -0
  117. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/bertotti.mako +0 -0
  118. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/calc_field_ts.mako +0 -0
  119. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/calc_therm_field.mako +0 -0
  120. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/cogg_calc.mako +0 -0
  121. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/colorgrad.mako +0 -0
  122. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/com_motor_sim.mako +0 -0
  123. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/conduct-data.mako +0 -0
  124. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/connect_models.mako +0 -0
  125. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/cu_losses.mako +0 -0
  126. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  127. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/fe-contr.mako +0 -0
  128. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/fieldcalc.mako +0 -0
  129. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/gen_hairpin_winding.mako +0 -0
  130. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/gen_winding.mako +0 -0
  131. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/inductances.mako +0 -0
  132. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  133. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  134. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  135. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  136. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnet-data.mako +0 -0
  137. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetFC2.mako +0 -0
  138. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetIron.mako +0 -0
  139. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetIron2.mako +0 -0
  140. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetIron3.mako +0 -0
  141. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetIron4.mako +0 -0
  142. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetIron5.mako +0 -0
  143. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetIronV.mako +0 -0
  144. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetSector.mako +0 -0
  145. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  146. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetShell.mako +0 -0
  147. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/magnetShell2.mako +0 -0
  148. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/mesh-airgap.mako +0 -0
  149. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/modal_analysis.mako +0 -0
  150. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  151. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  152. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/new_model.mako +0 -0
  153. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  154. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/noloadflux.mako +0 -0
  155. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  156. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/open.mako +0 -0
  157. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/plots.mako +0 -0
  158. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  159. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  160. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  161. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/prepare_thermal.mako +0 -0
  162. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  163. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/psi-torq-rem-rot.mako +0 -0
  164. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/psi-torq-rem.mako +0 -0
  165. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/psi-torq-rot.mako +0 -0
  166. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/ring.mako +0 -0
  167. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/rot_hsm.mako +0 -0
  168. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/rotorAsyn.mako +0 -0
  169. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/rotorKs2.mako +0 -0
  170. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/rotor_msh.mako +0 -0
  171. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/rotor_winding.mako +0 -0
  172. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/shortcircuit.mako +0 -0
  173. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/srm.mako +0 -0
  174. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/stator1.mako +0 -0
  175. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/stator2.mako +0 -0
  176. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/stator3Linear.mako +0 -0
  177. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/stator4.mako +0 -0
  178. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/statorBG.mako +0 -0
  179. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/statorRotor3.mako +0 -0
  180. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/stator_msh.mako +0 -0
  181. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/therm-dynamic.mako +0 -0
  182. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/templates/therm_static.mako +0 -0
  183. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/tks.py +0 -0
  184. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/ts.py +0 -0
  185. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/utils.py +0 -0
  186. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/vbf.py +0 -0
  187. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/vtu.py +0 -0
  188. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools/zmq.py +0 -0
  189. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools.egg-info/SOURCES.txt +0 -0
  190. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools.egg-info/dependency_links.txt +0 -0
  191. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools.egg-info/entry_points.txt +0 -0
  192. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools.egg-info/requires.txt +0 -0
  193. {femagtools-1.8.14 → femagtools-1.8.16}/src/femagtools.egg-info/top_level.txt +0 -0
  194. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/__init__.py +0 -0
  195. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/engines/__init__.py +0 -0
  196. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/engines/test_amazon.py +0 -0
  197. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/engines/test_config.py +0 -0
  198. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/geom/__init__.py +0 -0
  199. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/geom/test_functions.py +0 -0
  200. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/geom/test_point_inside.py +0 -0
  201. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/moo/__init__.py +0 -0
  202. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/moo/test_algorithm.py +0 -0
  203. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/moo/test_population.py +0 -0
  204. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/moo/test_problem.py +0 -0
  205. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_afpm.py +0 -0
  206. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_airgap_induction.py +0 -0
  207. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_amela.py +0 -0
  208. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_asm.py +0 -0
  209. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_bchreader.py +0 -0
  210. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_conductor.py +0 -0
  211. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_convert.py +0 -0
  212. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_dxfsl.py +0 -0
  213. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_erg.py +0 -0
  214. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_femag.py +0 -0
  215. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_forcedens.py +0 -0
  216. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_heat_source_network.py +0 -0
  217. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_hxy.py +0 -0
  218. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_isa7.py +0 -0
  219. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_jhb.py +0 -0
  220. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_job.py +0 -0
  221. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_losscoeffs.py +0 -0
  222. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_magncurv.py +0 -0
  223. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_magnet.py +0 -0
  224. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_mcv.py +0 -0
  225. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_mcvreader.py +0 -0
  226. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_me.py +0 -0
  227. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_model.py +0 -0
  228. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_parident.py +0 -0
  229. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_parstudy.py +0 -0
  230. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_pocfile.py +0 -0
  231. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_sizing.py +0 -0
  232. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_sm.py +0 -0
  233. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_tksreader.py +0 -0
  234. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_ts.py +0 -0
  235. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_vbfreader.py +0 -0
  236. {femagtools-1.8.14 → femagtools-1.8.16}/src/tests/test_vtu.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: femagtools
3
- Version: 1.8.14
3
+ Version: 1.8.16
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.14'
5
+ __version__ = '1.8.16'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2025 Gamma Technology'
@@ -420,6 +420,11 @@ class Reader:
420
420
  self.windings[w[0]]['N'].append(w[2])
421
421
  self.windings[w[0]]['R'].append(w[3]/1e3)
422
422
  self.windings[w[0]]['PHI'].append(w[4])
423
+ # check if external rotor
424
+ if hasattr(self, "machine"):
425
+ if "fc_radius" in self.machine:
426
+ if np.mean(self.windings[1]["R"]) < self.machine["fc_radius"]:
427
+ self.external_rotor = True
423
428
 
424
429
  def __read_winding_factors(self, content):
425
430
  "read winding factors section"
@@ -1202,10 +1207,7 @@ class Reader:
1202
1207
  m = []
1203
1208
  subregs = [name.split()[-1]
1204
1209
  for name in content[2].split('\t') if name][2:]
1205
- # outer rotor motor
1206
- if 'Iron' in subregs and \
1207
- 'Rotor' in subregs:
1208
- self.external_rotor = True
1210
+
1209
1211
  logger.info("Stator Subregions: %s", subregs)
1210
1212
  speed = float(content[0].split()[-1])/60.
1211
1213
  logger.info('losses for speed %f', speed)
@@ -153,7 +153,7 @@ class BaseFemag(object):
153
153
  dest = dir if dir else self.workdir
154
154
  if isinstance(feloss, (int, float)):
155
155
  try:
156
- feloss = {1: 'jordan', 11: 'bertotti'}[int(feloss)]
156
+ feloss = {1: 'jordan', 2: "steinmetz", 10:"modified steinmetz", 11: 'bertotti'}[int(feloss)]
157
157
  except KeyError:
158
158
  feloss = ''
159
159
  return [self.magnetizingCurves.writefile(m[0], dest,
@@ -188,6 +188,11 @@ class BaseFemag(object):
188
188
  recsin = simulation.get('recsin', '')
189
189
  feloss = simulation.get('calc_fe_loss', '')
190
190
  self.copy_magnetizing_curves(self.model, recsin=recsin, feloss=feloss)
191
+
192
+ if feloss and \
193
+ int(feloss) in (1, 2):
194
+ simulation["calc_fe_loss"] = 1
195
+
191
196
  try:
192
197
  if 'wdgdef' in self.model.winding:
193
198
  self.model.winding['wdgfile'] = self.create_wdg_def(
@@ -23,6 +23,15 @@ def cosys(model):
23
23
  return 'cosys("polar")'
24
24
  return 'cosys("cartes")'
25
25
 
26
+ class MaterialCollection:
27
+ def __init__(self, materials):
28
+ self.materials = materials
29
+
30
+ def find(self, name):
31
+ for mat in self.materials:
32
+ if mat['name'] == name:
33
+ return mat
34
+ return None
26
35
 
27
36
  class Builder:
28
37
  def __init__(self, templatedirs=[]):
@@ -922,4 +931,4 @@ class Builder:
922
931
  content='\n'.join(content),
923
932
  type='fsl',
924
933
  content_template='\n'.join(content_template),
925
- parameter=parameter)
934
+ parameter=parameter)
@@ -921,7 +921,7 @@ class Isa7(object):
921
921
  else:
922
922
  flx_fac = 1
923
923
  el_fe_ind = [np.array(reader.el_fe_induction_1).T/flx_fac,
924
- np.array(reader.el_fe_induction_2).T/flx_fac]
924
+ np.array(reader.el_fe_induction_2).T/flx_fac]
925
925
  eddy_cu_vpot = np.array(reader.eddy_cu_vpot).T/1000
926
926
  if len(el_fe_ind[0].shape) == 4:
927
927
  pdim = self.pos_el_fe_induction.shape[0]
@@ -1051,12 +1051,9 @@ class Isa7(object):
1051
1051
  slf = 1 #self.PS_FILFACTOR_CU[r]
1052
1052
  self.mass[r]['conductors'] += scf*se.area()*self.arm_length*spw*l*slf
1053
1053
  for se in self.superelements:
1054
- winding_detected=0
1055
- lamination_detected=0
1056
1054
  r = 0 if se.outside else 1
1057
1055
  if se.subregion:
1058
1056
  if se.subregion.winding:
1059
- winding_detected=1
1060
1057
  spw = self.CU_SPEZ_WEIGHT*1e3
1061
1058
  l = self.PS_LENGTH_CU[r]*1e-2
1062
1059
  slf = self.PS_FILFACTOR_CU[r]
@@ -1064,7 +1061,6 @@ class Isa7(object):
1064
1061
  continue
1065
1062
 
1066
1063
  if se.mcvtype or se.elements[0].is_lamination():
1067
- lamination_detected=1
1068
1064
  try:
1069
1065
  spw = self.iron_loss_coefficients[se.mcvtype-1][
1070
1066
  'spec_weight']*1e3 # kg/m³
@@ -1096,7 +1092,8 @@ class Isa7(object):
1096
1092
 
1097
1093
  """
1098
1094
  return [sr.name for sr in self.subregions
1099
- if sr.superelements[0].mcvtype or sr.superelements[0].elements[0].is_lamination()]
1095
+ if (sr.superelements[0].mcvtype or
1096
+ sr.superelements[0].elements[0].is_lamination())]
1100
1097
 
1101
1098
  def _axis_ratio(self, apos, br, bt):
1102
1099
  from .utils import fft
@@ -1399,6 +1396,23 @@ class Isa7(object):
1399
1396
  bxy.append(Trot(-theta).dot((fd['bx'], fd['by'])))
1400
1397
  return transform_flux_density(se.alpha, np.array(bxy))
1401
1398
 
1399
+ def lamination_border(self):
1400
+ """return xy coordinates of lamination border nodes"""
1401
+ bnodes = []
1402
+ for sr in self.get_iron_subregions():
1403
+ #bnodes += self.get_subregion(sr).border_node_keys()
1404
+ bnodes += self.get_subregion(sr).nonper_border_nodes()[1]
1405
+ keys, unique_counts = np.unique(bnodes, return_counts=True)
1406
+
1407
+ return np.array([self.nodes[k-1].xy
1408
+ for k, c in zip(keys, unique_counts) if c == 1])
1409
+
1410
+ def punchdist(self):
1411
+ """ return lamination elements with punching border distance"""
1412
+ elam = [e for e in self.elements if e.is_lamination()]
1413
+ bnodes = self.lamination_border()
1414
+ return elam, np.array([e.punchdist(bnodes) for e in elam])
1415
+
1402
1416
  class Point(object):
1403
1417
  def __init__(self, x, y):
1404
1418
  self.x = x
@@ -1495,7 +1509,8 @@ class Element(BaseEntity):
1495
1509
  [v.xy for v in vertices], axis=0)/len(vertices)
1496
1510
 
1497
1511
  def flux_density(self, cosys='cartes'):
1498
- """return flux density components of this element converted to cosys: cartes, cylind, polar"""
1512
+ """return flux density components of this element converted
1513
+ to cosys: cartes, cylind, polar"""
1499
1514
  ev = self.vertices
1500
1515
  b1, b2 = 0, 0
1501
1516
  if self.el_type == ElType.LinearTriangle:
@@ -1621,6 +1636,16 @@ class Element(BaseEntity):
1621
1636
  """return temperature of this element"""
1622
1637
  return sum([v.vpot[1] for v in self.vertices])/len(self.vertices)
1623
1638
 
1639
+ def punchdist(self, bnodes):
1640
+ """return dist to punching border"""
1641
+ try:
1642
+ if self.is_lamination():
1643
+ return np.min(np.linalg.norm(bnodes-self.center,
1644
+ axis=1))
1645
+ except AttributeError:
1646
+ pass
1647
+ return np.nan
1648
+
1624
1649
 
1625
1650
  class SuperElement(BaseEntity):
1626
1651
  def __init__(self, key, sr_key, elements, nodechains, color,
@@ -1704,6 +1729,7 @@ class SubRegion(BaseEntity):
1704
1729
  for se in superelements:
1705
1730
  se.subregion = self
1706
1731
  self.nodechains = nodechains
1732
+ self._border = []
1707
1733
 
1708
1734
  def elements(self):
1709
1735
  """return elements of this subregion"""
@@ -1716,6 +1742,12 @@ class SubRegion(BaseEntity):
1716
1742
  """return area of this subregion"""
1717
1743
  return sum([e.area for e in self.elements()])
1718
1744
 
1745
+ def nonper_border_nodes(self):
1746
+ """return border nodes with non-periodic boundary condition"""
1747
+ return (np.array([n.xy for nc in self.nodechains
1748
+ for n in nc.nodes if n.pernod == 0]),
1749
+ set([n.key for nc in self.nodechains
1750
+ for n in nc.nodes if n.pernod == 0]))
1719
1751
 
1720
1752
  class Winding(BaseEntity):
1721
1753
  def __init__(self, key, name, subregions, num_turns, cur_re, cur_im,
@@ -213,6 +213,9 @@ def parident(workdir, engine, temp, machine,
213
213
  if np.isscalar(machine['magnet'][slotmodel]['rel_magn_width']):
214
214
  num_slices = kwargs.get('num_slices', 3)
215
215
  rmagw = num_slices*[machine['magnet'][slotmodel]['rel_magn_width']]
216
+ elif len(machine['magnet'][slotmodel]['rel_magn_width']) == 1:
217
+ num_slices = kwargs.get('num_slices', 3)
218
+ rmagw = num_slices*machine['magnet'][slotmodel]['rel_magn_width']
216
219
  else:
217
220
  rmagw = machine['magnet'][slotmodel]['rel_magn_width']
218
221
  num_slices = len(rmagw)
@@ -543,13 +546,18 @@ def process(lfe, pole_width, machine, bch):
543
546
  nsegx = machine['magnet'].get('num_segments', 1)
544
547
  if type(nsegx) == int:
545
548
  nsegx = [nsegx]*len(bch)
549
+ elif len(nsegx) == 1 and len(nsegx) < len(bch):
550
+ nsegx = nsegx*len(bch)
551
+ else:
552
+ pass
546
553
  for nx, b in zip(nsegx, bch):
547
554
  pm = b['losses'][0]['magnet_data']
548
555
  magloss = ecloss.MagnLoss(magnet_data=[pm])
549
556
  ml = magloss.calc_losses_ialh2(nsegx=nx)
550
- b['losses'][-1][k] = ml[0]
557
+ b["losses"][-1].update({k: ml[0]})
551
558
  else:
552
559
  k = 'magnetJ'
560
+
553
561
  if len(pole_width) > 1:
554
562
  maglosses = _integrate1d(radius, scale_factor*np.array(
555
563
  [b['losses'][-1][k]/lz
@@ -1025,7 +1033,9 @@ class AFPM:
1025
1033
  machine['magnet'][slotmodel]['rel_magn_width'])
1026
1034
  if np.isscalar(machine['magnet'][slotmodel]['rel_magn_width']):
1027
1035
  rmagw = num_slices*[machine['magnet'][slotmodel]['rel_magn_width']]
1028
- else:
1036
+ elif len(machine['magnet'][slotmodel]['rel_magn_width']) == 1:
1037
+ rmagw = num_slices*machine['magnet'][slotmodel]['rel_magn_width']
1038
+ else:
1029
1039
  rmagw = machine['magnet'][slotmodel]['rel_magn_width']
1030
1040
  num_slices = len(rmagw)
1031
1041
 
@@ -79,7 +79,11 @@ def iqd_tmech_umax_multi(num_proc, ntmesh, m, u1, with_mtpa, with_tmech,
79
79
  while progress_readers:
80
80
  for r in multiprocessing.connection.wait(progress_readers):
81
81
  try:
82
- collected_msg.append(r.recv())
82
+ #collected_msg.append(r.recv())
83
+ ret = r.recv()
84
+ if isinstance(ret, Exception):
85
+ raise ret
86
+ collected_msg.append(ret)
83
87
  i += 1
84
88
  except EOFError:
85
89
  progress_readers.remove(r)
@@ -263,10 +267,11 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
263
267
  if isinstance(m, (SynchronousMachineLdq, SynchronousMachinePsidq)):
264
268
  iq, id, iex = m.iqd_torque(T[-1])
265
269
  i1max = betai1(iq, id)[1]
266
- w1type, tmax = m.w1_imax_umax(i1max, u1)
270
+ w1type, tmax = m.w1_imax_umax(i1max, u1)
267
271
  pmax = tmax*w1type/m.p
268
272
  else:
269
273
  iq, id = m.iqd_torque(T[-1])
274
+ w1type, tmax = m.w1_imax_umax(betai1(iq, id)[1], u1)
270
275
 
271
276
  i1max = betai1(iq, id)[1]
272
277
  logger.info("%s %s", n, T)
@@ -274,16 +279,19 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
274
279
  w1 = 2*np.pi*nx*m.p
275
280
  if isinstance(m, (SynchronousMachineLdq, SynchronousMachinePsidq)):
276
281
  tq = T[-1]
277
- if tq*w1/m.p > pmax:
282
+ if tq*w1/m.p > pmax:
278
283
  tq = pmax/w1*m.p
279
284
  else:
280
- iq, id, tq = m.iqd_imax_umax(i1max, w1, u1, T[-1],
281
- with_tmech=with_tmech,
282
- with_mtpa=with_mtpa)
285
+ if w1 <= w1type:
286
+ tq = tmax
287
+ else:
288
+ iq, id, tq = m.iqd_imax_umax(i1max, w1, u1, T[-1],
289
+ with_tmech=with_tmech,
290
+ with_mtpa=with_mtpa)
283
291
  if np.isclose(tq, T[-1]):
284
292
  tq = T[-1]
285
293
  for Tx in T:
286
- if Tx <= tq:
294
+ if np.abs(Tx) <= tq:
287
295
  nt.append((nx, Tx))
288
296
  if not nt:
289
297
  raise ValueError("Speed, Torque Mesh is empty")
@@ -339,7 +347,7 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
339
347
  else:
340
348
  f1 = []
341
349
  u1max = u1
342
- r = dict(u1=[], i1=[], plfe1=[], plcu1=[], plcu2=[])
350
+ r = dict(u1=[], i1=[], plfe1=[], plcu1=[], plcu2=[], plcu1_dc=[], plcu1_ac=[])
343
351
  for nx, tq in ntmesh.T:
344
352
  wm = 2*np.pi*nx
345
353
  w1 = m.w1(u1max, m.psiref, tq, wm)
@@ -352,7 +360,9 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
352
360
  i2 = m.i2(w1, m.psi, wm)
353
361
  r['plcu1'].append(m.m*np.abs(i1)**2*m.rstat(w1))
354
362
  r['plcu2'].append(m.m*np.abs(i2)**2*m.rrot(w1-m.p*wm))
355
-
363
+ plcu_dc = m.m*np.abs(i1)**2*m.rstat(0)
364
+ r['plcu1_dc'].append(plcu_dc)
365
+ r['plcu1_ac'].append(m.m*np.abs(i1)**2*m.rstat(w1)-plcu_dc)
356
366
  if isinstance(m, PmRelMachine):
357
367
  plfe1 = m.kpfe*m.iqd_plfe1(*iqd, f1)
358
368
  plfe2 = m.kpfe*m.iqd_plfe2(iqd[0], iqd[1], f1)
@@ -370,7 +380,7 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
370
380
  plfe1 = m.kpfe*m.iqd_plfe1(*iqd, f1)
371
381
  plfe2 = m.kpfe*m.iqd_plfe2(*iqd, f1)
372
382
  plmag = np.zeros_like(plfe2)
373
- plcu1 = m.iqd_plcu1(iqd[0], iqd[1], 2*np.pi*f1)
383
+ plcu1 = m.iqd_plcu1(iqd[0], iqd[1], f1)
374
384
  try:
375
385
  plcu1_dc = m.iqd_plcu1(iqd[0], iqd[1],
376
386
  np.array([0.0 for i in f1])).tolist()
@@ -388,19 +398,22 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
388
398
  plmag = np.zeros(ntmesh.shape[1])
389
399
  plcu1 = np.array(r['plcu1'])
390
400
  plcu2 = np.array(r['plcu2'])
391
- plcu1_dc = [] # reserved for winding (dc, ac) losses
392
- plcu1_ac = []
401
+ plcu1_dc = r['plcu1_dc'] # [] # reserved for winding (dc, ac) losses
402
+ plcu1_ac = r['plcu1_ac'] #[]
393
403
  iqd = np.zeros(ntmesh.shape)
394
404
  u1 = np.array(r['u1'])
395
405
  i1 = np.array(r['i1'])
406
+
407
+
396
408
  try:
397
409
  if isinstance(eecpars, dict):
398
410
  tfric = eecpars['kfric_b']*eecpars['rotor_mass']*30e-3/np.pi
411
+ if 'tfric' in eecpars: # to get the user setted value (possible in IM)
412
+ tfric=eecpars['tfric']
399
413
  else:
400
414
  tfric = m.tfric
401
415
  except KeyError:
402
416
  tfric = 0
403
-
404
417
  plfric = 2*np.pi*ntmesh[0]*tfric
405
418
  if not with_tmech:
406
419
  ntmesh[1] -= tfric
@@ -437,4 +450,4 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
437
450
  plfric=plfric.tolist(),
438
451
  losses=ploss.tolist(),
439
452
  plcu1_dc=plcu1_dc,
440
- plcu1_ac=plcu1_ac)
453
+ plcu1_ac=plcu1_ac)
@@ -198,7 +198,9 @@ class InductionMachine(Component):
198
198
 
199
199
  def lstat(self, w):
200
200
  """stator leakage inductance"""
201
- return self.lsigma1
201
+ # we add end-winding inductance here
202
+ le_value = getattr(self, 'le', 0)
203
+ return self.lsigma1 + le_value
202
204
 
203
205
  def rrot(self, w):
204
206
  """rotor resistance"""
@@ -485,77 +487,81 @@ class InductionMachine(Component):
485
487
  """
486
488
  with_tmech = kwargs.get('with_tmech', True)
487
489
 
488
- wmType = self.wmfweak(u1max, self.psiref, T, with_tmech)
489
- pmmax = wmType*T
490
- wmPullout = so.fsolve(
491
- lambda wx: (kpo*self.pullouttorque(self.p *
492
- wx, u1max) - abs(pmmax/wx)),
493
- wmType)[0]
494
- wmtab0 = np.linspace(wmType, 3*wmPullout)
495
- for wm, tq in zip(wmtab0, [pmmax/wx for wx in wmtab0]):
496
- logger.debug("u1 %g psi %g tq %g wm %g",
497
- u1max, self.psiref, tq, wm)
498
- try:
499
- w1 = self.w1(u1max, self.psiref, tq, wm, with_tmech)
500
- except ValueError:
501
- wmPullout = wm
502
- break
503
- wmMax = max(1.5*wmPullout, 3*abs(pmmax/T))
504
- if n:
505
- wmMax = 2*np.pi*n
506
- if wmMax > wmPullout:
507
- wmtab0 = np.linspace(wmPullout, wmMax)
508
- for wm, tq in zip(wmtab0, [pmmax/wx**2
509
- for wx in wmtab0]):
490
+ if np.isscalar(T):
491
+ wmType = self.wmfweak(u1max, self.psiref, T, with_tmech)
492
+ logger.info(wmType)
493
+ pmmax = wmType*T
494
+ wmPullout = so.fsolve(
495
+ lambda wx: (kpo*self.pullouttorque(self.p *
496
+ wx, u1max) - abs(pmmax/wx)),
497
+ wmType)[0]
498
+ wmtab0 = np.linspace(wmType, 3*wmPullout)
499
+ for wm, tq in zip(wmtab0, [pmmax/wx for wx in wmtab0]):
510
500
  logger.debug("u1 %g psi %g tq %g wm %g",
511
- u1max, self.psiref, tq, wm)
501
+ u1max, self.psiref, tq, wm)
512
502
  try:
513
503
  w1 = self.w1(u1max, self.psiref, tq, wm, with_tmech)
514
504
  except ValueError:
515
- wmMax = wm
505
+ wmPullout = wm
516
506
  break
517
-
518
- logger.info("wmtype %f wpo %f wmmax %f", wmType, wmPullout, wmMax)
519
-
520
- if wmType < wmPullout < wmMax:
521
- wmrange = sorted([0, wmType, wmPullout, wmMax])
522
- elif wmMax < wmType:
523
- wmrange = sorted([0, wmMax])
524
- elif wmType<0 or wmPullout<0 or wmMax<0:
525
- wmrange = sorted([1, abs(min(wmMax,wmType, wmPullout)), abs(max(wmMax,wmType, wmPullout))])
526
- else:
527
- wmrange = sorted([0, wmType, wmMax])
528
- logger.info("Speed range %s", wmrange)
529
- wmlin = []
530
- dw = 0
531
- for i, nx in enumerate([round(nsamples*(w1-w0)/wmMax)
532
- for w1, w0 in zip(wmrange[1:],
533
- wmrange)]):
534
- if nx == 1:
535
- nx = 2
536
- if nx > 0:
537
- lw = np.linspace(wmrange[i]+dw, wmrange[i+1], nx)
538
- dw = lw[-1] - lw[-2]
539
- wmlin.append(lw)
540
- if len(wmlin) > 1:
541
- wmtab = np.concatenate(wmlin)
542
- else:
543
- wmtab = wmlin[1:]
544
-
545
- def tload2(wm):
546
- if wm < wmType and wm < wmPullout:
547
- return T
548
- if wm < wmPullout:
507
+ wmMax = max(1.5*wmPullout, 3*abs(pmmax/T))
508
+ if n:
509
+ wmMax = 2*np.pi*n
510
+ if wmMax > wmPullout:
511
+ wmtab0 = np.linspace(wmPullout, wmMax)
512
+ for wm, tq in zip(wmtab0, [pmmax/wx**2
513
+ for wx in wmtab0]):
514
+ logger.debug("u1 %g psi %g tq %g wm %g",
515
+ u1max, self.psiref, tq, wm)
516
+ try:
517
+ w1 = self.w1(u1max, self.psiref, tq, wm, with_tmech)
518
+ except ValueError:
519
+ wmMax = wm
520
+ break
521
+
522
+ logger.info("wmtype %f wpo %f wmmax %f", wmType, wmPullout, wmMax)
523
+
524
+ if wmType < wmPullout < wmMax:
525
+ wmrange = sorted([0, wmType, wmPullout, wmMax])
526
+ elif wmMax < wmType:
527
+ wmrange = sorted([0, wmMax])
528
+ elif wmType<0 or wmPullout<0 or wmMax<0:
529
+ wmrange = sorted([1, abs(min(wmMax,wmType, wmPullout)), abs(max(wmMax,wmType, wmPullout))])
530
+ else:
531
+ wmrange = sorted([0, wmType, wmMax])
532
+ logger.info("Speed range %s", wmrange)
533
+ wmlin = []
534
+ dw = 0
535
+ for i, nx in enumerate([round(nsamples*(w1-w0)/wmMax)
536
+ for w1, w0 in zip(wmrange[1:],
537
+ wmrange)]):
538
+ if nx == 1:
539
+ nx = 2
540
+ if nx > 0:
541
+ lw = np.linspace(wmrange[i]+dw, wmrange[i+1], nx)
542
+ dw = lw[-1] - lw[-2]
543
+ wmlin.append(lw)
544
+ if len(wmlin) > 1:
545
+ wmtab = np.concatenate(wmlin)
546
+ else:
547
+ wmtab = wmlin[1:]
548
+
549
+ def tload2(wm):
550
+ if wm < wmType and wm < wmPullout:
551
+ return T
552
+ if wm < wmPullout:
553
+ if pmmax < 0:
554
+ return max(T, pmmax/wm)
555
+ return min(T, pmmax/wm)
549
556
  if pmmax < 0:
550
- return max(T, pmmax/wm)
551
- return min(T, pmmax/wm)
552
- if pmmax < 0:
553
- return max(wmPullout*pmmax/wm**2, T)
554
- return min(wmPullout*pmmax/wm**2, T)
557
+ return max(wmPullout*pmmax/wm**2, T)
558
+ return min(wmPullout*pmmax/wm**2, T)
555
559
 
560
+ T = [tload2(wx) for wx in wmtab]
561
+ else:
562
+ wmtab = n
556
563
  r = dict(u1=[], i1=[], T=[], cosphi=[], n=[], s=[], sk=[],
557
- plfe1=[], plcu1=[], plcu2=[], f1=[])
558
- T = [tload2(wx) for wx in wmtab]
564
+ plfe1=[], plcu1=[], plcu2=[], f1=[])
559
565
  tfric = self.tfric
560
566
  with warnings.catch_warnings():
561
567
  warnings.simplefilter("ignore")
@@ -582,7 +588,8 @@ class InductionMachine(Component):
582
588
  r['s'].append(float((w1 - self.p * wm) / w1))
583
589
  r['sk'].append(self.sk(w1, np.abs(u1)/w1))
584
590
  # add n_type to result dict
585
- r['n_type'] = wmType/2/np.pi
591
+ if np.isscalar(T):
592
+ r['n_type'] = wmType/2/np.pi
586
593
  # except ValueError as ex:
587
594
  # break
588
595
  r['plfw'] = [self.pfric(n) for n in r['n']]
@@ -863,9 +870,11 @@ def parident(workdir, engine, f1, u1, wdgcon,
863
870
  # TODO: sigma = 58e6
864
871
  # if 'material' in machine[wdgk]:
865
872
  # sigma = condMat[machine[wdgk]]['elconduct']
873
+ if 'material' in m['windings']:
874
+ sigma = m['windings']['cuconduct']
866
875
  g = loadsim['num_par_wdgs']
867
876
  r1 = wdg_resistance(
868
- wdg, n, g, aw, da1, hs, lfe)
877
+ wdg, n, g, aw, da1, hs, lfe, sigma=sigma)
869
878
 
870
879
  # psi1 = ip.interp1d(i1_0, np.mean(psi1_0, axis=1),
871
880
  # kind='quadratic')
@@ -910,7 +919,7 @@ def parident(workdir, engine, f1, u1, wdgcon,
910
919
  # ls2 = results[1]['ls2']
911
920
  pfe = results[2]['pfe1'][0]
912
921
 
913
- end_ring_section = machine['rotor']['Aring']
922
+ end_ring_section = machine['rotor'].get('Aring', 0)
914
923
  bore_diam = machine['bore_diam']
915
924
  for key, value in machine['rotor'].items():
916
925
  if isinstance(value, dict) and 'slot_height' in value:
@@ -957,12 +966,15 @@ def parident(workdir, engine, f1, u1, wdgcon,
957
966
  wmat = machine[wdgk]['material']
958
967
  impars['kth1'] = parstudy.femag.condMat.find(wmat)['tempcoef']
959
968
  except KeyError:
960
- logger.warning('Missing winding material id')
969
+ logger.warning('Missing winding material id for stator')
970
+ for mat in condMat:
971
+ if mat['name'] == 'Cu': #as Copper is used as default (cf r1 and wdg_resistance)
972
+ impars['kth1'] = mat['tempcoef']
961
973
  try:
962
974
  bmat = machine['rotor']['material']
963
975
  impars['kth2'] = parstudy.femag.condMat.find(bmat)['tempcoef']
964
976
  except KeyError:
965
- logger.warning('Missing winding material id')
977
+ logger.warning('Missing winding material id for rotor')
966
978
 
967
979
  return impars
968
980