femagtools 1.8.0__py3-none-any.whl → 1.8.1__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 CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  """
4
4
  __title__ = 'femagtools'
5
- __version__ = '1.8.0'
5
+ __version__ = '1.8.1'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2023-2024 Gamma Technology'
femagtools/dxfsl/area.py CHANGED
@@ -822,9 +822,9 @@ class Area(object):
822
822
  mm[3] = max(mm[3], n[3])
823
823
  return mm
824
824
 
825
- def intersect_line(self, line):
825
+ def intersect_area(self, line):
826
826
  for e in self.area:
827
- if e.intersect_line(line):
827
+ if e.intersect_shape(line, include_end=True):
828
828
  return True
829
829
  return False
830
830
 
femagtools/dxfsl/conv.py CHANGED
@@ -250,11 +250,6 @@ def main():
250
250
  keys = ('tot_num_slot', 'num_sl_gen', 'num_poles', 'nodedist',
251
251
  'dy1', 'da1', 'da2', 'dy2', 'agndst', 'name')
252
252
  logger.info("%s", {k: res[k] for k in keys if k in res})
253
- if args.write_fsl:
254
- if res is not None:
255
- basename = os.path.basename(args.dxfile).split('.')[0]
256
- with io.open(basename + '.fsl', 'w', encoding='utf-8') as f:
257
- f.write('\n'.join(res['fsl']))
258
253
 
259
254
  if __name__ == "__main__":
260
255
  loglevel = logging.INFO
@@ -2,6 +2,7 @@
2
2
 
3
3
  """
4
4
  import os
5
+ import io
5
6
  from pathlib import Path
6
7
  from femagtools import __version__
7
8
  from femagtools.dxfsl.geom import Geometry
@@ -160,12 +161,16 @@ def symmetry_search(machine,
160
161
 
161
162
 
162
163
  def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
164
+ global journal
163
165
  logger.debug("Begin of build_machine_rotor")
166
+
164
167
  if machine.has_windings():
165
168
  logger.debug("do nothing here with windings in rotor")
166
169
  logger.debug("End of build_machine_rotor")
167
170
  return machine
168
171
 
172
+ timer = Timer(start_it=True)
173
+
169
174
  if machine.is_mirrored():
170
175
  logger.debug("Rotor is mirrored")
171
176
  machine_temp = machine.undo_mirror()
@@ -207,17 +212,27 @@ def build_machine_rotor(machine, inner, mindist, plt, EESM=False, single=False):
207
212
  machine_temp.create_inner_corner_areas()
208
213
 
209
214
  if not machine_temp.is_mirrored():
210
- machine_temp.create_boundery_nodes()
215
+ plot_geom(False, # for developer
216
+ plt, machine_temp.geom,
217
+ title="Rotor before Boundery Corr")
218
+ machine_temp.create_boundary_nodes()
211
219
 
212
220
  plot_geom(False, # for developer
213
221
  plt, machine_temp.geom,
214
222
  title="Final Rotor")
223
+
224
+ t = timer.stop("-- rotor created in %0.4f seconds --")
225
+ journal.put('time_rotor_created', t)
226
+
215
227
  logger.debug("End of build_machine_rotor")
216
228
  return machine_temp
217
229
 
218
230
 
219
231
  def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False):
232
+ global journal
220
233
  logger.debug("Begin of build_machine_stator")
234
+ timer = Timer(start_it=True)
235
+
221
236
  if not machine.geom.is_stator():
222
237
  logger.debug("Rotor with windings")
223
238
 
@@ -240,25 +255,34 @@ def build_machine_stator(machine, inner, mindist, plt, EESM=False, single=False)
240
255
  else:
241
256
  machine_temp = machine
242
257
 
243
- rebuild = machine_temp.create_auxiliary_lines()
244
258
  if machine_temp.geom.reduce_element_nodes(mindist):
259
+ machine_temp.rebuild_subregions(EESM, single=single)
245
260
  plot_geom(False, # for developer
246
261
  plt, machine_temp.geom,
247
- title="Nodes reduced",
248
- areas=False)
249
- rebuild = True
250
- if rebuild:
262
+ title="Nodes reduced")
263
+
264
+ if machine_temp.create_auxiliary_lines():
251
265
  machine_temp.rebuild_subregions(EESM, single=single)
266
+ plot_geom(False, # for developer
267
+ plt, machine_temp.geom,
268
+ title="Stator with Auxiliary Lines")
252
269
 
253
270
  if inner:
254
271
  machine_temp.create_inner_corner_areas()
255
272
 
256
273
  if not machine_temp.is_mirrored():
257
- machine_temp.create_boundery_nodes()
274
+ plot_geom(False, # for developer
275
+ plt, machine_temp.geom,
276
+ title="Stator before Boundery Corr")
277
+ machine_temp.create_boundary_nodes()
258
278
 
259
279
  plot_geom(False, # for developer
260
280
  plt, machine_temp.geom,
261
281
  title="Final Stator")
282
+
283
+ t = timer.stop("-- stator created in %0.4f seconds --")
284
+ journal.put('time_stator_created', t)
285
+
262
286
  logger.debug("End of build_machine_stator")
263
287
  return machine_temp
264
288
 
@@ -290,6 +314,7 @@ def convert(dxfile,
290
314
  full_model=False,
291
315
  debug_mode=False,
292
316
  write_journal=False):
317
+ global journal
293
318
  layers = ()
294
319
  conv = {}
295
320
 
@@ -816,10 +841,19 @@ def convert(dxfile,
816
841
 
817
842
  mtype = 'EESM' if EESM else 'PMSM'
818
843
  fslrenderer = FslRenderer(basename, mtype)
819
- conv['fsl'] = fslrenderer.render(machine, inner, outer)
844
+ conv['fsl'] = fslrenderer.render(machine, inner, outer, standalone=True)
820
845
 
821
846
  if params is not None:
822
847
  conv.update(params)
848
+
849
+ if write_fsl:
850
+ logger.debug("Write fsl")
851
+ if conv and conv['fsl']:
852
+ with io.open(basename + '.fsl', 'w', encoding='utf-8') as f:
853
+ f.write('\n'.join(conv['fsl']))
854
+ else:
855
+ logger.warning("No fsl data available")
856
+
823
857
  conv['name'] = basename
824
858
  t = timer.stop("-- all done in %0.4f seconds --", info=True)
825
859
  journal.put('time_total', t)
@@ -154,7 +154,7 @@ class FslRenderer(object):
154
154
  return sorted([(abs(r - np.linalg.norm(e.center_of_connection())), e)
155
155
  for e in geom.elements(Shape)])
156
156
 
157
- def render(self, machine, inner=False, outer=False):
157
+ def render(self, machine, inner=False, outer=False, standalone=False):
158
158
  '''create fsl statements with nodechains'''
159
159
  machine.set_alfa_and_corners()
160
160
  geom = machine.geom
@@ -162,6 +162,14 @@ class FslRenderer(object):
162
162
  geom.split_all_lines_longer_than(split_len)
163
163
  self.content = []
164
164
 
165
+ if standalone:
166
+ self.content += ['if (agndst == nil) then',
167
+ ' agndst = 0.5',
168
+ ' m.npols_gen = 2',
169
+ ' m.num_sl_gen = 2',
170
+ ' new_model_force("{}","Test")'.format(self.model),
171
+ 'end']
172
+
165
173
  MAXDST=4.0
166
174
  NUMLEVELS=10
167
175
  NDT0=1.1
femagtools/dxfsl/geom.py CHANGED
@@ -2753,7 +2753,7 @@ class Geometry(object):
2753
2753
  intersection = False
2754
2754
  inner_gap_list = []
2755
2755
  for no_a in my_notouch:
2756
- if no_a.intersect_line(line):
2756
+ if no_a.intersect_area(line):
2757
2757
  intersection = True
2758
2758
  logger.debug(" --> intersection with %s",
2759
2759
  no_a.get_id())
@@ -2817,6 +2817,7 @@ class Geometry(object):
2817
2817
  pts = self.split_and_get_intersect_points(line)
2818
2818
  if len(pts) != 2:
2819
2819
  logger.error("ERROR in create_aux_lines()")
2820
+ self.journal.put("warning", "Error while creating auxiliary lines")
2820
2821
  logger.debug("Points: %s", pts)
2821
2822
  logger.debug("Line: %s", line)
2822
2823
 
@@ -3635,16 +3636,21 @@ class Geometry(object):
3635
3636
  area.mark_airgap_corners(start_cp, end_cp)
3636
3637
  return
3637
3638
 
3638
- def num_areas_of_type(self, type):
3639
+ def num_areas_of_type(self, types=()):
3639
3640
  return len([area for area in self.list_of_areas()
3640
- if area.is_type(type)])
3641
+ if area.type in types])
3641
3642
 
