779 int i, j, inode, jnode, iNode, jNode, ngb, eIndex, eInd, reg, iNum, side, cnt = 0, elems;
781 int ed_side [ 6 ] [ 2 ] = { { 3, 4 }, { 4, 2 }, { 2, 3 }, { 1, 3 }, { 1, 4 }, { 1, 2 } }, ed [ 4 ] = {
787 int side_ed [ 4 ] [ 3 ] = { { 1, 2, 3 }, { 1, 5, 4 }, { 2, 6, 5 }, { 3, 4, 6 } };
789 bool shared, boundary, iboundary, jboundary, opposite =
false;
790 Subdivision :: RS_Element *elem1, *elem2, *elem;
795#ifdef __MPI_PARALLEL_MODE
796 Subdivision :: RS_SharedEdge *edge;
799 dorig =
mesh->giveSubdivision()->giveDomain();
805 if ( !irregular_nodes.at(opp_ed [ leIndex - 1 ]) ) {
806 for ( i = 0; i < 2; i++ ) {
808 side = ed_side [ leIndex - 1 ] [ i ];
810 if (
side_leIndex.at(side) != opp_ed [ leIndex - 1 ] ) {
814 for ( j = 0; j < 3; j++ ) {
816 if ( irregular_nodes.at(side_ed [ side - 1 ] [ j ]) ) {
818 irregular_nodes.at(opp_ed [ leIndex - 1 ]) = -1;
833 ed [ cnt++ ] = leIndex;
834 for ( i = 0; i < 2; i++ ) {
836 side = ed_side [ leIndex - 1 ] [ i ];
837 for ( j = 0; j < 3; j++ ) {
839 if ( irregular_nodes.at(side_ed [ side - 1 ] [ j ]) ) {
848 irregular_nodes.at(opp_ed [ leIndex - 1 ]) = 0;
854 if ( ed [ 1 ] == ed [ 2 ] ) {
857 if ( ed [ 1 ] != opp_ed [ leIndex - 1 ] ) {
858 OOFEM_ERROR(
"unexpected situation on element %d", this->giveNumber() );
866 if (
mesh->giveNode( nodes.at(1) )->isBoundary() &&
mesh->giveNode( nodes.at(2) )->isBoundary() &&
867 mesh->giveNode( nodes.at(3) )->isBoundary() &&
mesh->giveNode( nodes.at(4) )->isBoundary() ) {
868 OOFEM_ERROR(
"quick hack not applicable due to element %d", this->giveNumber() );
874 for ( i = 0; i < cnt; i++ ) {
876 if ( !irregular_nodes.at(eIndex) ) {
883 jnode = ( eIndex < 3 ) ? inode + 1 : 1;
891 iNode = nodes.at(inode);
892 jNode = nodes.at(jnode);
894 coords = * (
mesh->giveNode(iNode)->giveCoordinates() );
895 coords.
add( *
mesh->giveNode(jNode)->giveCoordinates() );
898 double dist, rad, rate;
901 c =
mesh->giveNode(iNode)->giveCoordinates();
902 dist = c->
at(1) * c->
at(1) + c->
at(3) * c->
at(3);
903 if ( c->
at(2) > 69.9999999 ) {
905 }
else if ( c->
at(2) < 64.5000001 ) {
908 rad = 18.0 - 11.0 / 5.5 * ( c->
at(2) - 64.5 );
911 if ( fabs(dist - rad * rad) < 0.01 ) {
912 c =
mesh->giveNode(jNode)->giveCoordinates();
913 dist = c->
at(1) * c->
at(1) + c->
at(3) * c->
at(3);
914 if ( c->
at(2) > 69.9999999 ) {
916 }
else if ( c->
at(2) < 64.5000001 ) {
919 rad = 18.0 - 11.0 / 5.5 * ( c->
at(2) - 64.5 );
922 if ( fabs(dist - rad * rad) < 0.01 ) {
923 dist = coords.
at(1) * coords.
at(1) + coords.
at(3) * coords.
at(3);
924 if ( coords.
at(2) > 69.9999999 ) {
926 }
else if ( coords.
at(2) < 64.5000001 ) {
929 rad = 18.0 - 11.0 / 5.5 * ( coords.
at(2) - 64.5 );
932 rate = rad / sqrt(dist);
933 coords.
at(1) *= rate;
934 coords.
at(3) *= rate;
940 density = 0.5 * (
mesh->giveNode(iNode)->giveRequiredDensity() +
941 mesh->giveNode(jNode)->giveRequiredDensity() );
943 iNum =
mesh->giveNumberOfNodes() + 1;
944 irregular =
new Subdivision :: RS_IrregularNode(iNum,
mesh, 0, coords, density,
false);
945 mesh->addNode(irregular);
947 this->irregular_nodes.at(eIndex) = iNum;
950 #ifdef DRAW_IRREGULAR_NODES
956 #ifdef __MPI_PARALLEL_MODE
959 OOFEM_LOG_INFO(
"[%d] Irregular %d added on %d [%d] (edge %d, nodes %d %d [%d %d], nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
960 mesh->giveSubdivision()->giveRank(), iNum, this->number, this->giveGlobalNumber(), eIndex, iNode, jNode,
961 mesh->giveNode(iNode)->giveGlobalNumber(),
mesh->giveNode(jNode)->giveGlobalNumber(),
962 nodes.at(1), nodes.at(2), nodes.at(3), nodes.at(4),
963 mesh->giveNode( nodes.at(1) )->giveGlobalNumber(),
mesh->giveNode( nodes.at(2) )->giveGlobalNumber(),
964 mesh->giveNode( nodes.at(3) )->giveGlobalNumber(),
mesh->giveNode( nodes.at(4) )->giveGlobalNumber(),
965 neghbours_base_elements.at(1), neghbours_base_elements.at(2),
966 neghbours_base_elements.at(3), neghbours_base_elements.at(4),
967 irregular_nodes.at(1), irregular_nodes.at(2), irregular_nodes.at(3),
968 irregular_nodes.at(4), irregular_nodes.at(5), irregular_nodes.at(6) );
970 OOFEM_LOG_INFO(
"Irregular %d added on %d (edge %d, nodes %d %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
971 iNum, this->number, eIndex, iNode, jNode,
972 nodes.at(1), nodes.at(2), nodes.at(3), nodes.at(4),
973 neghbours_base_elements.at(1), neghbours_base_elements.at(2),
974 neghbours_base_elements.at(3), neghbours_base_elements.at(4),
975 irregular_nodes.at(1), irregular_nodes.at(2), irregular_nodes.at(3),
976 irregular_nodes.at(4), irregular_nodes.at(5), irregular_nodes.at(6) );
980 shared = boundary =
false;
982#ifdef __MPI_PARALLEL_MODE
984 if ( shared_edges.giveSize() ) {
986 if ( shared_edges.at(eIndex) ) {
987 edge =
mesh->giveEdge( shared_edges.at(eIndex) );
990 if ( !edge->givePartitions()->giveSize() ) {
991 OOFEM_ERROR(
"unshared edge %d of element %d is marked as shared",
992 shared_edges.at(eIndex), this->giveNumber() );
997 shared = boundary =
true;
1004 #ifdef __VERBOSE_PARALLEL
1005 OOFEM_LOG_INFO(
"RS_Tetra::bisect: Shared irregular detected, number %d nodes %d %d [%d %d], elem %d\n", iNum, iNode, jNode,
mesh->giveNode(iNode)->giveGlobalNumber(),
mesh->giveNode(jNode)->giveGlobalNumber(), this->number);
1008 iElems =
mesh->giveNode(iNode)->giveConnectedElements();
1009 jElems =
mesh->giveNode(jNode)->giveConnectedElements();
1023 OOFEM_ERROR(
"shared edge %d is not shared by common elements",
1024 shared_edges.at(eIndex) );
1031 for ( j = 1; j <= elems; j++ ) {
1032 elem =
mesh->giveElement( common.
at(j) );
1033 if ( elem ==
this ) {
1038 if ( !elem->giveSharedEdges()->giveSize() ) {
1039 OOFEM_ERROR(
"element %d incident to shared edge %d does not have shared edges",
1040 common.
at(j), shared_edges.at(eIndex) );
1045 eInd = elem->giveEdgeIndex(iNode, jNode);
1046 elem->setIrregular(eInd, iNum);
1048 if ( !elem->giveQueueFlag() ) {
1051 elem->setQueueFlag(
true);
1055 #ifdef __MPI_PARALLEL_MODE
1058 OOFEM_LOG_INFO(
"[%d] Irregular %d added on %d [%d] (edge %d, nodes %d %d [%d %d], nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
1059 mesh->giveSubdivision()->giveRank(), iNum,
1060 elem->giveNumber(), this->giveGlobalNumber(), eInd, iNode, jNode,
1061 mesh->giveNode(iNode)->giveGlobalNumber(),
mesh->giveNode(jNode)->giveGlobalNumber(),
1062 elem->giveNode(1), elem->giveNode(2), elem->giveNode(3), elem->giveNode(4),
1063 mesh->giveNode( elem->giveNode(1) )->giveGlobalNumber(),
1064 mesh->giveNode( elem->giveNode(2) )->giveGlobalNumber(),
1065 mesh->giveNode( elem->giveNode(3) )->giveGlobalNumber(),
1066 mesh->giveNode( elem->giveNode(4) )->giveGlobalNumber(),
1067 elem->giveNeighbor(1), elem->giveNeighbor(2), elem->giveNeighbor(3), elem->giveNeighbor(4),
1068 elem->giveIrregular(1), elem->giveIrregular(2), elem->giveIrregular(3),
1069 elem->giveIrregular(4), elem->giveIrregular(5), elem->giveIrregular(6) );
1071 OOFEM_LOG_INFO(
"Irregular %d added on %d (edge %d, nodes %d %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
1072 iNum, elem->giveNumber(), eInd, iNode, jNode,
1073 elem->giveNode(1), elem->giveNode(2), elem->giveNode(3), elem->giveNode(4),
1074 elem->giveNeighbor(1), elem->giveNeighbor(2), elem->giveNeighbor(3), elem->giveNeighbor(4),
1075 elem->giveIrregular(1), elem->giveIrregular(2), elem->giveIrregular(3),
1076 elem->giveIrregular(4), elem->giveIrregular(5), elem->giveIrregular(6) );
1086 iboundary =
mesh->giveNode(iNode)->isBoundary();
1087 jboundary =
mesh->giveNode(jNode)->isBoundary();
1089 if ( iboundary ==
true && jboundary ==
true ) {
1098 while ( elem1->giveNeighbor(ngb) ) {
1099 elem2 =
mesh->giveElement( elem1->giveNeighbor(ngb) );
1100 if ( elem2 ==
this ) {
1104 eInd = elem2->giveEdgeIndex(iNode, jNode);
1105 elem2->setIrregular(eInd, iNum);
1107 if ( !elem2->giveQueueFlag() ) {
1110 elem2->setQueueFlag(
true);
1118 if ( iboundary ==
true || jboundary ==
true ) {
1128 #ifdef __MPI_PARALLEL_MODE
1131 OOFEM_LOG_INFO(
"[%d] Irregular %d added on %d [%d] (edge %d, nodes %d %d [%d %d], nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
1132 mesh->giveSubdivision()->giveRank(), iNum,
1133 elem2->giveNumber(), this->giveGlobalNumber(), eInd, iNode, jNode,
1134 mesh->giveNode(iNode)->giveGlobalNumber(),
mesh->giveNode(jNode)->giveGlobalNumber(),
1135 elem2->giveNode(1), elem2->giveNode(2), elem2->giveNode(3), elem2->giveNode(4),
1136 mesh->giveNode( elem2->giveNode(1) )->giveGlobalNumber(),
1137 mesh->giveNode( elem2->giveNode(2) )->giveGlobalNumber(),
1138 mesh->giveNode( elem2->giveNode(3) )->giveGlobalNumber(),
1139 mesh->giveNode( elem2->giveNode(4) )->giveGlobalNumber(),
1140 elem2->giveNeighbor(1), elem2->giveNeighbor(2), elem2->giveNeighbor(3), elem2->giveNeighbor(4),
1141 elem2->giveIrregular(1), elem2->giveIrregular(2), elem2->giveIrregular(3),
1142 elem2->giveIrregular(4), elem2->giveIrregular(5), elem2->giveIrregular(6) );
1144 OOFEM_LOG_INFO(
"Irregular %d added on %d (edge %d, nodes %d %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
1145 iNum, elem2->giveNumber(), eInd, iNode, jNode,
1146 elem2->giveNode(1), elem2->giveNode(2), elem2->giveNode(3), elem2->giveNode(4),
1147 elem2->giveNeighbor(1), elem2->giveNeighbor(2), elem2->giveNeighbor(3), elem2->giveNeighbor(4),
1148 elem2->giveIrregular(1), elem2->giveIrregular(2), elem2->giveIrregular(3),
1149 elem2->giveIrregular(4), elem2->giveIrregular(5), elem2->giveIrregular(6) );
1154 if ( elem2->giveNeighbor(1) == elem1->giveNumber() ) {
1160 if ( elem2->giveNeighbor(eInd - 2) == elem1->giveNumber() ) {
1161 ngb = ( eInd > 4 ) ? eInd - 3 : 4;
1170 if ( elem2 !=
this ) {
1173 if ( coords.
at(1) > 0.000001 && coords.
at(1) < 1999.99999 &&
1174 coords.
at(2) > 0.000001 && coords.
at(2) < 249.99999 &&
1175 coords.
at(3) > 0.000001 && coords.
at(3) < 499.99999 ) {
1176 if ( 987.5 - coords.
at(1) > 0.000001 || coords.
at(1) - 1012.5 > 0.000001 || 300.0 - coords.
at(3) > 0.000001 ) {
1177 OOFEM_ERROR(
"Irregular %d [%d %d] not on boundary", iNum, iNode, jNode);
1190 iElems =
mesh->giveNode(iNode)->giveConnectedElements();
1192 mesh->giveNode(iNode)->buildTopLevelNodeConnectivity(
mesh->giveSubdivision()->giveDomain()->giveConnectivityTable() );
1195 jElems =
mesh->giveNode(jNode)->giveConnectedElements();
1197 mesh->giveNode(jNode)->buildTopLevelNodeConnectivity(
mesh->giveSubdivision()->giveDomain()->giveConnectivityTable() );
1212 OOFEM_ERROR(
"local outer edge %d %d is not shared by common elements",
1222 for ( j = 1; j <= elems; j++ ) {
1223 elem =
mesh->giveElement( common.
at(j) );
1224 if ( elem ==
this ) {
1228 eInd = elem->giveEdgeIndex(iNode, jNode);
1229 if ( !elem->giveIrregular(eInd) ) {
1230 elem->setIrregular(eInd, iNum);
1233 #ifdef __MPI_PARALLEL_MODE
1236 OOFEM_LOG_INFO(
"[%d] Irregular %d added on %d [%d] (edge %d, nodes %d %d [%d %d], nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
1237 mesh->giveSubdivision()->giveRank(), iNum,
1238 elem->giveNumber(), this->giveGlobalNumber(), eInd, iNode, jNode,
1239 mesh->giveNode(iNode)->giveGlobalNumber(),
mesh->giveNode(jNode)->giveGlobalNumber(),
1240 elem->giveNode(1), elem->giveNode(2), elem->giveNode(3), elem->giveNode(4),
1241 mesh->giveNode( elem->giveNode(1) )->giveGlobalNumber(),
1242 mesh->giveNode( elem->giveNode(2) )->giveGlobalNumber(),
1243 mesh->giveNode( elem->giveNode(3) )->giveGlobalNumber(),
1244 mesh->giveNode( elem->giveNode(4) )->giveGlobalNumber(),
1245 elem->giveNeighbor(1), elem->giveNeighbor(2), elem->giveNeighbor(3), elem->giveNeighbor(4),
1246 elem->giveIrregular(1), elem->giveIrregular(2), elem->giveIrregular(3),
1247 elem->giveIrregular(4), elem->giveIrregular(5), elem->giveIrregular(6) );
1249 OOFEM_LOG_INFO(
"Irregular %d added on %d (edge %d, nodes %d %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
1250 iNum, elem->giveNumber(), eInd, iNode, jNode,
1251 elem->giveNode(1), elem->giveNode(2), elem->giveNode(3), elem->giveNode(4),
1252 elem->giveNeighbor(1), elem->giveNeighbor(2), elem->giveNeighbor(3), elem->giveNeighbor(4),
1253 elem->giveIrregular(1), elem->giveIrregular(2), elem->giveIrregular(3),
1254 elem->giveIrregular(4), elem->giveIrregular(5), elem->giveIrregular(6) );
1258 if ( !elem->giveQueueFlag() ) {
1261 elem->setQueueFlag(
true);
1275 this->setQueueFlag(
false);
1283 if ( this->queue_flag ) {
1284 OOFEM_ERROR(
"unexpected queue flag of %d ", this->number);
1291 if ( irregular_nodes.containsOnlyZeroes() ) {
1295 int i, ind, nIrregulars = 0;
1296 int childNum, iedge, jedge, kedge, inode, jnode, knode;
1298 Subdivision :: RS_Triangle *child;
1299 Subdivision :: RS_Element *ngb;
1300#ifdef __MPI_PARALLEL_MODE
1301 bool ishared =
false, jshared =
false, kshared =
false;
1304 for ( i = 1; i <= irregular_nodes.giveSize(); i++ ) {
1305 if ( irregular_nodes.at(i) ) {
1310 this->children.resize(nIrregulars + 1);
1326 jedge = ( iedge < 3 ) ? iedge + 1 : 1;
1327 kedge = ( jedge < 3 ) ? jedge + 1 : 1;
1329 inode = ( iedge > 1 ) ? iedge - 1 : 3;
1330 jnode = ( inode < 3 ) ? inode + 1 : 1;
1331 knode = ( jnode < 3 ) ? jnode + 1 : 1;
1333#ifdef __MPI_PARALLEL_MODE
1334 if ( shared_edges.giveSize() ) {
1335 if ( shared_edges.at(iedge) ) {
1339 if ( shared_edges.at(jedge) ) {
1343 if ( shared_edges.at(kedge) ) {
1350 if ( irregular_nodes.at(iedge) && irregular_nodes.at(jedge) && irregular_nodes.at(kedge) ) {
1351 _nodes.
at(1) = nodes.at(inode);
1352 _nodes.
at(2) = irregular_nodes.at(kedge);
1353 _nodes.
at(3) = irregular_nodes.at(iedge);
1354 childNum =
mesh->giveNumberOfElements() + 1;
1355 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1356 mesh->addElement(child);
1357 children.at(1) = childNum;
1359 child->setNeighbor( 1, -this->giveNeighbor(kedge) );
1360 child->setNeighbor(2, childNum + 2);
1361 child->setNeighbor(3, childNum + 1);
1362#ifdef __MPI_PARALLEL_MODE
1365 child->makeSharedEdges();
1366 child->setSharedEdge( 1, shared_edges.at(kedge) );
1371 _nodes.
at(1) = nodes.at(inode);
1372 _nodes.
at(2) = irregular_nodes.at(iedge);
1373 _nodes.
at(3) = irregular_nodes.at(jedge);
1374 childNum =
mesh->giveNumberOfElements() + 1;
1375 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1376 mesh->addElement(child);
1377 children.at(2) = childNum;
1379 child->setNeighbor(1, childNum - 1);
1380 child->setNeighbor(2, childNum + 2);
1381 child->setNeighbor( 3, -this->giveNeighbor(jedge) );
1382#ifdef __MPI_PARALLEL_MODE
1385 child->makeSharedEdges();
1386 child->setSharedEdge( 3, shared_edges.at(jedge) );
1391 _nodes.
at(1) = nodes.at(jnode);
1392 _nodes.
at(2) = irregular_nodes.at(iedge);
1393 _nodes.
at(3) = irregular_nodes.at(kedge);
1394 childNum =
mesh->giveNumberOfElements() + 1;
1395 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1396 mesh->addElement(child);
1397 children.at(3) = childNum;
1399 child->setNeighbor( 1, -this->giveNeighbor(iedge) );
1400 child->setNeighbor(2, childNum - 2);
1401 child->setNeighbor( 3, -this->giveNeighbor(kedge) );
1402#ifdef __MPI_PARALLEL_MODE
1404 if ( ishared || kshared ) {
1405 child->makeSharedEdges();
1407 child->setSharedEdge( 1, shared_edges.at(iedge) );
1411 child->setSharedEdge( 3, shared_edges.at(kedge) );
1417 _nodes.
at(1) = nodes.at(knode);
1418 _nodes.
at(2) = irregular_nodes.at(jedge);
1419 _nodes.
at(3) = irregular_nodes.at(iedge);
1420 childNum =
mesh->giveNumberOfElements() + 1;
1421 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1422 mesh->addElement(child);
1423 children.at(4) = childNum;
1425 child->setNeighbor( 1, -this->giveNeighbor(jedge) );
1426 child->setNeighbor(2, childNum - 2);
1427 child->setNeighbor( 3, -this->giveNeighbor(iedge) );
1429#ifdef __MPI_PARALLEL_MODE
1431 if ( ishared || jshared ) {
1432 child->makeSharedEdges();
1434 child->setSharedEdge( 3, shared_edges.at(iedge) );
1438 child->setSharedEdge( 1, shared_edges.at(jedge) );
1444#ifdef __MPI_PARALLEL_MODE
1447 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
1448 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 2);
1449 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 3);
1453 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
1454 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
1458 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
1459 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
1463 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum);
1464 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 1);
1465 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 2);
1466 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 3);
1470 mesh->giveNode( irregular_nodes.at(jedge) )->insertConnectedElement(childNum);
1471 mesh->giveNode( irregular_nodes.at(jedge) )->insertConnectedElement(childNum - 2);
1475 mesh->giveNode( irregular_nodes.at(kedge) )->insertConnectedElement(childNum - 1);
1476 mesh->giveNode( irregular_nodes.at(kedge) )->insertConnectedElement(childNum - 3);
1480 }
else if ( irregular_nodes.at(iedge) && irregular_nodes.at(jedge) ) {
1481 _nodes.
at(1) = nodes.at(inode);
1482 _nodes.
at(2) = nodes.at(jnode);
1483 _nodes.
at(3) = irregular_nodes.at(iedge);
1484 childNum =
mesh->giveNumberOfElements() + 1;
1485 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1486 mesh->addElement(child);
1487 children.at(1) = childNum;
1489 child->setNeighbor( 1, -this->giveNeighbor(kedge) );
1490 child->setNeighbor( 2, -this->giveNeighbor(iedge) );
1491 child->setNeighbor(3, childNum + 1);
1492#ifdef __MPI_PARALLEL_MODE
1494 if ( ishared || kshared ) {
1495 child->makeSharedEdges();
1497 child->setSharedEdge( 2, shared_edges.at(iedge) );
1501 child->setSharedEdge( 1, shared_edges.at(kedge) );
1507 _nodes.
at(1) = nodes.at(inode);
1508 _nodes.
at(2) = irregular_nodes.at(iedge);
1509 _nodes.
at(3) = irregular_nodes.at(jedge);
1510 childNum =
mesh->giveNumberOfElements() + 1;
1511 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1512 mesh->addElement(child);
1513 children.at(2) = childNum;
1515 child->setNeighbor(1, childNum - 1);
1516 child->setNeighbor(2, childNum + 1);
1517 child->setNeighbor( 3, -this->giveNeighbor(jedge) );
1518#ifdef __MPI_PARALLEL_MODE
1521 child->makeSharedEdges();
1522 child->setSharedEdge( 3, shared_edges.at(jedge) );
1527 _nodes.
at(1) = nodes.at(knode);
1528 _nodes.
at(2) = irregular_nodes.at(jedge);
1529 _nodes.
at(3) = irregular_nodes.at(iedge);
1530 childNum =
mesh->giveNumberOfElements() + 1;
1531 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1532 mesh->addElement(child);
1533 children.at(3) = childNum;
1535 child->setNeighbor( 1, -this->giveNeighbor(jedge) );
1536 child->setNeighbor(2, childNum - 1);
1537 child->setNeighbor( 3, -this->giveNeighbor(iedge) );
1538#ifdef __MPI_PARALLEL_MODE
1540 if ( ishared || jshared ) {
1541 child->makeSharedEdges();
1543 child->setSharedEdge( 3, shared_edges.at(iedge) );
1547 child->setSharedEdge( 1, shared_edges.at(jedge) );
1553#ifdef __MPI_PARALLEL_MODE
1556 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
1557 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 1);
1558 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 2);
1562 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
1563 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 2);
1567 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
1568 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
1572 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum);
1573 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 1);
1574 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 2);
1578 mesh->giveNode( irregular_nodes.at(jedge) )->insertConnectedElement(childNum);
1579 mesh->giveNode( irregular_nodes.at(jedge) )->insertConnectedElement(childNum - 1);
1583 }
else if ( irregular_nodes.at(iedge) && irregular_nodes.at(kedge) ) {
1584 _nodes.
at(1) = nodes.at(inode);
1585 _nodes.
at(2) = irregular_nodes.at(kedge);
1586 _nodes.
at(3) = irregular_nodes.at(iedge);
1587 childNum =
mesh->giveNumberOfElements() + 1;
1588 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1589 mesh->addElement(child);
1590 children.at(1) = childNum;
1592 child->setNeighbor( 1, -this->giveNeighbor(kedge) );
1593 child->setNeighbor(2, childNum + 1);
1594 child->setNeighbor(3, childNum + 2);
1595#ifdef __MPI_PARALLEL_MODE
1598 child->makeSharedEdges();
1599 child->setSharedEdge( 1, shared_edges.at(kedge) );
1604 _nodes.
at(1) = nodes.at(jnode);
1605 _nodes.
at(2) = irregular_nodes.at(iedge);
1606 _nodes.
at(3) = irregular_nodes.at(kedge);
1607 childNum =
mesh->giveNumberOfElements() + 1;
1608 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1609 mesh->addElement(child);
1610 children.at(2) = childNum;
1612 child->setNeighbor( 1, -this->giveNeighbor(iedge) );
1613 child->setNeighbor(2, childNum - 1);
1614 child->setNeighbor( 3, -this->giveNeighbor(kedge) );
1615#ifdef __MPI_PARALLEL_MODE
1617 if ( ishared || kshared ) {
1618 child->makeSharedEdges();
1620 child->setSharedEdge( 1, shared_edges.at(iedge) );
1624 child->setSharedEdge( 3, shared_edges.at(kedge) );
1630 _nodes.
at(1) = nodes.at(inode);
1631 _nodes.
at(2) = irregular_nodes.at(iedge);
1632 _nodes.
at(3) = nodes.at(knode);
1633 childNum =
mesh->giveNumberOfElements() + 1;
1634 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1635 mesh->addElement(child);
1636 children.at(3) = childNum;
1638 child->setNeighbor(1, childNum - 2);
1639 child->setNeighbor( 2, -this->giveNeighbor(iedge) );
1640 child->setNeighbor( 3, -this->giveNeighbor(jedge) );
1641#ifdef __MPI_PARALLEL_MODE
1643 if ( ishared || jshared ) {
1644 child->makeSharedEdges();
1646 child->setSharedEdge( 2, shared_edges.at(iedge) );
1650 child->setSharedEdge( 3, shared_edges.at(jedge) );
1656#ifdef __MPI_PARALLEL_MODE
1659 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
1660 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum);
1661 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 2);
1665 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
1666 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
1670 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
1671 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
1675 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum);
1676 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 1);
1677 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 2);
1681 mesh->giveNode( irregular_nodes.at(kedge) )->insertConnectedElement(childNum - 1);
1682 mesh->giveNode( irregular_nodes.at(kedge) )->insertConnectedElement(childNum - 2);
1686 }
else if ( irregular_nodes.at(iedge) ) {
1687 _nodes.
at(1) = nodes.at(inode);
1688 _nodes.
at(2) = nodes.at(jnode);
1689 _nodes.
at(3) = irregular_nodes.at(iedge);
1690 childNum =
mesh->giveNumberOfElements() + 1;
1691 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1692 mesh->addElement(child);
1693 children.at(1) = childNum;
1695 child->setNeighbor( 1, -this->giveNeighbor(kedge) );
1696 child->setNeighbor( 2, -this->giveNeighbor(iedge) );
1697 child->setNeighbor(3, childNum + 1);
1698#ifdef __MPI_PARALLEL_MODE
1700 if ( ishared || kshared ) {
1701 child->makeSharedEdges();
1703 child->setSharedEdge( 2, shared_edges.at(iedge) );
1707 child->setSharedEdge( 1, shared_edges.at(kedge) );
1713 _nodes.
at(1) = nodes.at(inode);
1714 _nodes.
at(2) = irregular_nodes.at(iedge);
1715 _nodes.
at(3) = nodes.at(knode);
1716 childNum =
mesh->giveNumberOfElements() + 1;
1717 child =
new Subdivision :: RS_Triangle(childNum,
mesh, this->number, _nodes);
1718 mesh->addElement(child);
1719 children.at(2) = childNum;
1721 child->setNeighbor(1, childNum - 1);
1722 child->setNeighbor( 2, -this->giveNeighbor(iedge) );
1723 child->setNeighbor( 3, -this->giveNeighbor(jedge) );
1724#ifdef __MPI_PARALLEL_MODE
1726 if ( ishared || jshared ) {
1727 child->makeSharedEdges();
1729 child->setSharedEdge( 2, shared_edges.at(iedge) );
1733 child->setSharedEdge( 3, shared_edges.at(jedge) );
1739#ifdef __MPI_PARALLEL_MODE
1742 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
1743 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum);
1744 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 1);
1748 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
1749 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
1753 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
1754 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
1758 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum);
1759 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 1);
1764 OOFEM_ERROR(
"element %d internal data inconsistency", this->number);
1769 for ( i = 1; i <= 3; i++ ) {
1770 if ( this->neghbours_base_elements.at(i) ) {
1772 if ( this->neghbours_base_elements.at(i) < 0 ) {
1773 OOFEM_ERROR(
"negative neighbor of %d not expected", this->number);
1778 ngb =
mesh->giveElement( this->neghbours_base_elements.at(i) );
1779 if ( !ngb->hasIrregulars() ) {
1780 ind = ngb->giveNeighbors()->findFirstIndexOf(this->number);
1782 ngb->setNeighbor(ind, -this->number);
1795 if ( this->queue_flag ) {
1796 OOFEM_ERROR(
"unexpected queue flag of %d ", this->number);
1805 if ( irregular_nodes.containsOnlyZeroes() ) {
1809 int irregulars1 = 0, irregulars2 = 0;
1810 int childNum, iedge, jedge, kedge, iiedge, jjedge, kkedge, inode, jnode, knode, nnode, iside, jside, kside, nside;
1811 int i, ind, leIndex1 = 0, leIndex2 = 0;
1813 Subdivision :: RS_Tetra *child;
1814 Subdivision :: RS_Element *ngb;
1815#ifdef __MPI_PARALLEL_MODE
1816 int eNum = this->
mesh->giveNumberOfEdges();
1817 Subdivision :: RS_SharedEdge *_edge;
1818 bool ishared =
false, jshared =
false, kshared =
false;
1819 bool iishared =
false, jjshared =
false, kkshared =
false;
1843 if ( leIndex <= 3 ) {
1846 iedge = ( leIndex == 6 ) ? 1 : leIndex - 2;
1849 jedge = ( iedge < 3 ) ? iedge + 1 : 1;
1850 kedge = ( jedge < 3 ) ? jedge + 1 : 1;
1852 inode = ( iedge > 1 ) ? iedge - 1 : 3;
1853 jnode = ( inode < 3 ) ? inode + 1 : 1;
1854 knode = ( jnode < 3 ) ? jnode + 1 : 1;
1866 this->children.resize(2);
1868#ifdef __MPI_PARALLEL_MODE
1869 if ( shared_edges.giveSize() ) {
1870 if ( shared_edges.at(iedge) ) {
1874 if ( shared_edges.at(jedge) ) {
1878 if ( shared_edges.at(kedge) ) {
1882 if ( shared_edges.at(iiedge) ) {
1886 if ( shared_edges.at(jjedge) ) {
1890 if ( shared_edges.at(kkedge) ) {
1897 if ( leIndex <= 3 ) {
1901 if ( irregular_nodes.at(iiedge) ) {
1904 leIndex1 = leIndex2 = 4;
1907 if ( irregular_nodes.at(kedge) ) {
1912 if ( irregular_nodes.at(jjedge) ) {
1917 if ( irregular_nodes.at(jedge) ) {
1922 if ( irregular_nodes.at(kkedge) ) {
1927 if ( irregulars1 > 1 ) {
1931 if ( leIndex1 == jjedge ) {
1933 }
else if ( leIndex1 == kedge ) {
1937 if ( leIndex1 != iiedge ) {
1938 OOFEM_ERROR(
"side longest edge inconsistency on %d", this->number);
1946 if ( irregulars2 > 1 ) {
1950 if ( leIndex2 == kkedge ) {
1952 }
else if ( leIndex2 == jedge ) {
1956 if ( leIndex2 != iiedge ) {
1957 OOFEM_ERROR(
"side longest edge inconsistency on %d", this->number);
1965#ifdef __MPI_PARALLEL_MODE
1966 int i_shared_id = 0, n_shared_id = 0;
1971 if ( !this->giveNeighbor(nside) ) {
1972 _edge =
new Subdivision :: RS_SharedEdge(this->
mesh);
1973 _edge->setEdgeNodes( irregular_nodes.at(iedge), nodes.at(inode) );
1975 this->
mesh->addEdge(_edge);
1981 if ( _edge->giveSharedPartitions(partitions) ) {
1983 _edge->setPartitions(partitions);
1991 if ( !this->giveNeighbor(iside) ) {
1992 _edge =
new Subdivision :: RS_SharedEdge(this->
mesh);
1993 _edge->setEdgeNodes( irregular_nodes.at(iedge), nodes.at(nnode) );
1995 this->
mesh->addEdge(_edge);
2001 if ( _edge->giveSharedPartitions(partitions) ) {
2003 _edge->setPartitions(partitions);
2013 _nodes.
at(1) = nodes.at(inode);
2014 _nodes.
at(2) = nodes.at(jnode);
2015 _nodes.
at(3) = irregular_nodes.at(iedge);
2016 _nodes.
at(4) = nodes.at(nnode);
2017 childNum =
mesh->giveNumberOfElements() + 1;
2018 child =
new Subdivision :: RS_Tetra(childNum,
mesh, this->number, _nodes);
2019 mesh->addElement(child);
2020 children.at(1) = childNum;
2023 if ( irregulars1 ) {
2024 child->setNeighbor( 1, this->giveNeighbor(nside) );
2025 child->setNeighbor( 2, this->giveNeighbor(kside) );
2026 child->setNeighbor( 3, this->giveNeighbor(iside) );
2028 child->setIrregular( 1, irregular_nodes.at(kedge) );
2029 child->setIrregular( 5, irregular_nodes.at(jjedge) );
2030 child->setIrregular( 4, irregular_nodes.at(iiedge) );
2032 child->setNeighbor( 1, -this->giveNeighbor(nside) );
2033 child->setNeighbor( 2, -this->giveNeighbor(kside) );
2034 child->setNeighbor( 3, -this->giveNeighbor(iside) );
2038 child->setNeighbor(4, childNum + 1);
2040#ifdef __MPI_PARALLEL_MODE
2042 if ( ishared || kshared || iishared || jjshared ) {
2043 child->makeSharedEdges();
2045 child->setSharedEdge( 2, shared_edges.at(iedge) );
2049 child->setSharedEdge( 1, shared_edges.at(kedge) );
2053 child->setSharedEdge( 4, shared_edges.at(iiedge) );
2057 child->setSharedEdge( 5, shared_edges.at(jjedge) );
2060 child->setSharedEdge(3, i_shared_id);
2061 child->setSharedEdge(6, n_shared_id);
2067 #ifdef __MPI_PARALLEL_MODE
2068 OOFEM_LOG_INFO(
"[%d] Child %d generated on parent %d [%d] (leIndex %d, nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d [%d %d %d %d %d %d])\n",
2069 mesh->giveSubdivision()->giveRank(), childNum,
2070 this->number, this->giveGlobalNumber(), this->leIndex,
2071 _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2072 mesh->giveNode( _nodes.
at(1) )->giveGlobalNumber(),
2073 mesh->giveNode( _nodes.
at(2) )->giveGlobalNumber(),
2074 mesh->giveNode( _nodes.
at(3) )->giveGlobalNumber(),
2075 mesh->giveNode( _nodes.
at(4) )->giveGlobalNumber(),
2076 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2077 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2078 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6),
2079 ( child->giveIrregular(1) ) ?
mesh->giveNode( child->giveIrregular(1) )->giveGlobalNumber() : 0,
2080 ( child->giveIrregular(2) ) ?
mesh->giveNode( child->giveIrregular(2) )->giveGlobalNumber() : 0,
2081 ( child->giveIrregular(3) ) ?
mesh->giveNode( child->giveIrregular(3) )->giveGlobalNumber() : 0,
2082 ( child->giveIrregular(4) ) ?
mesh->giveNode( child->giveIrregular(4) )->giveGlobalNumber() : 0,
2083 ( child->giveIrregular(5) ) ?
mesh->giveNode( child->giveIrregular(5) )->giveGlobalNumber() : 0,
2084 ( child->giveIrregular(6) ) ?
mesh->giveNode( child->giveIrregular(6) )->giveGlobalNumber() : 0);
2086 OOFEM_LOG_INFO(
"Child %d generated on parent %d (leIndex %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
2087 childNum, this->number, this->leIndex, _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2088 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2089 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2090 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6) );
2094 _nodes.
at(1) = nodes.at(inode);
2095 _nodes.
at(2) = irregular_nodes.at(iedge);
2096 _nodes.
at(3) = nodes.at(knode);
2097 _nodes.
at(4) = nodes.at(nnode);
2098 childNum =
mesh->giveNumberOfElements() + 1;
2099 child =
new Subdivision :: RS_Tetra(childNum,
mesh, this->number, _nodes);
2100 mesh->addElement(child);
2101 children.at(2) = childNum;
2104 if ( irregulars2 ) {
2105 child->setNeighbor( 1, this->giveNeighbor(nside) );
2106 child->setNeighbor( 3, this->giveNeighbor(iside) );
2107 child->setNeighbor( 4, this->giveNeighbor(jside) );
2109 child->setIrregular( 3, irregular_nodes.at(jedge) );
2110 child->setIrregular( 6, irregular_nodes.at(kkedge) );
2111 child->setIrregular( 4, irregular_nodes.at(iiedge) );
2113 child->setNeighbor( 1, -this->giveNeighbor(nside) );
2114 child->setNeighbor( 3, -this->giveNeighbor(iside) );
2115 child->setNeighbor( 4, -this->giveNeighbor(jside) );
2119 child->setNeighbor(2, childNum - 1);
2120#ifdef __MPI_PARALLEL_MODE
2122 if ( ishared || jshared || iishared || kkshared ) {
2123 child->makeSharedEdges();
2125 child->setSharedEdge( 2, shared_edges.at(iedge) );
2129 child->setSharedEdge( 3, shared_edges.at(jedge) );
2133 child->setSharedEdge( 4, shared_edges.at(iiedge) );
2137 child->setSharedEdge( 6, shared_edges.at(kkedge) );
2140 child->setSharedEdge(1, i_shared_id);
2141 child->setSharedEdge(5, n_shared_id);
2146#ifdef __MPI_PARALLEL_MODE
2149 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
2150 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum);
2151 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 1);
2155 mesh->giveNode( nodes.at(nnode) )->eraseConnectedElement( this->giveNumber() );
2156 mesh->giveNode( nodes.at(nnode) )->insertConnectedElement(childNum);
2157 mesh->giveNode( nodes.at(nnode) )->insertConnectedElement(childNum - 1);
2161 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
2162 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
2166 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
2167 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
2171 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum);
2172 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 1);
2178 #ifdef __MPI_PARALLEL_MODE
2179 OOFEM_LOG_INFO(
"[%d] Child %d generated on parent %d [%d] (leIndex %d, nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d [%d %d %d %d %d %d])\n",
2180 mesh->giveSubdivision()->giveRank(), childNum,
2181 this->number, this->giveGlobalNumber(), this->leIndex,
2182 _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2183 mesh->giveNode( _nodes.
at(1) )->giveGlobalNumber(),
2184 mesh->giveNode( _nodes.
at(2) )->giveGlobalNumber(),
2185 mesh->giveNode( _nodes.
at(3) )->giveGlobalNumber(),
2186 mesh->giveNode( _nodes.
at(4) )->giveGlobalNumber(),
2187 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2188 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2189 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6),
2190 ( child->giveIrregular(1) ) ?
mesh->giveNode( child->giveIrregular(1) )->giveGlobalNumber() : 0,
2191 ( child->giveIrregular(2) ) ?
mesh->giveNode( child->giveIrregular(2) )->giveGlobalNumber() : 0,
2192 ( child->giveIrregular(3) ) ?
mesh->giveNode( child->giveIrregular(3) )->giveGlobalNumber() : 0,
2193 ( child->giveIrregular(4) ) ?
mesh->giveNode( child->giveIrregular(4) )->giveGlobalNumber() : 0,
2194 ( child->giveIrregular(5) ) ?
mesh->giveNode( child->giveIrregular(5) )->giveGlobalNumber() : 0,
2195 ( child->giveIrregular(6) ) ?
mesh->giveNode( child->giveIrregular(6) )->giveGlobalNumber() : 0);
2197 OOFEM_LOG_INFO(
"Child %d generated on parent %d (leIndex %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
2198 childNum, this->number, this->leIndex, _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2199 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2200 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2201 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6) );
2206#ifdef __MPI_PARALLEL_MODE
2209 if (
mesh->giveNode( irregular_nodes.at(iedge) )->giveNumber() < 0 ) {
2212 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum);
2213 mesh->giveNode( irregular_nodes.at(iedge) )->insertConnectedElement(childNum - 1);
2218#ifdef __MPI_PARALLEL_MODE
2221 if (
mesh->giveNode( nodes.at(jnode) )->giveConnectedElements()->giveSize() ) {
2222 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
2223 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
2226#ifdef __MPI_PARALLEL_MODE
2230#ifdef __MPI_PARALLEL_MODE
2233 if (
mesh->giveNode( nodes.at(knode) )->giveConnectedElements()->giveSize() ) {
2234 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
2235 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
2238#ifdef __MPI_PARALLEL_MODE
2241#ifdef __MPI_PARALLEL_MODE
2244#ifdef __MPI_PARALLEL_MODE
2249#ifdef __MPI_PARALLEL_MODE
2252 if (
mesh->giveNode( nodes.at(inode) )->giveConnectedElements()->giveSize() ) {
2253 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
2254 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum);
2255 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 1);
2258#ifdef __MPI_PARALLEL_MODE
2261#ifdef __MPI_PARALLEL_MODE
2264 if (
mesh->giveNode( nodes.at(nnode) )->giveConnectedElements()->giveSize() ) {
2265 mesh->giveNode( nodes.at(nnode) )->eraseConnectedElement( this->giveNumber() );
2266 mesh->giveNode( nodes.at(nnode) )->insertConnectedElement(childNum);
2267 mesh->giveNode( nodes.at(nnode) )->insertConnectedElement(childNum - 1);
2270#ifdef __MPI_PARALLEL_MODE
2273#ifdef __MPI_PARALLEL_MODE
2280 if ( irregular_nodes.at(iedge) ) {
2283 leIndex1 = leIndex2 = 2;
2286 if ( irregular_nodes.at(jedge) ) {
2291 if ( irregular_nodes.at(kedge) ) {
2296 if ( irregular_nodes.at(jjedge) ) {
2301 if ( irregular_nodes.at(kkedge) ) {
2306 if ( irregulars1 > 1 ) {
2310 if ( leIndex1 == jedge ) {
2312 }
else if ( leIndex1 == kedge ) {
2316 if ( leIndex1 != iedge ) {
2317 OOFEM_ERROR(
"side longest edge inconsistency on %d", this->number);
2325 if ( irregulars2 > 1 ) {
2329 if ( leIndex2 == kkedge ) {
2331 }
else if ( leIndex2 == jjedge ) {
2335 if ( leIndex2 != iedge ) {
2336 OOFEM_ERROR(
"side longest edge inconsistency on %d", this->number);
2344#ifdef __MPI_PARALLEL_MODE
2345 int j_shared_id = 0, k_shared_id = 0;
2350 if ( !this->giveNeighbor(kside) ) {
2351 _edge =
new Subdivision :: RS_SharedEdge(this->
mesh);
2352 _edge->setEdgeNodes( irregular_nodes.at(iiedge), nodes.at(jnode) );
2354 this->
mesh->addEdge(_edge);
2360 if ( _edge->giveSharedPartitions(partitions) ) {
2362 _edge->setPartitions(partitions);
2370 if ( !this->giveNeighbor(jside) ) {
2371 _edge =
new Subdivision :: RS_SharedEdge(this->
mesh);
2372 _edge->setEdgeNodes( irregular_nodes.at(iiedge), nodes.at(knode) );
2374 this->
mesh->addEdge(_edge);
2380 if ( _edge->giveSharedPartitions(partitions) ) {
2382 _edge->setPartitions(partitions);
2392 _nodes.
at(1) = nodes.at(inode);
2393 _nodes.
at(2) = nodes.at(jnode);
2394 _nodes.
at(3) = nodes.at(knode);
2395 _nodes.
at(4) = irregular_nodes.at(iiedge);
2396 childNum =
mesh->giveNumberOfElements() + 1;
2397 child =
new Subdivision :: RS_Tetra(childNum,
mesh, this->number, _nodes);
2398 mesh->addElement(child);
2399 children.at(1) = childNum;
2401 if ( irregulars1 ) {
2402 child->setNeighbor( 1, this->giveNeighbor(nside) );
2403 child->setNeighbor( 2, this->giveNeighbor(kside) );
2404 child->setNeighbor( 4, this->giveNeighbor(jside) );
2406 child->setIrregular( 1, irregular_nodes.at(kedge) );
2407 child->setIrregular( 3, irregular_nodes.at(jedge) );
2408 child->setIrregular( 2, irregular_nodes.at(iedge) );
2410 child->setNeighbor( 1, -this->giveNeighbor(nside) );
2411 child->setNeighbor( 2, -this->giveNeighbor(kside) );
2412 child->setNeighbor( 4, -this->giveNeighbor(jside) );
2416 child->setNeighbor(3, childNum + 1);
2417#ifdef __MPI_PARALLEL_MODE
2419 if ( ishared || jshared || kshared || iishared ) {
2420 child->makeSharedEdges();
2422 child->setSharedEdge( 2, shared_edges.at(iedge) );
2426 child->setSharedEdge( 3, shared_edges.at(jedge) );
2430 child->setSharedEdge( 1, shared_edges.at(kedge) );
2434 child->setSharedEdge( 4, shared_edges.at(iiedge) );
2437 child->setSharedEdge(5, j_shared_id);
2438 child->setSharedEdge(6, k_shared_id);
2444 #ifdef __MPI_PARALLEL_MODE
2445 OOFEM_LOG_INFO(
"[%d] Child %d generated on parent %d [%d] (leIndex %d, nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d [%d %d %d %d %d %d])\n",
2446 mesh->giveSubdivision()->giveRank(), childNum,
2447 this->number, this->giveGlobalNumber(), this->leIndex,
2448 _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2449 mesh->giveNode( _nodes.
at(1) )->giveGlobalNumber(),
2450 mesh->giveNode( _nodes.
at(2) )->giveGlobalNumber(),
2451 mesh->giveNode( _nodes.
at(3) )->giveGlobalNumber(),
2452 mesh->giveNode( _nodes.
at(4) )->giveGlobalNumber(),
2453 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2454 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2455 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6),
2456 ( child->giveIrregular(1) ) ?
mesh->giveNode( child->giveIrregular(1) )->giveGlobalNumber() : 0,
2457 ( child->giveIrregular(2) ) ?
mesh->giveNode( child->giveIrregular(2) )->giveGlobalNumber() : 0,
2458 ( child->giveIrregular(3) ) ?
mesh->giveNode( child->giveIrregular(3) )->giveGlobalNumber() : 0,
2459 ( child->giveIrregular(4) ) ?
mesh->giveNode( child->giveIrregular(4) )->giveGlobalNumber() : 0,
2460 ( child->giveIrregular(5) ) ?
mesh->giveNode( child->giveIrregular(5) )->giveGlobalNumber() : 0,
2461 ( child->giveIrregular(6) ) ?
mesh->giveNode( child->giveIrregular(6) )->giveGlobalNumber() : 0);
2463 OOFEM_LOG_INFO(
"Child %d generated on parent %d (leIndex %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
2464 childNum, this->number, this->leIndex, _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2465 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2466 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2467 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6) );
2471 _nodes.
at(1) = irregular_nodes.at(iiedge);
2472 _nodes.
at(2) = nodes.at(jnode);
2473 _nodes.
at(3) = nodes.at(knode);
2474 _nodes.
at(4) = nodes.at(nnode);
2475 childNum =
mesh->giveNumberOfElements() + 1;
2476 child =
new Subdivision :: RS_Tetra(childNum,
mesh, this->number, _nodes);
2477 mesh->addElement(child);
2478 children.at(2) = childNum;
2481 if ( irregulars2 ) {
2482 child->setNeighbor( 2, this->giveNeighbor(kside) );
2483 child->setNeighbor( 3, this->giveNeighbor(iside) );
2484 child->setNeighbor( 4, this->giveNeighbor(jside) );
2486 child->setIrregular( 5, irregular_nodes.at(jjedge) );
2487 child->setIrregular( 6, irregular_nodes.at(kkedge) );
2488 child->setIrregular( 2, irregular_nodes.at(iedge) );
2490 child->setNeighbor( 2, -this->giveNeighbor(kside) );
2491 child->setNeighbor( 3, -this->giveNeighbor(iside) );
2492 child->setNeighbor( 4, -this->giveNeighbor(jside) );
2496 child->setNeighbor(1, childNum - 1);
2497#ifdef __MPI_PARALLEL_MODE
2499 if ( ishared || jjshared || kkshared || iishared ) {
2500 child->makeSharedEdges();
2502 child->setSharedEdge( 2, shared_edges.at(iedge) );
2506 child->setSharedEdge( 5, shared_edges.at(jjedge) );
2510 child->setSharedEdge( 6, shared_edges.at(kkedge) );
2514 child->setSharedEdge( 4, shared_edges.at(iiedge) );
2517 child->setSharedEdge(1, j_shared_id);
2518 child->setSharedEdge(3, k_shared_id);
2523#ifdef __MPI_PARALLEL_MODE
2526 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
2527 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum);
2528 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
2532 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
2533 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
2534 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum - 1);
2538 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
2539 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 1);
2543 mesh->giveNode( nodes.at(nnode) )->eraseConnectedElement( this->giveNumber() );
2544 mesh->giveNode( nodes.at(nnode) )->insertConnectedElement(childNum);
2548 mesh->giveNode( irregular_nodes.at(iiedge) )->insertConnectedElement(childNum);
2549 mesh->giveNode( irregular_nodes.at(iiedge) )->insertConnectedElement(childNum - 1);
2555 #ifdef __MPI_PARALLEL_MODE
2556 OOFEM_LOG_INFO(
"[%d] Child %d generated on parent %d [%d] (leIndex %d, nds %d %d %d %d [%d %d %d %d], ngbs %d %d %d %d, irr %d %d %d %d %d %d [%d %d %d %d %d %d])\n",
2557 mesh->giveSubdivision()->giveRank(), childNum,
2558 this->number, this->giveGlobalNumber(), this->leIndex,
2559 _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2560 mesh->giveNode( _nodes.
at(1) )->giveGlobalNumber(),
2561 mesh->giveNode( _nodes.
at(2) )->giveGlobalNumber(),
2562 mesh->giveNode( _nodes.
at(3) )->giveGlobalNumber(),
2563 mesh->giveNode( _nodes.
at(4) )->giveGlobalNumber(),
2564 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2565 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2566 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6),
2567 ( child->giveIrregular(1) ) ?
mesh->giveNode( child->giveIrregular(1) )->giveGlobalNumber() : 0,
2568 ( child->giveIrregular(2) ) ?
mesh->giveNode( child->giveIrregular(2) )->giveGlobalNumber() : 0,
2569 ( child->giveIrregular(3) ) ?
mesh->giveNode( child->giveIrregular(3) )->giveGlobalNumber() : 0,
2570 ( child->giveIrregular(4) ) ?
mesh->giveNode( child->giveIrregular(4) )->giveGlobalNumber() : 0,
2571 ( child->giveIrregular(5) ) ?
mesh->giveNode( child->giveIrregular(5) )->giveGlobalNumber() : 0,
2572 ( child->giveIrregular(6) ) ?
mesh->giveNode( child->giveIrregular(6) )->giveGlobalNumber() : 0);
2574 OOFEM_LOG_INFO(
"Child %d generated on parent %d (leIndex %d, nds %d %d %d %d, ngbs %d %d %d %d, irr %d %d %d %d %d %d)\n",
2575 childNum, this->number, this->leIndex, _nodes.
at(1), _nodes.
at(2), _nodes.
at(3), _nodes.
at(4),
2576 child->giveNeighbor(1), child->giveNeighbor(2), child->giveNeighbor(3), child->giveNeighbor(4),
2577 child->giveIrregular(1), child->giveIrregular(2), child->giveIrregular(3),
2578 child->giveIrregular(4), child->giveIrregular(5), child->giveIrregular(6) );
2583#ifdef __MPI_PARALLEL_MODE
2586 if (
mesh->giveNode( irregular_nodes.at(iiedge) )->giveNumber() < 0 ) {
2589 mesh->giveNode( irregular_nodes.at(iiedge) )->insertConnectedElement(childNum);
2590 mesh->giveNode( irregular_nodes.at(iiedge) )->insertConnectedElement(childNum - 1);
2595#ifdef __MPI_PARALLEL_MODE
2598 if (
mesh->giveNode( nodes.at(inode) )->giveConnectedElements()->giveSize() ) {
2599 mesh->giveNode( nodes.at(inode) )->eraseConnectedElement( this->giveNumber() );
2600 mesh->giveNode( nodes.at(inode) )->insertConnectedElement(childNum - 1);
2603#ifdef __MPI_PARALLEL_MODE
2606#ifdef __MPI_PARALLEL_MODE
2609 if (
mesh->giveNode( nodes.at(nnode) )->giveConnectedElements()->giveSize() ) {
2610 mesh->giveNode( nodes.at(nnode) )->eraseConnectedElement( this->giveNumber() );
2611 mesh->giveNode( nodes.at(nnode) )->insertConnectedElement(childNum);
2614#ifdef __MPI_PARALLEL_MODE
2617#ifdef __MPI_PARALLEL_MODE
2620#ifdef __MPI_PARALLEL_MODE
2625#ifdef __MPI_PARALLEL_MODE
2628 if (
mesh->giveNode( nodes.at(jnode) )->giveConnectedElements()->giveSize() ) {
2629 mesh->giveNode( nodes.at(jnode) )->eraseConnectedElement( this->giveNumber() );
2630 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum);
2631 mesh->giveNode( nodes.at(jnode) )->insertConnectedElement(childNum - 1);
2634#ifdef __MPI_PARALLEL_MODE
2637#ifdef __MPI_PARALLEL_MODE
2640 if (
mesh->giveNode( nodes.at(knode) )->giveConnectedElements()->giveSize() ) {
2641 mesh->giveNode( nodes.at(knode) )->eraseConnectedElement( this->giveNumber() );
2642 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum);
2643 mesh->giveNode( nodes.at(knode) )->insertConnectedElement(childNum - 1);
2646#ifdef __MPI_PARALLEL_MODE
2649#ifdef __MPI_PARALLEL_MODE
2654 if ( irregulars1 ) {
2656 if ( !
mesh->giveElement( children.at(1) )->giveIrregular(leIndex1) ) {
2657 OOFEM_ERROR(
"leIndex incosistency for child 1 of %d", this->number);
2661 mesh->giveElement( children.at(1) )->setLeIndex(leIndex1);
2665 if ( irregulars2 ) {
2667 if ( !
mesh->giveElement( children.at(2) )->giveIrregular(leIndex2) ) {
2668 OOFEM_ERROR(
"leIndex incosistency for child 2 of %d", this->number);
2672 mesh->giveElement( children.at(2) )->setLeIndex(leIndex2);
2678 for ( i = 1; i <= 4; i++ ) {
2679 if ( this->neghbours_base_elements.at(i) ) {
2681 if ( this->neghbours_base_elements.at(i) < 0 ) {
2682 OOFEM_ERROR(
"negative neighbor of %d not expected", this->number);
2687 ngb =
mesh->giveElement( this->neghbours_base_elements.at(i) );
2688 if ( !ngb->hasIrregulars() ) {
2689 ind = ngb->giveNeighbors()->findFirstIndexOf(this->number);
2691 ngb->setNeighbor(ind, -this->number);
3384Subdivision :: createMesh(
TimeStep *tStep,
int domainNumber,
int domainSerNum,
Domain **dNew)
3387 int parent, nnodes =
domain->giveNumberOfDofManagers(), nelems =
domain->giveNumberOfElements();
3389 Subdivision :: RS_Node *_node;
3390 Subdivision :: RS_Element *_element;
3399 mesh =
new Subdivision :: RS_Mesh(
this);
3404 for (
int i = 1; i <= nnodes; i++ ) {
3405 _node =
new Subdivision :: RS_Node( i,
mesh, i,
domain->giveNode ( i )->giveCoordinates(),
3406 domain->giveErrorEstimator ( )->giveRemeshingCrit ( )->giveRequiredDofManDensity ( i, tStep ),
3407 domain->giveNode ( i )->isBoundary() );
3408 _node->setGlobalNumber(
domain->giveNode(i)->giveGlobalNumber() );
3409#ifdef __MPI_PARALLEL_MODE
3410 _node->setParallelMode(
domain->giveNode(i)->giveParallelMode() );
3411 _node->setPartitions( *
domain->giveNode(i)->givePartitionList() );
3413 this->
mesh->addNode(_node);
3419 for (
int i = 1; i <= nelems; i++ ) {
3420 if (
domain->giveElement(i)->giveGeometryType() == EGT_triangle_1 ) {
3422 for (
int j = 1; j <= 3; j++ ) {
3423 enodes.
at(j) =
domain->giveElement(i)->giveDofManagerNumber(j);
3426 _element =
new Subdivision :: RS_Triangle(i,
mesh, i, enodes);
3427 }
else if (
domain->giveElement(i)->giveGeometryType() == EGT_tetra_1 ) {
3429 for (
int j = 1; j <= 4; j++ ) {
3430 enodes.
at(j) =
domain->giveElement(i)->giveDofManagerNumber(j);
3433 _element =
new Subdivision :: RS_Tetra(i,
mesh, i, enodes);
3435 OOFEM_ERROR(
"Unsupported element geometry (element %d)", i);
3437 _element->setGlobalNumber(
domain->giveElement(i)->giveGlobalNumber() );
3438#ifdef __MPI_PARALLEL_MODE
3439 _element->setParallelMode(
domain->giveElement(i)->giveParallelMode() );
3441 this->
mesh->addElement(_element);
3446 for (
int i = 1; i <= nelems; i++ ) {
3447#ifdef __MPI_PARALLEL_MODE
3453 this->
mesh->giveElement(i)->importConnectivity(
domain->giveConnectivityTable() );
3456#ifdef __MPI_PARALLEL_MODE
3459 this->
mesh->initGlobalSharedNodeMap();
3460 for (
int i = 1; i <= nnodes; i++ ) {
3461 _node = this->
mesh->giveNode(i);
3466 _node->importConnectivity(
domain->giveConnectivityTable() );
3467 this->
mesh->insertGlobalSharedNodeMap(_node);
3472 for (
int i = 1; i <= nnodes; i++ ) {
3473 _node = this->
mesh->giveNode(i);
3478 _node->numberSharedEdges();
3482 for (
int i = 1; i <=
mesh->giveNumberOfEdges(); i++ ) {
3483 if (
mesh->giveEdge(i)->givePartitions()->giveSize() ) {
3493 #ifdef DRAW_MESH_BEFORE_BISECTION
3494 nelems =
mesh->giveNumberOfElements();
3495 for (
int i = 1; i <= nelems; i++ ) {
3496 #ifdef __MPI_PARALLEL_MODE
3502 mesh->giveElement(i)->drawGeometry();
3505 ESIEventLoop(YES,
"Before bisection; Press Ctrl-p to continue");
3515 if ( nnodes !=
mesh->giveNumberOfNodes() ) {
3521 #ifdef DRAW_MESH_AFTER_BISECTION
3522 nelems =
mesh->giveNumberOfElements();
3523 for (
int i = 1; i <= nelems; i++ ) {
3524 if ( !
mesh->giveElement(i)->isTerminal() ) {
3528 #ifdef __MPI_PARALLEL_MODE
3534 mesh->giveElement(i)->drawGeometry();
3537 ESIEventLoop(YES, (
char*)
"After bisection; Press Ctrl-p to continue");
3546 nnodes =
mesh->giveNumberOfNodes();
3547 ( * dNew ) =
new Domain( 2,
domain->giveSerialNumber() + 1,
domain->giveEngngModel() );
3548 ( * dNew )->setDomainType(
domain->giveDomainType() );
3551 ( * dNew )->resizeDofManagers(nnodes);
3552 const IntArray dofIDArrayPtr =
domain->giveDefaultNodeDofIDArry();
3553 for (
int inode = 1; inode <= nnodes; inode++ ) {
3554 std::unique_ptr<DofManager> newNode;
3555 parent =
mesh->giveNode(inode)->giveParent();
3557 parentNodePtr =
domain->giveNode(parent);
3560 auto node = newNode.get();
3561 node->setNumberOfDofs(0);
3564 for (
Dof *idofPtr: *parentNodePtr ) {
3565 if ( idofPtr->isPrimaryDof() ) {
3566 dof =
new MasterDof( node, idofPtr->giveBcId(), idofPtr->giveIcId(), idofPtr->giveDofID() );
3569 if ( simpleSlaveDofPtr ) {
3575 node->appendDof(dof);
3578 node->setGlobalNumber( parentNodePtr->giveGlobalNumber() );
3579#ifdef __MPI_PARALLEL_MODE
3580 node->setParallelMode( parentNodePtr->giveParallelMode() );
3581 node->setPartitionList( parentNodePtr->givePartitionList() );
3585 newNode = std::make_unique<Node>(inode, *dNew);
3586 auto node = newNode.get();
3588 int ndofs = dofIDArrayPtr.
giveSize();
3589 node->setNumberOfDofs(0);
3592 for (
int idof = 1; idof <= ndofs; idof++ ) {
3597 if ( fabs(coords->
at(1) - 200.0) < 0.000001 ) {
3598 if ( coords->
at(2) > -0.000001 && coords->
at(2) < 97.500001 ) {
3599 dof =
new MasterDof( node, 1, 0, dofIDArrayPtr.
at ( idof ) );
3605 if ( fabs( coords->
at(2) ) < 0.000001 ) {
3606 dof =
new MasterDof( node, 1, 0, dofIDArrayPtr.
at ( idof ) );
3611 if ( fabs( coords->
at(1) ) < 0.000001 ) {
3612 if ( coords->
at(2) > 102.4999999 && coords->
at(2) < 199.9999999 ) {
3619 if ( fabs(coords->
at(2) - 200.0) < 0.000001 ) {
3620 if ( coords->
at(1) > 0.000001 && coords->
at(1) < 200.000001 ) {
3627 dof =
new MasterDof( node, 0, 0, dofIDArrayPtr.
at ( idof ) );
3635 if ( fabs( coords->
at(1) ) < 0.000001 ) {
3636 if ( coords->
at(2) > 0.000001 ) {
3638 dof =
new MasterDof( node, 1, 0, dofIDArrayPtr.
at ( idof ) );
3645 if ( fabs( coords->
at(2) ) < 0.000001 ) {
3646 if ( coords->
at(1) > 0.000001 ) {
3648 dof =
new MasterDof( node, 1, 0, dofIDArrayPtr.
at ( idof ) );
3655 dof =
new MasterDof( node, 0, 0, dofIDArrayPtr.
at ( idof ) );
3663 if ( fabs( coords->
at(1) ) < 0.000001 ) {
3664 if ( coords->
at(2) > 0.000001 ) {
3665 if ( coords->
at(3) > 499.999999 ) {
3666 if ( idof == 1 || idof == 3 ) {
3667 dof =
new MasterDof( node, 1, 0, dofIDArrayPtr.
at ( idof ) );
3675 if ( coords->
at(1) > 1999.999999 ) {
3676 if ( coords->
at(2) > 0.000001 ) {
3677 if ( coords->
at(3) > 499.999999 ) {
3679 dof =
new MasterDof( node, 1, 0, dofIDArrayPtr.
at ( idof ) );
3687 dof =
new MasterDof( node, 0, 0, dofIDArrayPtr.
at ( idof ) );
3697 dist = coords->
at(1) * coords->
at(1) + coords->
at(3) * coords->
at(3);
3698 if ( coords->
at(2) < 88.000001 ) {
3699 if ( coords->
at(2) > 70.000001 ) {
3700 if ( fabs(dist - 7.0 * 7.0) < 0.01 ) {
3701 if ( idof == 1 || idof == 3 ) {
3705 }
else if ( coords->
at(2) > 67.9999999 ) {
3706 rad = 18.0 - 11.0 / 5.5 * ( coords->
at(2) - 64.5 );
3707 if ( fabs(dist - rad * rad) < 0.01 ) {
3708 if ( idof == 1 || idof == 3 ) {
3722 if ( coords->
at(1) > 299.999999 || coords->
at(3) > 299.999999 ) {
3728 if ( coords->
at(1) < 0.00000001 ) {
3740 dof =
new MasterDof( node, 0, 0, dofIDArrayPtr.
at ( idof ) );
3745 node->appendDof(dof);
3748 node->setGlobalNumber(
mesh->giveNode(inode)->giveGlobalNumber() );
3749#ifdef __MPI_PARALLEL_MODE
3750 node->setParallelMode(
mesh->giveNode(inode)->giveParallelMode() );
3751 node->setPartitionList(
mesh->giveNode(inode)->givePartitions() );
3757 newNode->setBoundaryFlag(
mesh->giveNode(inode)->isBoundary() );
3758 ( * dNew )->setDofManager(inode, std::move(newNode));
3764 nelems =
mesh->giveNumberOfElements();
3765 for (
int ielem = 1; ielem <= nelems; ielem++ ) {
3766#ifdef __MPI_PARALLEL_MODE
3772 if (
mesh->giveElement(ielem)->isTerminal() ) {
3777#ifdef __MPI_PARALLEL_MODE
3778 IntArray parentElemMap(nterminals);
3780 ( * dNew )->resizeElements(nterminals);
3782 for (
int ielem = 1; ielem <= nelems; ielem++ ) {
3783#ifdef __MPI_PARALLEL_MODE
3789 if ( !
mesh->giveElement(ielem)->isTerminal() ) {
3794 parent =
mesh->giveElement(ielem)->giveTopParent();
3795#ifdef __MPI_PARALLEL_MODE
3796 parentElemMap.
at(eNum) = parent;
3803 auto elem =
classFactory.createElement(name.c_str(), eNum, * dNew);
3804 elem->initializeFrom(ir,1);
3805 elem->setGlobalNumber(
mesh->giveElement(ielem)->giveGlobalNumber() );
3806#ifdef __MPI_PARALLEL_MODE
3811 ( * dNew )->setElement(eNum, std::move(elem));
3819 int ncrosssect =
domain->giveNumberOfCrossSectionModels();
3820 ( * dNew )->resizeCrossSectionModels(ncrosssect);
3821 for (
int i = 1; i <= ncrosssect; i++ ) {
3825 auto crossSection =
classFactory.createCrossSection(name.c_str(), i, * dNew);
3826 crossSection->initializeFrom(ir);
3827 ( * dNew )->setCrossSection(i, std::move(crossSection));
3831 int nmat =
domain->giveNumberOfMaterialModels();
3832 ( * dNew )->resizeMaterials(nmat);
3833 for (
int i = 1; i <= nmat; i++ ) {
3837 auto mat =
classFactory.createMaterial(name.c_str(), i, * dNew);
3838 mat->initializeFrom(ir);
3839 ( * dNew )->setMaterial(i, std::move(mat));
3843 int nbarriers =
domain->giveNumberOfNonlocalBarriers();
3844 ( * dNew )->resizeNonlocalBarriers(nbarriers);
3845 for (
int i = 1; i <= nbarriers; i++ ) {
3849 auto barrier =
classFactory.createNonlocalBarrier(name.c_str(), i, * dNew);
3850 barrier->initializeFrom(ir);
3851 ( * dNew )->setNonlocalBarrier(i, std::move(barrier));
3855 int nbc =
domain->giveNumberOfBoundaryConditions();
3856 ( * dNew )->resizeBoundaryConditions(nbc);
3857 for (
int i = 1; i <= nbc; i++ ) {
3861 auto bc =
classFactory.createBoundaryCondition(name.c_str(), i, * dNew);
3862 bc->initializeFrom(ir);
3863 ( * dNew )->setBoundaryCondition(i, std::move(bc));
3867 int nic =
domain->giveNumberOfInitialConditions();
3868 ( * dNew )->resizeInitialConditions(nic);
3869 for (
int i = 1; i <= nic; i++ ) {
3872 auto ic = std::make_unique<InitialCondition>(i, *dNew);
3873 ic->initializeFrom(ir);
3874 ( * dNew )->setInitialCondition(i, std::move(ic));
3878 int nfunc =
domain->giveNumberOfFunctions();
3879 ( * dNew )->resizeFunctions(nfunc);
3880 for (
int i = 1; i <= nfunc; i++ ) {
3884 auto func =
classFactory.createFunction(name.c_str(), i, * dNew);
3885 func->initializeFrom(ir);
3886 ( * dNew )->setFunction(i, std::move(func));
3890 int nset =
domain->giveNumberOfSets();
3891 ( * dNew )->resizeSets(nset);
3892 for (
int i = 1; i <= nset; i++ ) {
3896 auto set = std::make_unique<Set>(i, * dNew);
3897 set->initializeFrom(ir);
3898 ( * dNew )->setSet(i, std::move(set));
3902 ( * dNew )->postInitialize();
3905 ( * dNew )->giveOutputManager()->beCopyOf(
domain->giveOutputManager() );
3908#ifdef __MPI_PARALLEL_MODE
3909 OOFEM_LOG_INFO(
"[%d] Subdivision: created new mesh (%d nodes and %d elements) in %.2fs\n",
3910 ( * dNew )->giveEngngModel()->giveRank(), nnodes, eNum, timer.
getUtime() );
3912 OOFEM_LOG_INFO(
"Subdivision: created new mesh (%d nodes and %d elements) in %.2fs\n",
3919#ifdef __MPI_PARALLEL_MODE
3920 #ifdef __VERBOSE_PARALLEL
3921 nnodes = ( * dNew )->giveNumberOfDofManagers();
3922 for (
int inode = 1; inode <= nnodes; inode++ ) {
3923 if ( ( * dNew )->giveDofManager(inode)->giveParallelMode() ==
DofManager_shared ) {
3933 bool nonloc =
false;
3934 nmat = ( * dNew )->giveNumberOfMaterialModels();
3935 for (
int im = 1; im <= nmat; im++ ) {
3945 ( * dNew )->commitTransactions( ( * dNew )->giveTransactionManager() );
3949 for (
int in=1; in<=(*dNew)->giveNumberOfDofManagers(); in++) {
3951 (*dNew)->giveDofManager(in)->giveInputRecord(ir);
3955 for (
int in=1; in<=(*dNew)->giveNumberOfElements(); in++) {
3957 (*dNew)->giveElement(in)->giveInputRecord(ir);
3958 nodes = (*dNew)->giveElement(in)->giveDofManArray();
3960 for (
int ii=1; ii<=nodes.
giveSize(); ii++)
3961 nodes.
at(ii) = (*dNew)->giveNode(nodes.
at(ii))->giveGlobalNumber();
3966 nelems = ( * dNew )->giveNumberOfElements();
3967 int localVals [ 2 ], globalVals [ 2 ];
3968 localVals [ 0 ] = 0;
3969 for (
int ielem = 1; ielem <= nelems; ielem++ ) {
3970 if ( ( * dNew )->giveElement(ielem)->giveParallelMode() ==
Element_local ) {
3975 nnodes = ( * dNew )->giveNumberOfDofManagers();
3976 localVals [ 1 ] = 0;
3977 for (
int inode = 1; inode <= nnodes; inode++ ) {
3978 if ( ( * dNew )->giveDofManager(inode)->isLocal() ) {
3983 MPI_Reduce(localVals, globalVals, 2, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
3985 OOFEM_LOG_INFO(
"Subdivision: new mesh info: %d nodes, %d elements in total\n", globalVals [ 1 ], globalVals [ 0 ]);