MOAB: Mesh Oriented datABase  (version 5.5.0)
ghost_thin_layers.cpp
Go to the documentation of this file.
1 #include "moab/ParallelComm.hpp"
2 #include "moab/Core.hpp"
3 #include "moab_mpi.h"
4 #include "TestUtil.hpp"
5 #include "MBTagConventions.hpp"
6 #include <iostream>
7 #include <sstream>
8 
9 // a file with 4 quads, in line, partitioned in 4 parts
10 std::string filename = TestDir + "unittest/io/ln4.h5m";
11 
12 using namespace moab;
13 
15 {
16  int nproc, rank;
17  MPI_Comm_size( MPI_COMM_WORLD, &nproc );
18  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
19  // Get MOAB instance
20  Interface* mb = new( std::nothrow ) Core;
21 
22  ErrorCode rval = MB_SUCCESS;
23 
24  // Get the ParallelComm instance
25  ParallelComm* pcomm = new ParallelComm( mb, MPI_COMM_WORLD );
26 
27  char read_opts[] = "PARALLEL=READ_PART;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION=PARALLEL_"
28  "PARTITION;PARALLEL_GHOSTS=2.0.1";
29  rval = mb->load_file( filename.c_str(), 0, read_opts );CHECK_ERR( rval );
30 
31  if( nproc >= 3 )
32  {
33  rval = pcomm->correct_thin_ghost_layers();CHECK_ERR( rval );
34  }
35 
36  rval = pcomm->exchange_ghost_cells( 2, 0, 2, 0, true );CHECK_ERR( rval ); // true to store remote handles
37 
38  // write in serial the database , on each rank
39  std::ostringstream outfile;
40  outfile << "testReadThin_n" << nproc << "." << rank << ".h5m";
41 
42  rval = mb->write_file( outfile.str().c_str() ); // everything on local root
43  CHECK_ERR( rval );
44  delete mb;
45 }
46 
48 {
49  int nproc, rank;
50  MPI_Comm_size( MPI_COMM_WORLD, &nproc );
51  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
52  moab::Core* mb = new moab::Core();
53 
54  ErrorCode rval = MB_SUCCESS;
55  // Get the ParallelComm instance
56  ParallelComm* pcomm = new ParallelComm( mb, MPI_COMM_WORLD );
57 
58  char read_opts[] = "PARALLEL=READ_PART;PARALLEL_RESOLVE_SHARED_ENTS;PARTITION=PARALLEL_"
59  "PARTITION;PARALLEL_GHOSTS=2.0.1;PARALLEL_THIN_GHOST_LAYER;";
60  rval = mb->load_file( filename.c_str(), 0, read_opts );CHECK_ERR( rval );
61 
62  rval = pcomm->exchange_ghost_cells( 2, 0, 2, 0, true );CHECK_ERR( rval ); // true to store remote handles
63 
64  // write in serial the database , on each rank
65  std::ostringstream outfile;
66  outfile << "testReadGhost_n" << nproc << "." << rank << ".h5m";
67 
68  rval = mb->write_file( outfile.str().c_str() ); // everything on local root
69  CHECK_ERR( rval );
70  delete mb;
71 }
72 
73 int main( int argc, char* argv[] )
74 {
75  MPI_Init( &argc, &argv );
76  int nproc, rank;
77  MPI_Comm_size( MPI_COMM_WORLD, &nproc );
78  MPI_Comm_rank( MPI_COMM_WORLD, &rank );
79  if( nproc <= 3 )
80  {
81  std::cout << " launch it on at least 4 processes. \n";
82  MPI_Finalize();
83  return 0;
84  }
85 
86  int result = 0;
87  if( argc >= 2 ) filename = argv[1]; // to be able to test other files too
88 
90  result += RUN_TEST( test_correct_ghost );
91 
92  MPI_Finalize();
93  return 0;
94 }