femagtools 1.7.3__py3-none-any.whl → 1.7.5__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 +1 -1
- femagtools/airgap.py +11 -0
- femagtools/bch.py +32 -21
- femagtools/dxfsl/area.py +1 -0
- femagtools/dxfsl/fslrenderer.py +3 -2
- femagtools/dxfsl/geom.py +39 -1
- femagtools/fsl.py +8 -17
- femagtools/heat_source_network.py +403 -0
- femagtools/machine/pm.py +79 -4
- femagtools/machine/utils.py +109 -51
- femagtools/model.py +12 -1
- femagtools/parstudy.py +4 -5
- femagtools/plot/char.py +5 -2
- femagtools/templates/basic_modpar.mako +2 -0
- femagtools/templates/{therm-static.mako → therm_static.mako} +15 -13
- femagtools/windings.py +5 -2
- {femagtools-1.7.3.dist-info → femagtools-1.7.5.dist-info}/METADATA +2 -2
- {femagtools-1.7.3.dist-info → femagtools-1.7.5.dist-info}/RECORD +24 -22
- {femagtools-1.7.3.dist-info → femagtools-1.7.5.dist-info}/WHEEL +1 -1
- tests/test_heat_source_network.py +21 -0
- tests/test_machine.py +4 -4
- {femagtools-1.7.3.dist-info → femagtools-1.7.5.dist-info}/LICENSE +0 -0
- {femagtools-1.7.3.dist-info → femagtools-1.7.5.dist-info}/entry_points.txt +0 -0
- {femagtools-1.7.3.dist-info → femagtools-1.7.5.dist-info}/top_level.txt +0 -0
femagtools/machine/utils.py
CHANGED
@@ -21,9 +21,9 @@ def K(d):
|
|
21
21
|
returns transformation matrix
|
22
22
|
"""
|
23
23
|
return np.array((
|
24
|
-
(
|
25
|
-
(
|
26
|
-
(
|
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
|
-
(
|
39
|
-
(np.sin(d), np.sin(d-2*np.pi/3), np.sin(d+2*np.pi/3))))
|
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), (
|
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((
|
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
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
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
|
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
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
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
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
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
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
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][
|
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
|
-
|
503
|
-
ldq
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
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
|
-
|
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
|
-
|
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 /
|
350
|
+
ax.set_ylabel(f'Torque / {tunit}')
|
348
351
|
ax.set_xlabel('Speed / rpm')
|
349
352
|
ax.set_title(title)
|
350
353
|
if cbar:
|
@@ -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
|
-
|
11
|
-
heat_transfer_coefficient = ${model['heat_transfer_coefficient']
|
12
|
-
area_factor =
|
13
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
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,
|
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,
|
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
|
-
|
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 =
|
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
|
+
Version: 1.7.5
|
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=
|
2
|
-
femagtools/airgap.py,sha256=
|
1
|
+
femagtools/__init__.py,sha256=z_m3ZYsmxn72xMFMzy-WxDxEWeieBELwuwUF3kzJssE,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=
|
6
|
+
femagtools/bch.py,sha256=FYpQsbCaJB6GJHwUto4aCq94Yz1DtYAbaj7l-gGjmY4,73716
|
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=
|
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=
|
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,16 +39,16 @@ 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=
|
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
|
49
|
+
femagtools/windings.py,sha256=-PDqzatXJUaMTR4hI1bbY__AAb3fjwfjiS9FEuR-8N8,22305
|
49
50
|
femagtools/dxfsl/__init__.py,sha256=MywcCdpKPKs4qJBJJgeDsikJFJ2P48dbTuNk303f5pM,76
|
50
|
-
femagtools/dxfsl/area.py,sha256=
|
51
|
+
femagtools/dxfsl/area.py,sha256=VTRYoIRDFM0bp5nWZF3_DtyUNA86ZwtD4eYfb3mnGY4,56618
|
51
52
|
femagtools/dxfsl/areabuilder.py,sha256=Siu11yRcNJiSCWwc865-OvuVhSmLtRQWysbe1-rUcN0,34197
|
52
53
|
femagtools/dxfsl/concat.py,sha256=F6scwesxyOmfmKQ5kGspNCxA71Yz6QgxFL7lTj3hsaI,13385
|
53
54
|
femagtools/dxfsl/conv.py,sha256=GeRYUvbdcP5vKtNm5S5gU1yyMboGkGNyOqzkHpYbEEo,10086
|
@@ -56,9 +57,9 @@ 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=
|
60
|
+
femagtools/dxfsl/fslrenderer.py,sha256=PBy3KUlNIqItcxCFnWC-d3OrSrsNFj5vDLLGZW2oq3Q,25081
|
60
61
|
femagtools/dxfsl/functions.py,sha256=F0AjzHfIfq3v-mhDzUOeq3zeYQCEsJl1-XpEyJQsSnQ,11805
|
61
|
-
femagtools/dxfsl/geom.py,sha256=-
|
62
|
+
femagtools/dxfsl/geom.py,sha256=-yIlxM1Mb93qdqTYwNYgs-RUI0-9qf9MB7f58q-bKFw,166805
|
62
63
|
femagtools/dxfsl/journal.py,sha256=S17B7wsrq5QzIUbjgg0ntvnpgH0thHq9aQXO7GdYlQQ,4265
|
63
64
|
femagtools/dxfsl/machine.py,sha256=3leWkjdMCLX2HgMhw8gNdxTKROhNCKU7KQrDVbBQ8DI,49337
|
64
65
|
femagtools/dxfsl/plotrenderer.py,sha256=q2cORuxJEf1Ws6oCY9c0gF6N3kDrcI6WOz3u5Vl6R_c,13823
|
@@ -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=
|
73
|
+
femagtools/machine/pm.py,sha256=njWa9YRV2W80xqjT9Dj9Jro73Y3zJtg0HYdJ75Ye0Vk,61720
|
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=
|
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=
|
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=
|
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/
|
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=
|
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.
|
214
|
-
femagtools-1.7.
|
215
|
-
femagtools-1.7.
|
216
|
-
femagtools-1.7.
|
217
|
-
femagtools-1.7.
|
218
|
-
femagtools-1.7.
|
215
|
+
femagtools-1.7.5.dist-info/LICENSE,sha256=NaQe4uvkszQPJmiRPHecfk-Ab9VSRXo8xQLGNVHTeFo,1362
|
216
|
+
femagtools-1.7.5.dist-info/METADATA,sha256=IK9wuI7T0Bxd3Vo1nyzRSRZ1rKqncHaJwlAP57Uk5Tg,6156
|
217
|
+
femagtools-1.7.5.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
218
|
+
femagtools-1.7.5.dist-info/entry_points.txt,sha256=jrvOkZPiN44u1sASeu271VRaVIv5V-uRpN0_N5U_R8c,248
|
219
|
+
femagtools-1.7.5.dist-info/top_level.txt,sha256=Ri4YWtU8MZTzNje9IKyXhTakNbsrCynuWdon4Yq94Dc,17
|
220
|
+
femagtools-1.7.5.dist-info/RECORD,,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import femagtools.heat_source_network as hsn
|
2
|
+
import pathlib
|
3
|
+
import pytest
|
4
|
+
|
5
|
+
|
6
|
+
@pytest.fixture
|
7
|
+
def data_dir():
|
8
|
+
return pathlib.Path(__file__).with_name('data')
|
9
|
+
|
10
|
+
|
11
|
+
def test_heat_source_network(data_dir):
|
12
|
+
model = hsn.read(str(data_dir / 'temp_model.hsn'))
|
13
|
+
assert [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13] == model.nodes
|
14
|
+
names = model.get_node_names()
|
15
|
+
assert ['StZa', 'outs', 'StJo', 'Slot',
|
16
|
+
'Shaf', 'Iron', 'PMag', 'PMag',
|
17
|
+
'W1 ', 'W2 ', 'W3 '] == names
|
18
|
+
T = model.solve()
|
19
|
+
# [130.22552926, 56.75737966, 116.12788806, 150.18881253,
|
20
|
+
# 175.77455152, 175.77455152, 175.77526274, 175.77455152,
|
21
|
+
# 126.04691063, 122.49609205, 125.27401647])
|
tests/test_machine.py
CHANGED
@@ -272,10 +272,10 @@ def test_invpark():
|
|
272
272
|
iq = 1
|
273
273
|
id = 0
|
274
274
|
ia, ib, ic = femagtools.machine.invpark(w1t, iq, id)
|
275
|
-
assert ia[0] == pytest.approx(
|
276
|
-
assert ib[0] == pytest.approx(0.
|
277
|
-
assert ic[0] == pytest.approx(0.
|
278
|
-
assert ic[-1] == pytest.approx(
|
275
|
+
assert ia[0] == pytest.approx(0.0)
|
276
|
+
assert ib[0] == pytest.approx(0.866, rel=1e-3)
|
277
|
+
assert ic[0] == pytest.approx(-0.866, rel=1e-3)
|
278
|
+
assert ic[-1] == pytest.approx(0.866, rel=1e-3)
|
279
279
|
|
280
280
|
|
281
281
|
def test_psidq_create():
|
File without changes
|
File without changes
|
File without changes
|