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.
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})