femagtools 1.7.3__py3-none-any.whl → 1.7.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.
femagtools/machine/pm.py CHANGED
@@ -5,9 +5,10 @@ import logging
5
5
  import warnings
6
6
  import numpy as np
7
7
  import numpy.linalg as la
8
- from .utils import iqd, betai1, skin_resistance, dqparident, KTH
8
+ from .utils import iqd, betai1, skin_resistance, dqparident, KTH, K
9
9
  import scipy.optimize as so
10
10
  import scipy.interpolate as ip
11
+ import scipy.integrate as ig
11
12
  from functools import partial
12
13
 
13
14
  logger = logging.getLogger(__name__)
@@ -1392,6 +1393,11 @@ class PmRelMachinePsidq(PmRelMachine):
1392
1393
 
1393
1394
  self._psid = ip.RectBivariateSpline(iq, id, psid).ev
1394
1395
  self._psiq = ip.RectBivariateSpline(iq, id, psiq).ev
1396
+ # used for transient
1397
+ self.psid = psid
1398
+ self.psiq = psiq
1399
+ self.id = id
1400
+ self.iq = iq
1395
1401
  try:
1396
1402
  pfe = kwargs['losses']
1397
1403
  if 'styoke_excess' in pfe and np.any(pfe['styoke_excess']):
@@ -1451,10 +1457,12 @@ class PmRelMachinePsidq(PmRelMachine):
1451
1457
  return iqmax, np.max(self.idrange)
1452
1458
 
1453
1459
  def iqd_plfe1(self, iq, id, f1):
1454
- stator_losskeys = ['styoke_eddy', 'styoke_hyst',
1455
- 'stteeth_eddy', 'stteeth_hyst']
1460
+ stator_losskeys = [k for k in ['styoke_eddy', 'styoke_hyst',
1461
+ 'stteeth_eddy', 'stteeth_hyst']
1462
+ if k in self._losses]
1456
1463
  if self.bertotti:
1457
- stator_losskeys += ['styoke_excess', 'stteeth_excess']
1464
+ stator_losskeys += [k for k in ('styoke_excess', 'stteeth_excess')
1465
+ if k in self._losses]
1458
1466
  return np.sum([
1459
1467
  self._losses[k](iq, id)*(f1/self.fo)**self.plexp[k] for
1460
1468
  k in tuple(stator_losskeys)], axis=0)
@@ -1478,3 +1486,69 @@ class PmRelMachinePsidq(PmRelMachine):
1478
1486
 
1479
1487
  def betai1_plmag(self, beta, i1, f1):
1480
1488
  return self.iqd_plmag(*iqd(beta, i1), f1)
1489
+
1490
+
1491
+ ### EXPERIMENTAL
1492
+
1493
+ def transient(self, u1, tload, speed,
1494
+ fault_type=3, # 'LLL', 'LL', 'LG',
1495
+ tend=0.1, nsamples=200):
1496
+
1497
+ tshort = 0
1498
+ w1 = 2*np.pi*self.p*speed
1499
+ res = so.minimize(
1500
+ lambda iqd: np.linalg.norm(iqd), self.io, method='SLSQP',
1501
+ constraints=(
1502
+ {'type': 'eq',
1503
+ 'fun': lambda iqd: self.tmech_iqd(*iqd, speed) - tload},
1504
+ {'type': 'ineq',
1505
+ 'fun': lambda iqd: np.sqrt(2)*u1
1506
+ - la.norm(self.uqd(w1, *iqd))}))
1507
+ iqx, idx = res.x
1508
+ uq0, ud0 = self.uqd(w1, iqx, idx)
1509
+ logger.info("transient: Torque %f Nm, Speed %f rpm, Curr %f A",
1510
+ tload, speed*60, betai1(iqx, idx)[1])
1511
+ if fault_type == 3: # 3 phase short circuit
1512
+ USC = lambda t: np.zeros(2)
1513
+ else: # 2 phase short circuit
1514
+ #ustat = np.array([K(w1*x).dot((uq, ud)) for x in t])
1515
+ USC = lambda t: np.array([
1516
+ uq0/2*(1+np.cos(2*w1*t)),
1517
+ uq0/2*np.sin(2*w1*t)])
1518
+ U = lambda t: (uq0, ud0) if t < tshort else USC(t)
1519
+
1520
+ psid = ip.RectBivariateSpline(self.iq, self.id, self.psid, kx=3, ky=3)
1521
+ psiq = ip.RectBivariateSpline(self.iq, self.id, self.psiq, kx=3, ky=3)
1522
+ #ld = ip.RectBivariateSpline(iq, id, dqpars['psidq'][0]['ld'], kx=3, ky=3)
1523
+ #lq = ip.RectBivariateSpline(iq, id, dqpars['psidq'][0]['lq'], kx=3, ky=3)
1524
+ #psim = ip.RectBivariateSpline(iq, id, dqpars['psidq'][0]['psim'], kx=3, ky=3)
1525
+ #def didtl(t, iqd):
1526
+ # lqd = lq(*iqd)[0,0], ld(*iqd)[0,0]
1527
+ # return [
1528
+ # (uq-r1*iqd[0] -w1 * lqd[1]*iqd[1] - w1*psim(*iqd)[0,0])/lqd[0],
1529
+ # (ud-r1*iqd[1] +w1*lqd[0]*iqd[0])/lqd[1]]
1530
+
1531
+ def didt(t, iqd):
1532
+ uq, ud = U(t)
1533
+ ldd = psid(*iqd, dx=0, dy=1)[0,0]
1534
+ lqq = psiq(*iqd, dx=1, dy=0)[0,0]
1535
+ ldq = psid(*iqd, dx=1, dy=0)[0,0]
1536
+ lqd = psiq(*iqd, dx=0, dy=1)[0,0]
1537
+ psi = psid(*iqd)[0,0], psiq(*iqd)[0,0]
1538
+ return [
1539
+ (-ldd*psi[0]*w1 + ldd*(uq-self.r1*iqd[0])
1540
+ - lqd*psi[1]*w1 - lqd*(ud-self.r1*iqd[1]))/(ldd*lqq - ldq*lqd),
1541
+ (ldq*psi[0]*w1 - ldq*(uq-self.r1*iqd[0])
1542
+ + lqq*psi[1]*w1 + lqq*(ud-self.r1*iqd[1]))/(ldd*lqq - ldq*lqd)]
1543
+
1544
+ t = np.linspace(0, tend, nsamples)
1545
+ Y0 = iqx, idx
1546
+ sol = ig.solve_ivp(didt, (t[0], t[-1]), Y0, dense_output=True)
1547
+ y = sol.sol(t).T
1548
+
1549
+ return {
1550
+ 't': t.tolist(),
1551
+ 'iq': y[:,0], 'id': y[:,1],
1552
+ 'istat': np.array([K(w1*x[0]).dot((x[1][1], x[1][0]))
1553
+ for x in zip(t, y)]).T.tolist(),
1554
+ 'torque': [self.torque_iqd(*iqd) for iqd in y]}
@@ -21,9 +21,9 @@ def K(d):
21
21
  returns transformation matrix
22
22
  """
23
23
  return np.array((
24
- (-np.cos(d), np.sin(d)),
25
- (-np.cos(d-2*np.pi/3), np.sin(d-2*np.pi/3)),
26
- (-np.cos(d+2*np.pi/3), np.sin(d+2*np.pi/3))))
24
+ (np.cos(d), -np.sin(d)),
25
+ (np.cos(d-2*np.pi/3), -np.sin(d-2*np.pi/3)),
26
+ (np.cos(d+2*np.pi/3), -np.sin(d+2*np.pi/3))))
27
27
 
28
28
 
29
29
  def T(d):
@@ -34,9 +34,9 @@ def T(d):
34
34
 
35
35
  returns transformation matrix
36
36
  """
37
- return np.array((
38
- (-np.cos(d), -np.cos(d-2*np.pi/3), -np.cos(d+2*np.pi/3)),
39
- (np.sin(d), np.sin(d-2*np.pi/3), np.sin(d+2*np.pi/3))))/3*2
37
+ return 2/3*np.array((
38
+ (np.cos(d), np.cos(d-2*np.pi/3), np.cos(d+2*np.pi/3)),
39
+ (-np.sin(d), -np.sin(d-2*np.pi/3), -np.sin(d+2*np.pi/3))))
40
40
 
41
41
 
42
42
  def invpark(a, q, d):
@@ -49,9 +49,9 @@ def invpark(a, q, d):
49
49
  q: value in quadrature axis
50
50
  """
51
51
  if np.isscalar(a) and np.isscalar(q) and np.isscalar(d):
52
- return np.dot(K(a), (q, d))
52
+ return np.dot(K(a), (d, q))
53
53
  if np.isscalar(q) and np.isscalar(d):
54
- return np.array([K(x).dot((q, d)) for x in a]).T
54
+ return np.array([K(x).dot((d, q)) for x in a]).T
55
55
  return np.array([K(x).dot((y, z)) for x, y, z in zip(a, d, q)]).T
56
56
 
57
57
 
@@ -284,12 +284,17 @@ def dqpar_interpol(xfit, dqpars, ipkey='temperature'):
284
284
  dqpars -- list of dict with id, iq (or i1, beta), Psid and Psiq values
285
285
  ipkey -- key (string) to interpolate
286
286
  """
287
- # check current range
288
- ckeys = (('i1', 'beta'), ('id', 'iq'))
289
- dqtype = 0
290
- fpip = {k: dqpars[0][k] for k in ckeys[dqtype]}
287
+ dqtype = ''
288
+ if set(('i1', 'beta')).issubset(dqpars[0]):
289
+ dqtype = 'ldq'
290
+ elif set(('id', 'iq')).issubset(dqpars[0]):
291
+ dqtype = 'psidq'
292
+ else:
293
+ raise ValueError("missing current in dqpars parameter")
294
+ ckeys = ('i1', 'beta') if dqtype == 'ldq' else ('id', 'iq')
295
+ fpip = {k: dqpars[0][k] for k in ckeys}
291
296
  fpip['losses'] = dict()
292
- for k in ckeys[dqtype]:
297
+ for k in ckeys:
293
298
  curr = np.array([f[k] for f in dqpars], dtype=object)
294
299
  shape = curr.shape
295
300
  if curr.shape != (len(dqpars), len(curr[0])):
@@ -421,13 +426,27 @@ def dqparident(workdir, engine, temp, machine,
421
426
  r1 = 0 # cannot calc winding resistance
422
427
 
423
428
  n = len(temp)
424
- parvardef = {
425
- "decision_vars": [
426
- {"values": sorted(2*temp), "name": "magn_temp"},
427
- {"values": n*[0, -90], "name": "beta_max"},
428
- {"values": n*[-90, -180], "name": "beta_min"}
429
- ]
430
- }
429
+ dqtype = kwargs.get('dqtype', 'ldq')
430
+ num_cur_steps = kwargs.get('num_cur_steps', 5)
431
+ if dqtype == 'ldq':
432
+ parvardef = {
433
+ "decision_vars": [
434
+ {"values": sorted(2*temp), "name": "magn_temp"},
435
+ {"values": n*[0, -90], "name": "beta_max"},
436
+ {"values": n*[-90, -180], "name": "beta_min"}
437
+ ]
438
+ }
439
+ else:
440
+ delta = round(i1_max*np.sqrt(2)/num_cur_steps)
441
+ iqmax = num_cur_steps*delta
442
+ idmin = -iqmax
443
+ parvardef = {
444
+ "decision_vars": [
445
+ {"values": sorted(2*temp), "name": "magn_temp"},
446
+ {"values": n*[0, -iqmax], "name": "miniq"},
447
+ {"values": n*[iqmax, 0], "name": "maxiq"}
448
+ ]
449
+ }
431
450
 
432
451
  parvar = parstudy.List(
433
452
  workdir, condMat=condMat,
@@ -441,23 +460,40 @@ def dqparident(workdir, engine, temp, machine,
441
460
  if machine.get('external_rotor', False):
442
461
  period_frac = 1 # TODO: missing femag support
443
462
 
444
- simulation = dict(
445
- calculationMode='ld_lq_fast',
446
- i1_max=kwargs.get('i1_max', i1_max),
447
- magn_temp=20,
448
- wind_temp=20,
449
- beta_max=0,
450
- beta_min=-90,
451
- num_move_steps=26,
452
- num_par_wdgs=machine[wdgk].get('num_par_wdgs', 1),
453
- num_cur_steps=kwargs.get('num_cur_steps', 5),
454
- num_beta_steps=kwargs.get('num_beta_steps', 7),
455
- speed=kwargs.get('speed', defspeed),
456
- period_frac=period_frac)
463
+ if dqtype == 'ldq':
464
+ simulation = dict(
465
+ calculationMode='ld_lq_fast',
466
+ i1_max=kwargs.get('i1_max', i1_max),
467
+ magn_temp=20,
468
+ wind_temp=20,
469
+ beta_max=0,
470
+ beta_min=-90,
471
+ num_move_steps=kwargs.get('num_move_steps', 26),
472
+ num_par_wdgs=machine[wdgk].get('num_par_wdgs', 1),
473
+ num_cur_steps=num_cur_steps,
474
+ num_beta_steps=kwargs.get('num_beta_steps', 7),
475
+ speed=kwargs.get('speed', defspeed),
476
+ period_frac=period_frac)
477
+ else:
478
+ simulation = dict(
479
+ calculationMode='psd_psq_fast',
480
+ magn_temp=20,
481
+ wind_temp=20,
482
+ maxiq=0,
483
+ miniq=0,
484
+ maxid=0,
485
+ minid=idmin,
486
+ num_move_steps=kwargs.get('num_move_steps', 26),
487
+ num_par_wdgs=machine[wdgk].get('num_par_wdgs', 1),
488
+ delta_id=delta,
489
+ delta_iq=delta,
490
+ speed=kwargs.get('speed', defspeed),
491
+ period_frac=period_frac)
457
492
 
458
493
  # TODO: cleanup() # remove previously created files in workdir
459
494
  # start calculation
460
495
  results = parvar(parvardef, machine, simulation, engine)
496
+
461
497
  if 'poles' not in machine: # dxf model?
462
498
  machine['poles'] = 2*results['f'][0]['machine']['p']
463
499
  da1 = 2*results['f'][0]['machine']['fc_radius']
@@ -475,18 +511,34 @@ def dqparident(workdir, engine, temp, machine,
475
511
  except KeyError:
476
512
  rotor_mass = 0 # need femag classic > rel-9.3.x-48-gca42bbd0
477
513
 
478
- ldq = []
479
- for i in range(0, len(results['f']), 2):
480
- d = dict(i1=results['f'][i]['ldq']['i1'],
481
- beta=results['f'][i+1]['ldq']['beta'][:-1] + results['f'][i]['ldq']['beta'])
482
- d.update(
483
- {k: np.vstack((np.array(results['f'][i+1]['ldq'][k])[:-1, :],
484
- np.array(results['f'][i]['ldq'][k]))).tolist()
485
- for k in ('psid', 'psiq', 'torque', 'ld', 'lq', 'psim')})
486
- ldq.append(d)
514
+ dq = []
515
+ if dqtype == 'ldq':
516
+ for i in range(0, len(results['f']), 2):
517
+ d = dict(i1=results['f'][i]['ldq']['i1'],
518
+ beta=(results['f'][i+1]['ldq']['beta'][:-1]
519
+ + results['f'][i]['ldq']['beta']))
520
+ d.update(
521
+ {k: np.vstack((np.array(results['f'][i+1]['ldq'][k])[:-1, :],
522
+ np.array(results['f'][i]['ldq'][k]))).tolist()
523
+ for k in ('psid', 'psiq', 'torque', 'ld', 'lq', 'psim')})
524
+ dq.append(d)
525
+ else:
526
+ for i in range(0, len(results['f']), 2):
527
+ d = dict(id=results['f'][i]['psidq']['id'],
528
+ iq=(results['f'][i+1]['psidq']['iq'][:-1]
529
+ + results['f'][i]['psidq']['iq']))
530
+ d.update(
531
+ {k: np.vstack((np.array(results['f'][i+1]['psidq'][k])[:-1, :],
532
+ np.array(results['f'][i]['psidq'][k]))).tolist()
533
+ for k in ('psid', 'psiq', 'torque')})
534
+ d.update(
535
+ {k: np.vstack((np.array(results['f'][i+1]['psidq_ldq'][k])[:-1, :],
536
+ np.array(results['f'][i]['psidq_ldq'][k]))).tolist()
537
+ for k in ('ld', 'lq', 'psim')})
538
+ dq.append(d)
487
539
  # collect existing losses only
488
540
  losskeymap = {'magnet': 'magnet'}
489
- losskeys = [k for k in results['f'][0]['ldq']['losses']
541
+ losskeys = [k for k in results['f'][0][dqtype]['losses']
490
542
  if len(k.split('_')) > 1] + ['magnet']
491
543
  for k in losskeys:
492
544
  if k.find('_') > -1:
@@ -499,21 +551,27 @@ def dqparident(workdir, engine, temp, machine,
499
551
  losskeymap[k] = k
500
552
  for i in range(0, len(results['f']), 2):
501
553
  j = i//2
502
- ldq[j]['temperature'] = results['x'][0][i]
503
- ldq[j]['losses'] = {losskeymap[k]: np.vstack(
504
- (np.array(results['f'][i+1]['ldq']['losses'][k])[:-1, :],
505
- np.array(results['f'][i]['ldq']['losses'][k]))).tolist()
506
- for k in losskeys}
507
- ldq[j]['losses']['speed'] = results['f'][i]['ldq']['losses']['speed']
554
+ dq[j]['temperature'] = results['x'][0][i]
555
+ if dqtype == 'ldq':
556
+ dq[j]['losses'] = {losskeymap[k]: np.vstack(
557
+ (np.array(results['f'][i+1][dqtype]['losses'][k])[:-1, :],
558
+ np.array(results['f'][i][dqtype]['losses'][k]))).tolist()
559
+ for k in losskeys}
560
+ else:
561
+ dq[j]['losses'] = {losskeymap[k]: np.hstack(
562
+ (np.array(results['f'][i+1][dqtype]['losses'][k])[:, :-1],
563
+ np.array(results['f'][i][dqtype]['losses'][k]))).T.tolist()
564
+ for k in losskeys}
565
+ dq[j]['losses']['speed'] = results['f'][i][dqtype]['losses']['speed']
508
566
  for k in ('hf', 'ef'):
509
- ldq[j]['losses'][k] = results['f'][i]['lossPar'][k]
567
+ dq[j]['losses'][k] = results['f'][i]['lossPar'][k]
510
568
 
511
569
  dqpars = {
512
570
  'm': machine[wdgk]['num_phases'],
513
571
  'p': machine['poles']//2,
514
572
  'ls1': ls1,
515
573
  "rotor_mass": rotor_mass, "kfric_b": 1,
516
- 'ldq': ldq}
574
+ dqtype: dq}
517
575
  if 'resistance' in machine[wdgk]:
518
576
  dqpars['r1'] = machine[wdgk]['resistance']
519
577
  else:
femagtools/model.py CHANGED
@@ -275,7 +275,7 @@ class MachineModel(Model):
275
275
  """
276
276
  names = []
277
277
  missing = []
278
-
278
+ thkeys = 'thcap', 'thcond'
279
279
  mcv = 0
280
280
  if 'stator' in self.__dict__:
281
281
  fillfac = self.stator.get('fillfac', 1.0)
@@ -292,6 +292,12 @@ class MachineModel(Model):
292
292
  mcv, fillfac)
293
293
  names.append((mcv, fillfac))
294
294
  self.stator[mcvname] = mcv
295
+ m = magcurves.find_by_name(mcv)
296
+ if m and set(thkeys).issubset(m.keys()):
297
+ for k in thkeys:
298
+ self.stator[k] = m[k]
299
+ logger.info('stator mcv %s set therm prop in stator',
300
+ mcv)
295
301
  else:
296
302
  missing.append(self.stator[k])
297
303
  logger.error('stator mcv %s not found',
@@ -327,6 +333,11 @@ class MachineModel(Model):
327
333
  rotor['mcvkey_yoke'] = magcurves.fix_name(
328
334
  mcv, fillfac)
329
335
  rotor['mcvkey_yoke_name'] = mcv
336
+ m = magcurves.find_by_name(mcv)
337
+ if m and set(thkeys).issubset(m.keys()):
338
+ for k in thkeys:
339
+ rotor[k] = m[k]
340
+ logger.debug('stator mcv %s set therm prop in rotor', mcv)
330
341
  names.append((mcv, fillfac))
331
342
  else:
332
343
  missing.append(rotor['mcvkey_yoke'])
femagtools/parstudy.py CHANGED
@@ -186,11 +186,6 @@ class ParameterStudy(object):
186
186
  except AttributeError: # if dxf or pure fsl model
187
187
  simulation['range_phi'] = 0.0
188
188
  simulation.update(model.winding)
189
- if 'pocfilename' not in simulation:
190
- simulation['pocfilename'] = f"{model.name}.poc"
191
- if simulation['calculationMode'] == 'psd_psq_fast':
192
- simulation['pocfilename'] = f"{model.name}_{model.get('poles')}p.poc"
193
-
194
189
  fea = femagtools.model.FeaModel(simulation)
195
190
 
196
191
  prob = femagtools.moproblem.FemagMoProblem(decision_vars,
@@ -214,6 +209,8 @@ class ParameterStudy(object):
214
209
  except:
215
210
  pass
216
211
  job = engine.create_job(self.femag.workdir)
212
+ if self.femag.cmd:
213
+ engine.cmd = [self.femag.cmd]
217
214
  # for progress logger
218
215
  job.num_cur_steps = fea.get_num_cur_steps()
219
216
 
@@ -225,6 +222,8 @@ class ParameterStudy(object):
225
222
  if hasattr(fea, 'poc'):
226
223
  fea.poc.pole_pitch = 2*360/model.get('poles')
227
224
  fea.pocfilename = fea.poc.filename()
225
+ if not hasattr(fea, 'pocfilename'):
226
+ fea.pocfilename = f"{model.name}_{model.get('poles')}p.poc"
228
227
  elapsedTime = 0
229
228
  self.bchmapper_data = [] # clear bch data
230
229
  # split x value (par_range) array in handy chunks:
femagtools/plot/char.py CHANGED
@@ -296,7 +296,10 @@ def _plot_contour(speed, torque, z, ax, title='', levels=[],
296
296
  from matplotlib.patches import PathPatch
297
297
  x = 60*np.asarray(speed)
298
298
  y = np.asarray(torque)
299
-
299
+ tunit = 'Nm'
300
+ if max(np.abs(y)) > 10e3:
301
+ y *=1e-3
302
+ tunit = 'kNm'
300
303
  x, xscale = _normalize10(x, **kwargs)
301
304
  y, yscale = _normalize10(y, **kwargs)
302
305
 
@@ -344,7 +347,7 @@ def _plot_contour(speed, torque, z, ax, title='', levels=[],
344
347
  return round(yscale*tick_val)
345
348
  ax.yaxis.set_major_formatter(format_fn)
346
349
 
347
- ax.set_ylabel('Torque / Nm')
350
+ ax.set_ylabel(f'Torque / {tunit}')
348
351
  ax.set_xlabel('Speed / rpm')
349
352
  ax.set_title(title)
350
353
  if cbar:
@@ -109,6 +109,8 @@ else
109
109
  agndst = 1 -- last resort
110
110
  end
111
111
  % endif
112
+ % elif hasattr(model, 'agndst'):
113
+ agndst = ${model.agndst*1e3}
112
114
  % endif
113
115
  % if hasattr(model, 'afmtype'):
114
116
  m.model_type = "${model['afmtype']}"
@@ -7,18 +7,18 @@ state_of_problem("therm_static")
7
7
 
8
8
  beta = 360*slots_gen/num_slots
9
9
  m.zeroangl = 0
10
- -- heat transfer outside
11
- heat_transfer_coefficient = ${model['heat_transfer_coefficient'][0]}
12
- area_factor = 1
13
- dy1 = ${model['outer_diam']*1e3}
14
- x,y = pd2c(dy1/2+0.05, beta/2+m.zeroangl)
15
- def_heat_transfer(x,y,yellow,heat_transfer_coefficient, area_factor)
16
- -- heat transfer inside
10
+
11
+ heat_transfer_coefficient = ${model['heat_transfer_coefficient']}
12
+ area_factor = 5
13
+
17
14
  % if 'inner_diam' in model and len(model['heat_transfer_coefficient'])>1:
18
- dy2 = ${model['inner_diam']*1e3}
19
- heat_transfer_coefficient = ${model['heat_transfer_coefficient'][1]}
20
- area_factor = 1
21
- x,y = pd2c(dy2/2-0.05, beta/2+m.zeroangl)
15
+ -- heat transfer inside
16
+ dy2 = ${model['inner_diam']*1e3}
17
+ x,y = pd2c(dy2/2-0.05, beta/2+m.zeroangl)
18
+ % else:
19
+ -- heat transfer outside
20
+ dy1 = ${model['outer_diam']*1e3}
21
+ x,y = pd2c(dy1/2+0.05, beta/2+m.zeroangl)
22
22
  def_heat_transfer(x,y,yellow,heat_transfer_coefficient, area_factor)
23
23
  %endif
24
24
  ---------------------------------------------
@@ -36,8 +36,10 @@ def_losses ( x,y,'red', ${i[1]})
36
36
  %endfor
37
37
  %endif
38
38
 
39
- color_gradation_th(0,0,tot,Losses,0,0,model.."_losses.svg")
39
+ color_gradation_th(0,0,tot,Losses,0,0, "losses.svg")
40
40
 
41
41
  ---------------------------------------------
42
42
  calc_therm_field()
43
- color_gradation_th(0,0,tot,Temp,0.0,0,model.."_temp.svg")
43
+ color_gradation_th(0,0,tot,Temp,0.0,0, "temp.svg")
44
+
45
+ state_of_problem("mag_static")
femagtools/windings.py CHANGED
@@ -74,7 +74,10 @@ class Winding(object):
74
74
  if hasattr(self, 'windings'):
75
75
  # calculate coil width yd and num layers l
76
76
  taus = 360/self.Q
77
- ngen = 0
77
+ try:
78
+ ngen = arg.machine.get('qs_sim', 0)
79
+ except AttributeError:
80
+ ngen = 0
78
81
  if 'slots' in self.windings[1]: # custom winding def
79
82
  for k in self.windings:
80
83
  w = self.windings[k]
@@ -96,7 +99,7 @@ class Winding(object):
96
99
 
97
100
  slots = [round((x-taus/2)/taus)
98
101
  for x in self.windings[1]['PHI']]
99
- self.l = 2
102
+ self.l = 1
100
103
  if len(slots) > ngen//self.m:
101
104
  self.l = 2
102
105
  return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: femagtools
3
- Version: 1.7.3
3
+ Version: 1.7.4
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
@@ -37,7 +37,7 @@ Classifier: Topic :: Scientific/Engineering
37
37
  Requires-Python: >=3.7
38
38
  Description-Content-Type: text/markdown
39
39
  License-File: LICENSE
40
- Requires-Dist: numpy
40
+ Requires-Dist: numpy <=1.26.4
41
41
  Requires-Dist: scipy
42
42
  Requires-Dist: mako
43
43
  Requires-Dist: six
@@ -1,9 +1,9 @@
1
- femagtools/__init__.py,sha256=1YBODQdBsY7HA7g3S83zDtocMsCpScKv1hPGDi2rydw,1600
2
- femagtools/airgap.py,sha256=ZCIZTYf6BbuNYx68y9fUDBQo3taN8RuGl8q-jJ7ygiA,1577
1
+ femagtools/__init__.py,sha256=LQSh6OjWbECaFlDSZXzy-njc7_TUylPuMfvbQVJYH9I,1600
2
+ femagtools/airgap.py,sha256=hELJXe52yUw82JwZ1tGUXUtRhMG2_WSUBVeGkTZSAM8,1900
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=wvkVbxmikjwsOzJ_vB690Dqtm2X1DGXCFM4vy07eDNU,73412
6
+ femagtools/bch.py,sha256=aWTOQ8Hq2ygLPQpf5k9W0nWUPK0UXe0YewArrPI7IBk,73550
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
@@ -17,11 +17,12 @@ femagtools/ecloss.py,sha256=gaZ8JmlFVoP6IYe79YXPXvZSULm8IZr6bPBdKuyKaIo,12832
17
17
  femagtools/erg.py,sha256=IXKq76P9qLt_ssNOP78v8Qizk3J2Zg80yaKDSjzwoJE,1224
18
18
  femagtools/femag.py,sha256=RUkjvkHe5gBElawh4-cbwueplXA5Tjvnu28CPVw6f74,44123
19
19
  femagtools/forcedens.py,sha256=7NNv75Vg9vQ_fy8W4kM2rlSO970zaSmeurhPmdAxsOU,8485
20
- femagtools/fsl.py,sha256=hFoxjFmVEbahsYp7cGcoNXtZHXeAsxk02VIOx8p2NXs,34219
20
+ femagtools/fsl.py,sha256=htSzZkguxDsVvIBXi6VK3YRqUbYAlQ_R4jLRfcOmIzw,33872
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
24
24
  femagtools/grid.py,sha256=s7LfKKLm2H4-cza2kSEANq6vwxq10Su3TJl3kHShHRA,1561
25
+ femagtools/heat_source_network.py,sha256=dz3nTK084SR2fyy1167wlpBlGrzv54OqCCGKPNWqpsU,16836
25
26
  femagtools/hxy.py,sha256=PkiZ_-CRhtvtpkmLAP8iMtwvzh7CjKGGcAbOhFb4Nls,6275
26
27
  femagtools/isa7.py,sha256=HnD_NZ5-Oj98kw8e3o3tdHt07kfEL-d0N6KmqkoeTeU,58332
27
28
  femagtools/jhb.py,sha256=stJxkmzHpfUIBVcFw7jWbV5KN9_EFqzOCgacyhUqWvM,1779
@@ -30,7 +31,7 @@ femagtools/losscoeffs.py,sha256=Nil2fvkkS6-T29OnHIsdVbegCHyl23iZg8rMVbbA5wY,6785
30
31
  femagtools/magnet.py,sha256=Nuk060bT4Wa3lX74HdefqTTtUxLaERDSBYTTpbi6KP4,1093
31
32
  femagtools/mcv.py,sha256=Y5tCBEhm6k64m9xQ-salId5e-U29nNTz-iH4MHTbE5Y,40673
32
33
  femagtools/me.py,sha256=XNK0l-aroNYfKyxV_uslE8q3vJb_KuntAYTWd-4FQaQ,1833
33
- femagtools/model.py,sha256=7_LWgUQY3W-n4RBvPXbTY2FhfgiR0xlSSKTv2JqUX08,15618
34
+ femagtools/model.py,sha256=bv6U2wBnJejTA8zHQD-hSZETkEZr4UF73gbPLmtsaRI,16328
34
35
  femagtools/moproblem.py,sha256=kOP8pRdD8YXz28_M2WKnFgl3eeJ7tqg49ohoazsmUOg,2825
35
36
  femagtools/multiproc.py,sha256=7mJF-VU1NrJkENyg8eHtDrDRNBwLPK43phZv3ehm9BU,8435
36
37
  femagtools/mxw2msh.py,sha256=CIIqAvfs8U-A0OfuOAoDaqNSmoMSHSI_tW1CPFRCP5E,2151
@@ -38,14 +39,14 @@ femagtools/nc.py,sha256=6O3lWuX2SX8IuVM0rr55L2UywrI1MmXzJOgUtUmcg4A,14532
38
39
  femagtools/netlist.py,sha256=CSCl8setLZ_L8DCnNWaNA3-wLe1yo-fmzARZoVvYfaA,2052
39
40
  femagtools/ntib.py,sha256=76g1ZO3Fq_kN-HTMBvaKvJmMMlJMyEPFeNAcJPq3w7Y,3099
40
41
  femagtools/opt.py,sha256=snQlPNT5hksCgj0TBjFBhSCERMHHGMv1xc4uFSxptfQ,8687
41
- femagtools/parstudy.py,sha256=K78fd7ILhYjGgkauTXc_M8Plnynee0WFH20iyuoMXSo,19523
42
+ femagtools/parstudy.py,sha256=IkWffdFLhLACSvqJ6_ho4Pi4RC6AapLThoktVTXnVJE,19461
42
43
  femagtools/poc.py,sha256=wMwOxMhPLFRiGPMsKQwWWuGr6UZPzRBajhfVMfXptNU,6794
43
44
  femagtools/tks.py,sha256=xStMu6P1xsc36tS53FKnbL6i2ZTVnCNXyTVw8_gjepo,7436
44
45
  femagtools/ts.py,sha256=x9aCMVASjdBZuyI2pJGMyi1dveGFd_pWQ20cZ-l_moc,47216
45
46
  femagtools/utils.py,sha256=1SX5s21xyW8u0NF_Hjs7DByyCTdLm9VRArLburTyHR0,1581
46
47
  femagtools/vbf.py,sha256=9XGfhftmD9carU8ByQ5DwqoR4daq5mJ39eMqruwml0Q,2444
47
48
  femagtools/vtu.py,sha256=Sf83dHIfCKY2km-MIUHKKoj-JKN4PDX7kkPLZXyIYY4,10723
48
- femagtools/windings.py,sha256=6ioABZRWQ3xA4kmEz2NUkXh-C-FmW9YYkjQKs5YakQs,22197
49
+ femagtools/windings.py,sha256=-PDqzatXJUaMTR4hI1bbY__AAb3fjwfjiS9FEuR-8N8,22305
49
50
  femagtools/dxfsl/__init__.py,sha256=MywcCdpKPKs4qJBJJgeDsikJFJ2P48dbTuNk303f5pM,76
50
51
  femagtools/dxfsl/area.py,sha256=cYnDtnEuwuDW5R1NKV0s8PUzzQzxhgCUktFqHAjP9K8,56581
51
52
  femagtools/dxfsl/areabuilder.py,sha256=Siu11yRcNJiSCWwc865-OvuVhSmLtRQWysbe1-rUcN0,34197
@@ -56,7 +57,7 @@ femagtools/dxfsl/corner.py,sha256=-XPBcnEau-2-SRHLYzlBqCQGaFfgm_DH2qR1mSaFoAs,13
56
57
  femagtools/dxfsl/dumprenderer.py,sha256=n4AvInjvGIaC2iKZtQaYXXDyJVSQ3uEOFOLD4-xfKRY,1861
57
58
  femagtools/dxfsl/dxfparser.py,sha256=kyXG0kZfNyOgn96MqBgP8RhOQhppfB5NbyRNNybs1C0,13451
58
59
  femagtools/dxfsl/femparser.py,sha256=O8940Q1Mz8MKng6W8M3s9KfTvhDLJ56tfQWtZEW3xMM,2134
59
- femagtools/dxfsl/fslrenderer.py,sha256=0PItgL6Hjt1ovkDYy97lK9VN0LvPNxOLd0Bt-zPLmqE,25020
60
+ femagtools/dxfsl/fslrenderer.py,sha256=PBy3KUlNIqItcxCFnWC-d3OrSrsNFj5vDLLGZW2oq3Q,25081
60
61
  femagtools/dxfsl/functions.py,sha256=F0AjzHfIfq3v-mhDzUOeq3zeYQCEsJl1-XpEyJQsSnQ,11805
61
62
  femagtools/dxfsl/geom.py,sha256=-hPErBLyAsDh-aq2s54psFqG2AaNr9jVeKMeEVUQF5E,165356
62
63
  femagtools/dxfsl/journal.py,sha256=S17B7wsrq5QzIUbjgg0ntvnpgH0thHq9aQXO7GdYlQQ,4265
@@ -69,10 +70,10 @@ femagtools/machine/__init__.py,sha256=U8W65K7jr7jDdC1KnJh0WjYd8DFaLnIFVvlh-TKcV9
69
70
  femagtools/machine/afpm.py,sha256=hNyDFRLGmCuWRPZl_u1ztJ4pA-Y_mxLaVvg3UJkzRuE,24766
70
71
  femagtools/machine/effloss.py,sha256=sLB8AXYVAE_AL1Ca41A2EDbn9_7u6xNjaYFjmRPoTDg,13578
71
72
  femagtools/machine/im.py,sha256=3Y54AHMZfAjkvgexx2E-5jxNWzaVQ-SyaETCh7gNBYA,38008
72
- femagtools/machine/pm.py,sha256=JQn2vnPBvGF9mUnqnKiVisHZnjhpzIbaBkqUxKN5leE,58589
73
+ femagtools/machine/pm.py,sha256=4gqYLWACE7C9FzmiHVwh6M2WT7ofNezEIazkAxLae8Q,61704
73
74
  femagtools/machine/sizing.py,sha256=nWCfxbyWfbw5-7xu0qZ6zjWNquEPn3fUH-fQeGb6QUc,24307
74
75
  femagtools/machine/sm.py,sha256=G4fHmZngQSRN9Dum7mHaf36b_CvD-u_AQogIFixlnys,37899
75
- femagtools/machine/utils.py,sha256=ckPOfaaieRbThMKkBtCtoCMsehdbePH8xNoWPmNoS3Y,18782
76
+ femagtools/machine/utils.py,sha256=zi659wCszhXEioKXtRdeyQik2etRFGpoykqfOGiLtTo,21223
76
77
  femagtools/moo/__init__.py,sha256=zinmWEOrsEz6DmMX0Dbn4t6_1UR-p4bEGqyR1wUQk_Q,175
77
78
  femagtools/moo/algorithm.py,sha256=lNEf0Bur4yFpIJeLtAC3oIus8sOMWTb7jepFlD28YzE,5445
78
79
  femagtools/moo/population.py,sha256=qGEsm-2Ys_pTkVQv3Zv36HzOlqUxtMvM6NqY_KytsUE,10060
@@ -82,7 +83,7 @@ femagtools/moo/test/PopulationTest.py,sha256=lG9NeWo0xrslfQRa4tgy1Nj23VJMFIlg_vQ
82
83
  femagtools/moo/test/ProblemTest.py,sha256=r5XEfY4LPscDb35TxxPd0lbP3nUmL6_G6vrRo1I3RSg,505
83
84
  femagtools/plot/__init__.py,sha256=dD_wvo6sGc8jvJYD1b0Z7oxCE4O9uQ3Igb5DeAjZDWU,939
84
85
  femagtools/plot/bch.py,sha256=4f9Q-JZtj9WMjxFUXMXNaSdWdDXN_Be4-F9kOU45xns,28525
85
- femagtools/plot/char.py,sha256=SB40YJ5seVQmWTAdrfDQZiEZH3jIB11HUY5SJL_HJcY,12032
86
+ femagtools/plot/char.py,sha256=iDvrKp_Hz10W7qLjWCtYajKjY01fZbwf_kITDGisPaY,12123
86
87
  femagtools/plot/fieldlines.py,sha256=QtKF4nhnQ_FHHGh9Qez3GVmym0CLhW1ZyIKtk4pzos4,1136
87
88
  femagtools/plot/fluxdens.py,sha256=NlexRJ3f_8CgKoWrV82ZIsAXPrLhwj98uOe8_fUks7A,1082
88
89
  femagtools/plot/forcedens.py,sha256=Vloi9czy7qbGXI-Vm7Cow6IfHTsFhCLI1YWduFOR55c,4075
@@ -96,7 +97,7 @@ femagtools/templates/afm_rotor.mako,sha256=fY-dlZvRLN9UAy5V6Q_inWghkSUe8pzrCYjJd
96
97
  femagtools/templates/afm_stator.mako,sha256=l1xEwxffZ1jyx5wuJ3rhVbVlZirJzD2K8n4i5Dvbxuc,5344
97
98
  femagtools/templates/airgapinduc.mako,sha256=aCMLZ7P4vjeSGikIetkwymgDjESdftPN_aYx2LfjfsY,246
98
99
  femagtools/templates/asyn_motor.mako,sha256=vvZ0SIJj4ORaCbE1Hl5NeCU_j2CWdOltVpSKP7ESJTQ,2879
99
- femagtools/templates/basic_modpar.mako,sha256=RqCazMbcRkDeOGT7o3EGvdvhoJhJT8pN-C3Nu5y4sQs,3259
100
+ femagtools/templates/basic_modpar.mako,sha256=IlUbc5A0yrVF-kSTUgC8PM_PdzSbX_bzeAwiKN17msc,3323
100
101
  femagtools/templates/bertotti.mako,sha256=o0OjzIIliVy2oHtDx4QzsDBodfsUQhdln4DmPNcIHnQ,1346
101
102
  femagtools/templates/calc_field_ts.mako,sha256=hNs7INzk92U8LljQvQHnKf20fD2HU6igtx1rhsOvPkc,1911
102
103
  femagtools/templates/calc_therm_field.mako,sha256=Q1aAulucLjrtNiCnFGin3ObK13R1KG6dWjJTWwdfxds,1600
@@ -159,7 +160,7 @@ femagtools/templates/statorRing.mako,sha256=sDgDmk71EoE8d4e9cmyqKqRldfC8uKMmpHEj
159
160
  femagtools/templates/statorRotor3.mako,sha256=MrU_JCSH8tJEUH09fftJJslkbEeIwOB1WGBSxXqUqeI,4942
160
161
  femagtools/templates/stator_msh.mako,sha256=Neze1ielMCk7TrARyhOra91fFQVT8Phsgk2Omt_aMG8,1799
161
162
  femagtools/templates/therm-dynamic.mako,sha256=pEz7jrUpopK1-RqgulNnrkSaCZDjfLelsVo6cBqmpac,3142
162
- femagtools/templates/therm-static.mako,sha256=9L-AypN8tfnZnwSqXeni5wyJzAEOYFRJGma8hbwlBNc,1427
163
+ femagtools/templates/therm_static.mako,sha256=ulevp4AP-kZ1_qdScPMaX9tLqvvP0t9lFflWTXgUxaE,1310
163
164
  femagtools/templates/torq_calc.mako,sha256=89IVD1L1Ep7kYaKVrNYYAurUidnbR7LdcP2aLF2hdYo,2264
164
165
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
166
  tests/test_afpm.py,sha256=OE-ULFcp_fBQ7SyRacDmDGbq8ULFHLbXXx3MHJN1C1c,11031
@@ -175,13 +176,14 @@ tests/test_erg.py,sha256=kRVzpXa6JDdbxTss18HUWKny9Dx8IMx9uGTrbQCnHwg,523
175
176
  tests/test_femag.py,sha256=55cCx90tJ1BEeu_-DOit37y26hFGVSYwkT81s9-p28E,1934
176
177
  tests/test_forcedens.py,sha256=Yzl3SAmJNkZN9dA3aLxRvwY8fKsw077Fl0iJm6zJ5Sk,536
177
178
  tests/test_fsl.py,sha256=H2doNSNLx9FmcHsq-Ng8mEwV7qZtAdIK4bFCyhFDUTw,16623
179
+ tests/test_heat_source_network.py,sha256=TC-Gl4iy9jnMGfsY_24XjwlP-SDxP345JKVT8xRwsFo,690
178
180
  tests/test_hxy.py,sha256=pVb6ZfDhBy5-DXa3gh7RQmLFG8p5cSYB8gdGLC8kjAk,640
179
181
  tests/test_im.py,sha256=55wfCoA8_PuogI_RsC3AjUQCpR84T-HddtHuU1NxfPc,662
180
182
  tests/test_isa7.py,sha256=GJhRj2nncrUpNTIlM4jvG4kKZS7cK19hhQg9KbM3b5Q,3001
181
183
  tests/test_jhb.py,sha256=aDzwr2ZaXlizrPnlLlcI_IT3OpSxuKu-FzBBkIALEDg,824
182
184
  tests/test_job.py,sha256=1tCTPqd2LUeeVNuzC07lsPz4ffr0WAVX_BykyXQ2mZY,981
183
185
  tests/test_losscoeffs.py,sha256=3EKmDFRuvn88z_8r0HxKFdB0lNXNnhEgaFshL8BkDjE,2012
184
- tests/test_machine.py,sha256=t81TTMcAbZWLkkpDK3n3dRtctKKQzRhJlxRHrr0BmZo,12881
186
+ tests/test_machine.py,sha256=Woha6nfKaYQCxxoG57sUztpnpU6K9imXwn9B_KMhanw,12906
185
187
  tests/test_magncurv.py,sha256=wPf1dNACZ1BkqKHSqJxiNi6Dq8JP3QCRBY4ql_0YCyU,2608
186
188
  tests/test_magnet.py,sha256=BUHG_8SEi4d8j6yV9BSzcpYc2-UVMRFv50P_jgTTXoQ,276
187
189
  tests/test_mcv.py,sha256=qV52S82BAN3GRyD-z73RgOBK9-fQCKvrT4T9MXzArn0,283
@@ -210,9 +212,9 @@ tests/moo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
210
212
  tests/moo/test_algorithm.py,sha256=Em8sFm2vzPmuIzRrBBnUQLU_TYuJHSf-kEeozw0XeX4,2563
211
213
  tests/moo/test_population.py,sha256=FvX9LRCxQx0_E2GxHQ5vKwOYFBQiNbT6Lmv5GmNWjTQ,5471
212
214
  tests/moo/test_problem.py,sha256=ALeP4u7g-dFhfwWL8vxivdrrYzVKPjHMCAXzzgyNZbs,467
213
- femagtools-1.7.3.dist-info/LICENSE,sha256=NaQe4uvkszQPJmiRPHecfk-Ab9VSRXo8xQLGNVHTeFo,1362
214
- femagtools-1.7.3.dist-info/METADATA,sha256=5GcEXNzJvRLKKCuYpIHm4iU83DECYp9U6LQoh1EnjLQ,6147
215
- femagtools-1.7.3.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
216
- femagtools-1.7.3.dist-info/entry_points.txt,sha256=jrvOkZPiN44u1sASeu271VRaVIv5V-uRpN0_N5U_R8c,248
217
- femagtools-1.7.3.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
218
- femagtools-1.7.3.dist-info/RECORD,,
215
+ femagtools-1.7.4.dist-info/LICENSE,sha256=NaQe4uvkszQPJmiRPHecfk-Ab9VSRXo8xQLGNVHTeFo,1362
216
+ femagtools-1.7.4.dist-info/METADATA,sha256=mDq3sIVGX9_9OYQa4NObTZud2BH92rKQUJe7GR9bZNM,6156
217
+ femagtools-1.7.4.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
218
+ femagtools-1.7.4.dist-info/entry_points.txt,sha256=jrvOkZPiN44u1sASeu271VRaVIv5V-uRpN0_N5U_R8c,248
219
+ femagtools-1.7.4.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
220
+ femagtools-1.7.4.dist-info/RECORD,,