Source code for pyleecan.Methods.Machine.LamSlotWind.comp_wind_function

from numpy import linspace, meshgrid, pi, repeat, sum as np_sum, zeros, mean

from ....Functions.Winding.comp_cond_function import comp_cond_function


[docs]def comp_wind_function(self, angle=None, Na=2048, alpha_mmf0=0, per_a=1): """Computation of the winding function for the lamination. By convention a tooth is centered on the X axis Parameters ---------- self : LamSlotWind A LamSlotWind object angle : ndarray Space discretization to compute the winding functions Na : int Number of angular points for the winding function (not used if angle is set) alpha_mmf0 : float Angle to shift the winding function (Default value = 0) per_a : int Spatial periodicity factor Returns ------- wf: ndarray Winding function Matrix (qs,Na) """ # Space discretization if angle is None: angle = linspace(0, pi * 2 / per_a, Na, endpoint=False) else: Na = angle.size qs = self.winding.qs # number of phases # Number of point on rad and tan direction Nrad, Ntan = self.winding.get_dim_wind() Zs = self.slot.Zs # Number of slot Zs0 = int(Zs / per_a) slot_angle = self.slot.comp_angle_active_eq() slot_opening = self.slot.comp_angle_opening() wind_mat = self.winding.get_connection_mat(Zs) # sum wind_mat along Nlay_rad axis wind_mat = np_sum(wind_mat, axis=0) # angle of the center of the slots # By convention a tooth is centered on the X axis alpha_slot = linspace(0, 2 * pi / per_a, Zs0, endpoint=False) + pi / Zs # angle of the lay in a slot (Nlay point, end and begin excluded) alpha_lay = linspace(-slot_angle / 2, slot_angle / 2, Ntan + 1, endpoint=False)[1:] if alpha_mmf0 != 0: angle = (angle - alpha_mmf0) % (2 * pi) wf = zeros((qs, Na)) for n in range(Ntan): # [Na, Zs] Xalpha_slot, Xangle = meshgrid(alpha_slot + alpha_lay[n], angle) Xwind = zeros((1, Zs0, qs)) Xwind[0, :, :] = wind_mat[n, 0:Zs0, :] # Extended winding matrix [Na, Zs, qs] Xwind = repeat(Xwind, Na, axis=0) # Single winding function in every slot and angle for nth layer [Na, Zs] Xwf = -0.5 * comp_cond_function(Xalpha_slot, slot_opening, Xangle) for q in range(qs): # winding function of qth phase (sum over layers) [qs, Na] wf[q, :] += np_sum(Xwind[:, :, q] * Xwf, axis=1) if per_a > 1: wf = wf - mean(wf, axis=1)[:, None] return wf