femagtools 1.8.2__py3-none-any.whl → 1.8.4__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.
- femagtools/__init__.py +1 -1
- femagtools/bch.py +10 -6
- femagtools/dxfsl/area.py +69 -1
- femagtools/dxfsl/conv.py +53 -16
- femagtools/dxfsl/converter.py +273 -76
- femagtools/dxfsl/fslrenderer.py +18 -22
- femagtools/dxfsl/functions.py +38 -8
- femagtools/dxfsl/geom.py +112 -35
- femagtools/dxfsl/journal.py +1 -1
- femagtools/dxfsl/machine.py +44 -7
- femagtools/dxfsl/shape.py +4 -0
- femagtools/dxfsl/symmetry.py +105 -32
- femagtools/femag.py +64 -61
- femagtools/fsl.py +4 -2
- femagtools/isa7.py +3 -2
- femagtools/machine/afpm.py +45 -25
- femagtools/machine/effloss.py +31 -20
- femagtools/machine/im.py +6 -8
- femagtools/machine/sizing.py +4 -3
- femagtools/machine/sm.py +35 -37
- femagtools/mcv.py +66 -37
- femagtools/multiproc.py +79 -80
- femagtools/parstudy.py +10 -4
- femagtools/semi_fea.py +108 -0
- femagtools/templates/basic_modpar.mako +0 -3
- femagtools/templates/fe-contr.mako +18 -18
- femagtools/templates/ld_lq_fast.mako +3 -0
- femagtools/templates/mesh-airgap.mako +6 -0
- femagtools/templates/mult_cal_fast.mako +3 -0
- femagtools/templates/pm_sym_f_cur.mako +4 -1
- femagtools/templates/pm_sym_fast.mako +3 -0
- femagtools/templates/pm_sym_loss.mako +3 -0
- femagtools/templates/psd_psq_fast.mako +3 -0
- femagtools/templates/torq_calc.mako +3 -0
- femagtools/tks.py +23 -20
- femagtools/utils.py +1 -1
- femagtools/windings.py +11 -4
- femagtools/zmq.py +213 -0
- {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/METADATA +3 -3
- {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/RECORD +49 -47
- {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/WHEEL +1 -1
- tests/test_afpm.py +15 -6
- tests/test_femag.py +1 -1
- tests/test_fsl.py +4 -4
- tests/test_mcv.py +20 -14
- tests/test_parident.py +2 -1
- {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/LICENSE +0 -0
- {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/entry_points.txt +0 -0
- {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/top_level.txt +0 -0
femagtools/__init__.py
CHANGED
femagtools/bch.py
CHANGED
@@ -307,14 +307,14 @@ class Reader:
|
|
307
307
|
self.torque_fft = [
|
308
308
|
{'order': order.tolist(),
|
309
309
|
'torque': tq.tolist()}]
|
310
|
-
except (KeyError, IndexError):
|
310
|
+
except (KeyError, IndexError, ValueError):
|
311
311
|
pass
|
312
|
-
|
312
|
+
|
313
313
|
# check number of phases
|
314
|
-
try:
|
314
|
+
try:
|
315
315
|
if 'm' not in self.machine:
|
316
316
|
self.machine['m'] = len(self.current_angles)
|
317
|
-
except:
|
317
|
+
except:
|
318
318
|
pass
|
319
319
|
|
320
320
|
return self
|
@@ -1439,17 +1439,21 @@ class Reader:
|
|
1439
1439
|
'psid', 'psiq', 'torque')
|
1440
1440
|
except:
|
1441
1441
|
pass
|
1442
|
-
if self.dqPar
|
1442
|
+
if self.dqPar.get('psim', 0):
|
1443
1443
|
self.dqPar.pop('up', None)
|
1444
1444
|
else:
|
1445
|
+
up = np.array(self.dqPar.pop('up', None))
|
1445
1446
|
self.dqPar.pop('psim', None)
|
1447
|
+
|
1446
1448
|
try:
|
1447
1449
|
w1 = np.pi*self.dqPar['speed']*self.dqPar['npoles']
|
1448
1450
|
r1 = self.machine.get('r1', 0.0)
|
1449
1451
|
beta = np.array(self.dqPar['beta'])/180*np.pi
|
1450
1452
|
iq = np.cos(beta)*self.dqPar['i1']
|
1451
1453
|
id = np.sin(beta)*self.dqPar['i1']
|
1452
|
-
|
1454
|
+
if 'psim' in self.dqPar:
|
1455
|
+
up = w1*np.array(self.dqPar['psim'])
|
1456
|
+
|
1453
1457
|
ld = np.array(self.dqPar['ld'])
|
1454
1458
|
lq = np.array(self.dqPar['lq'])
|
1455
1459
|
uq = r1*iq + up + id*w1*ld
|
femagtools/dxfsl/area.py
CHANGED
@@ -12,6 +12,7 @@ import numpy as np
|
|
12
12
|
import networkx as nx
|
13
13
|
import logging
|
14
14
|
from .functions import less_equal, less, greater_equal, greater
|
15
|
+
from .functions import greater_angle, less_angle
|
15
16
|
from .functions import distance, alpha_angle, alpha_line, min_angle, max_angle
|
16
17
|
from .functions import point, line_m, line_n, intersect_point, points_are_close
|
17
18
|
from .functions import middle_angle, part_of_circle, is_same_angle
|
@@ -75,6 +76,10 @@ class Area(object):
|
|
75
76
|
self.start = 0.0
|
76
77
|
self.sym_startangle = 0.0
|
77
78
|
self.sym_endangle = 0.0
|
79
|
+
self.sym_upper_left_dist = None
|
80
|
+
self.sym_upper_right_dist = None
|
81
|
+
self.sym_lower_left_dist = None
|
82
|
+
self.sym_lower_right_dist = None
|
78
83
|
self.sym_type = 0
|
79
84
|
self.symmetry = 0
|
80
85
|
self.sym_tolerance = sym_tolerance
|
@@ -636,7 +641,10 @@ class Area(object):
|
|
636
641
|
def get_alpha(self, center):
|
637
642
|
if self.center_is_inside(center):
|
638
643
|
return np.pi*2.0
|
639
|
-
return alpha_angle(self.min_angle,
|
644
|
+
return alpha_angle(self.min_angle,
|
645
|
+
self.max_angle,
|
646
|
+
rtol=0.0,
|
647
|
+
atol=0.0)
|
640
648
|
|
641
649
|
def get_mid_angle(self, center):
|
642
650
|
if self.center_is_inside(center):
|
@@ -674,6 +682,66 @@ class Area(object):
|
|
674
682
|
return True
|
675
683
|
return False
|
676
684
|
|
685
|
+
def set_symmetry_parameter(self, center):
|
686
|
+
all_list = [(distance(center, n), alpha_line(center, n))
|
687
|
+
for n in self.list_of_nodes()]
|
688
|
+
mid = middle_angle(self.min_angle, self.max_angle)
|
689
|
+
left_list = [(d, a) for d, a in all_list if greater_angle(a, mid)]
|
690
|
+
right_list = [(d, a) for d, a in all_list if less_angle(a, mid)]
|
691
|
+
left_list.sort()
|
692
|
+
right_list.sort()
|
693
|
+
|
694
|
+
if left_list:
|
695
|
+
l_low_d, l_low_a = left_list[0]
|
696
|
+
l_up_d, l_up_a = left_list[-1]
|
697
|
+
else:
|
698
|
+
l_low_d = self.min_dist
|
699
|
+
l_up_d = self.max_dist
|
700
|
+
if right_list:
|
701
|
+
r_low_d, r_low_a = right_list[0]
|
702
|
+
r_up_d, r_up_a = right_list[-1]
|
703
|
+
else:
|
704
|
+
r_low_d = self.min_dist
|
705
|
+
r_up_d = self.max_dist
|
706
|
+
self.sym_upper_left_dist = l_up_d
|
707
|
+
self.sym_upper_right_dist = r_up_d
|
708
|
+
self.sym_lower_left_dist = l_low_d
|
709
|
+
self.sym_lower_right_dist = r_low_d
|
710
|
+
|
711
|
+
def is_symmetry_equal(self, area):
|
712
|
+
logger.debug("check area %s -- %s", self.get_id(), area.get_id())
|
713
|
+
|
714
|
+
bad = False
|
715
|
+
if not np.isclose(self.sym_lower_left_dist, area.sym_lower_left_dist,
|
716
|
+
rtol=5e-1, atol=5e-1):
|
717
|
+
logger.debug("Lower left: %s != %s",
|
718
|
+
self.sym_lower_left_dist,
|
719
|
+
area.sym_lower_left_dist)
|
720
|
+
bad = True
|
721
|
+
|
722
|
+
if not np.isclose(self.sym_lower_right_dist, area.sym_lower_right_dist,
|
723
|
+
rtol=5e-1, atol=5e-1):
|
724
|
+
logger.debug("Lower right: %s != %s",
|
725
|
+
self.sym_lower_right_dist,
|
726
|
+
area.sym_lower_right_dist)
|
727
|
+
bad = True
|
728
|
+
|
729
|
+
if not np.isclose(self.sym_upper_left_dist, area.sym_upper_left_dist,
|
730
|
+
rtol=5e-1, atol=5e-1):
|
731
|
+
logger.debug("Upper left: %s != %s",
|
732
|
+
self.sym_upper_left_dist,
|
733
|
+
area.sym_upper_left_dist)
|
734
|
+
bad = True
|
735
|
+
|
736
|
+
if not np.isclose(self.sym_upper_right_dist, area.sym_upper_right_dist,
|
737
|
+
rtol=5e-1, atol=5e-1):
|
738
|
+
logger.debug("Upper right: %s != %s",
|
739
|
+
self.sym_upper_right_dist,
|
740
|
+
area.sym_upper_right_dist)
|
741
|
+
bad = True
|
742
|
+
|
743
|
+
return not bad
|
744
|
+
|
677
745
|
def increment(self, a):
|
678
746
|
if self.is_identical(a):
|
679
747
|
return
|
femagtools/dxfsl/conv.py
CHANGED
@@ -18,8 +18,18 @@ logger = logging.getLogger(__name__)
|
|
18
18
|
def main():
|
19
19
|
argparser = argparse.ArgumentParser(
|
20
20
|
description='Process DXF file and create a plot or FSL file.')
|
21
|
+
super_help = "--Help" in sys.argv
|
22
|
+
if super_help:
|
23
|
+
sys.argv.append("--help")
|
24
|
+
|
21
25
|
argparser.add_argument('dxfile',
|
22
26
|
help='name of DXF file')
|
27
|
+
argparser.add_argument('--Help',
|
28
|
+
help=(argparse.SUPPRESS if not super_help else
|
29
|
+
"show this extended help message and exit"),
|
30
|
+
dest='Help',
|
31
|
+
action="store_true",
|
32
|
+
default=False)
|
23
33
|
argparser.add_argument('--PMSM',
|
24
34
|
help='Permanent Magnet Synchronous Motor',
|
25
35
|
dest='PMSM',
|
@@ -47,47 +57,56 @@ def main():
|
|
47
57
|
dest='stator',
|
48
58
|
default='')
|
49
59
|
argparser.add_argument('--sympart',
|
50
|
-
help=
|
60
|
+
help=(argparse.SUPPRESS if not super_help else
|
61
|
+
'forced symmetry part'),
|
51
62
|
dest='sym_part',
|
52
63
|
type=int,
|
53
64
|
default=0)
|
54
65
|
argparser.add_argument('-a', '--airgap',
|
55
|
-
help=
|
66
|
+
help=(argparse.SUPPRESS if not super_help else
|
67
|
+
'correct airgap'),
|
56
68
|
dest='airgap',
|
57
69
|
type=float,
|
58
70
|
default=0.0)
|
59
71
|
argparser.add_argument('--airgap2',
|
60
|
-
help=
|
72
|
+
help=(argparse.SUPPRESS if not super_help else
|
73
|
+
'correct airgap'),
|
61
74
|
dest='airgap2',
|
62
75
|
type=float,
|
63
76
|
default=0.0)
|
64
77
|
argparser.add_argument('-t', '--symtol',
|
65
|
-
help=
|
78
|
+
help=(argparse.SUPPRESS if not super_help else
|
79
|
+
'absolut tolerance to find symmetry axis'),
|
66
80
|
dest='sym_tolerance',
|
67
81
|
type=float,
|
68
82
|
default=0.001)
|
69
83
|
argparser.add_argument('--mindist',
|
70
|
-
help=
|
84
|
+
help=(argparse.SUPPRESS if not super_help else
|
85
|
+
'minimal distance of spline control-points'),
|
71
86
|
dest='mindist',
|
72
87
|
type=float,
|
73
88
|
default=0.01)
|
74
89
|
argparser.add_argument('--rtol',
|
75
|
-
help=
|
90
|
+
help=(argparse.SUPPRESS if not super_help else
|
91
|
+
'relative tolerance (pickdist)'),
|
76
92
|
dest='rtol',
|
77
93
|
type=float,
|
78
94
|
default=1e-04)
|
79
95
|
argparser.add_argument('--atol',
|
80
|
-
help=
|
96
|
+
help=(argparse.SUPPRESS if not super_help else
|
97
|
+
'absolut tolerance (pickdist)'),
|
81
98
|
dest='atol',
|
82
99
|
type=float,
|
83
100
|
default=1e-03)
|
84
101
|
argparser.add_argument('--da',
|
85
|
-
help=
|
102
|
+
help=(argparse.SUPPRESS if not super_help else
|
103
|
+
'distance airgap'),
|
86
104
|
dest='da',
|
87
105
|
type=float,
|
88
106
|
default=0.0)
|
89
107
|
argparser.add_argument('--dy',
|
90
|
-
help=
|
108
|
+
help=(argparse.SUPPRESS if not super_help else
|
109
|
+
'distance yoke'),
|
91
110
|
dest='dy',
|
92
111
|
type=float,
|
93
112
|
default=0.0)
|
@@ -104,27 +123,36 @@ def main():
|
|
104
123
|
dest='small_plots',
|
105
124
|
action="store_true")
|
106
125
|
argparser.add_argument('--areas',
|
107
|
-
help=
|
126
|
+
help=(argparse.SUPPRESS if not super_help else
|
127
|
+
'show all areas with single plots'),
|
108
128
|
dest='show_areas',
|
109
129
|
action="store_true")
|
110
130
|
argparser.add_argument('--id',
|
111
|
-
help=
|
131
|
+
help=(argparse.SUPPRESS if not super_help else
|
132
|
+
'write id of areas into the plot'),
|
112
133
|
dest='write_id',
|
113
134
|
action="store_true")
|
114
135
|
argparser.add_argument('-f', '--fsl',
|
115
136
|
help='create fsl',
|
116
137
|
dest='write_fsl',
|
117
138
|
action="store_true")
|
139
|
+
argparser.add_argument('--fsl_single',
|
140
|
+
help=(argparse.SUPPRESS if not super_help else
|
141
|
+
'create separate fsl for rotor and stator'),
|
142
|
+
dest='write_fsl_single',
|
143
|
+
action="store_true")
|
118
144
|
argparser.add_argument('-v', '--view',
|
119
145
|
help='show a view only',
|
120
146
|
dest='view',
|
121
147
|
action="store_true")
|
122
148
|
argparser.add_argument('-k', '--korr',
|
123
|
-
help=
|
149
|
+
help=(argparse.SUPPRESS if not super_help else
|
150
|
+
'show a view with korrections'),
|
124
151
|
dest='view_korr',
|
125
152
|
action="store_true")
|
126
153
|
argparser.add_argument('--png',
|
127
|
-
help=
|
154
|
+
help=(argparse.SUPPRESS if not super_help else
|
155
|
+
'write plot in png-file only'),
|
128
156
|
dest='write_png',
|
129
157
|
action="store_true")
|
130
158
|
argparser.add_argument('-d', '--debug',
|
@@ -135,8 +163,9 @@ def main():
|
|
135
163
|
help='print information in logfile and set --debug',
|
136
164
|
dest='debug',
|
137
165
|
action="store_true")
|
138
|
-
argparser.add_argument('
|
139
|
-
help=
|
166
|
+
argparser.add_argument('--journal',
|
167
|
+
help=(argparse.SUPPRESS if not super_help else
|
168
|
+
'print information in journal file'),
|
140
169
|
dest='journal',
|
141
170
|
action="store_true")
|
142
171
|
argparser.add_argument('--version',
|
@@ -151,6 +180,12 @@ def main():
|
|
151
180
|
help='create full model (fsl only)',
|
152
181
|
dest='full_model',
|
153
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)
|
154
189
|
|
155
190
|
args = argparser.parse_args()
|
156
191
|
|
@@ -242,11 +277,13 @@ def main():
|
|
242
277
|
show_areas=args.show_areas,
|
243
278
|
small_plots=args.small_plots,
|
244
279
|
write_fsl=args.write_fsl,
|
280
|
+
write_fsl_single=args.write_fsl_single,
|
245
281
|
write_png=args.write_png,
|
246
282
|
write_id=args.write_id,
|
247
283
|
debug_mode=args.debugger,
|
248
284
|
full_model=args.full_model,
|
249
|
-
write_journal=args.journal
|
285
|
+
write_journal=args.journal,
|
286
|
+
no_processing=args.no_processing)
|
250
287
|
keys = ('tot_num_slot', 'num_sl_gen', 'num_poles', 'nodedist',
|
251
288
|
'dy1', 'da1', 'da2', 'dy2', 'agndst', 'name')
|
252
289
|
logger.info("%s", {k: res[k] for k in keys if k in res})
|