PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
Loading...
Searching...
No Matches
main.cpp File Reference
#include "inp/deckIncludes.h"
#include "material/materialUtil.h"
#include "periDEMModel.h"
#include "util/function.h"
#include "util/io.h"
#include "util/parallelUtil.h"
#include <cmath>
#include <cstdlib>
#include <filesystem>
#include <format>
#include <fstream>
#include <iomanip>
#include <memory>
#include <stdexcept>
#include <string>
#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)
 
json anonymous_namespace{main.cpp}::buildInputJson (const std::string &output_path, const std::filesystem::path &mesh_tri, const std::filesystem::path &mesh_ell, double final_time, size_t num_steps, double mesh_size, double horizon)
 
int main (int argc, char *argv[])
 

Function Documentation

◆ main()

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

Definition at line 198 of file main.cpp.

198 {
199 util::parallel::initMpi(argc, argv);
200 util::io::InputParser input(argc, argv);
201
202 unsigned int n_threads = std::thread::hardware_concurrency();
203 if (input.cmdOptionExists("-nThreads"))
204 n_threads = std::stoul(input.getCmdOption("-nThreads"));
206 util::io::print(std::format("Number of threads = {}\n", util::parallel::getNThreads()));
207
208 double final_time = 0.0030;
209 size_t num_steps = 30000;
210 if (input.cmdOptionExists("-finalTime"))
211 final_time = std::stod(input.getCmdOption("-finalTime"));
212 if (input.cmdOptionExists("-numSteps"))
213 num_steps = std::stoul(input.getCmdOption("-numSteps"));
214
215 const double mesh_size = 0.00010;
216 const double horizon = 3.0 * mesh_size;
217
218 namespace fs = std::filesystem;
219 const fs::path cwd = fs::current_path();
220 fs::path out_dir = cwd / "out";
221 fs::path inp_dir = cwd / "inp";
222 if (input.cmdOptionExists("-outputDir")) {
223 fs::path p = input.getCmdOption("-outputDir");
224 out_dir = p.is_absolute() ? std::move(p) : cwd / p;
225 }
226 if (input.cmdOptionExists("-inputDir")) {
227 fs::path p = input.getCmdOption("-inputDir");
228 inp_dir = p.is_absolute() ? std::move(p) : cwd / p;
229 } else if (input.cmdOptionExists("-outputDir")) {
230 inp_dir = out_dir.parent_path() / "inp";
231 }
232 fs::create_directories(out_dir);
233 fs::create_directories(inp_dir);
234
235 const std::string output_path = directoryPathWithTrailingSep(out_dir);
236 const fs::path mesh_tri = inp_dir / "mesh_triangle.msh";
237 const fs::path mesh_ell = inp_dir / "mesh_hollow_ellipse.msh";
238
239 auto j = buildInputJson(output_path, mesh_tri, mesh_ell, final_time, num_steps, mesh_size,
240 horizon);
241 {
242 std::ofstream ofs(inp_dir / "input.json");
243 ofs << std::setw(2) << j << std::endl;
244 }
245
246 // Hard check: deck must request a hollow ellipse, not a rectangle plate.
247 if (j["Particle"]["Set_2"]["Type"] != "ellipse_minus_ellipse")
248 throw std::runtime_error("ellipse_triangle: Particle Set_2 must be ellipse_minus_ellipse");
249
250 util::io::print(std::format(
251 "[ellipse_triangle] Type={}, T={}, Nt={}, mesh={:.4e}, out={}\n",
252 j["Particle"]["Set_2"]["Type"].get<std::string>(), final_time, num_steps, mesh_size,
253 out_dir.string()));
254
255 auto deck = std::make_shared<inp::Input>(j);
256 PeriDEMModel dem(deck);
257 dem.run(deck);
258
259 return 0;
260}
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 &output_path, const std::filesystem::path &mesh_tri, const std::filesystem::path &mesh_ell, double final_time, size_t num_steps, double mesh_size, double horizon)
Definition main.cpp:43
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.
void initMpi(int argc=0, char *argv[]=nullptr)
Initializes MPI and also creates MpiStatus struct.

References anonymous_namespace{main.cpp}::buildInputJson(), util::io::InputParser::cmdOptionExists(), anonymous_namespace{main.cpp}::directoryPathWithTrailingSep(), util::io::InputParser::getCmdOption(), util::parallel::getNThreads(), util::parallel::initMpi(), util::parallel::initNThreads(), util::io::print(), and PeriDEMModel::run().

Here is the call graph for this function: