femagtools 1.5.0__tar.gz → 1.5.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {femagtools-1.5.0/src/femagtools.egg-info → femagtools-1.5.2}/PKG-INFO +1 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/__init__.py +1 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/amela.py +5 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/femag.py +23 -5
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/fsl.py +1 -1
- femagtools-1.5.2/src/femagtools/hxy.py +181 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/isa7.py +3 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/afpm.py +131 -17
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/sizing.py +3 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/utils.py +12 -8
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/multiproc.py +1 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/nc.py +15 -10
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/afm_stator.mako +11 -2
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/fieldcalc.mako +1 -3
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/vtu.py +72 -3
- {femagtools-1.5.0 → femagtools-1.5.2/src/femagtools.egg-info}/PKG-INFO +1 -1
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/SOURCES.txt +1 -0
- femagtools-1.5.2/src/tests/test_hxy.py +19 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_sizing.py +1 -1
- femagtools-1.5.2/src/tests/test_vtu.py +42 -0
- femagtools-1.5.0/src/femagtools/hxy.py +0 -126
- femagtools-1.5.0/src/tests/test_vtu.py +0 -25
- {femagtools-1.5.0 → femagtools-1.5.2}/LICENSE +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/MANIFEST.in +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/README.md +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/pyproject.toml +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/setup.cfg +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/airgap.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/amazon.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/asm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/bch.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/bchxml.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/condor.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/conductor.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/config.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/convert.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dakota.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dakota_femag.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dakotaout.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/docker.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/area.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/conv.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/converter.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/corner.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/dumprenderer.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/fslrenderer.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/functions.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/geom.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/machine.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/plotrenderer.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/dxfsl/shape.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/ecloss.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/erg.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/forcedens.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/getset.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/gmsh.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/google.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/grid.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/jhb.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/job.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/losscoeffs.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/effloss.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/im.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/pm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/machine/sm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/magnet.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/mcv.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/me.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/model.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/algorithm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/population.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/problem.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/test/PopulationTest.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moo/test/ProblemTest.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/moproblem.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/mxw2msh.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/nc.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/netlist.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/ntib.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/opt.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/parstudy.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/bch.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/char.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/fluxdens.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/forcedens.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/mcv.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/phasor.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/plot/wdg.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/poc.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/FE-losses.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/afm_rotor.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/airgapinduc.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/asyn_motor.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/basic_modpar.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/calc_field_ts.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/calc_therm_field.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/cogg_calc.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/colorgrad.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/com_motor_sim.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/conduct-data.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/connect_models.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/cu_losses.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/ec-rotorbar.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/fe-contr.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/gen_winding.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/inductances.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/ld_lq_fast.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/leak_dist_wind.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/leak_evol_wind.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnet-data.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetFC2.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron2.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron3.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron4.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIron5.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetIronV.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetSector.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetShell.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/magnetShell2.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/mesh-airgap.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/modal_analysis.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/mult_cal_fast.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/new_model.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/noloadflux-rot.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/noloadflux.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/noloadfluxdc.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/open.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/plots.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_fast.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/pm_sym_loss.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/psd_psq_fast.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/ring.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rot_hsm.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotorAsyn.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotorKs2.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotor_msh.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/rotor_winding.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/shortcircuit.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/srm.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator1.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator2.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator3Linear.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator4.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/statorBG.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/statorRing.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/statorRotor3.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/stator_msh.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/therm-dynamic.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/therm-static.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/templates/torq_calc.mako +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/tks.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/ts.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/utils.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/vbf.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools/windings.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/dependency_links.txt +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/entry_points.txt +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/requires.txt +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/femagtools.egg-info/top_level.txt +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/engines/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/engines/test_amazon.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/engines/test_config.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/geom/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/geom/test_functions.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/geom/test_point_inside.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/__init__.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/test_algorithm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/test_population.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/moo/test_problem.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_afpm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_airgap_induction.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_amela.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_asm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_bchreader.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_conductor.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_convert.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_effloss.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_erg.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_femag.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_forcedens.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_fsl.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_im.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_isa7.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_jhb.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_job.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_losscoeffs.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_machine.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_magncurv.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_magnet.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_mcv.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_mcvreader.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_mcvwriter.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_me.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_model.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_nc.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_parident.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_parstudy.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_pocfile.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_sm.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_tksreader.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_ts.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_vbfreader.py +0 -0
- {femagtools-1.5.0 → femagtools-1.5.2}/src/tests/test_windings.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: femagtools
|
3
|
-
Version: 1.5.
|
3
|
+
Version: 1.5.2
|
4
4
|
Summary: Python API for FEMAG
|
5
5
|
Author-email: Ronald Tanner <tar@semafor.ch>, Dapu Zhang <dzhang@gtisoft.com>, Beat Holm <hob@semafor.ch>, Günther Amsler <amg@semafor.ch>, Nicolas Mauchle <mau@semafor.ch>
|
6
6
|
License: Copyright (c) 2016-2023, Semafor Informatik & Energie AG, Basel
|
@@ -200,7 +200,11 @@ class Amela():
|
|
200
200
|
for k, i in enumerate(mag_spels):
|
201
201
|
|
202
202
|
cond = i.conduc
|
203
|
-
|
203
|
+
if cond == 0:
|
204
|
+
cond = 625000
|
205
|
+
logger.info('Magnet conductivity equals 0, using 625000 S/m')
|
206
|
+
|
207
|
+
mur = np.abs(1/i.elements[0].reluc[0])
|
204
208
|
logger.debug('Magnet: mur=%s, conductivity=%s', mur, cond)
|
205
209
|
|
206
210
|
pm_elem_key.append([j.key for j in i.elements])
|
@@ -41,7 +41,7 @@ def handle_process_output(filedes, outfile, log):
|
|
41
41
|
"""read from file descriptor and direct lines to logger and outfile"""
|
42
42
|
with open(outfile, 'w') as fp:
|
43
43
|
for line in filedes:
|
44
|
-
fp.write(
|
44
|
+
fp.write(line.decode())
|
45
45
|
if log:
|
46
46
|
if (b'' == line or
|
47
47
|
b'\x1b' in line or # ignore terminal escape seq
|
@@ -482,7 +482,7 @@ class Femag(BaseFemag):
|
|
482
482
|
basename = pathlib.Path(filename).name
|
483
483
|
outname = os.path.join(self.workdir, basename+'.out')
|
484
484
|
errname = os.path.join(self.workdir, basename+'.err')
|
485
|
-
with open(
|
485
|
+
with open(errname, 'w') as err:
|
486
486
|
logger.info('invoking %s', ' '.join([str(a) for a in args]))
|
487
487
|
proc = subprocess.Popen(
|
488
488
|
args,
|
@@ -495,9 +495,15 @@ class Femag(BaseFemag):
|
|
495
495
|
errs = []
|
496
496
|
# print femag output
|
497
497
|
with io.open(outname, encoding='latin1', errors='ignore') as outfile:
|
498
|
+
errLine = False
|
498
499
|
for l in outfile:
|
499
500
|
if l.find('ERROR') > -1:
|
500
501
|
errs.append(l.strip())
|
502
|
+
errLine = True
|
503
|
+
elif errLine and l.startswith(' '): # additional error line
|
504
|
+
errs.append(l)
|
505
|
+
else:
|
506
|
+
errLine = False
|
501
507
|
|
502
508
|
rc = proc.returncode
|
503
509
|
logger.info("%s exited with returncode %d (num errs=%d)",
|
@@ -508,7 +514,7 @@ class Femag(BaseFemag):
|
|
508
514
|
for l in errfile:
|
509
515
|
errs.append(l.strip())
|
510
516
|
errs.insert(0, 'Exit code {}'.format(rc))
|
511
|
-
raise FemagError(errs)
|
517
|
+
raise FemagError("\n".join(errs))
|
512
518
|
|
513
519
|
def cleanup(self):
|
514
520
|
"removes all created files in workdir"
|
@@ -805,8 +811,8 @@ class ZmqFemag(BaseFemag):
|
|
805
811
|
logger.error("send_fsl: %s", str(e))
|
806
812
|
if timeout: # only first call raises zmq.error.Again
|
807
813
|
return ['{"status":"error", "message":"Femag is not running"}', '{}']
|
808
|
-
msg = str(e)
|
809
|
-
return ['{"status":"error", "message":
|
814
|
+
msg = json.dumps(str(e))
|
815
|
+
return ['{"status":"error", "message":'+msg+'}', '{}']
|
810
816
|
|
811
817
|
def run(self, options=['-b'], restart=False, procId=None,
|
812
818
|
stateofproblem='mag_static'): # noqa: C901
|
@@ -1003,6 +1009,18 @@ class ZmqFemag(BaseFemag):
|
|
1003
1009
|
logger.warning(response[0])
|
1004
1010
|
return [s.decode('latin1') for s in response]
|
1005
1011
|
|
1012
|
+
def exportmesh(self, fslcmds, timeout=120000):
|
1013
|
+
"""get svg format (with mesh) from fsl commands (if any graphic created)
|
1014
|
+
(since FEMAG v2024.1-17) """
|
1015
|
+
response = self.send_request(['SVG+Mesh', fslcmds], timeout=timeout)
|
1016
|
+
try:
|
1017
|
+
rc = json.loads(response[0].decode('latin1'))
|
1018
|
+
if rc['status'] == 'ok':
|
1019
|
+
return self.getfile(rc['result_file'][0])
|
1020
|
+
except json.decoder.JSONDecodeError:
|
1021
|
+
logger.warning(response[0])
|
1022
|
+
return [s.decode('latin1') for s in response]
|
1023
|
+
|
1006
1024
|
def interrupt(self):
|
1007
1025
|
"""send push message to control port to stop current calculation"""
|
1008
1026
|
context = zmq.Context.instance()
|
@@ -634,7 +634,7 @@ class Builder:
|
|
634
634
|
def create_analysis(self, sim):
|
635
635
|
pfefunc = sim.get('loss_funct', '')
|
636
636
|
if pfefunc:
|
637
|
-
sim['loss_funct'] =
|
637
|
+
sim['loss_funct'] = 1 # 3?
|
638
638
|
airgap_induc = (self.create_airgap_induc()
|
639
639
|
if sim.get('airgap_induc', 0) else [])
|
640
640
|
felosses = pfefunc.split('\n') + self.create_fe_losses(sim)
|
@@ -0,0 +1,181 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""
|
3
|
+
femagtools.hxy
|
4
|
+
~~~~~~~~~~~~~~
|
5
|
+
|
6
|
+
Reading HXY files (EXPERIMENTAL)
|
7
|
+
Build cluster of magnets
|
8
|
+
"""
|
9
|
+
|
10
|
+
import numpy as np
|
11
|
+
import logging
|
12
|
+
|
13
|
+
# K-means clustering
|
14
|
+
# https://dev.to/sajal2692/coding-k-means-clustering-using-python-and-numpy-fg1
|
15
|
+
# Sajal Sharma
|
16
|
+
# with adaptions by Ronald Tanner
|
17
|
+
def initialize_random_centroids(K, X):
|
18
|
+
"""Initializes and returns k random centroids"""
|
19
|
+
m, n = np.shape(X)
|
20
|
+
# a centroid should be of shape (1, n), so the centroids array will be of shape (K, n)
|
21
|
+
centroids = np.empty((K, n))
|
22
|
+
for i in range(K):
|
23
|
+
# pick a random data point from X as the centroid
|
24
|
+
centroids[i] = X[np.random.choice(range(m))]
|
25
|
+
return centroids
|
26
|
+
|
27
|
+
|
28
|
+
def initialize_centroids(K, X):
|
29
|
+
"""Initializes and returns k centroids"""
|
30
|
+
c = np.mean(X, axis=0)
|
31
|
+
if K < 2:
|
32
|
+
return [c]
|
33
|
+
alfa = np.arctan2(c[1], c[0]) # angle of center axis
|
34
|
+
T = np.array([[np.cos(alfa), -np.sin(alfa)],
|
35
|
+
[np.sin(alfa), np.cos(alfa)]])
|
36
|
+
p = (np.asarray(X)-c).dot(T) # rotate X
|
37
|
+
d = np.linalg.norm(p, axis=1) # distance to center
|
38
|
+
a = np.arctan2(p[:, 1], p[:, 0]) # angle to center
|
39
|
+
h, b = np.histogram(a, bins=K)
|
40
|
+
return [np.mean(X[(a>r[0]) & (a<r[1])], axis=0)
|
41
|
+
for r in np.array((b[:-1], b[1:])).T]
|
42
|
+
|
43
|
+
|
44
|
+
def closest_centroid(x, centroids, K):
|
45
|
+
"""Finds and returns the index of the closest centroid for a given vector x"""
|
46
|
+
distances = np.empty(K)
|
47
|
+
for i in range(K):
|
48
|
+
distances[i] = np.linalg.norm(centroids[i] - x)
|
49
|
+
return np.argmin(distances) # return the index of the lowest distance
|
50
|
+
|
51
|
+
|
52
|
+
def create_clusters(centroids, K, X):
|
53
|
+
"""Returns an array of cluster indices for all the data samples"""
|
54
|
+
m, _ = np.shape(X)
|
55
|
+
cluster_idx = np.empty(m, dtype=int)
|
56
|
+
for i in range(m):
|
57
|
+
cluster_idx[i] = closest_centroid(X[i], centroids, K)
|
58
|
+
return cluster_idx
|
59
|
+
|
60
|
+
|
61
|
+
def compute_means(cluster_idx, K, X):
|
62
|
+
"""Computes and returns the new centroids of the clusters"""
|
63
|
+
_, n = np.shape(X)
|
64
|
+
centroids = np.empty((K, n))
|
65
|
+
for i in range(K):
|
66
|
+
points = X[cluster_idx == i] # gather points for the cluster i
|
67
|
+
centroids[i] = np.mean(points, axis=0) # use axis=0 to compute means across points
|
68
|
+
return centroids
|
69
|
+
|
70
|
+
|
71
|
+
def run_Kmeans(K, X, max_iterations=500):
|
72
|
+
"""Runs the K-means algorithm and computes the final clusters"""
|
73
|
+
# initialize centroids
|
74
|
+
centroids = initialize_centroids(K, X)
|
75
|
+
# loop till max_iterations or convergance
|
76
|
+
logging.debug(f"initial centroids: {centroids}")
|
77
|
+
for _ in range(max_iterations):
|
78
|
+
# create clusters by assigning the samples to the closet centroids
|
79
|
+
clusters = create_clusters(centroids, K, X)
|
80
|
+
previous_centroids = centroids
|
81
|
+
# compute means of the clusters and assign to centroids
|
82
|
+
centroids = compute_means(clusters, K, X)
|
83
|
+
# if the new_centroids are the same as the old centroids, return clusters
|
84
|
+
diff = previous_centroids - centroids
|
85
|
+
if not diff.any():
|
86
|
+
return clusters
|
87
|
+
return clusters
|
88
|
+
|
89
|
+
"""references properties i to magnet k"""
|
90
|
+
class point():
|
91
|
+
def __init__(self, index, k, coord):
|
92
|
+
self.index = index
|
93
|
+
self.coord = coord
|
94
|
+
self.k = k
|
95
|
+
|
96
|
+
def readSections(f):
|
97
|
+
section = []
|
98
|
+
movepos = False
|
99
|
+
for line in f:
|
100
|
+
if line.startswith(' MOVE POSITION'):
|
101
|
+
movepos = True
|
102
|
+
if section:
|
103
|
+
# skip empty lines
|
104
|
+
i = 0
|
105
|
+
try:
|
106
|
+
while not section[i]:
|
107
|
+
i = i+1
|
108
|
+
except IndexError:
|
109
|
+
i = i-1
|
110
|
+
yield section[i:]
|
111
|
+
section = []
|
112
|
+
if movepos:
|
113
|
+
section.append(line.strip())
|
114
|
+
yield section
|
115
|
+
|
116
|
+
|
117
|
+
def read(filename, num_magnets):
|
118
|
+
"""read hxy file and return values grouped to magnets
|
119
|
+
returns:
|
120
|
+
list of m=num_magnets dicts
|
121
|
+
pos: list of n positions in degree
|
122
|
+
e: n lists of center coordinates of elements in m
|
123
|
+
hxy: n lists of field strengths in kA/m
|
124
|
+
bxy: n lists of flux densities in T
|
125
|
+
mxy: n lists of magnetization in T
|
126
|
+
havg: average of field strengths kA/m
|
127
|
+
hmax: maximum of field strengths kA/m
|
128
|
+
"""
|
129
|
+
hxy = []
|
130
|
+
with open(filename, encoding='latin1', errors='ignore') as f:
|
131
|
+
n = 0
|
132
|
+
k = 0
|
133
|
+
for s in readSections(f):
|
134
|
+
pos = float(s[0].split()[-1])
|
135
|
+
num = np.array([[float(x) for x in l.split()] for l in s[5:] if l])
|
136
|
+
hxy.append({'pos': pos, 'e': num[:, :2], 'hxy': num[:, 2:4],
|
137
|
+
'bxy': num[:, 4:6], 'mxy':num[:, 6:]})
|
138
|
+
logging.info("HXY Section %d: pos %f shape %s", n, pos, num.shape)
|
139
|
+
n += 1
|
140
|
+
if k == 0:
|
141
|
+
k = num.shape[1]
|
142
|
+
K = num_magnets
|
143
|
+
y_preds = run_Kmeans(num_magnets, np.array(hxy[0]['e']))
|
144
|
+
logging.info("Kmeans: %s",
|
145
|
+
[y_preds[y_preds==k].shape[0] for k in range(K)])
|
146
|
+
points = [point(i, k, hxy[0]['e'][i]) for i, k in enumerate(y_preds)]
|
147
|
+
# move values to magnets:
|
148
|
+
magnets = [{'e': [[h['e'][p.index]*1e-3
|
149
|
+
for p in points if p.k == k]
|
150
|
+
for h in hxy]}
|
151
|
+
for k in range(K)]
|
152
|
+
|
153
|
+
for k, mag in enumerate(magnets):
|
154
|
+
mag['pos'] = [h['pos'] for h in hxy]
|
155
|
+
for mk in ['hxy', 'bxy', 'mxy']:
|
156
|
+
mag[mk] = [[h[mk][p.index] for p in points if p.k == k]
|
157
|
+
for h in hxy]
|
158
|
+
hxyabs = [np.linalg.norm(hxy, axis=1)
|
159
|
+
for hxy in mag['hxy']]
|
160
|
+
mag['havg'] = [np.mean(a) for a in hxyabs]
|
161
|
+
mag['hmax'] = [np.max(a) for a in hxyabs]
|
162
|
+
|
163
|
+
return magnets
|
164
|
+
|
165
|
+
if __name__ == '__main__':
|
166
|
+
import sys
|
167
|
+
import matplotlib.pyplot as plt
|
168
|
+
logging.basicConfig(level=logging.INFO,
|
169
|
+
format='%(asctime)s %(message)s')
|
170
|
+
magnets = read(sys.argv[1], int(sys.argv[2]))
|
171
|
+
for m in magnets:
|
172
|
+
print(f"{len(m['e'][0])}: Havg {m['havg']} Hmax {m['hmax']}")
|
173
|
+
|
174
|
+
fig, ax = plt.subplots()
|
175
|
+
for m in magnets:
|
176
|
+
b = np.array(m['e'][0])
|
177
|
+
ax.scatter(*b.T)
|
178
|
+
ax.set_aspect('equal')
|
179
|
+
ax.autoscale(enable=True)
|
180
|
+
ax.axis('off')
|
181
|
+
plt.show()
|
@@ -1357,13 +1357,15 @@ class Element(BaseEntity):
|
|
1357
1357
|
|
1358
1358
|
def demagnetization(self, temperature=20):
|
1359
1359
|
"""return demagnetization Hx, Hy of this element"""
|
1360
|
-
return self.demag_b(self.flux_density(cosys='
|
1360
|
+
return self.demag_b(self.flux_density(cosys='polar'), temperature)
|
1361
1361
|
|
1362
1362
|
def demag_b(self, b, temperature):
|
1363
1363
|
"""return demagnetization Hx, Hy of this element at flux density b
|
1364
1364
|
and temperature"""
|
1365
1365
|
if self.is_magnet():
|
1366
|
+
# assume polar coordinates of b
|
1366
1367
|
pos = np.arctan2(self.center[1], self.center[0])
|
1368
|
+
#pos = 0 # cartesian
|
1367
1369
|
br_temp_corr = 1. + self.br_temp_coef*(temperature - 20.)
|
1368
1370
|
magn = np.sqrt(self.mag[0]**2 + self.mag[1]**2)*br_temp_corr
|
1369
1371
|
alfa = np.arctan2(self.mag[1], self.mag[0]) - pos
|
@@ -4,13 +4,16 @@
|
|
4
4
|
import logging
|
5
5
|
import numpy as np
|
6
6
|
from pathlib import Path
|
7
|
+
import shutil
|
7
8
|
from .. import poc
|
8
9
|
from .. import parstudy
|
9
10
|
from .. import model
|
10
11
|
from .. import utils
|
11
12
|
from .. import windings
|
12
|
-
from
|
13
|
+
from .. import femag
|
14
|
+
from scipy.interpolate import RegularGridInterpolator, interp1d, RectBivariateSpline
|
13
15
|
from scipy.integrate import quad
|
16
|
+
import copy
|
14
17
|
|
15
18
|
logger = logging.getLogger(__name__)
|
16
19
|
|
@@ -36,6 +39,50 @@ def _integrate1d(radius, val):
|
|
36
39
|
return interp((x))
|
37
40
|
return quad(func, radius[0], radius[-1])[0]
|
38
41
|
|
42
|
+
def ld_interpol(i1, beta, v):
|
43
|
+
'''interpolate Ld at beta angle 0°, -180°'''
|
44
|
+
# ld
|
45
|
+
cur = copy.deepcopy(i1)
|
46
|
+
betad = copy.deepcopy(beta)
|
47
|
+
if np.amin(beta) < -90 and \
|
48
|
+
np.amax(beta) > -90:
|
49
|
+
# motor and generator
|
50
|
+
v[0] = v[1]
|
51
|
+
v[-1] = v[-2]
|
52
|
+
|
53
|
+
dbeta = np.abs(beta[0][0] - beta[1][0])
|
54
|
+
bp = [[beta[0][0]-dbeta for i in range(len(np.unique(i1)))]] + beta[1:-1] + \
|
55
|
+
[[dbeta for i in range(len(np.unique(i1)))]]
|
56
|
+
else:
|
57
|
+
v[-1] = v[-2]
|
58
|
+
dbeta = np.abs(beta[0][0] - beta[1][0])
|
59
|
+
bp = beta[0:-1] + \
|
60
|
+
[[dbeta for i in range(len(np.unique(i1)))]]
|
61
|
+
|
62
|
+
return RectBivariateSpline(np.unique(bp), np.unique(cur), \
|
63
|
+
np.array(v)).ev(*[betad, i1]).tolist()
|
64
|
+
|
65
|
+
def lq_interpol(i1, beta, v):
|
66
|
+
'''interpolate Lq at beta -90°'''
|
67
|
+
if -90 not in np.unique(beta):
|
68
|
+
return v
|
69
|
+
# lq
|
70
|
+
betad = copy.deepcopy(beta)
|
71
|
+
if np.amin(beta) < -90 and \
|
72
|
+
np.amax(beta) > -90:
|
73
|
+
# motor and generator
|
74
|
+
inx = np.argwhere(np.array(beta) == -90).squeeze()
|
75
|
+
v.pop(inx[0, 0])
|
76
|
+
bp = beta[0:inx[0, 0]] + beta[inx[0, 0]+1:]
|
77
|
+
cp = i1[0:inx[0, 0]] + i1[inx[0, 0]+1:]
|
78
|
+
else:
|
79
|
+
v[0] = v[1]
|
80
|
+
dbeta = np.abs(beta[0][0] - beta[1][0])
|
81
|
+
bp = [[-90-dbeta for i in i1[0]]] + beta[1::]
|
82
|
+
cp = i1
|
83
|
+
cur = copy.deepcopy(cp)
|
84
|
+
return RectBivariateSpline(np.unique(bp), np.unique(cur), \
|
85
|
+
np.array(v)).ev(*[betad, i1]).tolist()
|
39
86
|
|
40
87
|
def parident(workdir, engine, temp, machine,
|
41
88
|
magnetizingCurves, magnetMat=[], condMat=[],
|
@@ -124,10 +171,6 @@ def parident(workdir, engine, temp, machine,
|
|
124
171
|
]
|
125
172
|
}
|
126
173
|
|
127
|
-
pstudy = parstudy.List(
|
128
|
-
workdir, condMat=condMat, magnets=magnetMat,
|
129
|
-
magnetizingCurves=magnetizingCurves,
|
130
|
-
cmd=kwargs.get('cmd', None))
|
131
174
|
|
132
175
|
ldq = []
|
133
176
|
for magtemp in temp:
|
@@ -138,12 +181,37 @@ def parident(workdir, engine, temp, machine,
|
|
138
181
|
poc=poc.Poc(999),
|
139
182
|
speed=0)
|
140
183
|
logging.info("Noload simulation")
|
141
|
-
|
142
|
-
|
143
|
-
|
184
|
+
if kwargs.get('use_multiprocessing', True):
|
185
|
+
pstudy = parstudy.List(
|
186
|
+
workdir, condMat=condMat, magnets=magnetMat,
|
187
|
+
magnetizingCurves=magnetizingCurves,
|
188
|
+
cmd=kwargs.get('cmd', None))
|
189
|
+
|
190
|
+
nlresults = pstudy(nlparvardef, machine, nlcalc, engine)
|
191
|
+
if nlresults['status'].count('C') != len(nlresults['status']):
|
192
|
+
raise ValueError('Noload simulation failed %s', nlresults['status'])
|
193
|
+
else:
|
194
|
+
nlresults = {"x": [], "f": []}
|
195
|
+
i = 0
|
196
|
+
for pw, le, sp in zip(pole_width, lfe, linspeed):
|
197
|
+
nlmachine = {k: machine[k] for k in machine}
|
198
|
+
nlmachine['pole_width'] = pw
|
199
|
+
nlmachine['lfe'] = le
|
200
|
+
nlcalc.update({"speed": sp})
|
201
|
+
nlsubdir = f'{workdir}/{i}'
|
202
|
+
nlworkdir = Path(nlsubdir)
|
203
|
+
if nlworkdir.exists():
|
204
|
+
shutil.rmtree(nlworkdir)
|
205
|
+
nlworkdir.mkdir(exist_ok=True)
|
206
|
+
noloadsim = femag.Femag(nlworkdir, condMat=condMat, magnets=magnetMat,
|
207
|
+
magnetizingCurves=magnetizingCurves,
|
208
|
+
cmd=kwargs.get('cmd', None))
|
209
|
+
r = noloadsim(nlmachine, nlcalc)
|
210
|
+
nlresults['f'].append({k: v for k, v in r.items()})
|
211
|
+
i = i + 1
|
144
212
|
nlresults.update(process(lfe, pole_width, machine, nlresults['f']))
|
145
|
-
current_angles = nlresults['f'][0]['current_angles']
|
146
213
|
|
214
|
+
current_angles = nlresults['f'][0]['current_angles']
|
147
215
|
results = []
|
148
216
|
i = 0
|
149
217
|
for l, pw in zip(lfe, pole_width):
|
@@ -152,17 +220,11 @@ def parident(workdir, engine, temp, machine,
|
|
152
220
|
mpart['lfe'] = l
|
153
221
|
subdir = f"{workdir}/{i}"
|
154
222
|
|
155
|
-
gpstudy = parstudy.Grid(
|
156
|
-
subdir, condMat=condMat, magnets=magnetMat,
|
157
|
-
magnetizingCurves=magnetizingCurves,
|
158
|
-
cmd=kwargs.get('cmd', None))
|
159
|
-
|
160
223
|
simulation = dict(
|
161
224
|
calculationMode="torq_calc",
|
162
225
|
wind_temp=20.0,
|
163
226
|
magn_temp=magtemp,
|
164
227
|
angl_i_up=0.0,
|
165
|
-
magnet_loss=True,
|
166
228
|
magn_height=machine['magnet']['afm_rotor']['magn_height'],
|
167
229
|
yoke_height=machine['magnet']['afm_rotor'].get(
|
168
230
|
'yoke_height', 0),
|
@@ -173,8 +235,36 @@ def parident(workdir, engine, temp, machine,
|
|
173
235
|
num_move_steps=60,
|
174
236
|
speed=linspeed[i],
|
175
237
|
num_par_wdgs=machine[wdgk].get('num_par_wdgs', 1))
|
176
|
-
|
177
|
-
|
238
|
+
|
239
|
+
if kwargs.get('use_multiprocessing', True):
|
240
|
+
gpstudy = parstudy.Grid(
|
241
|
+
subdir, condMat=condMat, magnets=magnetMat,
|
242
|
+
magnetizingCurves=magnetizingCurves,
|
243
|
+
cmd=kwargs.get('cmd', None))
|
244
|
+
lresults = gpstudy(parvardef, mpart, simulation, engine)
|
245
|
+
|
246
|
+
else:
|
247
|
+
lresults = {"x": [], "f": []}
|
248
|
+
domain_beta = np.linspace(beta_min, 0, num_beta_steps).tolist()
|
249
|
+
domain_cur = np.linspace(i1_max/num_cur_steps, i1_max, num_cur_steps).tolist()
|
250
|
+
dir_index = 0
|
251
|
+
for cur in domain_cur:
|
252
|
+
for be in domain_beta:
|
253
|
+
simulation['angl_i_up'] = be
|
254
|
+
simulation['current'] = cur
|
255
|
+
lresults['x'].append([be, cur])
|
256
|
+
subsubdir = subdir + f'/{dir_index}'
|
257
|
+
dir_index = dir_index + 1
|
258
|
+
lworkdir = Path(subsubdir)
|
259
|
+
if lworkdir.exists():
|
260
|
+
shutil.rmtree(lworkdir)
|
261
|
+
lworkdir.mkdir(exist_ok=True)
|
262
|
+
loadsim = femag.Femag(lworkdir, condMat=condMat, magnets=magnetMat,
|
263
|
+
magnetizingCurves=magnetizingCurves,
|
264
|
+
cmd=kwargs.get('cmd', None))
|
265
|
+
r = loadsim(mpart, simulation)
|
266
|
+
lresults['f'].append({k: v for k, v in r.items()})
|
267
|
+
|
178
268
|
f = [{k: bch[k]
|
179
269
|
for k in ('linearForce', 'flux', 'losses', 'lossPar')}
|
180
270
|
for bch in lresults['f']]
|
@@ -198,6 +288,29 @@ def parident(workdir, engine, temp, machine,
|
|
198
288
|
(-1, num_beta_steps)).T/np.sqrt(2)
|
199
289
|
psiq = np.reshape([r['psiq'] for r in postp],
|
200
290
|
(-1, num_beta_steps)).T/np.sqrt(2)
|
291
|
+
|
292
|
+
ld = np.reshape([r['Ld'] for r in postp],
|
293
|
+
(-1, num_beta_steps)).T.tolist()
|
294
|
+
lq = np.reshape([r['Lq'] for r in postp],
|
295
|
+
(-1, num_beta_steps)).T.tolist()
|
296
|
+
# interpolation ld, lq
|
297
|
+
curr, angl = [], []
|
298
|
+
for cr in range(len(beta)):
|
299
|
+
curr.append(i1)
|
300
|
+
for al in beta:
|
301
|
+
tmp = []
|
302
|
+
for cr in range(len(i1)):
|
303
|
+
tmp.append(al)
|
304
|
+
angl.append(tmp)
|
305
|
+
try:
|
306
|
+
xx, yy = copy.deepcopy(curr), copy.deepcopy(angl)
|
307
|
+
ld = ld_interpol(xx, yy, ld)
|
308
|
+
xx, yy = copy.deepcopy(curr), copy.deepcopy(angl)
|
309
|
+
lq = lq_interpol(xx, yy, lq)
|
310
|
+
except:
|
311
|
+
ld = np.zeros_like(psid).tolist()
|
312
|
+
lq = np.zeros_like(psid).tolist()
|
313
|
+
|
201
314
|
torque = np.reshape([r['torque'] for r in postp],
|
202
315
|
(-1, num_beta_steps)).T
|
203
316
|
losses = {k: np.flip(np.reshape([r['plfe'][k] for r in postp],
|
@@ -214,6 +327,7 @@ def parident(workdir, engine, temp, machine,
|
|
214
327
|
ldq.append({'temperature': magtemp,
|
215
328
|
'i1':i1, 'beta':beta,
|
216
329
|
'psid': psid.tolist(), 'psiq': psiq.tolist(),
|
330
|
+
'ld': ld, 'lq': lq,
|
217
331
|
'torque': torque.tolist(),
|
218
332
|
'losses': losses})
|
219
333
|
# T = 3/2 p (Psid iq - Psiq id)
|
@@ -736,8 +736,10 @@ def im(pnom: float, speed: float, p: int, **kwargs) -> dict:
|
|
736
736
|
slots = []
|
737
737
|
r = get_stator_dimensions(par, slots=slots)
|
738
738
|
# rotor parameters
|
739
|
+
rtype = kwargs.get('rtype', 'rotorKs2')
|
739
740
|
r['rotor'] = get_im_rotor_dimensions(
|
740
|
-
par['cos_phi']*r['A'], r['Da2'], r['psi1'], r['lfe'],
|
741
|
+
par['cos_phi']*r['A'], r['Da2'], r['psi1'], r['lfe'],
|
742
|
+
par, rtype=rtype)
|
741
743
|
_set_genpars(r, 2*par['p'])
|
742
744
|
r['name'] = f"IM-{r['poles']}"
|
743
745
|
return r
|
@@ -350,21 +350,27 @@ def dqparident(workdir, engine, temp, machine,
|
|
350
350
|
"""
|
351
351
|
import pathlib
|
352
352
|
|
353
|
-
|
353
|
+
wdgk = 'windings' if 'windings' in machine else 'winding'
|
354
|
+
da1 = machine['bore_diam']
|
354
355
|
Q1 = machine['stator']['num_slots']
|
356
|
+
lfe = machine['lfe']
|
357
|
+
g = machine[wdgk].get('num_par_wdgs', 1)
|
355
358
|
slotmodel = [k for k in machine['stator'] if isinstance(
|
356
359
|
machine['stator'][k], dict)][-1]
|
357
360
|
if slotmodel == 'stator1':
|
358
361
|
hs = machine['stator']['stator1']['slot_rf1'] - \
|
359
362
|
machine['stator']['stator1']['tip_rh1']
|
360
363
|
else:
|
361
|
-
|
362
|
-
|
364
|
+
dy1 = machine['outer_diam']
|
365
|
+
hs = machine['stator'][slotmodel].get(
|
366
|
+
'slot_height', 0.6*(dy1-da1)/2)
|
367
|
+
|
363
368
|
N = machine[wdgk]['num_wires']
|
364
|
-
Jmax =
|
369
|
+
Jmax = 20e6 # max current density in A/m2
|
370
|
+
f = machine[wdgk].get('fillfac', 0.42)
|
371
|
+
Acu = f*0.5*np.pi*(da1+hs)*hs
|
372
|
+
i1_max = round(Acu/Q1/N*Jmax/10)*10
|
365
373
|
|
366
|
-
i1_max = round(0.28*np.pi*hs*(da1+hs)/Q1/N*Jmax*1e5)*10 * \
|
367
|
-
machine[wdgk].get('num_par_wdgs', 1)
|
368
374
|
period_frac = kwargs.get('period_frac', 6)
|
369
375
|
if machine.get('external_rotor', False):
|
370
376
|
period_frac = 1 # TODO: missing femag support
|
@@ -381,8 +387,6 @@ def dqparident(workdir, engine, temp, machine,
|
|
381
387
|
|
382
388
|
wdg = windings.Winding(wpar)
|
383
389
|
|
384
|
-
lfe = machine['lfe']
|
385
|
-
g = machine[wdgk].get('num_par_wdgs', 1)
|
386
390
|
if 'wire_gauge' in machine[wdgk]:
|
387
391
|
aw = machine[wdgk]['wire_gauge']
|
388
392
|
elif 'dia_wire' in machine[wdgk]:
|
@@ -14,16 +14,21 @@ DEFAULT_CMAP='viridis'
|
|
14
14
|
"""default colormap (see https://matplotlib.org/stable/users/explain/colors/colormaps.html)"""
|
15
15
|
|
16
16
|
|
17
|
-
def spel(isa, with_axis=False, ax=0):
|
17
|
+
def spel(isa, superelements=[], with_axis=False, ax=0):
|
18
18
|
"""plot super elements of I7/ISA7 model
|
19
19
|
Args:
|
20
20
|
isa: Isa7 object
|
21
|
+
superelements: list of super elements (all if empty)
|
21
22
|
"""
|
22
23
|
from matplotlib.patches import Polygon
|
23
24
|
if ax == 0:
|
24
25
|
ax = plt.gca()
|
25
26
|
ax.set_aspect('equal')
|
26
|
-
|
27
|
+
if superelements:
|
28
|
+
spels = superelements
|
29
|
+
else:
|
30
|
+
spels = isa.superelements
|
31
|
+
for se in spels:
|
27
32
|
ax.add_patch(Polygon([n.xy
|
28
33
|
for nc in se.nodechains
|
29
34
|
for n in nc.nodes],
|
@@ -79,17 +84,16 @@ def _contour(ax, title, elements, values, label='',
|
|
79
84
|
for n in nc.nodes],
|
80
85
|
color='gray', alpha=0.1, lw=0))
|
81
86
|
valid_values = np.logical_not(np.isnan(values))
|
82
|
-
|
83
|
-
|
87
|
+
vertices = [[v.xy for v in e.vertices] for e in elements]
|
88
|
+
patches = np.array([Polygon(xy) for xy in vertices])[valid_values]
|
84
89
|
p = PatchCollection(patches, match_original=False,
|
85
90
|
cmap=cmap, alpha=alpha)
|
86
91
|
p.set_array(np.asarray(values)[valid_values])
|
87
92
|
ax.add_collection(p)
|
88
93
|
cb = plt.colorbar(p, shrink=0.9)
|
89
94
|
|
90
|
-
for patch in np.array([Polygon(
|
91
|
-
|
92
|
-
for e in elements])[np.isnan(values)]:
|
95
|
+
for patch in np.array([Polygon(xy, fc='white', alpha=1.0)
|
96
|
+
for xy in vertices])[np.isnan(values)]:
|
93
97
|
ax.add_patch(patch)
|
94
98
|
if label:
|
95
99
|
cb.set_label(label=label)
|
@@ -130,9 +134,10 @@ def demag_pos(isa, pos=-1, icur=-1, ibeta=-1, cmap=DEFAULT_CMAP, ax=0):
|
|
130
134
|
x = isa.pos_el_fe_induction[i]
|
131
135
|
|
132
136
|
hpol = demag[:, i]
|
137
|
+
hmax = np.max(hpol)
|
133
138
|
hpol[hpol == 0] = np.nan
|
134
|
-
_contour(ax, f'Demagnetization at pos. {round(x/np.pi*180):.1f}°,'
|
135
|
-
f'{isa.MAGN_TEMPERATURE} °C (max -{
|
139
|
+
_contour(ax, f'Demagnetization at pos. {round(x/np.pi*180):.1f}°, '
|
140
|
+
f'{isa.MAGN_TEMPERATURE} °C (max -{hmax:.1f} kA/m)',
|
136
141
|
emag, hpol, '-H / kA/m', cmap, isa)
|
137
142
|
logger.info("Max demagnetization %f kA/m", np.nanmax(hpol))
|
138
143
|
|
@@ -232,7 +237,7 @@ def flux_density_pos(isa, ipos, subreg=[], icur=-1, ibeta=-1, cmap=DEFAULT_CMAP,
|
|
232
237
|
for e in elements:
|
233
238
|
fd = isa.flux_density(e, icur, ibeta)
|
234
239
|
b.append(np.linalg.norm(
|
235
|
-
(fd['bx'][ipos], fd['
|
240
|
+
(fd['bx'][ipos], fd['by'][ipos])))
|
236
241
|
fluxd = np.array(b)
|
237
242
|
pos = isa.pos_el_fe_induction[ipos]*180/np.pi
|
238
243
|
isa.rotate(isa.pos_el_fe_induction[ipos])
|