@sh.add_function(dsp, outputs=[
'motor_p4_front_electric_powers', 'motor_p4_rear_electric_powers',
'motor_p3_front_electric_powers', 'motor_p3_rear_electric_powers',
'motor_p2_electric_powers', 'motor_p2_planetary_electric_powers',
'motor_p1_electric_powers', 'motor_p0_electric_powers'
])
def predict_motors_electric_powers(
ems_data, after_treatment_warm_up_phases, hybrid_modes,
engine_speeds_out_hot, final_drive_speeds_in):
"""
Predicts motors electric power split [kW].
:param ems_data:
EMS decision data.
:type ems_data: dict
:param after_treatment_warm_up_phases:
Phases when engine is affected by the after treatment warm up [-].
:type after_treatment_warm_up_phases: numpy.array
:param hybrid_modes:
Hybrid mode status (0: EV, 1: Parallel, 2: Serial).
:type hybrid_modes: numpy.array
:param engine_speeds_out_hot:
Engine speed at hot condition [RPM].
:type engine_speeds_out_hot: numpy.array
:param final_drive_speeds_in:
Final drive speed in [RPM].
:type final_drive_speeds_in: numpy.array
:return:
Motors electric powers [kW].
:rtype: tuple[numpy.array]
"""
mode = np.where(
after_treatment_warm_up_phases & (hybrid_modes == 2), 0, hybrid_modes
)
return np.choose(mode, [
d['battery_power_split'](
d['power_bat'].ravel(), engine_speeds_out_hot, final_drive_speeds_in
) for d in (ems_data[k] for k in ('electric', 'parallel', 'serial'))
])