MOAB: Mesh Oriented datABase  (version 5.4.1)
Remapper.hpp
Go to the documentation of this file.
00001 /*
00002  * =====================================================================================
00003  *
00004  *       Filename:  Remapper.hpp
00005  *
00006  *    Description:  Interface to the a general remapping capability on arbitrary topology
00007  *                  that performs both mesh intersection between a source and target grid,
00008  *                  with arbitrary decompositions. The intersections can then be used to
00009  *                  either evaluate interpolation weights or to perform high-order
00010  *                  conservative remapping of solutions defined on the source grid.
00011  *
00012  *         Author:  Vijay S. Mahadevan (vijaysm), mahadevan@anl.gov
00013  *
00014  * =====================================================================================
00015  */
00016 
00017 #ifndef MB_REMAPPER_HPP
00018 #define MB_REMAPPER_HPP
00019 
00020 #include <string>
00021 
00022 #include "moab/Interface.hpp"
00023 #ifdef MOAB_HAVE_MPI
00024 #include "moab/ParallelComm.hpp"
00025 #endif
00026 
00027 // Tempest includes
00028 #ifdef MOAB_HAVE_TEMPESTREMAP
00029 #include "netcdfcpp.h"
00030 #include "TempestRemapAPI.h"
00031 #else
00032 #error "This tool depends on TempestRemap library. Reconfigure using --with-tempestremap"
00033 #endif
00034 
00035 namespace moab
00036 {
00037 
00038 class Remapper
00039 {
00040   public:
00041 #ifdef MOAB_HAVE_MPI
00042     Remapper( moab::Interface* mbInt, moab::ParallelComm* pcomm = NULL ) : m_interface( mbInt ), m_pcomm( pcomm )
00043 #else
00044     Remapper( moab::Interface* mbInt ) : m_interface( mbInt )
00045 #endif
00046     {
00047     }
00048 
00049     virtual ~Remapper()
00050     {
00051 #ifdef MOAB_HAVE_MPI
00052         m_pcomm = NULL;
00053 #endif
00054         m_interface = NULL;
00055     }
00056 
00057     enum IntersectionContext
00058     {
00059         DEFAULT      = -1,
00060         SourceMesh   = 0,
00061         TargetMesh   = 1,
00062         OverlapMesh  = 2,
00063         CoveringMesh = 3
00064     };
00065 
00066     moab::Interface* get_interface()
00067     {
00068         return m_interface;
00069     }
00070 
00071 #ifdef MOAB_HAVE_MPI
00072     moab::ParallelComm* get_parallel_communicator()
00073     {
00074         return m_pcomm;
00075     }
00076 #endif
00077 
00078     ErrorCode LoadNativeMesh( std::string filename,
00079                               moab::EntityHandle& meshset,
00080                               std::vector< int >& metadata,
00081                               const char* readopts = 0 )
00082     {
00083 #ifdef MOAB_HAVE_MPI
00084         size_t lastindex      = filename.find_last_of( "." );
00085         std::string extension = filename.substr( lastindex + 1, filename.size() );
00086         std::string opts      = "";
00087         if( m_pcomm->size() > 1 )
00088         {
00089             if( extension != "h5m" )
00090                 opts = std::string( "PARALLEL=BCAST_DELETE;PARTITION=TRIVIAL;PARALLEL_RESOLVE_SHARED_ENTS" );
00091             else
00092                 opts = std::string( "PARALLEL=READ_PART;PARTITION=PARALLEL_PARTITION;PARALLEL_"
00093                                     "RESOLVE_SHARED_ENTS" );
00094         }
00095 
00096         if( readopts )
00097         {
00098             if( opts.size() )
00099                 opts = opts + ";" + std::string( readopts );
00100             else
00101                 opts = std::string( readopts );
00102         }
00103 
00104         if( !m_pcomm->rank() ) std::cout << "Reading file (" << filename << ") with options = [" << opts << "]\n";
00105 #else
00106         const std::string opts = std::string( ( readopts ? readopts : "" ) );
00107         std::cout << "Reading file (" << filename << ") with options = [" << opts << "]\n";
00108 #endif
00109         moab::ErrorCode rval = m_interface->load_file( filename.c_str(), &meshset, opts.c_str() );MB_CHK_ERR( rval );
00110 
00111         Tag rectilinearTag;
00112         rval = m_interface->tag_get_handle( "ClimateMetadata", rectilinearTag );
00113 
00114         metadata.clear();
00115         if( rval != MB_FAILURE && rval != MB_TAG_NOT_FOUND && rval != MB_ALREADY_ALLOCATED &&
00116             rectilinearTag != nullptr )
00117         {
00118             int dimSizes[3];
00119             moab::EntityHandle rootset = 0;
00120             rval                       = m_interface->tag_get_data( rectilinearTag, &rootset, 1,
00121                                                                     dimSizes );  // MB_CHK_SET_ERR( rval, "Error geting tag data" );
00122             metadata.push_back( dimSizes[0] );
00123             metadata.push_back( dimSizes[1] );
00124             metadata.push_back( dimSizes[2] );
00125             // printf( "Mesh metadata: %d, %d, %d\n", metadata[0], metadata[1], metadata[2] );
00126         }
00127 
00128         return MB_SUCCESS;
00129     }
00130 
00131   protected:
00132     // member data
00133     Interface* m_interface;
00134 
00135 #ifdef MOAB_HAVE_MPI
00136     ParallelComm* m_pcomm;
00137 #endif
00138 };
00139 
00140 }  // namespace moab
00141 
00142 #endif /* MB_REMAPPER_HPP */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines