7 #define _USE_MATH_DEFINES
11 #define _USE_MATH_DEFINES
26 #define CHECKNEGATIVEAREA
28 #ifdef CHECKNEGATIVEAREA
34 #ifdef MOAB_HAVE_TEMPESTREMAP
35 #include "GridElements.h"
41 #define CORRTAGNAME "__correspondent"
51 for(
int i = 0; i < nX; i++ )
57 double* A = X + 2 * i;
60 for(
int j = 0; j < nY; j++ )
62 double* B = Y + 2 * j;
63 int j1 = ( j + 1 ) % nY;
64 double* C = Y + 2 * j1;
66 double area2 = ( B[0] - A[0] ) * ( C[1] - A[1] ) - ( C[0] - A[0] ) * ( B[1] - A[1] );
67 if( area2 < -epsilon_area )
77 P[extraPoint * 2] = A[0];
78 P[extraPoint * 2 + 1] = A[1];
100 if( nP < 2 )
return 0;
103 double c[2] = { 0., 0. };
105 for( k = 0; k < nP; k++ )
108 c[1] += P[2 * k + 1];
117 for( k = 0; k < nP; k++ )
119 double x = P[2 * k] - c[0], y = P[2 * k + 1] - c[1];
120 if( x != 0. || y != 0. )
122 pairAngleIndex[k].
angle = atan2( y, x );
126 pairAngleIndex[k].
angle = 0;
129 pairAngleIndex[k].
index = k;
133 std::sort( pairAngleIndex, pairAngleIndex + nP,
angleCompare );
137 for( k = 0; k < nP; k++ )
139 int ck = pairAngleIndex[k].
index;
140 PCopy[2 * k] = P[2 * ck];
141 PCopy[2 * k + 1] = P[2 * ck + 1];
144 std::copy( PCopy, PCopy + 2 * nP, P );
154 double d2 =
dist2( &P[2 * i], &P[2 * j] );
159 P[2 * i + 1] = P[2 * j + 1];
166 double d2 =
dist2( P, &P[2 * i] );
173 if( nP == 0 ) nP = 1;
201 markb[i] = markr[i] = 0;
204 for(
int i = 0; i < nsBlue; i++ )
206 for(
int j = 0; j < nsRed; j++ )
210 int iPlus1 = ( i + 1 ) % nsBlue;
211 int jPlus1 = ( j + 1 ) % nsRed;
212 for(
int k = 0; k < 2; k++ )
214 b[k] = red[2 * j + k] - blue[2 * i + k];
216 a[k][0] = blue[2 * iPlus1 + k] - blue[2 * i + k];
217 a[k][1] = red[2 * j + k] - red[2 * jPlus1 + k];
219 double delta = a[0][0] * a[1][1] - a[0][1] * a[1][0];
220 if( fabs( delta ) > 1.e-14 )
223 double alfa = ( b[0] * a[1][1] - a[0][1] * b[1] ) / delta;
224 double beta = ( -b[0] * a[1][0] + b[1] * a[0][0] ) / delta;
225 if( 0 <= alfa && alfa <= 1. && 0 <= beta && beta <= 1. )
228 for(
int k = 0; k < 2; k++ )
230 points[2 * nPoints + k] = blue[2 * i + k] + alfa * ( blue[2 * iPlus1 + k] - blue[2 * i + k] );
260 for(
int i = 0; i < 4; i++ )
262 markb[i] = markr[i] = 0;
265 for(
int i = 0; i < nsBlue; i++ )
267 int iPlus1 = ( i + 1 ) % nsBlue;
268 if( blueEdgeType[i] == 0 )
270 for(
int j = 0; j < nsRed; j++ )
275 int jPlus1 = ( j + 1 ) % nsRed;
276 for(
int k = 0; k < 2; k++ )
278 b[k] = red[2 * j + k] - blue[2 * i + k];
280 a[k][0] = blue[2 * iPlus1 + k] - blue[2 * i + k];
281 a[k][1] = red[2 * j + k] - red[2 * jPlus1 + k];
283 double delta = a[0][0] * a[1][1] - a[0][1] * a[1][0];
284 if( fabs( delta ) > 1.e-14 )
287 double alfa = ( b[0] * a[1][1] - a[0][1] * b[1] ) / delta;
288 double beta = ( -b[0] * a[1][0] + b[1] * a[0][0] ) / delta;
289 if( 0 <= alfa && alfa <= 1. && 0 <= beta && beta <= 1. )
292 for(
int k = 0; k < 2; k++ )
294 points[2 * nPoints + k] =
295 blue[2 * i + k] + alfa * ( blue[2 * iPlus1 + k] - blue[2 * i + k] );
308 for(
int j = 0; j < nsRed; j++ )
310 int jPlus1 = ( j + 1 ) % nsRed;
316 if( np == 0 )
continue;
319 std::cout <<
"intersection with 2 points :" << A << B << C << D <<
"\n";
321 for(
int k = 0; k < np; k++ )
324 points[2 * nPoints + 1] );
352 if( fabs( pos[0] ) < fabs( pos[1] ) )
354 if( fabs( pos[2] ) < fabs( pos[1] ) )
373 if( fabs( pos[2] ) < fabs( pos[0] ) )
458 double len = sqrt( c1 * c1 + c2 * c2 +
R *
R );
459 double beta =
R / len;
555 std::string parTagName(
"PARALLEL_PARTITION" );
558 ErrorCode rval =
mb->tag_get_handle( parTagName.c_str(), part_tag );
566 rval =
mb->get_entities_by_dimension( inSet, 1, inputRange );
MB_CHK_ERR( rval );
567 rval =
mb->get_entities_by_dimension( inSet, 2, inputRange );
MB_CHK_ERR( rval );
569 std::map< EntityHandle, int > partsAssign;
570 std::map< int, EntityHandle > newPartSets;
571 if( !partSets.
empty() )
578 rval =
mb->get_entities_by_handle( pSet, ents );
MB_CHK_ERR( rval );
580 rval =
mb->tag_get_data( part_tag, &pSet, 1, &val );
MB_CHK_ERR( rval );
584 rval =
mb->tag_set_data( part_tag, &newPartSet, 1, &val );
MB_CHK_ERR( rval );
585 newPartSets[val] = newPartSet;
586 rval =
mb->add_entities( outSet, &newPartSet, 1 );
MB_CHK_ERR( rval );
589 partsAssign[*it] = val;
625 subranges[plane - 1].
insert( cell );
627 for(
int i = 1; i <= 6; i++ )
630 rval =
mb->get_connectivity( subranges[i - 1], verts );
MB_CHK_ERR( rval );
631 std::map< EntityHandle, EntityHandle > corr;
646 for(
Range::iterator eit = subranges[i - 1].begin(); eit != subranges[i - 1].
end(); ++eit )
651 rval =
mb->get_connectivity( eh, conn, num_nodes );
MB_CHK_ERR( rval );
653 for(
int j = 0; j < num_nodes; j++ )
654 new_conn[j] = corr[conn[j]];
655 EntityType type =
mb->type_from_handle( eh );
657 rval =
mb->create_element( type, new_conn, num_nodes, newCell );
MB_CHK_ERR( rval );
658 rval =
mb->add_entities( outSet, &newCell, 1 );
MB_CHK_ERR( rval );
659 std::map< EntityHandle, int >::iterator mit = partsAssign.find( eh );
660 if( mit != partsAssign.end() )
662 int val = mit->second;
663 rval =
mb->add_entities( newPartSets[val], &newCell, 1 );
MB_CHK_ERR( rval );
673 if( projection_type == 1 )
676 avg_position[0] * avg_position[0] + avg_position[1] * avg_position[1] + avg_position[2] * avg_position[2];
678 double lat = asin( avg_position[2] /
R );
679 double lon = atan2( avg_position[1], avg_position[0] );
680 avg_position[0] = lon;
681 avg_position[1] = lat;
684 else if( projection_type == 2 )
735 res.
lat = asin( cart3d[2] / res.
R );
736 res.
lon = atan2( cart3d[1], cart3d[0] );
737 if( res.
lon < 0 ) res.
lon += 2 * M_PI;
765 res[0] = sc.
R * cos( sc.
lat ) * cos( sc.
lon );
766 res[1] = sc.
R * cos( sc.
lat ) * sin( sc.
lon );
767 res[2] = sc.
R * sin( sc.
lat );
783 rval =
mb->get_coords( &nd, 1, (
double*)&( pos[0] ) );
785 double len = pos.
length();
786 if( len == 0. )
return MB_FAILURE;
788 rval =
mb->set_coords( &nd, 1, (
double*)&( pos[0] ) );
802 if( fabs( err1 ) > 0.0001 )
804 std::cout <<
" error in input " << a <<
" radius: " <<
Radius <<
" error:" << err1 <<
"\n";
808 return angle( normalOAB, normalOCB );
820 CartVect orient = ( c - b ) * ( a - b );
821 double ang =
angle( normalOAB, normalOCB );
825 std::cout << a <<
" " << b <<
" " << c <<
"\n";
826 std::cout << ang <<
"\n";
828 if( orient % b < 0 )
return ( 2 * M_PI - ang );
839 #ifdef MOAB_HAVE_TEMPESTREMAP
841 return area_spherical_triangle_GQ( A, B, C,
Radius );
855 #ifdef MOAB_HAVE_TEMPESTREMAP
857 return area_spherical_polygon_GQ( A, N,
Radius );
872 CartVect abc = ( b - a ) * ( c - a );
884 if( N <= 2 )
return 0.;
885 double sum_angles = 0.;
886 for(
int i = 0; i < N; i++ )
888 int i1 = ( i + 1 ) % N;
889 int i2 = ( i + 2 ) % N;
892 double correction = sum_angles - ( N - 2 ) * M_PI;
902 if( N <= 2 )
return 0.;
906 for(
int i = 1; i < N - 1; i++ )
910 if( areaTriangle < 0 )
913 area += areaTriangle;
915 if( sign ) *sign = lsign;
920 #ifdef MOAB_HAVE_TEMPESTREMAP
921 double IntxAreaUtils::area_spherical_polygon_GQ(
double* A,
int N,
double Radius )
927 if( N <= 2 )
return 0.;
931 for(
int i = 1; i < N - 1; i++ )
934 area += area_spherical_triangle_GQ( A, A + 3 * i, A + 3 * i1,
Radius );
940 double IntxAreaUtils::area_spherical_triangle_GQ(
double* ptA,
double* ptB,
double* ptC,
double )
943 NodeVector nodes( 3 );
944 nodes[0] = Node( ptA[0], ptA[1], ptA[2] );
945 nodes[1] = Node( ptB[0], ptB[1], ptB[2] );
946 nodes[2] = Node( ptC[0], ptC[1], ptC[2] );
947 face.SetNode( 0, 0 );
948 face.SetNode( 1, 1 );
949 face.SetNode( 2, 2 );
950 return CalculateFaceArea(
face, nodes );
984 CartVect vA( ptA ), vB( ptB ), vC( ptC );
985 double a =
angle( vB, vC );
986 double b =
angle( vC, vA );
987 double c =
angle( vA, vB );
989 if( ( vA * vB ) % vC < 0 ) sign = -1;
990 double s = ( a + b + c ) / 2;
991 double tmp = tan( s / 2 ) * tan( ( s - a ) / 2 ) * tan( ( s - b ) / 2 ) * tan( ( s - c ) / 2 );
992 if( tmp < 0. ) tmp = 0.;
994 double E = 4 * atan( sqrt( tmp ) );
995 if(
E !=
E ) std::cout <<
" NaN at spherical triangle area \n";
999 #ifdef CHECKNEGATIVEAREA
1002 std::cout <<
"negative area: " << area <<
"\n";
1003 std::cout << std::setprecision( 15 );
1004 std::cout <<
"vA: " << vA <<
"\n";
1005 std::cout <<
"vB: " << vB <<
"\n";
1006 std::cout <<
"vC: " << vC <<
"\n";
1007 std::cout <<
"sign: " << sign <<
"\n";
1008 std::cout <<
" a: " << a <<
"\n";
1009 std::cout <<
" b: " << b <<
"\n";
1010 std::cout <<
" c: " << c <<
"\n";
1016 #undef CHECKNEGATIVEAREA
1025 std::vector< int > ownerinfo( inputRange.
size(), -1 );
1027 rval =
mb->tag_get_handle(
"ORIG_PROC", intxOwnerTag );
1030 rval =
mb->tag_get_data( intxOwnerTag, inputRange, &ownerinfo[0] );
MB_CHK_ERR_RET_VAL( rval, -1.0 );
1035 double total_area = 0.;
1040 if( ownerinfo[ie++] >= 0 )
continue;
1046 assert( elem_area > 0 );
1049 total_area += elem_area;
1064 while( verts[nsides - 2] == verts[nsides - 1] && nsides > 3 )
1068 std::vector< double > coords( 3 * nsides );
1081 acos( sin( sph1.
lon ) * sin( sph2.
lon ) + cos( sph1.
lat ) * cos( sph2.
lat ) * cos( sph2.
lon - sph2.
lon ) );
1108 std::vector< double > coords;
1112 std::queue< EntityHandle > newPolys;
1113 int brokenPolys = 0;
1115 while( eit != inputRange.
end() || !newPolys.empty() )
1118 if( eit != inputRange.
end() )
1125 eh = newPolys.front();
1131 rval =
mb->get_connectivity( eh, verts, num_nodes );
MB_CHK_ERR( rval );
1132 int nsides = num_nodes;
1134 while( verts[nsides - 2] == verts[nsides - 1] && nsides > 3 )
1139 rval =
mb->tag_get_data( corrTag, &eh, 1, &corrHandle );
MB_CHK_ERR( rval );
1142 rval =
mb->tag_get_data( gidTag, &eh, 1, &gid );
MB_CHK_ERR( rval );
1143 coords.resize( 3 * nsides );
1144 if( nsides < 4 )
continue;
1146 rval =
mb->get_coords( verts, nsides, &coords[0] );
MB_CHK_ERR( rval );
1148 bool alreadyBroken =
false;
1150 for(
int i = 0; i < nsides; i++ )
1152 double* A = &coords[3 * i];
1153 double* B = &coords[3 * ( ( i + 1 ) % nsides )];
1154 double* C = &coords[3 * ( ( i + 2 ) % nsides )];
1156 if(
angle - M_PI > 0. )
1160 mb->list_entities( &eh, 1 );
1161 mb->list_entities( verts, nsides );
1162 double* D = &coords[3 * ( ( i + 3 ) % nsides )];
1163 std::cout <<
"ABC: " <<
angle <<
" \n";
1167 std::cout <<
" this cell has at least 2 angles > 180, it has serious issues\n";
1178 EntityHandle conn3[3] = { verts[( i + 1 ) % nsides], verts[( i + 2 ) % nsides],
1179 verts[( i + 3 ) % nsides] };
1182 std::vector< EntityHandle > conn( nsides - 1 );
1183 for(
int j = 1; j < nsides; j++ )
1185 conn[j - 1] = verts[( i + j + 2 ) % nsides];
1190 rval =
mb->add_entities( lset, &newElement, 1 );
MB_CHK_ERR( rval );
1193 rval =
mb->tag_set_data( corrTag, &newElement, 1, &corrHandle );
MB_CHK_ERR( rval );
1195 rval =
mb->tag_set_data( gidTag, &newElement, 1, &gid );
MB_CHK_ERR( rval );
1205 newPolys.push( newElement );
1208 rval =
mb->add_entities( lset, &newElement, 1 );
MB_CHK_ERR( rval );
1211 rval =
mb->tag_set_data( corrTag, &newElement, 1, &corrHandle );
MB_CHK_ERR( rval );
1213 rval =
mb->tag_set_data( gidTag, &newElement, 1, &gid );
MB_CHK_ERR( rval );
1214 rval =
mb->remove_entities( lset, &eh, 1 );
MB_CHK_ERR( rval );
1216 alreadyBroken =
true;
1220 if( brokenPolys > 0 )
1222 std::cout <<
"on local process " << my_rank <<
", " << brokenPolys
1223 <<
" concave polygons were decomposed in convex ones \n";
1225 std::stringstream fff;
1226 fff <<
"file_set" <<
mb->id_from_handle( lset ) <<
"rk_" << my_rank <<
".h5m";
1227 rval =
mb->write_file( fff.str().c_str(), 0, 0, &lset, 1 );
MB_CHK_ERR( rval );
1228 std::cout <<
"wrote new file set: " << fff.str() <<
"\n";
1241 gid =
mb->globalId_tag();
1247 rval =
mb->get_connectivity( quad, conn4, num_nodes );
MB_CHK_ERR( rval );
1248 for(
int i = 0; i < num_nodes; i++ )
1250 int next_node_index = ( i + 1 ) % num_nodes;
1251 if( conn4[i] == conn4[next_node_index] )
1256 rval =
mb->tag_get_data( gid, &quad, 1, &global_id );
MB_CHK_ERR( rval );
1257 int i2 = ( i + 2 ) % num_nodes;
1258 int i3 = ( i + 3 ) % num_nodes;
1259 EntityHandle conn3[3] = { conn4[i], conn4[i2], conn4[i3] };
1262 mb->add_entities( set, &tri, 1 );
1263 mb->remove_entities( set, &quad, 1 );
1264 mb->delete_entities( &quad, 1 );
1265 rval =
mb->tag_set_data( gid, &tri, 1, &global_id );
MB_CHK_ERR( rval );
1275 ErrorCode rval =
mb->get_entities_by_dimension( set, 2, cells2d );
1282 rval =
mb->get_connectivity( cell, conn, num_nodes );
1284 if( num_nodes < 3 )
return MB_FAILURE;
1287 rval =
mb->get_coords( conn, 3, coords );
1298 std::vector< double > coords2( 3 * num_nodes );
1300 rval =
mb->get_coords( conn, num_nodes, &coords2[0] );
1305 std::vector< EntityHandle > newconn( num_nodes );
1306 for(
int i = 0; i < num_nodes; i++ )
1308 newconn[num_nodes - 1 - i] = conn[i];
1310 rval =
mb->set_connectivity( cell, &newconn[0], num_nodes );
1315 std::cout <<
" nonconvex problem first area:" << area <<
" total area: " << totArea << std::endl;
1326 return acos( sin( te1 ) * sin( te2 ) + cos( te1 ) * cos( te2 ) * cos( la1 - la2 ) );
1337 const double Tolerance = 1.e-12 * R2;
1339 CartVect a( A ), b( B ), c( C ), d( D );
1341 if( fabs( a.length_squared() - R2 ) + fabs( b.length_squared() - R2 ) + fabs( c.length_squared() - R2 ) +
1357 if( n1 % n4 >= -Tolerance && n1 % n5 >= -Tolerance )
1362 if( n2 % n4 >= -Tolerance && n2 % n5 >= -Tolerance )
1375 n4 = a * n3, n5 = n3 * b;
1376 if( n1 % n4 >= -Tolerance && n1 % n5 >= -Tolerance )
1381 if( n2 % n4 >= -Tolerance && n2 % n5 >= -Tolerance )
1407 if( n1 % n2 < 0 || n1 % n3 < 0 )
return false;
1410 c[2] = d[2] = s[2] = 0.;
1415 if( n1 % n2 < 0 || n1 % n3 < 0 )
return false;
1428 const double distTol =
R * 1.e-6;
1429 const double Tolerance =
R *
R * 1.e-12;
1431 CartVect a( A ), b( B ), c( C ), d( D );
1434 if( fabs( a.length_squared() - R2 ) + fabs( b.length_squared() - R2 ) + fabs( c.length_squared() - R2 ) +
1444 if( fabs( C[2] - D[2] ) > distTol )
1447 if( fabs(
R - C[2] ) < distTol || fabs(
R + C[2] ) < distTol )
return MB_FAILURE;
1459 if( fabs( n1[0] ) + fabs( n1[1] ) < 2 * Tolerance )
1462 if( fabs( C[2] ) > distTol )
1477 bool agtc = ( ca % cd >= -Tolerance );
1478 bool dgta = ( ad % cd >= -Tolerance );
1479 bool bgtc = ( cb % cd >= -Tolerance );
1480 bool dgtb = ( bd % cd >= -Tolerance );
1587 if( fabs( n1[0] ) <= fabs( n1[1] ) )
1594 double u = -n1[2] / n1[1] * z, v = -n1[0] / n1[1];
1595 double a1 = v * v + 1, b1 = 2 * u * v, c1 = u * u + z * z - R2;
1596 double delta = b1 * b1 - 4 * a1 * c1;
1597 if( delta < -Tolerance )
return MB_FAILURE;
1598 if( delta > Tolerance )
1600 double x1 = ( -b1 + sqrt( delta ) ) / 2 / a1;
1601 double x2 = ( -b1 - sqrt( delta ) ) / 2 / a1;
1602 double y1 = u + v * x1;
1603 double y2 = u + v * x2;
1604 if(
verify( a, b, c, d, x1, y1, z ) )
1611 if(
verify( a, b, c, d, x2, y2, z ) )
1622 double x1 = -b1 / 2 / a1;
1623 double y1 = u + v * x1;
1624 if(
verify( a, b, c, d, x1, y1, z ) )
1641 double u = -n1[2] / n1[0] * z, v = -n1[1] / n1[0];
1642 double a1 = v * v + 1, b1 = 2 * u * v, c1 = u * u + z * z - R2;
1643 double delta = b1 * b1 - 4 * a1 * c1;
1644 if( delta < -Tolerance )
return MB_FAILURE;
1645 if( delta > Tolerance )
1647 double y1 = ( -b1 + sqrt( delta ) ) / 2 / a1;
1648 double y2 = ( -b1 - sqrt( delta ) ) / 2 / a1;
1649 double x1 = u + v * y1;
1650 double x2 = u + v * y2;
1651 if(
verify( a, b, c, d, x1, y1, z ) )
1658 if(
verify( a, b, c, d, x2, y2, z ) )
1669 double y1 = -b1 / 2 / a1;
1670 double x1 = u + v * y1;
1671 if(
verify( a, b, c, d, x1, y1, z ) )
1682 if( np <= 0 )
return MB_FAILURE;
1706 int type_constant_lat=1;
1719 if (fabs( coords[2]-coords[5] )< 1.e-6 )
1743 int extraPoints = 0;
1745 CartVect A( 0. ), B( 0. ), C( 0. ), D( 0. );
1746 for(
int i = 0; i < nsBlue; i++ )
1748 if( blueEdgeType[i] == 0 )
1750 int iP1 = ( i + 1 ) % nsBlue;
1751 if( bluec[i][2] > bluec[iP1][2] )
1755 C = bluec[( i + 2 ) % nsBlue];
1756 D = bluec[( i + 3 ) % nsBlue];
1761 if( nsBlue == 3 && B[2] < 0 )
1770 for(
int i = 0; i < nsRed; i++ )
1773 if( X[2] > A[2] || X[2] < B[2] )
continue;
1775 if( ( ( A * B ) % X >= -epsil ) && ( ( C * D ) % X >= -epsil ) )
1780 P[extraPoints * 2] = red2dc[2 * i];
1781 P[extraPoints * 2 + 1] = red2dc[2 * i + 1];
1799 Tag gid =
mb->globalId_tag();
1805 rval =
mb->get_connectivity( quads, connecVerts );
MB_CHK_ERR( rval );
1807 std::map< EntityHandle, EntityHandle > newNodes;
1809 std::vector< double* > coords;
1811 int num_verts = connecVerts.
size();
1812 rval = read_iface->
get_node_coords( 3, num_verts, 0, start_vert, coords );
1820 rval =
mb->get_coords( &oldV, 1, &( posi[0] ) );
MB_CHK_ERR( rval );
1823 rval =
mb->tag_get_data( gid, &oldV, 1, &global_id );
MB_CHK_ERR( rval );
1826 coords[0][i] = posi[0];
1827 coords[1][i] = posi[1];
1828 coords[2][i] = posi[2];
1830 newNodes[oldV] = new_vert;
1832 rval =
mb->tag_set_data( corrTag, &oldV, 1, &new_vert );
MB_CHK_ERR( rval );
1837 rval =
mb->tag_set_data( corrTag, &new_vert, 1, &oldV );
MB_CHK_ERR( rval );
1839 rval =
mb->tag_set_data( gid, &new_vert, 1, &global_id );
MB_CHK_ERR( rval );
1851 rval =
mb->get_connectivity( q, conn, nnodes );
MB_CHK_ERR( rval );
1853 rval =
mb->tag_get_data( gid, &q, 1, &global_id );
MB_CHK_ERR( rval );
1855 for(
int ii = 0; ii < nnodes; ii++ )
1858 connect[4 * ie + ii] = newNodes[v1];
1863 rval =
mb->tag_set_data( corrTag, &q, 1, &newElement );
MB_CHK_ERR( rval );
1864 rval =
mb->tag_set_data( corrTag, &newElement, 1, &q );
MB_CHK_ERR( rval );
1867 rval =
mb->tag_set_data( gid, &newElement, 1, &global_id );
MB_CHK_ERR( rval );
1869 rval =
mb->add_entities( dest_set, &newElement, 1 );
MB_CHK_ERR( rval );
1880 std::vector< Tag >& tagList )
1884 rval =
mb->remove_entities( file_set, verts );
MB_CHK_ERR( rval );
1905 rval =
mb->get_connectivity( cells, verts );
MB_CHK_ERR( rval );
1907 Range modifiedCells;
1915 rval =
mb->get_connectivity( cell, connec, num_verts );
MB_CHK_SET_ERR( rval,
"Failed to get connectivity" );
1917 std::vector< EntityHandle > newConnec;
1918 newConnec.push_back( connec[0] );
1921 while( index < num_verts - 2 )
1923 int next_index = ( index + 1 );
1924 if( connec[next_index] != newConnec[new_size - 1] )
1926 newConnec.push_back( connec[next_index] );
1932 if( ( connec[num_verts - 1] != connec[num_verts - 2] ) && ( connec[num_verts - 1] != connec[0] ) )
1934 newConnec.push_back( connec[num_verts - 1] );
1937 if( new_size < num_verts )
1940 modifiedCells.
insert( cell );
1942 EntityType type =
MBTRI;
1945 else if( new_size == 4 )
1947 else if( new_size > 4 )
1952 rval =
mb->create_element( type, &newConnec[0], new_size, newCell );
MB_CHK_SET_ERR( rval,
"Failed to create new cell" );
1954 newCells.
insert( newCell );
1956 for(
size_t i = 0; i < tagList.size(); i++ )
1958 rval =
mb->tag_get_data( tagList[i], &cell, 1, (
void*)( &value ) );
MB_CHK_SET_ERR( rval,
"Failed to get tag value" );
1959 rval =
mb->tag_set_data( tagList[i], &newCell, 1, (
void*)( &value ) );
MB_CHK_SET_ERR( rval,
"Failed to set tag value on new cell" );
1964 rval =
mb->remove_entities( file_set, modifiedCells );
MB_CHK_SET_ERR( rval,
"Failed to remove old cells from file set" );
1965 rval =
mb->delete_entities( modifiedCells );
MB_CHK_SET_ERR( rval,
"Failed to delete old cells" );
1966 rval =
mb->add_entities( file_set, newCells );
MB_CHK_SET_ERR( rval,
"Failed to add new cells to file set" );
1967 rval =
mb->add_entities( file_set, verts );
MB_CHK_SET_ERR( rval,
"Failed to add verts to the file set" );