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