Source code for PDSim.core.motor
import operator
# If scipy is available, use its spline interpolation function, otherwise,
# use our implementation (for packaging purposes)
try:
import scipy.interpolate as interp
except ImportError:
import PDSim.misc.scipylike as interp
import warnings
[docs]
class Motor(object):
"""
A class that implements the motor model
This can be either a constant efficiency model
"""
def __init__(self):
self.type = ''
self.suction_fraction = 0.0
[docs]
def set_eta(self, eta):
"""
Set the motor efficiency
"""
self.eta_motor = eta
self.type = 'const_eta_motor'
[docs]
def set_coeffs(self, tau_coeffs, eta_coeffs, omega_coeffs):
"""
Set the coefficients
Parameters
----------
tau_coeffs: iterable (list or similar)
Values for the torque [N-m]
eta_coeffs: iterable (list or similar)
Values for the efficiency [-] (in the range 0 to 1)
omega_coeffs: iterable (list or similar)
Values for the rotational speed [rad/s]
"""
#Only accept coefficients if they are all the same length
assert len(tau_coeffs) == len(eta_coeffs) == len(omega_coeffs)
#Set the local values
self.tau_coeffs = tau_coeffs
self.eta_coeffs = eta_coeffs
self.omega_coeffs = omega_coeffs
#interp1d needs the independent variable to be monotonically increasing
#Join the lists together
zipped = zip(self.tau_coeffs, self.eta_coeffs, self.omega_coeffs)
#Sort the joined lists by the torque
zipped = sorted(zipped, key = operator.itemgetter(0))
#Unzip them back into the original variables
self.tau_coeffs, self.eta_coeffs, self.omega_coeffs = zip(*zipped)
self.type = 'motor_map'
[docs]
def plot_eta(self, ax):
"""
Plot eta v. torque on the given axis
"""
pass
[docs]
def plot_speed(self, ax):
"""
Plot slip speed v. torque on the given axis
"""
pass
[docs]
def invert_map(self, Wdot, kind = 'linear'):
"""
Invert the map to calculate the speed and the torque based on the power
the power is given by tau*omega
If a constant efficiency, just return (efficiency,None) tuple
"""
if not kind == 'linear':
warnings.warn('invert_map does not take parameter "kind" anymore')
if self.type == 'const_eta_motor':
return self.eta_motor,None
else:
Wdot_coeffs = [tau*omega/1000 for tau,omega in zip(self.tau_coeffs, self.omega_coeffs)]
#Do the 1D interpolation
eta_interp = interp.splrep(Wdot_coeffs, self.eta_coeffs, k=2, s=0)
eta = interp.splev(Wdot, eta_interp)
omega_interp = interp.splrep(Wdot_coeffs, self.omega_coeffs, k=2, s=0)
omega = interp.splev(Wdot, omega_interp)
return eta,omega
[docs]
def apply_map(self, tau, kind = 'linear'):
"""
Actually use the motor map to calculate the slip speed and the motor
efficiency
Parameters
----------
tau : float
Torque [N-m]
kind : string, optional
The kind of interpolation to do (see scipy.interpolate.interp1d) - deprecated
Returns
-------
eta : float
Efficiency [-]
omega : float
Rotational speed [rad/s]
"""
if not kind == 'linear':
warnings.warn('apply_map does not take parameter "kind" anymore')
eta_interp = interp.splrep(self.tau_coeffs, self.eta_coeffs, k=2, s=0)
eta = interp.splev(tau, eta_interp)
omega_interp = interp.splrep(self.tau_coeffs, self.omega_coeffs, k=2, s=0)
omega = interp.splev(tau, omega_interp)
#Return the values
return eta, omega