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