3642
3643
  def area_size_of_type(self, type):
3643
3644
  return sum([area.surface for area in self.list_of_areas()
3644
3645
  if area.is_type(type)])*1e-3
3645
3646
 
3646
3647
  def num_of_windings(self):
3647
- return self.num_areas_of_type(AREA.TYPE_WINDINGS)
3648
+ return self.num_areas_of_type((AREA.TYPE_WINDINGS,))
3649
+
3650
+ def num_of_irons(self):
3651
+ return self.num_areas_of_type((AREA.TYPE_IRON,
3652
+ AREA.TYPE_YOKE,
3653
+ AREA.TYPE_TOOTH,))
3648
3654
 
3649
3655
  def area_close_to_endangle(self, type):
3650
3656
  return len([area for area in self.list_of_areas()
@@ -4206,9 +4212,9 @@ class Geometry(object):
4206
4212
  if not ok1: # fatal => ignore
4207
4213
  logger.debug("end repair_border_line: missing point %s", n1)
4208
4214
  return False
4209
- d1, n1, ok1 = nodes[-1]
4210
- if not ok1: # fatal => ignore
4211
- logger.debug("end repair_border_line: missing point %s", n1)
4215
+ d2, n2, ok2 = nodes[-1]
4216
+ if not ok2: # fatal => ignore
4217
+ logger.debug("end repair_border_line: missing point %s", n2)
4212
4218
  return False
4213
4219
 
4214
4220
  remove_n1 = None
@@ -4240,89 +4246,132 @@ class Geometry(object):
4240
4246
  logger.debug("end repair_border_line")
4241
4247
  return True
4242
4248
 
4243
- def create_boundery_nodes(self,
4249
+ def create_boundary_nodes(self,
4244
4250
  center,
4245
4251
  startangle,
4246
4252
  endangle,
4247
4253
  rtol=None, atol=None):
4254
+ logger.debug("begin of create_boundary_nodes")
4248
4255
  if not rtol:
4249
- rtol = 1e-4
4256
+ rtol = 1e-3
4250
4257
  if not atol:
4251
4258
  atol = 1e-3
4252
4259
 
4253
- start_nodes = [n for n in self.angle_nodes(center, startangle, rtol, atol)]
4254
- end_nodes = [n for n in self.angle_nodes(center, endangle, rtol, atol)]
4255
- alpha = alpha_angle(startangle, endangle)
4256
-
4257
- logger.debug("begin of create_boundery_nodes")
4258
- start_rot_nodes = self.rotate_nodes(alpha, start_nodes)
4259
- end_rot_nodes = self.rotate_nodes(-alpha, end_nodes)
4260
-
4261
- def miss_nodelist(src_nodelist, dest_nodelist):
4262
- nlist = []
4263
- for src_n in src_nodelist:
4264
- ok = False
4265
- for dest_n in dest_nodelist:
4266
- if points_are_close(src_n, dest_n, rtol=rtol, atol=atol):
4267
- ok = True
4268
- break
4269
- if not ok:
4270
- nlist.append(src_n)
4271
- return nlist
4272
-
4273
- logger.debug("Begin with Nodes Start=%s, End=%s", len(start_nodes), len(end_nodes))
4274
-
4275
- missing_end_nodes = miss_nodelist(start_rot_nodes, end_nodes)
4276
- missing_start_nodes = miss_nodelist(end_rot_nodes, start_nodes)
4277
-
4278
- if missing_start_nodes:
4279
- logger.debug("%s missing start nodes", len(missing_start_nodes))
4280
- start_nodes = [(distance(center, n), n, True) for n in start_nodes]
4281
- for n in missing_start_nodes:
4282
- start_nodes.append((distance(center, n), n, False))
4283
- start_nodes.sort()
4284
- if not self.repair_border_line(start_nodes):
4285
- logger.debug("end of create_boundery_nodes (failed)")
4286
- return
4287
- else:
4288
- start_nodes = [(distance(center, n), n, True) for n in start_nodes]
4289
- start_nodes.sort()
4290
-
4291
- if missing_end_nodes:
4292
- logger.debug("%s missing end nodes", len(missing_end_nodes))
4293
- end_nodes = [(distance(center, n), n, True) for n in end_nodes]
4294
- for n in missing_end_nodes:
4295
- end_nodes.append((distance(center, n), n, False))
4296
- end_nodes.sort()
4297
- if not self.repair_border_line(end_nodes):
4298
- logger.debug("end of create_boundery_nodes (failed)")
4299
- return
4300
- else:
4301
- end_nodes = [(distance(center, n), n, True) for n in end_nodes]
4302
- end_nodes.sort()
4260
+ def check_line(nlist):
4261
+ d, n1, b = nlist[0]
4262
+ for d, n2, b in nlist[1:]:
4263
+ if not self.get_edge_element(n1, n2):
4264
+ return False
4265
+ n1 = n2
4266
+ return True
4303
4267
 
4304
- start_nodes = [(distance(center, n), n)
4268
+ start_nodes = [(distance(center, n), n, True)
4305
4269
  for n in self.angle_nodes(center, startangle, rtol, atol)]
4306
4270
  start_nodes.sort()
4307
- end_nodes = [(distance(center, n), n)
4271
+ d_start1, n, b = start_nodes[0]
4272
+ if not points_are_close(self.start_corners[0], n):
4273
+ logger.warning("end of create_boundary_nodes: corner missing in start boundary")
4274
+ return False
4275
+ d_start2, n, b = start_nodes[-1]
4276
+ if not points_are_close(self.start_corners[-1], n):
4277
+ logger.warning("end of create_boundary_nodes: corner missing in start boundary")
4278
+ return False
4279
+ if not check_line(start_nodes):
4280
+ logger.warning("end of create_boundary_nodes: bad start boundary")
4281
+ return False
4282
+
4283
+ logger.debug("Start Nodes")
4284
+ [logger.debug(" --> %s", x) for x in start_nodes]
4285
+
4286
+ end_nodes = [(distance(center, n), n, True)
4308
4287
  for n in self.angle_nodes(center, endangle, rtol, atol)]
4309
4288
  end_nodes.sort()
4289
+ d_end1, n, b = end_nodes[0]
4290
+ if not points_are_close(self.end_corners[0], n):
4291
+ logger.warning("end of create_boundary_nodes: corner missing in end boundary")
4292
+ return False
4293
+ d_end2, n, b = end_nodes[-1]
4294
+ if not points_are_close(self.end_corners[-1], n):
4295
+ logger.warning("end of create_boundary_nodes: corner missing in end boundary")
4296
+ return False
4297
+ if not check_line(end_nodes):
4298
+ logger.warning("end of create_boundary_nodes: bad end boundary")
4299
+ return False
4300
+
4301
+ logger.debug("End Nodes")
4302
+ [logger.debug(" --> %s", x) for x in end_nodes]
4310
4303
 
4311
- logger.debug("End with Nodes Start=%s, End=%s", len(start_nodes), len(end_nodes))
4304
+ logger.debug("Lower Corners: %s <> %s", d_start1, d_end1)
4305
+ if not np.isclose(d_start1, d_end1, rtol=self.rtol, atol=self.atol):
4306
+ logger.warning("end of create_boundary_nodes: corners dont match")
4307
+ return False
4312
4308
 
4313
- nodes = [n for d, n in start_nodes]
4314
- start_rot_nodes = self.rotate_nodes(alpha, nodes)
4309
+ logger.debug("Upper Corners: %s <> %s", d_start2, d_end2)
4310
+ if not np.isclose(d_start2, d_end2, rtol=self.rtol, atol=self.atol):
4311
+ logger.warning("end of create_boundary_nodes: corners dont match")
4312
+ return False
4315
4313
 
4316
- for d, node in start_nodes:
4317
- self.set_point_of_node(node, node)
4318
- i = 0
4319
- if len(end_nodes) == len(start_rot_nodes):
4320
- for d, node in end_nodes:
4321
- self.set_point_of_node(node, start_rot_nodes[i])
4322
- i += 1
4314
+ if len(start_nodes) == 2 and len(end_nodes) == 2:
4315
+ logger.debug("end of create_boundary_nodes: only corners available")
4316
+ return False # ok
4317
+
4318
+ def node_distance_list(nodelist1, nodelist2):
4319
+ distlist = []
4320
+ i1 = 0
4321
+ i2 = 0
4322
+ while i1 < len(nodelist1) and i2 < len(nodelist2):
4323
+ d1, n1, b1 = nodelist1[i1]
4324
+ d2, n2, b2 = nodelist2[i2]
4325
+ if np.isclose(d1, d2, rtol=self.rtol, atol=self.atol):
4326
+ distlist.append((d1, True, True))
4327
+ i1 += 1
4328
+ i2 += 1
4329
+ elif d1 > d2:
4330
+ distlist.append((d2, False, True))
4331
+ i2 += 1
4332
+ else:
4333
+ distlist.append((d1, True, False))
4334
+ i1 += 1
4335
+ if not i1 == len(nodelist1) and i2 == len(nodelist2):
4336
+ return []
4337
+ return distlist
4323
4338
 
4324
- logger.debug("end of create_boundery_nodes")
4325
- return
4339
+ distance_list = node_distance_list(start_nodes, end_nodes)
4340
+ [logger.debug("distance: %s, (%s, %s)", d, b1, b2)
4341
+ for d, b1, b2 in distance_list]
4342
+
4343
+ diff = len(distance_list) - len(start_nodes)
4344
+ done = False
4345
+ if not diff == 0:
4346
+ logger.debug("%s missing start nodes", diff)
4347
+ done = True
4348
+ for d, in_start, in_end in distance_list:
4349
+ if not in_start:
4350
+ p = point(self.center, d, startangle)
4351
+ start_nodes.append((d, p, False))
4352
+ start_nodes.sort()
4353
+ assert(len(start_nodes) == len(distance_list))
4354
+ if not self.repair_border_line(start_nodes):
4355
+ logger.debug("end of create_boundary_nodes (failed)")
4356
+ return False
4357
+
4358
+ diff = len(distance_list) - len(end_nodes)
4359
+ if not diff == 0:
4360
+ logger.debug("%s missing end nodes", diff)
4361
+ done = True
4362
+ for d, in_start, in_end in distance_list:
4363
+ if not in_end:
4364
+ p = point(self.center, d, endangle)
4365
+ end_nodes.append((d, p, False))
4366
+ end_nodes.sort()
4367
+ assert(len(end_nodes) == len(distance_list))
4368
+
4369
+ if not self.repair_border_line(end_nodes):
4370
+ logger.debug("end of create_boundary_nodes (failed)")
4371
+ return False
4372
+
4373
+ logger.debug("end of create_boundary_nodes")
4374
+ return done
4326
4375
 
4327
4376
  def set_point_of_node(self, node, p):
4328
4377
  if isinstance(node, list):
@@ -14,6 +14,7 @@ from femagtools.dxfsl.functions import alpha_angle, normalise_angle, middle_angl
14
14
  from femagtools.dxfsl.functions import alpha_line, line_m, line_n, mirror_point
15
15
  from femagtools.dxfsl.functions import within_interval, part_of_circle
16
16
  from femagtools.dxfsl.functions import less, less_equal, greater, greater_equal
17
+ from femagtools.dxfsl.journal import Journal, getJournal
17
18
  logger = logging.getLogger('femagtools.geom')
18
19
 
19
20
 
@@ -38,6 +39,7 @@ class Machine(object):
38
39
  self.airgap2_radius = 0.0
39
40
  self.airgap_second = None
40
41
  self.previous_machine = None
42
+ self.journal = getJournal()
41
43
 
42
44
  if not self.center:
43
45
  raise ValueError("FATAL ERROR: no center in Geometry")
@@ -554,8 +556,9 @@ class Machine(object):
554
556
  rtol=rtol, atol=atol)
555
557
  logger.debug('end of repair_hull_geom')
556
558
 
557
- def create_boundery_nodes(self):
558
- self.geom.create_boundery_nodes(self.center, self.startangle, self.endangle)
559
+ def create_boundary_nodes(self):
560
+ if self.geom.create_boundary_nodes(self.center, self.startangle, self.endangle):
561
+ logger.debug("___additional boundary nodes created___")
559
562
 
560
563
  def create_auxiliary_lines(self):
561
564
  logger.debug("create_auxiliary_lines")
femagtools/ecloss.py CHANGED
@@ -97,7 +97,7 @@ def binterp(x, y, xq, yq, b):
97
97
 
98
98
  def binterp_ialh2(x, y, xq, yq, b):
99
99
  '''interpolate flux density with Rbf interpolator'''
100
- f = RBFInterpolator(np.array([[i, j] for i, j in zip(x, y)]), b)
100
+ f = RBFInterpolator(np.array([[i, j] for i, j in zip(x, y)]), b, kernel='thin_plate_spline')
101
101
  inp = f(np.array([[i, j] for i, j in zip(xq, yq)]))
102
102
  return inp.reshape(len(np.unique(xq)), -1)
103
103
 
@@ -571,6 +571,10 @@ class MagnLoss(Amela):
571
571
  amplb = np.sqrt(amplbx**2 + amplby**2)
572
572
  fmax2 = 0.5*freq[-1]
573
573
 
574
+ if sum(amplb) == 0:
575
+ warnings.warn('Bx and By data equals to zero, check simulation parameters for this loadcase')
576
+ filt = 0
577
+
574
578
  if sum(amplb) > 0:
575
579
  pec = (np.multiply(amplb,freq))**2
576
580
  pecmax = np.max(pec)
@@ -604,10 +608,12 @@ class MagnLoss(Amela):
604
608
 
605
609
  for ii in range (nx): # Inverse Fourier-Transformation
606
610
  for jj in range (ny):
607
- sx_pm_3D[ii,jj,0:-1] = np.fft.irfftn(complbx[ii,jj,:])
608
- sy_pm_3D[ii,jj,0:-1] = np.fft.irfftn(complby[ii,jj,:])
609
- sx_pm_3D[ii,jj,nt-1] = sx_pm_3D[ii,jj,0]
610
- sy_pm_3D[ii,jj,nt-1] = sy_pm_3D[ii,jj,0]
611
+ sx = np.fft.irfftn(complbx[ii,jj,:], [nt - 1])
612
+ sy = np.fft.irfftn(complby[ii,jj,:], [nt - 1])
613
+ sx = np.append(sx, sx[0])
614
+ sy = np.append(sy, sy[0])
615
+ sx_pm_3D[ii,jj,:] = sx
616
+ sy_pm_3D[ii,jj,:] = sy
611
617
 
612
618
  return sx_pm_3D, sy_pm_3D
613
619
 
@@ -736,8 +742,7 @@ class MagnLoss(Amela):
736
742
 
737
743
  nsegx = max(1,nsegx) # 1 = no segmentation
738
744
  nsegz = max(1,nsegz) # 1 = no segmentation
739
- if nsegy != 1:
740
- nsegy = 1 # y segmentation not supported, nsegy is always = 1
745
+ nsegy = 1 # y segmentation not supported, nsegy is always = 1
741
746
 
742
747
  delta_eff = 0
743
748
 
@@ -758,7 +763,7 @@ class MagnLoss(Amela):
758
763
  (sx_abs, sy_abs, sx_phase, sy_phase, freq_range) = self.Process_B_data(nx, ny, nsegx, nsegy, nt, i['elcp'], i['bl'], excpl_new, eycpl_new)
759
764
  loss = self.loss_ialh2(sx_abs, sy_abs, sx_phase, sy_phase, freq_range, nx, ny, wm, hm, lm, nsegx, nsegy, nsegz, delta_eff) * self.numpoles
760
765
  ialh_loss += loss
761
- #print(f'Loadcase {i['loadcase']}, Superelement {i['spel_key']}, Total losses = {loss:.3f} W')
766
+ logger.info(f'Loadcase {i["loadcase"]}, Superelement {i["spel_key"]}, Total losses = {loss:.3f} W')
762
767
  loss_detail.append([i['spel_key'], loss/self.numpoles])
763
768
  self.th_loss.append(loss_detail)
764
769
  all_load_cases.append(ialh_loss)
femagtools/femag.py CHANGED
@@ -359,42 +359,71 @@ class BaseFemag(object):
359
359
 
360
360
  return dict()
361
361
 
362
- def read_hsn(self, modelname=None):
362
+ def read_hsn(self, modelname=None):
363
+ import numpy as np
363
364
  "read heat network result"
364
365
  _map = {
365
- "StZa": "plfe1",
366
+ "StZa": "plfe1",
366
367
  "outs": "-",
367
- "StJo": "plfe1",
368
+ "StJo": "plfe1",
368
369
  "Slot": "-",
369
- "Shaf": "-",
370
- "Iron": "plfe2",
370
+ "Shaf": "-",
371
+ "Iron": "plfe2",
371
372
  "PMag": "plmag",
372
373
  "PMag_1": "plmag",
373
374
  "PMag_2": "plmag",
374
375
  "PMag_3": "plmag",
375
376
  "PMag_4": "plmag",
376
- "W1 ": "plcu1",
377
- "W2 ": "plcu1",
377
+ "W1 ": "plcu1",
378
+ "W2 ": "plcu1",
378
379
  "W3 ": "plcu1"
379
380
  }
380
381
  if not modelname:
381
382
  modelname = self._get_modelname_from_log()
382
383
  hsn_list = sorted(glob.glob(os.path.join(
383
384
  self.workdir, modelname+'.hsn')))
384
- with open(hsn_list[-1], 'r') as f:
385
+ with open(hsn_list[-1], 'r') as f:
385
386
  hsn_data = json.load(f)
387
+
388
+ # area calculation
389
+ nc_file = self.read_nc(modelname)
390
+ slot_area = 0.0
391
+ wdg_area = []
392
+ for i in nc_file.windings:
393
+ for j in i.subregions:
394
+ wdg_area.append(j.area())
395
+
396
+ slot_area = np.sum(wdg_area).item()/3
397
+ magnet_area = 0.0
398
+ num_sreg_mag = 0
399
+ area = dict()
400
+ for i in nc_file.subregions:
401
+ if i.name in ("StZa", "StJo", "Iron"):
402
+ area[i.name] = i.area().item()
403
+ elif i.name == "PMag":
404
+ magnet_area += i.area().item()
405
+ num_sreg_mag += 1
406
+ else:
407
+ pass
408
+
409
+ area['PMag'] = magnet_area/num_sreg_mag
410
+ for i in ('W1', 'W2', 'W3'):
411
+ area[i] = slot_area
412
+
386
413
  pmag_index = []
387
- if "Nodes" in hsn_data:
388
- for k ,i in enumerate(hsn_data['Nodes']):
414
+ if "Nodes" in hsn_data:
415
+ for k ,i in enumerate(hsn_data['Nodes']):
389
416
  i.update({"mass": i['weight'], "losses": _map[i['Name']]})
390
- if "PMag" in i['Name']:
417
+ if "PMag" in i['Name']:
391
418
  pmag_index.append(k)
392
- if pmag_index:
393
- for i in range(len(pmag_index)):
394
- hsn_data["Nodes"][pmag_index[i]]['Name'] = f"PMag_{i+1}"
395
- with open(hsn_list[-1], 'w') as f:
419
+ if i['Name'].strip() in area.keys():
420
+ i.update({"area": area[i['Name'].strip()]})
421
+ if pmag_index:
422
+ for i in range(len(pmag_index)):
423
+ hsn_data["Nodes"][pmag_index[i]]['Name'] = f"PMag_{i+1}"
424
+ with open(hsn_list[-1], 'w') as f:
396
425
  json.dump(hsn_data, f)
397
- return hsn_data
426
+ return nc_file
398
427
 
399
428
  def _get_modelname_from_log(self):
400
429
  """
@@ -439,11 +468,13 @@ class BaseFemag(object):
439
468
  return {'t': ttemp[0], 'temperature': ttemp[1]}
440
469
 
441
470
  if simulation['calculationMode'] == 'hsn':
442
- try:
443
- hsn_result = self.read_hsn()
444
- except:
445
- pass
446
- model = self.read_nc()
471
+ model = None
472
+ try:
473
+ model = self.read_hsn()
474
+ except:
475
+ pass
476
+ if model is None:
477
+ model = self.read_nc()
447
478
  return model.get_minmax_temp()
448
479
 
449
480
  if not bch:
@@ -497,7 +528,8 @@ class BaseFemag(object):
497
528
  ops = [k for k in range(len(bch.torque))]
498
529
  m = femagtools.ecloss.MagnLoss(self.workdir, self.modelname, ibeta=ops)
499
530
  try:
500
- magn_losses = m.calc_losses()
531
+ # change from ialh to ialh2: since v1.8.1
532
+ magn_losses = m.calc_losses_ialh2()
501
533
  except:
502
534
  magn_losses = [0 for i in range(len(ops))]
503
535
 
@@ -513,11 +545,11 @@ class BaseFemag(object):
513
545
  bch.magnet_loss_th = m.th_loss
514
546
  except:
515
547
  pass
516
- try:
517
- if hasattr(self, 'dy2'):
548
+ try:
549
+ if hasattr(self, 'dy2'):
518
550
  setattr(bch, 'dy2', self.dy2)
519
- except:
520
- pass
551
+ except:
552
+ pass
521
553
  return bch
522
554
 
523
555
 
@@ -649,10 +681,10 @@ class Femag(BaseFemag):
649
681
  stateofproblem = 'mag_static'
650
682
 
651
683
  self.run(fslfile, options, fsl_args, stateofproblem=stateofproblem)
652
-
653
- try:
684
+
685
+ try:
654
686
  setattr(self, "dy2", machine['stator']['dy2'])
655
- except:
687
+ except:
656
688
  pass
657
689
  if simulation:
658
690
  return self.readResult(simulation)
femagtools/fsl.py CHANGED
@@ -157,10 +157,18 @@ class Builder:
157
157
  + model.stator['dxf']['fsl'])
158
158
  if templ == 'statorFsl':
159
159
  # obsolete
160
+ th_props = [' ']
161
+ try:
162
+ th_props = [f'stator_density = {model.stator["density"]}',
163
+ f'stator_thcond = {model.stator["thcond"]}',
164
+ f'stator_thcap = {model.stator["thcap"]}',
165
+ ]
166
+ except:
167
+ pass
160
168
  if 'parameter' in model.stator['statorFsl']:
161
169
  return self.render_template(
162
170
  model.stator['statorFsl']['content_template'],
163
- model.stator['statorFsl']['parameter'])
171
+ model.stator['statorFsl']['parameter']) + th_props
164
172
  elif model.stator['statorFsl'].get('content'):
165
173
  return (['agndst = {}'.format(model.get('agndst', 1e-3)*1e3),
166
174
  'ndt(agndst)'] +
@@ -214,16 +222,24 @@ class Builder:
214
222
  .format(model.magnet.get('mcvkey_yoke', 'dummy')),
215
223
  "mcvkey_shaft = '{}'"
216
224
  .format(model.magnet.get('mcvkey_shaft', 'dummy'))]
217
-
218
225
  if 'magnetFsl' in model.magnet:
219
226
  self.fsl_rotor = True
220
227
  # obsolete
228
+ th_props = [' ']
229
+ try:
230
+ logger.info(model.magnet)
231
+ th_props = [f'rotor_density = {model["magnet"]["density"]}',
232
+ f'rotor_thcond = {model["magnet"]["thcond"]}',
233
+ f'rotor_thcap = {model["magnet"]["thcap"]}'
234
+ ]
235
+ except:
236
+ pass
221
237
  if 'parameter' in model.magnet['magnetFsl']:
222
238
  return mcv + self.render_template(
223
239
  model.magnet['magnetFsl']['content_template'],
224
- model.magnet['magnetFsl']['parameter'])
240
+ model.magnet['magnetFsl']['parameter']) + th_props
225
241
  elif model.magnet['magnetFsl'].get('content'):
226
- return mcv + model.magnet['magnetFsl']['content'].split('\n')
242
+ return mcv + model.magnet['magnetFsl']['content'].split('\n')
227
243
  if isinstance(model.magnet['magnetFsl']
228
244
  ['content_template'], str):
229
245
  with open(model.magnet['magnetFsl']
@@ -231,9 +247,8 @@ class Builder:
231
247
  templ = [l.strip() for l in f.readlines()]
232
248
  else:
233
249
  templ = model.magnet['magnetFsl']['content_template']
234
-
235
250
  return mcv + self.render_template(
236
- '\n'.join(templ),
251
+ '\n'.join(templ),
237
252
  model.magnet['magnetFsl'])
238
253
 
239
254
  templ = model.magnettype()
femagtools/machine/sm.py CHANGED
@@ -344,13 +344,13 @@ class SynchronousMachine(object):
344
344
  freq = w/2/np.pi
345
345
  kr = self.zeta1[0]*freq**3 + self.zeta1[1]*freq**2 + \
346
346
  self.zeta1[2]*freq + self.zeta1[3]
347
- if isinstance(kr, list):
347
+ if isinstance(kr, list):
348
348
  kr = np.array(kr)
349
349
  kr[kr<1.0] = 1.0
350
350
  elif isinstance(kr, np.ndarray):
351
351
  kr[kr<1.0] = 1.0
352
- else:
353
- if kr < 1.0:
352
+ else:
353
+ if kr < 1.0:
354
354
  kr = 1.0
355
355
  return self.r1*(1 + self.kth1*(self.tcu1 - 20))*kr # ref 20°C
356
356
  sr = self.skin_resistance[0]
@@ -806,10 +806,7 @@ class SynchronousMachinePsidq(SynchronousMachine):
806
806
  if 'styoke_excess' in eecpars[idname][0]['losses'] and \
807
807
  np.any(np.array(eecpars[idname][0]['losses']['styoke_excess'])):
808
808
  self.bertotti = True
809
- keys.update({{
810
- 'styoke_excess': 1.5,
811
- 'stteeth_excess':1.5,
812
- 'rotor_excess': 1.5}})
809
+ keys += ['styoke_excess', 'stteeth_excess','rotor_excess']
813
810
  if islinear:
814
811
  pfe = {k: np.array([l['losses'][k]
815
812
  for l in eecpars[idname]])
@@ -926,10 +923,7 @@ class SynchronousMachineLdq(SynchronousMachine):
926
923
  if 'styoke_excess' in eecpars[idname][0]['losses'] and \
927
924
  np.any(np.array(eecpars[idname][0]['losses']['styoke_excess'])):
928
925
  self.bertotti = True
929
- keys.update({{
930
- 'styoke_excess': 1.5,
931
- 'stteeth_excess':1.5,
932
- 'rotor_excess': 1.5}})
926
+ keys += ['styoke_excess', 'stteeth_excess','rotor_excess']
933
927
 
934
928
  if islinear:
935
929
  pfe = {k: np.array([l['losses'][k]
@@ -91,7 +91,11 @@ m.nodedist = ${model.get('nodedist', 1)}
91
91
  x,y = (P22.x+P32.x)/2,(P21.y+P22.y)/2
92
92
  if m.remanenc == nil then
93
93
  m.remanenc = 1.2
94
+ end
95
+ if m.relperm == nil then
94
96
  m.relperm = 1.05
97
+ end
98
+ if m.rlen == nil then
95
99
  m.rlen = 100
96
100
  end
97
101
  for i = 1,m.npols_gen do
@@ -40,12 +40,12 @@ shaft_spel = {} ---- lightgrey, 16
40
40
  magnet_spel = {} -- black, 8
41
41
  outer_air = {} -- darkred, 10
42
42
  inner_air = {} -- lightgrey, 16
43
- rotor_air = {}
43
+ rotor_air = {}
44
44
  stator_air = {} -- black, 8
45
45
  airgap = {} -- white, 8
46
46
  magnet_pocket_spel = {} -- red, 1
47
47
  non_uniform_airgap = {} -- white, 8
48
- slot_opening = {}
48
+ slot_opening = {}
49
49
  slot_sreg_exist = 0
50
50
  -- search all components
51
51
  for i =1, #spel_keys do
@@ -74,7 +74,7 @@ for i =1, #spel_keys do
74
74
  %if model.get('htc_outer', 0):
75
75
  def_heat_transfer(xc,yc,yellow,${model['htc_outer']}, 1.0)
76
76
  %endif
77
- color_spel(spel_keys[i], 10)
77
+ color_spel(spel_keys[i], 10)
78
78
 
79
79
  elseif rc > dy2/2 and rc < da2/2 then
80
80
  -- rotor air
@@ -87,14 +87,14 @@ for i =1, #spel_keys do
87
87
  -- stator air
88
88
  table.insert(stator_air, spel_keys[i])
89
89
  def_mat_therm(xc, yc, 'yellow', 1.19,0.15,1007, 1)
90
- color_spel(spel_keys[i], 8)
90
+ color_spel(spel_keys[i], 8)
91
91
  key_exist_sl = get_sreg_key(xc, yc)
92
- if key_exist_sl <= 0 and slot_sreg_exist == 0 then
92
+ if key_exist_sl <= 0 and slot_sreg_exist == 0 then
93
93
  def_new_sreg(xc, yc, 'Slot', 'yellow')
94
94
  slot_sreg_exist = 1
95
- else
95
+ else
96
96
  add_to_sreg(xc, yc, 'Slot')
97
- end
97
+ end
98
98
  elseif rc > da2/2 and rc < da1/2 then
99
99
  table.insert(airgap, spel_keys[i])
100
100
  def_mat_therm(xc, yc, 'yellow', 1.19,0.15,1007, 1)
@@ -139,83 +139,83 @@ end
139
139
 
140
140
  function is_exist(arr, val)
141
141
  local i
142
- if #arr == 0 then
143
- return false
144
- end
145
- for i = 1, #arr do
146
- if arr[i] == val then
142
+ if #arr == 0 then
143
+ return false
144
+ end
145
+ for i = 1, #arr do
146
+ if arr[i] == val then
147
147
  return true
148
- end
149
- end
148
+ end
149
+ end
150
150
  return false
151
- end
152
- -- identify magnet air pocket
151
+ end
152
+ -- identify magnet air pocket
153
153
 
154
- for i = 1, #magnet_spel do
154
+ for i = 1, #magnet_spel do
155
155
  bkeys = get_spel_data ( "bndkeys", magnet_spel[i])
156
- for j = 1, #bkeys do
156
+ for j = 1, #bkeys do
157
157
  elks = get_node_data ( "elkeys", bkeys[j] )
158
- for k = 1, #elks do
158
+ for k = 1, #elks do
159
159
  p1, p2 = get_elem_data("perm", elks[k])
160
160
  sek = get_elem_data("sekey", elks[k])
161
- if p1 == 1.0 then
162
- if (not is_exist(magnet_pocket_spel, sek)) and (not is_exist(airgap, sek)) then
161
+ if p1 == 1.0 then
162
+ if (not is_exist(magnet_pocket_spel, sek)) and (not is_exist(airgap, sek)) then
163
163
  table.insert(magnet_pocket_spel, sek)
164
164
  els = get_spel_data('elkeys', sek)
165
165
  xc, yc = get_xy(els[1])
166
166
  def_mat_therm(xc, yc, 'red', 1.12,0.026,1007, 1)
167
167
  --table.remove(rotor_air, sek)
168
168
  color_spel(sek, 1)
169
- end
170
- end
171
- end
172
- end
173
- end
169
+ end
170
+ end
171
+ end
172
+ end
173
+ end
174
174
 
175
175
 
176
176
 
177
- for i = 1, #rotor_air do
178
- if rotor_air[i] ~= nil then
177
+ for i = 1, #rotor_air do
178
+ if rotor_air[i] ~= nil then
179
179
  bkeys = get_spel_data ( "bndkeys", rotor_air[i])
180
- for j = 1, #bkeys do
180
+ for j = 1, #bkeys do
181
181
  x, y = get_node_data ( "xy", bkeys[j] )
182
- r, phi = c2pd(x, y)
183
- if math.abs(r - da2/2) < 1e-5 then
184
- if not is_exist(non_uniform_airgap,rotor_air[i]) then
182
+ r, phi = c2pd(x, y)
183
+ if math.abs(r - da2/2) < 1e-5 then
184
+ if not is_exist(non_uniform_airgap,rotor_air[i]) then
185
185
  table.insert(non_uniform_airgap, rotor_air[i])
186
186
  els = get_spel_data('elkeys', rotor_air[i])
187
187
  xc, yc = get_xy(els[1])
188
188
  def_mat_therm(xc, yc, 'yellow', 1.19,1.15,1007, 1)
189
189
  add_to_sreg(xc, yc, 'Slot')
190
190
  color_spel(rotor_air[i], 7)
191
- end
192
- end
193
- end
194
- end
195
- end
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
196
 
197
- for i = 1, #rotor_air do
198
- if rotor_air[i] ~= nil then
199
- if is_exist(non_uniform_airgap, rotor_air[i]) then
197
+ for i = 1, #rotor_air do
198
+ if rotor_air[i] ~= nil then
199
+ if is_exist(non_uniform_airgap, rotor_air[i]) then
200
200
  rotor_air[i] = nil
201
- end
202
- end
203
- end
201
+ end
202
+ end
203
+ end
204
204
 
205
- for i = 1, #rotor_air do
206
- if is_exist(magnet_pocket_spel, rotor_air[i]) then
205
+ for i = 1, #rotor_air do
206
+ if is_exist(magnet_pocket_spel, rotor_air[i]) then
207
207
  rotor_air[i] = nil
208
- end
209
- end
210
-
208
+ end
209
+ end
211
210
 
212
- for i = 1, #rotor_air do
213
- if rotor_air[i] ~= nil then
211
+
212
+ for i = 1, #rotor_air do
213
+ if rotor_air[i] ~= nil then
214
214
  els = get_spel_data('elkeys', rotor_air[i])
215
215
  xc, yc = get_xy(els[1])
216
216
  def_mat_therm(xc, yc, 'red', 1.12,0.026,1007, 1)
217
- end
218
- end
217
+ end
218
+ end
219
219
 
220
220
 
221
221
  save_metafile(model..'.ps')
@@ -322,7 +322,10 @@ end
322
322
 
323
323
 
324
324
  rn, phin = get_boundary_node(m.tot_num_slot)
325
- thickness = ${model.get('slot_insul', 0.15)}
325
+ thickness = ${model.windings.get('slot_insulation_thickness', 0.15e-3)*1e3}
326
+ if thickness == 0.0 then
327
+ thickness = 0.15
328
+ end
326
329
  conductivity = ${model.get('slot_insul_cond', 0.31)}
327
330
 
328
331
  for i = 1,m.num_sl_gen do
@@ -331,7 +334,7 @@ y = {}
331
334
 
332
335
  for j = 1, #rn do
333
336
  x[j], y[j] = pd2c(rn[j], phin[j] + (i-1)*360/m.tot_num_slot)
334
- point(x[j], y[j],"black","x")
337
+ point(x[j], y[j],"black","x")
335
338
  end
336
339
 
337
340
  def_insulation_by_nodechain(thickness,conductivity,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.8.0
3
+ Version: 1.8.1
4
4
  Summary: Python API for FEMAG
5
5
  Author-email: Ronald Tanner <tar@semafor.ch>, Dapu Zhang <dzhang@gtisoft.com>, Beat Holm <hob@semafor.ch>, Günther Amsler <amg@semafor.ch>, Nicolas Mauchle <mau@semafor.ch>
6
6
  License: Copyright (c) 2016-2023, Semafor Informatik & Energie AG, Basel
@@ -1,4 +1,4 @@
1
- femagtools/__init__.py,sha256=LOLIDnRqx1rFlY3VW2IB1PaBPwEYtzPgv2UIqP0QKZU,1600
1
+ femagtools/__init__.py,sha256=8qBE3W14xsW2ubtd47GQKlMz2Q3iiSOKk2UAcacUMJI,1600
2
2
  femagtools/airgap.py,sha256=hELJXe52yUw82JwZ1tGUXUtRhMG2_WSUBVeGkTZSAM8,1900
3
3
  femagtools/amazon.py,sha256=O1ICuv21XDAJi1qK1Sigs2TdS6hDZP19OzvmE2t76wU,12069
4
4
  femagtools/amela.py,sha256=RFTuQ5EcX19G2YJchnktr6j62mNptrdTreShQDOeuKA,13874
@@ -13,11 +13,11 @@ femagtools/dakota.py,sha256=L2zZdACdhso7szwN_s5tsmeEbcuUygE2JK4SxwtL79w,6901
13
13
  femagtools/dakota_femag.py,sha256=ipmMUMTK1mvMpfHJJjwHa_4kx7BItYO3ha8MeYJTyy8,4068
14
14
  femagtools/dakotaout.py,sha256=6nn0PXsB40mPKiQLenqAtHy0KXCO7kvqqQ-aD2JhQvw,5573
15
15
  femagtools/docker.py,sha256=XDVmLBB0z4sZZpcrx7Wbm84xl4ksj7aqn5-ZOPxdxm4,7460
16
- femagtools/ecloss.py,sha256=0nD2_R7ISl6OGG_l8FLi27ynLG9SlzhJBy13sBoR8Ts,33743
16
+ femagtools/ecloss.py,sha256=kTsE9Lx6nt6Ez9PBfD58hPMcnH2PxSc95zJaYMCQd5Q,33957
17
17
  femagtools/erg.py,sha256=IXKq76P9qLt_ssNOP78v8Qizk3J2Zg80yaKDSjzwoJE,1224
18
- femagtools/femag.py,sha256=5zOcfUHkAgdhWsOROuAijLaTQMt7JF5xpszwQR_G7Zs,45990
18
+ femagtools/femag.py,sha256=m8mfMjzjkL_R-iqyInxM7y7F4jgKg6ZI7FfTQlbxtng,46988
19
19
  femagtools/forcedens.py,sha256=7NNv75Vg9vQ_fy8W4kM2rlSO970zaSmeurhPmdAxsOU,8485
20
- femagtools/fsl.py,sha256=Ap-U7g3BO8uBGUyElkwRgaHHK0WK5XDRC7NfdXaK8lk,36182
20
+ femagtools/fsl.py,sha256=XktbwR4KvUVv-Fq_9FMPbigBvrHYfSdL6P0kcwAx5Mg,36929
21
21
  femagtools/getset.py,sha256=yJ6Em35DeWK7WNZW0qjjS5s7LUkVh5mbgxF59HHm5FM,3017
22
22
  femagtools/gmsh.py,sha256=IKhNiviIBji4cMxAhxaYXNqBRMNAPSKsBGdnGyxkyQw,3903
23
23
  femagtools/google.py,sha256=ugRyHY1zBjHR4aNfbA7GeF-ZU_NgleuVTZaWpi_XLT4,17144
@@ -48,20 +48,20 @@ femagtools/vbf.py,sha256=9XGfhftmD9carU8ByQ5DwqoR4daq5mJ39eMqruwml0Q,2444
48
48
  femagtools/vtu.py,sha256=Sf83dHIfCKY2km-MIUHKKoj-JKN4PDX7kkPLZXyIYY4,10723
49
49
  femagtools/windings.py,sha256=OYoEFIQci3f3sYJkcyRjBpBpDRtX2Y2aHZiRXOEgsls,23497
50
50
  femagtools/dxfsl/__init__.py,sha256=MywcCdpKPKs4qJBJJgeDsikJFJ2P48dbTuNk303f5pM,76
51
- femagtools/dxfsl/area.py,sha256=74VwDSvBLrxpIo_oxU3FGbg3ef_4L8F2IJTG-dJArz8,65208
51
+ femagtools/dxfsl/area.py,sha256=d991y_mLGapilCQyp3ZK6mXbUeXEt-nAkJWJ5P0yxXo,65227
52
52
  femagtools/dxfsl/areabuilder.py,sha256=Siu11yRcNJiSCWwc865-OvuVhSmLtRQWysbe1-rUcN0,34197
53
53
  femagtools/dxfsl/concat.py,sha256=F6scwesxyOmfmKQ5kGspNCxA71Yz6QgxFL7lTj3hsaI,13385
54
- femagtools/dxfsl/conv.py,sha256=TaYqaeRwrK98mPh9uH33SmpmVW48U2v-qnDKs2cjcj8,10600
55
- femagtools/dxfsl/converter.py,sha256=B0r9MWZbsiIWukHotZ7NMq8rse1FadAaOblxbvDDyw4,34490
54
+ femagtools/dxfsl/conv.py,sha256=-d03mQiDWF_MD4T0TIH7k-zNa6p7w9rtc6QE2Bz1Q7s,10362
55
+ femagtools/dxfsl/converter.py,sha256=8Bm3JQaK6IwZBil6n5avaydd7Nkvj8tRNGbqWU4EHU8,35525
56
56
  femagtools/dxfsl/corner.py,sha256=-XPBcnEau-2-SRHLYzlBqCQGaFfgm_DH2qR1mSaFoAs,1311
57
57
  femagtools/dxfsl/dumprenderer.py,sha256=n4AvInjvGIaC2iKZtQaYXXDyJVSQ3uEOFOLD4-xfKRY,1861
58
58
  femagtools/dxfsl/dxfparser.py,sha256=kyXG0kZfNyOgn96MqBgP8RhOQhppfB5NbyRNNybs1C0,13451
59
59
  femagtools/dxfsl/femparser.py,sha256=O8940Q1Mz8MKng6W8M3s9KfTvhDLJ56tfQWtZEW3xMM,2134
60
- femagtools/dxfsl/fslrenderer.py,sha256=Z6jLpwuDCwUyQFf9YinSnJ7u_9WAb71MIgSOugdt0-8,27540
60
+ femagtools/dxfsl/fslrenderer.py,sha256=v2z6GJPuuI0FDxHENw_Oteejz5GZzgc5nr0fjffH3q8,27904
61
61
  femagtools/dxfsl/functions.py,sha256=teJHtVxoViGs66AB8_4BxRrFQx9SbPT2azIrKyhJHOc,12005
62
- femagtools/dxfsl/geom.py,sha256=iHrHdC8yOTfE1bRSbsM2hVd0LH_sx7Ws42-SX0TBSzM,172502
62
+ femagtools/dxfsl/geom.py,sha256=Q0pxdT3qtUs7lg3RmJ-_7RhlnM9n9_xE_LRjJeNpf4E,174555
63
63
  femagtools/dxfsl/journal.py,sha256=4LMSW5wCYlETzid6SIF8b5DH-DCgtH4nFx-xIxjtbfg,4265
64
- femagtools/dxfsl/machine.py,sha256=M6KzOzmeb3Al2Hp3BjlgYWKGpbRrOPwKeN5VFXS2qF8,50415
64
+ femagtools/dxfsl/machine.py,sha256=vaELJixMKrjJTOe5QNb5aXVG17vN0KbMQaI1arNzYd0,50580
65
65
  femagtools/dxfsl/plotrenderer.py,sha256=q2cORuxJEf1Ws6oCY9c0gF6N3kDrcI6WOz3u5Vl6R_c,13823
66
66
  femagtools/dxfsl/shape.py,sha256=kz68mPsK1m5jRnE-5iNS3FX2IkpSHOe0X3OdEklGR80,59970
67
67
  femagtools/dxfsl/svgparser.py,sha256=FE8Jk3pV6e4AtJlrJuUxz89_JZC9buS0wwTBsX52O1g,3762
@@ -72,7 +72,7 @@ femagtools/machine/effloss.py,sha256=GV_bc5f1ysBi1Ng7FR3fD1xh5KXa6ACc55iWfsltMBI
72
72
  femagtools/machine/im.py,sha256=3Y54AHMZfAjkvgexx2E-5jxNWzaVQ-SyaETCh7gNBYA,38008
73
73
  femagtools/machine/pm.py,sha256=C4vDdPIsIRUKtzY3b1RNT1v37p1uP3pMUduftNejcPc,68129
74
74
  femagtools/machine/sizing.py,sha256=nWCfxbyWfbw5-7xu0qZ6zjWNquEPn3fUH-fQeGb6QUc,24307
75
- femagtools/machine/sm.py,sha256=y_zPZN0gGKUQL8RCyhyyfeJE_cSRPK5Mmk93HQPzTFM,39379
75
+ femagtools/machine/sm.py,sha256=Y6g4KPm-2bhzMYjGarojokEzaNgOmFR2G4DIKBtVQOs,39210
76
76
  femagtools/machine/utils.py,sha256=CRTY5qwlaN_Zp5SZgxicXTfZyVU5fjtm4XKEA-peNCc,20856
77
77
  femagtools/moo/__init__.py,sha256=zinmWEOrsEz6DmMX0Dbn4t6_1UR-p4bEGqyR1wUQk_Q,175
78
78
  femagtools/moo/algorithm.py,sha256=e-Cgp2rp_hG9DXqWqluzQGNIWvCfthUgLD8O-aVPofA,5763
@@ -93,7 +93,7 @@ femagtools/plot/phasor.py,sha256=5QG1GkXKVksc8P6Q4thKADf6W1l8rDKeArIHFYvbXlw,485
93
93
  femagtools/plot/wdg.py,sha256=Orw2XGThHpOuJ_raSRnQTzj5tOmwllNWweByoOXbA7I,9820
94
94
  femagtools/svgfsl/converter.py,sha256=5q4LognshXNTpUWLnU5rtgCfAwZnEuPzqsgyeRYC-VM,3019
95
95
  femagtools/templates/FE-losses.mako,sha256=Rql5_8Q6_uthpr-uFXMUo7tdHehfZYND-7M-ohJXVU8,874
96
- femagtools/templates/afm_rotor.mako,sha256=fY-dlZvRLN9UAy5V6Q_inWghkSUe8pzrCYjJdNgfNXs,3112
96
+ femagtools/templates/afm_rotor.mako,sha256=4yoEA4fOq9FRcwxOMRw1oX4Bs_jcrtyHOY6kHPYJ5MY,3175
97
97
  femagtools/templates/afm_stator.mako,sha256=l1xEwxffZ1jyx5wuJ3rhVbVlZirJzD2K8n4i5Dvbxuc,5344
98
98
  femagtools/templates/airgapinduc.mako,sha256=aCMLZ7P4vjeSGikIetkwymgDjESdftPN_aYx2LfjfsY,246
99
99
  femagtools/templates/asyn_motor.mako,sha256=vvZ0SIJj4ORaCbE1Hl5NeCU_j2CWdOltVpSKP7ESJTQ,2879
@@ -143,7 +143,7 @@ femagtools/templates/plots.mako,sha256=6xfmncVbzDiJLF6V0B6fha23H19R7P26DvcTTwzJ5
143
143
  femagtools/templates/pm_sym_f_cur.mako,sha256=KlskcNx5Y_HNwt2crA7CqHN5TIaKBb14T6cFg2vghl0,1464
144
144
  femagtools/templates/pm_sym_fast.mako,sha256=NOSbuWSEM2XGY5-JweGxSr32mXGBVSas_aSOQyK4uEU,2361
145
145
  femagtools/templates/pm_sym_loss.mako,sha256=dh0o3ZamZuWs7sHc-jS7ohKsqeZCA0tRaqkaFmXlRS0,1009
146
- femagtools/templates/prepare_thermal.mako,sha256=H8YRqE8i5AiRPl-dE3obiMhiuO9vm5L7ASeqPJoUozg,9521
146
+ femagtools/templates/prepare_thermal.mako,sha256=V3W6BGW7gjY8Lg2qzvGDi8rxx3JvPzrWoABDvHKyq54,9539
147
147
  femagtools/templates/psd_psq_fast.mako,sha256=7DQUZI6KOjdKQMFLKySGUlWXo4U_rZuHXFzLxiA1GGc,1339
148
148
  femagtools/templates/ring.mako,sha256=Cuc_FuCPWZM-g3TxHqzTdjknYEJSUgP-y64gp8pekDI,643
149
149
  femagtools/templates/rot_hsm.mako,sha256=eh50TbpWNUALK9_7wOOJ7KPewHos7JExAfMACbPlXYc,973
@@ -213,9 +213,9 @@ tests/moo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
213
213
  tests/moo/test_algorithm.py,sha256=Em8sFm2vzPmuIzRrBBnUQLU_TYuJHSf-kEeozw0XeX4,2563
214
214
  tests/moo/test_population.py,sha256=FvX9LRCxQx0_E2GxHQ5vKwOYFBQiNbT6Lmv5GmNWjTQ,5471
215
215
  tests/moo/test_problem.py,sha256=ALeP4u7g-dFhfwWL8vxivdrrYzVKPjHMCAXzzgyNZbs,467
216
- femagtools-1.8.0.dist-info/LICENSE,sha256=NaQe4uvkszQPJmiRPHecfk-Ab9VSRXo8xQLGNVHTeFo,1362
217
- femagtools-1.8.0.dist-info/METADATA,sha256=qZkw13rq-jo1WT373nahzfRdxT1VvBAnMgKBhiDK_5A,6198
218
- femagtools-1.8.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
219
- femagtools-1.8.0.dist-info/entry_points.txt,sha256=jrvOkZPiN44u1sASeu271VRaVIv5V-uRpN0_N5U_R8c,248
220
- femagtools-1.8.0.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
221
- femagtools-1.8.0.dist-info/RECORD,,
216
+ femagtools-1.8.1.dist-info/LICENSE,sha256=NaQe4uvkszQPJmiRPHecfk-Ab9VSRXo8xQLGNVHTeFo,1362
217
+ femagtools-1.8.1.dist-info/METADATA,sha256=vMKM0Pd8bfajkKv7bXpXco4_dmISFQXGJKQRtQDb9xE,6198
218
+ femagtools-1.8.1.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
219
+ femagtools-1.8.1.dist-info/entry_points.txt,sha256=jrvOkZPiN44u1sASeu271VRaVIv5V-uRpN0_N5U_R8c,248
220
+ femagtools-1.8.1.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
221
+ femagtools-1.8.1.dist-info/RECORD,,