femagtools 1.7.8__py3-none-any.whl → 1.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. femagtools/__init__.py +1 -1
  2. femagtools/amela.py +2 -2
  3. femagtools/dxfsl/area.py +142 -9
  4. femagtools/dxfsl/conv.py +2 -9
  5. femagtools/dxfsl/converter.py +33 -9
  6. femagtools/dxfsl/fslrenderer.py +13 -12
  7. femagtools/dxfsl/geom.py +39 -6
  8. femagtools/dxfsl/journal.py +2 -2
  9. femagtools/dxfsl/machine.py +14 -13
  10. femagtools/dxfsl/shape.py +3 -0
  11. femagtools/dxfsl/svgparser.py +31 -4
  12. femagtools/ecloss.py +381 -2
  13. femagtools/femag.py +55 -0
  14. femagtools/fsl.py +74 -47
  15. femagtools/isa7.py +41 -0
  16. femagtools/job.py +2 -2
  17. femagtools/machine/afpm.py +5 -1
  18. femagtools/machine/pm.py +1 -1
  19. femagtools/machine/sm.py +14 -0
  20. femagtools/machine/utils.py +4 -3
  21. femagtools/mcv.py +128 -124
  22. femagtools/me.py +13 -13
  23. femagtools/model.py +14 -1
  24. femagtools/moo/population.py +9 -7
  25. femagtools/nc.py +12 -0
  26. femagtools/plot/__init__.py +1 -1
  27. femagtools/plot/fieldlines.py +1 -1
  28. femagtools/plot/mcv.py +18 -0
  29. femagtools/plot/nc.py +22 -5
  30. femagtools/plot/wdg.py +40 -7
  31. femagtools/svgfsl/converter.py +6 -0
  32. femagtools/templates/gen_hairpin_winding.mako +36 -45
  33. femagtools/templates/gen_winding.mako +7 -0
  34. femagtools/templates/magnetIron.mako +30 -46
  35. femagtools/templates/magnetIron2.mako +39 -0
  36. femagtools/templates/magnetIron3.mako +39 -0
  37. femagtools/templates/magnetIron4.mako +39 -0
  38. femagtools/templates/magnetIron5.mako +39 -0
  39. femagtools/templates/magnetIronV.mako +34 -54
  40. femagtools/templates/magnetSector.mako +32 -47
  41. femagtools/templates/mesh-airgap.mako +12 -6
  42. femagtools/templates/prepare_thermal.mako +354 -0
  43. femagtools/templates/statorRotor3.mako +3 -22
  44. femagtools/windings.py +92 -59
  45. {femagtools-1.7.8.dist-info → femagtools-1.8.0.dist-info}/METADATA +20 -18
  46. {femagtools-1.7.8.dist-info → femagtools-1.8.0.dist-info}/RECORD +53 -53
  47. {femagtools-1.7.8.dist-info → femagtools-1.8.0.dist-info}/WHEEL +1 -1
  48. tests/test_fsl.py +1 -1
  49. tests/test_mcv.py +106 -1
  50. tests/test_windings.py +18 -2
  51. tests/test_mcvwriter.py +0 -96
  52. {femagtools-1.7.8.dist-info → femagtools-1.8.0.dist-info}/LICENSE +0 -0
  53. {femagtools-1.7.8.dist-info → femagtools-1.8.0.dist-info}/entry_points.txt +0 -0
  54. {femagtools-1.7.8.dist-info → femagtools-1.8.0.dist-info}/top_level.txt +0 -0
tests/test_mcv.py CHANGED
@@ -1,6 +1,10 @@
1
+ import sys
2
+ import os
3
+ import pytest
4
+ import numpy as np
1
5
  import femagtools.mcv
2
6
 
3
- def test_write_poc(tmpdir):
7
+ def test_write_mcv_magcrv(tmpdir):
4
8
  filename = f"{tmpdir}/mcvData"
5
9
 
6
10
  B = [3e-02, 7e-02, 2e-01, 2.31]
@@ -8,3 +12,104 @@ def test_write_poc(tmpdir):
8
12
  mcvData = dict(curve=[dict(bi=B,hi=H)])
9
13
  mcv = femagtools.mcv.MagnetizingCurve(mcvData)
10
14
  mcv.writefile(filename)
