#include "bench_defs.hpp" #include "io.hpp" #include #include #include #include #include using TugType = double; void run_bench(const bench_input &input, const std::string &output_file) { std::vector> raw_data = read_conc_csv(input.csv_file_init, input.nrows, input.ncols); std::vector alpha_x_input = read_alpha_csv(input.csv_alpha_x); std::vector alpha_y_input = read_alpha_csv(input.csv_alpha_y); Eigen::Map> alpha_x(alpha_x_input.data(), input.nrows, input.ncols); Eigen::Map> alpha_y(alpha_y_input.data(), input.nrows, input.ncols); for (int i = 0; i < raw_data.size(); i++) { tug::Diffusion diffusion(raw_data[i].data(), input.nrows, input.ncols); diffusion.setAlphaX(alpha_x); diffusion.setAlphaY(alpha_y); diffusion.setDomain(input.s_x, input.s_y); diffusion.setIterations(input.iterations); diffusion.setTimestep(input.timestep); tug::Boundary &bc = diffusion.getBoundaryConditions(); // set north boundary for (const auto &index : input.boundary.north_const) { bc.setBoundaryElementConstant(tug::BC_SIDE_TOP, index, input.boundary.values[i]); } // set south boundary for (const auto &index : input.boundary.south_const) { bc.setBoundaryElementConstant(tug::BC_SIDE_BOTTOM, index, input.boundary.values[i]); } // set east boundary for (const auto &index : input.boundary.east_const) { bc.setBoundaryElementConstant(tug::BC_SIDE_RIGHT, index, input.boundary.values[i]); } // set west boundary for (const auto &index : input.boundary.west_const) { bc.setBoundaryElementConstant(tug::BC_SIDE_LEFT, index, input.boundary.values[i]); } diffusion.run(); } write_conc_csv(output_file, raw_data); std::cout << "Output written to: " << output_file << std::endl; } int main(int argc, char *argv[]) { int input_index = 0; if (argc > 1) { input_index = std::atoi(argv[1]); } else { std::cout << "Usage: " << argv[0] << " [input_index]" << std::endl; std::cout << "Available inputs:" << std::endl; std::cout << " 0 - barite_200_input (default)" << std::endl; std::cout << " 1 - barite_large_input" << std::endl; std::cout << " 2 - surfex_input" << std::endl; } switch (input_index) { case 0: std::cout << "run barite 200" << std::endl; run_bench(barite_200_input, "result_bartite_200.csv"); break; case 1: std::cout << "run barite large" << std::endl; run_bench(barite_large_input, "result_barite_large.csv"); break; case 2: std::cout << "run surfex" << std::endl; run_bench(surfex_input, "result_surfex.csv"); break; default: std::cout << "Invalid input index " << input_index << ", using default (barite_200_input)" << std::endl; run_bench(barite_200_input, "result_barite_200.csv"); break; } return 0; }