@sh.add_function(dsp, outputs=['normalized_VDI253_model'], weight=2)
def define_normalized_VDI253_model(
m1000_curve_ratios, m1000_curve_norm_torques, idle_engine_speed,
engine_max_speed, k_factor_curve):
"""
Defines normalized VDI253 model function.
:param m1000_curve_ratios:
Speed ratios of m1000 curve [-].
:type m1000_curve_ratios: numpy.array
:param m1000_curve_norm_torques:
Normalized torques of m1000 curve [-].
:type m1000_curve_norm_torques: numpy.array
:param idle_engine_speed:
Idle engine speed and its standard deviation [RPM].
:type idle_engine_speed: (float, float)
:param engine_max_speed:
Maximum allowed engine speed [RPM].
:type engine_max_speed: float
:param k_factor_curve:
k factor curve.
:type k_factor_curve: callable
:return:
Normalized VDI253 model function.
:rtype: scipy.interpolate.LinearNDInterpolator
"""
from scipy.interpolate import interp1d, LinearNDInterpolator
maximum_ratio, idle = np.max(m1000_curve_ratios), idle_engine_speed[0]
eng_s = np.linspace(idle, engine_max_speed, 100)
gb_s = np.linspace(0, engine_max_speed * maximum_ratio, 250)
x, z = np.meshgrid(gb_s, eng_s)
r = x / z
b = r <= maximum_ratio
x, z, r = x[b], z[b], r[b]
func = interp1d(m1000_curve_ratios, m1000_curve_norm_torques, kind='cubic')
tout = func(r) * k_factor_curve(r) * z ** 2
return LinearNDInterpolator((x, tout), z)