25 : mbImpl( impl ), pcomm( comm ), _rset( rset )
28 assert( NULL != impl );
38 std::cout <<
"Error initializing NestedRefine\n" << std::endl;
81 MB_SET_ERR( MB_FAILURE,
"Not supported 3D entity types: MBPRISM, MBPYRAMID, MBKNIFE, MBPOLYHEDRON" );
118 std::vector< EntityHandle >& level_sets,
121 assert( num_level > 0 );
125 std::vector< moab::EntityHandle > hmsets( num_level );
129 for(
int i = 0; i < num_level; i++ )
131 assert( ( level_degrees[i] == 2 ) || ( level_degrees[i] == 3 ) || ( level_degrees[i] == 5 ) );
137 for(
int i = 0; i < num_level; i++ )
139 assert( ( level_degrees[i] == 2 ) || ( level_degrees[i] == 3 ) );
148 level_sets.resize( num_level + 1 );
149 level_sets[0] =
_rset;
150 for(
int i = 0; i < num_level; i++ )
151 level_sets[i + 1] = hmsets[i];
161 if( !conn.empty() ) conn.clear();
169 conn.push_back(
level_mesh[level - 1].edge_conn[2 * offset] );
170 conn.push_back(
level_mesh[level - 1].edge_conn[2 * offset + 1] );
175 conn.reserve( num_corners );
179 for(
int i = 0; i < num_corners; i++ )
186 conn.reserve( num_corners );
189 for(
int i = 0; i < num_corners; i++ )
193 MB_SET_ERR( MB_FAILURE,
"Requesting connectivity for an unsupported entity type" );
209 for(
int i = 0; i < num_verts; i++ )
229 const unsigned int target_dimension,
230 std::vector< EntityHandle >& target_entities )
242 assert( ( child_level > 0 ) && ( child_level > parent_level ) );
254 MB_SET_ERR( MB_FAILURE,
"Requesting parent for unsupported entity type" );
257 int l = child_level - parent_level;
258 for(
int i = 0; i < l; i++ )
262 child_index = child_index / nch;
264 parent_index = child_index;
268 if( parent_level > 0 )
275 if( parent_level > 0 )
282 if( parent_level > 0 )
294 std::vector< EntityHandle >& children )
296 assert( ( child_level > 0 ) && ( child_level > parent_level ) );
303 if( parent_level > 0 )
310 if( parent_level > 0 )
317 if( parent_level > 0 )
323 MB_SET_ERR( MB_FAILURE,
"Requesting children for unsupported entity type" );
326 start = end = parent_index;
327 for(
int i = parent_level; i < child_level; i++ )
332 end = end * nch + nch - 1;
335 int num_child = end - start;
336 children.reserve( num_child );
338 for(
int i = start; i <= end; i++ )
348 children.push_back( child );
357 std::vector< EntityHandle >& incident_entities )
359 assert( vert_level > parent_level );
363 std::vector< EntityHandle > inents;
381 for(
int i = 0; i < (int)inents.size(); i++ )
387 incident_entities.push_back( parent );
391 std::sort( incident_entities.begin(), incident_entities.end() );
392 incident_entities.erase( std::unique( incident_entities.begin(), incident_entities.end() ),
393 incident_entities.end() );
401 std::vector< EntityHandle >& incident_entities )
403 assert( vert_level < child_level );
407 std::vector< EntityHandle > inents;
425 std::vector< EntityHandle > childs;
426 for(
int i = 0; i < (int)inents.size(); i++ )
432 for(
int j = 0; j < (int)childs.size(); j++ )
433 incident_entities.push_back( childs[j] );
442 MB_SET_ERR( MB_FAILURE,
"Requesting duplicates for non-coarse vertices" );
451 bool is_border =
false;
463 MB_SET_ERR( MB_FAILURE,
"Requesting boundary information for unsupported entity type" );
485 MB_SET_ERR( MB_FAILURE,
"Requesting ghost layers for a serial mesh" );
490 for(
size_t i = 0; i < lsets.size(); i++ )
497 for(
int gl = 0; gl < num_glayers; gl++ )
505 for(
size_t i = 0; i < lsets.size(); i++ )
520 assert( level > 0 && level <
nlevels + 1 );
523 std::vector< Tag > mtags( 3 );
532 for(
int i = 0; i < 3; i++ )
543 std::vector< EntityHandle > childs;
545 for( set_it = sets.
begin(); set_it != sets.
end(); ++set_it )
560 std::vector< EntityHandle > cents;
565 childs.insert( childs.end(), cents.begin(), cents.end() );
573 std::sort( childs.begin(), childs.end() );
574 childs.erase( std::unique( childs.begin(), childs.end() ), childs.end() );
602 int nverts_prev, nedges_prev, nfaces_prev, ncells_prev;
619 int nedges = 0, nfaces = 0;
625 hmest[0] = nverts_prev + nverts;
631 if( nfaces_prev != 0 )
646 if( ncells_prev != 0 )
778 for(
int l = 0; l < num_level; l++ )
784 int hmest[4] = { 0, 0, 0, 0 };
814 error = resolve_shared_ents_parmerge( l, hm_set[l] );
866 int nverts_prev, nents_prev;
880 std::vector< EntityHandle > vbuffer( vtotal );
882 std::vector< EntityHandle > conn;
884 int count_verts = nverts_prev;
887 for(
int eid = 0; eid < nents_prev; eid++ )
911 for(
int i = 0; i < (int)conn.size(); i++ )
922 for(
int i = 0; i < num_new_verts; i++ )
931 std::vector< EntityHandle > ent_buffer( etotal );
933 for(
int i = 0; i < etotal; i++ )
949 for(
int i = 0; i < num_new_verts; i++ )
965 ( 1 - xi ) *
level_mesh[cur_level].coordinates[0][id1] + xi *
level_mesh[cur_level].coordinates[0][id2];
967 ( 1 - xi ) *
level_mesh[cur_level].coordinates[1][id1] + xi *
level_mesh[cur_level].coordinates[1][id2];
969 ( 1 - xi ) *
level_mesh[cur_level].coordinates[2][id1] + xi *
level_mesh[cur_level].coordinates[2][id2];
982 std::vector< EntityHandle >& trackverts )
996 int ne = 0, dim = 0,
index = 0;
1010 std::vector< EntityHandle > vbuffer( vtotal );
1011 std::vector< EntityHandle > ent_buffer( etotal );
1013 std::vector< EntityHandle > adjents, econn, fconn;
1014 std::vector< int > leids;
1015 int count_nents = 0;
1018 for(
int eid = 0; eid < nedges_prev; eid++ )
1024 for(
int i = 0; i < vtotal; i++ )
1026 for(
int i = 0; i < etotal; i++ )
1038 for(
int i = 0; i < (int)econn.size(); i++ )
1046 int fid = -1, lid = -1, idx1 = -1, idx2 = -1;
1078 bool orient =
false;
1079 if( ( fconn[idx1] == econn[0] ) && ( fconn[idx2] == econn[1] ) ) orient =
true;
1083 for(
int j = 0; j < nve; j++ )
1084 vbuffer[j + 2] = trackverts[fid * ne * nve + nve * lid + j];
1088 for(
int j = 0; j < nve; j++ )
1089 vbuffer[( nve - j - 1 ) + 2] = trackverts[fid * ne * nve + nve * lid + j];
1095 for(
int i = 0; i < etotal; i++ )
1119 int nverts_prev, nents_prev;
1135 int findex = ftype - 1;
1139 int vtotal = nepf + tnv;
1140 std::vector< EntityHandle > vbuffer( vtotal );
1142 std::vector< EntityHandle > ent_buffer( etotal );
1145 std::vector< EntityHandle > trackvertsF( nents_prev * nepf * nve, 0 );
1147 std::vector< int > flag_verts( cur_nverts - nverts_prev, 0 );
1149 int count_nverts = nverts_prev;
1150 int count_nents = 0;
1151 std::vector< EntityHandle > conn, cur_conn;
1154 for(
int fid = 0; fid < nents_prev; fid++ )
1158 for(
int i = 0; i < vtotal; i++ )
1160 for(
int i = 0; i < etotal; i++ )
1176 for(
int i = 0; i < (int)conn.size(); i++ )
1183 cur_conn.push_back( vbuffer[i] );
1188 for(
int i = 0; i < nepf; i++ )
1190 for(
int j = 0; j < nve; j++ )
1193 vbuffer[id] = trackvertsF[fid * nve * nepf + nve * i + j];
1198 for(
int i = 0; i < tnv; i++ )
1200 if( !vbuffer[i + nepf] )
1209 for(
int i = 0; i < etotal; i++ )
1211 for(
int k = 0; k < nepf; k++ )
1227 for(
int i = 0; i < nepf; i++ )
1230 for(
int j = 0; j < nve; j++ )
1233 trackvertsF[fid * nepf * nve + nve * i + j] = vbuffer[id];
1236 std::vector< EntityHandle > sibfids;
1237 std::vector< int > sibleids;
1238 std::vector< int > siborient;
1244 if( !sibfids.size() )
continue;
1246 for(
int s = 0; s < (int)sibfids.size(); s++ )
1256 for(
int j = 0; j < nve; j++ )
1259 trackvertsF[sibid * nepf * nve + nve * sibleids[s] + j] = vbuffer[id];
1264 for(
int j = 0; j < nve; j++ )
1267 trackvertsF[sibid * nepf * nve + nve * sibleids[s] + j] = vbuffer[id];
1275 std::vector< double > corner_coords( nepf * 3 );
1301 std::vector< EntityHandle >& trackvertsE,
1302 std::vector< EntityHandle >& trackvertsF )
1306 EntityType ftype =
MBTRI;
1310 int findex = ftype - 1;
1320 int vtotal = nepf + tnv;
1323 std::vector< EntityHandle > vbuffer( vtotal );
1324 std::vector< EntityHandle > ent_buffer( etotal );
1326 std::vector< EntityHandle > adjents, fconn, cconn;
1327 std::vector< int > leids;
1328 int count_nents = 0;
1330 int nents_prev, ecount;
1345 for(
int it = 0; it < nents_prev; it++ )
1351 for(
int i = 0; i < vtotal; i++ )
1353 for(
int i = 0; i < etotal; i++ )
1367 for(
int i = 0; i < (int)fconn.size(); i++ )
1391 std::vector< EntityHandle > fac_conn( nepf );
1392 std::vector< EntityHandle > lfac_conn( nepf );
1393 for(
int j = 0; j < nepf; j++ )
1395 fac_conn[j] = fconn[j];
1397 lfac_conn[j] = cconn[id];
1400 std::vector< int > le_idx, indices;
1406 for(
int j = 0; j < nepf; j++ )
1413 bool eorient =
false;
1417 if( ( fconn[j] == cconn[idx1] ) && ( fconn[fnext] == cconn[idx2] ) ) eorient =
true;
1421 for(
int k = 0; k < nve; k++ )
1424 vbuffer[ind] = trackvertsE[fid * nepc * nve + nve * idx + k];
1429 for(
int k = 0; k < nve; k++ )
1432 vbuffer[ind] = trackvertsE[fid * nepc * nve + nve * idx + k];
1440 for(
int k = 0; k < nvf; k++ )
1443 vbuffer[ind] = trackvertsF[fid * nfpc * nvf + nvf * lid + indices[k] - 1];
1448 for(
int i = 0; i < etotal; i++ )
1450 for(
int k = 0; k < nepf; k++ )
1466 for(
int i = 0; i < ne; i++ )
1508 int nverts_prev, nents_prev;
1521 int cindex = type - 1;
1532 int vtotal = nvpc + nvtotal;
1533 std::vector< EntityHandle > vbuffer( vtotal );
1535 std::vector< EntityHandle > trackvertsC_edg( nepc * ne * nents_prev, 0 );
1536 std::vector< EntityHandle > trackvertsC_face( nfpc * nvf * nents_prev, 0 );
1539 std::vector< int > flag_verts( cur_nverts - nverts_prev, 0 );
1541 int count_nverts = nverts_prev;
1543 std::vector< EntityHandle > conn, cur_conn;
1546 for(
int cid = 0; cid < nents_prev; cid++ )
1550 for(
int i = 0; i < vtotal; i++ )
1566 for(
int i = 0; i < (int)conn.size(); i++ )
1573 cur_conn.push_back( vbuffer[i] );
1577 for(
int i = 0; i < nepc; i++ )
1579 for(
int j = 0; j < ne; j++ )
1582 vbuffer[idx] = trackvertsC_edg[cid * nepc * ne + ne * i + j];
1587 for(
int i = 0; i < nfpc; i++ )
1589 for(
int j = 0; j < nvf; j++ )
1592 vbuffer[idx] = trackvertsC_face[cid * nfpc * nvf + nvf * i + j];
1597 for(
int i = 0; i < nvtotal; i++ )
1599 if( !vbuffer[i + nvpc] )
1609 std::vector< EntityHandle > ent_buffer( etotal );
1611 for(
int i = 0; i < etotal; i++ )
1613 for(
int k = 0; k < nvpc; k++ )
1631 std::vector< double > corner_coords( nvpc * 3 );
1668 int nverts_prev, nents_prev;
1680 EntityType type =
MBTET;
1681 int cindex = type - 1;
1693 int vtotal = nvpc + nvtotal;
1694 std::vector< EntityHandle > vbuffer( vtotal );
1697 std::vector< EntityHandle > trackvertsC_edg( nepc * ne * nents_prev, 0 );
1698 std::vector< EntityHandle > trackvertsC_face( nfpc * nvf * nents_prev, 0 );
1701 std::vector< int > flag_verts( cur_nverts - nverts_prev, 0 );
1702 std::vector< int > cell_patterns( nents_prev, 0 );
1704 int count_nverts = nverts_prev;
1706 std::vector< EntityHandle > conn, cur_conn;
1709 for(
int cid = 0; cid < nents_prev; cid++ )
1713 for(
int i = 0; i < vtotal; i++ )
1729 for(
int i = 0; i < (int)conn.size(); i++ )
1736 cur_conn.push_back( vbuffer[i] );
1740 for(
int i = 0; i < nepc; i++ )
1742 for(
int j = 0; j < ne; j++ )
1745 vbuffer[idx] = trackvertsC_edg[cid * nepc * ne + ne * i + j];
1750 for(
int i = 0; i < nfpc; i++ )
1752 for(
int j = 0; j < nvf; j++ )
1755 vbuffer[idx] = trackvertsC_face[cid * nfpc * nvf + nvf * i + j];
1760 for(
int i = 0; i < nvtotal; i++ )
1762 if( !vbuffer[i + nvpc] )
1770 std::vector< double > corner_coords( nvpc * 3 );
1780 int pat_id = diag + 2;
1781 cell_patterns[cid] = pat_id;
1786 std::vector< EntityHandle > ent_buffer( etotal );
1788 for(
int i = 0; i < etotal; i++ )
1790 for(
int k = 0; k < nvpc; k++ )
1835 double* corner_coords,
1836 std::vector< int >& vflag,
1844 double xi, eta, N[3];
1847 for(
int i = 3; i < vtotal; i++ )
1849 if( vflag[vbuffer[i] - vstart - nverts_prev] )
continue;
1853 N[0] = 1 - xi - eta;
1857 double x = 0, y = 0, z = 0;
1858 for(
int j = 0; j < 3; j++ )
1860 x += N[j] * corner_coords[3 * j];
1861 y += N[j] * corner_coords[3 * j + 1];
1862 z += N[j] * corner_coords[3 * j + 2];
1868 vflag[vbuffer[i] - vstart - nverts_prev] = 1;
1871 else if( type ==
MBQUAD )
1873 double xi, eta, N[4];
1876 for(
int i = 4; i < vtotal; i++ )
1878 if( vflag[vbuffer[i] - vstart - nverts_prev] )
continue;
1882 N[0] = ( 1 - xi ) * ( 1 - eta ) / 4;
1883 N[1] = ( 1 + xi ) * ( 1 - eta ) / 4;
1884 N[2] = ( 1 + xi ) * ( 1 + eta ) / 4, N[3] = ( 1 - xi ) * ( 1 + eta ) / 4;
1886 double x = 0, y = 0, z = 0;
1887 for(
int j = 0; j < 4; j++ )
1889 x += N[j] * corner_coords[3 * j];
1890 y += N[j] * corner_coords[3 * j + 1];
1891 z += N[j] * corner_coords[3 * j + 2];
1897 vflag[vbuffer[i] - vstart - nverts_prev] = 1;
1900 else if( type ==
MBTET )
1902 double xi, eta, mu, N[4];
1905 for(
int i = 4; i < vtotal; i++ )
1907 if( vflag[vbuffer[i] - vstart - nverts_prev] )
continue;
1913 N[0] = 1 - xi - eta - mu;
1915 N[2] = eta, N[3] = mu;
1917 double x = 0, y = 0, z = 0;
1918 for(
int j = 0; j < 4; j++ )
1920 x += N[j] * corner_coords[3 * j];
1921 y += N[j] * corner_coords[3 * j + 1];
1922 z += N[j] * corner_coords[3 * j + 2];
1928 vflag[vbuffer[i] - vstart - nverts_prev] = 1;
1933 double xi, eta, mu, N[6];
1936 for(
int i = 6; i < vtotal; i++ )
1938 if( vflag[vbuffer[i] - vstart - nverts_prev] )
continue;
1944 N[0] = ( 1 - xi - eta ) * ( 1 - mu ), N[1] = xi * ( 1 - mu ), N[2] = eta * ( 1 - mu ),
1945 N[3] = ( 1 - xi - eta ) * ( 1 + mu ), N[4] = xi * ( 1 + mu ), N[5] = eta * ( 1 + mu );
1947 double x = 0, y = 0, z = 0;
1948 for(
int j = 0; j < 6; j++ )
1950 x += N[j] * corner_coords[3 * j];
1951 y += N[j] * corner_coords[3 * j + 1];
1952 z += N[j] * corner_coords[3 * j + 2];
1958 vflag[vbuffer[i] - vstart - nverts_prev] = 1;
1961 else if( type ==
MBHEX )
1963 double xi, eta, mu, N[8];
1964 double d1, d2, d3, s1, s2, s3;
1967 for(
int i = 8; i < vtotal; i++ )
1970 if( vflag[vbuffer[i] - vstart - nverts_prev] )
continue;
1982 N[0] = ( d1 * d2 * d3 ) / 8;
1983 N[1] = ( s1 * d2 * d3 ) / 8;
1984 N[2] = ( s1 * s2 * d3 ) / 8;
1985 N[3] = ( d1 * s2 * d3 ) / 8;
1986 N[4] = ( d1 * d2 * s3 ) / 8;
1987 N[5] = ( s1 * d2 * s3 ) / 8;
1988 N[6] = ( s1 * s2 * s3 ) / 8;
1989 N[7] = ( d1 * s2 * s3 ) / 8;
1991 double x = 0, y = 0, z = 0;
1992 for(
int j = 0; j < 8; j++ )
1994 x += N[j] * corner_coords[3 * j];
1995 y += N[j] * corner_coords[3 * j + 1];
1996 z += N[j] * corner_coords[3 * j + 2];
2003 vflag[vbuffer[i] - vstart - nverts_prev] = 1;
2012 #ifdef MOAB_HAVE_MPI
2062 int partid =
pcomm->
rank(), dum_id = -1;
2079 ParallelMergeMesh pm(
pcomm, 1e-08 );
2080 error = pm.merge( levelset,
true );
2097 for(
int i = 0; i < num_levels; i++ )
2100 int partid =
pcomm->
rank(), dum_id = -1;
2112 std::set< unsigned int > shprocs;
2116 std::vector< int > sharedprocs;
2117 for( std::set< unsigned int >::iterator it = shprocs.begin(); it != shprocs.end(); it++ )
2118 sharedprocs.push_back( *it );
2119 int nprocs = sharedprocs.size();
2122 std::vector< std::vector< int > > nsharedEntsperproc( nprocs );
2123 std::vector< std::vector< EntityHandle > > localBuffs( nprocs );
2124 std::vector< std::vector< EntityHandle > > remlocalBuffs( nprocs );
2125 std::vector< std::vector< EntityHandle > > remoteBuffs( nprocs );
2128 Range sharedentities;
2130 for( i = 0; i < nprocs; i++ )
2133 sharedentities.clear();
2139 error = collect_shared_entities_by_dimension( sharedentities, allEnts );
2143 V0 = allEnts.subset_by_dimension( 0 );
2144 E0 = allEnts.subset_by_dimension( 1 );
2145 F0 = allEnts.subset_by_dimension( 2 );
2165 std::vector< EntityHandle > locFList, remFList;
2166 std::vector< EntityHandle > locEList, remEList;
2167 std::vector< EntityHandle > locVList, remVList;
2172 error = collect_FList( sharedprocs[i], F0, locFList, remFList );
2179 error = collect_EList( sharedprocs[i], E0, locEList, remEList );
2186 error = collect_VList( sharedprocs[i], V0, locVList, remVList );
2191 std::vector< int > msgsz;
2192 msgsz.push_back( F0.size() );
2193 msgsz.push_back( locFList.size() );
2194 msgsz.push_back( E0.size() );
2195 msgsz.push_back( locEList.size() );
2196 msgsz.push_back( V0.size() );
2197 msgsz.push_back( locVList.size() );
2198 nsharedEntsperproc[i].insert( nsharedEntsperproc[i].end(), msgsz.begin(), msgsz.end() );
2202 localBuffs[i].insert( localBuffs[i].end(), locFList.begin(), locFList.end() );
2203 remlocalBuffs[i].insert( remlocalBuffs[i].end(), remFList.begin(), remFList.end() );
2207 localBuffs[i].insert( localBuffs[i].end(), locEList.begin(), locEList.end() );
2208 remlocalBuffs[i].insert( remlocalBuffs[i].end(), remEList.begin(), remEList.end() );
2212 localBuffs[i].insert( localBuffs[i].end(), locVList.begin(), locVList.end() );
2213 remlocalBuffs[i].insert( remlocalBuffs[i].end(), remVList.begin(), remVList.end() );
2222 std::multimap< EntityHandle, int > rprocs;
2223 std::multimap< EntityHandle, EntityHandle > rhandles;
2225 error = decipher_remote_handles( sharedprocs, nsharedEntsperproc, localBuffs, remoteBuffs, rprocs, rhandles );
2229 error = update_parallel_tags( rprocs, rhandles );
2235 ErrorCode NestedRefine::collect_shared_entities_by_dimension( Range sharedEnts, Range& allEnts )
2239 Range F0, E0, V0, E0all, V0all;
2240 std::vector< EntityHandle > ents;
2242 F0 = sharedEnts.subset_by_dimension( 2 );
2243 E0all = sharedEnts.subset_by_dimension( 1 );
2244 V0all = sharedEnts.subset_by_dimension( 0 );
2255 std::copy( ents.begin(), ents.end(), range_inserter( edges ) );
2259 std::copy( ents.begin(), ents.end(), range_inserter( verts ) );
2270 std::copy( ents.begin(), ents.end(), range_inserter( verts ) );
2275 else if( !E0all.empty() )
2283 std::copy( ents.begin(), ents.end(), range_inserter( verts ) );
2288 else if( !V0all.empty() )
2293 MB_SET_ERR( MB_FAILURE,
"Trying to pack unsupported sub-entities for shared interface entities" );
2295 if( !F0.empty() ) std::copy( F0.begin(), F0.end(), range_inserter( allEnts ) );
2296 if( !E0.empty() ) std::copy( E0.begin(), E0.end(), range_inserter( allEnts ) );
2297 if( !V0.empty() ) std::copy( V0.begin(), V0.end(), range_inserter( allEnts ) );
2302 ErrorCode NestedRefine::collect_FList(
int to_proc,
2304 std::vector< EntityHandle >& FList,
2305 std::vector< EntityHandle >& RList )
2310 std::vector< EntityHandle >
F, FC, FE, lF, lFC, lFE, rF, rFC, rFE;
2311 std::vector< EntityHandle > childEnts, conn, fedges;
2324 lF.push_back( *it );
2325 lFC.insert( lFC.end(), conn.begin(), conn.end() );
2326 lFE.insert( lFE.end(), fedges.begin(), fedges.end() );
2332 rF.push_back( rval );
2334 for(
int i = 0; i < (int)conn.size(); i++ )
2338 rFC.push_back( rval );
2342 rFE.push_back( rval );
2346 for(
int l = 0; l <
nlevels; l++ )
2354 for(
int i = 0; i < (int)childEnts.size(); i++ )
2363 F.push_back( childEnts[i] );
2364 FC.insert( FC.end(), conn.begin(), conn.end() );
2365 FE.insert( FE.end(), fedges.begin(), fedges.end() );
2370 FList.insert( FList.end(), lF.begin(), lF.end() );
2371 FList.insert( FList.end(),
F.begin(),
F.end() );
2372 FList.insert( FList.end(), lFC.begin(), lFC.end() );
2373 FList.insert( FList.end(), FC.begin(), FC.end() );
2374 FList.insert( FList.end(), lFE.begin(), lFE.end() );
2375 FList.insert( FList.end(), FE.begin(), FE.end() );
2377 RList.insert( RList.end(), rF.begin(), rF.end() );
2378 RList.insert( RList.end(),
F.begin(),
F.end() );
2379 RList.insert( RList.end(), rFC.begin(), rFC.end() );
2380 RList.insert( RList.end(), FC.begin(), FC.end() );
2381 RList.insert( RList.end(), rFE.begin(), rFE.end() );
2382 RList.insert( RList.end(), FE.begin(), FE.end() );
2387 ErrorCode NestedRefine::collect_EList(
int to_proc,
2389 std::vector< EntityHandle >& EList,
2390 std::vector< EntityHandle >& RList )
2394 std::vector< EntityHandle >
E, EC, lE, lEC, rE, rEC;
2395 std::vector< EntityHandle > childEnts, conn;
2406 lE.push_back( edg );
2407 lEC.insert( lEC.end(), conn.begin(), conn.end() );
2413 rE.push_back( rval );
2416 rEC.push_back( rval );
2419 rEC.push_back( rval );
2423 for(
int l = 0; l <
nlevels; l++ )
2431 for(
int i = 0; i < (int)childEnts.size(); i++ )
2436 E.push_back( childEnts[i] );
2437 EC.insert( EC.end(), conn.begin(), conn.end() );
2442 EList.insert( EList.end(), lE.begin(), lE.end() );
2443 EList.insert( EList.end(),
E.begin(),
E.end() );
2444 EList.insert( EList.end(), lEC.begin(), lEC.end() );
2445 EList.insert( EList.end(), EC.begin(), EC.end() );
2447 RList.insert( RList.end(), rE.begin(), rE.end() );
2448 RList.insert( RList.end(),
E.begin(),
E.end() );
2449 RList.insert( RList.end(), rEC.begin(), rEC.end() );
2450 RList.insert( RList.end(), EC.begin(), EC.end() );
2455 ErrorCode NestedRefine::collect_VList(
int to_proc,
2457 std::vector< EntityHandle >& VList,
2458 std::vector< EntityHandle >& RList )
2461 std::vector< EntityHandle > V, lV, rV;
2474 rV.push_back( rval );
2478 for(
int l = 0; l <
nlevels; l++ )
2485 V.push_back( dupvert );
2490 VList.insert( VList.end(), lV.begin(), lV.end() );
2491 VList.insert( VList.end(), V.begin(), V.end() );
2494 RList.insert( RList.end(), rV.begin(), rV.end() );
2495 RList.insert( RList.end(), V.begin(), V.end() );
2500 ErrorCode NestedRefine::decipher_remote_handles( std::vector< int >& sharedprocs,
2501 std::vector< std::vector< int > >& auxinfo,
2502 std::vector< std::vector< EntityHandle > >& localbuffers,
2503 std::vector< std::vector< EntityHandle > >& remotebuffers,
2504 std::multimap< EntityHandle, int >& remProcs,
2505 std::multimap< EntityHandle, EntityHandle >& remHandles )
2510 int nprocs = sharedprocs.size();
2512 for( i = 0; i < nprocs; i++ )
2514 std::vector< int > msgsz;
2515 for(
int j = 0; j < (int)auxinfo[i].size(); j++ )
2517 msgsz.push_back( auxinfo[i][j] );
2523 std::vector< EntityHandle > LFList, RFList;
2524 LFList.insert( LFList.end(), localbuffers[i].begin(), localbuffers[i].begin() + msgsz[1] );
2525 RFList.insert( RFList.end(), remotebuffers[i].begin(), remotebuffers[i].begin() + msgsz[1] );
2527 error = decipher_remote_handles_face( sharedprocs[i], msgsz[0], LFList, RFList, remProcs, remHandles );
2532 std::vector< EntityHandle > LEList, REList;
2533 LEList.insert( LEList.end(), localbuffers[i].begin() + msgsz[1] + 1,
2534 localbuffers[i].begin() + msgsz[1] + msgsz[3] );
2535 REList.insert( REList.end(), remotebuffers[i].begin() + msgsz[1] + 1,
2536 remotebuffers[i].begin() + msgsz[1] + msgsz[3] );
2538 error = decipher_remote_handles_edge( sharedprocs[i], msgsz[2], LEList, REList, remProcs, remHandles );
2544 std::vector< EntityHandle > LVList, RVList;
2545 LVList.insert( LVList.end(), localbuffers[i].begin() + msgsz[1] + msgsz[3] + 1,
2546 localbuffers[i].begin() + msgsz[1] + msgsz[3] + msgsz[5] );
2547 RVList.insert( RVList.end(), remotebuffers[i].begin() + msgsz[1] + msgsz[3] + 1,
2548 remotebuffers[i].begin() + msgsz[1] + msgsz[3] + msgsz[5] );
2550 error = decipher_remote_handles_vertex( sharedprocs[i], msgsz[4], LVList, RVList, remProcs,
2555 else if( msgsz[4] != 0 )
2558 std::vector< EntityHandle > LVList, RVList;
2559 LVList.insert( LVList.end(), localbuffers[i].begin() + msgsz[1] + 1,
2560 localbuffers[i].begin() + msgsz[1] + msgsz[5] );
2561 RVList.insert( RVList.end(), remotebuffers[i].begin() + msgsz[1] + 1,
2562 remotebuffers[i].begin() + msgsz[1] + msgsz[5] );
2565 decipher_remote_handles_vertex( sharedprocs[i], msgsz[4], LVList, RVList, remProcs, remHandles );
2570 else if( msgsz[2] != 0 )
2573 std::vector< EntityHandle > LEList, REList;
2574 LEList.insert( LEList.end(), localbuffers[i].begin(), localbuffers[i].begin() + msgsz[3] );
2575 REList.insert( REList.end(), remotebuffers[i].begin(), remotebuffers[i].begin() + msgsz[3] );
2577 error = decipher_remote_handles_edge( sharedprocs[i], msgsz[2], LEList, REList, remProcs, remHandles );
2583 std::vector< EntityHandle > LVList, RVList;
2584 LVList.insert( LVList.end(), localbuffers[i].begin() + msgsz[3] + 1,
2585 localbuffers[i].begin() + msgsz[3] + msgsz[5] );
2586 RVList.insert( RVList.end(), remotebuffers[i].begin() + msgsz[3] + 1,
2587 remotebuffers[i].begin() + msgsz[3] + msgsz[5] );
2590 decipher_remote_handles_vertex( sharedprocs[i], msgsz[4], LVList, RVList, remProcs, remHandles );
2595 else if( msgsz[4] != 0 )
2598 std::vector< EntityHandle > LVList, RVList;
2599 LVList.insert( LVList.end(), localbuffers[i].begin(), localbuffers[i].end() );
2600 RVList.insert( RVList.end(), remotebuffers[i].begin(), remotebuffers[i].end() );
2602 error = decipher_remote_handles_vertex( sharedprocs[i], msgsz[4], LVList, RVList, remProcs, remHandles );
2606 MB_SET_ERR( MB_FAILURE,
"Trying to decipher entities other than verts, edges, faces" );
2612 ErrorCode NestedRefine::decipher_remote_handles_face(
int shared_proc,
2614 std::vector< EntityHandle >& localFaceList,
2615 std::vector< EntityHandle >& remFaceList,
2616 std::multimap< EntityHandle, int >& remProcs,
2617 std::multimap< EntityHandle, EntityHandle >& remHandles )
2621 for(
int i = 0; i < numfaces; i++ )
2626 ( std::find( remFaceList.begin(), remFaceList.begin() + numfaces - 1, Lface ) ) - remFaceList.begin();
2629 std::vector< EntityHandle > Lface_conn, Rface_conn;
2630 error = get_data_from_buff( 2, 1, 0, i, numfaces, localFaceList, Lface_conn );
2632 error = get_data_from_buff( 2, 1, 0, Rface_idx, numfaces, remFaceList, Rface_conn );
2636 std::vector< int > cmap;
2638 int nvF = (int)Lface_conn.size();
2643 std::vector< EntityHandle > lchildents, lparents;
2644 std::vector< EntityHandle > lcents, rcents;
2647 for(
int l = 0; l <
nlevels; l++ )
2655 error = get_data_from_buff( 2, 0, l + 1, i, numfaces, localFaceList, lchildents );
2661 lparents.push_back( Lface );
2665 error = get_data_from_buff( 2, 0, l, i, numfaces, localFaceList, lparents );
2673 std::vector< int > fmap;
2678 for(
int j = 0; j < (int)lparents.size(); j++ )
2681 lidx = std::find( localFaceList.begin(), localFaceList.end(), lparents[j] ) - localFaceList.begin();
2682 error = get_data_from_buff( 2, 0, l + 1, lidx, numfaces, localFaceList, lcents );
2687 error = check_for_parallelinfo( lparents[j], shared_proc, remHandles, remProcs, rparent );
2689 ridx = std::find( remFaceList.begin(), remFaceList.end(), rparent ) - remFaceList.begin();
2690 error = get_data_from_buff( 2, 0, l + 1, ridx, numfaces, remFaceList, rcents );
2694 std::vector< EntityHandle > lconn, rconn, ledg, redg;
2695 for(
int k = 0; k < nch; k++ )
2703 bool found = check_for_parallelinfo( lcents[k], shared_proc, remProcs );
2706 remProcs.insert( std::pair< EntityHandle, int >( lcents[k], shared_proc ) );
2707 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lcents[k], rcents[fmap[k]] ) );
2711 lidx = std::find( localFaceList.begin(), localFaceList.end(), lcents[k] ) - localFaceList.begin();
2712 ridx = std::find( remFaceList.begin(), remFaceList.end(), rcents[fmap[k]] ) - remFaceList.begin();
2715 error = get_data_from_buff( 2, 2, l + 1, lidx, numfaces, localFaceList, ledg );
2717 error = get_data_from_buff( 2, 1, l + 1, lidx, numfaces, localFaceList, lconn );
2719 error = get_data_from_buff( 2, 2, l + 1, ridx, numfaces, remFaceList, redg );
2721 error = get_data_from_buff( 2, 1, l + 1, ridx, numfaces, remFaceList, rconn );
2726 for(
int m = 0; m < (int)ledg.size(); m++ )
2728 found = check_for_parallelinfo( ledg[m], shared_proc, remProcs );
2732 remProcs.insert( std::pair< EntityHandle, int >( ledg[m], shared_proc ) );
2733 remHandles.insert( std::pair< EntityHandle, EntityHandle >( ledg[m], redg[cmap[m]] ) );
2736 found = check_for_parallelinfo( lconn[m], shared_proc, remProcs );
2740 remProcs.insert( std::pair< EntityHandle, int >( lconn[m], shared_proc ) );
2741 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lconn[m], rconn[cmap[m]] ) );
2752 ErrorCode NestedRefine::decipher_remote_handles_edge(
int shared_proc,
2754 std::vector< EntityHandle >& localEdgeList,
2755 std::vector< EntityHandle >& remEdgeList,
2756 std::multimap< EntityHandle, int >& remProcs,
2757 std::multimap< EntityHandle, EntityHandle >& remHandles )
2761 for(
int i = 0; i < numedges; i++ )
2765 ( std::find( remEdgeList.begin(), remEdgeList.begin() + numedges - 1, Ledge ) ) - remEdgeList.begin();
2767 std::vector< EntityHandle > Ledge_conn, Redge_conn;
2768 error = get_data_from_buff( 1, 1, 0, i, numedges, localEdgeList, Ledge_conn );
2770 error = get_data_from_buff( 1, 1, 0, Redge_idx, numedges, remEdgeList, Redge_conn );
2774 if( ( Ledge_conn[0] == Redge_conn[1] ) && ( Ledge_conn[1] == Redge_conn[0] ) ) orient =
false;
2776 if( orient ) assert( ( Ledge_conn[0] == Redge_conn[0] ) && ( Ledge_conn[1] == Redge_conn[1] ) );
2778 std::vector< EntityHandle > lchildEdgs, rchildEdgs, lconn, rconn;
2779 for(
int l = 0; l <
nlevels; l++ )
2783 error = get_data_from_buff( 1, 0, l + 1, i, numedges, localEdgeList, lchildEdgs );
2785 error = get_data_from_buff( 1, 0, l + 1, Redge_idx, numedges, remEdgeList, rchildEdgs );
2788 int nchd = lchildEdgs.size();
2791 for(
int j = 0; j < nchd; j++ )
2794 bool found = check_for_parallelinfo( lchildEdgs[j], shared_proc, remProcs );
2797 remProcs.insert( std::pair< EntityHandle, int >( lchildEdgs[j], shared_proc ) );
2798 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lchildEdgs[j], rchildEdgs[j] ) );
2806 std::find( localEdgeList.begin(), localEdgeList.end(), lchildEdgs[j] ) - localEdgeList.begin();
2807 int ridx = std::find( remEdgeList.begin(), remEdgeList.end(), rchildEdgs[j] ) - remEdgeList.begin();
2809 error = get_data_from_buff( 1, 1, l + 1, lidx, numedges, localEdgeList, lconn );
2811 error = get_data_from_buff( 1, 1, l + 1, ridx, numedges, remEdgeList, rconn );
2814 found = check_for_parallelinfo( lconn[0], shared_proc, remProcs );
2817 remProcs.insert( std::pair< EntityHandle, int >( lconn[0], shared_proc ) );
2818 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lconn[0], rconn[0] ) );
2820 found = check_for_parallelinfo( lconn[1], shared_proc, remProcs );
2823 remProcs.insert( std::pair< EntityHandle, int >( lconn[1], shared_proc ) );
2824 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lconn[1], rconn[0] ) );
2831 for(
int j = 0; j < nchd; j++ )
2834 bool found = check_for_parallelinfo( lchildEdgs[j], shared_proc, remProcs );
2838 remProcs.insert( std::pair< EntityHandle, int >( lchildEdgs[j], shared_proc ) );
2840 std::pair< EntityHandle, EntityHandle >( lchildEdgs[j], rchildEdgs[nchd - j - 1] ) );
2848 std::find( localEdgeList.begin(), localEdgeList.end(), lchildEdgs[j] ) - localEdgeList.begin();
2849 int ridx = std::find( remEdgeList.begin(), remEdgeList.end(), rchildEdgs[nchd - j - 1] ) -
2850 remEdgeList.begin();
2852 error = get_data_from_buff( 1, 1, l + 1, lidx, numedges, localEdgeList, lconn );
2854 error = get_data_from_buff( 1, 1, l + 1, ridx, numedges, remEdgeList, rconn );
2856 found = check_for_parallelinfo( lconn[0], shared_proc, remProcs );
2860 remProcs.insert( std::pair< EntityHandle, int >( lconn[0], shared_proc ) );
2861 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lconn[0], rconn[1] ) );
2864 found = check_for_parallelinfo( lconn[1], shared_proc, remProcs );
2867 remProcs.insert( std::pair< EntityHandle, int >( lconn[1], shared_proc ) );
2868 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lconn[1], rconn[1] ) );
2878 ErrorCode NestedRefine::decipher_remote_handles_vertex(
int shared_proc,
2880 std::vector< EntityHandle >& localVertexList,
2881 std::vector< EntityHandle >& remVertexList,
2882 std::multimap< EntityHandle, int >& remProcs,
2883 std::multimap< EntityHandle, EntityHandle >& remHandles )
2891 for(
int i = 0; i < numverts; i++ )
2895 ( std::find( remVertexList.begin(), remVertexList.begin() + numverts - 1, v ) ) - remVertexList.begin();
2897 std::vector< EntityHandle > lverts, rverts;
2898 for(
int l = 0; l <
nlevels; l++ )
2900 error = get_data_from_buff( 0, 0, l + 1, i, numverts, localVertexList, lverts );
2902 error = get_data_from_buff( 0, 0, l + 1, Rvert_idx, numverts, remVertexList, rverts );
2905 bool found = check_for_parallelinfo( lverts[0], shared_proc, remProcs );
2908 remProcs.insert( std::pair< EntityHandle, int >( lverts[0], shared_proc ) );
2909 remHandles.insert( std::pair< EntityHandle, EntityHandle >( lverts[0], rverts[0] ) );
2917 ErrorCode NestedRefine::update_parallel_tags( std::multimap< EntityHandle, int >& remProcs,
2918 std::multimap< EntityHandle, EntityHandle >& remHandles )
2922 std::vector< int > rprocs;
2923 std::vector< EntityHandle > rhandles;
2925 std::multimap< EntityHandle, int >::iterator it;
2926 std::pair< std::multimap< EntityHandle, int >::iterator, std::multimap< EntityHandle, int >::iterator > it_procs;
2927 std::pair< std::multimap< EntityHandle, EntityHandle >::iterator,
2928 std::multimap< EntityHandle, EntityHandle >::iterator >
2931 it = remProcs.begin();
2932 while( it != remProcs.end() )
2938 it_procs = remProcs.equal_range( entity );
2939 it_handles = remHandles.equal_range( entity );
2941 for( std::multimap< EntityHandle, int >::iterator pit = it_procs.first; pit != it_procs.second; pit++ )
2942 rprocs.push_back( pit->second );
2943 for( std::multimap< EntityHandle, EntityHandle >::iterator pit = it_handles.first; pit != it_handles.second;
2945 rhandles.push_back( pit->second );
2950 it = remProcs.upper_bound( it->first );
2956 ErrorCode NestedRefine::get_data_from_buff(
int listtype,
2961 std::vector< EntityHandle >&
buffer,
2962 std::vector< EntityHandle >& data )
2988 int start, end, toadd, prev;
2989 start = end = entity_index;
2990 toadd = prev = nentities;
2991 for(
int i = 0; i < level; i++ )
2995 start = start * nch;
2996 end = end * nch + nch - 1;
3007 int num_child = end - start + 1;
3008 data.reserve( num_child );
3010 for(
int i = start; i <= end; i++ )
3013 data.push_back( child );
3016 else if( datatype == 1 )
3021 int toadd = nentities, prev = nentities;
3022 for(
int i = 0; i <
nlevels; i++ )
3030 for(
int i = 0; i < nepf; i++ )
3031 data.push_back(
buffer[toadd + nepf * entity_index + i] );
3033 else if( datatype == 2 )
3038 int toadd = nentities, prev = nentities;
3039 for(
int i = 0; i <
nlevels; i++ )
3046 toadd += toadd * nepf;
3048 for(
int i = 0; i < nepf; i++ )
3049 data.push_back(
buffer[toadd + nepf * entity_index + i] );
3052 MB_SET_ERR( MB_FAILURE,
"Requesting invalid info from buffer for faces" );
3054 else if( listtype == 1 )
3059 int start, end, toadd, prev;
3060 start = end = entity_index;
3061 toadd = prev = nentities;
3062 for(
int i = 0; i < level; i++ )
3066 start = start * nch;
3067 end = end * nch + nch - 1;
3079 int num_child = end - start + 1;
3080 data.reserve( num_child );
3082 for(
int i = start; i <= end; i++ )
3085 data.push_back( child );
3088 else if( datatype == 1 )
3090 int toadd = nentities, prev = nentities;
3091 for(
int i = 0; i <
nlevels; i++ )
3099 data.push_back(
buffer[toadd + 2 * entity_index] );
3100 data.push_back(
buffer[toadd + 2 * entity_index + 1] );
3103 MB_SET_ERR( MB_FAILURE,
"Requesting invalid info from buffer for edges" );
3105 else if( listtype == 0 )
3110 int idx = level * nentities + entity_index;
3111 data.push_back(
buffer[idx] );
3114 MB_SET_ERR( MB_FAILURE,
"Requesting invalid info from buffer for vertices" );
3117 MB_SET_ERR( MB_FAILURE,
"Requesting invalid info from buffer" );
3122 bool NestedRefine::check_for_parallelinfo(
EntityHandle entity,
int proc, std::multimap< EntityHandle, int >& remProcs )
3126 std::pair< std::multimap< EntityHandle, int >::iterator, std::multimap< EntityHandle, int >::iterator > it_hes;
3127 it_hes = remProcs.equal_range( entity );
3129 for( std::multimap< EntityHandle, int >::iterator it = it_hes.first; it != it_hes.second; ++it )
3131 if( it->second == proc )
3143 std::multimap< EntityHandle, EntityHandle >& remHandles,
3144 std::multimap< EntityHandle, int >& remProcs,
3148 std::pair< std::multimap< EntityHandle, int >::iterator, std::multimap< EntityHandle, int >::iterator > it_ps;
3149 it_ps = remProcs.equal_range( entity );
3152 std::pair< std::multimap< EntityHandle, EntityHandle >::iterator,
3153 std::multimap< EntityHandle, EntityHandle >::iterator >
3155 it_hs = remHandles.equal_range( entity );
3157 std::multimap< EntityHandle, int >::iterator itp;
3158 std::multimap< EntityHandle, EntityHandle >::iterator ith;
3160 for( itp = it_ps.first, ith = it_hs.first; itp != it_ps.second; ++itp, ++ith )
3162 if( itp->second == proc )
3164 rhandle = ith->second;
3186 int nhf = 0, nv = 0, total_new_verts = 0;
3210 std::vector< EntityHandle > ent;
3211 std::vector< int > lid;
3214 for(
int i = 0; i < total_new_verts; i++ )
3222 if( ent[0] )
continue;
3225 ent[0] = ent_buffer[id];
3233 for(
int i = 0; i < etotal; i++ )
3235 std::vector< EntityHandle > sib_entids( nhf );
3236 std::vector< int > sib_lids( nhf );
3241 for(
int l = 0; l < nhf; l++ )
3243 if( sib_entids[l] )
continue;
3249 sib_entids[l] = ent_buffer[
id - 1];
3262 for(
int l = 0; l < nhf; l++ )
3285 assert( type !=
MBTET );
3300 assert( pattern_ids == NULL );
3306 assert( pattern_ids == NULL );
3310 else if( type ==
MBHEX )
3312 assert( pattern_ids == NULL );
3316 else if( type ==
MBTET )
3318 assert( pattern_ids != NULL );
3340 int nhf, nchilds, nverts_prev, nents_prev;
3354 std::vector< EntityHandle > inci_ent, child_ents;
3355 std::vector< int > inci_lid, child_lids;
3358 for(
int i = 0; i < nverts_prev; i++ )
3378 int lvid =
get_local_vid( vid, inci_ent[0], cur_level - 1 );
3379 if( lvid < 0 )
MB_SET_ERR( MB_FAILURE,
"did not find local vertex ix " );
3388 int ind = nchilds * pid;
3390 child_ents.push_back(
level_mesh[cur_level].start_edge + ind + chid );
3391 child_lids.push_back(
refTemplates[0][d].v2hf[lvid][1] );
3398 for(
int i = 0; i < nents_prev; i++ )
3406 std::vector< EntityHandle > sib_entids( nhf );
3407 std::vector< int > sib_lids( nhf );
3414 for(
int l = 0; l < nhf; l++ )
3416 if( !sib_entids[l] )
continue;
3425 std::vector< EntityHandle > sib_childs( nhf );
3426 std::vector< int > sib_chlids( nhf );
3432 if( sib_childs[ch_lid] )
continue;
3441 int plid = sib_lids[l];
3444 idx = nchilds * psib;
3447 int psib_chlid = plid;
3450 sib_childs[ch_lid] = psib_child;
3451 sib_chlids[ch_lid] = psib_chlid;
3465 int nhf, nchilds, nents_prev;
3479 std::vector< EntityHandle > conn;
3480 for(
int i = 0; i < nents_prev; i++ )
3493 std::vector< EntityHandle > inci_ent, child_ents;
3494 std::vector< int > inci_lid, child_lids;
3495 for(
int j = 0; j < 2; j++ )
3512 if( inci_ent[0] != 0 )
continue;
3519 int lvid =
get_local_vid( conn[j], inci_ent[0], cur_level - 1 );
3520 if( lvid < 0 )
MB_SET_ERR( MB_FAILURE,
"did not find local vertex ix " );
3529 int ind = nchilds * pid;
3531 child_ents.push_back(
level_mesh[cur_level].start_edge + ind + chid );
3532 child_lids.push_back(
refTemplates[0][d].v2hf[lvid][1] );
3538 std::vector< EntityHandle > sib_entids( nhf );
3539 std::vector< int > sib_lids( nhf );
3546 for(
int l = 0; l < nhf; l++ )
3548 if( !sib_entids[l] )
continue;
3557 std::vector< EntityHandle > sib_childs( nhf );
3558 std::vector< int > sib_chlids( nhf );
3564 if( sib_childs[ch_lid] )
continue;
3573 int plid = sib_lids[l];
3576 idx = nchilds * psib;
3579 int psib_chlid = plid;
3582 sib_childs[ch_lid] = psib_child;
3583 sib_chlids[ch_lid] = psib_chlid;
3610 int nhf, nchilds, nverts_prev, nents_prev;
3627 std::vector< EntityHandle > inci_ent, child_ents;
3628 std::vector< int > inci_lid, child_lids;
3631 for(
int i = 0; i < nverts_prev; i++ )
3651 for(
int j = 0; j < (int)inci_ent.size(); j++ )
3653 int lvid =
get_local_vid( vid, inci_ent[j], cur_level - 1 );
3654 if( lvid < 0 )
MB_SET_ERR( MB_FAILURE,
"did not find local vertex ix " );
3663 int ind = nchilds * pid;
3665 child_ents.push_back(
level_mesh[cur_level].start_face + ind + chid );
3666 child_lids.push_back(
refTemplates[type - 1][d].v2hf[lvid][1] );
3675 for(
int i = 0; i < nents_prev; i++ )
3683 std::vector< EntityHandle > fid_conn;
3687 std::vector< EntityHandle > sib_entids( nhf );
3688 std::vector< int > sib_lids( nhf );
3695 for(
int l = 0; l < nhf; l++ )
3697 if( !sib_entids[l] )
continue;
3700 fedge[0] = fid_conn[l];
3701 fedge[1] = fid_conn[nidx];
3704 int slid = sib_lids[l];
3706 std::vector< EntityHandle > conn;
3712 if( ( fedge[1] == conn[slid] ) && ( fedge[0] == conn[nidx] ) ) orient =
false;
3714 if( orient ) assert( ( fedge[0] == conn[slid] ) && ( fedge[1] == conn[nidx] ) );
3721 for(
int k = 0; k < nch; k++ )
3733 if( child_sibent != 0 )
continue;
3749 int sidx = nchilds * psib;
3752 int psib_chlid = plid;
3769 int nhf, nchilds, nents_prev;
3781 for(
int i = 0; i < nents_prev; i++ )
3789 std::vector< EntityHandle > fid_conn;
3793 std::vector< EntityHandle > inci_ent, child_ents;
3794 std::vector< int > inci_lid, child_lids;
3797 for(
int j = 0; j < nhf; j++ )
3812 if( inci_ent[0] != 0 )
continue;
3819 for(
int k = 0; k < (int)inci_ent.size(); k++ )
3821 int lvid =
get_local_vid( fid_conn[j], inci_ent[k], cur_level - 1 );
3822 if( lvid < 0 )
MB_SET_ERR( MB_FAILURE,
"did not find local vertex ix " );
3831 int ind = nchilds * pid;
3833 child_ents.push_back(
level_mesh[cur_level].start_face + ind + chid );
3834 child_lids.push_back(
refTemplates[type - 1][d].v2hf[lvid][1] );
3842 std::vector< EntityHandle > sib_entids( nhf );
3843 std::vector< int > sib_lids( nhf );
3850 for(
int l = 0; l < nhf; l++ )
3852 if( !sib_entids[l] )
continue;
3855 fedge[0] = fid_conn[l];
3856 fedge[1] = fid_conn[nidx];
3859 int slid = sib_lids[l];
3861 std::vector< EntityHandle > conn;
3865 assert( (
int)conn.size() > nidx && (
int)conn.size() > slid );
3869 if( ( fedge[1] == conn[slid] ) && ( fedge[0] == conn[nidx] ) ) orient =
false;
3871 if( orient ) assert( ( fedge[0] == conn[slid] ) && ( fedge[1] == conn[nidx] ) );
3878 for(
int k = 0; k < nch; k++ )
3890 if( child_sibent != 0 )
continue;
3906 int sidx = nchilds * psib;
3909 int psib_chlid = plid;
3924 int nvpc, ne, nhf, nchilds, nverts_prev, nents_prev;
3946 std::vector< EntityHandle > inci_ent, child_ents;
3947 std::vector< int > inci_lid, child_lids;
3950 for(
int i = 0; i < nverts_prev; i++ )
3970 for(
int j = 0; j < (int)inci_ent.size(); j++ )
3972 int lvid =
get_local_vid( vid, inci_ent[j], cur_level - 1 );
3973 if( lvid < 0 )
MB_SET_ERR( MB_FAILURE,
"did not find local vertex ix " );
3982 int ind = nchilds * pid;
3986 child_ents.push_back(
level_mesh[cur_level].start_cell + ind + chid );
3987 child_lids.push_back(
refTemplates[type - 1][d].v2hf[lvid][1] );
3997 for(
int i = 0; i < nents_prev; i++ )
4005 std::vector< EntityHandle > sib_entids( nhf );
4006 std::vector< int > sib_lids( nhf );
4013 for(
int l = 0; l < nhf; l++ )
4016 if( !sib_entids[l] )
continue;
4021 pat_id = ( *pattern_ids )[i];
4027 std::vector< int > id_sib( nch );
4028 for(
int k = 0; k < nch; k++ )
4041 int plid = sib_lids[l];
4042 int sidx = nchilds * psib;
4045 sibpat_id = ( *pattern_ids )[psib];
4047 sibpat_id = type - 1;
4052 for(
int k = 0; k < nch; k++ )
4064 if( child_sibent != 0 )
continue;
4072 int psib_chlid = plid;
4091 for(
int l = 0; l < ne; l++ )
4098 bool visited =
false;
4100 std::vector< EntityHandle > inci_ent1, inci_ent2;
4101 std::vector< int > inci_lid1, inci_lid2;
4107 if( inci_ent1.size() > 1 && inci_ent2.size() > 1 )
4109 std::vector< EntityHandle > cell_comps;
4110 std::vector< int > leid_comps;
4115 int ncomps = cell_comps.size();
4116 std::vector< EntityHandle > edgverts;
4117 std::vector< EntityHandle > compchildents( nv * ncomps );
4118 std::vector< int > compchildlfids( nv * ncomps );
4120 for(
int s = 0; s < nv * ncomps; s++ )
4122 compchildents[s] = 0;
4123 compchildlfids[s] = 0;
4126 for(
int j = 0; j < (int)cell_comps.size(); j++ )
4134 for(
int k = 0; k < nv; k++ )
4154 if( edgverts.empty() )
4156 edgverts.push_back( vert );
4157 compchildents[0] = childcell;
4158 compchildlfids[0] = lfid;
4162 std::vector< EntityHandle >::iterator it;
4163 it = find( edgverts.begin(), edgverts.end(), vert );
4164 int indx = it - edgverts.begin();
4166 if( it == edgverts.end() )
4168 edgverts.push_back( vert );
4169 compchildents[k * ncomps] = childcell;
4170 compchildlfids[k * ncomps] = lfid;
4174 compchildents[indx * ncomps + j] = childcell;
4175 compchildlfids[indx * ncomps + j] = lfid;
4187 for(
int k = 0; k < nv; k++ )
4189 std::vector< EntityHandle > set_childents;
4190 std::vector< int > set_childlfids;
4191 for(
int j = 0; j < ncomps; j++ )
4193 set_childents.push_back( compchildents[k * ncomps + j] );
4194 set_childlfids.push_back( compchildlfids[k * ncomps + j] );
4211 std::vector< int >& child_ids,
4212 std::vector< int >& child_lvids )
4224 for(
int i = 0; i < nch; i++ )
4227 for(
int j = 0; j < nvpc; j++ )
4230 for(
int k = 0; k < nv; k++ )
4232 if( lv ==
refTemplates[type - 1][d].vert_on_edges[leid][k] )
4234 child_ids.push_back(
id );
4235 child_lvids.push_back( j );
4253 std::vector< EntityHandle > ent;
4254 std::vector< int > lid;
4267 MB_SET_ERR( MB_FAILURE,
"Requesting vertex boundary information for an unsupported entity type" );
4274 return ( sibents[lid[0]] == 0 );
4280 bool is_border =
false;
4287 for(
int i = 0; i < 2; i++ )
4289 if( sibents[i] == 0 )
4298 std::vector< EntityHandle > adjents;
4301 if( adjents.size() == 1 ) is_border =
true;
4305 std::vector< EntityHandle > adjents;
4306 std::vector< int > leids;
4309 assert( !adjents.empty() );
4314 for(
int i = 0; i < (int)adjents.size(); i++ )
4320 for(
int k = 0; k < 2; k++ )
4323 if( sibents[hf] == 0 )
4337 bool is_border =
false;
4340 MB_SET_ERR( MB_FAILURE,
"Requesting boundary information for a face entity type on a curve mesh" );
4349 for(
int i = 0; i < nepf; i++ )
4351 if( sibents[i] == 0 )
4360 std::vector< EntityHandle > adjents;
4363 if( adjents.size() == 1 ) is_border =
true;
4371 MB_SET_ERR( MB_FAILURE,
"Requesting boundary information for a cell entity type on a curve or surface mesh" );
4373 bool is_border =
false;
4382 for(
int i = 0; i < nfpc; i++ )
4384 if( sibents[i] == 0 )
4403 for(
int i = 0; i < nverts_prev; i++ )
4413 std::vector< double > vcoords( 3 * nverts_in );
4417 for(
int i = 0; i < nverts_in; i++ )
4431 std::vector< EntityHandle >& trackvertsC_edg,
4432 std::vector< EntityHandle >& trackvertsC_face,
4446 int cindex = cell_type - 1;
4457 for(
int i = 0; i < nepc; i++ )
4460 for(
int j = 0; j < nve; j++ )
4463 int idx = cid - cstart_prev;
4464 int aid = idx * nve * nepc + nve * i + j;
4466 if( !trackvertsC_edg[aid] ) trackvertsC_edg[aid] = vbuffer[id];
4470 std::vector< EntityHandle > inc_cids;
4471 std::vector< int > inc_leids, inc_orient;
4476 if( inc_cids.size() == 1 )
continue;
4479 for(
int k = 0; k < (int)inc_cids.size(); k++ )
4481 if( inc_cids[k] == cid )
continue;
4483 int idx = inc_cids[k] - cstart_prev;
4487 for(
int j = 0; j < nve; j++ )
4490 int aid = idx * nve * nepc + nve * inc_leids[k] + j;
4492 if( !trackvertsC_edg[aid] ) trackvertsC_edg[aid] = vbuffer[id];
4497 for(
int j = 0; j < nve; j++ )
4500 int aid = idx * nve * nepc + nve * inc_leids[k] + j;
4502 if( !trackvertsC_edg[aid] ) trackvertsC_edg[aid] = vbuffer[id];
4512 for(
int i = 0; i < nfpc; i++ )
4515 std::vector< EntityHandle > face_vbuf( nvf, 0 );
4516 for(
int j = 0; j < nvf; j++ )
4519 int idx = cid - cstart_prev;
4520 int aid = idx * nvf * nfpc + nvf * i + j;
4522 if( !trackvertsC_face[aid] ) trackvertsC_face[aid] = vbuffer[id];
4524 face_vbuf[j] = vbuffer[id];
4528 std::vector< EntityHandle > sib_cids;
4529 std::vector< int > sib_lfids;
4533 if( sib_cids.size() == 1 )
continue;
4536 std::vector< int > id_sib( nvf );
4537 for(
int k = 0; k < nvf; k++ )
4545 for(
int j = 0; j < nvf; j++ )
4547 int idx = sib_cids[1] - cstart_prev;
4548 int aid = idx * nvf * nfpc + nvf * sib_lfids[1] + j;
4550 if( !trackvertsC_face[aid] ) trackvertsC_face[aid] = face_vbuf[id_sib[j] - 1];
4570 assert( deg == 2 || deg == 3 );
4577 if( !
index && ( ( nvF == 3 && deg == 3 ) || ( nvF == 4 && deg == 2 ) ) )
4584 std::vector< EntityHandle > conn, sib_conn;
4592 std::vector< EntityHandle > lface( nvF );
4593 std::vector< EntityHandle > lface_sib( nvF );
4594 for(
int i = 0; i < nvF; i++ )
4597 lface[i] = conn[id];
4600 lface_sib[i] = sib_conn[id];
4605 for(
int i = 0; i < nco; i++ )
4608 for(
int j = 0; j < nvF; j++ )
4611 if( lface[j] == lface_sib[
id] ) count += 1;
4621 if( c > nco )
MB_SET_ERR( MB_FAILURE,
"Getting a combination number more than currently supported" );
4624 if( ( ( !
index ) && ( nvF == 4 ) && ( deg == 3 ) ) || ( deg == 2 ) )
4626 for(
int i = 0; i < 4; i++ )
4631 for(
int i = 0; i < 9; i++ )
4643 std::vector< int >& lemap,
4644 std::vector< int >& vidx,
4651 for(
int i = 0; i < nco; i++ )
4654 for(
int j = 0; j < nvF; j++ )
4657 if( face1_conn[j] == face2_conn[
id] ) count += 1;
4667 if( c > nco )
MB_SET_ERR( MB_FAILURE,
"Getting a combination number more than currently supported" );
4670 lemap.reserve( nvF );
4671 for(
int i = 0; i < nvF; i++ )
4673 lemap.push_back(
permutation[nvF - 3].lemap[c][i] );
4677 if( nvF == 3 && deg == 2 )
return MB_SUCCESS;
4679 if( ( nvF == 3 && deg == 3 ) || ( nvF == 4 && deg == 2 ) )
4681 vidx.push_back( 1 );
4683 else if( nvF == 4 && deg == 3 )
4685 for(
int i = 0; i < 4; i++ )
4697 assert( deg == 2 || deg == 3 );
4702 for(
int i = 0; i < 4; i++ )
4703 childfid_map[i] =
permutation[nvF - 3].porder2[comb][i];
4707 for(
int i = 0; i < 9; i++ )
4708 childfid_map[i] =
permutation[nvF - 3].porder3[comb][i];
4727 for(
int i = 0; i < nco; i++ )
4730 for(
int j = 0; j < nvF; j++ )
4733 if( face1_conn[j] == face2_conn[
id] ) count += 1;
4743 if( c > nco )
MB_SET_ERR( MB_FAILURE,
"Getting a combination number more than currently supported" );
4749 for(
int j = 0; j < nvF; j++ )
4761 if( cur_level >= 0 )
4763 Range edges, faces, cells;
4788 int lid[6] = { 0, 0, 0, 0, 0, 0 };
4811 for(
int i = 0; i < 6; i++ )
4829 int diag_map[6] = { 1, 3, 2, 4, 5, 0 };
4830 double length = std::numeric_limits< double >::max();
4836 for(
int d = 0; d < 3; d++ )
4838 int id1 = diag_map[2 * d];
4839 int id2 = diag_map[2 * d + 1];
4840 x = coords[3 * id1] - coords[3 * id2];
4841 y = coords[3 * id1 + 1] - coords[3 * id2 + 1];
4842 z = coords[3 * id1 + 2] - coords[3 * id2 + 2];
4843 double dlen = sqrt( x * x + y * y + z * z );
4858 std::vector< EntityHandle > conn;
4864 for(
int i = 0; i < (int)conn.size(); i++ )
4866 if( conn[i] == vid )
4872 if( lid < 0 )
MB_SET_ERR( MB_FAILURE,
"Error in getting local vertex id in the given entity" );
4878 int d =
deg_index.find( degree )->second;