22int main(
int argc,
char *argv[]) {
28 moab::Core mb_instance;
29 moab::Interface &moab = mb_instance;
31 MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
33 PetscBool flg = PETSC_TRUE;
34 char mesh_file_name[255];
35#if PETSC_VERSION_GE(3, 6, 4)
41 mesh_file_name, 255, &flg);
44 if (flg != PETSC_TRUE) {
45 SETERRQ(PETSC_COMM_SELF, 1,
"*** ERROR -my_file (MESH FILE NEEDED)");
49 CHKERR moab.load_file(mesh_file_name, 0, option);
52 enum bases { AINSWORTH, DEMKOWICZ, LASBASETOP };
54 const char *list_bases[] = {
"ainsworth",
"demkowicz"};
56 PetscInt choice_base_value = AINSWORTH;
58 LASBASETOP, &choice_base_value, &flg);
60 if (flg != PETSC_TRUE) {
65 if (choice_base_value == AINSWORTH) {
67 }
else if (choice_base_value == DEMKOWICZ) {
79 CHKERR moab.create_meshset(MESHSET_SET, meshset_level0);
101 "MESH_NODE_POSITIONS");
107 "MESH_NODE_POSITIONS");
113 "MESH_NODE_POSITIONS");
119 "MESH_NODE_POSITIONS");
148 CHKERR skin.find_skin(0, tets,
false, skin_faces);
157 faces = subtract(faces, skin_faces);
161 CHKERR moab.get_adjacencies(faces, 1,
false, edges, moab::Interface::UNION);
166 CHKERR moab.get_adjacencies(skin_faces, 1,
false, skin_edges,
167 moab::Interface::UNION);
215 CHKERR VecSetRandom(
v, PETSC_NULLPTR);
218 "TEST_PROBLEM",
ROW,
v, INSERT_VALUES, SCATTER_REVERSE);
222 typedef tee_device<std::ostream, std::ofstream>
TeeDevice;
224 std::ofstream ofs(
"forces_and_sources_hdiv_continuity_check.txt");
237 mField(m_field), tH(
th) {}
248 boost::shared_ptr<const NumeredEntFiniteElement> mofem_fe =
249 getNumeredEntFiniteElementPtr();
252 .find(boost::make_tuple(
type, side))
255 int sense = side_table.get<1>()
256 .find(boost::make_tuple(
type, side))
263 int nb_dofs = data.
getN().size2() / 3;
264 for (
int dd = 0; dd < nb_dofs; dd++) {
265 for (
int ddd = 0; ddd < 3; ddd++) {
273 (
const void **)&t_ptr);
275 for (
int dd = 0; dd < 3; dd++) {
276 t_ptr[dd] += sense *
t[dd];
280 if (
type == MBEDGE) {
282 boost::shared_ptr<const NumeredEntFiniteElement> mofem_fe =
283 getNumeredEntFiniteElementPtr();
286 .find(boost::make_tuple(
type, side))
290 CHKERR mField.
get_moab().get_adjacencies(&edge, 1, 3,
false, adj_tets,
291 moab::Interface::UNION);
292 const int nb_adj_tets = adj_tets.size();
295 int nb_dofs = data.
getN().size2() / 3;
296 for (
int dd = 0; dd < nb_dofs; dd++) {
297 for (
int ddd = 0; ddd < 3; ddd++) {
305 (
const void **)&t_ptr);
307 for (
int dd = 0; dd < 3; dd++) {
308 t_ptr[dd] +=
t[dd] / nb_adj_tets;
332 gaussPts.resize(4, 4 + 6);
334 for (; ff < 4; ff++) {
336 for (; dd < 3; dd++) {
338 cblas_ddot(3, &N_tri(0, 0), 1, &
face_coords[ff][dd], 3);
344 for (; ee < 6; ee++) {
346 for (; dd < 3; dd++) {
355 }
catch (std::exception &ex) {
356 std::ostringstream ss;
357 ss <<
"throw in method: " << ex.what() <<
" at line " << __LINE__
358 <<
" in file " << __FILE__;
367 struct OpFacesSkinFluxes
378 mField(m_field), tH1(th1), tH2(th2), mySplit(my_split) {}
387 EntityHandle face = getNumeredEntFiniteElementPtr()->getEnt();
391 (
const void **)&t_ptr);
395 (
const void **)&tn_ptr);
397 *tn_ptr = getTangent1AtGaussPts()(0, 0) * t_ptr[0] +
398 getTangent1AtGaussPts()(0, 1) * t_ptr[1] +
399 getTangent1AtGaussPts()(0, 2) * t_ptr[2] +
400 getTangent2AtGaussPts()(0, 0) * t_ptr[0] +
401 getTangent2AtGaussPts()(0, 1) * t_ptr[1] +
402 getTangent2AtGaussPts()(0, 2) * t_ptr[2];
404 int nb_dofs = data.
getN().size2() / 3;
406 for (; dd < nb_dofs; dd++) {
409 -getTangent1AtGaussPts()(0, 0) * data.
getN()(0, 3 * dd + 0) *
411 getTangent1AtGaussPts()(0, 1) * data.
getN()(0, 3 * dd + 1) * val -
412 getTangent1AtGaussPts()(0, 2) * data.
getN()(0, 3 * dd + 2) * val -
413 getTangent2AtGaussPts()(0, 0) * data.
getN()(0, 3 * dd + 0) * val -
414 getTangent2AtGaussPts()(0, 1) * data.
getN()(0, 3 * dd + 1) * val -
415 getTangent2AtGaussPts()(0, 2) * data.
getN()(0, 3 * dd + 2) * val;
418 const double eps = 1e-8;
419 if (fabs(*tn_ptr) >
eps) {
421 "HCurl continuity failed %6.4e", *tn_ptr);
424 mySplit.precision(5);
425 mySplit << face <<
" " << fabs(*tn_ptr) << std::endl;
442 mField(m_field), tH1(_th1), tH2(_th2), mySplit(my_split) {}
451 EntityHandle face = getNumeredEntFiniteElementPtr()->getEnt();
455 (
const void **)&t_ptr);
459 (
const void **)&tn_ptr);
461 *tn_ptr = getTangent1AtGaussPts()(0, 0) * t_ptr[0] +
462 getTangent1AtGaussPts()(0, 1) * t_ptr[1] +
463 getTangent1AtGaussPts()(0, 2) * t_ptr[2] +
464 getTangent2AtGaussPts()(0, 0) * t_ptr[0] +
465 getTangent2AtGaussPts()(0, 1) * t_ptr[1] +
466 getTangent2AtGaussPts()(0, 2) * t_ptr[2];
468 const double eps = 1e-8;
469 if (fabs(*tn_ptr) >
eps) {
471 "HCurl continuity failed %6.4e", *tn_ptr);
474 mySplit.precision(5);
476 mySplit << face <<
" " << fabs(*tn_ptr) << std::endl;
491 gaussPts.resize(3, 1);
511 mField(m_field), tH1(_th1), tH2(_th2), mySplit(my_split) {}
520 EntityHandle edge = getNumeredEntFiniteElementPtr()->getEnt();
524 (
const void **)&t_ptr);
528 (
const void **)&tn_ptr);
530 *tn_ptr = getTangentAtGaussPts()(0, 0) * t_ptr[0] +
531 getTangentAtGaussPts()(0, 1) * t_ptr[1] +
532 getTangentAtGaussPts()(0, 2) * t_ptr[2];
535 unsigned int nb_dofs = data.
getN().size2() / 3;
538 "Number of dofs on edge and number of base functions not "
543 for (
unsigned int dd = 0; dd != nb_dofs; ++dd) {
545 tn += getTangentAtGaussPts()(0, 0) * data.
getN()(0, 3 * dd + 0) *
547 getTangentAtGaussPts()(0, 1) * data.
getN()(0, 3 * dd + 1) *
549 getTangentAtGaussPts()(0, 2) * data.
getN()(0, 3 * dd + 2) *
560 const double eps = 1e-8;
561 if (fabs(*tn_ptr) >
eps) {
563 "HCurl continuity failed %6.4e", *tn_ptr);
566 mySplit.precision(5);
568 mySplit << edge <<
" " << fabs(*tn_ptr) << std::endl;
583 gaussPts.resize(2, 1);
591 MyTetFE tet_fe(m_field);
592 MyTriFE tri_fe(m_field);
593 MyTriFE skin_fe(m_field);
594 MyEdgeFE edge_fe(m_field);
597 double def_val[] = {0, 0, 0};
598 CHKERR moab.tag_get_handle(
"T", 3, MB_TYPE_DOUBLE, th1,
599 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val);
601 auto material_grad_mat = boost::make_shared<MatrixDouble>();
602 auto material_det_vec = boost::make_shared<VectorDouble>();
603 auto material_inv_grad_mat = boost::make_shared<MatrixDouble>();
606 "MESH_NODE_POSITIONS", material_grad_mat));
608 material_grad_mat, material_det_vec, material_inv_grad_mat));
609 tet_fe.getOpPtrVector().push_back(
new OpSetHOWeights(material_det_vec));
610 tet_fe.getOpPtrVector().push_back(
612 tet_fe.getOpPtrVector().push_back(
614 tet_fe.getOpPtrVector().push_back(
new OpTetFluxes(m_field, th1));
617 CHKERR moab.tag_get_handle(
"TN", 1, MB_TYPE_DOUBLE, th2,
618 MB_TAG_CREAT | MB_TAG_SPARSE, &def_val);
620 tri_fe.getOpPtrVector().push_back(
622 tri_fe.getOpPtrVector().push_back(
625 tri_fe.getOpPtrVector().push_back(
627 tri_fe.getOpPtrVector().push_back(
630 skin_fe.getOpPtrVector().push_back(
632 skin_fe.getOpPtrVector().push_back(
634 skin_fe.getOpPtrVector().push_back(
635 new OpFacesSkinFluxes(m_field, th1, th2, my_split));
637 edge_fe.getOpPtrVector().push_back(
639 edge_fe.getOpPtrVector().push_back(
641 edge_fe.getOpPtrVector().push_back(
642 new OpEdgesFluxes(m_field, th1, th2, my_split));
644 for (Range::iterator fit = faces.begin(); fit != faces.end(); fit++) {
645 CHKERR moab.tag_set_data(th1, &*fit, 1, &def_val);
646 CHKERR moab.tag_set_data(th2, &*fit, 1, &def_val);
650 my_split <<
"internal\n";
652 my_split <<
"skin\n";
654 my_split <<
"edges\n";
658 CHKERR moab.create_meshset(MESHSET_SET, meshset);
661 CHKERR moab.write_file(
"out.vtk",
"VTK",
"", &meshset, 1);