femagtools 1.8.15__tar.gz → 1.8.17__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.15/src/femagtools.egg-info → femagtools-1.8.17}/PKG-INFO +1 -1
  2. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/__init__.py +1 -1
  3. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/area.py +17 -0
  4. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/converter.py +16 -4
  5. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/fslrenderer.py +2 -2
  6. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/geom.py +38 -19
  7. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/machine.py +10 -0
  8. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/fsl.py +10 -1
  9. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/isa7.py +39 -7
  10. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/effloss.py +26 -13
  11. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/im.py +81 -69
  12. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/sm.py +50 -13
  13. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/char.py +12 -5
  14. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/nc.py +9 -0
  15. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/ec-rotorbar.mako +4 -0
  16. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/statorRing.mako +1 -1
  17. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/torq_calc.mako +4 -0
  18. {femagtools-1.8.15 → femagtools-1.8.17/src/femagtools.egg-info}/PKG-INFO +1 -1
  19. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_effloss.py +1 -1
  20. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_fsl.py +1 -1
  21. femagtools-1.8.17/src/tests/test_im.py +49 -0
  22. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_machine.py +1 -1
  23. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_nc.py +17 -0
  24. femagtools-1.8.15/src/tests/test_im.py +0 -23
  25. {femagtools-1.8.15 → femagtools-1.8.17}/LICENSE +0 -0
  26. {femagtools-1.8.15 → femagtools-1.8.17}/MANIFEST.in +0 -0
  27. {femagtools-1.8.15 → femagtools-1.8.17}/README.md +0 -0
  28. {femagtools-1.8.15 → femagtools-1.8.17}/pyproject.toml +0 -0
  29. {femagtools-1.8.15 → femagtools-1.8.17}/setup.cfg +0 -0
  30. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/airgap.py +0 -0
  31. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/amazon.py +0 -0
  32. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/amela.py +0 -0
  33. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/asm.py +0 -0
  34. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/bch.py +0 -0
  35. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/bchxml.py +0 -0
  36. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/condor.py +0 -0
  37. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/conductor.py +0 -0
  38. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/config.py +0 -0
  39. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/convert.py +0 -0
  40. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dakota.py +0 -0
  41. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dakota_femag.py +0 -0
  42. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dakotaout.py +0 -0
  43. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/docker.py +0 -0
  44. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/__init__.py +0 -0
  45. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/areabuilder.py +0 -0
  46. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/concat.py +0 -0
  47. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/conv.py +0 -0
  48. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/corner.py +0 -0
  49. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  50. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/dxfparser.py +0 -0
  51. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/femparser.py +0 -0
  52. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/functions.py +0 -0
  53. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/journal.py +0 -0
  54. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  55. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/shape.py +0 -0
  56. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/svgparser.py +0 -0
  57. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/dxfsl/symmetry.py +0 -0
  58. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/ecloss.py +0 -0
  59. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/erg.py +0 -0
  60. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/femag.py +0 -0
  61. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/forcedens.py +0 -0
  62. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/getset.py +0 -0
  63. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/gmsh.py +0 -0
  64. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/google.py +0 -0
  65. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/grid.py +0 -0
  66. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/heat_source_network.py +0 -0
  67. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/hxy.py +0 -0
  68. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/jhb.py +0 -0
  69. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/job.py +0 -0
  70. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/leakinduc.py +0 -0
  71. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/losscoeffs.py +0 -0
  72. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/__init__.py +0 -0
  73. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/afpm.py +0 -0
  74. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/pm.py +0 -0
  75. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/sizing.py +0 -0
  76. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/machine/utils.py +0 -0
  77. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/magnet.py +0 -0
  78. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/mcv.py +0 -0
  79. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/me.py +0 -0
  80. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/model.py +0 -0
  81. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/__init__.py +0 -0
  82. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/algorithm.py +0 -0
  83. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/population.py +0 -0
  84. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/problem.py +0 -0
  85. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  86. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/test/PopulationTest.py +0 -0
  87. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moo/test/ProblemTest.py +0 -0
  88. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/moproblem.py +0 -0
  89. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/multiproc.py +0 -0
  90. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/mxw2msh.py +0 -0
  91. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/nc.py +0 -0
  92. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/netlist.py +0 -0
  93. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/ntib.py +0 -0
  94. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/opt.py +0 -0
  95. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/parstudy.py +0 -0
  96. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/__init__.py +0 -0
  97. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/bch.py +0 -0
  98. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/fieldlines.py +0 -0
  99. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/fluxdens.py +0 -0
  100. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/forcedens.py +0 -0
  101. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/machine.py +0 -0
  102. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/mcv.py +0 -0
  103. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/phasor.py +0 -0
  104. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/plot/wdg.py +0 -0
  105. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/poc.py +0 -0
  106. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/semi_fea.py +0 -0
  107. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/shortcircuit.py +0 -0
  108. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/svgfsl/converter.py +0 -0
  109. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/FE-losses.mako +0 -0
  110. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/afm_rotor.mako +0 -0
  111. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/afm_stator.mako +0 -0
  112. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/airgapinduc.mako +0 -0
  113. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/asyn_motor.mako +0 -0
  114. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/basic_modpar.mako +0 -0
  115. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/bertotti.mako +0 -0
  116. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/calc_field_ts.mako +0 -0
  117. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/calc_therm_field.mako +0 -0
  118. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/cogg_calc.mako +0 -0
  119. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/colorgrad.mako +0 -0
  120. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/com_motor_sim.mako +0 -0
  121. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/conduct-data.mako +0 -0
  122. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/connect_models.mako +0 -0
  123. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/cu_losses.mako +0 -0
  124. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  125. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/fe-contr.mako +0 -0
  126. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/fieldcalc.mako +0 -0
  127. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/gen_hairpin_winding.mako +0 -0
  128. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/gen_winding.mako +0 -0
  129. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/inductances.mako +0 -0
  130. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  131. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  132. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  133. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  134. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnet-data.mako +0 -0
  135. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetFC2.mako +0 -0
  136. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetIron.mako +0 -0
  137. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetIron2.mako +0 -0
  138. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetIron3.mako +0 -0
  139. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetIron4.mako +0 -0
  140. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetIron5.mako +0 -0
  141. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetIronV.mako +0 -0
  142. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetSector.mako +0 -0
  143. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  144. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetShell.mako +0 -0
  145. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/magnetShell2.mako +0 -0
  146. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/mesh-airgap.mako +0 -0
  147. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/modal_analysis.mako +0 -0
  148. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  149. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  150. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/new_model.mako +0 -0
  151. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  152. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/noloadflux.mako +0 -0
  153. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  154. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/open.mako +0 -0
  155. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/plots.mako +0 -0
  156. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  157. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  158. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  159. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/prepare_thermal.mako +0 -0
  160. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  161. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/psi-torq-rem-rot.mako +0 -0
  162. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/psi-torq-rem.mako +0 -0
  163. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/psi-torq-rot.mako +0 -0
  164. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/ring.mako +0 -0
  165. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/rot_hsm.mako +0 -0
  166. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/rotorAsyn.mako +0 -0
  167. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/rotorKs2.mako +0 -0
  168. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/rotor_msh.mako +0 -0
  169. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/rotor_winding.mako +0 -0
  170. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/shortcircuit.mako +0 -0
  171. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/srm.mako +0 -0
  172. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/stator1.mako +0 -0
  173. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/stator2.mako +0 -0
  174. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/stator3Linear.mako +0 -0
  175. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/stator4.mako +0 -0
  176. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/statorBG.mako +0 -0
  177. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/statorRotor3.mako +0 -0
  178. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/stator_msh.mako +0 -0
  179. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/therm-dynamic.mako +0 -0
  180. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/templates/therm_static.mako +0 -0
  181. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/tks.py +0 -0
  182. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/ts.py +0 -0
  183. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/utils.py +0 -0
  184. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/vbf.py +0 -0
  185. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/vtu.py +0 -0
  186. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/windings.py +0 -0
  187. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools/zmq.py +0 -0
  188. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools.egg-info/SOURCES.txt +0 -0
  189. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools.egg-info/dependency_links.txt +0 -0
  190. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools.egg-info/entry_points.txt +0 -0
  191. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools.egg-info/requires.txt +0 -0
  192. {femagtools-1.8.15 → femagtools-1.8.17}/src/femagtools.egg-info/top_level.txt +0 -0
  193. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/__init__.py +0 -0
  194. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/engines/__init__.py +0 -0
  195. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/engines/test_amazon.py +0 -0
  196. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/engines/test_config.py +0 -0
  197. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/geom/__init__.py +0 -0
  198. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/geom/test_functions.py +0 -0
  199. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/geom/test_point_inside.py +0 -0
  200. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/moo/__init__.py +0 -0
  201. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/moo/test_algorithm.py +0 -0
  202. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/moo/test_population.py +0 -0
  203. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/moo/test_problem.py +0 -0
  204. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_afpm.py +0 -0
  205. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_airgap_induction.py +0 -0
  206. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_amela.py +0 -0
  207. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_asm.py +0 -0
  208. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_bchreader.py +0 -0
  209. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_conductor.py +0 -0
  210. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_convert.py +0 -0
  211. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_dxfsl.py +0 -0
  212. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_erg.py +0 -0
  213. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_femag.py +0 -0
  214. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_forcedens.py +0 -0
  215. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_heat_source_network.py +0 -0
  216. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_hxy.py +0 -0
  217. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_isa7.py +0 -0
  218. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_jhb.py +0 -0
  219. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_job.py +0 -0
  220. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_losscoeffs.py +0 -0
  221. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_magncurv.py +0 -0
  222. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_magnet.py +0 -0
  223. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_mcv.py +0 -0
  224. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_mcvreader.py +0 -0
  225. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_me.py +0 -0
  226. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_model.py +0 -0
  227. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_parident.py +0 -0
  228. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_parstudy.py +0 -0
  229. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_pocfile.py +0 -0
  230. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_sizing.py +0 -0
  231. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_sm.py +0 -0
  232. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_tksreader.py +0 -0
  233. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_ts.py +0 -0
  234. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_vbfreader.py +0 -0
  235. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_vtu.py +0 -0
  236. {femagtools-1.8.15 → femagtools-1.8.17}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: femagtools
