Source code for pyleecan.Methods.Machine.WindingUD.init_as_CW2LR
# -*- coding: utf-8 -*-
from numpy import array, mod, zeros
from ....Methods.Machine.Winding import WindingError
from ....Functions.Winding.reverse_wind_mat import reverse_wind_mat
from ....Functions.Winding.shift_wind_mat import shift_wind_mat
[docs]def init_as_CW2LR(self, Zs=None):
"""Compute the Winding Matrix (for winding type 5) (Nlay_rad=1,Nlay_tan=1)
type 5 : TOOTH WINDING, DOUBLE LAYER ALL TEETH WOUND, RADIAL SUPERPOSITION
Parameters
----------
self : WindingUD
A: WindingUD object
Zs : int
Number of Slot (Integer >0)
Raises
------
WindingT5DefMsError
You must have 0.25< Zs/2/p/qs <= 0.5
"""
if Zs is None:
if self.parent is None:
raise WindingError(
"ERROR: The Winding object must be in a Lamination object."
)
if self.parent.slot is None:
raise WindingError(
"ERROR: The Winding object must be in a Lamination object with Slot."
)
Zs = self.parent.slot.Zs
assert Zs > 0, "Zs must be >0"
assert Zs % 1 == 0, "Zs must be an integer"
# ex "Effect of Pole and Slot Combination on Noise and Vibration in Permanent
# Magnet Synchronous Motor" creates highest harmonic at Zs/2+1 and Zs/2-1
nlay = 2.0
qs = float(self.qs)
p = float(self.p)
Ncgr = Zs / nlay / qs
ms = Zs / 2.0 / p / qs
# Ncspc= Zs/(2.0*qs*self.Npcp/nlay) # number of coils in series per parallel circuit
# Ntspc = self.Ntcoil * Ncspc #Number of turns in series per phase
Ntcoil = self.Ntcoil # Number of turns per coils
wind_mat = zeros((2, 1, Zs, self.qs))
# creates highest harmonic at Zs/2+1 and Zs/2-1
if ms == 0.5: # then Zs/qs is integer
# traditional non overlapping all teeth wound winding
for q in range(0, self.qs):
for k in range(0, Zs // self.qs): # number of Ncgr coils
xenc = q + array([1, 0]) + k * qs
wind_mat[0, 0, int(mod(xenc[0] - 1, Zs)), q] = +Ntcoil # right/top/2
wind_mat[1, 0, int(mod(xenc[1] - 1, Zs)), q] = -Ntcoil # left/bottom/1
elif (
ms != 0.5 and Ncgr % 1 == 0
): # ms!=0.5 and Ncgr is an integer (ms>0.25 && ms<0.5)
# new algorithm to reverse the coils
for q in range(0, self.qs):
for k in range(0, int((Zs // self.qs) // Ncgr)): # number of Ncgr coils
for l in range(0, int(Ncgr)):
id0 = int(mod(q * Ncgr + 0 + k * qs * Ncgr - 1 + l, Zs))
id1 = int(mod(q * Ncgr + 1 + k * qs * Ncgr - 1 + l, Zs))
# left / bottom / 1
wind_mat[1, 0, id0, q] = -((-1) ** (l + q - 1 + k)) * Ntcoil
# right / top / 2
wind_mat[0, 0, id1, q] = +((-1) ** (l + q - 1 + k)) * Ntcoil
wind_mat = wind_mat[:, :, ::-1, :]
else:
raise WindingT5DefMsError(
"Winding geometry not handled yet, enter "
"your own winding matrix with "
"type_winding=0 and contact EOMYS"
)
# Set default values
if self.is_reverse_wind is None:
self.is_reverse_wind = False
if self.Nslot_shift_wind is None:
self.Nslot_shift_wind = 0
self.Nlayer = 2
# Apply the transformations
if self.is_reverse_wind:
wind_mat = reverse_wind_mat(wind_mat)
if self.Nslot_shift_wind > 0:
wind_mat = shift_wind_mat(wind_mat, self.Nslot_shift_wind)
self.wind_mat = wind_mat
# Matrix changed, compute again periodicity
self.per_a = None
self.is_aper_a = None
[docs]class WindingT5DefMsError(WindingError):
"""
Parameters
----------
Returns
-------
Raises
------
must
be 0
"""
pass