#include "FluidSim/Scenario.hpp" #include #include #include #include using namespace fluidsim::port; int main() { std::cout << "engine_rpm,turbo,MAP_kPa,exhaust_kPa,shaft_kW,turbo_rpm,charge_kPa,charge_K,turbine_power_ripple_W,gate_mm,limited,energy_residual_J,substeps_per_frame,iterations_per_frame,wall_s,cpu_s\n"; for (float rpm : {4000.f, 7000.f}) { for (bool enabled : {false, true}) { FourStrokeScenario s(44100, FourStrokePreset::Twin, enabled); s.throttle = .7f; double map = 0, exhaust = 0, power = 0, turbo_rpm = 0, charge_p = 0, charge_t = 0, gate = 0; double min_power = 1e30, max_power = -1e30; const auto start = std::chrono::steady_clock::now(); const auto cpu_start = std::clock(); for (int i = 0; i < 2*44100; ++i) { // Ideal speed-holding dyno. The turbo remains completely free. s.crankshaft.omega = rpm*2*pi/60; s.process(); if (i >= 3*44100/2) { constexpr double samples = 22050; map += s.intake_plenum.pressure()/samples/1000; exhaust += s.exhaust_collector.pressure()/samples/1000; power += s.crankshaft.average_power/samples/1000; if (s.turbo) { const auto t = s.turbo->snapshot(); turbo_rpm += t.rpm/samples; charge_p += t.charge_pressure/samples/1000; charge_t += t.charge_temperature/samples; gate += t.wastegate_lift/samples*1000; min_power = std::min(min_power, t.turbine_power); max_power = std::max(max_power, t.turbine_power); } } } const auto t = s.turbo ? s.turbo->snapshot() : TurboSnapshot{}; const auto state = s.snapshot(); const double cpu = double(std::clock()-cpu_start)/CLOCKS_PER_SEC; const auto wall = std::chrono::duration(std::chrono::steady_clock::now()-start).count(); std::cout << rpm << ',' << enabled << ',' << map << ',' << exhaust << ',' << power << ',' << turbo_rpm << ',' << charge_p << ',' << charge_t << ',' << (enabled ? max_power-min_power : 0) << ',' << gate << ',' << t.limited_transfers << ',' << t.energy_residual << ',' << state.solver_substeps/88200.0 << ',' << state.boundary_iterations/88200.0 << ',' << wall << ',' << cpu << std::endl; } } }