femagtools 1.2.4__py3-none-any.whl → 1.2.6__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
@@ -9,7 +9,7 @@
9
9
 
10
10
  """
11
11
  __title__ = 'femagtools'
12
- __version__ = '1.2.4'
12
+ __version__ = '1.2.6'
13
13
  __author__ = 'Ronald Tanner'
14
14
  __license__ = 'BSD'
15
15
  __copyright__ = 'Copyright 2016-2022 SEMAFOR Informatik & Energie AG'
femagtools/docker.py CHANGED
@@ -41,6 +41,7 @@ class AsyncFemag(threading.Thread):
41
41
  self.container = femagtools.femag.ZmqFemag(
42
42
  port, host)
43
43
  self.extra_result_files = extra_result_files
44
+ self.running = False
44
45
 
45
46
  def _do_task(self, task):
46
47
  resend = True
@@ -58,43 +59,46 @@ class AsyncFemag(threading.Thread):
58
59
  task.id, num_tries)
59
60
  return [dict(status='error', msg='too many resend')]
60
61
 
61
- if status['status'] != 'ok':
62
- logger.warning('Docker task %s cleanup status %s',
63
- task.id, status)
64
- return [status]
65
- for f in task.transfer_files:
66
- if f != task.fsl_file:
67
- r = self.container.upload(
68
- os.path.join(task.directory,
69
- os.path.basename(f)))
70
- status = json.loads(r[0])
71
- if status['status'] != 'ok':
72
- logger.warning('Docker task %s upload status %s',
73
- task.id, status)
74
- return [status]
75
- fslfile = os.path.join(task.directory, task.fsl_file)
76
- fslcmds = []
77
- with open(fslfile) as f:
78
- fslcmds = f.readlines()
79
- ret = self.container.send_fsl(fslcmds +
80
- ['save_model(close)'])
81
- # TODO: add publish_receive
82
62
  try:
63
+ if status['status'] != 'ok':
64
+ logger.warning('Docker task %s cleanup status %s',
65
+ task.id, status)
66
+ return [status]
67
+ for f in task.transfer_files:
68
+ if f != task.fsl_file:
69
+ r = self.container.upload(
70
+ os.path.join(task.directory,
71
+ os.path.basename(f)))
72
+ status = json.loads(r[0])
73
+ if status['status'] != 'ok':
74
+ logger.warning('Docker task %s upload status %s',
75
+ task.id, status)
76
+ return [status]
77
+ fslfile = os.path.join(task.directory, task.fsl_file)
78
+ fslcmds = []
79
+ with open(fslfile) as f:
80
+ fslcmds = f.readlines()
81
+ ret = self.container.send_fsl(fslcmds +
82
+ ['save_model(close)'])
83
+ # TODO: add publish_receive
83
84
  return [json.loads(s) for s in ret]
84
85
  except Exception as e:
86
+ if not self.running:
87
+ return [{'status': 'ok'}]
85
88
  logger.error("%s: %s", e, ret, exc_current=True)
86
89
  return [{'status': 'error', 'message': str(ret)}]
87
90
 
88
91
  def run(self):
89
92
  """execute femag fsl task in task directory"""
90
- while True:
93
+ self.running = True
94
+ while self.running:
91
95
  task = self.queue.get()
92
96
  if task is None:
93
97
  break
94
98
 
95
99
  try:
96
100
  r = self._do_task(task)
97
- if r[0]['status'] == 'ok':
101
+ if r[0]['status'] == 'ok' and self.running:
98
102
  task.status = 'C'
99
103
  result_files = []
100
104
  if 'result_file' in r[0]:
@@ -112,6 +116,9 @@ class AsyncFemag(threading.Thread):
112
116
  logger.warning("%s: %s", task.id, r[0])
113
117
  except (KeyError, IndexError):
114
118
  task.status = 'X'
119
+ status, content = self.container.getfile('femag.err')
120
+ logging.info("get femag.err %s: status %s len %d",
121
+ task.id, status, len(content))
115
122
  logger.error("AsyncFemag", exc_info=True)
116
123
 
117
124
  logger.debug("Task %s end status %s",
@@ -120,6 +127,8 @@ class AsyncFemag(threading.Thread):
120
127
  self.queue.task_done()
121
128
  self.container.close()
122
129
 
130
+ def stop(self):
131
+ self.running = False
123
132
 
124
133
  class Engine(object):
125
134
 
@@ -139,6 +148,7 @@ class Engine(object):
139
148
  self.dispatcher = dispatcher
140
149
  self.num_threads = num_threads
141
150
  self.async_femags = None
151
+ self.running = True
142
152
 
143
153
  def create_job(self, workdir):
144
154
  """Create a FEMAG :py:class:`CloudJob`
