Source code for pyleecan.Methods.Machine.WindingUD.init_as_CW1L
# -*- coding: utf-8 -*-
from numpy import array, power, 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_CW1L(self, Zs=None):
"""Compute the Winding Matrix (for winding type 2)
type 2 : TOOTH WINDING, SINGLE LAYER ALTERNATE TEETH WOUND
(Nlay_rad=1,Nlay_tan=1)
Parameters
----------
self : WindingUD
A: WindingUD object
Zs : int
Number of Slot (Integer >0)
Raises
------
WindingT2DefNtError
Zs/qs/2 must be an integer
"""
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"
# non overlapping ALTERNATE TEETH WOUND-> single layer
# cf "2D exact analytical model for surface-mounted permanent-magnet motors
# with semi-closed slots" -> U motor 10p/18s creates 2p, Zs/2+2p, Zs/2-2p
qs = self.qs # Phase Number
Nt = Zs / float(qs) / 2.0 # Number of teeth by semi phase
# 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
if round(Nt) != Nt: # Nt must be an integer
raise WindingT2DefNtError(
"wrong winding definition, cannot wind all "
"the teeth (Zs/qs/2 is not an integer)!"
)
# first strategy - checked with Umbra_08 motor and Umbra_05: the winding
# direction of each tooth is reversed
wind_mat = zeros((1, 1, Zs, qs))
for k in range(0, int(Nt)): # winding alternatively the teeth
for q in range(0, qs):
xenc = q * 4 + k * 2 * qs + array([1, 2])
wind_mat[0][0][int((xenc[0] - 1) % Zs)][q] = power(-1, xenc[0] + k + 1)
wind_mat[0][0][int((xenc[1] - 1) % Zs)][q] = power(-1, xenc[1] + k + 1)
wind_mat *= Ntcoil
# 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 = 1
# 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 WindingT2DefNtError(WindingError):
"""
Parameters
----------
Returns
-------
Raises
------
must
be 0
"""
pass