15
+ mcvr = femagtools.mcv.Reader()
16
+ ext = '.MC' if sys.platform == 'win32' else '.MCV'
17
+ mcvr.readMcv(filename+ext)
18
+ assert mcvr['version_mc_curve'] == 0
19
+ mcvr['ctype'] == femagtools.mcv.MAGCRV
20
+ assert mcvr['curve'][0]['bi'] == pytest.approx(B, 1e-3)
21
+ assert mcvr['curve'][0]['hi'] == pytest.approx(H, 1e-3)
22
+ assert len(mcvr['curve']) == 1
23
+
24
+ def test_write_mcv_orient_crv(tmpdir):
25
+ filename = f"{tmpdir}/mcvData"
26
+
27
+ B = [3e-02, 7e-02, 2e-01, 2.31]
28
+ H = [1e+02, 2e+02, 5e+02, 3e+05]
29
+ mcvData = dict(curve=[dict(bi=B,hi=H), dict(bi=B,hi=H)])
30
+ mcv = femagtools.mcv.MagnetizingCurve(mcvData)
31
+ mcv.writefile(filename)
32
+ ext = '.MC' if sys.platform == 'win32' else '.MCV'
33
+ mcvr = femagtools.mcv.Reader()
34
+ mcvr.readMcv(filename+ext)
35
+ assert mcvr['version_mc_curve'] == 1
36
+ assert mcvr['ctype'] == femagtools.mcv.ORIENT_CRV
37
+ assert mcvr['curve'][0]['bi'] == pytest.approx(B, 1e-3)
38
+ assert mcvr['curve'][0]['hi'] == pytest.approx(H, 1e-3)
39
+ assert mcvr['curve'][1]['bi'] == pytest.approx(B, 1e-3)
40
+ assert mcvr['curve'][1]['hi'] == pytest.approx(H, 1e-3)
41
+ assert len(mcvr['curve']) == 2
42
+
43
+ def test_read_mcv_magcrv():
44
+ testPath = os.path.split(__file__)[0]
45
+ if not testPath:
46
+ testPath = '.'
47
+ filename = "data/TKS_NO_20.MCV"
48
+ reader = femagtools.mcv.Reader()
49
+ reader.readMcv('{0}/{1}'.format(testPath, filename))
50
+ r = reader.get_results()
51
+ assert r['desc'] == u'PowerCore\xae NO 20 ;ThyssenKrupp Steel Eur'
52
+ assert r['fillfac'] == pytest.approx(0.92, 1e-6)
53
+ assert len(r['curve'][0]['bi']) == 24
54
+ assert r['curve'][0]['bi'][0] == 0.0
55
+ assert r['curve'][0]['bi'][-1] == pytest.approx(1.836, 1e-3)
56
+
57
+ def test_read_write_mcv_with_losses():
58
+ testPath = os.path.split(__file__)[0]
59
+ if not testPath:
60
+ testPath = '.'
61
+ filename = "data/TKM270-50A-LOSS.MCV"
62
+ reader = femagtools.mcv.Reader()
63
+ reader.readMcv('{0}/{1}'.format(testPath, filename))
64
+ r = reader.get_results()
65
+ assert r['name'] == u'TKM270-50A-LOSS'
66
+ assert len(r['curve'][0]['bi']) == 35
67
+ assert r['curve'][0]['bi'][-1] == pytest.approx(2.638, 1e-3)
68
+ assert set(r['losses'].keys()) == {'B', 'f', 'pfe', 'Bo', 'fo',
69
+ 'cw', 'cw_freq', 'b_coeff', 'ch', 'ch_freq'}
70
+ assert len(r['losses']['pfe']) == 20
71
+ assert len(r['losses']['pfe'][8]) == 19
72
+ assert r['losses']['pfe'][8][18] == pytest.approx(3097.6, 0.1)
73
+
74
+ # test mcv writer
75
+ filename_out = "data/TKS_LOSS.MCV"
76
+ writer = femagtools.mcv.Writer(r)
77
+ writeMcvFile = '{0}/{1}'.format(testPath, filename_out)
78
+ writer.writeMcv(writeMcvFile)
79
+ # TEST
80
+ reader2 = femagtools.mcv.Reader()
81
+ reader2.readMcv(writeMcvFile)
82
+
83
+ for attr in ['version_mc_curve', 'mc1_curves', 'mc1_title']:
84
+ assert getattr(reader, attr) == getattr(reader2, attr)
85
+ for attr in ['mc1_remz', 'mc1_bsat', 'mc1_bref', 'mc1_fillfac',
86
+ 'fo', 'Bo', 'ch', 'ch_freq', 'cw',
87
+ 'cw_freq', 'b_coeff', 'rho', 'fe_sat_mag']:
88
+ assert getattr(reader, attr) == getattr(reader2, attr)
89
+ for attr in ['hi', 'bi']:
90
+ assert reader.curve[0][attr] == reader2.curve[0][attr]
91
+ np.testing.assert_almost_equal(reader.losses['f'],
92
+ reader2.losses['f'], 5)
93
+ np.testing.assert_almost_equal(reader.losses['B'],
94
+ reader2.losses['B'], 5)
95
+
96
+ def test_extrapol():
97
+ mcv = {'name':"M222",
98
+ 'curve':[{
99
+ 'bi':[0.0, 0.09, 0.179, 0.267, 0.358,
100
+ 0.45, 0.543, 0.6334, 0.727,
101
+ 0.819, 0.9142, 1.0142, 1.102,
102
+ 1.196, 1.314, 1.3845, 1.433,
103
+ 1.576, 1.677, 1.745, 1.787,
104
+ 1.81, 1.825, 1.836],
105
+
106
+ 'hi':[0.0, 22.16, 31.07, 37.25, 43.174,
107
+ 49.54, 56.96, 66.11, 78.291,
108
+ 95, 120.64, 164.6, 259.36,
109
+ 565.86, 1650.26, 3631.12, 5000, 10000,
110
+ 15000, 20000, 25000, 30000, 35000, 40000]}]}
111
+ c = femagtools.mcv.extrapol(mcv['curve'][0])
112
+ assert len(c['bi']) > len(mcv['curve'][0]['bi'])
113
+ assert len(c['hi']) > len(mcv['curve'][0]['hi'])
114
+ assert np.all(np.diff(c['bi']) > 0)
115
+ assert np.all(np.diff(c['hi']) > 0)
tests/test_windings.py CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  #
3
3
  import pytest
