xref: /petsc/include/petscdm.h (revision 6bf464f92cc51e6fd6163850774a6badb2f63b6b)
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 *);
1527087cfbeSBarry Smith extern PetscErrorCode   DMFinalizePackage(void);
153e1589f56SBarry Smith 
154e1589f56SBarry Smith typedef struct NLF_DAAD* NLF;
155e1589f56SBarry Smith 
1563c48a1e8SJed Brown #include "petscbag.h"
157e1589f56SBarry Smith 
1587087cfbeSBarry Smith extern PetscErrorCode  PetscViewerBinaryMatlabOpen(MPI_Comm, const char [], PetscViewer*);
159*6bf464f9SBarry Smith extern PetscErrorCode  PetscViewerBinaryMatlabDestroy(PetscViewer*);
1607087cfbeSBarry Smith extern PetscErrorCode  PetscViewerBinaryMatlabOutputBag(PetscViewer, const char [], PetscBag);
1617087cfbeSBarry Smith extern PetscErrorCode  PetscViewerBinaryMatlabOutputVec(PetscViewer, const char [], Vec);
1627087cfbeSBarry Smith extern PetscErrorCode  PetscViewerBinaryMatlabOutputVecDA(PetscViewer, const char [], Vec, DM);
163e1589f56SBarry Smith 
164c0f1f046SDmitry Karpeev /*-------------------------------------------------------------------------*/
165c0f1f046SDmitry Karpeev /* ISMapping */
166c0f1f046SDmitry Karpeev /*-------------------------------------------------------------------------*/
167c0f1f046SDmitry Karpeev extern  PetscClassId IS_MAPPING_CLASSID;
168c0f1f046SDmitry Karpeev extern PetscErrorCode  ISMappingInitializePackage(const char[]);
169c0f1f046SDmitry Karpeev /*S
170c0f1f046SDmitry Karpeev    ISMapping -   a generalization of ISLocalToGlobalMapping
171c0f1f046SDmitry Karpeev                maps from a domain [0,M) of indices to a range [0,N) of indices.
172c0f1f046SDmitry Karpeev                The mapping can be multivalued and can be thought of as a directed
173c0f1f046SDmitry Karpeev                graph with the start and end vertices drawn from the domain and range,
174c0f1f046SDmitry Karpeev                respectively. In the simplest case, an ISMapping is specified by pairs of ISs
175c0f1f046SDmitry Karpeev                of equal length prescribing the endpoints of as set of graph edges.
176c0f1f046SDmitry Karpeev 
177c0f1f046SDmitry Karpeev                  The domain is partitioned in parallel into local ownership ranges, the same way
178c0f1f046SDmitry Karpeev                as a Vec's indices. Since this is equivalent to specifying a PetscLayout, the domain
179c0f1f046SDmitry Karpeev                is said to be "laid out". Once the edges have been specified, the ISMapping is
180c0f1f046SDmitry Karpeev                assembled each rank has all of the edges with the source points in its ownership range.
181c0f1f046SDmitry Karpeev 
182c0f1f046SDmitry Karpeev                  After assembly, the mapping can be used to map the indices in the local ownership
183c0f1f046SDmitry Karpeev                range [m_p, m_{p+1}) to the global range indices on the other end of the edges.
184c0f1f046SDmitry Karpeev                Similarly, local indices from [0,m_{p+1}-m_p) can be mapped to the corresponding
185c0f1f046SDmitry Karpeev                global range indices.
186c0f1f046SDmitry Karpeev                  Unlike with ISLocalToGlobalMapping, an ISMapping can be multivalued and some local
187c0f1f046SDmitry Karpeev                indices might have empty images.  Because of that the output array resulting from the
188c0f1f046SDmitry Karpeev                application of the mapping to an input array of length m is supplemented with an offset
189c0f1f046SDmitry Karpeev                array of size m+1 to delineate the images of the consecuitive input indices.
190c0f1f046SDmitry Karpeev                  In addition to mapping just indices, indices together with  scalar arrays (of equal
191c0f1f046SDmitry Karpeev                sizes) can be mapped, with the scalar values simply "following" the input indices to
192c0f1f046SDmitry Karpeev                their images.  Since ISMappings are multivalued in general, the scalar values will be
193c0f1f046SDmitry Karpeev                replicated.  This is useful for employing ISMappings in VecSetValuesLocal or
194c0f1f046SDmitry Karpeev                MatSetValuesLocal.
195c0f1f046SDmitry Karpeev 
196c0f1f046SDmitry Karpeev 
197c0f1f046SDmitry Karpeev    Level: intermediate
198c0f1f046SDmitry Karpeev 
199c0f1f046SDmitry Karpeev .seealso:  ISMappingCreate(), ISMappingSetDomainSizes(), ISMappingApplyLocal(), ISMappingApplyWithValuesLocal()
200c0f1f046SDmitry Karpeev S*/
201c0f1f046SDmitry Karpeev typedef struct _p_ISMapping *ISMapping;
202c0f1f046SDmitry Karpeev 
203c0f1f046SDmitry Karpeev extern PetscErrorCode  ISMappingRegister(const char[],const char[],const char[],PetscErrorCode (*)(ISMapping));
204c0f1f046SDmitry Karpeev 
205c0f1f046SDmitry Karpeev /*MC
206c0f1f046SDmitry Karpeev    ISMappingRegisterDynamic - Adds a method to the ISMapping registry.
207c0f1f046SDmitry Karpeev 
208c0f1f046SDmitry Karpeev    Synopsis:
209c0f1f046SDmitry Karpeev    PetscErrorCode ISMappingRegisterDynamic(const char *name_mapping,const char *path,const char *name_create,PetscErrorCode (*routine_create)(ISMapping))
210c0f1f046SDmitry Karpeev 
211c0f1f046SDmitry Karpeev    Not Collective
212c0f1f046SDmitry Karpeev 
213c0f1f046SDmitry Karpeev    Input Parameters:
214c0f1f046SDmitry Karpeev +  name_mapping - name of a new user-defined mapping module
215c0f1f046SDmitry Karpeev .  path - path (either absolute or relative) the library containing this mapping
216c0f1f046SDmitry Karpeev .  name_create - name of routine to create method context
217c0f1f046SDmitry Karpeev -  routine_create - routine to create method context
218c0f1f046SDmitry Karpeev 
219c0f1f046SDmitry Karpeev    Level: developer
220c0f1f046SDmitry Karpeev 
221c0f1f046SDmitry Karpeev    Notes:
222c0f1f046SDmitry Karpeev    ISMappingRegisterDynamic() may be called multiple times to add several user-defined solvers.
223c0f1f046SDmitry Karpeev 
224c0f1f046SDmitry Karpeev    If dynamic libraries are used, then the fourth input argument (routine_create)
225c0f1f046SDmitry Karpeev    is ignored.
226c0f1f046SDmitry Karpeev 
227c0f1f046SDmitry Karpeev    Sample usage:
228c0f1f046SDmitry Karpeev .vb
229c0f1f046SDmitry Karpeev    ISMappingRegisterDynamic("my_mapping",/home/username/my_lib/lib/libO/solaris/mylib.a,
230c0f1f046SDmitry Karpeev                "MyMappingCreate",MyMappingCreate);
231c0f1f046SDmitry Karpeev .ve
232c0f1f046SDmitry Karpeev 
233c0f1f046SDmitry Karpeev    Then, your mapping can be chosen with the procedural interface via
234c0f1f046SDmitry Karpeev $     ISMappingSetType(mfctx,"my_mapping")
235c0f1f046SDmitry Karpeev    or at runtime via the option
236c0f1f046SDmitry Karpeev $     -is_mapping_type my_mapping
237c0f1f046SDmitry Karpeev 
238c0f1f046SDmitry Karpeev .keywords: ISMapping, register
239c0f1f046SDmitry Karpeev 
240c0f1f046SDmitry Karpeev .seealso: ISMappingRegisterAll(), ISMappingRegisterDestroy()
241c0f1f046SDmitry Karpeev M*/
242c0f1f046SDmitry Karpeev #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
243c0f1f046SDmitry Karpeev #define ISMappingRegisterDynamic(a,b,c,d) ISMappingRegister(a,b,c,0)
244c0f1f046SDmitry Karpeev #else
245c0f1f046SDmitry Karpeev #define ISMappingRegisterDynamic(a,b,c,d) ISMappingRegister(a,b,c,d)
246c0f1f046SDmitry Karpeev #endif
247c0f1f046SDmitry Karpeev 
248c0f1f046SDmitry Karpeev extern PetscErrorCode  ISMappingRegisterAll(const char[]);
249c0f1f046SDmitry Karpeev extern PetscErrorCode  ISMappingRegisterDestroy(void);
250c0f1f046SDmitry Karpeev 
251c0f1f046SDmitry Karpeev /*
252c0f1f046SDmitry Karpeev  Only one real type for now.
253c0f1f046SDmitry Karpeev  Will wrap sparse Mat and VecScatter objects as ISMappings in the future.
254c0f1f046SDmitry Karpeev  */
255c0f1f046SDmitry Karpeev #define ISMappingType char*
256c0f1f046SDmitry Karpeev #define IS_MAPPING_IS      "ISMappingIS"
257c0f1f046SDmitry Karpeev 
258c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingCreate(MPI_Comm comm, ISMapping *mapping);
259c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingView(ISMapping mapping, PetscViewer viewer);
260fcfd50ebSBarry Smith extern  PetscErrorCode ISMappingDestroy(ISMapping *mapping);
261c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingSetType(ISMapping mapping, const ISMappingType maptype);
262c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingSetSizes(ISMapping mapping, PetscInt m, PetscInt n, PetscInt M, PetscInt N);
263c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingGetSizes(ISMapping mapping, PetscInt *m, PetscInt *n, PetscInt *M, PetscInt *N);
264c0f1f046SDmitry Karpeev 
265c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingSetUp(ISMapping mapping);
266c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingAssemblyBegin(ISMapping mapping);
267c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingAssemblyEnd(ISMapping mapping);
268c0f1f046SDmitry Karpeev 
269c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingGetSupportIS(ISMapping mapping, IS *supp);
270c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingGetImageIS(ISMapping mapping, IS *image);
271c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingGetSupportSizeLocal(ISMapping mapping, PetscInt *supp_size);
272c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingGetImageSizeLocal(ISMapping mapping, PetscInt *image_size);
273c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingGetMaxImageSizeLocal(ISMapping mapping, PetscInt *max_image_size);
274f00dd492SSatish Balay extern  PetscErrorCode ISMappingISGetEdges(ISMapping mapping, IS *ix, IS *iy);
275c0f1f046SDmitry Karpeev 
276c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingMapIndicesLocal(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[]);
277c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingMapValuesLocal(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[]);
278c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingBinIndicesLocal(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[]);
279c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingBinValuesLocal(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[]);
280c0f1f046SDmitry Karpeev 
281c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingMapIndices(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[], PetscBool drop);
282c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingMapValues(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[], PetscBool drop);
283c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingBinIndices(ISMapping mapping, PetscInt insize, const PetscInt inidx[], PetscInt *outsize, PetscInt outidx[], PetscInt offsets[], PetscBool drop);
284c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingBinValues(ISMapping map, PetscInt insize, const PetscInt inidx[], const PetscScalar invals[], PetscInt *outsize, PetscInt outidx[], PetscScalar outvals[], PetscInt offsets[], PetscBool drop);
285c0f1f046SDmitry Karpeev 
286c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingInvert(ISMapping mapping, ISMapping *imapping);
287c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingPullback(ISMapping mapping1, ISMapping mapping2, ISMapping *mapping);
288c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingPushforward(ISMapping mapping1, ISMapping mapping2, ISMapping *mapping);
289c0f1f046SDmitry Karpeev 
290c0f1f046SDmitry Karpeev extern PetscErrorCode ISMappingGetOperator(ISMapping mapping, Mat *op);
291c0f1f046SDmitry Karpeev 
292c0f1f046SDmitry Karpeev /* IS_MAPPING_IS */
293c0f1f046SDmitry Karpeev extern  PetscErrorCode ISMappingISSetEdges(ISMapping mapping, IS ix, IS iy);
294c0f1f046SDmitry Karpeev 
295c0f1f046SDmitry Karpeev 
296e1589f56SBarry Smith PETSC_EXTERN_CXX_END
297e1589f56SBarry Smith #endif
298