#include "Configuration.hpp" #include #include #include "MpiEnvironment.hpp" #include #include auto Configuration::parseArgs(int argc, char* argv[], const MpiEnvironment& env) -> Configuration { // parse cmd args namespace po = boost::program_options; Configuration cfg; po::options_description desc{"Allowed options"}; desc.add_options()("help,h", "produce help message") // ("gridrows,r", po::value(&cfg.GridRows)->default_value(0), "number of rows in the grid") // ("gridcols,c", po::value(&cfg.GridColumns)->default_value(0), "number of columns in the grid") // ("file,f", po::value(&cfg.InputFilePath)->required(), "path to wireworld file"); // po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); if (vm.count("help") > 0 && env.isMaster()) { std::cout << desc << "\n"; } po::notify(vm); // if no dimensions given, use MPI_Dims_create if (cfg.GridColumns < 1 || cfg.GridRows < 1) { std::array dims{static_cast(cfg.GridColumns), static_cast(cfg.GridRows)}; MPI_Dims_create(env.worldSize(), // nnodes 2, // ndims dims.data() // dims ); cfg.GridColumns = dims[0]; cfg.GridRows = dims[1]; } // validate const auto& totalCellCount = cfg.GridColumns * cfg.GridRows; const auto& worldSize = env.worldSize(); if (totalCellCount != worldSize) { std::cerr << boost::format("Total number of cells (%d) does not match " "the MPI World size (%d)") % totalCellCount % worldSize; MPI_Abort(MPI_COMM_WORLD, EXIT_FAILURE); } return cfg; }