50 {
51
52
53 const char param_file[] = "param_file.petsc";
55
56
57 auto core_log = logging::core::get();
61 core_log->add_sink(
65
66 #ifdef ENABLE_PYTHON_BINDING
67 Py_Initialize();
68 np::initialize();
69 MOFEM_LOG(
"EP", Sev::inform) <<
"Python initialised";
70#else
71 MOFEM_LOG(
"EP", Sev::inform) <<
"Python NOT initialised";
72#endif
73
74 core_log->add_sink(
78
79 try {
80
81
82 PetscBool flg = PETSC_TRUE;
83 char mesh_file_name[255];
85 255, &flg);
87 255, &flg);
92 double time = 0;
94
95
96 MOFEM_LOG(
"EP", Sev::inform) <<
"Mesh file: " << mesh_file_name;
98 MOFEM_LOG(
"EP", Sev::inform) <<
"Time: " << time;
99
100
101 DMType dm_name = "DMMOFEM";
103 DMType dm_name_mg = "DMMOFEM_MG";
105
106
107 moab::Core moab_core;
108 moab::Interface &moab = moab_core;
109
110 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
111 if (pcomm == NULL)
112 pcomm = new ParallelComm(&moab, PETSC_COMM_WORLD);
113
114 PetscBool fully_distributed = PETSC_FALSE;
116 &fully_distributed, PETSC_NULLPTR);
117 if (fully_distributed) {
118 const char *option;
119 if (pcomm->proc_config().proc_size() == 1)
120 option = "";
121 else
122 option = "PARALLEL=READ_PART;"
123 "PARALLEL_RESOLVE_SHARED_ENTS;"
124 "PARTITION=PARALLEL_PARTITION";
125 CHKERR moab.load_file(mesh_file_name, 0, option);
126 } else {
129 }
130
131
132 MOFEM_LOG(
"EP", Sev::inform) <<
"Initialise MoFEM database";
135 MOFEM_LOG(
"EP", Sev::inform) <<
"Initialise MoFEM database <- done";
136
138
139
141
144 0, 3, bit_level0);
145
146
148
152 auto get_adj = [&](
Range ents,
int dim) {
154 CHKERR moab.get_adjacencies(ents, dim,
false, adj,
155 moab::Interface::UNION);
156 return adj;
157 };
159 *meshset_ptr,
162 2));
164 *meshset_ptr,
167 1));
169 *meshset_ptr,
172 0));
173
174
175 CHKERR ep.createCrackSurfaceMeshset();
176
177 CHKERR ep.getSpatialDispBc();
178 CHKERR ep.getSpatialRotationBc();
179 CHKERR ep.getSpatialTractionBc();
180 CHKERR ep.getSpatialTractionFreeBc();
181 CHKERR ep.getExternalStrain();
182 CHKERR ep.setBlockTagsOnSkin();
183
184 CHKERR ep.createExchangeVectors(Sev::inform);
185
186 CHKERR ep.projectInternalStress();
187 CHKERR ep.addFields(*meshset_ptr);
188 CHKERR ep.projectGeometry(*meshset_ptr);
189 CHKERR ep.addVolumeFiniteElement(*meshset_ptr);
190 CHKERR ep.addBoundaryFiniteElement(*meshset_ptr);
192
194 "stvenant_kirchhoff", "mooney_rivlin", "hencky", "neo_hookean"};
197 list_materials,
199 &choice_material, PETSC_NULLPTR);
202
203 switch (choice_material) {
205 MOFEM_LOG(
"EP", Sev::inform) <<
"StVenantKirchhoff material model";
208 break;
210 MOFEM_LOG(
"EP", Sev::inform) <<
"MooneyRivlin material model";
211 MOFEM_LOG(
"EP", Sev::inform) <<
"MU(1, 0)/2 = " <<
MU(1, 0) / 2;
215 break;
217 MOFEM_LOG(
"EP", Sev::inform) <<
"Hencky material model";
218 CHKERR ep.addMaterial_Hencky(5., 0.25);
219 break;
221 MOFEM_LOG(
"EP", Sev::inform) <<
"Neo-Hookean material model";
223 break;
224 default:
226 break;
227 }
228
230 CHKERR ep.setElasticElementToTs(ep.dmElastic);
231
234 CHKERR VecSetOption(f_elastic, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE);
235
236 PetscInt start_step = 0;
238 PetscViewer viewer;
240 FILE_MODE_READ, &viewer);
241 CHKERR VecLoad(x_elastic, viewer);
242 CHKERR PetscViewerDestroy(&viewer);
243 CHKERR VecGhostUpdateBegin(x_elastic, INSERT_VALUES, SCATTER_FORWARD);
244 CHKERR VecGhostUpdateEnd(x_elastic, INSERT_VALUES, SCATTER_FORWARD);
245
247 std::regex restart_pattern(R"(restart_([1-9]\d*)\.dat)");
248 std::smatch match;
249 if (std::regex_search(restart_file_str, match, restart_pattern)) {
250 start_step = std::stoi(match[1]);
251 } else {
253 "Restart file name must be in the format restart_##.dat");
254 }
255 }
256
257 auto ts_elastic =
createTS(PETSC_COMM_WORLD);
258 CHKERR TSSetType(ts_elastic, TSBEULER);
260 TSAdapt adapt;
261 CHKERR TSGetAdapt(ts_elastic, &adapt);
262 CHKERR TSAdaptSetType(adapt, TSADAPTNONE);
263
266 MOFEM_LOG(
"EP", Sev::inform) <<
"Solver type: TS";
267 CHKERR TSSetTime(ts_elastic, time);
268 CHKERR TSSetStepNumber(ts_elastic, start_step);
269 CHKERR ep.solveElastic(ts_elastic, x_elastic);
270 break;
272 MOFEM_LOG(
"EP", Sev::inform) <<
"Solver type: Dynamic Relaxation";
274 SCATTER_REVERSE);
275 CHKERR ep.solveDynamicRelaxation(ts_elastic, x_elastic, start_step, time);
276 break;
278 MOFEM_LOG(
"EP", Sev::inform) <<
"Solver type: Cohesive";
280 SCATTER_REVERSE);
281 CHKERR ep.solveCohesiveCrackGrowth(ts_elastic, x_elastic, start_step,
282 time);
283 break;
284 default:
286 "Unknown solver type");
287 break;
288 }
289
290 }
292
293
295
296#ifdef ENABLE_PYTHON_BINDING
297 if (Py_FinalizeEx() < 0) {
298 exit(120);
299 }
300#endif
301}
#define CATCH_ERRORS
Catch errors.
#define MYPCOMM_INDEX
default communicator number PCOMM
@ MOFEM_DATA_INCONSISTENCY
#define CHKERR
Inline error check.
PetscErrorCode DMoFEMMeshToLocalVector(DM dm, Vec l, InsertMode mode, ScatterMode scatter_mode)
set local (or ghosted) vector values on mesh for partition only
PetscErrorCode DMRegister_MoFEM(const char sname[])
Register MoFEM problem.
MoFEMErrorCode DMRegister_MGViaApproxOrders(const char sname[])
Register DM for Multi-Grid via approximation orders.
auto createDMVector(DM dm)
Get smart vector from DM.
static LoggerType & setLog(const std::string channel)
Set ans resset chanel logger.
#define MOFEM_LOG(channel, severity)
Log.
#define MOFEM_LOG_TAG(channel, tag)
Tag channel.
std::bitset< BITREFLEVEL_SIZE > BitRefLevel
Bit structure attached to each entity identifying to what mesh entity is attached.
PetscErrorCode PetscOptionsGetBool(PetscOptions *, const char pre[], const char name[], PetscBool *bval, PetscBool *set)
PetscErrorCode PetscOptionsGetScalar(PetscOptions *, const char pre[], const char name[], PetscScalar *dval, PetscBool *set)
SmartPetscObj< Vec > vectorDuplicate(Vec vec)
Create duplicate vector of smart vector.
auto createTS(MPI_Comm comm)
PetscErrorCode PetscOptionsGetEList(PetscOptions *, const char pre[], const char name[], const char *const *list, PetscInt next, PetscInt *value, PetscBool *set)
PetscErrorCode PetscOptionsGetString(PetscOptions *, const char pre[], const char name[], char str[], size_t size, PetscBool *set)
auto get_temp_meshset_ptr(moab::Interface &moab)
Create smart pointer to temporary meshset.
PetscErrorCode TSAdaptCreateMoFEM(TSAdapt adapt)
Craete MOFEM adapt.
static enum SolverType solverType
static enum MaterialModel materialModel
static Range getPartEntities(moab::Interface &moab, int part)
static MoFEMErrorCode loadFileRootProcAllRestDistributed(moab::Interface &moab, const char *file_name, int dim, LoadFileFun proc_skin_fun=defaultProcSkinFun, const char *options="PARALLEL=BCAST;PARTITION=")
Root proc has whole mesh, other procs only part of it.
virtual MPI_Comm & get_comm() const =0
static MoFEMErrorCode Initialize(int *argc, char ***args, const char file[], const char help[])
Initializes the MoFEM database PETSc, MOAB and MPI.
static MoFEMErrorCode Finalize()
Checks for options to be called at the conclusion of the program.
Deprecated interface functions.
static boost::shared_ptr< SinkType > createSink(boost::shared_ptr< std::ostream > stream_ptr, std::string comm_filter)
Create a sink object.
static boost::shared_ptr< std::ostream > getStrmWorld()
Get the strm world object.
static boost::shared_ptr< std::ostream > getStrmSync()
Get the strm sync object.
static boost::shared_ptr< std::ostream > getStrmSelf()
Get the strm self object.
Interface for managing meshsets containing materials and boundary conditions.
MoFEMErrorCode getInterface(IFACE *&iface) const
Get interface reference to pointer of interface.