23int main(
int argc,
char *argv[]) {
28 moab::Core mb_instance;
29 moab::Interface &moab = mb_instance;
32 char mesh_file_name[255];
33 char data_file_name1[255];
34 char data_file_name2[255];
35 PetscBool flg_file = PETSC_FALSE;
37 PetscBool flg_n_part = PETSC_FALSE;
38 PetscInt n_partas = 1;
40 PetscOptionsBegin(PETSC_COMM_WORLD,
"",
"none",
"none");
41 CHKERR PetscOptionsString(
"-my_file",
"mesh file name",
"",
"mesh.h5m",
42 mesh_file_name, 255, &flg_file);
44 CHKERR PetscOptionsString(
"-my_data_x",
"data file name",
"",
"data_x.h5m",
45 data_file_name1, 255, PETSC_NULLPTR);
47 CHKERR PetscOptionsString(
"-my_data_y",
"data file name",
"",
"data_y.h5m",
48 data_file_name2, 255, PETSC_NULLPTR);
50 CHKERR PetscOptionsInt(
"-my_order",
"default approximation order",
"", 1,
51 &
order, PETSC_NULLPTR);
53 CHKERR PetscOptionsInt(
"-my_nparts",
"number of parts",
"", 1, &n_partas,
58 if (flg_file != PETSC_TRUE) {
59 SETERRQ(PETSC_COMM_SELF, 1,
"*** ERROR -my_file (MESH FILE NEEDED)");
62 if (flg_n_part != PETSC_TRUE) {
63 SETERRQ(PETSC_COMM_SELF, 1,
"*** ERROR partitioning number not given");
68 CHKERR moab.load_file(mesh_file_name, 0, option);
69 ParallelComm *pcomm = ParallelComm::get_pcomm(&moab,
MYPCOMM_INDEX);
71 pcomm =
new ParallelComm(&moab, PETSC_COMM_WORLD);
84 root_set, 3, bit_level0);
92 CHKERR meshsets_manager_ptr->getEntitiesByDimension(101,
SIDESET, 2,
128 DMType dm_name =
"DM_DISP";
131 CHKERR DMCreate(PETSC_COMM_WORLD, &dm_disp);
132 CHKERR DMSetType(dm_disp, dm_name);
137 CHKERR DMSetFromOptions(dm_disp);
148 string file1(data_file_name1);
153 string file2(data_file_name2);
162 CHKERR DMCreateMatrix(dm_disp, &
A);
168 CHKERR VecDuplicate(Fx, &Fy);
169 CHKERR VecDuplicate(Dx, &Dy);
172 CHKERR VecZeroEntries(Fx);
173 CHKERR VecZeroEntries(Fy);
176 common_data.globA =
A;
178 common_data.globF = Fx;
180 auto det_ptr = boost::make_shared<VectorDouble>();
181 auto jac_ptr = boost::make_shared<MatrixDouble>();
182 auto inv_jac_ptr = boost::make_shared<MatrixDouble>();
184 list_of_operators.push_back(
187 list_of_operators.push_back(
188 new OpCalculateLhs(
"DISP_X",
"DISP_X", common_data, data_from_files));
189 list_of_operators.push_back(
191 list_of_operators.push_back(
new OpAssembleRhs(
"DISP_X", common_data));
196 CHKERR MatAssemblyBegin(
A, MAT_FINAL_ASSEMBLY);
197 CHKERR MatAssemblyEnd(
A, MAT_FINAL_ASSEMBLY);
198 CHKERR VecGhostUpdateBegin(Fx, ADD_VALUES, SCATTER_REVERSE);
199 CHKERR VecGhostUpdateEnd(Fx, ADD_VALUES, SCATTER_REVERSE);
200 CHKERR VecAssemblyBegin(Fx);
201 CHKERR VecAssemblyEnd(Fx);
204 common_data.globF = Fy;
205 list_of_operators.clear();
207 list_of_operators.push_back(
210 list_of_operators.push_back(
212 list_of_operators.push_back(
new OpAssembleRhs(
"DISP_X", common_data));
217 CHKERR VecGhostUpdateBegin(Fy, ADD_VALUES, SCATTER_REVERSE);
218 CHKERR VecGhostUpdateEnd(Fy, ADD_VALUES, SCATTER_REVERSE);
219 CHKERR VecAssemblyBegin(Fy);
220 CHKERR VecAssemblyEnd(Fy);
230 CHKERR KSPCreate(PETSC_COMM_WORLD, &ksp);
232 CHKERR KSPSetFromOptions(ksp);
233 CHKERR KSPSolve(ksp, Fx, Dx);
234 CHKERR KSPSolve(ksp, Fy, Dy);
237 CHKERR VecGhostUpdateBegin(Dx, INSERT_VALUES, SCATTER_FORWARD);
238 CHKERR VecGhostUpdateEnd(Dx, INSERT_VALUES, SCATTER_FORWARD);
240 "DM_DISP",
COL, Dx, INSERT_VALUES, SCATTER_REVERSE);
241 CHKERR VecGhostUpdateBegin(Dy, INSERT_VALUES, SCATTER_FORWARD);
242 CHKERR VecGhostUpdateEnd(Dy, INSERT_VALUES, SCATTER_FORWARD);
244 "DM_DISP",
"DISP_X",
"DISP_Y",
COL, Dy, INSERT_VALUES, SCATTER_REVERSE);
251 sum_dx += (*dof)->getFieldData();
257 (*dof)->getFieldData() -= sum_dx;
263 sum_dy += (*dof)->getFieldData();
269 (*dof)->getFieldData() -= sum_dy;
279 auto disp_x_ptr = boost::make_shared<VectorDouble>();
280 auto disp_y_ptr = boost::make_shared<VectorDouble>();
288 {
"DISP_Y", disp_y_ptr}},
293 CHKERR post_proc.writeFile(
"out_disp.h5m");
300 CHKERR DMDestroy(&dm_disp);
303 CHKERR m_field.delete_finite_element(
"DISP_MAP_ELEMENT");
308 Range ents_1st_layer;
310 ents_1st_layer,
true);
313 CHKERR moab.get_connectivity(ents_1st_layer[0], conn, num_nodes);
316 CHKERR skin.find_skin(0, ents_1st_layer,
false, skin_edges);
318 CHKERR moab.get_adjacencies(&*ents_1st_layer.begin(), 1, 1,
false, edges);
321 CHKERR moab.add_entities(meshset, conn, 1);
322 CHKERR moab.add_entities(meshset, skin_edges);
327 CHKERR moab.get_entities_by_type(0, MBTET, tets,
false);
332 CHKERR moab.write_file(
"analysis_mesh.h5m");