4
+ import numpy as np
4
5
  import femagtools.windings
5
6
 
6
7
 
@@ -60,8 +61,18 @@ def test_slots(wdg):
60
61
  [[1, -5, -6], [4, -8, -9], [-2, -3, 7]])
61
62
 
62
63
 
63
- def test_axis(wdg):
64
- assert round(wdg.axis(), 3) == 0.32
64
+ def test_axis():
65
+ for wpar, expected in [
66
+ ({'Q': 168, 'p': 7, 'm': 3, 'l': 2, 'yd': 10}, 14.99973842075893),
67
+ ({'Q': 90, 'p': 12, 'm': 3, 'l': 2, 'yd': 4}, 11.99951171875), # TODO
68
+ ({'Q': 108, 'p': 9, 'm': 3, 'l': 2, 'yd': 5}, 11.666259765625),
69
+ ({'Q': 96, 'p': 4, 'm': 3, 'l': 2, 'yd': 10}, 26.249542236328125),
70
+ ({'Q': 144, 'p': 16, 'm': 3, 'l': 2, 'yd': 4}, 7.49969482421875),
71
+ ({'Q': 144, 'p': 12, 'm': 3, 'l': 2, 'yd': 5}, 8.74969482421875),
72
+ ({'Q': 54, 'p': 3, 'm': 3, 'l': 2, 'yd': 8}, 36.66585286458334),
73
+ ({'Q': 48, 'p': 4, 'm': 3, 'l': 1, 'yd': 6}, 29.99908447265625)]:
74
+ wdg = femagtools.windings.Winding(wpar)
75
+ assert round(wdg.axis()/np.pi*180, 2) == round(expected, 2)
65
76
 
66
77
 
67
78
  def test_winding_factor(wdg):
@@ -147,3 +158,8 @@ def test_num_layers():
147
158
 
148
159
  assert w.l == 2
149
160
  assert w.yd == 4