@@ -158,6 +168,10 @@ class Engine(object):
158
168
  Return:
159
169
  number of started tasks (int)
160
170
  """
171
+ if not self.running:
172
+ logger.info('submit, engine is terminated')
173
+ return 0
174
+
161
175
  self.queue = Queue()
162
176
  for task in self.job.tasks:
163
177
  self.queue.put(task)
@@ -184,6 +198,9 @@ class Engine(object):
184
198
  list of all calculations status (C = Ok, X = error) (:obj:`list`)
185
199
  """
186
200
  # block until all tasks are done
201
+ if not self.running:
202
+ logger.info('join, engine is terminated')
203
+ return []
187
204
  logger.debug("join: block until all tasks are done")
188
205
  self.queue.join()
189
206
 
@@ -199,3 +216,10 @@ class Engine(object):
199
216
 
200
217
  logger.debug("join: done")
201
218
  return [t.status for t in self.job.tasks]
219
+
220
+ def terminate(self):
221
+ logger.info("terminate Engine")
222
+ for async_femag in self.async_femags:
223
+ async_femag.stop()
224
+ self.running = False
225
+ logger.info("terminate Engine Done.")
@@ -2,6 +2,7 @@ import numpy as np
2
2
  import scipy.interpolate as ip
3
3
  import logging
4
4
  from .utils import betai1
5
+ from .pm import PmRelMachineLdq
5
6
  from . import create_from_eecpars
6
7
 
7
8
  logger = logging.getLogger("femagtools.effloss")
@@ -67,29 +68,28 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(50, 40)):
67
68
  else:
68
69
  xtemp = [temp, temp]
69
70
  m = create_from_eecpars(xtemp, eecpars)
70
- else: # must be a Machine
71
+ else: # must be an instance of Machine
71
72
  m = eecpars
72
73
  if isinstance(T, list):
73
74
  r = {'T': T, 'n': n}
74
75
  rb = {'T': [], 'n': []}
75
- else:
76
+ else: # calculate speed,torque charactersics
76
77
  nmax = n
77
- if 'ldq' in eecpars:
78
- r = m.characteristics(T, nmax, u1) # driving mode
79
- if min(eecpars['ldq'][0]['beta']) >= -90: # driving mode only
78
+ r = m.characteristics(T, nmax, u1) # driving mode
79
+ if isinstance(m, PmRelMachineLdq):
80
+ if min(m.betarange) >= -np.pi/2: # driving mode only
80
81
  rb = {}
81
82
  rb['n'] = None
82
83
  rb['T'] = None
83
84
  else:
84
85
  rb = m.characteristics(-T, max(r['n']), u1) # braking mode
85
86
  else:
86
- r = m.characteristics(T, nmax, u1) # driving mode
87
87
  rb = m.characteristics(-T, max(r['n']), u1) # braking mode
88
88
 
89
89
  ntmesh = _generate_mesh(r['n'], r['T'],
90
90
  rb['n'], rb['T'], npoints)
91
91
 
