# -*- coding: utf-8 -*-
#
# Copyright 2015-2019 European Commission (JRC);
# Licensed under the EUPL (the 'Licence');
# You may not use this work except in compliance with the Licence.
# You may obtain a copy of the Licence at: http://ec.europa.eu/idabc/eupl
"""
Functions and `dsp` model to model the gear box.
Sub-Modules:
.. currentmodule:: co2mpas.core.model.physical.gear_box
.. autosummary::
:nosignatures:
:toctree: gear_box/
at_gear
manual
cvt
mechanical
thermal
"""
import math
import functools
import numpy as np
import schedula as sh
from co2mpas.defaults import dfl
from .cvt import dsp as _cvt_model
from .at_gear import dsp as _at_gear
from .mechanical import dsp as _mechanical
from .manual import dsp as _manual
from .planet import dsp as _planet_model
from co2mpas.utils import List, reject_outliers
dsp = sh.BlueDispatcher(
name='Gear box model', description='Models the gear box.'
)
[docs]@sh.add_function(dsp, outputs=['gear_shifts'])
def calculate_gear_shifts(gears):
"""
Returns when there is a gear shifting [-].
:param gears:
Gear vector [-].
:type gears: numpy.array
:return:
When there is a gear shifting [-].
:rtype: numpy.array
"""
return np.ediff1d(gears, to_begin=[0]) != 0
[docs]@sh.add_function(dsp, outputs=['gear_box_mean_efficiency'])
def identify_gear_box_mean_efficiency(gear_box_powers_in, gear_box_powers_out):
"""
Identify gear box mean efficiency [-].
:param gear_box_powers_in:
Gear box power in vector [kW].
:type gear_box_powers_in: numpy.array
:param gear_box_powers_out:
Gear box power out vector [kW].
:type gear_box_powers_out: numpy.array
:return:
Gear box mean efficiency [-].
:rtype: float
"""
with np.errstate(divide='ignore', invalid='ignore'):
eff = gear_box_powers_out / gear_box_powers_in
b = eff > 1
eff[b] = 1 / eff[b]
return reject_outliers(eff[np.isfinite(eff) & (eff >= 0)])[0]
dsp.add_function(
function=sh.bypass,
inputs=['gear_box_mean_efficiency'],
outputs=['gear_box_mean_efficiency_guess']
)
[docs]@sh.add_function(
dsp, inputs_kwargs=True, outputs=['gear_box_mean_efficiency_guess']
)
@sh.add_function(dsp, outputs=['gear_box_mean_efficiency_guess'], weight=90)
def calculate_gear_box_mean_efficiency_guess(
motive_powers, final_drive_mean_efficiency, gear_box_loss_model, times,
gear_box_speeds_in, gear_box_speeds_out, min_engine_on_speed,
gears=None):
"""
Calculate gear box mean efficiency guess [-].
:param motive_powers:
Motive power [kW].
:type motive_powers: numpy.array
:param final_drive_mean_efficiency:
Final drive mean efficiency [-].
:type final_drive_mean_efficiency: float
:param gear_box_loss_model:
Gear box loss model.
:type gear_box_loss_model: GearBoxLosses
:param times:
Time vector [s].
:type times: numpy.array
:param gear_box_speeds_in:
Engine speed vector [RPM].
:type gear_box_speeds_in: numpy.array
:param gear_box_speeds_out:
Wheel speed vector [RPM].
:type gear_box_speeds_out: numpy.array
:param min_engine_on_speed:
Minimum engine speed to consider the engine to be on [RPM].
:type min_engine_on_speed: float
:param gears:
Gear vector [-].
:type gears: numpy.array, optional
:return:
Gear box mean efficiency guess [-].
:rtype: float
"""
from ..electrics.motors.p4 import calculate_motor_p4_electric_powers as func
powers_out = func(motive_powers, final_drive_mean_efficiency)
torques = calculate_gear_box_torques(
powers_out, gear_box_speeds_out, gear_box_speeds_in, min_engine_on_speed
)
torques_in = calculate_gear_box_efficiencies_torques_temperatures(
gear_box_loss_model, times, powers_out, gear_box_speeds_in,
gear_box_speeds_out, torques, 100, gears
)[1]
powers_in = calculate_gear_box_powers_in(torques_in, gear_box_speeds_in)
return identify_gear_box_mean_efficiency(powers_in, powers_out)
# noinspection PyPep8Naming
[docs]@sh.add_function(dsp, outputs=['gear_box_efficiency_constants'])
def get_gear_box_efficiency_constants(has_torque_converter, gear_box_type):
"""
Returns vehicle gear box efficiency constants (gbp00, gbp10, and gbp01).
:param has_torque_converter:
Does the vehicle use torque converter?
:type has_torque_converter: bool
:param gear_box_type:
Gear box type (manual or automatic or cvt).
:type gear_box_type: str
:return:
Vehicle gear box efficiency constants (gbp00, gbp10, and gbp01).
:rtype: dict
"""
PARAMS = dfl.functions.get_gear_box_efficiency_constants.PARAMS
return PARAMS[has_torque_converter and gear_box_type != 'cvt']
def _linear(x, m, q):
return x * m + q
def _get_par(obj, key, default=None):
if default is None:
default = obj
try:
return obj.get(key, default)
except AttributeError:
return default
[docs]@sh.add_function(dsp, outputs=['gear_box_efficiency_parameters_cold_hot'])
def calculate_gear_box_efficiency_parameters_cold_hot(
gear_box_efficiency_constants, engine_max_torque):
"""
Calculates the parameters of gear box efficiency model for cold/hot phases.
:param gear_box_efficiency_constants:
Vehicle gear box efficiency constants.
:type gear_box_efficiency_constants: dict
:param engine_max_torque:
Engine Max Torque [N*m].
:type engine_max_torque: float
:return:
Parameters of gear box efficiency model for cold/hot phases:
- 'hot': `gbp00`, `gbp10`, `gbp01`
- 'cold': `gbp00`, `gbp10`, `gbp01`
:rtype: dict
"""
par = {'hot': {}, 'cold': {}}
for p in ['hot', 'cold']:
for k, v in gear_box_efficiency_constants.items():
m = _get_par(_get_par(v, 'm', default=0.0), p)
q = _get_par(_get_par(v, 'q', default=0.0), p)
par[p][k] = _linear(engine_max_torque, m, q)
return par
dsp.add_data('min_engine_on_speed', dfl.values.min_engine_on_speed)
[docs]@sh.add_function(dsp, outputs=['gear_box_torques'])
def calculate_gear_box_torques(
gear_box_powers_out, gear_box_speeds_out, gear_box_speeds_in,
min_engine_on_speed):
"""
Calculates torque entering the gear box [N*m].
:param gear_box_powers_out:
Gear box power vector [kW].
:type gear_box_powers_out: numpy.array | float
:param gear_box_speeds_in:
Engine speed vector [RPM].
:type gear_box_speeds_in: numpy.array | float
:param gear_box_speeds_out:
Wheel speed vector [RPM].
:type gear_box_speeds_out: numpy.array | float
:param min_engine_on_speed:
Minimum engine speed to consider the engine to be on [RPM].
:type min_engine_on_speed: float
:return:
Torque gear box vector [N*m].
:rtype: numpy.array | float
.. note:: Torque entering the gearbox can be from engine side
(power mode or from wheels in motoring mode)
"""
if isinstance(gear_box_speeds_in, float):
if gear_box_powers_out > 0:
x = gear_box_speeds_in
else:
x = gear_box_speeds_out
if x <= min_engine_on_speed:
return 0
return gear_box_powers_out / x * 30000.0 / math.pi
else:
x = np.where(
gear_box_powers_out > 0, gear_box_speeds_in, gear_box_speeds_out
)
with np.errstate(divide='ignore', invalid='ignore'):
y = gear_box_powers_out / x
y *= 30000.0 / math.pi
return np.where(x <= min_engine_on_speed, 0, y)
dsp.add_data(
'gear_box_temperature_references',
dfl.values.gear_box_temperature_references
)
# noinspection PyPep8Naming
[docs]@sh.add_function(dsp, outputs=['gear_box_torques_in<0>'])
def calculate_gear_box_torques_in(
gear_box_torques, gear_box_speeds_in, gear_box_speeds_out,
gear_box_temperatures, gear_box_efficiency_parameters_cold_hot,
gear_box_temperature_references, min_engine_on_speed):
"""
Calculates torque required according to the temperature profile [N*m].
:param gear_box_torques:
Torque gear box vector [N*m].
:type gear_box_torques: numpy.array
:param gear_box_speeds_in:
Engine speed vector [RPM].
:type gear_box_speeds_in: numpy.array
:param gear_box_speeds_out:
Wheel speed vector [RPM].
:type gear_box_speeds_out: numpy.array
:param gear_box_temperatures:
Temperature vector [°C].
:type gear_box_temperatures: numpy.array
:param gear_box_efficiency_parameters_cold_hot:
Parameters of gear box efficiency model for cold/hot phases:
- 'hot': `gbp00`, `gbp10`, `gbp01`
- 'cold': `gbp00`, `gbp10`, `gbp01`
:type gear_box_efficiency_parameters_cold_hot: dict
:param gear_box_temperature_references:
Cold and hot reference temperatures [°C].
:type gear_box_temperature_references: tuple
:param min_engine_on_speed:
Minimum engine speed to consider the engine to be on [RPM].
:type min_engine_on_speed: float
:return:
Torque required vector according to the temperature profile [N*m].
:rtype: numpy.array
"""
par = gear_box_efficiency_parameters_cold_hot
T_cold, T_hot = gear_box_temperature_references
t_out, e_s, gb_s = gear_box_torques, gear_box_speeds_in, gear_box_speeds_out
fun = functools.partial(_gear_box_torques_in, min_engine_on_speed)
t = fun(t_out, e_s, gb_s, par['hot'])
if not T_cold == T_hot:
gbt = gear_box_temperatures
b = gbt <= T_hot
t_cold = fun(t_out[b], e_s[b], gb_s[b], par['cold'])
t[b] += (T_hot - gbt[b]) / (T_hot - T_cold) * (t_cold - t[b])
return t
def _gear_box_torques_in(
min_engine_on_speed, gear_box_torques, gear_box_speeds_in,
gear_box_speeds_out, gear_box_efficiency_parameters_cold_hot):
"""
Calculates torque required according to the temperature profile [N*m].
:param min_engine_on_speed:
Minimum engine speed to consider the engine to be on [RPM].
:type min_engine_on_speed: float
:param gear_box_torques:
Torque gear_box vector [N*m].
:type gear_box_torques: numpy.array
:param gear_box_speeds_in:
Engine speed vector [RPM].
:type gear_box_speeds_in: numpy.array
:param gear_box_speeds_out:
Wheel speed vector [RPM].
:type gear_box_speeds_out: numpy.array
:param gear_box_efficiency_parameters_cold_hot:
Parameters of gear box efficiency model:
- `gbp00`,
- `gbp10`,
- `gbp01`
:type gear_box_efficiency_parameters_cold_hot: dict
:return:
Torque required vector [N*m].
:rtype: numpy.array
"""
tgb, es, ws = gear_box_torques, gear_box_speeds_in, gear_box_speeds_out
b = (tgb < 0) & (es != 0)
y = np.zeros_like(tgb)
par = gear_box_efficiency_parameters_cold_hot
y[b] = (par['gbp01'] * tgb[b] - par['gbp10'] * ws[b] - par['gbp00']) * ws[b]
y[b] /= es[b]
b = ~b & (es > min_engine_on_speed)
b &= (ws > min_engine_on_speed)
y[b] = (tgb[b] - par['gbp10'] * es[b] - par['gbp00']) / par['gbp01']
return y
[docs]@sh.add_function(
dsp, inputs=['gear_box_torques', 'gear_box_torques_in<0>', 'gears',
'gear_box_ratios'], outputs=['gear_box_torques_in'])
def correct_gear_box_torques_in(
gear_box_torques, gear_box_torques_in, gears, gear_box_ratios):
"""
Corrects the torque when the gear box ratio is equal to 1.
:param gear_box_torques:
Torque gear_box vector [N*m].
:type gear_box_torques: numpy.array
:param gear_box_torques_in:
Torque required vector [N*m].
:type gear_box_torques_in: numpy.array
:param gears:
Gear vector [-].
:type gears: numpy.array
:param gear_box_ratios:
Gear box ratios [-].
:type gear_box_ratios: dict[int, float | int]
:return:
Corrected Torque required vector [N*m].
:rtype: numpy.array
"""
b = np.zeros_like(gears, dtype=bool)
for k, v in gear_box_ratios.items():
if v == 1:
b |= gears == k
return np.where(b, gear_box_torques, gear_box_torques_in)
dsp.add_function(
function=sh.bypass, inputs=['gear_box_torques_in<0>'],
outputs=['gear_box_torques_in'], weight=100,
)
[docs]@sh.add_function(dsp, outputs=['gear_box_efficiencies'])
def calculate_gear_box_efficiencies(
gear_box_powers_out, gear_box_speeds_in, gear_box_torques,
gear_box_torques_in, min_engine_on_speed):
"""
Calculates gear box efficiency [-].
:param gear_box_powers_out:
Power at wheels vector [kW].
:type gear_box_powers_out: numpy.array
:param gear_box_speeds_in:
Engine speed vector [RPM].
:type gear_box_speeds_in: numpy.array
:param gear_box_torques:
Torque gear_box vector [N*m].
:type gear_box_torques: numpy.array
:param gear_box_torques_in:
Torque required vector [N*m].
:type gear_box_torques_in: numpy.array
:param min_engine_on_speed:
Minimum engine speed to consider the engine to be on [RPM].
:type min_engine_on_speed: float
:return:
Gear box efficiency vector [-].
:rtype: numpy.array
"""
wp = gear_box_powers_out
tgb = gear_box_torques
tr = gear_box_torques_in
es = gear_box_speeds_in
eff = np.zeros_like(wp)
b0 = tr * tgb >= 0
b1 = b0 & (wp >= 0) & (es > min_engine_on_speed) & (tr != 0)
b = ((b0 & (wp < 0)) | b1)
eff[b] = es[b] * tr[b] / wp[b] * (math.pi / 30000)
eff[b1] = 1 / eff[b1]
return np.nan_to_num(eff)
[docs]@sh.add_function(dsp, outputs=['gear_box_torque_losses'])
def calculate_torques_losses(gear_box_torques_in, gear_box_torques):
"""
Calculates gear box torque losses [N*m].
:param gear_box_torques_in:
Torque required vector [N*m].
:type gear_box_torques_in: numpy.array | float
:param gear_box_torques:
Torque gear_box vector [N*m].
:type gear_box_torques: numpy.array | float
:return:
Gear box torques losses [N*m].
:rtype: numpy.array | float
"""
return gear_box_torques_in - gear_box_torques
# noinspection PyMissingOrEmptyDocstring
[docs]class GearBoxLosses:
[docs] def __init__(self, gear_box_efficiency_parameters_cold_hot,
equivalent_gear_box_heat_capacity,
gear_box_temperature_references, initial_gear_box_temperature,
min_engine_on_speed, gear_box_ratios=None):
par = gear_box_efficiency_parameters_cold_hot
base = dict(
equivalent_gear_box_heat_capacity=equivalent_gear_box_heat_capacity,
gear_box_efficiency_parameters_cold_hot=par,
gear_box_temperature_references=gear_box_temperature_references,
gear_box_ratios=gear_box_ratios,
min_engine_on_speed=min_engine_on_speed
)
self.initial_gear_box_temperature = initial_gear_box_temperature
# noinspection PyProtectedMember
from .thermal import _thermal
self._thermal = functools.partial(_thermal, **base)
[docs] def init_losses(self, gear_box_temperatures, times, gear_box_powers_out,
gear_box_speeds_out, gear_box_speeds_in, gears,
gear_box_torques=None):
gear_box_temperatures[0] = self.initial_gear_box_temperature
if gear_box_torques is None:
# noinspection PyUnusedLocal
def get_gear_box_torque(i):
return None
else:
def get_gear_box_torque(i):
return gear_box_torques[i]
def _next(i):
j = i + 1
dt = len(times) > j and times[j] - times[i] or 0
return self._thermal(
gear_box_temperatures[i], get_gear_box_torque(i), gears[i], dt,
gear_box_powers_out[i], gear_box_speeds_out[i],
gear_box_speeds_in[i]
)
return _next
[docs]@sh.add_function(dsp, inputs_kwargs=True, outputs=['gear_box_loss_model'])
@sh.add_function(dsp, outputs=['gear_box_loss_model'], weight=10)
def define_gear_box_loss_model(
gear_box_efficiency_parameters_cold_hot,
equivalent_gear_box_heat_capacity,
gear_box_temperature_references, initial_gear_box_temperature,
min_engine_on_speed, gear_box_ratios=None):
"""
Defines the gear box loss model.
:param gear_box_efficiency_parameters_cold_hot:
Parameters of gear box efficiency model for cold/hot phases:
- 'hot': `gbp00`, `gbp10`, `gbp01`
- 'cold': `gbp00`, `gbp10`, `gbp01`
:type gear_box_efficiency_parameters_cold_hot: dict
:param equivalent_gear_box_heat_capacity:
Equivalent gear box heat capacity [kg*J/K].
:type equivalent_gear_box_heat_capacity: float
:param gear_box_temperature_references:
Reference temperature [°C].
:type gear_box_temperature_references: (float, float)
:param initial_gear_box_temperature:
Initial gear box temperature [°C].
:type initial_gear_box_temperature: float
:param min_engine_on_speed:
Minimum engine speed to consider the engine to be on [RPM].
:type min_engine_on_speed: float
:param gear_box_ratios:
Gear box ratios [-].
:type gear_box_ratios: dict[int, float | int], optional
:return:
Gear box loss model.
:rtype: GearBoxLosses
.. note:: Torque entering the gearbox can be from engine side
(power mode or from wheels in motoring mode).
"""
model = GearBoxLosses(
gear_box_efficiency_parameters_cold_hot,
equivalent_gear_box_heat_capacity,
gear_box_temperature_references, initial_gear_box_temperature,
min_engine_on_speed, gear_box_ratios=gear_box_ratios
)
return model
_o = 'gear_box_temperatures', 'gear_box_torques_in', 'gear_box_efficiencies'
[docs]@sh.add_function(dsp, inputs_kwargs=True, outputs=_o, weight=40)
@sh.add_function(dsp, outputs=_o, weight=90)
def calculate_gear_box_efficiencies_torques_temperatures(
gear_box_loss_model, times, gear_box_powers_out, gear_box_speeds_in,
gear_box_speeds_out, gear_box_torques, engine_thermostat_temperature,
gears=None):
"""
Calculates gear box efficiency [-], torque in [N*m], and temperature [°C].
:param gear_box_loss_model:
Gear box loss model.
:type gear_box_loss_model: GearBoxLosses
:param times:
Time vector [s].
:type times: numpy.array
:param gear_box_powers_out:
Power at wheels vector [kW].
:type gear_box_powers_out: numpy.array
:param gear_box_speeds_in:
Engine speed vector [RPM].
:type gear_box_speeds_in: numpy.array
:param gear_box_speeds_out:
Wheel speed vector [RPM].
:type gear_box_speeds_out: numpy.array
:param gear_box_torques:
Torque gear_box vector [N*m].
:type gear_box_torques: numpy.array
:param engine_thermostat_temperature:
Engine thermostat temperature [°C].
:type engine_thermostat_temperature: float
:param gears:
Gear vector [-].
:type gears: numpy.array, optional
:return:
Gear box efficiency [-], torque in [N*m], and temperature [°C] vectors.
:rtype: (numpy.array, numpy.array, numpy.array)
.. note:: Torque entering the gearbox can be from engine side
(power mode or from wheels in motoring mode).
"""
temp, to_in, eff = List(), List(), List()
func = gear_box_loss_model.init_losses(
temp, times, gear_box_powers_out, gear_box_speeds_out,
gear_box_speeds_in, gears, gear_box_torques
)
for i in range(times.shape[0]):
temp[i + 1], to_in[i], eff[i] = func(i)
temp = np.minimum(engine_thermostat_temperature - 5, temp[:-1].toarray())
return temp, to_in.toarray(), eff.toarray()
[docs]@sh.add_function(dsp, outputs=['gear_box_powers_in'])
def calculate_gear_box_powers_in(gear_box_torques_in, gear_box_speeds_in):
"""
Calculates gear box power [kW].
:param gear_box_torques_in:
Torque at the wheel [N*m].
:type gear_box_torques_in: numpy.array | float
:param gear_box_speeds_in:
Rotating speed of the wheel [RPM].
:type gear_box_speeds_in: numpy.array | float
:return:
Gear box power [kW].
:rtype: numpy.array | float
"""
from ..wheels import calculate_wheel_powers
return calculate_wheel_powers(gear_box_torques_in, gear_box_speeds_in)
dsp.add_data(
'has_gear_box_thermal_management',
dfl.values.has_gear_box_thermal_management
)
[docs]@sh.add_function(dsp, outputs=['equivalent_gear_box_heat_capacity'])
def calculate_equivalent_gear_box_heat_capacity(
engine_mass, has_gear_box_thermal_management):
"""
Calculates the equivalent gear box heat capacity [kg*J/K].
:param engine_mass:
Engine mass [kg].
:type engine_mass: str
:param has_gear_box_thermal_management:
Does the gear box have some additional technology to heat up faster?
:type has_gear_box_thermal_management: bool
:return:
Equivalent gear box heat capacity [kg*J/K].
:rtype: float
"""
par = dfl.functions.calculate_engine_heat_capacity.PARAMS
heated_eng_mass = engine_mass * sum(par['heated_mass_percentage'].values())
par = dfl.functions.calculate_equivalent_gear_box_heat_capacity
par = par.PARAMS
heated_gear_box_mass = heated_eng_mass * par['gear_box_mass_engine_ratio']
if has_gear_box_thermal_management:
heated_gear_box_mass *= par['thermal_management_factor']
return par['heat_capacity']['oil'] * heated_gear_box_mass
# noinspection PyMissingOrEmptyDocstring
[docs]def is_automatic(kwargs):
return kwargs.get('gear_box_type') == 'automatic'
# noinspection PyMissingOrEmptyDocstring
[docs]def is_manual(kwargs):
b = kwargs.get('gear_box_type') == 'manual'
return b and kwargs.get('cycle_type', 'NEDC') != 'NEDC'
# noinspection PyMissingOrEmptyDocstring
[docs]def is_cvt(kwargs):
return kwargs.get('gear_box_type') == 'cvt'
# noinspection PyMissingOrEmptyDocstring
[docs]def is_planetary(kwargs):
return kwargs.get('gear_box_type') == 'planetary'
# noinspection PyMissingOrEmptyDocstring
[docs]def is_manual_or_automatic(kwargs):
return kwargs.get('gear_box_type') in ('manual', 'automatic')
dsp.add_dispatcher(
include_defaults=True,
dsp=_mechanical,
inputs=(
'accelerations', 'change_gear_window_width', 'engine_max_torque',
'engine_speed_at_max_velocity', 'engine_speeds_out', 'f0', 'on_engine',
'final_drive_ratios', 'first_gear_box_ratio', 'full_load_curve',
'gear_box_ratios', 'gear_box_speeds_out', 'gears', 'idle_engine_speed',
'last_gear_box_ratio', 'maximum_vehicle_laden_mass', 'maximum_velocity',
'n_gears', 'plateau_acceleration', 'r_dynamic', 'road_loads',
'stop_velocity', 'times', 'velocities', 'velocity_speed_ratios',
'motive_powers', 'correct_gear', 'gear_box_speeds_in',
{'gear_box_type': sh.SINK}
),
outputs=(
'engine_speed_at_max_velocity', 'first_gear_box_ratio', 'max_gear',
'gear_box_ratios', 'gear_box_speeds_in', 'gears', 'last_gear_box_ratio',
'maximum_velocity', 'speed_velocity_ratios', 'n_gears',
'velocity_speed_ratios'
),
input_domain=is_manual_or_automatic
)
dsp.add_dispatcher(
include_defaults=True,
dsp=_at_gear,
dsp_id='at_gear_shifting',
inputs=(
'CMV', 'CMV_Cold_Hot', 'DTGS', 'GSPV', 'GSPV_Cold_Hot', 'MVL', 'times',
'accelerations', 'change_gear_window_width', 'cycle_type', 'gears',
'engine_coolant_temperatures', 'engine_speeds_out', 'full_load_curve',
'fuel_saving_at_strategy', 'max_velocity_full_load_correction',
'idle_engine_speed', 'stop_velocity', 'time_cold_hot_transition',
'motive_powers', 'plateau_acceleration', 'specific_gear_shifting',
'use_dt_gear_shifting', 'velocities', 'velocity_speed_ratios',
{'gear_box_type': sh.SINK}
),
outputs=(
{
'CMV': ('CMV', 'gear_shifting_model_raw'),
'CMV_Cold_Hot': ('CMV_Cold_Hot', 'gear_shifting_model_raw'),
'DTGS': ('DTGS', 'gear_shifting_model_raw'),
'GSPV': ('GSPV', 'gear_shifting_model_raw'),
'GSPV_Cold_Hot': ('GSPV_Cold_Hot', 'gear_shifting_model_raw')
}, 'MVL', 'gears', 'specific_gear_shifting', 'correct_gear'),
input_domain=is_automatic
)
dsp.add_dispatcher(
include_defaults=True,
dsp=_manual,
dsp_id='manual_gear_shifting',
inputs=(
'cycle_type', 'full_load_speeds', 'idle_engine_speed', 'motive_powers',
'engine_max_speed', 'full_load_curve', 'engine_max_power', 'road_loads',
'velocity_speed_ratios', 'engine_speed_at_max_power', 'velocities',
'accelerations', 'times', {'gear_box_type': sh.SINK}
),
outputs=('gears', 'correct_gear', {
'MGS': ('MGS', 'gear_shifting_model_raw')
}),
input_domain=is_manual
)
dsp.add_dispatcher(
include_defaults=True,
dsp=_cvt_model,
dsp_id='cvt_model',
inputs=(
'CVT', 'accelerations', 'engine_speeds_out', 'gear_box_powers_out',
'idle_engine_speed', 'on_engine', 'stop_velocity', 'velocities',
'gear_box_speeds_in', {'gear_box_type': sh.SINK}
),
outputs=(
'gear_box_speeds_in', 'correct_gear', 'gears', 'max_gear',
'max_speed_velocity_ratio', {'CVT': ('CVT', 'gear_shifting_model')}
),
input_domain=is_cvt
)
dsp.add_dispatcher(
include_defaults=True,
dsp=_planet_model,
dsp_id='no_model',
inputs=(
'accelerations', 'engine_speeds_out', 'idle_engine_speed', 'velocities',
'stop_velocity', 'gear_box_speeds_in', 'gear_box_speeds_out',
{'gear_box_type': sh.SINK}
),
outputs=(
'max_speed_velocity_ratio', 'gear_shifting_model', 'gear_box_speeds_in',
'correct_gear', 'max_gear', 'gears',
),
input_domain=is_planetary
)
[docs]@sh.add_function(dsp, outputs=['gear_shifting_model'])
def initialize_gear_shifting_model(
gear_shifting_model_raw, velocity_speed_ratios, cycle_type):
"""
Initialize the gear shifting model.
:param gear_shifting_model_raw:
A gear shifting model (cmv or gspv or dtgs).
:type gear_shifting_model_raw: GSPV | CMV | DTGS
:param velocity_speed_ratios:
Constant velocity speed ratios of the gear box [km/(h*RPM)].
:type velocity_speed_ratios: dict[int | float]
:param cycle_type:
Cycle type (WLTP or NEDC).
:type cycle_type: str
:return:
Initialized gear shifting model (cmv or gspv or dtgs).
:rtype: GSPV | CMV | DTGS
"""
# noinspection PyProtectedMember
from .at_gear import _upgrade_gsm
gsm = gear_shifting_model_raw
return _upgrade_gsm(gsm, velocity_speed_ratios, cycle_type)