femagtools 1.8.1__tar.gz → 1.8.2__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (227) hide show
  1. {femagtools-1.8.1/src/femagtools.egg-info → femagtools-1.8.2}/PKG-INFO +1 -1
  2. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/__init__.py +1 -1
  3. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/area.py +45 -1
  4. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/areabuilder.py +93 -45
  5. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/converter.py +51 -26
  6. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/fslrenderer.py +5 -4
  7. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/geom.py +123 -137
  8. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/machine.py +161 -9
  9. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/shape.py +46 -1
  10. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/svgparser.py +1 -1
  11. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/symmetry.py +115 -30
  12. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/fsl.py +10 -10
  13. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/__init__.py +5 -4
  14. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/afpm.py +41 -15
  15. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/sizing.py +189 -11
  16. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/utils.py +2 -2
  17. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/mcv.py +2 -3
  18. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/model.py +4 -3
  19. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/parstudy.py +1 -1
  20. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/nc.py +2 -2
  21. {femagtools-1.8.1 → femagtools-1.8.2/src/femagtools.egg-info}/PKG-INFO +1 -1
  22. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_mcv.py +1 -1
  23. {femagtools-1.8.1 → femagtools-1.8.2}/LICENSE +0 -0
  24. {femagtools-1.8.1 → femagtools-1.8.2}/MANIFEST.in +0 -0
  25. {femagtools-1.8.1 → femagtools-1.8.2}/README.md +0 -0
  26. {femagtools-1.8.1 → femagtools-1.8.2}/pyproject.toml +0 -0
  27. {femagtools-1.8.1 → femagtools-1.8.2}/setup.cfg +0 -0
  28. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/airgap.py +0 -0
  29. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/amazon.py +0 -0
  30. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/amela.py +0 -0
  31. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/asm.py +0 -0
  32. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/bch.py +0 -0
  33. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/bchxml.py +0 -0
  34. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/condor.py +0 -0
  35. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/conductor.py +0 -0
  36. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/config.py +0 -0
  37. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/convert.py +0 -0
  38. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dakota.py +0 -0
  39. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dakota_femag.py +0 -0
  40. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dakotaout.py +0 -0
  41. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/docker.py +0 -0
  42. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/__init__.py +0 -0
  43. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/concat.py +0 -0
  44. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/conv.py +0 -0
  45. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/corner.py +0 -0
  46. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/dumprenderer.py +0 -0
  47. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/dxfparser.py +0 -0
  48. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/femparser.py +0 -0
  49. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/functions.py +0 -0
  50. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/journal.py +0 -0
  51. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/dxfsl/plotrenderer.py +0 -0
  52. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/ecloss.py +0 -0
  53. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/erg.py +0 -0
  54. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/femag.py +0 -0
  55. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/forcedens.py +0 -0
  56. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/getset.py +0 -0
  57. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/gmsh.py +0 -0
  58. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/google.py +0 -0
  59. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/grid.py +0 -0
  60. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/heat_source_network.py +0 -0
  61. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/hxy.py +0 -0
  62. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/isa7.py +0 -0
  63. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/jhb.py +0 -0
  64. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/job.py +0 -0
  65. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/losscoeffs.py +0 -0
  66. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/effloss.py +0 -0
  67. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/im.py +0 -0
  68. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/pm.py +0 -0
  69. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/machine/sm.py +0 -0
  70. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/magnet.py +0 -0
  71. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/me.py +0 -0
  72. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/__init__.py +0 -0
  73. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/algorithm.py +0 -0
  74. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/population.py +0 -0
  75. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/problem.py +0 -0
  76. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
  77. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/test/PopulationTest.py +0 -0
  78. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moo/test/ProblemTest.py +0 -0
  79. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/moproblem.py +0 -0
  80. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/multiproc.py +0 -0
  81. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/mxw2msh.py +0 -0
  82. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/nc.py +0 -0
  83. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/netlist.py +0 -0
  84. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/ntib.py +0 -0
  85. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/opt.py +0 -0
  86. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/__init__.py +0 -0
  87. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/bch.py +0 -0
  88. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/char.py +0 -0
  89. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/fieldlines.py +0 -0
  90. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/fluxdens.py +0 -0
  91. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/forcedens.py +0 -0
  92. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/mcv.py +0 -0
  93. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/phasor.py +0 -0
  94. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/plot/wdg.py +0 -0
  95. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/poc.py +0 -0
  96. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/svgfsl/converter.py +0 -0
  97. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/FE-losses.mako +0 -0
  98. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/afm_rotor.mako +0 -0
  99. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/afm_stator.mako +0 -0
  100. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/airgapinduc.mako +0 -0
  101. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/asyn_motor.mako +0 -0
  102. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/basic_modpar.mako +0 -0
  103. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/bertotti.mako +0 -0
  104. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/calc_field_ts.mako +0 -0
  105. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/calc_therm_field.mako +0 -0
  106. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/cogg_calc.mako +0 -0
  107. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/colorgrad.mako +0 -0
  108. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/com_motor_sim.mako +0 -0
  109. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/conduct-data.mako +0 -0
  110. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/connect_models.mako +0 -0
  111. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/cu_losses.mako +0 -0
  112. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/displ_stator_rotor.mako +0 -0
  113. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/ec-rotorbar.mako +0 -0
  114. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/fe-contr.mako +0 -0
  115. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/fieldcalc.mako +0 -0
  116. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/gen_hairpin_winding.mako +0 -0
  117. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/gen_winding.mako +0 -0
  118. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/inductances.mako +0 -0
  119. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/ld_lq_fast.mako +0 -0
  120. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/leak_dist_wind.mako +0 -0
  121. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/leak_evol_wind.mako +0 -0
  122. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
  123. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnet-data.mako +0 -0
  124. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetFC2.mako +0 -0
  125. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetIron.mako +0 -0
  126. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetIron2.mako +0 -0
  127. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetIron3.mako +0 -0
  128. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetIron4.mako +0 -0
  129. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetIron5.mako +0 -0
  130. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetIronV.mako +0 -0
  131. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetSector.mako +0 -0
  132. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
  133. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetShell.mako +0 -0
  134. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/magnetShell2.mako +0 -0
  135. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/mesh-airgap.mako +0 -0
  136. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/modal_analysis.mako +0 -0
  137. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/modified_steinmetz.mako +0 -0
  138. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/mult_cal_fast.mako +0 -0
  139. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/new_model.mako +0 -0
  140. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/noloadflux-rot.mako +0 -0
  141. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/noloadflux.mako +0 -0
  142. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/noloadfluxdc.mako +0 -0
  143. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/open.mako +0 -0
  144. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/plots.mako +0 -0
  145. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
  146. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/pm_sym_fast.mako +0 -0
  147. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/pm_sym_loss.mako +0 -0
  148. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/prepare_thermal.mako +0 -0
  149. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/psd_psq_fast.mako +0 -0
  150. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/ring.mako +0 -0
  151. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/rot_hsm.mako +0 -0
  152. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/rotorAsyn.mako +0 -0
  153. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/rotorKs2.mako +0 -0
  154. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/rotor_msh.mako +0 -0
  155. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/rotor_winding.mako +0 -0
  156. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/shortcircuit.mako +0 -0
  157. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/srm.mako +0 -0
  158. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/stator1.mako +0 -0
  159. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/stator2.mako +0 -0
  160. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/stator3Linear.mako +0 -0
  161. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/stator4.mako +0 -0
  162. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/statorBG.mako +0 -0
  163. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/statorRing.mako +0 -0
  164. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/statorRotor3.mako +0 -0
  165. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/stator_msh.mako +0 -0
  166. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/therm-dynamic.mako +0 -0
  167. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/therm_static.mako +0 -0
  168. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/templates/torq_calc.mako +0 -0
  169. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/tks.py +0 -0
  170. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/ts.py +0 -0
  171. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/utils.py +0 -0
  172. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/vbf.py +0 -0
  173. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/vtu.py +0 -0
  174. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools/windings.py +0 -0
  175. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools.egg-info/SOURCES.txt +0 -0
  176. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools.egg-info/dependency_links.txt +0 -0
  177. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools.egg-info/entry_points.txt +0 -0
  178. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools.egg-info/requires.txt +0 -0
  179. {femagtools-1.8.1 → femagtools-1.8.2}/src/femagtools.egg-info/top_level.txt +0 -0
  180. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/__init__.py +0 -0
  181. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/engines/__init__.py +0 -0
  182. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/engines/test_amazon.py +0 -0
  183. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/engines/test_config.py +0 -0
  184. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/geom/__init__.py +0 -0
  185. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/geom/test_functions.py +0 -0
  186. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/geom/test_point_inside.py +0 -0
  187. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/moo/__init__.py +0 -0
  188. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/moo/test_algorithm.py +0 -0
  189. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/moo/test_population.py +0 -0
  190. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/moo/test_problem.py +0 -0
  191. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_afpm.py +0 -0
  192. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_airgap_induction.py +0 -0
  193. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_amela.py +0 -0
  194. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_asm.py +0 -0
  195. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_bchreader.py +0 -0
  196. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_conductor.py +0 -0
  197. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_convert.py +0 -0
  198. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_dxfsl.py +0 -0
  199. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_effloss.py +0 -0
  200. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_erg.py +0 -0
  201. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_femag.py +0 -0
  202. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_forcedens.py +0 -0
  203. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_fsl.py +0 -0
  204. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_heat_source_network.py +0 -0
  205. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_hxy.py +0 -0
  206. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_im.py +0 -0
  207. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_isa7.py +0 -0
  208. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_jhb.py +0 -0
  209. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_job.py +0 -0
  210. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_losscoeffs.py +0 -0
  211. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_machine.py +0 -0
  212. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_magncurv.py +0 -0
  213. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_magnet.py +0 -0
  214. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_mcvreader.py +0 -0
  215. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_me.py +0 -0
  216. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_model.py +0 -0
  217. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_nc.py +0 -0
  218. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_parident.py +0 -0
  219. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_parstudy.py +0 -0
  220. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_pocfile.py +0 -0
  221. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_sizing.py +0 -0
  222. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_sm.py +0 -0
  223. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_tksreader.py +0 -0
  224. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_ts.py +0 -0
  225. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_vbfreader.py +0 -0
  226. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_vtu.py +0 -0
  227. {femagtools-1.8.1 → femagtools-1.8.2}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.8.1