92
- if 'ldq' in eecpars:
92
+ if isinstance(m, PmRelMachineLdq):
93
93
  iqd = np.array([
94
94
  m.iqd_torque_umax(
95
95
  nt[1],
@@ -118,19 +118,17 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(50, 40)):
118
118
  r['plcu1'].append(m.m*np.abs(i1)**2*m.rstat(w1))
119
119
  r['plcu2'].append(m.m*np.abs(i2)**2*m.rrot(w1-m.p*wm))
120
120
 
121
- tfric = eecpars['kfric_b']*eecpars['rotor_mass']*30e-3/np.pi
122
- plfric = 2*np.pi*ntmesh[0]*tfric
123
- ntmesh[1] -= tfric
124
- pmech = np.array(
125
- [2*np.pi*nt[0]*nt[1]
126
- for nt in ntmesh.T])
127
121
 
128
- if 'ldq' in eecpars:
122
+ if isinstance(m, PmRelMachineLdq):
129
123
  plfe1 = m.iqd_plfe1(*iqd, f1)
130
124
  plfe2 = m.iqd_plfe2(iqd[0], iqd[1], f1)
131
125
  plmag = m.iqd_plmag(iqd[0], iqd[1], f1)
132
126
  plcu1 = m.iqd_plcu1(iqd[0], iqd[1], 2*np.pi*f1)
133
127
  plcu2 = m.iqd_plcu2(*iqd)
128
+ try:
129
+ tfric = eecpars['kfric_b']*eecpars['rotor_mass']*30e-3/np.pi
130
+ except:
131
+ tfric = 0
134
132
  else:
135
133
  plfe1 = np.array(r['plfe1'])
136
134
  plfe2 = np.zeros(ntmesh.shape[1])
@@ -140,7 +138,13 @@ def efficiency_losses_map(eecpars, u1, T, temp, n, npoints=(50, 40)):
140
138
  iqd = np.zeros(ntmesh.shape)
141
139
  u1 = np.array(r['u1'])
142
140
  i1 = np.array(r['i1'])
141
+ tfric = 0
143
142
 
143
+ plfric = 2*np.pi*ntmesh[0]*tfric
144
+ ntmesh[1] -= tfric
145
+ pmech = np.array(
146
+ [2*np.pi*nt[0]*nt[1]
147
+ for nt in ntmesh.T])
144
148
  ploss = plfe1+plfe2+plmag+plcu1+plcu2+plfric
145
149
 
146
150
  eta = []
femagtools/machine/pm.py CHANGED
@@ -369,7 +369,7 @@ class PmRelMachine(object):
369
369
  for nn in np.linspace(r['n'][-1]+dn, n2, nstab[1]):
370
370
  w1 = 2*np.pi*nn*self.p
371
371
  logger.debug("fieldweakening: n %g T %g i1max %g w1 %g u1 %g",
372
- nn*60, tq, i1max, w1, u1max)
372
+ nn*60, T, i1max, w1, u1max)
373
373
  iq, id = self.iqd_imax_umax(i1max, w1, u1max,
374
374
  maxtorque=T > 0)
375
375
  tq = self.torque_iqd(iq, id)
@@ -380,7 +380,7 @@ class PmRelMachine(object):
380
380
  r['T'].append(tq)
381
381
  else:
382
382
  logger.warning("fieldweakening: n %g T %g i1max %g w1 %g u1 %g",
383
- nn*60, tq, i1max, w1, u1max)
383
+ nn*60, T, i1max, w1, u1max)
384
384
 
385
385
  if n2 < n3:
386
386
  for nn in np.linspace(r['n'][-1]+dn/2, n3, nstab[2]):
femagtools/multiproc.py CHANGED
@@ -28,6 +28,8 @@ logger = logging.getLogger(__name__)
28
28
 
29
29
  numpat = re.compile(r'([+-]?\d+(?:\.\d+)?(?:[eE][+-]\d+)?)\s*')
30
30
 
31
+ class LicenseError(Exception):
32
+ pass
31
33
 
32
34
  class ProtFile:
33
35
  def __init__(self, dirname, num_cur_steps):
@@ -133,13 +135,20 @@ def run_femag(cmd, workdir, fslfile):
133
135
  proc.wait()
134
136
  os.remove(os.path.join(workdir, 'femag.pid'))
135
137
 
136
- logger.info("Finished pid: %d return %d",
137
- proc.pid, proc.returncode)
138
- return proc.returncode
138
+ #logger.info("Finished pid: %d return %d",
139
+ # proc.pid, proc.returncode)
140
+ #return proc.returncode
139
141
  except OSError as e:
140
142
  logger.error("Starting process failed: %s, Command: %s", e, cmd)
141
143
  raise
142
-
144
+
145
+ # raise License Error
146
+ if proc.returncode != 0:
147
+ with open(os.path.join(workdir, "femag.err"), "r") as err:
148
+ for line in err:
149
+ if 'license' in line:
150
+ raise LicenseError(line)
151
+
143
152
  logger.info("Finished pid: %d return %d", proc.pid, proc.returncode)
144
153
  return proc.returncode
145
154
 
femagtools/parstudy.py CHANGED
@@ -258,6 +258,14 @@ class ParameterStudy(object):
258
258
  prob.prepare(x, [fea, self.femag.magnets])
259
259
  for m in modelfiles:
260
260
  task.add_file(m)
261
+ set_magnet_properties(model, fea, self.femag.magnets)
262
+ task.add_file(
263
+ 'femag.fsl',
264
+ builder.create_open(model) +
265
+ builder.create_fe_losses(model) +
266
+ builder.create_analysis(fea) +
267
+ ['save_model("close")'])
268
+
261
269
  else:
262
270
  prob.prepare(x, [model, fea, self.femag.magnets])
263
271
  logger.info("prepare %s", x)
@@ -266,13 +274,13 @@ class ParameterStudy(object):
266
274
  dir=task.directory,
267
275
  recsin=fea.recsin):
268
276
  task.add_file(mc)
269
-
270
- set_magnet_properties(model, fea, self.femag.magnets)
271
- task.add_file(
272
- 'femag.fsl',
273
- builder.create_model(model, self.femag.magnets) +
274
- builder.create_analysis(fea) +
275
- ['save_model("close")'])
277
+ set_magnet_properties(model, fea, self.femag.magnets)
278
+ task.add_file(
279
+ 'femag.fsl',
280
+ builder.create_model(model, self.femag.magnets) +
281
+ builder.create_analysis(fea) +
282
+ ['save_model("close")'])
283
+
276
284
  if hasattr(fea, 'poc'):
277
285
  task.add_file(fea.pocfilename,
278
286
  fea.poc.content())
femagtools/plot.py CHANGED
@@ -1770,19 +1770,19 @@ def losses_map(rmap, ax=0, title='Losses Map / kW'):
1770
1770
  plot_contour(rmap['n'], rmap['T'], np.asarray(rmap['losses'])/1e3, ax,
1771
1771
  title=title, levels=14)
1772
1772
 
1773
- def eigenmode(reigen, num_modes=12):
1773
+ def eigenmode(reigen, num_modes=12):
1774
1774
  """plot eigenmode"""
1775
1775
  cols = 4
1776
1776
  rows = int((num_modes - num_modes%cols)/cols + 1)
1777
1777
  fig, ax = plt.subplots(rows, cols)
1778
1778
  ctr = 0
1779
- for i in range(rows):
1780
- for j in range(cols):
1781
- if ctr < num_modes:
1779
+ for i in range(rows):
1780
+ for j in range(cols):
1781
+ if ctr < num_modes:
1782
1782
  ax[i, j].imshow(reigen[0][ctr])
1783
1783
  ax[i, j].set_title(f'Freq: {reigen[1][ctr]:.2f} Hz')
1784
1784
  ax[i, j].axis('off')
1785
- else:
1785
+ else:
1786
1786
  ax[i, j].remove()
1787
1787
  ax[i, j] = None
1788
1788
  ctr+=1
femagtools/windings.py CHANGED
@@ -78,31 +78,31 @@ class Winding(object):
78
78
  if hasattr(self, 'windings'):
79
79
  # calculate coil width yd and num layers l
80
80
  taus = 360/self.Q
81
+ ngen = 0
81
82
  if 'slots' in self.windings[1]: # custom winding def
82
83
  for k in self.windings:
83
84
  w = self.windings[k]
85
+ ngen = max(max(w['slots']), ngen)
84
86
  w['dir'] = [1 if s > 0 else -1 for s in w['slots']]
85
87
  w['PHI'] = [(2*abs(s)-1)*taus/2 for s in w['slots']]
