PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
Loading...
Searching...
No Matches
main.cpp File Reference
#include "geom/geomObjectsUtil.h"
#include "inp/deckIncludes.h"
#include "util/io.h"
#include "util/function.h"
#include "material/materialUtil.h"
#include "periDEMModel.h"
#include <cmath>
#include <filesystem>
#include <format>
#include <fstream>
#include <stdexcept>
#include <thread>
#include <vector>
Include dependency graph for main.cpp:

Go to the source code of this file.

Namespaces

namespace  anonymous_namespace{main.cpp}
 

Functions

std::string anonymous_namespace{main.cpp}::directoryPathWithTrailingSep (const std::filesystem::path &dir)
 
bool anonymous_namespace{main.cpp}::is3DGeometry (const std::string &g)
 
bool anonymous_namespace{main.cpp}::isAcceptableGeometryName (const std::string &g)
 
json anonymous_namespace{main.cpp}::buildInputJson (const std::string &geomName, const std::string &output_path_for_deck, const std::filesystem::path &mesh_file_1, const std::filesystem::path &mesh_file_2)
 
int main (int argc, char *argv[])
 

Function Documentation

◆ main()

int main ( int  argc,
char *  argv[] 
)

Definition at line 227 of file main.cpp.

227 {
228
229 util::parallel::initMpi(argc, argv);
231 util::io::print(std::format("Initialized MPI. MPI size = {}, MPI rank = {}\n", mpiSize, mpiRank));
233
234 util::io::InputParser input(argc, argv);
235
236 unsigned int nThreads;
237 if (input.cmdOptionExists("-nThreads"))
238 nThreads = std::stoi(input.getCmdOption("-nThreads"));
239 else {
240 nThreads = std::thread::hardware_concurrency();
241 util::io::print(std::format("Running test with default number of threads = {}\n", nThreads));
242 }
244 util::io::print(std::format("Number of threads = {}\n", util::parallel::getNThreads()));
245
246 namespace fs = std::filesystem;
247 const fs::path cwd = fs::current_path();
248
249 fs::path run_base = cwd;
250 if (input.cmdOptionExists("-outputDir")) {
251 fs::path p = input.getCmdOption("-outputDir");
252 run_base = p.is_absolute() ? std::move(p) : cwd / p;
253 }
254
255 fs::path inp_base = run_base;
256 if (input.cmdOptionExists("-inputDir")) {
257 fs::path p = input.getCmdOption("-inputDir");
258 inp_base = p.is_absolute() ? std::move(p) : cwd / p;
259 }
260
261 std::vector<std::string> geometriesToRun;
262 if (input.cmdOptionExists("-allGeometries")) {
263 geometriesToRun = geom::getAcceptableGeometries();
264 util::io::print("twop_general_inbuilt: -allGeometries — running full geometry list.\n");
265 } else if (input.cmdOptionExists("-geometry")) {
266 const std::string g = input.getCmdOption("-geometry");
268 throw std::runtime_error(
269 "twop_general_inbuilt: -geometry \"" + g +
270 "\" is not in geom::acceptable_geometries.");
271 geometriesToRun = {g};
272 util::io::print(std::format("twop_general_inbuilt: single geometry = {}.\n", g));
273 } else {
274 geometriesToRun = {"circle"};
275 util::io::print("twop_general_inbuilt: default geometry = circle (use -geometry <name> or -allGeometries).\n");
276 }
277
278 for (const std::string &geomName : geometriesToRun) {
279 util::io::print(std::format("--- twop_general_inbuilt: geometry = {} ---\n", geomName));
280
281 const fs::path out_dir = run_base / geomName / "out";
282 const fs::path inp_dir = inp_base / geomName / "inp";
283 fs::create_directories(out_dir);
284 fs::create_directories(inp_dir);
285
286 const std::string output_path_for_deck = directoryPathWithTrailingSep(out_dir);
287
288 const fs::path mesh1 = inp_dir / (std::string("mesh_gen_1_") + geomName + ".msh");
289 const fs::path mesh2 = inp_dir / (std::string("mesh_gen_2_") + geomName + ".msh");
290
291 auto inputJson = buildInputJson(geomName, output_path_for_deck, mesh1, mesh2);
292
293 const fs::path input_json_path = inp_dir / (std::string("input_") + geomName + ".json");
294 {
295 std::ofstream os(input_json_path);
296 if (!os)
297 throw std::runtime_error("Failed to open " + input_json_path.string() + " for writing.");
298 os << inputJson.dump(2);
299 }
300 util::io::print(std::format("Output directory (VTU, log.txt): {}\n", fs::absolute(out_dir).string()));
301 util::io::print(std::format("Input directory (input.json, meshes): {}\n", fs::absolute(inp_dir).string()));
302 util::io::print(std::format("Wrote deck to {}\n", fs::absolute(input_json_path).string()));
303
304 auto deck = std::make_shared<inp::Input>(inputJson);
305
306 PeriDEMModel dem(deck);
307 dem.run(deck);
308 }
309
310 return EXIT_SUCCESS;
311}
Input command line argument parser.
Definition inputParser.h:28
std::string directoryPathWithTrailingSep(const std::filesystem::path &dir)
Definition main.cpp:34
json buildInputJson(const std::string &geomName, const std::string &output_path_for_deck, const std::filesystem::path &mesh_file_1, const std::filesystem::path &mesh_file_2)
Definition main.cpp:65
bool isAcceptableGeometryName(const std::string &g)
Definition main.cpp:57
const std::vector< std::string > & getAcceptableGeometries()
Returns list of acceptable geometries for PeriDEM simulation.
std::string printStr(const T &msg, int nt=print_default_tab)
Returns formatted string for output.
Definition io.h:53
void print(const T &msg, int nt=print_default_tab, int printMpiRank=print_default_mpi_rank)
Prints formatted information.
Definition io.h:128
unsigned int getNThreads()
Get number of threads to be used by taskflow.
void initNThreads(unsigned int nThreads=std::thread::hardware_concurrency())
Initializes MpiStatus struct.
const MpiStatus * getMpiStatus()
Returns pointer to MpiStatus struct.
void initMpi(int argc=0, char *argv[]=nullptr)
Initializes MPI and also creates MpiStatus struct.
int mpiSize()
Get size (number) of processors.
int mpiRank()
get rank (id) of this processor

References anonymous_namespace{main.cpp}::buildInputJson(), util::io::InputParser::cmdOptionExists(), geom::getAcceptableGeometries(), util::io::InputParser::getCmdOption(), util::parallel::getMpiStatus(), util::parallel::getNThreads(), util::parallel::initMpi(), util::parallel::initNThreads(), anonymous_namespace{main.cpp}::isAcceptableGeometryName(), util::parallel::mpiRank(), util::parallel::mpiSize(), util::io::print(), and PeriDEMModel::run().

Here is the call graph for this function: