41int main(
int argc,
char *argv[]) {
47 moab::Core mb_instance;
48 moab::Interface &moab = mb_instance;
50 char mesh_file_name[255];
52 PetscInt nb_sub_steps = 10;
53 PetscBool flg_file = PETSC_FALSE;
54 PetscBool is_partitioned = PETSC_FALSE;
55 PetscBool is_atom_test = PETSC_FALSE;
59 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
60 "Minimal surface area config",
"none");
61 CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
62 mesh_file_name, 255, &flg_file);
63 CHKERR PetscOptionsInt(
"-my_order",
"default approximation order",
"", 2,
65 CHKERR PetscOptionsInt(
"-my_nb_sub_steps",
"number of substeps",
"", 10,
66 &nb_sub_steps, PETSC_NULL);
67 CHKERR PetscOptionsBool(
"-my_is_partitioned",
68 "set if mesh is partitioned (this result that "
69 "each process keeps only part of the mesh",
70 "", PETSC_FALSE, &is_partitioned, PETSC_NULL);
73 "is used with testing, exit with error when diverged",
"",
74 PETSC_FALSE, &is_atom_test, PETSC_NULL);
79 if (flg_file != PETSC_TRUE) {
80 SETERRQ(PETSC_COMM_SELF, 1,
"*** ERROR -my_file (MESH FILE NEEDED)");
83 if (is_partitioned == PETSC_TRUE) {
86 option =
"PARALLEL=BCAST_DELETE;"
87 "PARALLEL_RESOLVE_SHARED_ENTS;"
88 "PARTITION=PARALLEL_PARTITION;";
89 CHKERR moab.load_file(mesh_file_name, 0, option);
93 CHKERR moab.load_file(mesh_file_name, 0, option);
95 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
97 pcomm =
new ParallelComm(&moab, PETSC_COMM_WORLD);
103 EntityHandle root_set = moab.get_root_set();
129 "MINIMAL_SURFACE_ELEMENT",
"U");
131 "MINIMAL_SURFACE_ELEMENT",
"U");
133 "MINIMAL_SURFACE_ELEMENT",
"U");
136 root_set, MBTRI,
"MINIMAL_SURFACE_ELEMENT");
143 Range bc_edges, bc_ents;
148 CHKERR moab.get_entities_by_type(root_set, MBTRI, tris,
false);
150 CHKERR skin.find_skin(root_set, tris,
false, bc_edges);
152 CHKERR moab.get_connectivity(bc_edges, bc_nodes);
153 bc_ents.merge(bc_edges);
154 bc_ents.merge(bc_nodes);
180 CHKERR DMCreate(PETSC_COMM_WORLD, &bc_dm);
181 CHKERR DMSetType(bc_dm,
"MoFEM");
186 CHKERR DMSetFromOptions(bc_dm);
193 CHKERR DMCreateGlobalVector(bc_dm, &T);
195 CHKERR DMCreateMatrix(bc_dm, &
A);
198 minimal_surface_element.
feBcEdge.getOpPtrVector().push_back(
200 minimal_surface_element.
feBcEdge.getOpPtrVector().push_back(
206 CHKERR MatAssemblyBegin(
A, MAT_FINAL_ASSEMBLY);
207 CHKERR MatAssemblyEnd(
A, MAT_FINAL_ASSEMBLY);
211 CHKERR KSPCreate(PETSC_COMM_WORLD, &solver);
212 CHKERR KSPSetOperators(solver,
A,
A);
213 CHKERR KSPSetFromOptions(solver);
216 CHKERR KSPDestroy(&solver);
220 CHKERR VecGhostUpdateBegin(T, INSERT_VALUES, SCATTER_FORWARD);
221 CHKERR VecGhostUpdateEnd(T, INSERT_VALUES, SCATTER_FORWARD);
239 CHKERR DMCreate(PETSC_COMM_WORLD, &dm);
240 CHKERR DMSetType(dm,
"MoFEM");
244 CHKERR DMSetFromOptions(dm);
255 CHKERR DMCreateGlobalVector(dm, &T);
265 auto det_ptr = boost::make_shared<VectorDouble>();
266 auto jac_ptr = boost::make_shared<MatrixDouble>();
267 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
268 minimal_surface_element.
feRhs.getOpPtrVector().push_back(
270 minimal_surface_element.
feRhs.getOpPtrVector().push_back(
273 minimal_surface_element.
feRhs.getOpPtrVector().push_back(
276 minimal_surface_element.
feRhs.getOpPtrVector().push_back(
278 minimal_surface_element.
feRhs.getOpPtrVector().push_back(
280 "U", mse_common_data,
true));
281 minimal_surface_element.
feRhs.getOpPtrVector().push_back(
286 minimal_surface_element.
feLhs.getOpPtrVector().push_back(
288 minimal_surface_element.
feLhs.getOpPtrVector().push_back(
291 minimal_surface_element.
feLhs.getOpPtrVector().push_back(
294 minimal_surface_element.
feLhs.getOpPtrVector().push_back(
296 minimal_surface_element.
feLhs.getOpPtrVector().push_back(
298 "U", mse_common_data,
false));
299 minimal_surface_element.
feLhs.getOpPtrVector().push_back(
306 &minimal_surface_element.
feRhs, PETSC_NULL,
315 &minimal_surface_element.
feLhs, PETSC_NULL,
321 SNESConvergedReason snes_reason;
326 CHKERR SNESCreate(PETSC_COMM_WORLD, &snes);
331 CHKERR SNESSetFromOptions(snes);
334 CHKERR VecDuplicate(T, &T0);
337 double step_size = 1. / nb_sub_steps;
338 for (
int ss = 1; ss <= nb_sub_steps; ss++) {
339 CHKERR VecAXPY(T, step_size, T0);
341 CHKERR SNESSolve(snes, PETSC_NULL, T);
342 CHKERR SNESGetConvergedReason(snes, &snes_reason);
344 CHKERR SNESGetIterationNumber(snes, &its);
345 CHKERR PetscPrintf(PETSC_COMM_WORLD,
346 "number of Newton iterations = %D\n\n", its);
347 if (snes_reason < 0) {
350 "atom test diverged");
356 CHKERR VecGhostUpdateBegin(T, INSERT_VALUES, SCATTER_FORWARD);
357 CHKERR VecGhostUpdateEnd(T, INSERT_VALUES, SCATTER_FORWARD);
365 CHKERR SNESDestroy(&snes);
369 PostProcFaceOnRefinedMesh post_proc(m_field);
370 CHKERR post_proc.generateReferenceElementMesh();
371 CHKERR post_proc.addFieldValuesPostProc(
"U");
375 CHKERR post_proc.postProcMesh.write_file(
"out.h5m",
"MOAB",
376 "PARALLEL=WRITE_PART");