#include "FluidSim/Scenario.hpp" #include "FluidSim/ScenarioCatalog.hpp" #include "FluidSim/TwoStrokeScenario.hpp" #include #include #include #include #include #include #include #include #include #include using namespace fluidsim::port; using Clock = std::chrono::steady_clock; template void measure_case(const ScenarioExample& definition, int density, PipeSolver solver, int repetition, int warmup_frames, int measured_frames, Scenario& scenario, std::ostream& out) { scenario.set_pipe_solver(solver); float target_rpm=7000.f; if constexpr (std::is_same_v) { scenario.set_controls(.55f, .1f, 0.f); target_rpm=definition.engine.initial_rpm > 0 ? definition.engine.initial_rpm : 4500.f; } else { scenario.set_controls(.55f, .1f, 0.f); } for (int i=0;i(Clock::now()-begin).count(); const auto& profile=scenario.profile_totals(); std::size_t cells=0; std::size_t scratch_bytes=0; for(const auto& pipe:scenario.pipes) { cells+=pipe.cells.size();scratch_bytes+=pipe.scratch_bytes(); } std::uint64_t repairs=0,fallbacks=0; for(const auto& pipe:scenario.pipes) { repairs+=pipe.positivity_repairs; fallbacks+=pipe.hllc_fallbacks; } double ms[7]{}; for(int i=0;i<7;++i) ms[i]=profile.sampled_steps ? profile.nanoseconds[i]/1e6/profile.sampled_steps : 0; out<1?argv[1]:"scenario-profile.csv"; const int warmup=argc>2?std::stoi(argv[2]):5000; const int frames=argc>3?std::stoi(argv[3]):22050; const int reps=argc>4?std::stoi(argv[4]):2; std::vector ids={"single-450","twin","five","v8-h","yz-fat","saab-chambered"}; if(argc>6 && std::string(argv[6])!="all") ids={argv[6]}; const std::vector densities=argc>5?std::vector{std::stoi(argv[5])}: std::vector{10,20,40,50,80}; std::vector solvers={PipeSolver::Rusanov,PipeSolver::Hlle,PipeSolver::Hllc,PipeSolver::Muscl}; if(argc>7) solvers={parse_pipe_solver(argv[7])}; std::ofstream file(output); if(!file) { std::cerr<<"cannot open output: "<(ids.size()*densities.size()*solvers.size()*reps); for(const auto& id:ids) for(int density:densities) for(auto solver:solvers) for(int rep=1;rep<=reps;++rep) { const auto& def=scenario_example(id); auto config=def; config.engine.cells_per_meter=static_cast(density); config.two.cells_per_meter=static_cast(density); if(def.kind==ScenarioKind::TwoStroke) { config.two.exhaust_cell_length=1.0f/density; TwoStrokeScenario scenario(44100,config.two); measure_case(def,density,solver,rep,warmup,frames,scenario,file); } else { FourStrokeScenario scenario(44100,config); measure_case(def,density,solver,rep,warmup,frames,scenario,file); } file.flush(); std::cerr<<"completed "<<++completed<<"/"<