3
- Version: 1.8.15
3
+ Version: 1.8.17
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.15'
5
+ __version__ = '1.8.17'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2025 Gamma Technology'
@@ -958,6 +958,23 @@ class Area(object):
958
958
  return False
959
959
  return True
960
960
 
961
+ def is_line_inside(self, p1, p2):
962
+ if self.is_point_inside(p1):
963
+ if self.is_point_inside(p2):
964
+ logger.debug("Border: Type of area %s is %s",
965
+ self.identifier(), self.type)
966
+ return True
967
+ if self.the_point_is_inside_area(p2):
968
+ logger.debug("Inside: Type of area %s is %s",
969
+ self.identifier(), self.type)
970
+ return True
971
+ elif self.is_point_inside(p2):
972
+ if self.the_point_is_inside_area(p1):
973
+ logger.debug("Inside: Type of area %s is %s",
974
+ self.identifier(), self.type)
975
+ return True
976
+ return False
977
+
961
978
  def get_best_point_inside(self, geom):
962
979
  px1 = self.min_x - 5
963
980
  px2 = self.max_x + 5
@@ -202,6 +202,18 @@ def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
202
202
  title="Rotor Magnet Slice after Rebuild")
203
203
 
204
204
  rebuild = False
205
+ if machine_temp.magnets_missing(EESM):
206
+ mag = machine_temp.looking_for_one_possible_magnet()
207
+ if mag:
208
+ if machine.is_mirrored():
209
+ rebuild = machine_temp.create_mirror_lines_outside_magnets()
210
+ if machine_temp.create_auxiliary_lines():
211
+ rebuild = True
212
+ if rebuild:
213
+ machine_temp.rebuild_subregions(EESM, single=single)
214
+ machine_temp.geom.force_area_as_magnet(mag)
215
+ return machine_temp
216
+
205
217
  if machine_temp.has_magnets_in_the_middle():
