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.
Files changed (49) hide show
  1. femagtools/__init__.py +1 -1
  2. femagtools/bch.py +10 -6
  3. femagtools/dxfsl/area.py +69 -1
  4. femagtools/dxfsl/conv.py +53 -16
  5. femagtools/dxfsl/converter.py +273 -76
  6. femagtools/dxfsl/fslrenderer.py +18 -22
  7. femagtools/dxfsl/functions.py +38 -8
  8. femagtools/dxfsl/geom.py +112 -35
  9. femagtools/dxfsl/journal.py +1 -1
  10. femagtools/dxfsl/machine.py +44 -7
  11. femagtools/dxfsl/shape.py +4 -0
  12. femagtools/dxfsl/symmetry.py +105 -32
  13. femagtools/femag.py +64 -61
  14. femagtools/fsl.py +4 -2
  15. femagtools/isa7.py +3 -2
  16. femagtools/machine/afpm.py +45 -25
  17. femagtools/machine/effloss.py +31 -20
  18. femagtools/machine/im.py +6 -8
  19. femagtools/machine/sizing.py +4 -3
  20. femagtools/machine/sm.py +35 -37
  21. femagtools/mcv.py +66 -37
  22. femagtools/multiproc.py +79 -80
  23. femagtools/parstudy.py +10 -4
  24. femagtools/semi_fea.py +108 -0
  25. femagtools/templates/basic_modpar.mako +0 -3
  26. femagtools/templates/fe-contr.mako +18 -18
  27. femagtools/templates/ld_lq_fast.mako +3 -0
  28. femagtools/templates/mesh-airgap.mako +6 -0
  29. femagtools/templates/mult_cal_fast.mako +3 -0
  30. femagtools/templates/pm_sym_f_cur.mako +4 -1
  31. femagtools/templates/pm_sym_fast.mako +3 -0
  32. femagtools/templates/pm_sym_loss.mako +3 -0
  33. femagtools/templates/psd_psq_fast.mako +3 -0
  34. femagtools/templates/torq_calc.mako +3 -0
  35. femagtools/tks.py +23 -20
  36. femagtools/utils.py +1 -1
  37. femagtools/windings.py +11 -4
  38. femagtools/zmq.py +213 -0
  39. {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/METADATA +3 -3
  40. {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/RECORD +49 -47
  41. {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/WHEEL +1 -1
  42. tests/test_afpm.py +15 -6
  43. tests/test_femag.py +1 -1
  44. tests/test_fsl.py +4 -4
  45. tests/test_mcv.py +20 -14
  46. tests/test_parident.py +2 -1
  47. {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/LICENSE +0 -0
  48. {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/entry_points.txt +0 -0
  49. {femagtools-1.8.2.dist-info → femagtools-1.8.4.dist-info}/top_level.txt +0 -0
femagtools/__init__.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  """
4
4
  __title__ = 'femagtools'
5
- __version__ = '1.8.2'
5
+ __version__ = '1.8.4'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2024 Gamma Technology'
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['psim']:
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
- up = w1*np.array(self.dqPar['psim'])
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, self.max_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='forced symmetry part',
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='correct airgap',
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='correct airgap',
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='absolut tolerance to find symmetry axis',
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='minimal distance of spline control-points',
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='relative tolerance (pickdist)',
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='absolut tolerance (pickdist)',
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='distance airgap',
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='distance yoke',
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='show all areas',
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='write id of areas',
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='show a view with korrections',
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='write png-file only',
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('-j',
139
- help='print information in journal file',
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})