@sh.add_function(dsp, outputs=['optimal_efficiency'])
def calculate_optimal_efficiency(co2_params_calibrated, mean_piston_speeds):
"""
Calculates the optimal efficiency [-] and t.
:param co2_params_calibrated:
CO2 emission model parameters (a2, b2, a, b, c, l, l2, t, trg).
The missing parameters are set equal to zero.
:type co2_params_calibrated: lmfit.Parameters
:param mean_piston_speeds:
Mean piston speed vector [m/s].
:type mean_piston_speeds: numpy.array
:return:
Optimal efficiency and the respective parameters:
- mean_piston_speeds [m/s],
- engine_bmep [bar],
- efficiency [-].
:rtype: dict[str | tuple]
"""
# noinspection PyProtectedMember
from .engine.fc import _fuel_ABC
n_s = np.linspace(mean_piston_speeds.min(), mean_piston_speeds.max(), 10)
A, B, C = _fuel_ABC(n_s, **co2_params_calibrated)
# noinspection PyTypeChecker
b = np.isclose(A, 0.0)
# noinspection PyTypeChecker
A = np.where(b, np.sign(C) * dfl.EPS, A)
ac4, B2 = 4 * A * C, B ** 2
sabc = np.sqrt(ac4 * B2)
n = sabc - ac4
bmep = np.where(b, np.nan, 2 * C - sabc / (2 * A))
eff = n / (B - np.sqrt(B2 - sabc - n))
return dict(mean_piston_speeds=n_s, engine_bmep=bmep, efficiency=eff)