1e1589f56SBarry Smith /* 2e1589f56SBarry Smith Objects to manage the interactions between the mesh data structures and the algebraic objects 3e1589f56SBarry Smith */ 43c48a1e8SJed Brown #if !defined(__PETSCDM_H) 53c48a1e8SJed Brown #define __PETSCDM_H 662cbcd01SMatthew G Knepley #include "petscmat.h" 7e1589f56SBarry Smith PETSC_EXTERN_CXX_BEGIN 8e1589f56SBarry Smith 97087cfbeSBarry Smith extern PetscErrorCode DMInitializePackage(const char[]); 10e1589f56SBarry Smith /*S 11e1589f56SBarry Smith DM - Abstract PETSc object that manages an abstract grid object 12e1589f56SBarry Smith 13e1589f56SBarry Smith Level: intermediate 14e1589f56SBarry Smith 15e1589f56SBarry Smith Concepts: grids, grid refinement 16e1589f56SBarry Smith 17325fc9f4SBarry Smith Notes: The DMDACreate() based object and the DMCompositeCreate() based object are examples of DMs 18e1589f56SBarry Smith 19325fc9f4SBarry Smith Though the DM objects require the petscsnes.h include files the DM library is 20e1589f56SBarry Smith NOT dependent on the SNES or KSP library. In fact, the KSP and SNES libraries depend on 21e1589f56SBarry Smith DM. (This is not great design, but not trivial to fix). 22e1589f56SBarry Smith 23e1589f56SBarry Smith .seealso: DMCompositeCreate(), DMDACreate() 24e1589f56SBarry Smith S*/ 25e1589f56SBarry Smith typedef struct _p_DM* DM; 26e1589f56SBarry Smith 277087cfbeSBarry Smith extern PetscClassId DM_CLASSID; 28e1589f56SBarry Smith 29e1589f56SBarry Smith /*E 30e1589f56SBarry Smith DMType - String with the name of a PETSc DM or the creation function 31e1589f56SBarry Smith with an optional dynamic library name, for example 32e1589f56SBarry Smith http://www.mcs.anl.gov/petsc/lib.a:myveccreate() 33e1589f56SBarry Smith 34e1589f56SBarry Smith Level: beginner 35e1589f56SBarry Smith 36e1589f56SBarry Smith .seealso: DMSetType(), DM 37e1589f56SBarry Smith E*/ 38e1589f56SBarry Smith 39e1589f56SBarry Smith #define DMType char* 40e1589f56SBarry Smith #define DMDA "da" 41e1589f56SBarry Smith #define DMADDA "adda" 42e1589f56SBarry Smith #define DMCOMPOSITE "composite" 43e1589f56SBarry Smith #define DMSLICED "sliced" 44b30b9b2eSMatthew G Knepley #define DMMESH "mesh" 45b30b9b2eSMatthew G Knepley #define DMCARTESIAN "cartesian" 46f11a0a46SMatthew G Knepley #define DMIGA "iga" 47e1589f56SBarry Smith 48e1589f56SBarry Smith extern PetscFList DMList; 49e1589f56SBarry Smith extern PetscBool DMRegisterAllCalled; 507087cfbeSBarry Smith extern PetscErrorCode DMCreate(MPI_Comm,DM*); 517087cfbeSBarry Smith extern PetscErrorCode DMSetType(DM, const DMType); 527087cfbeSBarry Smith extern PetscErrorCode DMGetType(DM, const DMType *); 537087cfbeSBarry Smith extern PetscErrorCode DMRegister(const char[],const char[],const char[],PetscErrorCode (*)(DM)); 547087cfbeSBarry Smith extern PetscErrorCode DMRegisterAll(const char []); 557087cfbeSBarry Smith extern PetscErrorCode DMRegisterDestroy(void); 56e1589f56SBarry Smith 57e1589f56SBarry Smith 58e1589f56SBarry Smith /*MC 59e1589f56SBarry Smith DMRegisterDynamic - Adds a new DM component implementation 60e1589f56SBarry Smith 61e1589f56SBarry Smith Synopsis: 62e1589f56SBarry Smith PetscErrorCode DMRegisterDynamic(const char *name,const char *path,const char *func_name, PetscErrorCode (*create_func)(DM)) 63e1589f56SBarry Smith 64e1589f56SBarry Smith Not Collective 65e1589f56SBarry Smith 66e1589f56SBarry Smith Input Parameters: 67e1589f56SBarry Smith + name - The name of a new user-defined creation routine 68e1589f56SBarry Smith . path - The path (either absolute or relative) of the library containing this routine 69e1589f56SBarry Smith . func_name - The name of routine to create method context 70e1589f56SBarry Smith - create_func - The creation routine itself 71e1589f56SBarry Smith 72e1589f56SBarry Smith Notes: 73e1589f56SBarry Smith DMRegisterDynamic() may be called multiple times to add several user-defined DMs 74e1589f56SBarry Smith 75e1589f56SBarry Smith If dynamic libraries are used, then the fourth input argument (routine_create) is ignored. 76e1589f56SBarry Smith 77e1589f56SBarry Smith Sample usage: 78e1589f56SBarry Smith .vb 79e1589f56SBarry Smith DMRegisterDynamic("my_da","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyDMCreate", MyDMCreate); 80e1589f56SBarry Smith .ve 81e1589f56SBarry Smith 82e1589f56SBarry Smith Then, your DM type can be chosen with the procedural interface via 83e1589f56SBarry Smith .vb 84e1589f56SBarry Smith DMCreate(MPI_Comm, DM *); 85e1589f56SBarry Smith DMSetType(DM,"my_da_name"); 86e1589f56SBarry Smith .ve 87e1589f56SBarry Smith or at runtime via the option 88e1589f56SBarry Smith .vb 89e1589f56SBarry Smith -da_type my_da_name 90e1589f56SBarry Smith .ve 91e1589f56SBarry Smith 92e1589f56SBarry Smith Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values. 93e1589f56SBarry Smith If your function is not being put into a shared library then use DMRegister() instead 94e1589f56SBarry Smith 95e1589f56SBarry Smith Level: advanced 96e1589f56SBarry Smith 97e1589f56SBarry Smith .keywords: DM, register 98e1589f56SBarry Smith .seealso: DMRegisterAll(), DMRegisterDestroy(), DMRegister() 99e1589f56SBarry Smith M*/ 100e1589f56SBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 101e1589f56SBarry Smith #define DMRegisterDynamic(a,b,c,d) DMRegister(a,b,c,0) 102e1589f56SBarry Smith #else 103e1589f56SBarry Smith #define DMRegisterDynamic(a,b,c,d) DMRegister(a,b,c,d) 104e1589f56SBarry Smith #endif 105e1589f56SBarry Smith 1067087cfbeSBarry Smith extern PetscErrorCode DMView(DM,PetscViewer); 107fcfd50ebSBarry Smith extern PetscErrorCode DMDestroy(DM*); 1087087cfbeSBarry Smith extern PetscErrorCode DMCreateGlobalVector(DM,Vec*); 1097087cfbeSBarry Smith extern PetscErrorCode DMCreateLocalVector(DM,Vec*); 1107087cfbeSBarry Smith extern PetscErrorCode DMGetLocalVector(DM,Vec *); 1117087cfbeSBarry Smith extern PetscErrorCode DMRestoreLocalVector(DM,Vec *); 1127087cfbeSBarry Smith extern PetscErrorCode DMGetGlobalVector(DM,Vec *); 1137087cfbeSBarry Smith extern PetscErrorCode DMRestoreGlobalVector(DM,Vec *); 1147087cfbeSBarry Smith extern PetscErrorCode DMGetLocalToGlobalMapping(DM,ISLocalToGlobalMapping*); 1157087cfbeSBarry Smith extern PetscErrorCode DMGetLocalToGlobalMappingBlock(DM,ISLocalToGlobalMapping*); 1167087cfbeSBarry Smith extern PetscErrorCode DMGetBlockSize(DM,PetscInt*); 1177087cfbeSBarry Smith extern PetscErrorCode DMGetColoring(DM,ISColoringType,const MatType,ISColoring*); 1187087cfbeSBarry Smith extern PetscErrorCode DMGetMatrix(DM, const MatType,Mat*); 119fcfd50ebSBarry Smith extern PetscErrorCode DMSetMatrixPreallocateOnly(DM,PetscBool); 1207087cfbeSBarry Smith extern PetscErrorCode DMGetInterpolation(DM,DM,Mat*,Vec*); 1217087cfbeSBarry Smith extern PetscErrorCode DMGetInjection(DM,DM,VecScatter*); 1227087cfbeSBarry Smith extern PetscErrorCode DMRefine(DM,MPI_Comm,DM*); 1237087cfbeSBarry Smith extern PetscErrorCode DMCoarsen(DM,MPI_Comm,DM*); 1247087cfbeSBarry Smith extern PetscErrorCode DMRefineHierarchy(DM,PetscInt,DM[]); 1257087cfbeSBarry Smith extern PetscErrorCode DMCoarsenHierarchy(DM,PetscInt,DM[]); 1267087cfbeSBarry Smith extern PetscErrorCode DMSetFromOptions(DM); 1277087cfbeSBarry Smith extern PetscErrorCode DMSetUp(DM); 1287087cfbeSBarry Smith extern PetscErrorCode DMGetInterpolationScale(DM,DM,Mat,Vec*); 1297087cfbeSBarry Smith extern PetscErrorCode DMGetAggregates(DM,DM,Mat*); 1307087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalBegin(DM,Vec,InsertMode,Vec); 1317087cfbeSBarry Smith extern PetscErrorCode DMGlobalToLocalEnd(DM,Vec,InsertMode,Vec); 1327087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalBegin(DM,Vec,InsertMode,Vec); 1337087cfbeSBarry Smith extern PetscErrorCode DMLocalToGlobalEnd(DM,Vec,InsertMode,Vec); 1347087cfbeSBarry Smith extern PetscErrorCode DMGetElements(DM,PetscInt *,PetscInt *,const PetscInt*[]); 1357087cfbeSBarry Smith extern PetscErrorCode DMRestoreElements(DM,PetscInt *,PetscInt *,const PetscInt*[]); 136fee00e32SMatthew G Knepley extern PetscErrorCode DMConvert(DM,const DMType,DM*); 137e1589f56SBarry Smith 138ab6fcfeaSJed Brown extern PetscErrorCode DMSetOptionsPrefix(DM,const char []); 139ab6fcfeaSJed Brown extern PetscErrorCode DMSetVecType(DM,const VecType); 1407087cfbeSBarry Smith extern PetscErrorCode DMSetContext(DM,void*); 1417087cfbeSBarry Smith extern PetscErrorCode DMGetContext(DM,void**); 1427087cfbeSBarry Smith extern PetscErrorCode DMSetInitialGuess(DM,PetscErrorCode (*)(DM,Vec)); 1437087cfbeSBarry Smith extern PetscErrorCode DMSetFunction(DM,PetscErrorCode (*)(DM,Vec,Vec)); 1447087cfbeSBarry Smith extern PetscErrorCode DMSetJacobian(DM,PetscErrorCode (*)(DM,Vec,Mat,Mat,MatStructure *)); 1457087cfbeSBarry Smith extern PetscErrorCode DMHasInitialGuess(DM,PetscBool *); 1467087cfbeSBarry Smith extern PetscErrorCode DMHasFunction(DM,PetscBool *); 1477087cfbeSBarry Smith extern PetscErrorCode DMHasJacobian(DM,PetscBool *); 1487087cfbeSBarry Smith extern PetscErrorCode DMComputeInitialGuess(DM,Vec); 1497087cfbeSBarry Smith extern PetscErrorCode DMComputeFunction(DM,Vec,Vec); 1507087cfbeSBarry Smith extern PetscErrorCode DMComputeJacobian(DM,Vec,Mat,Mat,MatStructure *); 1517087cfbeSBarry Smith extern PetscErrorCode DMComputeJacobianDefault(DM,Vec,Mat,Mat,MatStructure *); 152*93d92d96SBarry Smith /* function to wrap coordinates around boundary */ 153*93d92d96SBarry Smith extern PetscErrorCode DMDAMapCoordsToPeriodicDomain(DM,PetscScalar*,PetscScalar*); 154*93d92d96SBarry Smith 1557087cfbeSBarry Smith extern PetscErrorCode DMFinalizePackage(void); 156e1589f56SBarry Smith 157e1589f56SBarry Smith typedef struct NLF_DAAD* NLF; 158e1589f56SBarry Smith 1593c48a1e8SJed Brown #include "petscbag.h" 160e1589f56SBarry Smith 1617087cfbeSBarry Smith extern PetscErrorCode PetscViewerBinaryMatlabOpen(MPI_Comm, const char [], PetscViewer*); 1626bf464f9SBarry Smith extern PetscErrorCode PetscViewerBinaryMatlabDestroy(PetscViewer*); 1637087cfbeSBarry Smith extern PetscErrorCode PetscViewerBinaryMatlabOutputBag(PetscViewer, const char [], PetscBag); 1647087cfbeSBarry Smith extern PetscErrorCode PetscViewerBinaryMatlabOutputVec(PetscViewer, const char [], Vec); 1657087cfbeSBarry Smith extern PetscErrorCode PetscViewerBinaryMatlabOutputVecDA(PetscViewer, const char [], Vec, DM); 166e1589f56SBarry Smith 167c0f1f046SDmitry Karpeev /*-------------------------------------------------------------------------*/ 168c0f1f046SDmitry Karpeev /* ISMapping */ 169c0f1f046SDmitry Karpeev /*-------------------------------------------------------------------------*/ 170c0f1f046SDmitry Karpeev extern PetscClassId IS_MAPPING_CLASSID; 171c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingInitializePackage(const char[]); 172c0f1f046SDmitry Karpeev /*S 173c0f1f046SDmitry Karpeev ISMapping - a generalization of ISLocalToGlobalMapping 174c0f1f046SDmitry Karpeev maps from a domain [0,M) of indices to a range [0,N) of indices. 175c0f1f046SDmitry Karpeev The mapping can be multivalued and can be thought of as a directed 176c0f1f046SDmitry Karpeev graph with the start and end vertices drawn from the domain and range, 177c0f1f046SDmitry Karpeev respectively. In the simplest case, an ISMapping is specified by pairs of ISs 178c0f1f046SDmitry Karpeev of equal length prescribing the endpoints of as set of graph edges. 179c0f1f046SDmitry Karpeev 180c0f1f046SDmitry Karpeev The domain is partitioned in parallel into local ownership ranges, the same way 181c0f1f046SDmitry Karpeev as a Vec's indices. Since this is equivalent to specifying a PetscLayout, the domain 182c0f1f046SDmitry Karpeev is said to be "laid out". Once the edges have been specified, the ISMapping is 183c0f1f046SDmitry Karpeev assembled each rank has all of the edges with the source points in its ownership range. 184c0f1f046SDmitry Karpeev 185c0f1f046SDmitry Karpeev After assembly, the mapping can be used to map the indices in the local ownership 186c0f1f046SDmitry Karpeev range [m_p, m_{p+1}) to the global range indices on the other end of the edges. 187c0f1f046SDmitry Karpeev Similarly, local indices from [0,m_{p+1}-m_p) can be mapped to the corresponding 188c0f1f046SDmitry Karpeev global range indices. 189c0f1f046SDmitry Karpeev Unlike with ISLocalToGlobalMapping, an ISMapping can be multivalued and some local 190c0f1f046SDmitry Karpeev indices might have empty images. Because of that the output array resulting from the 191c0f1f046SDmitry Karpeev application of the mapping to an input array of length m is supplemented with an offset 192c0f1f046SDmitry Karpeev array of size m+1 to delineate the images of the consecuitive input indices. 193c0f1f046SDmitry Karpeev In addition to mapping just indices, indices together with scalar arrays (of equal 194c0f1f046SDmitry Karpeev sizes) can be mapped, with the scalar values simply "following" the input indices to 195c0f1f046SDmitry Karpeev their images. Since ISMappings are multivalued in general, the scalar values will be 196c0f1f046SDmitry Karpeev replicated. This is useful for employing ISMappings in VecSetValuesLocal or 197c0f1f046SDmitry Karpeev MatSetValuesLocal. 198c0f1f046SDmitry Karpeev 199c0f1f046SDmitry Karpeev 200c0f1f046SDmitry Karpeev Level: intermediate 201c0f1f046SDmitry Karpeev 202c0f1f046SDmitry Karpeev .seealso: ISMappingCreate(), ISMappingSetDomainSizes(), ISMappingApplyLocal(), ISMappingApplyWithValuesLocal() 203c0f1f046SDmitry Karpeev S*/ 204c0f1f046SDmitry Karpeev typedef struct _p_ISMapping *ISMapping; 205c0f1f046SDmitry Karpeev 206c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingRegister(const char[],const char[],const char[],PetscErrorCode (*)(ISMapping)); 207c0f1f046SDmitry Karpeev 208c0f1f046SDmitry Karpeev /*MC 209c0f1f046SDmitry Karpeev ISMappingRegisterDynamic - Adds a method to the ISMapping registry. 210c0f1f046SDmitry Karpeev 211c0f1f046SDmitry Karpeev Synopsis: 212c0f1f046SDmitry Karpeev PetscErrorCode ISMappingRegisterDynamic(const char *name_mapping,const char *path,const char *name_create,PetscErrorCode (*routine_create)(ISMapping)) 213c0f1f046SDmitry Karpeev 214c0f1f046SDmitry Karpeev Not Collective 215c0f1f046SDmitry Karpeev 216c0f1f046SDmitry Karpeev Input Parameters: 217c0f1f046SDmitry Karpeev + name_mapping - name of a new user-defined mapping module 218c0f1f046SDmitry Karpeev . path - path (either absolute or relative) the library containing this mapping 219c0f1f046SDmitry Karpeev . name_create - name of routine to create method context 220c0f1f046SDmitry Karpeev - routine_create - routine to create method context 221c0f1f046SDmitry Karpeev 222c0f1f046SDmitry Karpeev Level: developer 223c0f1f046SDmitry Karpeev 224c0f1f046SDmitry Karpeev Notes: 225c0f1f046SDmitry Karpeev ISMappingRegisterDynamic() may be called multiple times to add several user-defined solvers. 226c0f1f046SDmitry Karpeev 227c0f1f046SDmitry Karpeev If dynamic libraries are used, then the fourth input argument (routine_create) 228c0f1f046SDmitry Karpeev is ignored. 229c0f1f046SDmitry Karpeev 230c0f1f046SDmitry Karpeev Sample usage: 231c0f1f046SDmitry Karpeev .vb 232c0f1f046SDmitry Karpeev ISMappingRegisterDynamic("my_mapping",/home/username/my_lib/lib/libO/solaris/mylib.a, 233c0f1f046SDmitry Karpeev "MyMappingCreate",MyMappingCreate); 234c0f1f046SDmitry Karpeev .ve 235c0f1f046SDmitry Karpeev 236c0f1f046SDmitry Karpeev Then, your mapping can be chosen with the procedural interface via 237c0f1f046SDmitry Karpeev $ ISMappingSetType(mfctx,"my_mapping") 238c0f1f046SDmitry Karpeev or at runtime via the option 239c0f1f046SDmitry Karpeev $ -is_mapping_type my_mapping 240c0f1f046SDmitry Karpeev 241c0f1f046SDmitry Karpeev .keywords: ISMapping, register 242c0f1f046SDmitry Karpeev 243c0f1f046SDmitry Karpeev .seealso: ISMappingRegisterAll(), ISMappingRegisterDestroy() 244c0f1f046SDmitry Karpeev M*/ 245c0f1f046SDmitry Karpeev #if defined(PETSC_USE_DYNAMIC_LIBRARIES) 246c0f1f046SDmitry Karpeev #define ISMappingRegisterDynamic(a,b,c,d) ISMappingRegister(a,b,c,0) 247c0f1f046SDmitry Karpeev #else 248c0f1f046SDmitry Karpeev #define ISMappingRegisterDynamic(a,b,c,d) ISMappingRegister(a,b,c,d) 249c0f1f046SDmitry Karpeev #endif 250c0f1f046SDmitry Karpeev 251c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingRegisterAll(const char[]); 252c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingRegisterDestroy(void); 253c0f1f046SDmitry Karpeev 254c0f1f046SDmitry Karpeev /* 255c0f1f046SDmitry Karpeev Only one real type for now. 256c0f1f046SDmitry Karpeev Will wrap sparse Mat and VecScatter objects as ISMappings in the future. 257c0f1f046SDmitry Karpeev */ 258c0f1f046SDmitry Karpeev #define ISMappingType char* 259c0f1f046SDmitry Karpeev #define IS_MAPPING_IS "ISMappingIS" 260c0f1f046SDmitry Karpeev 261c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingCreate(MPI_Comm comm, ISMapping *mapping); 262c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingView(ISMapping mapping, PetscViewer viewer); 263fcfd50ebSBarry Smith extern PetscErrorCode ISMappingDestroy(ISMapping *mapping); 264c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingSetType(ISMapping mapping, const ISMappingType maptype); 265c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingSetSizes(ISMapping mapping, PetscInt m, PetscInt n, PetscInt M, PetscInt N); 266c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetSizes(ISMapping mapping, PetscInt *m, PetscInt *n, PetscInt *M, PetscInt *N); 267c0f1f046SDmitry Karpeev 268c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingSetUp(ISMapping mapping); 269c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingAssemblyBegin(ISMapping mapping); 270c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingAssemblyEnd(ISMapping mapping); 271c0f1f046SDmitry Karpeev 272c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetSupportIS(ISMapping mapping, IS *supp); 273c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetImageIS(ISMapping mapping, IS *image); 274c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetSupportSizeLocal(ISMapping mapping, PetscInt *supp_size); 275c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetImageSizeLocal(ISMapping mapping, PetscInt *image_size); 276c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetMaxImageSizeLocal(ISMapping mapping, PetscInt *max_image_size); 277f00dd492SSatish Balay extern PetscErrorCode ISMappingISGetEdges(ISMapping mapping, IS *ix, IS *iy); 278c0f1f046SDmitry Karpeev 279c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingMapIndicesLocal(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[]); 280c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingMapValuesLocal(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[]); 281c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingBinIndicesLocal(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[]); 282c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingBinValuesLocal(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[]); 283c0f1f046SDmitry Karpeev 284c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingMapIndices(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[], PetscBool drop); 285c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingMapValues(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[], PetscBool drop); 286c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingBinIndices(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[], PetscBool drop); 287c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingBinValues(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[], PetscBool drop); 288c0f1f046SDmitry Karpeev 289c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingInvert(ISMapping mapping, ISMapping *imapping); 290c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingPullback(ISMapping mapping1, ISMapping mapping2, ISMapping *mapping); 291c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingPushforward(ISMapping mapping1, ISMapping mapping2, ISMapping *mapping); 292c0f1f046SDmitry Karpeev 293c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetOperator(ISMapping mapping, Mat *op); 294c0f1f046SDmitry Karpeev 295c0f1f046SDmitry Karpeev /* IS_MAPPING_IS */ 296c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingISSetEdges(ISMapping mapping, IS ix, IS iy); 297c0f1f046SDmitry Karpeev 298c0f1f046SDmitry Karpeev 299e1589f56SBarry Smith PETSC_EXTERN_CXX_END 300e1589f56SBarry Smith #endif 301