femagtools 1.8.2__py3-none-any.whl → 1.8.4__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- 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})
|