#include "run.hpp" #include "io.hpp" #include "tug/Boundary.hpp" #include "tug/Grid.hpp" #include #include #include #include #include #include #include #include using TugType = double; using RowMajorMat = Eigen::Matrix; static inline std::vector eigenMatrix_to_vector(const Eigen::MatrixX &mat) { if (mat.IsRowMajor) { return std::vector(mat.data(), mat.data() + mat.size()); } else { std::vector out_vec(mat.size()); for (int i = 0; i < mat.rows(); i++) { for (int j = 0; j < mat.cols(); j++) { out_vec[i * mat.cols() + j] = mat(i, j); } } return out_vec; } } double run_bench(const bench_input &input, const std::string &output_file) { std::vector> raw_data = read_conc_csv(input.csv_file_init, input.ncols, input.nrows); std::vector raw_alpha_x = read_alpha_csv(input.csv_alpha_x); std::vector raw_alpha_y = read_alpha_csv(input.csv_alpha_y); Eigen::Map alpha_x(raw_alpha_x.data(), input.nrows, input.ncols); Eigen::Map alpha_y(raw_alpha_y.data(), input.nrows, input.ncols); const auto start_t = std::chrono::high_resolution_clock::now(); // create tug grids and boundary conditions for (int i = 0; i < raw_data.size(); i++) { Eigen::Map mat(raw_data[i].data(), input.nrows, input.ncols); tug::Grid grid(input.nrows, input.ncols); grid.setConcentrations(mat); grid.setDomain(input.s_x, input.s_y); grid.setAlpha(alpha_x, alpha_y); tug::Boundary boundary(grid); // set north boundary for (const auto &index : input.boundary.north_const) { boundary.setBoundaryElementConstant(tug::BC_SIDE_TOP, index, input.boundary.values[i]); } // set south boundary for (const auto &index : input.boundary.south_const) { boundary.setBoundaryElementConstant(tug::BC_SIDE_BOTTOM, index, input.boundary.values[i]); } // set east boundary for (const auto &index : input.boundary.east_const) { boundary.setBoundaryElementConstant(tug::BC_SIDE_RIGHT, index, input.boundary.values[i]); } // set west boundary for (const auto &index : input.boundary.west_const) { boundary.setBoundaryElementConstant(tug::BC_SIDE_LEFT, index, input.boundary.values[i]); } tug::Simulation sim(grid, boundary); sim.setTimestep(input.timestep); sim.setIterations(input.iterations); sim.run(); const auto &result = grid.getConcentrations(); raw_data[i] = eigenMatrix_to_vector(result); } const auto end_t = std::chrono::high_resolution_clock::now(); // write results to file if (!output_file.empty()) { write_conc_csv(output_file, raw_data); } return std::chrono::duration(end_t - start_t).count(); }