Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #ifndef IMOAB_H 00002 #define IMOAB_H 00003 /** 00004 * \file iMOAB.h 00005 * iMOAB: a language-agnostic, lightweight interface to MOAB. 00006 * 00007 * Supports usage from C/C++, Fortran (77/90/2003), Python. 00008 * 00009 * \remark 1) All data in the interface are exposed via POD-types. 00010 * \remark 2) Pass everything by reference, so we do not have to use %VAL() 00011 * \remark 3) Arrays are allocated by the user code. No concerns about 00012 * de-allocation of the data will be taken up by the interface. 00013 * \remark 4) Always pass the pointer to the start of array along with the 00014 * total allocated size for the array. 00015 * \remark 5) Return the filled array requested by user along with 00016 * optionally the actual length of the array that was filled. 00017 * (for typical cases, should be the allocated length) 00018 */ 00019 00020 /** 00021 * \Notes 00022 * 1) Fortran MPI_Comm won't work. Take an integer argument and use MPI_F2C calls to get the C-Comm object 00023 * 2) ReadHeaderInfo - Does it need the pid ? 00024 * 3) Reuse the comm object from the registration for both load and write operations. 00025 * Do not take comm objects again to avoid confusion and retain consistency. 00026 * 4) Decipher the global comm object and the subset partioning for each application based on the comm object 00027 * 5) GetMeshInfo - return separately the owned and ghosted vertices/elements -- not together in visible_** but rather 00028 * owned_** and ghosted_**. Make these arrays of size 2. 00029 * 6) Should we sort the vertices after ghosting, such that the locally owned is first, and the ghosted appended next. 00030 * 7) RCM only for the owned part of the mesh -- do not screw with the ghosted layers 00031 * 8) GetBlockID - identical to GetVertexID -- return the global numbering for block 00032 * 9) GetVertexID -- remember that the order of vertices returned have an implicit numbering embedded in it. 00033 * DO NOT CHANGE THIS ORDERING... 00034 * 10) GetBlockInfo takes global Block ID; Remove blockname unless there is a separate use case for it.. 00035 * 11) GetElementConnectivity - clarify whether we return global or local vertex numbering. 00036 * Preferably local numbering else lot of deciphering for global. 00037 */ 00038 #include "moab/MOABConfig.h" 00039 #include "moab/Types.hpp" 00040 00041 #ifdef __cplusplus 00042 #include <cstdio> 00043 #include <cassert> 00044 #include <cstdlib> 00045 #else 00046 #include <stdio.h> 00047 #include <assert.h> 00048 #include <stdlib.h> 00049 #endif 00050 00051 #define iMOAB_AppID int* 00052 #define iMOAB_String char* 00053 #define iMOAB_GlobalID int 00054 #define iMOAB_LocalID int 00055 #ifdef __cplusplus 00056 #define ErrCode moab::ErrorCode 00057 #else 00058 #define ErrCode int 00059 #endif 00060 00061 #ifdef _MSC_VER 00062 #define __PRETTY_FUNCTION__ __FUNCSIG__ 00063 #else 00064 #if !defined( __cplusplus ) || !defined( __PRETTY_FUNCTION__ ) 00065 #define __PRETTY_FUNCTION__ __func__ 00066 #endif 00067 #endif 00068 00069 /** 00070 * @brief MOAB tag types can be: dense/sparse, and of int/double/EntityHandle types. 00071 * They can also be defined on both elements and vertices of the mesh. 00072 */ 00073 enum MOAB_TAG_TYPE 00074 { 00075 DENSE_INTEGER = 0, 00076 DENSE_DOUBLE = 1, 00077 DENSE_ENTITYHANDLE = 2, 00078 SPARSE_INTEGER = 3, 00079 SPARSE_DOUBLE = 4, 00080 SPARSE_ENTITYHANDLE = 5 00081 }; 00082 00083 /** 00084 * @brief Define MOAB tag ownership information i.e., the entity where the tag is primarily defined 00085 * This is typically used to query the tag data and to set it back. 00086 */ 00087 enum MOAB_TAG_OWNER_TYPE 00088 { 00089 TAG_VERTEX = 0, 00090 TAG_EDGE = 1, 00091 TAG_FACE = 2, 00092 TAG_ELEMENT = 3 00093 }; 00094 00095 #define CHK_MPI_ERR( ierr ) \ 00096 { \ 00097 if( 0 != ( ierr ) ) return moab::MB_FAILURE; \ 00098 } 00099 00100 #define IMOAB_CHECKPOINTER( prmObj, position ) \ 00101 { \ 00102 if( prmObj == nullptr ) \ 00103 { \ 00104 printf( "InputParamError at %d: '%s' is invalid and null.\n", position, #prmObj ); \ 00105 return moab::MB_UNHANDLED_OPTION; \ 00106 } \ 00107 } 00108 00109 #define IMOAB_THROW_ERROR( message, retval ) \ 00110 { \ 00111 printf( "iMOAB Error: %s.\n Location: %s in %s:%d.\n", message, __PRETTY_FUNCTION__, __FILE__, __LINE__ ); \ 00112 return retval; \ 00113 } 00114 00115 #ifndef NDEBUG 00116 #define IMOAB_ASSERT_RET( condition, message, retval ) \ 00117 { \ 00118 if( !( condition ) ) \ 00119 { \ 00120 printf( "iMOAB Error: %s.\n Failed condition: %s\n Location: %s in %s:%d.\n", message, #condition, \ 00121 __PRETTY_FUNCTION__, __FILE__, __LINE__ ); \ 00122 return retval; \ 00123 } \ 00124 } 00125 00126 #define IMOAB_ASSERT( condition, message ) IMOAB_ASSERT_RET( condition, message, moab::MB_UNHANDLED_OPTION ) 00127 00128 #else 00129 #define IMOAB_ASSERT( condition, message ) 00130 #define IMOAB_ASSERT_RET( condition, message, retval ) 00131 #endif 00132 00133 #ifdef __cplusplus 00134 extern "C" { 00135 #endif 00136 00137 /** 00138 * \brief Initialize the iMOAB interface implementation. 00139 * 00140 * \note Will create the MOAB instance, if not created already (reference counted). 00141 * 00142 * <B>Operations:</B> Collective 00143 * 00144 * \param[in] argc (int) Number of command line arguments 00145 * \param[in] argv (iMOAB_String*) Command line arguments 00146 * @return ErrCode 00147 */ 00148 ErrCode iMOAB_Initialize( int argc, iMOAB_String* argv ); 00149 00150 /** 00151 * \brief Initialize the iMOAB interface implementation from Fortran driver. 00152 * 00153 * It will create the MOAB instance, if not created already (reference counted). 00154 * 00155 * <B>Operations:</B> Collective 00156 * 00157 * \return ErrCode The error code indicating success or failure. 00158 */ 00159 ErrCode iMOAB_InitializeFortran(); 00160 00161 /** 00162 * \brief Finalize the iMOAB interface implementation. 00163 * 00164 * It will delete the internally reference counted MOAB instance, if the reference count reaches 0. 00165 * 00166 * <B>Operations:</B> Collective 00167 * 00168 * \return ErrCode The error code indicating success or failure. 00169 */ 00170 ErrCode iMOAB_Finalize(); 00171 00172 /** 00173 * \brief Register application - Create a unique application ID and bootstrap interfaces for further queries. 00174 * 00175 * \note 00176 * Internally, a mesh set will be associated with the application ID and all subsequent queries on the MOAB 00177 * instance will be directed to this mesh/file set. 00178 * 00179 * <B>Operations:</B> Collective 00180 * 00181 * \param[in] app_name (iMOAB_String) Application name (PROTEUS, NEK5000, etc) 00182 * \param[in] comm (MPI_Comm*) MPI communicator to be used for all mesh-related queries originating 00183 * from this application 00184 * \param[in] compid (int*) The unique external component identifier 00185 * \param[out] pid (iMOAB_AppID) The unique pointer to the application ID 00186 * \return ErrCode The error code indicating success or failure. 00187 */ 00188 ErrCode iMOAB_RegisterApplication( const iMOAB_String app_name, 00189 #ifdef MOAB_HAVE_MPI 00190 MPI_Comm* comm, 00191 #endif 00192 int* compid, 00193 iMOAB_AppID pid ); 00194 00195 /** 00196 * \brief De-Register application: delete mesh (set) associated with the application ID. 00197 * 00198 * \note The associated communicator will be released, and all associated mesh entities and sets will be deleted from the 00199 * mesh data structure. Associated tag storage data will be freed too. 00200 * 00201 * <B>Operations:</B> Collective 00202 * 00203 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID 00204 * \return ErrCode The error code indicating success or failure. 00205 */ 00206 ErrCode iMOAB_DeregisterApplication( iMOAB_AppID pid ); 00207 00208 /** 00209 * \brief Register a Fortran-based application - Create a unique application ID and bootstrap interfaces 00210 * for further queries. 00211 * 00212 * \note 00213 * Internally, the comm object, usually a 32 bit integer in Fortran, will be converted using MPI_Comm_f2c and stored as 00214 * MPI_Comm. A mesh set will be associated with the application ID and all subsequent queries on the MOAB instance will 00215 * be directed to this mesh/file set. 00216 * 00217 * <B>Operations:</B> Collective 00218 * 00219 * \param[in] app_name (iMOAB_String) Application name ("MySolver", "E3SM", "DMMoab", "PROTEUS", "NEK5000", etc) 00220 * \param[in] communicator (int*) Fortran MPI communicator to be used for all mesh-related queries originating from this application. 00221 * \param[in] compid (int*) External component id, (A *const* unique identifier). 00222 * \param[out] pid (iMOAB_AppID) The unique pointer to the application ID. 00223 * \return ErrCode The error code indicating success or failure. 00224 */ 00225 ErrCode iMOAB_RegisterApplicationFortran( const iMOAB_String app_name, 00226 #ifdef MOAB_HAVE_MPI 00227 int* communicator, 00228 #endif 00229 int* compid, 00230 iMOAB_AppID pid ); 00231 00232 /** 00233 * \brief De-Register the Fortran based application: delete mesh (set) associated with the application ID. 00234 * 00235 * \note The associated communicator will be released, and all associated mesh entities and sets will be 00236 * deleted from the mesh data structure. Associated tag storage data will be freed too. 00237 * 00238 * <B>Operations:</B> Collective 00239 * 00240 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID 00241 * \return ErrCode The error code indicating success or failure. 00242 */ 00243 ErrCode iMOAB_DeregisterApplicationFortran( iMOAB_AppID pid ); 00244 00245 /** 00246 * \brief It should be called on master task only, and information obtained could be broadcasted by the user. 00247 * It is a fast lookup in the header of the file. 00248 * 00249 * \note 00250 * <B>Operations:</B> Not collective 00251 * 00252 * \param[in] filename (iMOAB_String) The MOAB mesh file (H5M) to probe for header information. 00253 * \param[out] num_global_vertices (int*) The total number of vertices in the mesh file. 00254 * \param[out] num_global_elements (int*) The total number of elements (of highest dimension only). 00255 * \param[out] num_dimension (int*) The highest dimension of elements in the mesh 00256 * (Edge=1, Tri/Quad=2, Tet/Hex/Prism/Pyramid=3). 00257 * \param[out] num_parts (int*) The total number of partitions available in the mesh file, typically 00258 * partitioned with mbpart during pre-processing. 00259 * \return ErrCode The error code indicating success or failure. 00260 */ 00261 ErrCode iMOAB_ReadHeaderInfo( const iMOAB_String filename, 00262 int* num_global_vertices, 00263 int* num_global_elements, 00264 int* num_dimension, 00265 int* num_parts ); 00266 00267 /** 00268 * \brief Load a MOAB mesh file in parallel and exchange ghost layers as requested. 00269 * 00270 * \note All communication is MPI-based, and read options include parallel loading information, resolving 00271 * shared entities. Local MOAB instance is populated with mesh cells and vertices in the corresponding 00272 * local partitions. 00273 * 00274 * This will also exchange ghost cells and vertices, as requested. The default bridge dimension is 0 (vertices), 00275 * and all additional lower dimensional sub-entities are exchanged (mesh edges and faces). The tags in the file are not 00276 * exchanged by default. Default tag information for GLOBAL_ID, MATERIAL_SET, NEUMANN_SET and DIRICHLET_SET is 00277 * exchanged. Global ID tag is exchanged for all cells and vertices. Material sets, Neumann sets and Dirichlet sets 00278 * are all augmented with the ghost entities. 00279 * 00280 * <B>Operations:</B> Collective 00281 * 00282 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00283 * \param[in] filename (iMOAB_String) The MOAB mesh file (H5M) to load onto the internal application mesh set. 00284 * \param[in] read_options (iMOAB_String) Additional options for reading the MOAB mesh file in parallel. 00285 * \param[in] num_ghost_layers (int*) The total number of ghost layers to exchange during mesh loading. 00286 * \return ErrCode The error code indicating success or failure. 00287 */ 00288 ErrCode iMOAB_LoadMesh( iMOAB_AppID pid, 00289 const iMOAB_String filename, 00290 const iMOAB_String read_options, 00291 int* num_ghost_layers ); 00292 00293 /** 00294 * \brief Create vertices for an app; it assumes no other vertices 00295 * 00296 * \note <B>Operations:</B> Not collective 00297 * 00298 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00299 * \param[in] coords_len (int*) Size of the \p coordinates array (nverts * dim). 00300 * \param[in] dim (int*) Dimension of the vertex coordinates (usually 3). 00301 * \param[in] coordinates (double*) Coordinates of all vertices, interleaved. 00302 * \return ErrCode The error code indicating success or failure. 00303 */ 00304 ErrCode iMOAB_CreateVertices( iMOAB_AppID pid, int* coords_len, int* dim, double* coordinates ); 00305 00306 /** 00307 * \brief Create elements for an app; it assumes connectivity from local vertices, in order 00308 * 00309 * \note <B>Operations:</B> Not collective 00310 * 00311 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00312 * \param[in] num_elem (int*) Number of elements. 00313 * \param[in] type (int*) Type of element (moab type). 00314 * \param[in] num_nodes_per_element (int*) Number of nodes per element. 00315 * \param[in] connectivity (int *) Connectivity array, with respect to vertices (assumed contiguous). 00316 * \param[in] block_ID (int *) The local block identifier, which will now contain the elements. 00317 * \return ErrCode The error code indicating success or failure. 00318 */ 00319 ErrCode iMOAB_CreateElements( iMOAB_AppID pid, 00320 int* num_elem, 00321 int* type, 00322 int* num_nodes_per_element, 00323 int* connectivity, 00324 int* block_ID ); 00325 00326 /** 00327 * \brief Resolve shared entities using global markers on shared vertices. 00328 * 00329 * \note Global markers can be a global node id, for example, or a global DoF number (as for HOMME) 00330 * 00331 * <B>Operations:</B> Collective . 00332 * 00333 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00334 * \param[in] num_verts (int*) Number of vertices. 00335 * \param[in] marker (int*) Resolving marker (global id marker). 00336 * \return ErrCode The error code indicating success or failure. 00337 */ 00338 ErrCode iMOAB_ResolveSharedEntities( iMOAB_AppID pid, int* num_verts, int* marker ); 00339 00340 /** 00341 * \brief Create the requested number of ghost layers for the parallel mesh. 00342 * 00343 * \note The routine assumes that the shared entities were resolved successfully, and that 00344 * the mesh is properly distributed on separate tasks. 00345 * 00346 * <B>Operations:</B> Collective. 00347 * 00348 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00349 * \param[in] ghost_dim (int*) Desired ghost dimension (2 or 3, most of the time). 00350 * \param[in] num_ghost_layers (int*) Number of ghost layers requested. 00351 * \param[in] bridge_dim (int*) Bridge dimension (0 for vertices, 1 for edges, 2 for faces). 00352 * \return ErrCode The error code indicating success or failure. 00353 */ 00354 ErrCode iMOAB_DetermineGhostEntities( iMOAB_AppID pid, int* ghost_dim, int* num_ghost_layers, int* bridge_dim ); 00355 00356 /** 00357 * \brief Write a MOAB mesh along with the solution tags to a file. 00358 * 00359 * \note The interface will write one single file (H5M) and for serial files (VTK/Exodus), it will write one 00360 * file per task. Write options include parallel write options, if needed. Only the mesh set and solution data 00361 * associated to the application will be written to the file. 00362 * 00363 * <B>Operations:</B> Collective for parallel write, non collective for serial write. 00364 * 00365 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00366 * \param[in] filename (iMOAB_String) The MOAB mesh file (H5M) to write all the entities contained in the 00367 * internal application mesh set. 00368 * \param[in] write_options (iMOAB_String) Additional options for writing the MOAB mesh in parallel. 00369 * \return ErrCode The error code indicating success or failure. 00370 */ 00371 ErrCode iMOAB_WriteMesh( iMOAB_AppID pid, const iMOAB_String filename, const iMOAB_String write_options ); 00372 00373 /** 00374 * \brief Write a local MOAB mesh copy. 00375 * 00376 * \note The interface will write one file per task. Only the local mesh set and solution data associated 00377 * to the application will be written to the file. Very convenient method used for debugging. 00378 * 00379 * <B>Operations:</B> Not Collective (independent operation). 00380 * 00381 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00382 * \param[in] prefix (iMOAB_String) The MOAB file prefix that will be used with task ID in parallel. 00383 * \return ErrCode The error code indicating success or failure. 00384 */ 00385 ErrCode iMOAB_WriteLocalMesh( iMOAB_AppID pid, iMOAB_String prefix ); 00386 00387 /** 00388 * \brief Update local mesh data structure, from file information. 00389 * 00390 * \note The method should be called after mesh modifications, for example reading a file or creating mesh in memory 00391 * 00392 * <B>Operations:</B> Not Collective 00393 * 00394 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00395 * \return ErrCode The error code indicating success or failure. 00396 */ 00397 ErrCode iMOAB_UpdateMeshInfo( iMOAB_AppID pid ); 00398 00399 /** 00400 * \brief Retrieve all the important mesh information related to vertices, elements, vertex and surface boundary conditions. 00401 * 00402 * \note Number of visible vertices and cells include ghost entities. All arrays returned have size 3. 00403 * Local entities are first, then ghost entities are next. Shared vertices can be owned in MOAB sense by 00404 * different tasks. Ghost vertices and cells are always owned by other tasks. 00405 * 00406 * <B>Operations:</B> Not Collective 00407 * 00408 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00409 * \param[out] num_visible_vertices (int*) The number of vertices in the current partition/process arranged. 00410 * as: owned/shared only, ghosted, total_visible (array allocated by 00411 * user, <TT>size := 3</TT>). 00412 * \param[out] num_visible_elements (int*) The number of elements in current partition/process arranged as: owned only, 00413 * ghosted/shared, total_visible (array allocated by user, <TT>size := 3</TT>). 00414 * \param[out] num_visible_blocks (int*) The number of material sets in local mesh in current partition/process 00415 * arranged as: owned only, ghosted/shared, total_visible (array allocated by 00416 * user, <TT>size := 3</TT>). 00417 * \param[out] num_visible_surfaceBC (int*) The number of mesh surfaces that have a NEUMANN_SET BC defined in local mesh 00418 * in current partition/process arranged as: owned only, ghosted/shared, 00419 * total_visible (array allocated by user, <TT>size := 3</TT>). 00420 * \param[out] num_visible_vertexBC (int*) The number of vertices that have a DIRICHLET_SET BC defined in local mesh in 00421 * current partition/process arranged as: owned only, ghosted/shared, 00422 * total_visible (array allocated by user, <TT>size := 3</TT>). 00423 * \return ErrCode The error code indicating success or failure. 00424 */ 00425 ErrCode iMOAB_GetMeshInfo( iMOAB_AppID pid, 00426 int* num_visible_vertices, 00427 int* num_visible_elements, 00428 int* num_visible_blocks, 00429 int* num_visible_surfaceBC, 00430 int* num_visible_vertexBC ); 00431 00432 /** 00433 * \brief Get the global vertex IDs for all locally visible (owned and shared/ghosted) vertices. 00434 * 00435 * \note The array should be allocated by the user, sized with the total number of visible vertices 00436 * from iMOAB_GetMeshInfo method. 00437 * 00438 * <B>Operations:</B> Not collective 00439 * 00440 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00441 * \param[in] vertices_length (int*) The allocated size of array 00442 * (typical <TT>size := num_visible_vertices</TT>). 00443 * \param[out] global_vertex_ID (iMOAB_GlobalID*) The global IDs for all locally visible 00444 * vertices (array allocated by user). 00445 * \return ErrCode The error code indicating success or failure. 00446 */ 00447 ErrCode iMOAB_GetVertexID( iMOAB_AppID pid, int* vertices_length, iMOAB_GlobalID* global_vertex_ID ); 00448 00449 /** 00450 * \brief Get vertex ownership information. 00451 * 00452 * For each vertex based on the local ID, return the process that owns the vertex (local, shared or ghost) 00453 * 00454 * \note Shared vertices could be owned by different tasks. Local and shared vertices are first, ghost 00455 * vertices are next in the array. Ghost vertices are always owned by a different process ID. Array allocated 00456 * by the user with total size of visible vertices. 00457 * 00458 * <B>Operations:</B> Not Collective 00459 * 00460 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00461 * \param[in] vertices_length (int*) The allocated size of array 00462 * (typically <TT>size := num_visible_vertices</TT>). 00463 * \param[out] visible_global_rank_ID (int*) The processor rank owning each of the local vertices. 00464 * \return ErrCode The error code indicating success or failure. 00465 */ 00466 ErrCode iMOAB_GetVertexOwnership( iMOAB_AppID pid, int* vertices_length, int* visible_global_rank_ID ); 00467 00468 /** 00469 * \brief Get vertex coordinates for all local (owned and ghosted) vertices. 00470 * 00471 * \note coordinates are returned in an array allocated by user, interleaved. (do need an option for blocked 00472 * coordinates ?) size of the array is dimension times number of visible vertices. The local ordering is implicit, 00473 * owned/shared vertices are first, then ghosts. 00474 * 00475 * <B>Operations:</B> Not Collective 00476 * 00477 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00478 * \param[in] coords_length (int*) The size of the allocated coordinate array (array allocated by 00479 * user, <TT>size := 3*num_visible_vertices</TT>). 00480 * \param[out] coordinates (double*) The pointer to user allocated memory that will be filled with 00481 * interleaved coordinates. 00482 * \return ErrCode The error code indicating success or failure. 00483 */ 00484 ErrCode iMOAB_GetVisibleVerticesCoordinates( iMOAB_AppID pid, int* coords_length, double* coordinates ); 00485 00486 /** 00487 * \brief Get the global block IDs for all locally visible (owned and shared/ghosted) blocks. 00488 * 00489 * \note Block IDs are corresponding to MATERIAL_SET tags for material sets. Usually the block ID is exported 00490 * from Cubit as a unique integer value. First blocks are local, and next blocks are fully ghosted. First blocks 00491 * have at least one owned cell/element, ghost blocks have only ghost cells. Internally, a block corresponds to a 00492 * mesh set with a MATERIAL_SET tag value equal to the block ID. 00493 * 00494 * <B>Operations:</B> Not Collective 00495 * 00496 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00497 * \param[in] block_length (int*) The allocated size of array 00498 * (typical <TT>size := num_visible_blocks</TT>). 00499 * \param[out] global_block_IDs (iMOAB_GlobalID*) The global IDs for all locally visible blocks 00500 * (array allocated by user). 00501 * \return ErrCode The error code indicating success or failure. 00502 */ 00503 ErrCode iMOAB_GetBlockID( iMOAB_AppID pid, int* block_length, iMOAB_GlobalID* global_block_IDs ); 00504 00505 /** 00506 * \brief Get the global block information and number of visible elements of belonging to a 00507 * block (MATERIAL SET). 00508 * 00509 * \note A block has to be homogeneous, it can contain elements of a single type. 00510 * 00511 * <B>Operations:</B> Not Collective 00512 * 00513 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00514 * \param[in] global_block_ID (iMOAB_GlobalID) The global block ID of the set to be queried. 00515 * \param[out] vertices_per_element (int*) The number of vertices per element. 00516 * \param[out] num_elements_in_block (int*) The number of elements in block. 00517 * \return ErrCode The error code indicating success or failure. 00518 */ 00519 ErrCode iMOAB_GetBlockInfo( iMOAB_AppID pid, 00520 iMOAB_GlobalID* global_block_ID, 00521 int* vertices_per_element, 00522 int* num_elements_in_block ); 00523 00524 /** 00525 * \brief Get the visible elements information. 00526 * 00527 * Return for all visible elements the global IDs, ranks they belong to, block ids they belong to. 00528 * 00529 * \todo : Can we also return the index for each block ID? 00530 * 00531 * \note <B>Operations:</B> Not Collective 00532 * 00533 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00534 * \param[in] num_visible_elements (int*) The number of visible elements (returned by \c GetMeshInfo). 00535 * \param[out] element_global_IDs (iMOAB_GlobalID*) Element global ids to be added to the block. 00536 * \param[out] ranks (int*) The owning ranks of elements. 00537 * \param[out] block_IDs (iMOAB_GlobalID*) The block ids containing the elements. 00538 * \return ErrCode The error code indicating success or failure. 00539 */ 00540 ErrCode iMOAB_GetVisibleElementsInfo( iMOAB_AppID pid, 00541 int* num_visible_elements, 00542 iMOAB_GlobalID* element_global_IDs, 00543 int* ranks, 00544 iMOAB_GlobalID* block_IDs ); 00545 00546 /** 00547 * \brief Get the connectivities for elements contained within a certain block. 00548 * 00549 * \note input is the block ID. Should we change to visible block local index? 00550 * 00551 * <B>Operations:</B> Not Collective 00552 * 00553 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00554 * \param[in] global_block_ID (iMOAB_GlobalID*) The global block ID of the set being queried. 00555 * \param[in] connectivity_length (int*) The allocated size of array. 00556 * (typical <TT>size := vertices_per_element*num_elements_in_block</TT>) 00557 * \param[out] element_connectivity (int*) The connectivity array to store element ordering in MOAB canonical 00558 * numbering scheme (array allocated by user); array contains vertex 00559 * indices in the local numbering order for vertices elements are in 00560 * the same order as provided by GetElementOwnership and GetElementID. 00561 * \return ErrCode The error code indicating success or failure. 00562 */ 00563 ErrCode iMOAB_GetBlockElementConnectivities( iMOAB_AppID pid, 00564 iMOAB_GlobalID* global_block_ID, 00565 int* connectivity_length, 00566 int* element_connectivity ); 00567 00568 /** 00569 * \brief Get the connectivity for one element only. 00570 * 00571 * \note This is a convenience method and in general should not be used unless necessary. 00572 * You should use colaesced calls for multiple elements for efficiency. 00573 * 00574 * <B>Operations:</B> Not Collective 00575 * 00576 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00577 * \param[in] elem_index (iMOAB_LocalID *) Local element index. 00578 * \param[in,out] connectivity_length (int *) On input, maximum length of connectivity. On output, actual length. 00579 * \param[out] element_connectivity (int*) The connectivity array to store connectivity in MOAB canonical numbering 00580 * scheme. Array contains vertex indices in the local numbering order for 00581 * vertices. 00582 * \return ErrCode The error code indicating success or failure. 00583 */ 00584 ErrCode iMOAB_GetElementConnectivity( iMOAB_AppID pid, 00585 iMOAB_LocalID* elem_index, 00586 int* connectivity_length, 00587 int* element_connectivity ); 00588 00589 /** 00590 * \brief Get the element ownership within a certain block i.e., processor ID of the element owner. 00591 * 00592 * \note : Should we use local block index for input, instead of the global block ID ? 00593 * 00594 * <B>Operations:</B> Not Collective 00595 * 00596 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00597 * \param[in] global_block_ID (iMOAB_GlobalID) The global block ID of the set being queried. 00598 * \param[in] num_elements_in_block (int*) The allocated size of ownership array, same as 00599 * <TT>num_elements_in_block</TT> returned from GetBlockInfo(). 00600 * \param[out] element_ownership (int*) The ownership array to store processor ID for all elements 00601 * (array allocated by user). 00602 * \return ErrCode The error code indicating success or failure. 00603 */ 00604 ErrCode iMOAB_GetElementOwnership( iMOAB_AppID pid, 00605 iMOAB_GlobalID* global_block_ID, 00606 int* num_elements_in_block, 00607 int* element_ownership ); 00608 00609 /** 00610 * \brief Get the global IDs for all locally visible elements belonging to a particular block. 00611 * 00612 * \note The method will return also the local index of each element, in the local range that contains 00613 * all visible elements. 00614 * 00615 * <B>Operations:</B> Not Collective 00616 * 00617 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00618 * \param[in] global_block_ID (iMOAB_GlobalID*) The global block ID of the set being queried. 00619 * \param[in] num_elements_in_block (int*) The allocated size of global element ID array, same as 00620 * <TT>num_elements_in_block</TT> returned from GetBlockInfo(). 00621 * \param[out] global_element_ID (iMOAB_GlobalID*) The global IDs for all locally visible elements 00622 * (array allocated by user). 00623 * \param[out] local_element_ID (iMOAB_LocalID*) (<I><TT>Optional</TT></I>) The local IDs for all locally visible 00624 * elements (index in the range of all primary elements in the rank) 00625 * \return ErrCode The error code indicating success or failure. 00626 */ 00627 ErrCode iMOAB_GetElementID( iMOAB_AppID pid, 00628 iMOAB_GlobalID* global_block_ID, 00629 int* num_elements_in_block, 00630 iMOAB_GlobalID* global_element_ID, 00631 iMOAB_LocalID* local_element_ID ); 00632 00633 /** 00634 * \brief Get the surface boundary condition information. 00635 * 00636 * \note <B>Operations:</B> Not Collective 00637 * 00638 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00639 * \param[in] surface_BC_length (int*) The allocated size of surface boundary condition array, same 00640 * as <TT>num_visible_surfaceBC</TT> returned by GetMeshInfo(). 00641 * \param[out] local_element_ID (iMOAB_LocalID*) The local element IDs that contains the side with the surface BC. 00642 * \param[out] reference_surface_ID (int*) The surface number with the BC in the canonical reference 00643 * element (e.g., 1 to 6 for HEX, 1-4 for TET). 00644 * \param[out] boundary_condition_value (int*) The boundary condition type as obtained from the mesh description 00645 * (value of the NeumannSet defined on the element). 00646 * \return ErrCode The error code indicating success or failure. 00647 */ 00648 ErrCode iMOAB_GetPointerToSurfaceBC( iMOAB_AppID pid, 00649 int* surface_BC_length, 00650 iMOAB_LocalID* local_element_ID, 00651 int* reference_surface_ID, 00652 int* boundary_condition_value ); 00653 00654 /** 00655 * \brief Get the vertex boundary condition information. 00656 * 00657 * \note <B>Operations:</B> Not Collective 00658 * 00659 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00660 * \param[in] vertex_BC_length (int) The allocated size of vertex boundary condition array, same as 00661 * <TT>num_visible_vertexBC</TT> returned by GetMeshInfo(). 00662 * \param[out] local_vertex_ID (iMOAB_LocalID*) The local vertex ID that has Dirichlet BC defined. 00663 * \param[out] boundary_condition_value (int*) The boundary condition type as obtained from the mesh description 00664 * (value of the Dirichlet_Set tag defined on the vertex). 00665 * \return ErrCode The error code indicating success or failure. 00666 */ 00667 ErrCode iMOAB_GetPointerToVertexBC( iMOAB_AppID pid, 00668 int* vertex_BC_length, 00669 iMOAB_LocalID* local_vertex_ID, 00670 int* boundary_condition_value ); 00671 00672 /** 00673 * \brief Define a MOAB Tag corresponding to the application depending on requested types. 00674 * 00675 * \note In MOAB, for most solution vectors, we only need to create a "Dense", "Double" Tag. A sparse tag can 00676 * be created too. If the tag is already existing in the file, it will not be created. If it is a new tag, 00677 * memory will be allocated when setting the values. Default values are 0 for for integer tags, 0.0 for double tags, 00678 * 0 for entity handle tags. 00679 * 00680 * <B>Operations:</B> Collective 00681 * 00682 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00683 * \param[in] tag_storage_name (iMOAB_String) The tag name to store/retrieve the data in MOAB. 00684 * \param[in] tag_type (int*) The type of MOAB tag (Dense/Sparse, Double/Int/EntityHandle), enum MOAB_TAG_TYPE. 00685 * \param[in] components_per_entity (int*) The total size of vector dimension per entity for the tag (e.g., number of doubles per entity). 00686 * \param[out] tag_index (int*) The tag index which can be used as identifier in synchronize methods. 00687 * \return ErrCode The error code indicating success or failure. 00688 */ 00689 ErrCode iMOAB_DefineTagStorage( iMOAB_AppID pid, 00690 const iMOAB_String tag_storage_name, 00691 int* tag_type, 00692 int* components_per_entity, 00693 int* tag_index ); 00694 00695 /** 00696 * \brief Store the specified values in a MOAB integer Tag. 00697 * 00698 * Values are set on vertices or elements, depending on entity_type 00699 * 00700 * \note we could change the api to accept as input the tag index, as returned by iMOAB_DefineTagStorage. 00701 * 00702 * <B>Operations:</B> Collective 00703 * 00704 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00705 * \param[in] tag_storage_name (iMOAB_String) The tag name to store/retreive the data in MOAB. 00706 * \param[in] num_tag_storage_length (int*) The size of tag storage data (e.g., num_visible_vertices*components_per_entity or 00707 * num_visible_elements*components_per_entity). 00708 * \param[in] entity_type (int*) Type=0 for vertices, and Type=1 for primary elements. 00709 * \param[out] tag_storage_data (int*) The array data of type <I>int</I> to replace the internal tag memory; 00710 * The data is assumed to be contiguous over the local set of visible entities 00711 * (either vertices or elements). 00712 * \return ErrCode The error code indicating success or failure. 00713 */ 00714 ErrCode iMOAB_SetIntTagStorage( iMOAB_AppID pid, 00715 const iMOAB_String tag_storage_name, 00716 int* num_tag_storage_length, 00717 int* entity_type, 00718 int* tag_storage_data ); 00719 00720 /** 00721 * \brief Get the specified values in a MOAB integer Tag. 00722 * 00723 * \note <B>Operations:</B> Collective 00724 * 00725 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00726 * \param[in] tag_storage_name (iMOAB_String) The tag name to store/retreive the data in MOAB. 00727 * \param[in] num_tag_storage_length (int*) The size of tag storage data (e.g., num_visible_vertices*components_per_entity or 00728 * num_visible_elements*components_per_entity). 00729 * \param[in] entity_type (int*) Type=0 for vertices, and Type=1 for primary elements. 00730 * \param[out] tag_storage_data (int*) The array data of type <I>int</I> to be copied from the internal tag memory; 00731 * The data is assumed to be contiguous over the local set of visible 00732 * entities (either vertices or elements). 00733 * \return ErrCode The error code indicating success or failure. 00734 */ 00735 ErrCode iMOAB_GetIntTagStorage( iMOAB_AppID pid, 00736 const iMOAB_String tag_storage_name, 00737 int* num_tag_storage_length, 00738 int* entity_type, 00739 int* tag_storage_data ); 00740 00741 /** 00742 * \brief Store the specified values in a MOAB double Tag. 00743 * 00744 * \note <B>Operations:</B> Collective 00745 * 00746 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00747 * \param[in] tag_storage_name (iMOAB_String) The tag names, separated, to store the data. 00748 * \param[in] num_tag_storage_length (int*) The size of total tag storage data (e.g., num_visible_vertices*components_per_entity 00749 * or num_visible_elements*components_per_entity*num_tags). 00750 * \param[in] entity_type (int*) Type=0 for vertices, and Type=1 for primary elements. 00751 * \param[out] tag_storage_data (double*) The array data of type <I>double</I> to replace the internal tag memory; 00752 * The data is assumed to be contiguous over the local set of visible 00753 * entities (either vertices or elements). unrolled by tags 00754 * \return ErrCode The error code indicating success or failure. 00755 */ 00756 ErrCode iMOAB_SetDoubleTagStorage( iMOAB_AppID pid, 00757 const iMOAB_String tag_storage_name, 00758 int* num_tag_storage_length, 00759 int* entity_type, 00760 double* tag_storage_data ); 00761 00762 /** 00763 * \brief Store the specified values in a MOAB double Tag, for given ids. 00764 * 00765 * \note <B>Operations:</B> Collective 00766 * 00767 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00768 * \param[in] tag_storage_name (iMOAB_String) The tag names, separated, to store the data. 00769 * \param[in] num_tag_storage_length (int*) The size of total tag storage data (e.g., num_visible_vertices*components_per_entity 00770 * or num_visible_elements*components_per_entity*num_tags). 00771 * \param[in] entity_type (int*) Type=0 for vertices, and Type=1 for primary elements. 00772 * \param[in] tag_storage_data (double*) The array data of type <I>double</I> to replace the internal tag memory; 00773 * The data is assumed to be permuted over the local set of visible 00774 * entities (either vertices or elements). unrolled by tags 00775 * in parallel, might be different order, or different entities on the task 00776 * \param[in] globalIds global ids of the cells to be set; 00777 * \return ErrCode The error code indicating success or failure. 00778 */ 00779 00780 ErrCode iMOAB_SetDoubleTagStorageWithGid( iMOAB_AppID pid, 00781 const iMOAB_String tag_storage_names, 00782 int* num_tag_storage_length, 00783 int* entity_type, 00784 double* tag_storage_data, 00785 int* globalIds ); 00786 /** 00787 * \brief Retrieve the specified values in a MOAB double Tag. 00788 * 00789 * \note <B>Operations:</B> Collective 00790 * 00791 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00792 * \param[in] tag_storage_name (iMOAB_String) The tag names to retrieve the data in MOAB. 00793 * \param[in] num_tag_storage_length (int) The size of total tag storage data (e.g., num_visible_vertices*components_per_entity*num_tags 00794 * or num_visible_elements*components_per_entity*num_tags) 00795 * \param[in] entity_type (int*) Type=0 for vertices, and Type=1 for primary elements. 00796 * \param[out] tag_storage_data (double*) The array data of type <I>double</I> to replace the internal tag memory; 00797 * The data is assumed to be contiguous over the local set of visible 00798 * entities (either vertices or elements). unrolled by tags 00799 * \return ErrCode The error code indicating success or failure. 00800 */ 00801 ErrCode iMOAB_GetDoubleTagStorage( iMOAB_AppID pid, 00802 const iMOAB_String tag_storage_name, 00803 int* num_tag_storage_length, 00804 int* entity_type, 00805 double* tag_storage_data ); 00806 00807 /** 00808 * \brief Exchange tag values for the given tags across process boundaries. 00809 * 00810 * \note <B>Operations:</B> Collective 00811 * 00812 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00813 * \param[in] num_tags (int*) Number of tags to exchange. 00814 * \param[in] tag_indices (int*) Array with tag indices of interest (size = *num_tags). 00815 * \param[in] ent_type (int*) The type of entity for tag exchange. 00816 * \return ErrCode The error code indicating success or failure. 00817 */ 00818 ErrCode iMOAB_SynchronizeTags( iMOAB_AppID pid, int* num_tag, int* tag_indices, int* ent_type ); 00819 00820 /** 00821 * \brief Perform global reductions with the processes in the current applications communicator. 00822 * Specifically this routine performs reductions on the maximum value of the tag indicated by \ref tag_index. 00823 * 00824 * \note <B>Operations:</B> Collective 00825 * 00826 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00827 * \param[in] tag_index (int*) The tag index of interest. 00828 * \param[in] ent_type (int*) The type of entity for tag reduction operation 00829 * (vertices = 0, elements = 1) 00830 * \return ErrCode The error code indicating success or failure. 00831 */ 00832 ErrCode iMOAB_ReduceTagsMax( iMOAB_AppID pid, int* tag_index, int* ent_type ); 00833 00834 /** 00835 * \brief Retrieve the adjacencies for the element entities. 00836 * 00837 * \note <B>Operations:</B> Not Collective 00838 * 00839 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00840 * \param[in] local_index (iMOAB_LocalID*) The local element ID for which adjacency information is needed. 00841 * \param[out] num_adjacent_elements (int*) The total number of adjacent elements. 00842 * \param[out] adjacent_element_IDs (iMOAB_LocalID*) The local element IDs of all adjacent elements to the current one 00843 * (typically, num_total_sides for internal elements or 00844 * num_total_sides-num_sides_on_boundary for boundary elements). 00845 * \return ErrCode The error code indicating success or failure. 00846 */ 00847 ErrCode iMOAB_GetNeighborElements( iMOAB_AppID pid, 00848 iMOAB_LocalID* local_index, 00849 int* num_adjacent_elements, 00850 iMOAB_LocalID* adjacent_element_IDs ); 00851 00852 /** 00853 * \brief Get the adjacencies for the vertex entities. 00854 * 00855 * \todo The implementation may not be fully complete 00856 * 00857 * \note <B>Operations:</B> Not Collective 00858 * 00859 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00860 * \param[in] local_vertex_ID (iMOAB_LocalID*) The local vertex ID for which adjacency information is needed. 00861 * \param[out] num_adjacent_vertices (int*) The total number of adjacent vertices. 00862 * \param[out] adjacent_vertex_IDs (iMOAB_LocalID*) The local element IDs of all adjacent vertices to the current one 00863 * (typically, num_total_sides for internal elements or 00864 * num_total_sides-num_sides_on_boundary for boundary elements). 00865 * \return ErrCode The error code indicating success or failure. 00866 */ 00867 ErrCode iMOAB_GetNeighborVertices( iMOAB_AppID pid, 00868 iMOAB_LocalID* local_vertex_ID, 00869 int* num_adjacent_vertices, 00870 iMOAB_LocalID* adjacent_vertex_IDs ); 00871 00872 /** 00873 * \brief Set global information for number of vertices and number of elements; 00874 * It is usually available from the h5m file, or it can be computed with a MPI_Reduce. 00875 * 00876 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00877 * \param[in] num_global_verts (int*) The number of total vertices in the mesh. 00878 * \param[in] num_global_elems (MPI_Comm) The number of total elements in the mesh. 00879 * \return ErrCode The error code indicating success or failure. 00880 */ 00881 ErrCode iMOAB_SetGlobalInfo( iMOAB_AppID pid, int* num_global_verts, int* num_global_elems ); 00882 00883 /** 00884 * \brief Get global information about number of vertices and number of elements. 00885 * 00886 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00887 * \param[in] num_global_verts (int*) The number of total vertices in the mesh. 00888 * \param[in] num_global_elems (MPI_Comm) The number of total elements in the mesh. 00889 * \return ErrCode The error code indicating success or failure. 00890 */ 00891 ErrCode iMOAB_GetGlobalInfo( iMOAB_AppID pid, int* num_global_verts, int* num_global_elems ); 00892 00893 /** 00894 * \brief copy mesh from one instance to another. 00895 * after this, the 2 moab apps will have a perfect duplicate of vertices and cells, global ids will match 00896 * but they will live in 2 different file sets (apps). before this, the output id should be empty 00897 * no other taggs will be copied from initial app to the output app 00898 * 00899 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 00900 * \param[in] poid (iMOAB_AppID) The unique pointer to the copied application ID (it has to be created in advance) 00901 * 00902 */ 00903 ErrCode iMOAB_DuplicateAppMesh( iMOAB_AppID pid, iMOAB_AppID poid ); 00904 00905 #ifdef MOAB_HAVE_MPI 00906 00907 /** 00908 \brief migrate (send) a set of elements from a group of tasks (senders) to another group of tasks (receivers) 00909 <B>Operations:</B> Collective on sender group 00910 00911 \param[in] pid (iMOAB_AppID) The unique pointer to the application ID source mesh 00912 \param[in] join (MPI_Comm) communicator that overlaps both groups 00913 \param[in] receivingGroup (MPI_Group *) receiving group 00914 \param[in] rcompid (int*) external id of application that receives the mesh 00915 \param[in] method (int*) method of partitioning 00916 0 trivial partitioning 00917 1 graph partitioning with ZOLTAN PHG 00918 2 geometric partitioning with ZOLTAN RCB 00919 3 geometric partitioning with ZOLTAN RCB in gnomonic space 00920 4 geometric partitioning with ZOLTAN RCB, in gnomonic space, and with storing of the cuts in a buffer 00921 on receiver root PE, which should be the coupler root PE 00922 5 geometric partitioning with ZOLTAN RCB, with cuts restored from a buffer from the receiver root PE 00923 (5 implies that some partitioning was called in advance with method 4) 00924 */ 00925 ErrCode iMOAB_SendMesh( iMOAB_AppID pid, 00926 MPI_Comm* joint_communicator, 00927 MPI_Group* receivingGroup, 00928 int* rcompid, 00929 int* method ); 00930 00931 /** 00932 * \brief Free up all of the buffers that were allocated when data transfer between 00933 * components are performed. The nonblocking send and receive call buffers will be de-allocated 00934 * once all the data is received by all involved tasks. 00935 * 00936 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID sender mesh. 00937 * \param[in] context_id (int*) The context used for sending, to identify the communication graph. 00938 * \return ErrCode The error code indicating success of failure. 00939 */ 00940 ErrCode iMOAB_FreeSenderBuffers( iMOAB_AppID pid, int* context_d ); 00941 00942 /** 00943 * \brief Migrate (receive) a set of elements from a sender group of tasks 00944 * 00945 * \note <B>Operations:</B> Collective on receiver group 00946 * 00947 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID mesh (receiver). 00948 * \param[in] joint_communicator (MPI_Comm*) The joint communicator that overlaps both groups. 00949 * \param[in] sending_group (MPI_Group *) The group of processes that are sending the mesh. 00950 * \param[in] sender_comp_id ( int *) The unique application identifier that is sending the mesh 00951 * \return ErrCode The error code indicating success or failure. 00952 */ 00953 ErrCode iMOAB_ReceiveMesh( iMOAB_AppID pid, 00954 MPI_Comm* joint_communicator, 00955 MPI_Group* sending_group, 00956 int* sender_comp_id ); 00957 00958 /** 00959 * \brief migrate (send) a list of tags, from a sender group of tasks to a receiver group of tasks 00960 * 00961 * \note <B>Operations:</B> Collective over the sender group, nonblocking sends 00962 * 00963 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID of sender mesh. 00964 * \param[in] tag_storage_name (const iMOAB_String) The name of the tags to be sent between the processes. 00965 * Generally multiple tag names are concatenated, separated by ";". 00966 * \param[in] joint_communicator (MPI_Comm) The joint communicator that overlaps both groups. 00967 * \param[in] context_id (int*) The identifier for the other participating component in the 00968 * intersection context (typically target); -1 if this refers to 00969 * the original migration of meshes (internal detail). 00970 * \return ErrCode The error code indicating success or failure. 00971 */ 00972 ErrCode iMOAB_SendElementTag( iMOAB_AppID pid, 00973 const iMOAB_String tag_storage_name, 00974 MPI_Comm* joint_communicator, 00975 int* context_id ); 00976 00977 /** 00978 * \brief migrate (receive) a list of tags, from a sender group of tasks to a receiver group of tasks 00979 * 00980 * \note <B>Operations:</B> Collective over the receiver group, blocking receives 00981 * 00982 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID of receiver mesh. 00983 * \param[in] tag_storage_name (const iMOAB_String) The name of the tags to be sent between the processes. 00984 * Generally multiple tag names are concatenated, separated by ";". 00985 * \param[in] joint_communicator (MPI_Comm) The joint communicator that overlaps both groups. 00986 * \param[in] context_id (int*) The identifier for the other participating component in the 00987 * intersection context (typically target); -1 if this refers to 00988 * the original migration of meshes (internal detail). 00989 * \return ErrCode The error code indicating success or failure. 00990 */ 00991 00992 ErrCode iMOAB_ReceiveElementTag( iMOAB_AppID pid, 00993 const iMOAB_String tag_storage_name, 00994 MPI_Comm* joint_communicator, 00995 int* context_id ); 00996 00997 00998 /** 00999 \brief 01000 <B>Operations:</B> Collective over the sender and receiver and joint comm 01001 Only root of the receiver and root of the sender actually move data, which is zoltan buffer 01002 01003 \param[in] cmpGrp (MPI_Group*) sender group 01004 \param[in] couGrp (MPI_Group*) receiver group 01005 \param[in] joint (MPI_Comm*) joint communicator 01006 \param[in] is_fortran (int *) * = 1 in case of fortran call 01007 */ 01008 ErrCode iMOAB_RetrieveZBuffer( MPI_Group* cmpGrp, MPI_Group* couGrp, MPI_Comm* joint, int * is_fortran ); 01009 01010 /** 01011 * \brief Compute a communication graph between 2 iMOAB applications, based on ID matching of key data. 01012 * 01013 * \note <B>Operations:</B> Collective 01014 * 01015 * \param[in] pid1 (iMOAB_AppID) The unique pointer to the first application ID. 01016 * \param[in] pid2 (iMOAB_AppID) The unique pointer to the second application ID. 01017 * \param[in] joint_communicator (MPI_Comm*) The MPI communicator that overlaps both groups. 01018 * \param[in] group1 (MPI_Group *) MPI group for first component. 01019 * \param[in] group2 (MPI_Group *) MPI group for second component. 01020 * \param[in] type1 (int *) The type of mesh used by pid1 (spectral with GLOBAL_DOFS, etc). 01021 * \param[in] type2 (int *) The type of mesh used by pid2 (point cloud with GLOBAL_ID, etc). 01022 * \param[in] comp1 (int*) The unique identifier of the first component. 01023 * \param[in] comp2 (int*) The unique identifier of the second component. 01024 * \return ErrCode The error code indicating success or failure. 01025 */ 01026 ErrCode iMOAB_ComputeCommGraph( iMOAB_AppID pid1, 01027 iMOAB_AppID pid2, 01028 MPI_Comm* joint_communicator, 01029 MPI_Group* group1, 01030 MPI_Group* group2, 01031 int* type1, 01032 int* type2, 01033 int* comp1, 01034 int* comp2 ); 01035 01036 /** 01037 * \brief Recompute the communication graph between component and coupler, considering intersection coverage. 01038 * 01039 * \note Original communication graph for source used an initial partition, while during intersection some of the source 01040 * elements were sent to multiple tasks; send back the intersection coverage information for a direct communication 01041 * between source cx mesh on coupler tasks and source cc mesh on interested tasks on the component. 01042 * The intersection tasks will send to the original source component tasks, in a nonblocking way, the ids of all the 01043 * cells involved in intersection with the target cells. The new ParCommGraph between cc source mesh and cx source mesh 01044 * will be used just for tag migration, later on; The original ParCommGraph will stay unchanged, because this source mesh 01045 * could be used for other intersection (atm with lnd) ? on component source tasks, we will wait for information; from each 01046 * intersection task, will receive cells ids involved in intersection. 01047 * 01048 * \param[in] joint_communicator (MPI_Comm *) The joint communicator that overlaps component PEs and coupler PEs. 01049 * \param[in] pid_src (iMOAB_AppID) The unique application identifier for the component mesh on component PEs. 01050 * \param[in] pid_migr (iMOAB_AppID) The unique application identifier for the coupler mesh on coupler PEs. 01051 * \param[in] pid_intx (iMOAB_AppID) The unique application identifier representing the intersection context on coupler PEs. 01052 * \param[in] src_id (int*) The external id for the component mesh on component PE. 01053 * \param[in] migr_id (int*) The external id for the migrated mesh on coupler PEs. 01054 * \param[in] context_id (int*) The unique identifier of the other participating component in intersection (target). 01055 * \return ErrCode The error code indicating success or failure. 01056 */ 01057 ErrCode iMOAB_CoverageGraph( MPI_Comm* joint_communicator, 01058 iMOAB_AppID pid_src, 01059 iMOAB_AppID pid_migr, 01060 iMOAB_AppID pid_intx, 01061 int* src_id, 01062 int* migr_id, 01063 int* context_id ); 01064 01065 /** 01066 * \brief merge vertices in an explicit, parallel mesh; it will also reassign global IDs on vertices, 01067 * and resolve parallel sharing of vertices. 01068 * 01069 * \note <B>Operations:</B> Collective 01070 * 01071 * \param[in] pid (iMOAB_AppID) The unique pointer to the application ID. 01072 * \return ErrCode The error code indicating success or failure. 01073 */ 01074 ErrCode iMOAB_MergeVertices( iMOAB_AppID pid ); 01075 01076 #endif /* #ifdef MOAB_HAVE_MPI */ 01077 01078 #ifdef MOAB_HAVE_TEMPESTREMAP 01079 01080 /** 01081 * @brief Compute intersection of the surface meshes defined on a sphere. The resulting intersected mesh consists 01082 * of (convex) polygons with 1-1 associativity with both the source and destination meshes provided. 01083 * 01084 * \note The mesh intersection between two heterogeneous resolutions will be computed and stored in the fileset 01085 * corresponding to the \p pid_intersection application. This intersection data can be used to compute solution 01086 * projection weights between these meshes. 01087 * 01088 * <B>Operations:</B> Collective on coupler tasks 01089 * 01090 * \param[in] pid_source (iMOAB_AppID) The unique pointer to the source application ID. 01091 * \param[in] pid_target (iMOAB_AppID) The unique pointer to the destination application ID. 01092 * \param[out] pid_intersection (iMOAB_AppID) The unique pointer to the intersection application ID. 01093 * \return ErrCode The error code indicating success or failure. 01094 */ 01095 ErrCode iMOAB_ComputeMeshIntersectionOnSphere( iMOAB_AppID pid_source, 01096 iMOAB_AppID pid_target, 01097 iMOAB_AppID pid_intersection ); 01098 01099 /** 01100 * \brief Compute the intersection of DoFs corresponding to surface meshes defined on a sphere. The resulting intersected 01101 * mesh essentially contains a communication pattern or a permutation matrix that couples both the source and destination 01102 * DoFs. 01103 * 01104 * \note <B>Operations:</B> Collective on coupler tasks 01105 * 01106 * \param[in] pid_source (iMOAB_AppID) The unique pointer to the source application ID. 01107 * \param[in] pid_target (iMOAB_AppID) The unique pointer to the destination application ID. 01108 * \param[out] pid_intersection (iMOAB_AppID) The unique pointer to the intersection application ID. 01109 * \return ErrCode The error code indicating success or failure. 01110 */ 01111 ErrCode iMOAB_ComputePointDoFIntersection( iMOAB_AppID pid_source, 01112 iMOAB_AppID pid_target, 01113 iMOAB_AppID pid_intersection ); 01114 01115 #ifdef MOAB_HAVE_NETCDF 01116 01117 #ifdef MOAB_HAVE_MPI 01118 01119 /** 01120 * \brief Compute a communication graph between 2 moab apps, based on ID matching, between a component and map that 01121 * was read on coupler. 01122 * 01123 * \note Component can be target or source; also migrate meshes to coupler, from the components; 01124 * the mesh on coupler will be either source-like == coverage mesh or target-like the map is usually read 01125 * with rows fully distributed on tasks, so the target mesh will be a proper partition, while source mesh 01126 * coverage is dictated by the active columns on respective tasks. 01127 * 01128 * <B>Operations:</B> Collective 01129 * 01130 * \param[in] pid1 (iMOAB_AppID) The unique pointer to the first component. 01131 * \param[in] pid2 (iMOAB_AppID) The unique pointer to the second component. 01132 * \param[in] pid3 (iMOAB_AppID) The unique pointer to the coupler instance of the mesh (component 2). 01133 * \param[in] join (MPI_Comm) The joint communicator that overlaps both groups. 01134 * \param[in] group1 (MPI_Group *) The MPI group for the first component. 01135 * \param[in] group2 (MPI_Group *) The MPI group for the second component. 01136 * \param[in] type1 (int *) The type of mesh being migrated; 01137 * (1) spectral with GLOBAL_DOFS, (2) Point Cloud (3) FV cell. 01138 * \param[in] comp1 (int*) The universally unique identifier of first component. 01139 * \param[in] comp2 (int*) The universally unique identifier of second component. 01140 * \param[in] direction (int*) A parameter indicating direction of the mesh migration. 01141 * i.e., whether it is from source to coupler (1), or from coupler to target (2). 01142 * \return ErrCode The error code indicating success or failure. 01143 */ 01144 ErrCode iMOAB_MigrateMapMesh( iMOAB_AppID pid1, 01145 iMOAB_AppID pid2, 01146 iMOAB_AppID pid3, 01147 MPI_Comm* join, 01148 MPI_Group* group1, 01149 MPI_Group* group2, 01150 int* type, 01151 int* comp1, 01152 int* comp2, 01153 int* direction ); 01154 01155 #endif /* #ifdef MOAB_HAVE_MPI */ 01156 01157 /** 01158 * \brief Load the projection weights from disk to transfer a solution from a source surface mesh to a destination mesh defined on a sphere. 01159 * The intersection of the mesh should be computed a-priori. 01160 * 01161 * <B>Operations:</B> Collective 01162 * 01163 * \param[in] pid_intersection (iMOAB_AppID) The unique pointer to the application ID to store the map 01164 * \param[in] pid_cpl (iMOAB_AppID) The unique pointer to coupler instance of component; (-1) for old load 01165 * \param[in] col_or_row (int *) The flag to indicate whether distribution is according to source (0) or target grid (1) 01166 * \param[in] type (int *) type of mesh (1) spectral with GLOBAL_DOFS, (2) Point Cloud (3) FV cell 01167 * \param[in] solution_weights_identifier (iMOAB_String) The unique identifier used to store the computed projection weights locally. Typically, 01168 * values could be identifiers such as "scalar", "flux" or "custom". 01169 * \param[in] remap_weights_filename (iMOAB_String) The filename path to the mapping file to load in memory. 01170 */ 01171 ErrCode iMOAB_LoadMappingWeightsFromFile( 01172 iMOAB_AppID pid_intersection, 01173 iMOAB_AppID pid_cpl, 01174 int* col_or_row, 01175 int* type, 01176 const iMOAB_String solution_weights_identifier, /* "scalar", "flux", "custom" */ 01177 const iMOAB_String remap_weights_filename ); 01178 01179 /** 01180 * \brief Write the projection weights to disk in order to transfer a solution from a source surface mesh to a destination 01181 * mesh defined on a sphere. 01182 * 01183 * \note <B>Operations:</B> Collective 01184 * 01185 * \param[in/out] pid_intersection (iMOAB_AppID) The unique pointer to the application ID to store the map. 01186 * \param[in] solution_weights_identifier (iMOAB_String) The unique identifier used to store the computed projection weights locally. Typically, 01187 * values could be identifiers such as "scalar", "flux" or "custom". 01188 * \param[in] remap_weights_filename (iMOAB_String) The filename path to the mapping file to load in memory. 01189 * \return ErrCode The error code indicating success or failure. 01190 */ 01191 ErrCode iMOAB_WriteMappingWeightsToFile( 01192 iMOAB_AppID pid_intersection, 01193 const iMOAB_String solution_weights_identifier, /* "scalar", "flux", "custom" */ 01194 const iMOAB_String remap_weights_filename ); 01195 01196 #endif /* #ifdef MOAB_HAVE_NETCDF */ 01197 01198 /** 01199 * \brief Compute the projection weights to transfer a solution from a source surface mesh to a destination mesh defined 01200 * on a sphere. The intersection of the mesh should be computed a-priori. 01201 * 01202 * \note 01203 * The mesh intersection data-structure is used along with conservative remapping techniques in TempestRemap to compute 01204 * the projection weights for transferring the tag (\p soln_tag_name) from \p pid_src to \p pid_target applications. 01205 * 01206 * <B>Operations:</B> Collective 01207 * 01208 * \param[in] pid_intersection (iMOAB_AppID) The unique pointer to the intersection application ID. 01209 * \param[in] solution_weights_identifier (iMOAB_String) The unique identifier used to store the computed projection weights locally. Typically, 01210 * values could be identifiers such as "scalar", "flux" or "custom". 01211 * \param[in] disc_method_source (iMOAB_String) The discretization type ("fv", "cgll", "dgll") for the solution field on the source grid. 01212 * \param[in] disc_order_source (int *) The discretization order for the solution field on the source grid. 01213 * \param[in] disc_method_target (iMOAB_String) The discretization type ("fv", "cgll", "dgll") for the solution field on the source grid. 01214 * \param[in] disc_order_target (int *) The discretization order for the solution field on the source grid. 01215 * \param[in] fNoBubble (int *) The flag to indicate whether to use bubbles in the interior of SE nodes. 01216 * Default: true i.e., no bubbles used. 01217 * \param[in] fMonotoneTypeID (int *) The flag to indicate whether solution monotonicity is to be preserved. 0: none, 1: mono. 01218 * \param[in] fVolumetric (int *) The flag to indicate whether we need to compute volumetric projection weights. 01219 * \param[in] fNoConservation (int *) The flag to indicate whether to ignore conservation of solution field during projection. 01220 * \param[in] fValidate (int *) The flag to indicate whether to validate the consistency and conservation of solution field during projection; 01221 * Production runs should not have this flag enabled to minimize collective operations. 01222 * \param[in] source_solution_tag_dof_name (iMOAB_String) The global DoF IDs corresponding to participating degrees-of-freedom for the source discretization. 01223 * \param[in] target_solution_tag_dof_name (iMOAB_String) The global DoF IDs corresponding to participating degrees-of-freedom for the target discretization. 01224 * \return ErrCode The error code indicating success or failure. 01225 */ 01226 ErrCode iMOAB_ComputeScalarProjectionWeights( 01227 iMOAB_AppID pid_intersection, 01228 const iMOAB_String solution_weights_identifier, /* "scalar", "flux", "custom" */ 01229 const iMOAB_String disc_method_source, 01230 int* disc_order_source, 01231 const iMOAB_String disc_method_target, 01232 int* disc_order_target, 01233 int* fNoBubble, 01234 int* fMonotoneTypeID, 01235 int* fVolumetric, 01236 int* fInverseDistanceMap, 01237 int* fNoConservation, 01238 int* fValidate, 01239 const iMOAB_String source_solution_tag_dof_name, 01240 const iMOAB_String target_solution_tag_dof_name ); 01241 01242 /** 01243 * \brief Apply the projection weights matrix operator onto the source tag in order to compute the solution (tag) 01244 * represented on the target grid. This operation can be understood as the application of a matrix vector product 01245 * (Y=P*X). 01246 * 01247 * \note <B>Operations:</B> Collective 01248 * 01249 * \param[in] pid_intersection (iMOAB_AppID) The unique pointer to the intersection application ID. 01250 * \param[in] solution_weights_identifier (iMOAB_String) The unique identifier used to store the computed projection weights locally. Typically, 01251 * values could be identifiers such as "scalar", "flux" or "custom". 01252 * \param[in] source_solution_tag_name (iMOAB_String) list of tag names corresponding to participating degrees-of-freedom for the source discretization; 01253 * names are separated by ";", the same way as for tag migration. 01254 * \param[in] target_solution_tag_name (iMOAB_String) list of tag names corresponding to participating degrees-of-freedom for the target discretization; 01255 * names are separated by ";", the same way as for tag migration. 01256 * \return ErrCode The error code indicating success or failure. 01257 */ 01258 ErrCode iMOAB_ApplyScalarProjectionWeights( 01259 iMOAB_AppID pid_intersection, 01260 const iMOAB_String solution_weights_identifier, /* "scalar", "flux", "custom" */ 01261 const iMOAB_String source_solution_tag_name, 01262 const iMOAB_String target_solution_tag_name ); 01263 01264 /** 01265 \brief Dump info about communication graph. 01266 <B>Operations:</B> Collective per sender or receiver group 01267 01268 \param[in] pid (iMOAB_AppID) The unique pointer to the application ID 01269 \param[in] context_id (int*) context id 01270 \param[in] is_sender (int*) is it called from sender or receiver side 01271 \param[in] verbose (int*) level of verbosity 01272 \param[in] prefix (iMOAB_String) prefix for file names; to differentiate stages 01273 */ 01274 ErrCode iMOAB_DumpCommGraph( iMOAB_AppID pid, int* context_id, int* is_sender, int * verbose, const iMOAB_String prefix ); 01275 01276 01277 #endif /* #ifdef MOAB_HAVE_TEMPESTREMAP */ 01278 01279 #ifdef MOAB_HAVE_MPI 01280 01281 /** 01282 * Helper functions for MPI type conversions between Fortran and C++ 01283 */ 01284 01285 /** 01286 * \brief MOAB MPI helper function to convert from a C-based MPI_Comm object 01287 * to a Fortran compatible MPI_Fint (integer) value. 01288 * 01289 * \param comm Input MPI_Comm C-object pointer. 01290 * \return MPI_Fint Output Fortran integer representing the comm object. 01291 */ 01292 inline MPI_Fint MOAB_MPI_Comm_c2f( MPI_Comm* comm ) 01293 { 01294 return MPI_Comm_c2f( *comm ); 01295 } 01296 01297 /** 01298 * \brief MOAB MPI helper function to convert from a Fortran-based MPI_Fint (integer) 01299 * value to a C/C++ compatible MPI_Comm object. 01300 * 01301 * \param fgroup (MPI_Fint) Input Fortran integer representing the MPI_Comm object. 01302 * \return MPI_Comm* Output C/C++-compatible MPI_Comm object pointer. 01303 */ 01304 inline MPI_Comm* MOAB_MPI_Comm_f2c( MPI_Fint fcomm ) 01305 { 01306 MPI_Comm* ccomm; 01307 ccomm = (MPI_Comm*)( malloc( sizeof( MPI_Comm ) ) ); // memory leak ?! 01308 *ccomm = MPI_Comm_f2c( fcomm ); 01309 if( *ccomm == MPI_COMM_NULL ) 01310 { 01311 free( ccomm ); 01312 IMOAB_THROW_ERROR( "The MPI_Comm conversion from Fortran to C failed.", NULL ); 01313 } 01314 else 01315 return ccomm; 01316 } 01317 01318 /** 01319 * \brief MOAB MPI helper functions to convert from a C-based MPI_Group object 01320 * to a Fortran compatible MPI_Fint (integer) value. 01321 * 01322 * \param group Input MPI_Comm C-object pointer. 01323 * \return MPI_Fint Output Fortran integer representing the comm object. 01324 */ 01325 inline MPI_Fint MOAB_MPI_Group_c2f( MPI_Group* group ) 01326 { 01327 return MPI_Group_c2f( *group ); 01328 } 01329 01330 /** 01331 * \brief MOAB MPI helper function to convert from a Fortran-based MPI_Fint (integer) 01332 * value to a C/C++ compatible MPI_Group object. 01333 * 01334 * \param fgroup (MPI_Fint) Input Fortran integer representing the MPIGroup object. 01335 * \return MPI_Group* Output C/C++-compatible MPI_Group object pointer. 01336 */ 01337 inline MPI_Group* MOAB_MPI_Group_f2c( MPI_Fint fgroup ) 01338 { 01339 MPI_Group* cgroup; 01340 cgroup = (MPI_Group*)( malloc( sizeof( MPI_Group ) ) ); // memory leak ?! 01341 *cgroup = MPI_Group_f2c( fgroup ); 01342 if( *cgroup == MPI_GROUP_NULL ) 01343 { 01344 free( cgroup ); 01345 IMOAB_THROW_ERROR( "The MPI_Group conversion from Fortran to C failed.", NULL ); 01346 } 01347 else 01348 return cgroup; 01349 } 01350 01351 #endif /* #ifdef MOAB_HAVE_MPI */ 01352 01353 #ifdef __cplusplus 01354 } 01355 #endif /* #ifdef __cplusplus */ 01356 01357 #endif /* #ifndef IMOAB_H */