18 #define ERRORR( rval, str ) \
20 if( MB_SUCCESS != ( rval ) ) \
22 std::cerr << ( str ); \
31 "sqijk",
"trivial",
"rcbzoltan",
"nopart" };
34 : mbImpl( imp ), searchedBoxes( false ), boxPeriodicTag( 0 ), boxDimsTag( 0 ), globalBoxDimsTag( 0 ),
35 partMethodTag( 0 ), boxSetTag( 0 )
43 std::vector< ScdBox* > tmp_boxes;
46 for( std::vector< ScdBox* >::iterator rit = tmp_boxes.begin(); rit != tmp_boxes.end(); ++rit )
67 scd_boxes.push_back( tmp_box );
82 "failed to get entitities by type and tag" );
100 for( std::vector< ScdBox* >::iterator vit =
scdBoxes.begin(); vit !=
scdBoxes.end(); ++vit )
101 scd_boxes.
insert( ( *vit )->box_set() );
117 const double*
const coords,
118 unsigned int num_coords,
120 int*
const lperiodic,
123 int tag_shared_ents )
128 int tmp_lper[3] = { 0, 0, 0 };
129 if( lperiodic ) std::copy( lperiodic, lperiodic + 3, tmp_lper );
131 #ifndef MOAB_HAVE_MPI
132 if( -1 != tag_shared_ents )
ERRORR( MB_FAILURE,
"Parallel capability requested but MOAB not compiled parallel." );
133 if( -1 == tag_shared_ents && !assign_gids ) assign_gids =
true;
138 if( !par_data->
pComm )
146 par_data->
pDims );
ERRORR( rval,
"Error returned from compute_partition." );
147 low.
set( ldims[0], ldims[1], ldims[2] );
148 high.
set( ldims[3], ldims[4], ldims[5] );
151 std::cout <<
"Proc " << par_data->
pComm->
rank() <<
": " << *par_data;
152 std::cout <<
"Proc " << par_data->
pComm->
rank() <<
" local dims: " << low <<
"-" << high << std::endl;
158 if( ( tmp_size[1] && num_coords && (
int)num_coords < tmp_size[0] ) ||
159 ( tmp_size[2] && num_coords && (
int)num_coords < tmp_size[0] * tmp_size[1] ) )
165 double *xc, *yc, *zc;
168 if( coords && num_coords )
171 for(
int kl = low[2]; kl <= high[2]; kl++ )
173 for(
int jl = low[1]; jl <= high[1]; jl++ )
175 for(
int il = low[0]; il <= high[0]; il++ )
177 xc[i] = coords[3 * i];
178 if( new_box->
box_size()[1] ) yc[i] = coords[3 * i + 1];
179 if( new_box->
box_size()[2] ) zc[i] = coords[3 * i + 2];
188 for(
int kl = low[2]; kl <= high[2]; kl++ )
190 for(
int jl = low[1]; jl <= high[1]; jl++ )
192 for(
int il = low[0]; il <= high[0]; il++ )
217 EntityType this_tp =
MBHEX;
218 if( 1 >= tmp_size[2] ) this_tp =
MBQUAD;
219 if( 1 >= tmp_size[2] && 1 >= tmp_size[1] ) this_tp =
MBEDGE;
220 rval = seq_mgr->
create_scd_sequence( low, high, this_tp, 0, start_ent, tmp_seq, tmp_lper );
ERRORR( rval,
"Trouble creating scd element sequence." );
232 low +
HomCoord( 0, 1, 0 ), low +
HomCoord( 0, 1, 0 ) );
ERRORR( rval,
"Error constructing structured element sequence." );
238 if( par_data ) new_box->
par_data( *par_data );
246 if( par_data && -1 != tag_shared_ents )
264 int* gid_data = (
int*)data;
278 *gid_data = ( -1 != kl ? kl * di * dj : 0 ) + jl * di + itmp + 1;
295 if( ( tp ==
MBHEX && 1 >= tmp_size[2] ) || ( tp ==
MBQUAD && 1 >= tmp_size[1] ) ||
296 ( tp ==
MBEDGE && 1 >= tmp_size[0] ) )
300 assert( mbcore != NULL );
315 new_box =
new ScdBox(
this, scd_set, tmp_seq );
316 if( !new_box )
return MB_FAILURE;
351 for(
int i = 0; i < 3; i++ )
353 for(
int i = 0; i < 3; i++ )
354 boxdims[3 + i] = high[i];
372 std::string tag_name;
389 std::string tag_name;
405 std::string tag_name;
422 std::string tag_name;
439 std::string tag_name;
454 std::vector< ScdBox* >::iterator vit = std::find(
scdBoxes.begin(),
scdBoxes.end(), box );
478 : scImpl( impl ), boxSet( bset ), vertDat( NULL ), elemSeq( NULL ), startVertex( 0 ), startElem( 0 )
480 for(
int i = 0; i < 6; i++ )
482 for(
int i = 0; i < 3; i++ )
489 for(
int i = 0; i < 3; i++ )
522 for(
int i = 0; i < 3; i++ )
559 assert( mbcore != NULL );
594 if( !vbox->
vertDat )
return MB_FAILURE;
608 if( !
vertDat )
return MB_FAILURE;
618 if( !
vertDat )
return MB_FAILURE;
649 if( ( 0 == this_dim && !
vertDat ) || ( this_dim && this_dim == dimension ) )
655 else if( !this_dim &&
vertDat )
678 bool create_if_missing )
const
686 int subconnect[2][3][4][3] = { { { { 0, 0, 0 }, { 1, 0, 0 }, { -1, -1, -1 }, { -1, -1, -1 } },
687 { { 0, 0, 0 }, { 0, 1, 0 }, { -1, -1, -1 }, { -1, -1, -1 } },
688 { { 0, 0, 0 }, { 0, 0, 1 }, { -1, -1, -1 }, { -1, -1, -1 } } },
690 { { { 0, 0, 0 }, { 0, 1, 0 }, { 0, 1, 1 }, { 0, 0, 1 } },
691 { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 0, 1 }, { 0, 0, 1 } },
692 { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 1, 0 }, { 0, 1, 0 } } } };
706 for(
int ind = 0; ind < 2 * dim; ind++ )
708 int i1 = i + subconnect[dim - 1][dir][ind][0];
709 int j1 = j + subconnect[dim - 1][dir][ind][1];
714 verts[ind] =
get_vertex( i1, j1, k + subconnect[dim - 1][dir][ind][2] );
715 if( !verts[ind] )
return MB_FAILURE;
722 if( ents.
size() > 1 )
725 else if( ents.
size() == 1 )
729 else if( create_if_missing )
735 #ifndef MOAB_HAVE_MPI
752 if( ( gdims[0] == gdims[3] && gdims[1] == gdims[4] && gdims[2] == gdims[5] ) || -1 == box->
par_data().
partMethod )
756 std::vector< int > procs, offsets, shared_indices;
761 std::vector< MPI_Request > recv_reqs( procs.size(), MPI_REQUEST_NULL ), send_reqs( procs.size(), MPI_REQUEST_NULL );
762 std::vector< EntityHandle > rhandles( 4 * procs.size() ), shandles( 4 );
763 for(
unsigned int i = 0; i < procs.size(); i++ )
765 int success = MPI_Irecv( (
void*)&rhandles[4 * i], 4 *
sizeof(
EntityHandle ), MPI_UNSIGNED_CHAR, procs[i], 1,
767 if( success != MPI_SUCCESS )
return MB_FAILURE;
789 for(
unsigned int i = 0; i < procs.size(); i++ )
791 int success = MPI_Isend( (
void*)&shandles[0], 4 *
sizeof(
EntityHandle ), MPI_UNSIGNED_CHAR, procs[i], 1,
793 if( success != MPI_SUCCESS )
return MB_FAILURE;
797 int incoming = procs.size();
801 shared_data.
initialize( 1, 0, 2, 0, shared_indices.size() / 2 );
808 int success = MPI_Waitany( procs.size(), &recv_reqs[0], &p, &status );
809 if( MPI_SUCCESS != success )
return MB_FAILURE;
810 unsigned int num_indices = ( offsets[p + 1] - offsets[p] ) / 2;
811 int *lh = &shared_indices[offsets[p]], *rh = lh + num_indices;
812 for(
unsigned int i = 0; i < num_indices; i++ )
814 shared_data.
vi_wr[j++] = procs[p];
815 shared_data.
vul_wr[k++] = shandles[0] + lh[i];
816 shared_data.
vul_wr[k++] = rhandles[4 * p] + rh[i];
823 std::vector< MPI_Status > mult_status( procs.size() );
824 int success = MPI_Waitall( procs.size(), &send_reqs[0], &mult_status[0] );
825 if( MPI_SUCCESS != success )
827 MB_SET_ERR( MB_FAILURE,
"Failed in waitall in ScdInterface::tag_shared_vertices" );
831 sort_buffer.buffer_init( shared_indices.size() / 2 );
832 shared_data.
sort( 1, &sort_buffer );
836 std::map< std::vector< int >, std::vector< EntityHandle > > proc_nvecs;
849 for( std::vector< int >::iterator pit = procs.begin(); pit != procs.end(); ++pit )
866 const int*
const gdims,
867 const int*
const gperiodic,
868 const int*
const dijk,
881 across_bdy[0] = across_bdy[1] = across_bdy[2] = 0;
883 int ldims[6], pijk[3], lperiodic[3];
886 assert( pijk[1] * pijk[2] == np );
888 bool bot_j = pfrom< pijk[2], top_j = pfrom > np - pijk[2];
889 if( ( 1 == pijk[2] && dijk[2] ) ||
890 ( !( pfrom % pijk[2] ) && -1 == dijk[2] ) ||
891 ( pfrom % pijk[2] == pijk[2] - 1 && 1 == dijk[2] ) ||
892 ( pfrom < pijk[2] && -1 == dijk[1] && !gperiodic[1] ) ||
893 ( pfrom >= np - pijk[2] && 1 == dijk[1] && !gperiodic[1] ) )
897 std::copy( ldims, ldims + 6, rdims );
898 std::copy( ldims, ldims + 6, facedims );
902 pto = ( pto + dijk[1] * pijk[2] + np ) % np;
903 assert( pto >= 0 && pto < np );
904 int dj = ( gdims[4] - gdims[1] ) / pijk[1], extra = ( gdims[4] - gdims[1] ) % pijk[1];
907 facedims[4] = facedims[1];
918 rdims[1] = rdims[4] - dj;
919 if( pto < extra ) rdims[1]--;
923 if( pfrom > np - pijk[2] ) facedims[4] = gdims[1];
924 facedims[1] = facedims[4];
935 rdims[4] = rdims[1] + dj;
936 if( pto < extra ) rdims[4]++;
941 pto = ( pto + dijk[2] ) % np;
942 assert( pto >= 0 && pto < np );
943 facedims[2] = facedims[5] = ( -1 == dijk[2] ? facedims[2] : facedims[5] );
944 int dk = ( gdims[5] - gdims[2] ) / pijk[2];
947 facedims[5] = facedims[2];
949 rdims[2] = rdims[5] - dk;
953 facedims[2] = facedims[5];
955 rdims[5] = rdims[2] + dk;
959 assert( -1 == pto || ( rdims[0] >= gdims[0] && rdims[3] <= gdims[3] ) );
960 assert( -1 == pto || ( rdims[1] >= gdims[1] && ( rdims[4] <= gdims[4] || ( across_bdy[1] && bot_j ) ) ) );
961 assert( -1 == pto || ( rdims[2] >= gdims[2] && rdims[5] <= gdims[5] ) );
962 assert( -1 == pto || ( ( facedims[0] >= rdims[0] ||
963 ( gperiodic[0] && rdims[3] == gdims[3] + 1 && facedims[0] == gdims[0] ) ) ) );
964 assert( -1 == pto || ( facedims[3] <= rdims[3] ) );
965 assert( -1 == pto || ( ( facedims[1] >= rdims[1] ||
966 ( gperiodic[1] && rdims[4] == gdims[4] + 1 && facedims[1] == gdims[1] ) ) ) );
967 assert( -1 == pto || ( facedims[4] <= rdims[4] ) );
968 assert( -1 == pto || ( facedims[2] >= rdims[2] ) );
969 assert( -1 == pto || ( facedims[5] <= rdims[5] ) );
970 assert( -1 == pto || ( facedims[0] >= ldims[0] ) );
971 assert( -1 == pto || ( facedims[3] <= ldims[3] ) );
972 assert( -1 == pto || ( facedims[1] >= ldims[1] ) );
973 assert( -1 == pto || ( facedims[4] <= ldims[4] ) );
974 assert( -1 == pto || ( facedims[2] >= ldims[2] ) );
975 assert( -1 == pto || ( facedims[5] <= ldims[5] ) );
982 const int*
const gdims,
983 const int*
const gperiodic,
984 const int*
const dijk,
998 across_bdy[0] = across_bdy[1] = across_bdy[2] = 0;
999 int lperiodic[3], pijk[3], ldims[6];
1002 assert( pijk[0] * pijk[1] == np );
1004 bool top_i = 0, top_j = 0, bot_i = 0, bot_j = 0;
1005 int ni = pfrom % pijk[0], nj = pfrom / pijk[0];
1006 if( ni == pijk[0] - 1 ) top_i = 1;
1007 if( nj == pijk[1] - 1 ) top_j = 1;
1008 if( !ni ) bot_i = 1;
1009 if( !nj ) bot_j = 1;
1010 if( ( !gperiodic[0] && bot_i && -1 == dijk[0] ) ||
1011 ( !gperiodic[0] && top_i && 1 == dijk[0] ) ||
1012 ( !gperiodic[1] && bot_j && -1 == dijk[1] ) ||
1013 ( !gperiodic[1] && top_j && 1 == dijk[1] ) )
1016 std::copy( ldims, ldims + 6, facedims );
1017 std::copy( ldims, ldims + 6, rdims );
1019 int j = gdims[4] - gdims[1], dj = j / pijk[1], jextra = ( gdims[4] - gdims[1] ) % dj, i = gdims[3] - gdims[0],
1020 di = i / pijk[0], iextra = ( gdims[3] - gdims[0] ) % di;
1024 pto = ( ni + dijk[0] + pijk[0] ) % pijk[0];
1025 pto = nj * pijk[0] + pto;
1026 assert( pto >= 0 && pto < np );
1029 facedims[3] = facedims[0];
1034 rdims[3] = gdims[3] + 1;
1035 rdims[0] = rdims[3] - di - 1;
1039 rdims[3] = ldims[0];
1040 rdims[0] = rdims[3] - di;
1043 if( pto % pijk[0] < iextra ) rdims[0]--;
1050 facedims[3] = gdims[0];
1053 facedims[0] = facedims[3];
1054 rdims[0] = ( top_i ? gdims[0] : ldims[3] );
1055 rdims[3] = rdims[0] + di;
1056 if( pto % pijk[0] < iextra ) rdims[3]++;
1057 if( gperiodic[0] && ni == pijk[0] - 2 ) rdims[3]++;
1062 pto = ( pto + dijk[1] * pijk[0] + np ) % np;
1063 assert( pto >= 0 && pto < np );
1066 facedims[4] = facedims[1];
1070 rdims[4] = gdims[4] + 1;
1071 rdims[1] = rdims[4] - dj - 1;
1076 rdims[4] = ldims[1];
1077 rdims[1] = rdims[4] - dj;
1079 if( pto / pijk[0] < jextra ) rdims[1]--;
1086 facedims[4] = gdims[1];
1087 rdims[1] = gdims[1];
1092 rdims[1] = ldims[4];
1094 facedims[1] = facedims[4];
1095 rdims[4] = rdims[1] + dj;
1096 if( nj + 1 < jextra ) rdims[4]++;
1097 if( gperiodic[1] && nj == pijk[1] - 2 ) rdims[4]++;
1102 assert( -1 == pto || ( rdims[0] >= gdims[0] &&
1103 ( rdims[3] <= gdims[3] + ( gperiodic[0] && pto % pijk[0] == pijk[0] - 1 ? 1 : 0 ) ) ) );
1104 assert( -1 == pto || ( rdims[1] >= gdims[1] &&
1105 ( rdims[4] <= gdims[4] + ( gperiodic[1] && pto / pijk[0] == pijk[1] - 1 ? 1 : 0 ) ) ) );
1106 assert( -1 == pto || ( rdims[2] >= gdims[2] && rdims[5] <= gdims[5] ) );
1108 assert( -1 == pto || ( ( facedims[0] >= rdims[0] ||
1109 ( gperiodic[0] && pto % pijk[0] == pijk[0] - 1 && facedims[0] == gdims[0] ) ) ) );
1110 assert( -1 == pto || ( facedims[3] <= rdims[3] ) );
1111 assert( -1 == pto || ( ( facedims[1] >= rdims[1] ||
1112 ( gperiodic[1] && pto / pijk[0] == pijk[1] - 1 && facedims[1] == gdims[1] ) ) ) );
1113 assert( -1 == pto || ( facedims[4] <= rdims[4] ) );
1114 assert( -1 == pto || ( facedims[2] >= rdims[2] && facedims[5] <= rdims[5] ) );
1116 assert( -1 == pto || ( ( facedims[0] >= ldims[0] || ( top_i && facedims[0] == gdims[0] ) ) ) );
1117 assert( -1 == pto || ( facedims[3] <= ldims[3] ) );
1118 assert( -1 == pto || ( ( facedims[1] >= ldims[1] || ( gperiodic[1] && top_j && facedims[1] == gdims[1] ) ) ) );
1119 assert( -1 == pto || ( facedims[4] <= ldims[4] ) );
1120 assert( -1 == pto || ( facedims[2] >= ldims[2] && facedims[5] <= ldims[5] ) );
1127 const int*
const gdims,
1128 const int*
const gperiodic,
1129 const int*
const dijk,
1142 across_bdy[0] = across_bdy[1] = across_bdy[2] = 0;
1143 int pijk[3], lperiodic[3], ldims[6];
1146 assert( pijk[1] * pijk[2] == np );
1148 bool top_j = 0, top_k = 0, bot_j = 0, bot_k = 0;
1149 int nj = pfrom % pijk[1], nk = pfrom / pijk[1];
1150 if( nj == pijk[1] - 1 ) top_j = 1;
1151 if( nk == pijk[2] - 1 ) top_k = 1;
1152 if( !nj ) bot_j = 1;
1153 if( !nk ) bot_k = 1;
1154 if( ( !gperiodic[1] && bot_j && -1 == dijk[1] ) ||
1155 ( !gperiodic[1] && top_j && 1 == dijk[1] ) ||
1156 ( bot_k && -1 == dijk[2] ) ||
1157 ( top_k && 1 == dijk[2] ) )
1160 std::copy( ldims, ldims + 6, facedims );
1161 std::copy( ldims, ldims + 6, rdims );
1163 int dj = ( gdims[4] - gdims[1] ) / pijk[1], jextra = ( gdims[4] - gdims[1] ) % dj,
1164 dk = ( gdims[5] == gdims[2] ? 0 : ( gdims[5] - gdims[2] ) / pijk[2] ),
1165 kextra = ( gdims[5] - gdims[2] ) - dk * pijk[2];
1166 assert( ( dj * pijk[1] + jextra == ( gdims[4] - gdims[1] ) ) &&
1167 ( dk * pijk[2] + kextra == ( gdims[5] - gdims[2] ) ) );
1170 pto = ( nj + dijk[1] + pijk[1] ) % pijk[1];
1171 pto = nk * pijk[1] + pto;
1172 assert( pto >= 0 && pto < np );
1175 facedims[4] = facedims[1];
1179 rdims[4] = gdims[4] + 1;
1184 rdims[4] = ldims[1];
1186 rdims[1] = rdims[4] - dj;
1187 if( nj < jextra ) rdims[1]--;
1194 rdims[1] = gdims[1];
1195 facedims[4] = gdims[1];
1200 rdims[1] = ldims[4];
1202 facedims[1] = facedims[4];
1203 rdims[4] = rdims[1] + dj;
1204 if( nj < jextra ) rdims[4]++;
1205 if( gperiodic[1] && nj == dijk[1] - 2 ) rdims[4]++;
1210 pto = ( pto + dijk[2] * pijk[1] + np ) % np;
1211 assert( pto >= 0 && pto < np );
1214 facedims[5] = facedims[2];
1215 rdims[5] = ldims[2];
1217 if( pto / pijk[1] < kextra ) rdims[2]--;
1221 facedims[2] = facedims[5];
1222 rdims[2] = ldims[5];
1224 if( pto / pijk[1] < kextra ) rdims[5]++;
1228 assert( -1 == pto || ( rdims[0] >= gdims[0] && rdims[3] <= gdims[3] ) );
1229 assert( -1 == pto || ( rdims[1] >= gdims[1] && ( rdims[4] <= gdims[4] || ( across_bdy[1] && bot_j ) ) ) );
1230 assert( -1 == pto || ( rdims[2] >= gdims[2] && rdims[5] <= gdims[5] ) );
1231 assert( -1 == pto || ( facedims[0] >= rdims[0] && facedims[3] <= rdims[3] ) );
1232 assert( -1 == pto ||
1233 ( ( facedims[1] >= rdims[1] || ( gperiodic[1] && rdims[4] == gdims[4] && facedims[1] == gdims[1] ) ) ) );
1234 assert( -1 == pto || ( facedims[4] <= rdims[4] ) );
1235 assert( -1 == pto || ( facedims[2] >= rdims[2] && facedims[5] <= rdims[5] ) );
1236 assert( -1 == pto || ( facedims[0] >= ldims[0] && facedims[3] <= ldims[3] ) );
1237 assert( -1 == pto || ( facedims[1] >= ldims[1] && facedims[4] <= ldims[4] ) );
1238 assert( -1 == pto || ( facedims[2] >= ldims[2] && facedims[5] <= ldims[5] ) );
1245 const int*
const gdims,
1246 const int*
const gperiodic,
1247 const int*
const dijk,
1253 if( gperiodic[0] || gperiodic[1] || gperiodic[2] )
return MB_FAILURE;
1256 across_bdy[0] = across_bdy[1] = across_bdy[2] = 0;
1257 int pijk[3], lperiodic[3], ldims[6];
1260 assert( pijk[0] * pijk[1] * pijk[2] == np );
1262 bool top[3] = {
false,
false,
false }, bot[3] = {
false,
false,
false };
1264 int nijk[3] = { pfrom % pijk[0], ( pfrom % ( pijk[0] * pijk[1] ) ) / pijk[0], pfrom / ( pijk[0] * pijk[1] ) };
1266 for(
int i = 0; i < 3; i++ )
1268 if( nijk[i] == pijk[i] - 1 ) top[i] =
true;
1269 if( !nijk[i] ) bot[i] =
true;
1270 if( ( !gperiodic[i] && bot[i] && -1 == dijk[i] ) ||
1271 ( !gperiodic[i] && top[i] && 1 == dijk[i] ) )
1275 std::copy( ldims, ldims + 6, facedims );
1276 std::copy( ldims, ldims + 6, rdims );
1278 int delijk[3], extra[3];
1281 for(
int i = 0; i < 3; i++ )
1283 delijk[i] = ( gdims[i + 3] == gdims[i] ? 0 : ( gdims[i + 3] - gdims[i] ) / pijk[i] );
1284 extra[i] = ( gdims[i + 3] - gdims[i] ) % delijk[i];
1285 nijk_to[i] = ( nijk[i] + dijk[i] + pijk[i] ) % pijk[i];
1287 pto = nijk_to[2] * pijk[0] * pijk[1] + nijk_to[1] * pijk[0] + nijk_to[0];
1288 assert( pto >= 0 && pto < np );
1289 for(
int i = 0; i < 3; i++ )
1295 facedims[i + 3] = facedims[i];
1299 rdims[i + 3] = gdims[i + 3] + 1;
1304 rdims[i + 3] = ldims[i];
1306 rdims[i] = rdims[i + 3] - delijk[i];
1307 if( nijk[i] < extra[i] ) rdims[i]--;
1314 rdims[i] = gdims[i];
1315 facedims[i + 3] = gdims[i];
1320 rdims[i] = ldims[i + 3];
1322 facedims[i] = facedims[i + 3];
1323 rdims[i + 3] = rdims[i] + delijk[i];
1324 if( nijk[i] < extra[i] ) rdims[i + 3]++;
1325 if( gperiodic[i] && nijk[i] == dijk[i] - 2 ) rdims[i + 3]++;
1330 assert( -1 != pto );
1332 for(
int i = 0; i < 3; i++ )
1334 assert( ( rdims[i] >= gdims[i] && ( rdims[i + 3] <= gdims[i + 3] || ( across_bdy[i] && bot[i] ) ) ) );
1335 assert( ( ( facedims[i] >= rdims[i] ||
1336 ( gperiodic[i] && rdims[i + 3] == gdims[i + 3] && facedims[i] == gdims[i] ) ) ) );
1337 assert( ( facedims[i] >= ldims[i] && facedims[i + 3] <= ldims[i + 3] ) );
1346 const int*
const gdims,
1347 const int*
const gperiodic,
1348 const int*
const dijk,
1358 int pijk[3], lperiodic[3], ldims[6];
1363 across_bdy[0] = across_bdy[1] = across_bdy[2] = 0;
1365 for(
int i = 0; i < 3; i++ )
1380 bool is_periodic = ( ( gperiodic[0] && ind == 0 ) || ( gperiodic[1] && ind == 1 ) );
1381 if( dijk[( ind + 1 ) % 3] || dijk[( ind + 2 ) % 3] ||
1382 ( !is_periodic && ldims[ind] == gdims[ind] && dijk[ind] == -1 ) ||
1383 ( !is_periodic && ldims[3 + ind] >= gdims[3 + ind] &&
1388 std::copy( ldims, ldims + 6, facedims );
1389 std::copy( ldims, ldims + 6, rdims );
1391 int dind = ( gdims[ind + 3] - gdims[ind] ) / np;
1392 int extra = ( gdims[ind + 3] - gdims[ind] ) % np;
1393 if( -1 == dijk[ind] && pfrom )
1397 facedims[ind + 3] = facedims[ind];
1398 rdims[ind + 3] = ldims[ind];
1399 rdims[ind] = rdims[ind + 3] - dind - ( pto < extra ? 1 : 0 );
1401 else if( 1 == dijk[ind] && pfrom < np - 1 )
1405 facedims[ind] = facedims[ind + 3];
1406 rdims[ind] = ldims[ind + 3];
1407 rdims[ind + 3] = rdims[ind] + dind + ( pto < extra ? 1 : 0 );
1408 if( is_periodic && pfrom == np - 2 ) rdims[ind + 3]++;
1410 else if( -1 == dijk[ind] && !pfrom && gperiodic[ind] )
1414 facedims[ind + 3] = facedims[ind] = gdims[ind];
1417 rdims[ind] = rdims[ind + 3] - dind - 1;
1418 across_bdy[ind] = -1;
1420 else if( 1 == dijk[ind] && pfrom == np - 1 && is_periodic )
1424 facedims[ind + 3] = facedims[ind] = gdims[ind];
1425 rdims[ind] = gdims[ind];
1426 rdims[ind + 3] = rdims[ind] + dind + ( pto < extra ? 1 : 0 );
1427 across_bdy[ind] = 1;
1430 assert( -1 == pto || ( rdims[0] >= gdims[0] && ( rdims[3] <= gdims[3] || ( across_bdy[0] && !pfrom ) ) ) );
1431 assert( -1 == pto || ( rdims[1] >= gdims[1] && ( rdims[4] <= gdims[4] || ( across_bdy[1] && !pfrom ) ) ) );
1432 assert( -1 == pto || ( rdims[2] >= gdims[2] && rdims[5] <= gdims[5] ) );
1433 assert( -1 == pto || ( facedims[0] >= rdims[0] && facedims[3] <= rdims[3] ) );
1434 assert( -1 == pto || ( facedims[1] >= rdims[1] && facedims[4] <= rdims[4] ) );
1435 assert( -1 == pto || ( facedims[2] >= rdims[2] && facedims[5] <= rdims[5] ) );
1436 assert( -1 == pto || ( facedims[0] >= ldims[0] && facedims[3] <= ldims[3] ) );
1437 assert( -1 == pto || ( facedims[1] >= ldims[1] && facedims[4] <= ldims[4] ) );
1438 assert( -1 == pto || ( facedims[2] >= ldims[2] && facedims[5] <= ldims[5] ) );
1444 #ifndef MOAB_HAVE_MPI
1447 std::vector< int >&,
1448 std::vector< int >&,
1449 std::vector< int >& )
1455 std::vector< int >& procs,
1456 std::vector< int >& offsets,
1457 std::vector< int >& shared_indices )
1460 const int* ldims = box->
box_dims();
1462 int ijkrem[6], ijkface[6], across_bdy[3];
1464 for(
int k = -1; k <= 1; k++ )
1466 for(
int j = -1; j <= 1; j++ )
1468 for(
int i = -1; i <= 1; i++ )
1470 if( !i && !j && !k )
continue;
1472 int dijk[] = { i, j, k };
1474 box->
par_data(), dijk, pto, ijkrem, ijkface, across_bdy );
1478 if( procs.empty() || pto != *procs.rbegin() )
1480 procs.push_back( pto );
1481 offsets.push_back( shared_indices.size() );
1483 rval =
get_indices( ldims, ijkrem, across_bdy, ijkface, shared_indices );
1491 int start_idx = *offsets.rbegin(), end_idx = shared_indices.size(),
1492 mid_idx = ( start_idx + end_idx ) / 2;
1494 int num_local_verts = ( ldims[3] - ldims[0] + 1 ) * ( ldims[4] - ldims[1] + 1 ) *
1495 ( -1 == ldims[2] && -1 == ldims[5] ? 1 : ( ldims[5] - ldims[2] + 1 ) ),
1496 num_remote_verts = ( ijkrem[3] - ijkrem[0] + 1 ) * ( ijkrem[4] - ijkrem[1] + 1 ) *
1497 ( -1 == ijkrem[2] && -1 == ijkrem[5] ? 1 : ( ijkrem[5] - ijkrem[2] + 1 ) );
1500 *std::min_element( &shared_indices[start_idx], &shared_indices[mid_idx] ) >= 0 &&
1501 *std::max_element( &shared_indices[start_idx], &shared_indices[mid_idx] ) < num_local_verts &&
1502 *std::min_element( &shared_indices[mid_idx], &shared_indices[end_idx] ) >= 0 &&
1503 *std::max_element( &shared_indices[mid_idx], &shared_indices[end_idx] ) < num_remote_verts );
1510 offsets.push_back( shared_indices.size() );
1521 << pd.
pDims[0] <<
"," << pd.
pDims[1] <<
"," << pd.
pDims[2] <<
")" << std::endl;