@sh.add_function(dsp, outputs=[
'extended_cumulative_co2_emissions', 'extended_phases_integration_times'
])
def calculate_extended_cumulative_co2_emissions(
times, velocities, on_engine, extended_integration_times,
co2_normalization_references, phases_integration_times,
phases_co2_emissions, phases_distances, stop_velocity):
"""
Calculates the extended cumulative CO2 of cycle phases [CO2g].
:param times:
Time vector [s].
:type times: numpy.array
:param velocities:
Velocity vector [km/h].
:type velocities: numpy.array
:param on_engine:
If the engine is on [-].
:type on_engine: numpy.array
:param extended_integration_times:
Extended cycle phases integration times [s].
:type extended_integration_times: tuple
:param co2_normalization_references:
CO2 normalization references (e.g., engine loads) [-].
:type co2_normalization_references: numpy.array
:param phases_integration_times:
Cycle phases integration times [s].
:type phases_integration_times: tuple
:param phases_co2_emissions:
CO2 emission of cycle phases [CO2g/km].
:type phases_co2_emissions: numpy.array
:param phases_distances:
Cycle phases distances [km].
:type phases_distances: numpy.array
:param stop_velocity:
Maximum velocity to consider the vehicle stopped [km/h].
:type stop_velocity: float
:return:
Extended cumulative CO2 of cycle phases [CO2g].
:rtype: numpy.array
"""
r = co2_normalization_references.copy()
r[~on_engine] = 0
lv = np.asarray(velocities <= stop_velocity, int)
_cco2, phases = [], []
cco2 = phases_co2_emissions * phases_distances
from scipy.integrate import trapz
def _stops(n, m):
return trapz(lv[n:m], times[n:m]) / (times[m] - times[n])
for cco2, (t0, t1) in zip(cco2, phases_integration_times):
i, j = np.searchsorted(times, (t0, t1))
if i == j:
continue
v = trapz(r[i:j], times[i:j])
c, k0 = [0.0], i
p = [t for t in extended_integration_times if t0 < t < t1]
for k, t in zip(np.searchsorted(times, p), p):
if k < j and _stops(k0, k) < 0.5 and _stops(k, j) < 0.5:
phases.append((t0, t))
t0, k0 = t, k
c.append(trapz(r[i:k], times[i:k]) / v)
phases.append((t0, t1))
c.append(1.0)
_cco2.extend(np.diff(c) * cco2)
return np.array(_cco2), phases