femagtools 1.6.1__py3-none-any.whl → 1.6.2__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.6.1'
5
+ __version__ = '1.6.2'
6
6
  __author__ = 'Ronald Tanner'
7
7
  __license__ = 'BSD'
8
8
  __copyright__ = 'Copyright 2016-2022 SEMAFOR Informatik & Energie AG'
femagtools/bch.py CHANGED
@@ -284,7 +284,7 @@ class Reader:
284
284
  nue = np.arange(0, 5*n).tolist()
285
285
  order, tq = np.array(
286
286
  [(n, b)
287
- for n, b in zip(nue, f['nue'])]).T
287
+ for n, b in zip(nue, f['nue']) if b > 1e-15 and 2*n % poles == 0]).T
288
288
  self.torque_fft = [
289
289
  {'order': order.tolist(),
290
290
  'torque': tq.tolist()}]
@@ -1028,7 +1028,7 @@ class Reader:
1028
1028
  e.g. : idList[-450, -350, -250, -150, -50, 0]
1029
1029
  idList[-500, -400, -300, -200, -100, 0, 0]
1030
1030
  '''
1031
- diff = np.around(np.abs(np.diff(idList[1:]) - np.diff(idList)[:-1]), 1)
1031
+ diff = np.floor(np.abs(np.diff(idList)))
1032
1032
  if idList[-1] == 0 and len(idList) > 2 and \
1033
1033
  not np.all(diff == diff[0]):
1034
1034
  idList = idList[:-1]
@@ -11,6 +11,7 @@ from __future__ import print_function
11
11
  import logging
12
12
  import numpy as np
13
13
  import copy
14
+ import time
14
15
 
15
16
  logger = logging.getLogger('femagtools.functions')
16
17
 
@@ -112,9 +113,11 @@ def round_point(p, n):
112
113
  return (round(p[0], n), round(p[1], n))
113
114
 
114
115
 
115
- def line_m(p1, p2):
116
+ def line_m(p1, p2, none_val=None, dec=0):
116
117
  if np.isclose(p2[0]-p1[0], 0.0):
117
- return None
118
+ return none_val
119
+ if dec > 0:
120
+ return round((p2[1]-p1[1]) / (p2[0]-p1[0]), dec)
118
121
  return (p2[1]-p1[1]) / (p2[0]-p1[0])
119
122
 
120
123
 
@@ -241,6 +244,14 @@ def points_are_close(p1, p2, rtol=1e-05, atol=1e-08):
241
244
  np.isclose(p1[1], p2[1], rtol, atol))
242
245
 
243
246
 
247
+ def point_greater_equal(p1, p2, rtol=1e-05, atol=1e-08):
248
+ if not (p1 and p2):
249
+ return False
250
+ if np.isclose(p1[0], p2[0], rtol, atol): # x equal
251
+ return greater_equal(p1[1], p2[1], rtol, atol) # y >= equal
252
+ return greater_equal(p1[0], p2[0], rtol, atol) # x >= equal
253
+
254
+
244
255
  def nodes_are_equal(n1, n2):
245
256
  if not (n1 and n2):
246
257
  return False
@@ -275,6 +286,14 @@ def normalise_angle(alpha):
275
286
  return alpha
276
287
 
277
288
 
289
+ def positive_angle(alpha):
290
+ """ returns a positive value for angle alpha
291
+ """
292
+ while alpha < 0.0:
293
+ alpha += 2*np.pi
294
+ return alpha
295
+
296
+
278
297
  def is_same_angle(angle1, angle2, atol=0.001):
279
298
  """ returns true if angles are equal
280
299
  """
@@ -404,3 +423,31 @@ def points_on_arc(center, radius, startangle, endangle, parts=8):
404
423
  for alpha in angles_on_arc(start, end, parts=parts):
405
424
  yield (center[0] + radius * np.cos(alpha),
406
425
  center[1] + radius * np.sin(alpha))
426
+
427
+
428
+ class Timer(object):
429
+ def __init__(self, start_it=False):
430
+ self.starttime = None
431
+ if start_it:
432
+ self.start()
433
+
434
+ def __str__(self):
435
+ if self.starttime is None:
436
+ return "Timer is not running"
437
+ stop = time.perf_counter()
438
+ return "Timer is already running for %0.4f seconds" % (stop - self.starttime)
439
+
440
+ def start(self):
441
+ if self.starttime is not None:
442
+ logger.error("Timer is already on")
443
+ self.starttime = time.perf_counter()
444
+
445
+ def stop(self, fmt=None):
446
+ if self.starttime is None:
447
+ logger.error("Timer is not running")
448
+ stop = time.perf_counter()
449
+ sec = stop - self.starttime
450
+ self.starttime = None
451
+ if fmt:
452
+ logger.info(fmt, sec)
453
+ return sec
@@ -271,10 +271,18 @@ class Machine(object):
271
271
  def undo_mirror(self):
272
272
  assert(self.is_mirrored())
273
273
  assert(self.previous_machine)
274
- self.set_alfa_and_corners()
274
+ self.previous_machine.clear_mirror()
275
+ self.previous_machine.set_alfa_and_corners()
275
276
  self.previous_machine.set_kind(self.geom.kind)
276
277
  return self.previous_machine
277
278
 
279
+ def clear_mirror(self):
280
+ self.mirror_orig_geom = None
281
+ self.mirror_geom = None
282
+ self.mirror_startangle = 0.0
283
+ self.mirror_endangle = 0.0
284
+ self.geom.mirror_corners = []
285
+
278
286
  def rotate_to(self, new_startangle):
279
287
  if np.isclose(new_startangle, self.startangle):
280
288
  return
@@ -328,9 +336,12 @@ class Machine(object):
328
336
 
329
337
  if len(self.airgaps) > 0:
330
338
  airgap_candidates = []
339
+ prv_radius = 0
331
340
  for g in self.airgaps:
332
341
  gap_radius = round((g[0]+g[1])/2.0, 6)
333
342
  gap_dist = g[1] - g[0]
343
+ prv_dist = g[0] - prv_radius
344
+ prv_radius = g[1]
334
345
  circle = Circle(Element(center=self.center,
335
346
  radius=gap_radius))
336
347
  ok, borders = self.geom.is_airgap(self.center,
@@ -341,12 +352,10 @@ class Machine(object):
341
352
  if not ok:
342
353
  logger.error("FATAL: No Airgap with radius {}".
343
354
  format(gap_radius))
344
- print("FATAL: No Airgap with radius {}".
345
- format(gap_radius))
346
355
  self.geom.airgaps.append(circle)
347
356
  return True # bad exit
348
357
 
349
- airgap_candidates.append((borders, circle, gap_dist))
358
+ airgap_candidates.append((borders, circle, gap_dist, prv_dist))
350
359
  self.geom.airgaps.append(circle)
351
360
 
352
361
  if correct_airgap > 0.0:
@@ -379,7 +388,7 @@ class Machine(object):
379
388
  logger.debug("end airgap: radius=%s", self.airgap_radius)
380
389
  return False # correct airgap set
381
390
 
382
- gaps = [c for b, c, d in airgap_candidates if b == 0]
391
+ gaps = [c for b, c, d, prv_d in airgap_candidates if b == 0]
383
392
 
384
393
  if len(gaps) == 1: # one candidate without border intersection
385
394
  self.airgap_radius = gaps[0].radius
@@ -407,7 +416,7 @@ class Machine(object):
407
416
  dist = 999
408
417
  circle = None
409
418
  pos_list = []
410
- for b, c, d in airgap_candidates:
419
+ for b, c, d, prv_d in airgap_candidates:
411
420
  if get_one:
412
421
  logger.info(" --- {} (width={})".format(c.radius, d))
413
422
  else:
@@ -419,10 +428,14 @@ class Machine(object):
419
428
  inner_pc = (c.radius - self.geom.min_radius) / \
420
429
  (self.geom.max_radius - self.geom.min_radius)
421
430
  pos = np.abs(inner_pc * 100 - 50)
422
- logger.debug("Abstand Mitte = {} %".format(pos))
431
+ logger.debug("Abstand Mitte in % = {}".format(pos))
432
+ prv_dist_percent = int(round(prv_d / self.geom.max_radius, 2) * 100)
433
+ logger.debug("Abstand Vorheriger abs=%s in prz=%s (%s)",
434
+ prv_d, prv_dist_percent, self.geom.max_radius)
423
435
  if pos < 20:
424
436
  pos_list.append([pos, d, c])
425
-
437
+ elif prv_dist_percent <= 1:
438
+ pos_list.append([prv_dist_percent, d, c])
426
439
  if get_one:
427
440
  if pos_list:
428
441
  dist_list = [[d, c] for pos, d, c in pos_list]
femagtools/isa7.py CHANGED
@@ -868,9 +868,17 @@ class Isa7(object):
868
868
  except AttributeError:
869
869
  pass
870
870
 
871
- try:
872
- el_fe_ind = [np.array(reader.el_fe_induction_1).T/1000,
873
- np.array(reader.el_fe_induction_2).T/1000]
871
+ try:
872
+ flx_fac = 1000
873
+ if isinstance(reader.el_fe_induction_1, list):
874
+ pass
875
+ else:
876
+ if reader.el_fe_induction_1.dtype == 'int16':
877
+ flx_fac = 1000
878
+ else:
879
+ flx_fac = 1
880
+ el_fe_ind = [np.array(reader.el_fe_induction_1).T/flx_fac,
881
+ np.array(reader.el_fe_induction_2).T/flx_fac]
874
882
  eddy_cu_vpot = np.array(reader.eddy_cu_vpot).T/1000
875
883
  if len(el_fe_ind[0].shape) == 4:
876
884
  pdim = self.pos_el_fe_induction.shape[0]
@@ -891,8 +899,9 @@ class Isa7(object):
891
899
  n += 1
892
900
  if n > 0:
893
901
  shape.append(n)
894
- el_fe_ind = [np.array([[reader.el_fe_induction_1[0][0][:shape[0]]]]).T/1000,
895
- np.array([[reader.el_fe_induction_2[0][0][:shape[0]]]]).T/1000]
902
+
903
+ el_fe_ind = [np.array([[reader.el_fe_induction_1[0][0][:shape[0]]]]).T/flx_fac,
904
+ np.array([[reader.el_fe_induction_2[0][0][:shape[0]]]]).T/flx_fac]
896
905
  eddy_cu_vpot = np.array([[reader.eddy_cu_vpot[0][0][:shape[0]]]]).T/1000
897
906
 
898
907
  self.el_fe_induction_1 = el_fe_ind[0]
@@ -33,7 +33,7 @@ def create_from_eecpars(temp, eecpars, lfe=1, wdg=1):
33
33
  rlfe = lfe
34
34
  rwdg = wdg
35
35
  opts = {k: eecpars[k] for k in ('zeta1', 'gam', 'kh', 'kpfe',
36
- 'kfric_b') if k in eecpars}
36
+ 'kfric_b', 'kpmag') if k in eecpars}
37
37
  try:
38
38
  opts['rotor_mass'] = rlfe*eecpars['rotor_mass']
39
39
  except KeyError:
@@ -309,7 +309,7 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(60, 40),
309
309
  if isinstance(m, (PmRelMachine, SynchronousMachine)):
310
310
  plfe1 = m.kpfe*m.iqd_plfe1(*iqd, f1)
311
311
  plfe2 = m.kpfe*m.iqd_plfe2(iqd[0], iqd[1], f1)
312
- plmag = m.iqd_plmag(iqd[0], iqd[1], f1)
312
+ plmag = m.kpmag*m.iqd_plmag(iqd[0], iqd[1], f1)
313
313
  plcu1 = m.iqd_plcu1(iqd[0], iqd[1], 2*np.pi*f1)
314
314
  plcu2 = m.iqd_plcu2(*iqd)
315
315
  tfric = m.tfric
femagtools/machine/pm.py CHANGED
@@ -203,7 +203,7 @@ class PmRelMachine(object):
203
203
  if n > 1e-3:
204
204
  f1 = self.p*n
205
205
  plfe = self.kpfe * (self.iqd_plfe1(iq, id, f1) + self.iqd_plfe2(iq, id, f1))
206
- pmag = self.iqd_plmag(iq, id, f1)
206
+ pmag = self.kpmag * self.iqd_plmag(iq, id, f1)
207
207
  return (plfe + pmag + self.pfric(n))/(2*np.pi*n)
208
208
  return 0
209
209
 
@@ -1261,7 +1261,14 @@ class PmRelMachineLdq(PmRelMachine):
1261
1261
  return self.betai1_plfe2(*betai1(iq, id), f1)
1262
1262
 
1263
1263
  def betai1_plmag(self, beta, i1, f1):
1264
- return self._losses['magnet'](beta, i1)*(f1/self.fo)**2
1264
+ r = self._losses['magnet'](beta, i1)*(f1/self.fo)**2
1265
+ try:
1266
+ idx = np.argwhere(r < 0)
1267
+ if len(idx.squeeze()):
1268
+ r[idx.squeeze()] = 0.0
1269
+ except:
1270
+ pass
1271
+ return r
1265
1272
 
1266
1273
  def iqd_plmag(self, iq, id, f1):
1267
1274
  return self.betai1_plmag(*betai1(iq, id), f1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.6.1
3
+ Version: 1.6.2
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,9 +1,9 @@
1
- femagtools/__init__.py,sha256=Rw6Z2_8l-e7ExzcB5j-qNHtHUxu2HC_SbKQaDRTOQLQ,1615
1
+ femagtools/__init__.py,sha256=UUpTqpPxTE9-KNmWFDhqdB2Sy56sR68HZdRSYl0X3BA,1615
2
2
  femagtools/airgap.py,sha256=ZCIZTYf6BbuNYx68y9fUDBQo3taN8RuGl8q-jJ7ygiA,1577
3
3
  femagtools/amazon.py,sha256=O1ICuv21XDAJi1qK1Sigs2TdS6hDZP19OzvmE2t76wU,12069
4
4
  femagtools/amela.py,sha256=pHjfXzpANI-7oz8MtrqNcyDZ6PxVM91vCJuvYhHy1rk,13891
5
5
  femagtools/asm.py,sha256=CiL0KWaF4P7O6-VwmGLdva_icwmPrPiI-TFQ19XYTKk,7660
6
- femagtools/bch.py,sha256=gDQnL6xxW5e-BeWwIqLm6dLTMzfU6_3oDQhoUeHihSA,71677
6
+ femagtools/bch.py,sha256=lw90KDHoC2NNHLYBupUXrJQRt-8yDeV-7usH4ZwkFJk,71680
7
7
  femagtools/bchxml.py,sha256=KrRjAdrUPZXmiWvonu9HhpG_NvImMBpiXWTL4iSr4kE,3142
8
8
  femagtools/condor.py,sha256=J8z9iBdvrGu3I1eFNoyKV8AXzRoTEPGLSak6cXUQxAM,10766
9
9
  femagtools/conductor.py,sha256=rXO7c7Qh_s7JpgILmLd4IbG64vP6Eh143YF9u25Mdwg,1076
@@ -23,7 +23,7 @@ femagtools/gmsh.py,sha256=IKhNiviIBji4cMxAhxaYXNqBRMNAPSKsBGdnGyxkyQw,3903
23
23
  femagtools/google.py,sha256=ugRyHY1zBjHR4aNfbA7GeF-ZU_NgleuVTZaWpi_XLT4,17144
24
24
  femagtools/grid.py,sha256=s7LfKKLm2H4-cza2kSEANq6vwxq10Su3TJl3kHShHRA,1561
25
25
  femagtools/hxy.py,sha256=PkiZ_-CRhtvtpkmLAP8iMtwvzh7CjKGGcAbOhFb4Nls,6275
26
- femagtools/isa7.py,sha256=5v0f2wF9quf3ZTFSbLnQuQW1kIETvVwSVHwhMi0PNTk,58044
26
+ femagtools/isa7.py,sha256=cUZx9fpxZgkw2G-cnveR-X-_lWP7Z1Q88MCysLl9MFI,58336
27
27
  femagtools/jhb.py,sha256=stJxkmzHpfUIBVcFw7jWbV5KN9_EFqzOCgacyhUqWvM,1779
28
28
  femagtools/job.py,sha256=dOatzr10nIda76CjVRSS0SfEWC8_BAw0kowli523qbY,11320
29
29
  femagtools/losscoeffs.py,sha256=dlSYDS13RqpPHLdv_EPWIA9liwhqjbxUiN7t7GFPZhw,5397
@@ -53,16 +53,16 @@ femagtools/dxfsl/converter.py,sha256=6BCwlVp0PiSZ4Wj-YDgl7ynWNN2SBuwxw5VnNQ55Y9w
53
53
  femagtools/dxfsl/corner.py,sha256=UI1MLlVmiTBURywsOnXnXV7eBABoENc6ortkW_3GYH8,1266
54
54
  femagtools/dxfsl/dumprenderer.py,sha256=n4AvInjvGIaC2iKZtQaYXXDyJVSQ3uEOFOLD4-xfKRY,1861
55
55
  femagtools/dxfsl/fslrenderer.py,sha256=C4oonLPzKb_9IKvpm-fMvbhQZqtP_7xWG5bzpq8P1CY,23377
56
- femagtools/dxfsl/functions.py,sha256=Y861cXEWTLVpC5iKOSDqRQ4Idbk4OqQQD-qFK-s8_20,10107
56
+ femagtools/dxfsl/functions.py,sha256=5G1MSAVaC4NOpQ_YBZ1SHPsmnvbQsnmg3rLjN3d5mBs,11463
57
57
  femagtools/dxfsl/geom.py,sha256=bAZtk_GIO7anaBeZKZhWHGyt9L-t_F1YglCgRc0oU48,163051
58
- femagtools/dxfsl/machine.py,sha256=RxUjn4Ak2o4ThwjYK7AkKuSK7SyqYFZDUOnMe9yFEBE,41543
58
+ femagtools/dxfsl/machine.py,sha256=ftqLiwCyrzekUSvAOVD9AIM4hrPrIpId7PhLKwvSpWs,42158
59
59
  femagtools/dxfsl/plotrenderer.py,sha256=dIOM8p3UNTlqypxuPcLCegOaK19j3-ahelZ8hneLJ6k,12710
60
60
  femagtools/dxfsl/shape.py,sha256=4onAfXaVUWxC9C2WXVLYi3UH6w2lhUHxuLjdFgQOqks,48302
61
- femagtools/machine/__init__.py,sha256=xMypyugPeEe7qHBAn2UWjiHdVYYfP6eoO56k1ZIEBss,7165
61
+ femagtools/machine/__init__.py,sha256=U8W65K7jr7jDdC1KnJh0WjYd8DFaLnIFVvlh-TKcV94,7174
62
62
  femagtools/machine/afpm.py,sha256=hNyDFRLGmCuWRPZl_u1ztJ4pA-Y_mxLaVvg3UJkzRuE,24766
63
- femagtools/machine/effloss.py,sha256=aaSmmxKd_KWMasHUHipYDcZOw-fvTHNa38MWFnpVock,13130
63
+ femagtools/machine/effloss.py,sha256=I8s2Fog6klhgcRYw3448qfGvzaQ0AQUJXFdNoeDyhfE,13138
64
64
  femagtools/machine/im.py,sha256=ScIOLrlc4CPLYFNx2MmJqkpmbky_HXxFGZbMWUNGBrk,37881
65
- femagtools/machine/pm.py,sha256=cGOdcUzMyBYJotQB8_tj93_2pwK9tml4GuSet80HgnM,56042
65
+ femagtools/machine/pm.py,sha256=R8RWzQrMI_fNaUU7ruHnQxg3-Lubh1vp-6EG6z5QbRk,56229
66
66
  femagtools/machine/sizing.py,sha256=aN_OahewjTTBHnpRNfLh1AGFhqnoeZVuMBeb_3MCIVI,23096
67
67
  femagtools/machine/sm.py,sha256=pkik913kU41PPiUpwDy_6BEKfCIhvY6FEp-fbU2Lqew,34320
68
68
  femagtools/machine/utils.py,sha256=g9q4j9KxUWdb_iUOUQDuaAwwJx8XM0kZMpgnwsNz8hU,18616
@@ -200,9 +200,9 @@ tests/moo/__init__.py,sha256=l8HD-AY8EwxOoo_VrG3HgEZb2MaHypvnhKCVSkR-DTA,808
200
200
  tests/moo/test_algorithm.py,sha256=Em8sFm2vzPmuIzRrBBnUQLU_TYuJHSf-kEeozw0XeX4,2563
201
201
  tests/moo/test_population.py,sha256=FvX9LRCxQx0_E2GxHQ5vKwOYFBQiNbT6Lmv5GmNWjTQ,5471
202
202
  tests/moo/test_problem.py,sha256=ALeP4u7g-dFhfwWL8vxivdrrYzVKPjHMCAXzzgyNZbs,467
203
- femagtools-1.6.1.dist-info/LICENSE,sha256=V5OED7AzEaOtvbfgNheKOSUeNtijvKQuo84FtSJNkJU,1316
204
- femagtools-1.6.1.dist-info/METADATA,sha256=xqY9FsLAYpZD0uPCvnoDDDU8Kxv-_g8tTOVr37hRi3g,5685
205
- femagtools-1.6.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
206
- femagtools-1.6.1.dist-info/entry_points.txt,sha256=UXpu6KnrykN89sCUaFAIIzn_dYwuxizUS0GcPdoekro,195
207
- femagtools-1.6.1.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
208
- femagtools-1.6.1.dist-info/RECORD,,
203
+ femagtools-1.6.2.dist-info/LICENSE,sha256=V5OED7AzEaOtvbfgNheKOSUeNtijvKQuo84FtSJNkJU,1316
204
+ femagtools-1.6.2.dist-info/METADATA,sha256=_Fn2D61D0C-a96X_49iBhYauUSoeaM6AAR28-QDL1is,5685
205
+ femagtools-1.6.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
206
+ femagtools-1.6.2.dist-info/entry_points.txt,sha256=UXpu6KnrykN89sCUaFAIIzn_dYwuxizUS0GcPdoekro,195
207
+ femagtools-1.6.2.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
208
+ femagtools-1.6.2.dist-info/RECORD,,