161
+
162
+ def test_zoneplan():
163
+ w = femagtools.windings.Winding(
164
+ {'Q': 60, 'p': 32, 'm': 3, 'l': 1})
165
+ assert [1, -2, 3, -4, 5, -6, -17, 18, -19, 20] == w.zoneplan()[0][0]
tests/test_mcvwriter.py DELETED
@@ -1,96 +0,0 @@
1
- #!/usr/bin/env python3
2
- #
3
- import unittest
4
- import os
5
- import femagtools.mcv
6
- import numpy as np
7
-
8
-
9
- class McvWriterTest(unittest.TestCase):
10
- def test_read_write_mcv(self):
11
- testPath = os.path.split(__file__)[0]
12
- if not testPath:
13
- testPath = '.'
14
- filename = "data/TKS_NO_20.MCV"
15
- filename_out = "data/TKS_NO_20_out.MCV"
16
- reader = femagtools.mcv.Reader()
17
- reader.readMcv('{0}/{1}'.format(testPath, filename))
18
- r = reader.get_results()
19
- self.assertEqual(r['desc'],
20
- u'PowerCore\xae NO 20 ;ThyssenKrupp Steel Eur')
21
- self.assertEqual(len(r['curve'][0]['bi']), 24)
22
- self.assertEqual(r['curve'][0]['bi'][0], 0.0)
23
- self.assertAlmostEqual(r['curve'][0]['bi'][-1], 1.836, 3)
24
-
25
- # test mcv writer
26
- writer = femagtools.mcv.Writer(r)
27
- # writer.setData(r)
28
- writeMcvFile = '{0}/{1}'.format(testPath, filename_out)
29
- writer.writeMcv(writeMcvFile)
30
- self.assertNotEqual(writer, None)
31
-
32
- # TEST
33
- reader2 = femagtools.mcv.Reader()
34
- reader2.readMcv(writeMcvFile)
35
-
36
- for attr in ['version_mc_curve', 'mc1_curves', 'mc1_title']:
37
- self.assertAlmostEqual(getattr(reader, attr),
38
- getattr(reader2, attr))
39
- for attr in ['mc1_remz', 'mc1_bsat', 'mc1_bref', 'mc1_fillfac',
40
- 'fo', 'Bo', 'ch', 'ch_freq', 'cw',
41
- 'cw_freq', 'b_coeff', 'rho', 'fe_sat_mag']:
42
- self.assertAlmostEqual(getattr(reader, attr),
43
- getattr(reader2, attr), 3)
44
- for attr in ['hi', 'bi']:
45
- self.assertAlmostEqual(reader.curve[0][attr],
46
- reader2.curve[0][attr], 3)
47
-
48
- def test_read_write_mcv_with_losses(self):
49
- testPath = os.path.split(__file__)[0]
50
- if not testPath:
51
- testPath = '.'
52
- filename = "data/TKM270-50A-LOSS.MCV"
53
- filename_out = "data/TKS_LOSS.MCV"
54
- reader = femagtools.mcv.Reader()
55
- reader.readMcv('{0}/{1}'.format(testPath, filename))
56
- r = reader.get_results()
57
- self.assertEqual(r['name'],
58
- u'TKM270-50A-LOSS')
59
- self.assertEqual(len(r['curve'][0]['bi']), 35)
60
- self.assertAlmostEqual(r['curve'][0]['bi'][-1], 2.638, 3)
61
- self.assertEqual(set(r['losses'].keys()),
62
- set({'B', 'f', 'pfe', 'Bo', 'fo',
63
- 'cw', 'cw_freq', 'b_coeff', 'ch', 'ch_freq'}))
64
- self.assertEqual(len(r['losses']['pfe']), 20)
65
- self.assertEqual(len(r['losses']['pfe'][8]), 19)
66
- self.assertAlmostEqual(r['losses']['pfe'][8][18], 3097.6, 1)
67
-
68
- # test mcv writer
69
- writer = femagtools.mcv.Writer(r)
70
- # writer.setData(r)
71
- writeMcvFile = '{0}/{1}'.format(testPath, filename_out)
72
- writer.writeMcv(writeMcvFile)
73
- self.assertNotEqual(writer, None)
74
-
75
- # TEST
76
- reader2 = femagtools.mcv.Reader()
77
- reader2.readMcv(writeMcvFile)
78
-
79
- for attr in ['version_mc_curve', 'mc1_curves', 'mc1_title']:
80
- self.assertAlmostEqual(getattr(reader, attr),
81
- getattr(reader2, attr))
82
- for attr in ['mc1_remz', 'mc1_bsat', 'mc1_bref', 'mc1_fillfac',
83
- 'fo', 'Bo', 'ch', 'ch_freq', 'cw',
84
- 'cw_freq', 'b_coeff', 'rho', 'fe_sat_mag']:
85
- self.assertAlmostEqual(getattr(reader, attr),
86
- getattr(reader2, attr), 3)
87
- for attr in ['hi', 'bi']:
88
- self.assertAlmostEqual(reader.curve[0][attr],
89
- reader2.curve[0][attr], 3)
90
- np.testing.assert_almost_equal(reader.losses['f'],
91
- reader2.losses['f'], 5)
92
- np.testing.assert_almost_equal(reader.losses['B'],
93
- reader2.losses['B'], 5)
94
-
95
- if __name__ == '__main__':
96
- unittest.main()