3
+ Version: 1.8.2
4
4
  Summary: Python API for FEMAG
5
5
  Author-email: Ronald Tanner <tar@semafor.ch>, Dapu Zhang <dzhang@gtisoft.com>, Beat Holm <hob@semafor.ch>, Günther Amsler <amg@semafor.ch>, Nicolas Mauchle <mau@semafor.ch>
6
6
  License: Copyright (c) 2016-2023, Semafor Informatik & Energie AG, Basel
@@ -2,7 +2,7 @@
2
2
 
3
3
  """
4
4
  __title__ = 'femagtools'
5
- __version__ = '1.8.1'
5
+ __version__ = '1.8.2'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2024 Gamma Technology'
@@ -100,6 +100,9 @@ class Area(object):
100
100
  def elements(self):
101
101
  return self.area
102
102
 
103
+ def copy_of_elements(self):
104
+ return [e.clone() for e in self.elements() if e]
105
+
103
106
  def list_of_nodes(self):
104
107
  if len(self.area) < 1:
105
108
  return
@@ -1208,6 +1211,7 @@ class Area(object):
1208
1211
 
1209
1212
  angles.sort(reverse=True)
1210
1213
  # calculate orientation (no rectangle check)
1214
+
1211
1215
  l, alpha = angles[0]
1212
1216
  phi = normalise_angle(alpha + np.pi/2)
1213
1217
  logger.debug("alpha = %s, phi = %s", alpha, phi)
@@ -1216,9 +1220,13 @@ class Area(object):
1216
1220
  angle = alpha_angle(mid, phi)
1217
1221
  logger.debug("phi=%s, mid=%s, angle=%s", phi, mid, angle)
1218
1222
 
1219
- if greater(angle, np.pi * 0.5, rtol=1e-5) and \
1223
+ if np.isclose(mid, alpha, rtol=1e-3, atol=1e-3):
1224
+ phi = mid
1225
+ logger.debug("correction of phi=%s", phi)
1226
+ elif greater(angle, np.pi * 0.5, rtol=1e-5) and \
1220
1227
  less(angle, np.pi * 1.5, rtol=1e-5):
1221
1228
  phi = normalise_angle(phi + np.pi)
1229
+ logger.debug("correction of phi=%s", phi)
1222
1230
 
1223
1231
  logger.debug("phi of magnet %s is %s", self.identifier(), phi)
1224
1232
  return phi
@@ -1321,6 +1329,32 @@ class Area(object):
1321
1329
  return np.isclose(angle, border_angle,
1322
1330
  rtol=1e-03, atol=1e-03)
1323
1331
 
1332
+ def set_subregion_parameters(self,
1333
+ is_inner,
1334
+ min_radius,
1335
+ max_radius,
1336
+ startangle,
1337
+ endangle):
1338
+ ag_delta = (max_radius - min_radius) / 500.0
1339
+ if is_inner:
1340
+ self.close_to_ag = greater_equal(self.max_dist + ag_delta, max_radius)
1341
+ close_to_opposition = np.isclose(min_radius, self.min_dist)
1342
+ airgap_radius = max_radius
1343
+ opposite_radius = min_radius
1344
+ else:
1345
+ self.close_to_ag = less_equal(self.min_dist - ag_delta, min_radius)
1346
+ close_to_opposition = np.isclose(max_radius, self.max_dist)
1347
+ airgap_radius = min_radius
1348
+ opposite_radius = max_radius
1349
+
1350
+ airgap_toleranz = (self.max_dist - self.min_dist) / 50.0 # 2%
1351
+
1352
+ self.close_to_startangle = np.isclose(self.min_angle, startangle,
1353
+ 1e-04, 1e-04)
1354
+ self.close_to_endangle = np.isclose(self.max_angle, endangle,
1355
+ 1e-04, 1e-04)
1356
+ self.surface = self.area_size()
1357
+
1324
1358
  def mark_stator_subregions(self,
1325
1359
  is_inner,
1326
1360
  stator_size,
@@ -1791,6 +1825,16 @@ class Area(object):
1791
1825
  for i in a.nested_areas_inside():
1792
1826
  yield i
1793
1827
 
1828
+ def mirror_area(self, center, axis_m, axis_n):
1829
+ elements = []
1830
+ for e in self.area:
1831
+ el = e.mirror_shape(center, axis_m, axis_n)
1832
+ if el:
1833
+ elements.append(el)
1834
+ area = Area(elements, center, 0.0)
1835
+ area.type = self.type
1836
+ return area
1837
+
1794
1838
  def __str__(self):
1795
1839
  return "Area {}\n".format(self.id) + \
1796
1840
  "distance...............: from {} to {}\n".\
@@ -338,7 +338,7 @@ class EdgeInfo(object):
338
338
  return True # two lines
339
339
 
340
340
  def arc_line_direction_lefthand(self, start_edge, line_edge, builder):
341
- logger.info("begin of arc_line_direction_lefthand")
341
+ logger.debug("begin of arc_line_direction_lefthand")
342
342
  if not self.is_arc():
343
343
  logger.critical("FATAL: unexpected %s at position %s", self.classname(), self.n1)
344
344
  sys.exit(1)
@@ -630,7 +630,7 @@ class AreaBuilder(object):
630
630
  logger.debug("begin of create_inner_corner_auxiliary_areas")
631
631
  if not self.geom.is_inner:
632
632
  logger.debug("end of create_inner_corner_auxiliary_areas: not inner")
633
- return
633
+ return False
634
634
 
635
635
  self.set_edge_attributes()
636
636
 
@@ -647,17 +647,18 @@ class AreaBuilder(object):
647
647
 
648
648
  if start_exists and end_exists:
649
649
  logger.debug("end of create_inner_corner_auxiliary_areas: no aktion")
650
- return
650
+ return False
651
651
 
652
652
  airgap_line, airgap_el = self.get_inner_airgap_line()
653
653
  if not airgap_el:
654
654
  logger.debug("end of create_inner_corner_auxiliary_areas: no airgapline found")
655
- return
655
+ return False
656
656
 
657
657
  logger.debug("airgapline found !!")
658
658
  airgap_nodes = [n for n in airgap_line[1:]]
659
659
  del airgap_nodes[-1]
660
660
 
661
+ created = False
661
662
  if not start_exists:
662
663
  cp = self.geom.start_corners[-1]
663
664
  logger.debug("Start Corner: %s -- %s", cp, start_cp)
@@ -683,6 +684,7 @@ class AreaBuilder(object):
683
684
  n,
684
685
  color='red',
685
686
  linestyle='dotted')
687
+ created = True
686
688
  start_node = self.geom.get_node(start_cp)
687
689
  self.geom.add_edge(cp, start_node, start_line)
688
690
  result = self.get_new_area(start_node, n)
@@ -715,6 +717,7 @@ class AreaBuilder(object):
715
717
  self.geom.add_line(end_cp, n,
716
718
  color='red',
717
719
  linestyle='dotted')
720
+ created = True
718
721
  end_node = self.geom.get_node(end_cp)
719
722
  self.geom.add_edge(cp, end_node, end_line)
720
723
  result = self.get_new_area(n, end_node)
@@ -725,81 +728,126 @@ class AreaBuilder(object):
725
728
  break
726
729
 
727
730
  logger.debug("end of create_inner_corner_auxiliary_areas")
731
+ return created
728
732
 
729
- def get_inner_airgap_line(self):
730
- logger.debug("begin of get_inner_airgap_line")
731
- assert(self.geom.is_inner)
732
- assert(self.geom.area_list)
733
-
734
- area = [a for a in self.geom.area_list if a.close_to_ag_endcorner]
735
- if len(area) != 1:
736
- logger.debug("end of get_inner_airgap_line: %s areas found", len(area))
737
- return [], []
733
+ def get_airgap_line(self, start_node, end_node, area):
734
+ logger.debug("get_airgap_line")
738
735
 
739
- end_corner = self.geom.end_corners[-1]
740
- logger.debug("END CORNER %s", end_corner)
736
+ self.set_edge_attributes()
741
737
 
742
- nodes = [n for n in area[0].list_of_nodes()]
738
+ nodes = [n for n in area.list_of_nodes()]
743
739
  if not nodes:
744
- logger.debug("end of get_inner_airgap_line: no nodes found")
740
+ logger.debug("end of get_airgap_line: no nodes found")
745
741
  return [], []
746
742
 
747
743
  n1 = nodes[0]
748
- if points_are_close(end_corner, n1):
744
+ if points_are_close(start_node, n1):
749
745
  n2 = nodes[-1]
750
746
  else:
751
747
  n2 = n1
752
748
  for n1 in nodes[1:]:
753
- if points_are_close(end_corner, n1):
749
+ if points_are_close(start_node, n1):
754
750
  break
755
751
  n2 = n1
756
752
 
757
- if not points_are_close(end_corner, n1):
758
- logger.debug("end of get_inner_airgap_line: not close to endcorner")
753
+ if not points_are_close(start_node, n1):
754
+ logger.debug("end of get_airgap_line: not close to start-node")
759
755
  return [], []
760
756
 
761
- start_corner = self.geom.start_corners[-1]
762
- logger.debug("START CORNER %s", end_corner)
763
-
764
- logger.debug("EDGE FOUND: %s - %s", n1, n2)
757
+ logger.debug("START EDGE FOUND: %s - %s", n1, n2)
765
758
  nodes = [n1, n2]
766
759
  info = self.get_edge_info(n1, n2)
767
760
  elements = [info.element]
768
761
 
769
- while not points_are_close(start_corner, n2):
762
+ while not points_are_close(end_node, n2):
770
763
  info.set_start_angle()
771
764
  info = self.next_edge_lefthand_side(info)
772
765
  if not info: # bad
773
- return []
766
+ return [], []
774
767
  n2 = info.n2
775
768
  nodes.append(n2)
776
769
  elements.append(info.element)
777
770
 
778
- logger.debug("end of get_inner_airgap_line #%s", len(nodes))
771
+ logger.debug("end of get_airgap_line #%s", len(nodes))
779
772
  return nodes, elements
780
773
 
781
- def get_element_line(self, start_node, end_node):
782
- logger.debug("begin of get_element_line")
774
+ def get_inner_airgap_line(self):
775
+ logger.debug("begin of get_inner_airgap_line")
776
+ assert(self.geom.is_inner)
783
777
  assert(self.geom.area_list)
784
778
 
785
- logger.debug("-- get line from %s to %s", start_node, end_node)
779
+ area = [a for a in self.geom.area_list if a.close_to_ag_endcorner]
780
+ if len(area) != 1:
781
+ logger.debug("end of get_inner_airgap_line: %s areas found", len(area))
782
+ return [], []
786
783
 
787
- logger.debug("EDGE FOUND: %s - %s", n1, n2)
788
- nodes = [n1, n2]
789
- info = self.get_edge_info(n1, n2)
790
- elements = [info.element]
784
+ start_node = self.geom.end_corners[-1]
785
+ logger.debug("START NODE %s", start_node)
786
+ end_node = self.geom.start_corners[-1]
787
+ logger.debug("END NODE %s", end_node)
791
788
 
792
- while not points_are_close(start_corner, n2):
793
- info.set_start_angle()
794
- info = self.next_edge_lefthand_side(info)
795
- if not info: # bad
796
- return []
797
- n2 = info.n2
798
- nodes.append(n2)
799
- elements.append(info.element)
789
+ return self.get_airgap_line(start_node, end_node, area[0])
800
790
 
801
- logger.debug("end of get_inner_airgap_line #%s", len(nodes))
802
- return nodes, elements
791
+ def close_outer_winding_areas(self):
792
+ logger.debug("close_outer_winding_areas")
793
+
794
+ airgap_line, airgap_el = self.get_outer_airgap_line()
795
+ logger.debug("Outer Airgap with %s Nodes", len(airgap_line))
796
+
797
+ if len(airgap_line) < 5:
798
+ return False
799
+
800
+ n1 = None
801
+ dist_n1 = 0.0
802
+
803
+ e_prev = None
804
+ n_prev = airgap_line[0]
805
+ dist_prev = distance(self.geom.center, n_prev)
806
+ alpha_prev = alpha_line(self.geom.center, n_prev)
807
+ alpha_start = alpha_prev
808
+
809
+ lines_created = 0
810
+ for n in airgap_line[1:]:
811
+ dist = distance(self.geom.center, n)
812
+ alpha = alpha_line(self.geom.center, n)
813
+ if not n1:
814
+ if dist > dist_prev and alpha < alpha_prev:
815
+ n1 = n_prev
816
+ dist_n1 = dist_prev
817
+ else:
818
+ if np.isclose(dist_n1, dist, rtol=1e-3, atol=1e-3):
819
+ line = Line(Element(start=n1, end=n))
820
+ if e_prev.intersect_line(line):
821
+ logger.debug("___LINE NOT POSSIBLE___")
822
+ else:
823
+ self.geom.add_line(n1, n, color='red')
824
+ lines_created += 1
825
+ n1 = None
826
+ dist_n1 = 0.0
827
+ if not n1:
828
+ e_prev = self.geom.get_edge_element(n_prev, n)
829
+ n_prev = n
830
+ dist_prev = dist
831
+ alpha_prev = alpha
832
+
833
+ return lines_created > 0
834
+
835
+ def get_outer_airgap_line(self):
836
+ logger.debug("begin of get_outer_airgap_line")
837
+ assert(self.geom.is_outer)
838
+ assert(self.geom.area_list)
839
+
840
+ area = [a for a in self.geom.area_list if a.close_to_ag_startcorner]
841
+ if len(area) != 1:
842
+ logger.debug("end of get_outer_airgap_line: %s areas found", len(area))
843
+ return [], []
844
+
845
+ start_node = self.geom.start_corners[0]
846
+ logger.debug("START NODE %s", start_node)
847
+ end_node = self.geom.end_corners[0]
848
+ logger.debug("END NODE %s", end_node)
849
+
850
+ return self.get_airgap_line(start_node, end_node, area[0])
803
851
 
804
852
  def create_one_area_group(self, areas):
805
853
  logger.debug("begin of create_one_area_group")
@@ -12,6 +12,7 @@ from femagtools.dxfsl.plotrenderer import PlotRenderer
12
12
  from femagtools.dxfsl.concat import Concatenation
13
13
  from femagtools.dxfsl.functions import Timer, middle_angle
14
14
  from femagtools.dxfsl.journal import Journal, getJournal
15
+ from femagtools.dxfsl.area import TYPE_WINDINGS
15
16
  import logging
16
17
  import logging.config
17
18
  import numpy as np
@@ -180,15 +181,25 @@ def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
180
181
  else:
181
182
  machine_temp = machine
182
183
 
183
- midangle = middle_angle(machine_temp.startangle,
184
- machine_temp.endangle)
185
-
186
184
  plot_geom(False, # for developer
187
185
  plt, machine_temp.geom,
188
- title="Inner Rotor check magnets {}".format(midangle))
186
+ title="Inner Rotor check magnets")
187
+
188
+ machine_slice = machine_temp.get_forced_magnet_slice()
189
+ if machine_slice:
190
+ plot_geom(False, # for developer
191
+ plt, machine_slice.geom,
192
+ title="Rotor Magnet Slice")
193
+
194
+ machine_temp = machine_slice
195
+ machine_temp.geom.set_rotor()
196
+ machine_temp.rebuild_subregions(EESM, single=single)
197
+ plot_geom(False, # for developer
198
+ plt, machine_temp.geom,
199
+ title="Rotor Magnet Slice after Rebuild")
189
200
 
190
201
  rebuild = False
191
- if machine_temp.geom.magnets_in_the_middle(midangle):
202
+ if machine_temp.has_magnets_in_the_middle():
192
203
  logger.debug("Magnets cut")
193
204
  rebuild = machine_temp.create_mirror_lines_outside_magnets()
194
205
  else:
@@ -199,7 +210,7 @@ def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
199
210
  else:
200
211
  rebuild = machine_temp.create_mirror_lines_outside_magnets()
201
212
  if rebuild:
202
- machine_temp.geom.area_list = []
213
+ machine_temp.geom.create_list_of_areas(delete=True)
203
214
 
204
215
  if machine_temp.create_auxiliary_lines():
205
216
  logger.debug("Auxiliary Lines created: rebuild subregions")
@@ -239,8 +250,7 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
239
250
  if machine.is_mirrored():
240
251
  plot_geom(False, # for developer
241
252
  plt, machine.previous_machine.geom,
242
- title="Mirrored Stator",
243
- areas=True)
253
+ title="Mirrored Stator")
244
254
 
245
255
  logger.debug("undo mirrored windings")
246
256
  machine_temp = machine.undo_mirror()
@@ -261,6 +271,22 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
261
271
  plt, machine_temp.geom,
262
272
  title="Nodes reduced")
263
273
 
274
+ machine_slice = machine_temp.get_forced_winding_slice()
275
+ if machine_slice:
276
+ plot_geom(False, # for developer
277
+ plt, machine_slice.geom,
278
+ title="Stator Winding Slice")
279
+
280
+ machine_temp = machine_slice
281
+ machine_temp.geom.set_stator()
282
+ machine_temp.rebuild_subregions(EESM, single=single)
283
+ if machine_temp.has_windings_in_the_middle():
284
+ machine_temp.create_mirror_lines_outside_windings()
285
+
286
+ plot_geom(False, # for developer
287
+ plt, machine_temp.geom,
288
+ title="Stator Winding Slice after Rebuild")
289
+
264
290
  if machine_temp.create_auxiliary_lines():
265
291
  machine_temp.rebuild_subregions(EESM, single=single)
266
292
  plot_geom(False, # for developer
@@ -273,7 +299,7 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
273
299
  if not machine_temp.is_mirrored():
274
300
  plot_geom(False, # for developer
275
301
  plt, machine_temp.geom,
276
- title="Stator before Boundery Corr")
302
+ title="Stator before Boundary Corr")
277
303
  machine_temp.create_boundary_nodes()
278
304
 
279
305
  plot_geom(False, # for developer
@@ -874,30 +900,29 @@ def create_femag_parameters(m_inner, m_outer, nodedist=1):
874
900
  parts_inner = int(m_inner.get_symmetry_part())
875
901
  parts_outer = int(m_outer.get_symmetry_part())
876
902
 
877
- slot_area = 0
878
- if parts_inner > parts_outer:
879
- from .area import TYPE_WINDINGS
880
- slot_area = geom_inner.area_size_of_type(TYPE_WINDINGS)
881
- num_slots = int(parts_inner)
882
- num_poles = int(parts_outer)
883
- num_sl_gen = int(geom_inner.get_symmetry_copies()+1)
884
- alfa_slot = geom_inner.get_alfa()
885
- alfa_pole = geom_outer.get_alfa()
903
+ if m_inner.geom.is_rotor():
904
+ geom_slots = geom_outer
905
+ geom_poles = geom_inner
906
+ num_slots = int(m_outer.get_symmetry_part())
907
+ num_poles = int(m_inner.get_symmetry_part())
886
908
  else:
887
- from .area import TYPE_WINDINGS
888
- slot_area = geom_outer.area_size_of_type(TYPE_WINDINGS)
889
- num_slots = int(parts_outer)
890
- num_poles = int(parts_inner)
891
- num_sl_gen = int(geom_outer.get_symmetry_copies()+1)
892
- alfa_slot = geom_outer.get_alfa()
893
- alfa_pole = geom_inner.get_alfa()
909
+ geom_slots = geom_inner
910
+ geom_poles = geom_outer
911
+ num_slots = int(m_inner.get_symmetry_part())
912
+ num_poles = int(m_outer.get_symmetry_part())
913
+
914
+ slot_area = 0
915
+ slot_area = geom_slots.area_size_of_type(TYPE_WINDINGS)
916
+ num_sl_gen = int(geom_slots.get_symmetry_copies()+1)
917
+ alfa_slot = geom_slots.get_alfa()
918
+ alfa_pole = geom_poles.get_alfa()
894
919
 
895
920
  params['tot_num_slot'] = num_slots
896
921
  params['slot_area'] = slot_area
897
922
  params['num_sl_gen'] = num_sl_gen
898
923
  params['num_poles'] = num_poles
899
924
  params['nodedist'] = nodedist
900
- params['external_rotor'] = parts_inner > parts_outer
925
+ params['external_rotor'] = m_outer.geom.is_rotor()
901
926
  params['dy1'] = 2*geom_outer.max_radius
902
927
  params['da1'] = 2*geom_outer.min_radius
903
928
  params['da2'] = 2*geom_inner.max_radius
@@ -236,18 +236,19 @@ class FslRenderer(object):
236
236
  geom.start_max_corner(1)),
237
237
  'hair = 1.0',
238
238
  'parts = {}'.format(machine.get_num_parts()),
239
- 'r1 = {} + hair'.format(geom.max_radius),
239
+ 'rmax = {}'.format(geom.max_radius),
240
+ 'r1 = rmax + hair',
240
241
  'r, phi = c2pr(x0, y0)',
241
242
  'x1, y1 = pr2c(r1, phi)',
242
243
  'x2, y2 = pr2c(r1, {}*math.pi/parts)'.format(slice),
243
244
  f'-- end max corner {geom.end_corners[-1]}',
244
245
  f'-- center {geom.center}',
245
- f'r = {geom.dist_end_max_corner()}',
246
- 'x3, y3 = pr2c(r, {}*math.pi/parts)'.format(slice),
246
+ 'r2 = {}'.format(geom.dist_end_max_corner(mirrored=False)),
247
+ 'x3, y3 = pr2c(r2, {}*math.pi/parts)'.format(slice),
247
248
  'nc_line(x0, y0, x1, y1, 0)',
248
249
  'nc_circle_m(x1, y1, x2, y2, 0.0, 0.0, 0)',
249
250
  'nc_line(x2, y2, x3, y3, 0)',
250
- 'x0, y0 = pr2c(r1 - hair/2, math.pi/parts/2)',
251
+ 'x0, y0 = pr2c(rmax + hair/2, math.pi/parts/2)',
251
252
  'create_mesh_se(x0, y0)',
252
253
  '\n',
253
254
  'outer_da_start = {}'.format(