86
88
  w['R'] = [0 if l == 1 else 1 for l in w['layer']]
87
- k = 0
88
- for w in self.windings:
89
- try:
90
- k = self.windings[w]['dir'].index(
91
- -self.windings[w]['dir'][0])
92
- wk = w
93
- except ValueError:
94
- pass
95
- if k == 0:
96
- self.yd = max(self.Q//self.p//2, 1)
97
- else:
98
- self.yd = round((self.windings[wk]['PHI'][k] -
99
- self.windings[wk]['PHI'][0])/taus)
89
+
90
+ self.yd = max(self.Q//self.p//2, 1)
91
+ w = 1
92
+ try:
93
+ k = self.windings[w]['dir'].index(
94
+ -self.windings[w]['dir'][0])
95
+ dphi = (self.windings[w]['PHI'][k] -
96
+ self.windings[w]['PHI'][0])
97
+ self.yd = abs(round(dphi/taus))
98
+ except ValueError:
99
+ pass
100
100
 
101
101
  slots = [round((x-taus/2)/taus)
102
102
  for x in self.windings[1]['PHI']]
103
103
  self.l = 2
104
- if len(slots) == len(set(slots)):
105
- self.l = 1
104
+ if len(slots) > ngen//self.m:
105
+ self.l = 2
106
106
  return
107
107
 
108
108
  layers = 1
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.2.4
3
+ Version: 1.2.6
4
4
  Summary: Python API for FEMAG
5
5
  Author-email: Ronald Tanner <tar@semafor.ch>, Dapu Zhang <d.zhan@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=-ond92leHcm9s1jT7OSnA_LMPeeNY0YPQMZjOzACYLU,1630
1
+ femagtools/__init__.py,sha256=D8otEc8xuOdu07QoHG52Sy0kZeiKTeAr_zSFfuJoaoE,1630
2
2
  femagtools/airgap.py,sha256=E3VywQpzJ5aaw7StGaf0xgbDqrWqO7vWhFXPh0I76bY,2250
3
3
  femagtools/amazon.py,sha256=r9RRZVjKe6A7HUoRHmVpP-y1zfgJNvcPgW7mmeukvpk,12122
4
4
  femagtools/amela.py,sha256=3z5X0DIF560CjrKH9xUeejDzCVyBkbCUg6ZbK5uoU1Q,9741
@@ -12,7 +12,7 @@ femagtools/convert.py,sha256=c6SVOMEO8QFiGMlcAtdfigPBZ4dIl6-UuvOTbydYyUI,23706
12
12
  femagtools/dakota.py,sha256=OBPxicuZiw1X-7WJ05MvEQXocH-GPgRiOoRjY_jOVW4,7017
13
13
  femagtools/dakota_femag.py,sha256=FGGXg1uYkTDNdElqsyMwtHJQKFzGV9f_3FaA55JEfuk,4064
14
14
  femagtools/dakotaout.py,sha256=6nn0PXsB40mPKiQLenqAtHy0KXCO7kvqqQ-aD2JhQvw,5573
15
- femagtools/docker.py,sha256=IMDi1Xmphe4PUWZ1K8iwWingUjxIwAt26i-9bAG0r1o,6513
15
+ femagtools/docker.py,sha256=XDVmLBB0z4sZZpcrx7Wbm84xl4ksj7aqn5-ZOPxdxm4,7460
16
16
  femagtools/erg.py,sha256=IXKq76P9qLt_ssNOP78v8Qizk3J2Zg80yaKDSjzwoJE,1224
17
17
  femagtools/femag.py,sha256=QENpEfMD8xHY54Ol-UJhLA5kB-xqqU9aEkUw-hC0kDg,40477
18
18
  femagtools/forcedens.py,sha256=-hrjRgUAkCwByC4e-Mmd6YYizbV2LlFYTmmo8cyx88U,7466
@@ -31,20 +31,20 @@ femagtools/mcv.py,sha256=SgrwppH61dJ653TTtTdjuvKZMOZBt9Tf3-8ApV_NK8s,38043
31
31
  femagtools/me.py,sha256=XNK0l-aroNYfKyxV_uslE8q3vJb_KuntAYTWd-4FQaQ,1833
32
32
  femagtools/model.py,sha256=OtQDZGGr4GlrprWbOPf1TJ-VF65kq2ix-02yFv7QD_g,14106
33
33
  femagtools/moproblem.py,sha256=kOP8pRdD8YXz28_M2WKnFgl3eeJ7tqg49ohoazsmUOg,2825
34
- femagtools/multiproc.py,sha256=sKA9XttvyaR4SdI8J-n9ugoEQ-tSb0UzYnragUTkfng,7958
34
+ femagtools/multiproc.py,sha256=WWx0Tmm9O5VqF5nKH7n_9cqSuvXZ95i4VJ26MzTYI0c,8265
35
35
  femagtools/mxw2msh.py,sha256=6FytyRtxMAO5vWRgZRWCQs04RFq7qiRy6hjOGb8NwpM,1841
36
36
  femagtools/nc.py,sha256=o2-pjhl6EBh0ffriYkAVkvxQYwcmeEv_tlaeQ9ZD1X4,12781
37
37
  femagtools/netlist.py,sha256=CSCl8setLZ_L8DCnNWaNA3-wLe1yo-fmzARZoVvYfaA,2052
38
38
  femagtools/ntib.py,sha256=76g1ZO3Fq_kN-HTMBvaKvJmMMlJMyEPFeNAcJPq3w7Y,3099
39
39
  femagtools/opt.py,sha256=Oak-C1_5iFZonwokB3ezB52fcZi5yiUEffjG1Tmgag8,8685
40
- femagtools/parstudy.py,sha256=b1BhWHkZ7hQRXB4DchHI1oOXzZpBjmAWCU9NDByCMuI,18327
41
- femagtools/plot.py,sha256=uaAcwoshLfjSxrk4bUNkSgO1PyJKrbMxrsm7EriksDY,57800
40
+ femagtools/parstudy.py,sha256=pxK3nBtYTSA9fbVdLUYB7Ic5N34bv7vl2qD8h3GnDSM,18733
41
+ femagtools/plot.py,sha256=b0FFLK3s72FhM1NVaGnytdSq7VfyAI7ZF_pba2eSQu0,57795
42
42
  femagtools/poc.py,sha256=MN5DRL4vHycNzXSTt9kjuZP1yZ2I02NmrKQFsmRcbF0,6536
43
43
  femagtools/tks.py,sha256=jgQ5dpKNPZg0ydwNGLBVjsL5WRsjfk9FtkZt3eoX79I,5791
44
44
  femagtools/ts.py,sha256=vm3GzLG6lzkg_Z84U-ZCgYHhev-PPtNuGs1q-CKJ4rA,47280
45
45
  femagtools/vbf.py,sha256=9XGfhftmD9carU8ByQ5DwqoR4daq5mJ39eMqruwml0Q,2444
46
46
  femagtools/vtu.py,sha256=DA0uRYW9121Ay9Je0xeJ1DXeCtE6fiCMEiuvkSSGg0U,8595
47
- femagtools/windings.py,sha256=5bhjJ_7J4C90-uOppnidp1woY9eHfu_RZ8DxKblIR3k,22313
47
+ femagtools/windings.py,sha256=vx2AFGSQpCBnVqrh7DIWonkuP9Gf79g7Bplzlw3tS4k,22279
48
48
  femagtools/dxfsl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  femagtools/dxfsl/area.py,sha256=jmOJKIH0Xv16mbTdR_agYQ9dJMXG7D4lrm5GYKzO65I,52503
50
50
  femagtools/dxfsl/conv.py,sha256=xOCj0vPlyRVP1FVNPLtKx_Fe88emjaht_DD4bfycD6A,8990
@@ -58,9 +58,9 @@ femagtools/dxfsl/machine.py,sha256=nSWp0CaGrqBNSXEUDZ5qbuSVw5zUTsb7H1LfnNj0syY,2
58
58
  femagtools/dxfsl/plotrenderer.py,sha256=f7ZTnD0HCLBzurUsVAqqZskTzLeKfhqtfHL32mXZcA4,12311
59
59
  femagtools/dxfsl/shape.py,sha256=Y8P30bCHwUFsL4j-dy2hFiKi_1SPH9b6pNFI3vt9b0A,43088
60
60
  femagtools/machine/__init__.py,sha256=xGjvNHfqZAuReCN98-6CpqwRIyfXPQAMZiSqAdqo9V8,5613
61
- femagtools/machine/effloss.py,sha256=Oslf991lwfQ2d5sXSVt2FFM-wCORwSRf89V8SNzuU6U,5477
61
+ femagtools/machine/effloss.py,sha256=UyoGT4UJkhQH8XLeNNp2z1HeojSeNTyj28D-PSV7ZWs,5604
62
62
  femagtools/machine/im.py,sha256=hZlt66sf8x9H2Z5jdSzYoLPVUE11i1G1frPpYYuDi64,34847
63
- femagtools/machine/pm.py,sha256=DoNCXnH97xUm6mO8WrBowY2jifL05QSCd45CB5bRyaU,30632
63
+ femagtools/machine/pm.py,sha256=MfVYidX4ds2m0k9xt9iKf_H6csriwQOB0MK-WWH15kA,30631
64
64
  femagtools/machine/sizing.py,sha256=4y4nShJYHBJTepl70tGUNqKhR2rd1bY5jZ0wektiDng,21743
65
65
  femagtools/machine/sm.py,sha256=tYGqTuA49GUUsqGKurxUhgH5oCBNF0kjZ8SOjViN7Kc,14584
66
66
  femagtools/machine/utils.py,sha256=QPmc7KbH6WuIMfroVO5h70LLcAPx2ioejxEvsS2cZzs,16143
@@ -129,9 +129,9 @@ femagtools/templates/statorRing.mako,sha256=sDgDmk71EoE8d4e9cmyqKqRldfC8uKMmpHEj
129
129
  femagtools/templates/statorRotor3.mako,sha256=ipLrcve3Fjf3kWJB3hGmeoMgxmqLlX3gEfCuO3Zi2HI,4073
130
130
  femagtools/templates/stator_msh.mako,sha256=Neze1ielMCk7TrARyhOra91fFQVT8Phsgk2Omt_aMG8,1799
131
131
  femagtools/templates/torq_calc.mako,sha256=9Dxrf8XeMhA7mz2orBRGq8s1RG6Tn2RTAdDaBQkqzxg,1761
132
- femagtools-1.2.4.dist-info/LICENSE,sha256=V5OED7AzEaOtvbfgNheKOSUeNtijvKQuo84FtSJNkJU,1316
133
- femagtools-1.2.4.dist-info/METADATA,sha256=5PI6BKlJ_BrL5znHn0rya0_Ez9NfxZvPqAECncwNHfI,5714
134
- femagtools-1.2.4.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
135
- femagtools-1.2.4.dist-info/entry_points.txt,sha256=FZpd7JumQdJo-AZUyRA8-aJthK85jg37_qjRoDTY-Mo,191
136
- femagtools-1.2.4.dist-info/top_level.txt,sha256=DScrn5RiUYKtaEVgcG3AMSWDUd2N8uqxk-gZY-2CaYk,11
137
- femagtools-1.2.4.dist-info/RECORD,,
132
+ femagtools-1.2.6.dist-info/LICENSE,sha256=V5OED7AzEaOtvbfgNheKOSUeNtijvKQuo84FtSJNkJU,1316
133
+ femagtools-1.2.6.dist-info/METADATA,sha256=nT7PaH7xSrJ5H-52OGi3GhSptzzoKLyeky-W2SzpIH4,5714
134
+ femagtools-1.2.6.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
135
+ femagtools-1.2.6.dist-info/entry_points.txt,sha256=FZpd7JumQdJo-AZUyRA8-aJthK85jg37_qjRoDTY-Mo,191
136
+ femagtools-1.2.6.dist-info/top_level.txt,sha256=DScrn5RiUYKtaEVgcG3AMSWDUd2N8uqxk-gZY-2CaYk,11
137
+ femagtools-1.2.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.38.4)
2
+ Generator: bdist_wheel (0.40.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5