206
218
  logger.debug("Magnets cut")
207
219
  rebuild = machine_temp.create_mirror_lines_outside_magnets()
@@ -432,10 +444,10 @@ def convert(dxfile,
432
444
  return dict(error='unknown location {}'.format(part[1]))
433
445
  else:
434
446
  if da:
435
- logger.warn("distance airgap (da) ignored")
447
+ logger.warning("distance airgap (da) ignored")
436
448
  da = 0.0
437
449
  if dy:
438
- logger.warn("distance yoke (dy) ignored")
450
+ logger.warning("distance yoke (dy) ignored")
439
451
  dy = 0.0
440
452
 
441
453
  split_ini = split
@@ -1064,7 +1076,7 @@ def create_femag_parameters_stator(motor, position):
1064
1076
  params['da1'] = 2*motor.geom.min_radius
1065
1077
  params['slot_area'] = motor.slot_area()
1066
1078
  params['stator'] = _create_stator_parameters(motor)
1067
- params['machine'] = motor
1079
+ #params['machine'] = motor
1068
1080
  return params
1069
1081
 
1070
1082
 
@@ -1080,5 +1092,5 @@ def create_femag_parameters_rotor(motor, position):
1080
1092
  params['da1'] = 2*motor.geom.min_radius
1081
1093
  params['slot_area'] = motor.slot_area()
1082
1094
  params['rotor'] = _create_rotor_parameters(motor)
1083
- params['machine'] = motor
1095
+ #params['machine'] = motor
1084
1096
  return params
@@ -270,7 +270,7 @@ class FslRenderer(object):
270
270
  for area in geom.list_of_areas():
271
271
  if area.number_of_elements() > 1:
272
272
  p = area.get_point_inside(geom)
273
- if p:
273
+ if p and area.type > 0:
274
274
  self.content.append("x0, y0 = {}, {}".format(p[0], p[1]))
275
275
  # self.content.append("point(x0, y0, red, 4)") # for debugging
276
276
  self.content.append("create_mesh_se(x0, y0)")
@@ -324,7 +324,7 @@ class FslRenderer(object):
324
324
  self.content.append(
325
325
  'x0_shaft, y0_shaft = x0, y0')
326
326
 
327
- self.content.append("\n")
327
+ self.content.append("create_mesh(x0, y0)\n")
328
328
 
329
329
  txt = ["if x0_iron_yoke > 0.0 then",
330
330
  " if mcvkey_yoke ~= 'dummy' then",
@@ -2612,6 +2612,7 @@ class Geometry(object):
2612
2612
  areas_inside = [a for a in self.area_list
2613
2613
  if area.is_inside(a, self)]
2614
2614
  if not areas_inside:
2615
+ area.areas_inside = {}
2615
2616
  continue
2616
2617
 
2617
2618
  areas_notouch = {a.identifier(): a for a in areas_inside
@@ -3748,6 +3749,41 @@ class Geometry(object):
3748
3749
 
3749
3750
  logger.debug("end of search_unknown_subregions")
3750
3751
 
3752
+ def possible_magnet_in_the_middle(self, midangle):
3753
+ self.set_areas_inside_for_all_areas()
3754
+ mags = []
3755
+ for n, a in enumerate(self.list_of_areas()):
3756
+ if a.areas_inside:
3757
+ continue
3758
+ if a.close_to_startangle or a.close_to_endangle:
3759
+ continue
3760
+ if np.isclose(a.min_dist, self.min_radius):
3761
+ continue
3762
+ if np.isclose(a.max_dist, self.max_radius):
3763
+ continue
3764
+
3765
+ a_midangle = a.get_mid_angle(self.center)
3766
+ if np.isclose(midangle, a_midangle, atol=1e-2, rtol=1e-2):
3767
+ s = a.area_size()
3768
+ mags.append([s, n, a])
3769
+
3770
+ if not mags:
3771
+ return False
3772
+ mags.sort(reverse=True)
3773
+ s, n, a = mags[0]
3774
+ a.set_type(AREA.TYPE_MAGNET_AIRGAP)
3775
+ a.phi = midangle
3776
+ a.mag_width = (a.max_dist - a.min_dist) * 0.9
3777
+ return a
3778
+
3779
+ def force_area_as_magnet(self, area):
3780
+ for a in self.list_of_areas():
3781
+ if a.is_equal(area, 1e-2):
3782
+ a.set_type(area.type)
3783
+ a.phi = area.phi
3784
+ a.mag_width = area.mag_width
3785
+ return
3786
+
3751
3787
  def magnets_in_the_middle(self, midangle):
3752
3788
  mag_areas = [a for a in self.list_of_areas()
3753
3789
  if a.is_magnet()]
@@ -4188,28 +4224,11 @@ class Geometry(object):
4188
4224
  return True
4189
4225
  return False
4190
4226
 
4191
- def _line_inside_magnets(self, p1, p2):
4192
- for area in self.list_of_areas():
4193
- if area.is_magnet():
4194
- if area.is_point_inside(p1):
4195
- if area.is_point_inside(p2):
4196
- return True
4197
- return False
4198
-
4199
- def _line_inside_air(self, p1, p2):
4200
- for area in self.list_of_areas():
4201
- if area.is_air():
4202
- if area.is_point_inside(p1):
4203
- if area.is_point_inside(p2):
4204
- return True
4205
- return False
4206
-
4207
4227
  def _line_inside_not_iron(self, p1, p2):
4208
4228
  for area in self.list_of_areas():
4209
4229
  if area.is_shaft() or area.is_air() or area.is_magnet():
4210
- if area.is_point_inside(p1):
4211
- if area.is_point_inside(p2):
4212
- return True
4230
+ if area.is_line_inside(p1, p2):
4231
+ return True
4213
4232
  return False
4214
4233
 
4215
4234
  def inside_area_list(self, p):
@@ -1259,6 +1259,11 @@ class Machine(object):
1259
1259
  def has_magnets(self):
1260
1260
  return self.geom.has_magnets
1261
1261
 
1262
+ def magnets_missing(self, EESM):
1263
+ if EESM:
1264
+ return False
1265
+ return not self.has_magnets()
1266
+
1262
1267
  def delete_tiny_elements(self, mindist):
1263
1268
  return self.geom.delete_tiny_elements(mindist)
1264
1269
 
@@ -1320,6 +1325,11 @@ class Machine(object):
1320
1325
  self.endangle)
1321
1326
  return self.geom.magnets_in_the_middle(midangle)
1322
1327
 
1328
+ def looking_for_one_possible_magnet(self):
1329
+ midangle = middle_angle(self.startangle,
1330
+ self.endangle)
1331
+ return self.geom.possible_magnet_in_the_middle(midangle)
1332
+
1323
1333
  def create_mirror_lines_outside_windings(self):
1324
1334
  logger.debug("create_mirror_lines_outside_windings")
1325
1335
 
@@ -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,
@@ -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)
@@ -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