497 {
499
500 const int num_nodes = gaussPts.size2();
501
502
503
504 switch (numeredEntFiniteElementPtr->getEntType()) {
505 case MBTRI:
508 &gaussPts(0, 0), &gaussPts(1, 0), num_nodes);
509 break;
510 case MBQUAD: {
512 for (int gg = 0; gg != num_nodes; gg++) {
513 double ksi = gaussPts(0, gg);
514 double eta = gaussPts(1, gg);
519 }
520 } break;
521 case MBTET: {
524 &gaussPts(0, 0), &gaussPts(1, 0),
525 &gaussPts(2, 0), num_nodes);
526 } break;
527 case MBHEX: {
529 for (int gg = 0; gg != num_nodes; gg++) {
530 double ksi = gaussPts(0, gg);
531 double eta = gaussPts(1, gg);
532 double zeta = gaussPts(2, gg);
541 }
542 } break;
543 default:
545 "Not implemented element type");
546 }
547
548
549
550
551 ReadUtilIface *iface;
552 CHKERR getPostProcMesh().query_interface(iface);
553
554 std::vector<double *> arrays;
555
557
558
559 CHKERR iface->get_node_coords(3, num_nodes, 0, startv, arrays);
560
561 mapGaussPts.resize(gaussPts.size2());
562 for (int gg = 0; gg != num_nodes; ++gg)
563 mapGaussPts[gg] = startv + gg;
564
566 int def_in_the_loop = -1;
567 CHKERR getPostProcMesh().tag_get_handle(
"NB_IN_THE_LOOP", 1, MB_TYPE_INTEGER,
568 th, MB_TAG_CREAT | MB_TAG_SPARSE,
569 &def_in_the_loop);
570
571
572
574 const int num_nodes_on_ele =
refEleMap.size2();
575
578
579
581 CHKERR iface->get_element_connect(num_el, num_nodes_on_ele, MBTRI, 0,
582 starte, conn);
584 CHKERR iface->get_element_connect(num_el, num_nodes_on_ele, MBTET, 0,
585 starte, conn);
586 else
588 "Dimension not implemented");
589
590
591
592 for (
unsigned int tt = 0; tt !=
refEleMap.size1(); ++tt) {
593 for (int nn = 0; nn != num_nodes_on_ele; ++nn)
594 conn[num_nodes_on_ele * tt + nn] = mapGaussPts[
refEleMap(tt, nn)];
595 }
596
597
598
599 CHKERR iface->update_adjacencies(starte, num_el, num_nodes_on_ele, conn);
600
601 auto physical_elements =
Range(starte, starte + num_el - 1);
602 CHKERR getPostProcMesh().tag_clear_data(
th, physical_elements, &(nInTheLoop));
603
604 EntityHandle fe_ent = numeredEntFiniteElementPtr->getEnt();
605 int fe_num_nodes;
606 {
608 mField.get_moab().get_connectivity(fe_ent, conn, fe_num_nodes, true);
609 coords.resize(3 * fe_num_nodes, false);
610 CHKERR mField.get_moab().get_coords(conn, fe_num_nodes, &coords[0]);
611 }
612
613
617
619 arrays[0], arrays[1], arrays[2]);
620 const double *t_coords_ele_x = &coords[0];
621 const double *t_coords_ele_y = &coords[1];
622 const double *t_coords_ele_z = &coords[2];
623 for (int gg = 0; gg != num_nodes; ++gg) {
625 t_coords_ele_x, t_coords_ele_y, t_coords_ele_z);
627 for (int nn = 0; nn != fe_num_nodes; ++nn) {
628 t_coords(
i) += t_n * t_ele_coords(
i);
629 for (auto ii : {0, 1, 2})
630 if (std::abs(t_coords(ii)) < std::numeric_limits<float>::epsilon())
631 t_coords(ii) = 0;
632 ++t_ele_coords;
633 ++t_n;
634 }
635 ++t_coords;
636 }
637
639}
FTensor::Index< 'i', SPACE_DIM > i
MatrixDouble shapeFunctions
double zeta
Viscous hardening.