femagtools 1.4.3__tar.gz → 1.4.5__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.4.3/src/femagtools.egg-info → femagtools-1.4.5}/PKG-INFO +17 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/pyproject.toml +1 -1
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/__init__.py +6 -13
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/airgap.py +5 -8
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/amazon.py +1 -8
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/amela.py +83 -95
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/asm.py +1 -5
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/bch.py +7 -13
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/bchxml.py +23 -14
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dakota.py +7 -12
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dakota_femag.py +1 -1
- femagtools-1.4.5/src/femagtools/dxfsl/__init__.py +8 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/area.py +23 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/converter.py +1 -6
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/machine.py +1 -6
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/ecloss.py +66 -69
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/femag.py +15 -20
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/fsl.py +21 -21
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/google.py +3 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/isa7.py +11 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/losscoeffs.py +29 -1
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/__init__.py +5 -9
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/afpm.py +66 -56
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/effloss.py +36 -31
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/im.py +31 -38
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/pm.py +21 -6
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/sizing.py +62 -16
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/sm.py +24 -21
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/machine/utils.py +24 -23
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/mcv.py +29 -34
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/model.py +19 -20
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/algorithm.py +4 -6
- femagtools-1.4.5/src/femagtools/mxw2msh.py +86 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/nc.py +3 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/opt.py +3 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/parstudy.py +3 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/__init__.py +8 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/fluxdens.py +3 -4
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/forcedens.py +6 -5
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/mcv.py +1 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/nc.py +5 -1
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/wdg.py +11 -13
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/afm_rotor.mako +4 -5
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/afm_stator.mako +14 -10
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/gen_winding.mako +20 -20
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetSector.mako +52 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/mesh-airgap.mako +21 -1
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/therm-static.mako +5 -4
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/ts.py +9 -17
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/vtu.py +51 -68
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/windings.py +8 -12
- {femagtools-1.4.3 → femagtools-1.4.5/src/femagtools.egg-info}/PKG-INFO +17 -3
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools.egg-info/SOURCES.txt +1 -0
- {femagtools-1.4.3/src/femagtools/dxfsl → femagtools-1.4.5/src/tests}/__init__.py +0 -0
- femagtools-1.4.5/src/tests/test_mcv.py +10 -0
- femagtools-1.4.3/src/femagtools/mxw2msh.py +0 -77
- femagtools-1.4.3/src/tests/__init__.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/LICENSE +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/MANIFEST.in +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/README.md +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/setup.cfg +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/condor.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/conductor.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/config.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/convert.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dakotaout.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/docker.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/conv.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/corner.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/dumprenderer.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/fslrenderer.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/functions.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/geom.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/plotrenderer.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/dxfsl/shape.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/erg.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/forcedens.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/getset.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/gmsh.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/grid.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/hxy.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/jhb.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/job.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/magnet.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/me.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/__init__.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/population.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/problem.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/test/AlgorithmTest.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/test/PopulationTest.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moo/test/ProblemTest.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/moproblem.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/multiproc.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/netlist.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/ntib.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/bch.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/char.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/plot/phasor.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/poc.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/FE-losses.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/airgapinduc.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/asyn_motor.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/basic_modpar.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/calc_field_ts.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/calc_therm_field.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/cogg_calc.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/colorgrad.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/com_motor_sim.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/conduct-data.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/connect_models.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/cu_losses.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/ec-rotorbar.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/fe-contr.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/fieldcalc.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/inductances.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/ld_lq_fast.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/leak_dist_wind.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/leak_evol_wind.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/leak_tooth_wind.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnet-data.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetFC2.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetIron.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetIron2.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetIron3.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetIron4.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetIron5.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetIronV.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetSectorLinear.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetShell.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/magnetShell2.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/modal_analysis.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/mult_cal_fast.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/new_model.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/noloadflux-rot.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/noloadflux.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/noloadfluxdc.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/open.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/plots.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/pm_sym_f_cur.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/pm_sym_fast.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/pm_sym_loss.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/psd_psq_fast.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/ring.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/rot_hsm.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/rotorAsyn.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/rotorKs2.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/rotor_msh.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/rotor_winding.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/shortcircuit.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/srm.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/stator1.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/stator2.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/stator3Linear.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/stator4.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/statorBG.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/statorRing.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/statorRotor3.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/stator_msh.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/therm-dynamic.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/templates/torq_calc.mako +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/tks.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/utils.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools/vbf.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools.egg-info/dependency_links.txt +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools.egg-info/entry_points.txt +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools.egg-info/requires.txt +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/femagtools.egg-info/top_level.txt +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/engines/__init__.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/engines/test_amazon.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/engines/test_config.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/geom/__init__.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/geom/test_functions.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/geom/test_point_inside.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/moo/__init__.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/moo/test_algorithm.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/moo/test_population.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/moo/test_problem.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_afpm.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_airgap_induction.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_amela.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_asm.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_bchreader.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_conductor.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_convert.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_effloss.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_erg.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_femag.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_forcedens.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_fsl.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_im.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_isa7.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_jhb.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_job.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_losscoeffs.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_machine.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_magncurv.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_magnet.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_mcvreader.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_mcvwriter.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_me.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_model.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_nc.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_parident.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_parstudy.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_pocfile.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_sizing.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_sm.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_tksreader.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_ts.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_vbfreader.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_vtu.py +0 -0
- {femagtools-1.4.3 → femagtools-1.4.5}/src/tests/test_windings.py +0 -0
@@ -1,8 +1,8 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: femagtools
|
3
|
-
Version: 1.4.
|
3
|
+
Version: 1.4.5
|
4
4
|
Summary: Python API for FEMAG
|
5
|
-
Author-email: Ronald Tanner <tar@semafor.ch>, Dapu Zhang <
|
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
|
7
7
|
All rights reserved.
|
8
8
|
|
@@ -35,13 +35,27 @@ Classifier: License :: OSI Approved :: BSD License
|
|
35
35
|
Classifier: Topic :: Scientific/Engineering
|
36
36
|
Requires-Python: >=3.7
|
37
37
|
Description-Content-Type: text/markdown
|
38
|
+
License-File: LICENSE
|
39
|
+
Requires-Dist: numpy
|
40
|
+
Requires-Dist: scipy
|
41
|
+
Requires-Dist: mako
|
42
|
+
Requires-Dist: six
|
43
|
+
Requires-Dist: lmfit
|
44
|
+
Requires-Dist: netCDF4
|
38
45
|
Provides-Extra: dxfsl
|
46
|
+
Requires-Dist: lxml; extra == "dxfsl"
|
47
|
+
Requires-Dist: dxfgrabber; extra == "dxfsl"
|
48
|
+
Requires-Dist: networkx; extra == "dxfsl"
|
39
49
|
Provides-Extra: mplot
|
50
|
+
Requires-Dist: matplotlib; extra == "mplot"
|
40
51
|
Provides-Extra: meshio
|
52
|
+
Requires-Dist: meshio; extra == "meshio"
|
41
53
|
Provides-Extra: vtk
|
54
|
+
Requires-Dist: vtk; extra == "vtk"
|
42
55
|
Provides-Extra: zmq
|
56
|
+
Requires-Dist: pyzmq; extra == "zmq"
|
43
57
|
Provides-Extra: test
|
44
|
-
|
58
|
+
Requires-Dist: pytest; extra == "test"
|
45
59
|
|
46
60
|
|
47
61
|
# Introduction to Femagtools
|
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
|
|
6
6
|
name = "femagtools"
|
7
7
|
authors = [
|
8
8
|
{name = "Ronald Tanner", email = "tar@semafor.ch"},
|
9
|
-
{name = "Dapu Zhang", email = "
|
9
|
+
{name = "Dapu Zhang", email = "dzhang@gtisoft.com"},
|
10
10
|
{name = "Beat Holm", email = "hob@semafor.ch"},
|
11
11
|
{name = "Günther Amsler", email = "amg@semafor.ch"},
|
12
12
|
{name = "Nicolas Mauchle", email = "mau@semafor.ch"}
|
@@ -1,15 +1,8 @@
|
|
1
|
-
|
2
|
-
"""
|
3
|
-
femagtools
|
4
|
-
~~~~~~~~~~
|
5
|
-
|
6
|
-
Python bindings for FEMAG
|
7
|
-
|
8
|
-
|
1
|
+
"""Python API for FEMAG
|
9
2
|
|
10
3
|
"""
|
11
4
|
__title__ = 'femagtools'
|
12
|
-
__version__ = '1.4.
|
5
|
+
__version__ = '1.4.5'
|
13
6
|
__author__ = 'Ronald Tanner'
|
14
7
|
__license__ = 'BSD'
|
15
8
|
__copyright__ = 'Copyright 2016-2022 SEMAFOR Informatik & Energie AG'
|
@@ -37,12 +30,12 @@ def create_fsl(machine,
|
|
37
30
|
magnetmat=[],
|
38
31
|
condMat=[],
|
39
32
|
templatedirs=[]):
|
40
|
-
"""create FSL command list from model parameters
|
33
|
+
"""create FSL command list from model and operating parameters
|
41
34
|
|
42
35
|
Args:
|
43
|
-
machine: dict with parameters
|
44
|
-
|
45
|
-
magnetmat: list fo dict with parameters
|
36
|
+
machine: dict with parameters (model)
|
37
|
+
operatingConditions: dict with parameters (simulation)
|
38
|
+
magnetmat: list fo dict with parameters (magnet material)
|
46
39
|
templatedir: additional template directory
|
47
40
|
"""
|
48
41
|
model = MachineModel(machine)
|
@@ -1,10 +1,4 @@
|
|
1
|
-
|
2
|
-
"""
|
3
|
-
femagtools.airgap
|
4
|
-
~~~~~~~~~~~~~~~~~
|
5
|
-
|
6
|
-
Read airgap dat file
|
7
|
-
|
1
|
+
"""Read and analyze airgap dat file
|
8
2
|
|
9
3
|
"""
|
10
4
|
import numpy as np
|
@@ -14,7 +8,7 @@ from . import utils
|
|
14
8
|
logger = logging.getLogger(__name__)
|
15
9
|
|
16
10
|
|
17
|
-
def fft(pos, b, pmod=0):
|
11
|
+
def fft(pos: list, b: list, pmod=0) -> dict:
|
18
12
|
"""calculate fft spectrum of flux density and return samples,
|
19
13
|
values, amplitude and phase of base harmonic
|
20
14
|
|
@@ -22,6 +16,9 @@ def fft(pos, b, pmod=0):
|
|
22
16
|
pos: (list of floats) sample positions
|
23
17
|
b: (list of floats) flux density values
|
24
18
|
pmod: number of poles in model (ignored if 0)
|
19
|
+
|
20
|
+
Returns:
|
21
|
+
A dict containing the FFT values Bamp, phi0, nue, B_nue
|
25
22
|
"""
|
26
23
|
r = utils.fft(pos, b, pmod)
|
27
24
|
Bamp = r['a']
|
@@ -1,8 +1,5 @@
|
|
1
|
-
'''
|
2
|
-
femagtools.amela
|
3
|
-
~~~~~~~~~~~~~~~~
|
1
|
+
'''Calculate Magnet Losses with AMELA
|
4
2
|
|
5
|
-
Calculate Magnet Losses with AMELA
|
6
3
|
'''
|
7
4
|
import sys
|
8
5
|
import json
|
@@ -18,8 +15,8 @@ import subprocess
|
|
18
15
|
logger = logging.getLogger(__name__)
|
19
16
|
|
20
17
|
def geometry_id(bndx, bndy):
|
21
|
-
'''identify the magnet geometry'''
|
22
|
-
# caculate magnet area
|
18
|
+
'''identify the magnet geometry'''
|
19
|
+
# caculate magnet area
|
23
20
|
xy = 0
|
24
21
|
yx = 0
|
25
22
|
for i in range(len(bndy)):
|
@@ -32,21 +29,21 @@ def geometry_id(bndx, bndy):
|
|
32
29
|
area = np.abs(yx-xy)*0.5
|
33
30
|
|
34
31
|
x0, y0 = np.mean(bndx), np.mean(bndy)
|
35
|
-
distances = []
|
36
|
-
for i in range(len(bndx)):
|
37
|
-
for j in range(len(bndy)):
|
32
|
+
distances = []
|
33
|
+
for i in range(len(bndx)):
|
34
|
+
for j in range(len(bndy)):
|
38
35
|
dist = np.sqrt((bndx[i] - bndx[j])**2 + (bndy[i] - bndy[j])**2)
|
39
36
|
distances.append([dist, bndx[i], bndx[j], bndy[i], bndy[j]])
|
40
|
-
|
37
|
+
|
41
38
|
distances.sort(reverse=True)
|
42
39
|
xe = [distances[0][2], distances[2][1], distances[0][1], distances[2][2]]
|
43
40
|
ye = [distances[0][4], distances[2][3], distances[0][3], distances[2][4]]
|
44
41
|
|
45
|
-
# dimension
|
42
|
+
# dimension
|
46
43
|
dim = np.zeros((3, 5))
|
47
44
|
x1, y1 = xe[0], ye[0]
|
48
45
|
|
49
|
-
for i in range(3):
|
46
|
+
for i in range(3):
|
50
47
|
x2, y2 = xe[i+1], ye[i+1]
|
51
48
|
dim[i, 0] = np.sqrt((x2-x1)**2 + (y2-y1)**2)
|
52
49
|
dim[i, 1:3] = [x1, x2]
|
@@ -55,79 +52,75 @@ def geometry_id(bndx, bndy):
|
|
55
52
|
dim = dim[np.lexsort((dim[:, 2], dim[:, 1], dim[:, 0]))]
|
56
53
|
dx12, dy12 = dim[1, 1] - dim[1, 2], dim[1, 3] - dim[1, 4]
|
57
54
|
dx14, dy14 = dim[0, 1] - dim[0, 2], dim[0, 3] - dim[0, 4]
|
58
|
-
|
55
|
+
|
59
56
|
alp1 = np.arctan2(dy12, dx12)
|
60
57
|
alp2 = np.arctan2(dy14, dx14)
|
61
58
|
|
62
59
|
if alp1 < 0: alp1 += 2*np.pi
|
63
60
|
if alp2 < 0: alp2 += 2*np.pi
|
64
|
-
if alp2 < alp1:
|
61
|
+
if alp2 < alp1:
|
65
62
|
alp2 += np.pi
|
66
63
|
alpha = (alp1 + (alp2 - np.pi/2))/2
|
67
|
-
else:
|
64
|
+
else:
|
68
65
|
alpha = (alp1 + (alp2 - np.pi/2))/2 + np.pi
|
69
|
-
|
66
|
+
|
70
67
|
wm = dim[1, 0]
|
71
|
-
hm = area/wm
|
68
|
+
hm = area/wm
|
72
69
|
|
73
|
-
return dict(wm=wm,
|
74
|
-
hm=hm,
|
75
|
-
x0=x0,
|
70
|
+
return dict(wm=wm,
|
71
|
+
hm=hm,
|
72
|
+
x0=x0,
|
76
73
|
y0=y0,
|
77
|
-
area=area,
|
74
|
+
area=area,
|
78
75
|
alpha=alpha)
|
79
76
|
|
80
77
|
def tf(b1, b2, alpha):
|
81
78
|
'''Tranformation Matrix'''
|
82
|
-
T = np.array([[cos(alpha), sin(alpha)],
|
83
|
-
[-sin(alpha), cos(alpha)]])
|
84
|
-
if b1.ndim > 1:
|
79
|
+
T = np.array([[cos(alpha), sin(alpha)],
|
80
|
+
[-sin(alpha), cos(alpha)]])
|
81
|
+
if b1.ndim > 1:
|
85
82
|
r = T.dot(((b1.ravel()), (b2.ravel())))
|
86
|
-
return [r[0, :].reshape(*b1.shape),
|
83
|
+
return [r[0, :].reshape(*b1.shape),
|
87
84
|
r[1, :].reshape(*b1.shape)]
|
88
|
-
else:
|
85
|
+
else:
|
89
86
|
return T.dot(((b1), (b2)))
|
90
87
|
|
91
|
-
def transform_coord(geometry, xcp, ycp):
|
88
|
+
def transform_coord(geometry, xcp, ycp):
|
92
89
|
'''transform from global coord to local coord'''
|
93
|
-
# transformation
|
94
|
-
elcp = tf(b1=np.array(xcp)-geometry['x0'],
|
95
|
-
b2=np.array(ycp)-geometry['y0'],
|
90
|
+
# transformation
|
91
|
+
elcp = tf(b1=np.array(xcp)-geometry['x0'],
|
92
|
+
b2=np.array(ycp)-geometry['y0'],
|
96
93
|
alpha=geometry['alpha'])
|
97
|
-
return dict(excpl=elcp[0, :]+geometry['wm']/2,
|
98
|
-
eycpl=elcp[1, :]+geometry['hm']/2,
|
99
|
-
excp=np.array(xcp),
|
94
|
+
return dict(excpl=elcp[0, :]+geometry['wm']/2,
|
95
|
+
eycpl=elcp[1, :]+geometry['hm']/2,
|
96
|
+
excp=np.array(xcp),
|
100
97
|
eycp=np.array(ycp))
|
101
98
|
|
102
|
-
def transform_flux_denstiy(geometry, bx, by):
|
99
|
+
def transform_flux_denstiy(geometry, bx, by):
|
103
100
|
'''transform the magnet flux density to local coordinate system'''
|
104
|
-
# transformation
|
105
|
-
bxy = tf(b1=bx,
|
106
|
-
b2=by,
|
101
|
+
# transformation
|
102
|
+
bxy = tf(b1=bx,
|
103
|
+
b2=by,
|
107
104
|
alpha=geometry['alpha'])
|
108
105
|
|
109
106
|
# remove DC component
|
110
107
|
bxf = np.mean(bxy[0].T - np.mean(bxy[0],axis=1).T,axis=1)
|
111
|
-
byf = np.mean(bxy[1].T - np.mean(bxy[1],axis=1).T,axis=1)
|
112
|
-
|
108
|
+
byf = np.mean(bxy[1].T - np.mean(bxy[1],axis=1).T,axis=1)
|
109
|
+
|
113
110
|
return dict(bxl=bxy[0],
|
114
111
|
byl=bxy[1],
|
115
|
-
bxf=bxf,
|
116
|
-
byf=byf
|
112
|
+
bxf=bxf,
|
113
|
+
byf=byf
|
117
114
|
)
|
118
115
|
|
119
116
|
class Amela():
|
120
117
|
'''Run Amela Calculation
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
amela directory
|
128
|
-
magnet_data : dict
|
129
|
-
calculation control
|
130
|
-
-- name must be provided
|
118
|
+
|
119
|
+
Args:
|
120
|
+
workdir : working directory of femag calculation
|
121
|
+
(The directory that includes the nc file)
|
122
|
+
amela_dir: str (optional) amela directory
|
123
|
+
magnet_data : calculation control name must be provided
|
131
124
|
dict(name='test',
|
132
125
|
-- the following parameters are optional
|
133
126
|
mur=1.05,
|
@@ -135,18 +128,18 @@ class Amela():
|
|
135
128
|
hm=3,
|
136
129
|
wm=20,
|
137
130
|
lm=30,
|
138
|
-
speed=1000,
|
139
|
-
nsegwid=0,
|
131
|
+
speed=1000,
|
132
|
+
nsegwid=0,
|
140
133
|
nseglen=0)
|
141
134
|
'''
|
142
135
|
|
143
|
-
def __init__(self, workdir, magnet_data, amela_dir=None):
|
136
|
+
def __init__(self, workdir: str, magnet_data: dict, amela_dir=None):
|
144
137
|
|
145
138
|
self.magn = magnet_data
|
146
139
|
self.workdir = pathlib.Path(workdir)
|
147
|
-
if amela_dir is not None:
|
140
|
+
if amela_dir is not None:
|
148
141
|
self.amela_dir = pathlib.Path(amela_dir)
|
149
|
-
else:
|
142
|
+
else:
|
150
143
|
self.amela_dir = self.workdir
|
151
144
|
|
152
145
|
self.jsonfile = []
|
@@ -154,7 +147,7 @@ class Amela():
|
|
154
147
|
self.cmd = [str(self.amela_dir / 'AMELA.BAT')]
|
155
148
|
else:
|
156
149
|
self.cmd = [str(self.amela_dir / 'AMELA')]
|
157
|
-
# default batch
|
150
|
+
# default batch
|
158
151
|
self.cmd.append('--b')
|
159
152
|
# append calc options
|
160
153
|
if 'speed' in self.magn:
|
@@ -164,14 +157,15 @@ class Amela():
|
|
164
157
|
if 'nseglen' in self.magn:
|
165
158
|
self.cmd.append(f"--nseglen {self.magn['nseglen']}")
|
166
159
|
|
167
|
-
def get_magnet_data(self, ibeta=None):
|
160
|
+
def get_magnet_data(self, ibeta=None) -> list:
|
168
161
|
'''Extract magnet data from nc file
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
162
|
+
|
163
|
+
Args:
|
164
|
+
ibeta: load case
|
165
|
+
|
166
|
+
Returns:
|
167
|
+
pm_data: list of magnet data
|
168
|
+
|
175
169
|
'''
|
176
170
|
nc_name = self.workdir / self.magn['name']
|
177
171
|
r = femagtools.nc.read(nc_name)
|
@@ -194,7 +188,7 @@ class Amela():
|
|
194
188
|
wm = []
|
195
189
|
hm = []
|
196
190
|
alpha = []
|
197
|
-
x0 = []
|
191
|
+
x0 = []
|
198
192
|
y0 = []
|
199
193
|
geometry = []
|
200
194
|
elcp = []
|
@@ -255,7 +249,7 @@ class Amela():
|
|
255
249
|
poles = 0
|
256
250
|
try:
|
257
251
|
poles = r.num_poles
|
258
|
-
except:
|
252
|
+
except AttributeError:
|
259
253
|
pass
|
260
254
|
|
261
255
|
# read mesh and flux density
|
@@ -279,7 +273,6 @@ class Amela():
|
|
279
273
|
elcp.append(transform_coord(geometry[i], xcp[i], ycp[i]))
|
280
274
|
bl.append(transform_flux_denstiy(geometry[i], bx[i][0], by[i][0]))
|
281
275
|
|
282
|
-
|
283
276
|
if poles == 0:
|
284
277
|
freq = self.magn.get('f', r.speed)
|
285
278
|
time_vec = np.linspace(0, 1/freq, len(r.pos_el_fe_induction))
|
@@ -314,7 +307,7 @@ class Amela():
|
|
314
307
|
bndy=[float(c) for c in bndy[i]],
|
315
308
|
bl=bl[i],
|
316
309
|
elcp=elcp[i],
|
317
|
-
area=spel_area[i],
|
310
|
+
area=spel_area[i],
|
318
311
|
spel_key=spel_key[i]))
|
319
312
|
pm_data[i].update(pos)
|
320
313
|
|
@@ -340,7 +333,7 @@ class Amela():
|
|
340
333
|
else:
|
341
334
|
return [pm_data[0]]
|
342
335
|
|
343
|
-
def get_magnet_data_all(self, num_op):
|
336
|
+
def get_magnet_data_all(self, num_op):
|
344
337
|
'''get all magnet data for all loadcases'''
|
345
338
|
pm_data = []
|
346
339
|
for i in num_op:
|
@@ -348,15 +341,12 @@ class Amela():
|
|
348
341
|
pm_data.append(pmd)
|
349
342
|
return pm_data
|
350
343
|
|
351
|
-
def export_json(self, pm_data):
|
344
|
+
def export_json(self, pm_data: list):
|
352
345
|
'''Export magnet data to json files
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
----------
|
358
|
-
None
|
359
|
-
----------
|
346
|
+
|
347
|
+
Args:
|
348
|
+
pm_data: list of magnet data
|
349
|
+
|
360
350
|
'''
|
361
351
|
pm_dir = self.amela_dir / self.magn['name']
|
362
352
|
pm_dir.mkdir(exist_ok=True)
|
@@ -370,15 +360,14 @@ class Amela():
|
|
370
360
|
json.dump(i, f)
|
371
361
|
logger.info('Exporting %s ...', i['name'])
|
372
362
|
|
373
|
-
def read_loss(self, pm_data):
|
363
|
+
def read_loss(self, pm_data: dict) -> dict:
|
374
364
|
'''Read magnet losses
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
----------
|
365
|
+
|
366
|
+
Args:
|
367
|
+
pm_data : dict
|
368
|
+
|
369
|
+
Returns:
|
370
|
+
losses
|
382
371
|
'''
|
383
372
|
losses = {}
|
384
373
|
for i in range(len(pm_data)):
|
@@ -387,27 +376,26 @@ class Amela():
|
|
387
376
|
result_name = self.amela_dir / dirname
|
388
377
|
with result_name.open() as f:
|
389
378
|
data = np.loadtxt(f)
|
390
|
-
total_loss = np.mean(data[0:-1, -1])
|
379
|
+
total_loss = np.mean(data[0:-1, -1])
|
391
380
|
losses[pm_data[i]['name']] = {"loss_data":data, "total_loss": total_loss}
|
392
381
|
logger.info("Magnet losses in superelement %s is %.3f W",
|
393
382
|
pm_data[i]['name'].split('se')[-1], total_loss)
|
394
383
|
return losses
|
395
384
|
|
396
|
-
def __call__(self, ialh=False):
|
385
|
+
def __call__(self, ialh=False) -> dict:
|
397
386
|
'''Run amela calculation
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
losses
|
404
|
-
----------
|
387
|
+
|
388
|
+
Args:
|
389
|
+
ialh: use method IALH if True else 3DI
|
390
|
+
|
391
|
+
Returns:
|
392
|
+
losses
|
405
393
|
'''
|
406
394
|
# get magnet data
|
407
395
|
r = self.get_magnet_data()
|
408
396
|
# export to json
|
409
397
|
self.export_json(r)
|
410
|
-
# run amela
|
398
|
+
# run amela
|
411
399
|
calc_method = 'IALH' if ialh else '3DI'
|
412
400
|
cmd = self.cmd + ['--calc', calc_method, self.magn['name'] + '/']
|
413
401
|
log_file = self.amela_dir / 'amela.out'
|
@@ -1,11 +1,5 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
"""
|
3
|
-
femagtools.bch
|
4
|
-
~~~~~~~~~~~~~~
|
5
|
-
|
6
|
-
Reading BCH/BATCH files
|
7
|
-
|
8
|
-
|
2
|
+
"""read BCH/BATCH files
|
9
3
|
|
10
4
|
"""
|
11
5
|
import sys
|
@@ -442,7 +436,7 @@ class Reader:
|
|
442
436
|
|
443
437
|
def __read_current_angles(self, content):
|
444
438
|
self.current_angles = []
|
445
|
-
r = []
|
439
|
+
r = []
|
446
440
|
extracting = False
|
447
441
|
for l in content:
|
448
442
|
rec = self.__findNums(l)
|
@@ -450,10 +444,10 @@ class Reader:
|
|
450
444
|
self.current_angles.append(floatnan(rec[-1]))
|
451
445
|
if l.strip().startswith('Optimization of angle'):
|
452
446
|
extracting = True
|
453
|
-
elif l.strip().startswith('Optimimal angle I'):
|
447
|
+
elif l.strip().startswith('Optimimal angle I'):
|
454
448
|
break
|
455
|
-
else:
|
456
|
-
if extracting:
|
449
|
+
else:
|
450
|
+
if extracting:
|
457
451
|
if l.strip() == '' or \
|
458
452
|
l.strip().startswith('Angle [Degr'):
|
459
453
|
pass
|
@@ -461,7 +455,7 @@ class Reader:
|
|
461
455
|
tmp = l.split('\t')
|
462
456
|
r.append([floatnan(k) for k in tmp])
|
463
457
|
if len(r) > 1:
|
464
|
-
self.torque_opt.append({'beta': [i[0] for i in r],
|
458
|
+
self.torque_opt.append({'beta': [i[0] for i in r],
|
465
459
|
'torque': [i[1] for i in r]})
|
466
460
|
return
|
467
461
|
|
@@ -1630,7 +1624,7 @@ class Reader:
|
|
1630
1624
|
|
1631
1625
|
except:
|
1632
1626
|
pass
|
1633
|
-
|
1627
|
+
|
1634
1628
|
def get(self, name, r=None):
|
1635
1629
|
"""return value of key name
|
1636
1630
|
name can be a list such as ['torque[1]', 'ripple']
|
@@ -1,10 +1,7 @@
|
|
1
1
|
#!/usr/bin/env python
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
# Author: Ronald Tanner
|
6
|
-
# 2016-10-20
|
7
|
-
#
|
2
|
+
"""convert bch to xml
|
3
|
+
|
4
|
+
"""
|
8
5
|
import sys
|
9
6
|
import re
|
10
7
|
import io
|
@@ -17,9 +14,15 @@ def usage():
|
|
17
14
|
sys.exit(1)
|
18
15
|
|
19
16
|
|
20
|
-
def list_to_xml(tag, l):
|
21
|
-
'''
|
22
|
-
|
17
|
+
def list_to_xml(tag: str, l: list) -> el.Element:
|
18
|
+
'''convert a list into XML
|
19
|
+
|
20
|
+
Args:
|
21
|
+
tag: name of element
|
22
|
+
l: list of values
|
23
|
+
|
24
|
+
Returns:
|
25
|
+
xml element with tag and values
|
23
26
|
'''
|
24
27
|
|
25
28
|
if not isinstance(tag, str):
|
@@ -43,9 +46,15 @@ def list_to_xml(tag, l):
|
|
43
46
|
return elem
|
44
47
|
|
45
48
|
|
46
|
-
def dict_to_xml(tag, d):
|
47
|
-
'''
|
48
|
-
|
49
|
+
def dict_to_xml(tag: str, d: dict) -> el.Element:
|
50
|
+
'''convert a simple dict of key/value pairs into XML
|
51
|
+
|
52
|
+
Args:
|
53
|
+
tag: name of element
|
54
|
+
d: dict of values
|
55
|
+
|
56
|
+
Returns:
|
57
|
+
xml element of d
|
49
58
|
'''
|
50
59
|
|
51
60
|
if not isinstance(tag, str):
|
@@ -70,7 +79,7 @@ def dict_to_xml(tag, d):
|
|
70
79
|
|
71
80
|
|
72
81
|
def main():
|
73
|
-
import argparse
|
82
|
+
import argparse
|
74
83
|
from .__init__ import __version__
|
75
84
|
from femagtools.bch import Reader
|
76
85
|
|
@@ -88,7 +97,7 @@ def main():
|
|
88
97
|
args = argparser.parse_args()
|
89
98
|
if not args.filename:
|
90
99
|
sys.exit(0)
|
91
|
-
|
100
|
+
|
92
101
|
bchresults = Reader()
|
93
102
|
with io.open(args.filename, encoding='latin1', errors='ignore') as f:
|
94
103
|
bchresults.read(f.readlines())
|
@@ -27,36 +27,31 @@ logger = logging.getLogger(__name__)
|
|
27
27
|
use_asyncio = True
|
28
28
|
|
29
29
|
|
30
|
-
|
31
|
-
def read_stream_and_display(stream, display):
|
30
|
+
async def read_stream_and_display(stream, display):
|
32
31
|
"""Read from stream line by line until EOF, display, and capture the lines.
|
33
32
|
|
34
33
|
"""
|
35
34
|
output = []
|
36
|
-
|
37
|
-
line = yield from stream.readline()
|
38
|
-
if not line:
|
39
|
-
break
|
35
|
+
async for line in stream.readline():
|
40
36
|
output.append(line)
|
41
37
|
display(line) # assume it doesn't block
|
42
38
|
return b''.join(output)
|
43
39
|
|
44
40
|
|
45
|
-
|
46
|
-
def read_and_display(*cmd, cwd):
|
41
|
+
async def read_and_display(*cmd, cwd):
|
47
42
|
"""Capture cmd's stdout, stderr while displaying them as they arrive
|
48
43
|
(line by line).
|
49
44
|
|
50
45
|
"""
|
51
46
|
# start process
|
52
|
-
process =
|
53
|
-
|
47
|
+
process = await asyncio.create_subprocess_exec(*cmd, cwd=cwd,
|
48
|
+
stdout=PIPE, stderr=PIPE)
|
54
49
|
|
55
50
|
def nodisplay(l):
|
56
51
|
return
|
57
52
|
# read child's stdout/stderr concurrently (capture and display)
|
58
53
|
try:
|
59
|
-
stdout, stderr =
|
54
|
+
stdout, stderr = asyncio.gather(
|
60
55
|
read_stream_and_display(process.stdout, nodisplay),
|
61
56
|
read_stream_and_display(process.stderr, sys.stderr.buffer.write))
|
62
57
|
except Exception:
|
@@ -64,7 +59,7 @@ def read_and_display(*cmd, cwd):
|
|
64
59
|
raise
|
65
60
|
finally:
|
66
61
|
# wait for the process to exit
|
67
|
-
rc =
|
62
|
+
rc = process.wait()
|
68
63
|
return rc, stdout, stderr
|
69
64
|
|
70
65
|
|
@@ -6,7 +6,6 @@ import sys
|
|
6
6
|
import pathlib
|
7
7
|
import logging
|
8
8
|
import femagtools.grid
|
9
|
-
import model
|
10
9
|
import importlib
|
11
10
|
import os
|
12
11
|
|
@@ -73,6 +72,7 @@ def read_paramsin(p):
|
|
73
72
|
|
74
73
|
|
75
74
|
if __name__ == '__main__':
|
75
|
+
import model
|
76
76
|
logging.basicConfig(level=logging.INFO,
|
77
77
|
format='%(asctime)s %(message)s')
|
78
78
|
|