16 #include "TestUtil.hpp"
62 int main(
int argc,
char* argv[] )
66 MPI_Init( &argc, &argv );
82 std::string fileN = TestDir +
"unittest/mbcslam/fine4.h5m";
84 rval =
mb.
load_file( fileN.c_str(), &euler_set );CHECK_ERR( rval );
108 rval =
add_field_value( &
mb, euler_set, rank, rhoNodeTag, rhoTag, areaTag, 2 );CHECK_ERR( rval );
142 std::vector< double > coords( 3 * num_nodes );
150 for(
int inode = 0; inode < num_nodes; inode++ )
152 centerx += coords[inode * 3] / num_nodes;
153 centery += coords[inode * 3 + 1] / num_nodes;
154 centerz += coords[inode * 3 + 2] / num_nodes;
156 double R = std::sqrt( centerx * centerx + centery * centery + centerz * centerz );
157 centerx = centerx /
R;
158 centery = centery /
R;
159 centerz = centerz /
R;
167 rval =
mb->
tag_set_data( planeTag, &icell, 1, &plane );CHECK_ERR( rval );
193 std::vector< double > coords( 3 * num_nodes );
201 std::vector< double > x( num_nodes );
202 std::vector< double > y( num_nodes );
206 for(
int inode = 0; inode < num_nodes; inode++ )
209 double rad = sqrt( coords[inode * 3] * coords[inode * 3] + coords[inode * 3 + 1] * coords[inode * 3 + 1] +
210 coords[inode * 3 + 2] * coords[inode * 3 + 2] );
211 CartVect xyzcoord( coords[inode * 3] / rad, coords[inode * 3 + 1] / rad, coords[inode * 3 + 2] / rad );
216 for(
int inode = 0; inode < num_nodes; inode++ )
218 int inode2 = inode + 1;
219 if( inode2 >= num_nodes ) inode2 = 0;
220 double xmid = 0.5 * ( x[inode] + x[inode2] );
221 double ymid = 0.5 * ( y[inode] + y[inode2] );
222 double r1 = sqrt( 1 + x[inode] * x[inode] + y[inode] * y[inode] );
223 double rm = sqrt( 1 + xmid * xmid + ymid * ymid );
224 double r2 = sqrt( 1 + x[inode2] * x[inode2] + y[inode2] * y[inode2] );
225 double hx = x[inode2] - x[inode];
228 ( y[inode] / ( r1 * ( 1 + x[inode] * x[inode] ) ) + 4.0 * ymid / ( rm * ( 1 + xmid * xmid ) ) +
229 y[inode2] / ( r2 * ( 1 + x[inode2] * x[inode2] ) ) ) /
233 ( x[inode] * y[inode] / ( r1 * ( 1 + x[inode] * x[inode] ) ) +
234 4.0 * xmid * ymid / ( rm * ( 1 + xmid * xmid ) ) +
235 x[inode2] * y[inode2] / ( r2 * ( 1 + x[inode2] * x[inode2] ) ) ) /
238 bary_y += -hx * ( 1.0 / r1 + 4.0 / rm + 1.0 / r2 ) / 6.0;
241 bary_x = bary_x / area;
242 bary_y = bary_y / area;
247 std::vector< double > barycenter( 3 );
248 barycenter[0] = barycent[0];
249 barycenter[1] = barycent[1];
250 barycenter[2] = barycent[2];
252 rval =
mb->
tag_set_data( barycenterTag, &icell, 1, &barycenter[0] );CHECK_ERR( rval );
285 rval =
mb->
get_adjacencies( &icell, 1, 1,
true, adjacentEdges );CHECK_ERR( rval );
294 rval =
mb->
tag_get_data( planeTag, &icell, 1, &plane );CHECK_ERR( rval );
296 std::vector< double > dx( adjacentCells.
size() - 1 );
297 std::vector< double > dy( adjacentCells.
size() - 1 );
298 std::vector< double > dr( adjacentCells.
size() - 1 );
303 std::vector< double > barycent( 3 );
304 rval =
mb->
tag_get_data( barycenterTag, &icell, 1, &barycent[0] );CHECK_ERR( rval );
305 CartVect barycenter( barycent[0], barycent[1], barycent[2] );
306 double cellbaryx = 0;
307 double cellbaryy = 0;
313 rval =
mb->
tag_get_data( rhoTag, &icell, 1, &rhocell );CHECK_ERR( rval );
316 std::vector< double > cell_barys( 3 * adjacentCells.
size() );
317 rval =
mb->
tag_get_data( barycenterTag, adjacentCells, &cell_barys[0] );CHECK_ERR( rval );
320 std::vector< double > rho_vals( adjacentCells.
size() );
321 rval =
mb->
tag_get_data( rhoTag, adjacentCells, &rho_vals[0] );CHECK_ERR( rval );
323 std::size_t jind = 0;
324 for( std::size_t i = 0; i < adjacentCells.
size(); i++ )
327 if( adjacentCells[i] != icell )
329 CartVect bary_xyz( cell_barys[i * 3], cell_barys[i * 3 + 1], cell_barys[i * 3 + 2] );
333 dx[jind] = bary_x - cellbaryx;
334 dy[jind] = bary_y - cellbaryy;
335 dr[jind] = rho_vals[i] - rhocell;
341 std::vector< double > linearCoef( 3 );
342 if( adjacentCells.
size() == 5 )
346 double N11 = dx[1] * dx[1] + dx[2] * dx[2] + dx[3] * dx[3] + dx[0] * dx[0];
347 double N22 = dy[1] * dy[1] + dy[2] * dy[2] + dy[3] * dy[3] + dy[0] * dy[0];
348 double N12 = dx[1] * dy[1] + dx[2] * dy[2] + dx[3] * dy[3] + dx[0] * dy[0];
351 double Rx = dx[1] * dr[1] + dx[2] * dr[2] + dx[3] * dr[3] + dx[0] * dr[0];
352 double Ry = dy[1] * dr[1] + dy[2] * dr[2] + dy[3] * dr[3] + dy[0] * dr[0];
355 double Det = N11 * N22 - N12 * N12;
358 linearCoef[0] = ( Rx * N22 - Ry * N12 ) / Det;
359 linearCoef[1] = ( Ry * N11 - Rx * N12 ) / Det;
360 linearCoef[2] = rhocell - linearCoef[0] * cellbaryx - linearCoef[1] * cellbaryy;
367 linearCoef[2] = rhocell;
368 std::cout <<
"Need 4 adjacent cells for linear reconstruction! \n";
371 rval =
mb->
tag_set_data( linearCoefTag, &icell, 1, &linearCoef[0] );CHECK_ERR( rval );
403 std::vector< double > coords( 3 * num_nodes );
409 rval =
mb->
tag_get_data( planeTag, &icell, 1, &plane );CHECK_ERR( rval );
412 std::vector< double > x( num_nodes );
413 std::vector< double > y( num_nodes );
414 for(
int inode = 0; inode < num_nodes; inode++ )
416 double rad = sqrt( coords[inode * 3] * coords[inode * 3] + coords[inode * 3 + 1] * coords[inode * 3 + 1] +
417 coords[inode * 3 + 2] * coords[inode * 3 + 2] );
418 CartVect xyzcoord( coords[inode * 3] / rad, coords[inode * 3 + 1] / rad, coords[inode * 3 + 2] / rad );
426 for(
int inode = 0; inode < num_nodes; inode++ )
428 int inode2 = inode + 1;
429 if( inode2 >= num_nodes ) inode2 = 0;
430 double xmid = 0.5 * ( x[inode] + x[inode2] );
431 double ymid = 0.5 * ( y[inode] + y[inode2] );
432 double r1 = sqrt( 1 + x[inode] * x[inode] + y[inode] * y[inode] );
433 double rm = sqrt( 1 + xmid * xmid + ymid * ymid );
434 double r2 = sqrt( 1 + x[inode2] * x[inode2] + y[inode2] * y[inode2] );
435 double hx = x[inode2] - x[inode];
438 ( y[inode] / ( r1 * ( 1 + x[inode] * x[inode] ) ) + 4.0 * ymid / ( rm * ( 1 + xmid * xmid ) ) +
439 y[inode2] / ( r2 * ( 1 + x[inode2] * x[inode2] ) ) ) /
443 ( x[inode] * y[inode] / ( r1 * ( 1 + x[inode] * x[inode] ) ) +
444 4.0 * xmid * ymid / ( rm * ( 1 + xmid * xmid ) ) +
445 x[inode2] * y[inode2] / ( r2 * ( 1 + x[inode2] * x[inode2] ) ) ) /
448 int_y += -hx * ( 1.0 / r1 + 4.0 / rm + 1.0 / r2 ) / 6.0;
452 std::vector< double > rho_coefs( 3 );
453 rval =
mb->
tag_get_data( linearCoefTag, &icell, 1, &rho_coefs[0] );CHECK_ERR( rval );
456 std::vector< double > bary( 3 );
457 rval =
mb->
tag_get_data( barycenterTag, &icell, 1, &bary[0] );CHECK_ERR( rval );
460 CartVect bary_xyz( bary[0], bary[1], bary[2] );
466 rval =
mb->
tag_get_data( rhoTag, &icell, 1, &cell_rho );CHECK_ERR( rval );
469 double rho_test1 = ( rho_coefs[0] * int_x + rho_coefs[1] * int_y + rho_coefs[2] * area ) / area;
472 double rho_test2 = rho_coefs[0] * bary_x + rho_coefs[1] * bary_y + rho_coefs[2];
474 std::cout << cell_rho <<
" " << rho_test1 <<
" " << rho_test2 <<
" " << cell_rho - rho_test1 <<
"\n";
484 double r = sqrt( 1.0 + x * x + y * y );
541 double R = sqrt( X * X + Y * Y + Z * Z );
546 if( ( Y < X ) & ( Y > -X ) )
561 else if( ( Y > X ) & ( Y < -X ) )
576 else if( ( Y > X ) & ( Y > -X ) )
591 else if( ( Y < X ) & ( Y < -X ) )
612 else if( Z < -fabs( X ) )
616 else if( ( X > 0 ) & ( Y > 0 ) )
620 else if( ( X < 0 ) & ( Y > 0 ) )
624 else if( ( X < 0 ) & ( Y < 0 ) )
662 rval =
mb->
tag_iterate( tagTracer, connecVerts.
begin(), connecVerts.
end(), count, data );CHECK_ERR( rval );
664 assert( count == (
int)connecVerts.
size() );
665 double* ptr_DP = (
double*)data;
673 double params[] = { 5 * M_PI / 6.0, 0.0, 7 * M_PI / 6, 0.0, 0.1, 0.9, 1., 0.5 };
678 rval =
mb->
get_coords( &oldV, 1, &( posi[0] ) );CHECK_ERR( rval );
698 double params[] = { p1[0], p1[1], p1[2], p2[0], p2[1], p2[2], 1, 5. };
703 rval =
mb->
get_coords( &oldV, 1, &( posi[0] ) );CHECK_ERR( rval );
715 double params[] = { M_PI, M_PI / 3, M_PI, -M_PI / 3, 0.1, 0.9, 0.5 };
720 rval =
mb->
get_coords( &oldV, 1, &( posi[0] ) );CHECK_ERR( rval );
749 while( iter != polygons.
end() )
751 rval =
mb->
tag_iterate( tagElem, iter, polygons.
end(), count, data );CHECK_ERR( rval );
752 double* ptr = (
double*)data;
754 rval =
mb->
tag_iterate( tagArea, iter, polygons.
end(), count, data );CHECK_ERR( rval );
755 double* ptrArea = (
double*)data;
756 for(
int i = 0; i < count; i++, ++iter, ptr++, ptrArea++ )
761 if( num_nodes == 0 )
return MB_FAILURE;
762 std::vector< double > nodeVals( num_nodes );
764 rval =
mb->
tag_get_data( tagTracer, conn, num_nodes, &nodeVals[0] );CHECK_ERR( rval );
765 for(
int j = 0; j < num_nodes; j++ )
766 average += nodeVals[j];
767 average /= num_nodes;