xref: /petsc/include/petscis.h (revision 0c8c14c502e79aaeb7ec26e1cd1e476322d9010e)
1 /*
2    An index set is a generalization of a subset of integers.  Index sets
3    are used for defining scatters and gathers.
4 */
5 #if !defined(__PETSCIS_H)
6 #define __PETSCIS_H
7 #include <petscsys.h>
8 #include <petscsftypes.h>
9 
10 #define IS_FILE_CLASSID 1211218
11 PETSC_EXTERN PetscClassId IS_CLASSID;
12 
13 PETSC_EXTERN PetscErrorCode ISInitializePackage(void);
14 
15 /*S
16      IS - Abstract PETSc object that allows indexing.
17 
18    Level: beginner
19 
20   Concepts: indexing, stride
21 
22 .seealso:  ISCreateGeneral(), ISCreateBlock(), ISCreateStride(), ISGetIndices(), ISDestroy()
23 S*/
24 typedef struct _p_IS* IS;
25 
26 /*J
27     ISType - String with the name of a PETSc index set type
28 
29    Level: beginner
30 
31 .seealso: ISSetType(), IS, ISCreate(), ISRegister()
32 J*/
33 typedef const char* ISType;
34 #define ISGENERAL      "general"
35 #define ISSTRIDE       "stride"
36 #define ISBLOCK        "block"
37 
38 /* Dynamic creation and loading functions */
39 PETSC_EXTERN PetscFunctionList ISList;
40 PETSC_EXTERN PetscBool         ISRegisterAllCalled;
41 PETSC_EXTERN PetscErrorCode ISSetType(IS, ISType);
42 PETSC_EXTERN PetscErrorCode ISGetType(IS, ISType *);
43 PETSC_EXTERN PetscErrorCode ISRegister(const char[],PetscErrorCode (*)(IS));
44 PETSC_EXTERN PetscErrorCode ISRegisterAll(void);
45 PETSC_EXTERN PetscErrorCode ISCreate(MPI_Comm,IS*);
46 
47 /*
48     Default index set data structures that PETSc provides.
49 */
50 PETSC_EXTERN PetscErrorCode ISCreateGeneral(MPI_Comm,PetscInt,const PetscInt[],PetscCopyMode,IS *);
51 PETSC_EXTERN PetscErrorCode ISGeneralSetIndices(IS,PetscInt,const PetscInt[],PetscCopyMode);
52 PETSC_EXTERN PetscErrorCode ISCreateBlock(MPI_Comm,PetscInt,PetscInt,const PetscInt[],PetscCopyMode,IS *);
53 PETSC_EXTERN PetscErrorCode ISBlockSetIndices(IS,PetscInt,PetscInt,const PetscInt[],PetscCopyMode);
54 PETSC_EXTERN PetscErrorCode ISCreateStride(MPI_Comm,PetscInt,PetscInt,PetscInt,IS *);
55 PETSC_EXTERN PetscErrorCode ISStrideSetStride(IS,PetscInt,PetscInt,PetscInt);
56 
57 PETSC_EXTERN PetscErrorCode ISDestroy(IS*);
58 PETSC_EXTERN PetscErrorCode ISSetPermutation(IS);
59 PETSC_EXTERN PetscErrorCode ISPermutation(IS,PetscBool *);
60 PETSC_EXTERN PetscErrorCode ISSetIdentity(IS);
61 PETSC_EXTERN PetscErrorCode ISIdentity(IS,PetscBool *);
62 PETSC_EXTERN PetscErrorCode ISContiguousLocal(IS,PetscInt,PetscInt,PetscInt*,PetscBool*);
63 
64 PETSC_EXTERN PetscErrorCode ISGetIndices(IS,const PetscInt *[]);
65 PETSC_EXTERN PetscErrorCode ISRestoreIndices(IS,const PetscInt *[]);
66 PETSC_EXTERN PetscErrorCode ISGetTotalIndices(IS,const PetscInt *[]);
67 PETSC_EXTERN PetscErrorCode ISRestoreTotalIndices(IS,const PetscInt *[]);
68 PETSC_EXTERN PetscErrorCode ISGetNonlocalIndices(IS,const PetscInt *[]);
69 PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIndices(IS,const PetscInt *[]);
70 PETSC_EXTERN PetscErrorCode ISGetNonlocalIS(IS, IS *is);
71 PETSC_EXTERN PetscErrorCode ISRestoreNonlocalIS(IS, IS *is);
72 PETSC_EXTERN PetscErrorCode ISGetSize(IS,PetscInt *);
73 PETSC_EXTERN PetscErrorCode ISGetLocalSize(IS,PetscInt *);
74 PETSC_EXTERN PetscErrorCode ISInvertPermutation(IS,PetscInt,IS*);
75 PETSC_EXTERN PetscErrorCode ISView(IS,PetscViewer);
76 PETSC_STATIC_INLINE PetscErrorCode ISViewFromOptions(IS A,const char prefix[],const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,prefix,name);}
77 PETSC_EXTERN PetscErrorCode ISLoad(IS,PetscViewer);
78 PETSC_EXTERN PetscErrorCode ISEqual(IS,IS,PetscBool  *);
79 PETSC_EXTERN PetscErrorCode ISSort(IS);
80 PETSC_EXTERN PetscErrorCode ISSorted(IS,PetscBool  *);
81 PETSC_EXTERN PetscErrorCode ISDifference(IS,IS,IS*);
82 PETSC_EXTERN PetscErrorCode ISSum(IS,IS,IS*);
83 PETSC_EXTERN PetscErrorCode ISExpand(IS,IS,IS*);
84 PETSC_EXTERN PetscErrorCode ISGetMinMax(IS,PetscInt*,PetscInt*);
85 
86 PETSC_EXTERN PetscErrorCode ISBlockGetIndices(IS,const PetscInt *[]);
87 PETSC_EXTERN PetscErrorCode ISBlockRestoreIndices(IS,const PetscInt *[]);
88 PETSC_EXTERN PetscErrorCode ISBlockGetLocalSize(IS,PetscInt *);
89 PETSC_EXTERN PetscErrorCode ISBlockGetSize(IS,PetscInt *);
90 PETSC_EXTERN PetscErrorCode ISGetBlockSize(IS,PetscInt*);
91 PETSC_EXTERN PetscErrorCode ISSetBlockSize(IS,PetscInt);
92 
93 PETSC_EXTERN PetscErrorCode ISStrideGetInfo(IS,PetscInt *,PetscInt*);
94 
95 PETSC_EXTERN PetscErrorCode ISToGeneral(IS);
96 
97 PETSC_EXTERN PetscErrorCode ISDuplicate(IS,IS*);
98 PETSC_EXTERN PetscErrorCode ISCopy(IS,IS);
99 PETSC_EXTERN PetscErrorCode ISAllGather(IS,IS*);
100 PETSC_EXTERN PetscErrorCode ISComplement(IS,PetscInt,PetscInt,IS*);
101 PETSC_EXTERN PetscErrorCode ISConcatenate(MPI_Comm,PetscInt,const IS[],IS*);
102 PETSC_EXTERN PetscErrorCode ISListToPair(MPI_Comm,PetscInt, IS[],IS*,IS*);
103 PETSC_EXTERN PetscErrorCode ISPairToList(IS,IS,PetscInt*, IS *[]);
104 PETSC_EXTERN PetscErrorCode ISEmbed(IS,IS,PetscBool,IS*);
105 PETSC_EXTERN PetscErrorCode ISOnComm(IS,MPI_Comm,PetscCopyMode,IS*);
106 
107 /* --------------------------------------------------------------------------*/
108 PETSC_EXTERN PetscClassId IS_LTOGM_CLASSID;
109 
110 /*S
111    ISLocalToGlobalMapping - mappings from an arbitrary
112       local ordering from 0 to n-1 to a global PETSc ordering
113       used by a vector or matrix.
114 
115    Level: intermediate
116 
117    Note: mapping from Local to Global is scalable; but Global
118   to Local may not be if the range of global values represented locally
119   is very large.
120 
121    Note: the ISLocalToGlobalMapping is actually a private object; it is included
122   here for the inline function ISLocalToGlobalMappingApply() to allow it to be inlined since
123   it is used so often.
124 
125 .seealso:  ISLocalToGlobalMappingCreate()
126 S*/
127 typedef struct _p_ISLocalToGlobalMapping* ISLocalToGlobalMapping;
128 
129 /*E
130     ISGlobalToLocalMappingType - Indicates if missing global indices are
131 
132    IS_GTOLM_MASK - missing global indices are replaced with -1
133    IS_GTOLM_DROP - missing global indices are dropped
134 
135    Level: beginner
136 
137 .seealso: ISGlobalToLocalMappingApply()
138 
139 E*/
140 typedef enum {IS_GTOLM_MASK,IS_GTOLM_DROP} ISGlobalToLocalMappingType;
141 
142 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreate(MPI_Comm,PetscInt,const PetscInt[],PetscCopyMode,ISLocalToGlobalMapping*);
143 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateIS(IS,ISLocalToGlobalMapping *);
144 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingCreateSF(PetscSF,PetscInt,ISLocalToGlobalMapping*);
145 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingView(ISLocalToGlobalMapping,PetscViewer);
146 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingDestroy(ISLocalToGlobalMapping*);
147 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApply(ISLocalToGlobalMapping,PetscInt,const PetscInt[],PetscInt[]);
148 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingApplyIS(ISLocalToGlobalMapping,IS,IS*);
149 PETSC_EXTERN PetscErrorCode ISGlobalToLocalMappingApply(ISLocalToGlobalMapping,ISGlobalToLocalMappingType,PetscInt,const PetscInt[],PetscInt*,PetscInt[]);
150 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetSize(ISLocalToGlobalMapping,PetscInt*);
151 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt*[],PetscInt**[]);
152 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreInfo(ISLocalToGlobalMapping,PetscInt*,PetscInt*[],PetscInt*[],PetscInt**[]);
153 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingGetIndices(ISLocalToGlobalMapping,const PetscInt**);
154 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingRestoreIndices(ISLocalToGlobalMapping,const PetscInt**);
155 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingBlock(ISLocalToGlobalMapping,PetscInt,ISLocalToGlobalMapping*);
156 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingUnBlock(ISLocalToGlobalMapping,PetscInt,ISLocalToGlobalMapping*);
157 PETSC_EXTERN PetscErrorCode ISLocalToGlobalMappingConcatenate(MPI_Comm,PetscInt,const ISLocalToGlobalMapping[],ISLocalToGlobalMapping*);
158 PETSC_EXTERN PetscErrorCode ISG2LMapApply(ISLocalToGlobalMapping,PetscInt,const PetscInt[],PetscInt[]);
159 
160 /* --------------------------------------------------------------------------*/
161 /*E
162     ISColoringType - determines if the coloring is for the entire parallel grid/graph/matrix
163                      or for just the local ghosted portion
164 
165     Level: beginner
166 
167 $   IS_COLORING_GLOBAL - does not include the colors for ghost points, this is used when the function
168 $                        is called synchronously in parallel. This requires generating a "parallel coloring".
169 $   IS_COLORING_GHOSTED - includes colors for ghost points, this is used when the function can be called
170 $                         seperately on individual processes with the ghost points already filled in. Does not
171 $                         require a "parallel coloring", rather each process colors its local + ghost part.
172 $                         Using this can result in much less parallel communication. In the paradigm of
173 $                         DMGetLocalVector() and DMGetGlobalVector() this could be called IS_COLORING_LOCAL
174 
175 .seealso: DMCreateColoring()
176 E*/
177 typedef enum {IS_COLORING_GLOBAL,IS_COLORING_GHOSTED} ISColoringType;
178 PETSC_EXTERN const char *const ISColoringTypes[];
179 typedef unsigned PETSC_IS_COLOR_VALUE_TYPE ISColoringValue;
180 PETSC_EXTERN PetscErrorCode ISAllGatherColors(MPI_Comm,PetscInt,ISColoringValue*,PetscInt*,ISColoringValue*[]);
181 
182 /*S
183      ISColoring - sets of IS's that define a coloring
184               of the underlying indices
185 
186    Level: intermediate
187 
188     Notes:
189         One should not access the *is records below directly because they may not yet
190     have been created. One should use ISColoringGetIS() to make sure they are
191     created when needed.
192 
193     Developer Note: this is not a PetscObject
194 
195 .seealso:  ISColoringCreate(), ISColoringGetIS(), ISColoringView(), ISColoringGetIS()
196 S*/
197 struct _n_ISColoring {
198   PetscInt        refct;
199   PetscInt        n;                /* number of colors */
200   IS              *is;              /* for each color indicates columns */
201   MPI_Comm        comm;
202   ISColoringValue *colors;          /* for each column indicates color */
203   PetscInt        N;                /* number of columns */
204   ISColoringType  ctype;
205 };
206 typedef struct _n_ISColoring* ISColoring;
207 
208 PETSC_EXTERN PetscErrorCode ISColoringCreate(MPI_Comm,PetscInt,PetscInt,const ISColoringValue[],ISColoring*);
209 PETSC_EXTERN PetscErrorCode ISColoringDestroy(ISColoring*);
210 PETSC_EXTERN PetscErrorCode ISColoringView(ISColoring,PetscViewer);
211 PETSC_EXTERN PetscErrorCode ISColoringViewFromOptions(ISColoring,const char[],const char[]);
212 PETSC_EXTERN PetscErrorCode ISColoringGetIS(ISColoring,PetscInt*,IS*[]);
213 PETSC_EXTERN PetscErrorCode ISColoringRestoreIS(ISColoring,IS*[]);
214 PETSC_EXTERN PetscErrorCode ISColoringReference(ISColoring);
215 PETSC_EXTERN PetscErrorCode ISColoringSetType(ISColoring,ISColoringType);
216 
217 
218 /* --------------------------------------------------------------------------*/
219 
220 PETSC_EXTERN PetscErrorCode ISPartitioningToNumbering(IS,IS*);
221 PETSC_EXTERN PetscErrorCode ISPartitioningCount(IS,PetscInt,PetscInt[]);
222 
223 PETSC_EXTERN PetscErrorCode ISCompressIndicesGeneral(PetscInt,PetscInt,PetscInt,PetscInt,const IS[],IS[]);
224 PETSC_EXTERN PetscErrorCode ISCompressIndicesSorted(PetscInt,PetscInt,PetscInt,const IS[],IS[]);
225 PETSC_EXTERN PetscErrorCode ISExpandIndicesGeneral(PetscInt,PetscInt,PetscInt,PetscInt,const IS[],IS[]);
226 
227 /*S
228      PetscLayout - defines layout of vectors and matrices across processes (which rows are owned by which processes)
229 
230    Level: developer
231 
232 
233 .seealso:  PetscLayoutCreate(), PetscLayoutDestroy()
234 S*/
235 typedef struct _n_PetscLayout* PetscLayout;
236 struct _n_PetscLayout{
237   MPI_Comm               comm;
238   PetscInt               n,N;         /* local, global vector size */
239   PetscInt               rstart,rend; /* local start, local end + 1 */
240   PetscInt               *range;      /* the offset of each processor */
241   PetscInt               bs;          /* number of elements in each block (generally for multi-component
242                                        * problems). Defaults to -1 and can be arbitrarily lazy so always use
243                                        * PetscAbs(map->bs) when accessing directly and expecting result to be
244                                        * positive. Do NOT multiply above numbers by bs */
245   PetscInt               refcnt;      /* MPI Vecs obtained with VecDuplicate() and from MatGetVecs() reuse map of input object */
246   ISLocalToGlobalMapping mapping;     /* mapping used in Vec/MatSetValuesLocal() */
247   ISLocalToGlobalMapping bmapping;    /* mapping used in Vec/MatSetValuesBlockedLocal() */
248   PetscInt               *trstarts;   /* local start for each thread */
249 };
250 
251 PETSC_EXTERN PetscErrorCode PetscLayoutCreate(MPI_Comm,PetscLayout*);
252 PETSC_EXTERN PetscErrorCode PetscLayoutSetUp(PetscLayout);
253 PETSC_EXTERN PetscErrorCode PetscLayoutDestroy(PetscLayout*);
254 PETSC_EXTERN PetscErrorCode PetscLayoutDuplicate(PetscLayout,PetscLayout*);
255 PETSC_EXTERN PetscErrorCode PetscLayoutReference(PetscLayout,PetscLayout*);
256 PETSC_EXTERN PetscErrorCode PetscLayoutSetLocalSize(PetscLayout,PetscInt);
257 PETSC_EXTERN PetscErrorCode PetscLayoutGetLocalSize(PetscLayout,PetscInt *);
258 PETSC_EXTERN PetscErrorCode PetscLayoutSetSize(PetscLayout,PetscInt);
259 PETSC_EXTERN PetscErrorCode PetscLayoutGetSize(PetscLayout,PetscInt *);
260 PETSC_EXTERN PetscErrorCode PetscLayoutSetBlockSize(PetscLayout,PetscInt);
261 PETSC_EXTERN PetscErrorCode PetscLayoutGetBlockSize(PetscLayout,PetscInt*);
262 PETSC_EXTERN PetscErrorCode PetscLayoutGetRange(PetscLayout,PetscInt *,PetscInt *);
263 PETSC_EXTERN PetscErrorCode PetscLayoutGetRanges(PetscLayout,const PetscInt *[]);
264 PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMapping(PetscLayout,ISLocalToGlobalMapping);
265 PETSC_EXTERN PetscErrorCode PetscLayoutSetISLocalToGlobalMappingBlock(PetscLayout,ISLocalToGlobalMapping);
266 PETSC_EXTERN PetscErrorCode PetscSFSetGraphLayout(PetscSF,PetscLayout,PetscInt,const PetscInt*,PetscCopyMode,const PetscInt*);
267 
268 #undef __FUNCT__
269 #define __FUNCT__ "PetscLayoutFindOwner"
270 /*@C
271      PetscLayoutFindOwner - Find the owning rank for a global index
272 
273     Not Collective
274 
275    Input Parameters:
276 +    map - the layout
277 -    idx - global index to find the owner of
278 
279    Output Parameter:
280 .    owner - the owning rank
281 
282    Level: developer
283 
284     Fortran Notes:
285       Not available from Fortran
286 
287 @*/
288 PETSC_STATIC_INLINE PetscErrorCode PetscLayoutFindOwner(PetscLayout map,PetscInt idx,PetscInt *owner)
289 {
290   PetscErrorCode ierr;
291   PetscMPIInt    lo = 0,hi,t;
292 
293   PetscFunctionBegin;
294   *owner = -1;                  /* GCC erroneously issues warning about possibly uninitialized use when error condition */
295   if (!((map->n >= 0) && (map->N >= 0) && (map->range))) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"PetscLayoutSetUp() must be called first");
296   if (idx < 0 || idx > map->N) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Index %D is out of range",idx);
297   ierr = MPI_Comm_size(map->comm,&hi);CHKERRQ(ierr);
298   while (hi - lo > 1) {
299     t = lo + (hi - lo) / 2;
300     if (idx < map->range[t]) hi = t;
301     else                     lo = t;
302   }
303   *owner = lo;
304   PetscFunctionReturn(0);
305 }
306 
307 #undef __FUNCT__
308 #define __FUNCT__ "PetscLayoutFindOwnerIndex"
309 /*@C
310      PetscLayoutFindOwnerIndex - Find the owning rank and the local index for a global index
311 
312     Not Collective
313 
314    Input Parameters:
315 +    map   - the layout
316 -    idx   - global index to find the owner of
317 
318    Output Parameter:
319 +    owner - the owning rank
320 -    lidx  - local index used by the owner for idx
321 
322    Level: developer
323 
324     Fortran Notes:
325       Not available from Fortran
326 
327 @*/
328 PETSC_STATIC_INLINE PetscErrorCode PetscLayoutFindOwnerIndex(PetscLayout map,PetscInt idx,PetscInt *owner, PetscInt *lidx)
329 {
330   PetscErrorCode ierr;
331   PetscMPIInt    lo = 0,hi,t;
332 
333   PetscFunctionBegin;
334   if (!((map->n >= 0) && (map->N >= 0) && (map->range))) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"PetscLayoutSetUp() must be called first");
335   if (idx < 0 || idx > map->N) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Index %D is out of range",idx);
336   ierr = MPI_Comm_size(map->comm,&hi);CHKERRQ(ierr);
337   while (hi - lo > 1) {
338     t = lo + (hi - lo) / 2;
339     if (idx < map->range[t]) hi = t;
340     else                     lo = t;
341   }
342   *owner = lo;
343   *lidx  = idx-map->range[lo];
344   PetscFunctionReturn(0);
345 }
346 
347 PETSC_EXTERN PetscClassId PETSC_SECTION_CLASSID;
348 
349 /*S
350   PetscSection - Mapping from integers in a designated range to contiguous sets of integers.
351 
352   In contrast to IS, which maps from integers to single integers, the range of a PetscSection is in the space of
353   contiguous sets of integers. These ranges are frequently interpreted as domains of other array-like objects,
354   especially other PetscSections, Vecs, and ISs. The domain is set with PetscSectionSetChart() and does not need to
355   start at 0. For each point in the domain of a PetscSection, the output set is represented through an offset and a
356   count, which are set using PetscSectionSetOffset() and PetscSectionSetDof() respectively. Lookup is typically using
357   accessors or routines like VecGetValuesSection().
358 
359   Level: developer
360 
361 .seealso:  PetscSectionCreate(), PetscSectionDestroy()
362 S*/
363 typedef struct _p_PetscSection *PetscSection;
364 PETSC_EXTERN PetscErrorCode PetscSectionCreate(MPI_Comm,PetscSection*);
365 PETSC_EXTERN PetscErrorCode PetscSectionClone(PetscSection, PetscSection*);
366 PETSC_EXTERN PetscErrorCode PetscSectionGetNumFields(PetscSection, PetscInt *);
367 PETSC_EXTERN PetscErrorCode PetscSectionSetNumFields(PetscSection, PetscInt);
368 PETSC_EXTERN PetscErrorCode PetscSectionGetFieldName(PetscSection, PetscInt, const char *[]);
369 PETSC_EXTERN PetscErrorCode PetscSectionSetFieldName(PetscSection, PetscInt, const char []);
370 PETSC_EXTERN PetscErrorCode PetscSectionGetFieldComponents(PetscSection, PetscInt, PetscInt *);
371 PETSC_EXTERN PetscErrorCode PetscSectionSetFieldComponents(PetscSection, PetscInt, PetscInt);
372 PETSC_EXTERN PetscErrorCode PetscSectionGetChart(PetscSection, PetscInt *, PetscInt *);
373 PETSC_EXTERN PetscErrorCode PetscSectionSetChart(PetscSection, PetscInt, PetscInt);
374 PETSC_EXTERN PetscErrorCode PetscSectionGetPermutation(PetscSection, IS *);
375 PETSC_EXTERN PetscErrorCode PetscSectionSetPermutation(PetscSection, IS);
376 PETSC_EXTERN PetscErrorCode PetscSectionGetDof(PetscSection, PetscInt, PetscInt*);
377 PETSC_EXTERN PetscErrorCode PetscSectionSetDof(PetscSection, PetscInt, PetscInt);
378 PETSC_EXTERN PetscErrorCode PetscSectionAddDof(PetscSection, PetscInt, PetscInt);
379 PETSC_EXTERN PetscErrorCode PetscSectionGetFieldDof(PetscSection, PetscInt, PetscInt, PetscInt*);
380 PETSC_EXTERN PetscErrorCode PetscSectionSetFieldDof(PetscSection, PetscInt, PetscInt, PetscInt);
381 PETSC_EXTERN PetscErrorCode PetscSectionAddFieldDof(PetscSection, PetscInt, PetscInt, PetscInt);
382 PETSC_EXTERN PetscErrorCode PetscSectionHasConstraints(PetscSection, PetscBool *);
383 PETSC_EXTERN PetscErrorCode PetscSectionGetConstraintDof(PetscSection, PetscInt, PetscInt*);
384 PETSC_EXTERN PetscErrorCode PetscSectionSetConstraintDof(PetscSection, PetscInt, PetscInt);
385 PETSC_EXTERN PetscErrorCode PetscSectionAddConstraintDof(PetscSection, PetscInt, PetscInt);
386 PETSC_EXTERN PetscErrorCode PetscSectionGetFieldConstraintDof(PetscSection, PetscInt, PetscInt, PetscInt*);
387 PETSC_EXTERN PetscErrorCode PetscSectionSetFieldConstraintDof(PetscSection, PetscInt, PetscInt, PetscInt);
388 PETSC_EXTERN PetscErrorCode PetscSectionAddFieldConstraintDof(PetscSection, PetscInt, PetscInt, PetscInt);
389 PETSC_EXTERN PetscErrorCode PetscSectionGetConstraintIndices(PetscSection, PetscInt, const PetscInt**);
390 PETSC_EXTERN PetscErrorCode PetscSectionSetConstraintIndices(PetscSection, PetscInt, const PetscInt*);
391 PETSC_EXTERN PetscErrorCode PetscSectionGetFieldConstraintIndices(PetscSection, PetscInt, PetscInt, const PetscInt**);
392 PETSC_EXTERN PetscErrorCode PetscSectionSetFieldConstraintIndices(PetscSection, PetscInt, PetscInt, const PetscInt*);
393 PETSC_EXTERN PetscErrorCode PetscSectionSetUpBC(PetscSection);
394 PETSC_EXTERN PetscErrorCode PetscSectionSetUp(PetscSection);
395 PETSC_EXTERN PetscErrorCode PetscSectionGetMaxDof(PetscSection, PetscInt*);
396 PETSC_EXTERN PetscErrorCode PetscSectionGetStorageSize(PetscSection, PetscInt*);
397 PETSC_EXTERN PetscErrorCode PetscSectionGetConstrainedStorageSize(PetscSection, PetscInt*);
398 PETSC_EXTERN PetscErrorCode PetscSectionGetOffset(PetscSection, PetscInt, PetscInt*);
399 PETSC_EXTERN PetscErrorCode PetscSectionSetOffset(PetscSection, PetscInt, PetscInt);
400 PETSC_EXTERN PetscErrorCode PetscSectionGetFieldOffset(PetscSection, PetscInt, PetscInt, PetscInt*);
401 PETSC_EXTERN PetscErrorCode PetscSectionSetFieldOffset(PetscSection, PetscInt, PetscInt, PetscInt);
402 PETSC_EXTERN PetscErrorCode PetscSectionGetOffsetRange(PetscSection, PetscInt *, PetscInt *);
403 PETSC_EXTERN PetscErrorCode PetscSectionView(PetscSection, PetscViewer);
404 PETSC_STATIC_INLINE PetscErrorCode PetscSectionViewFromOptions(PetscSection A,const char prefix[],const char name[]) {return PetscObjectViewFromOptions((PetscObject)A,prefix,name);}
405 PETSC_EXTERN PetscErrorCode PetscSectionReset(PetscSection);
406 PETSC_EXTERN PetscErrorCode PetscSectionDestroy(PetscSection*);
407 PETSC_EXTERN PetscErrorCode PetscSectionCreateGlobalSection(PetscSection, PetscSF, PetscBool, PetscSection *);
408 PETSC_EXTERN PetscErrorCode PetscSectionCreateGlobalSectionCensored(PetscSection, PetscSF, PetscBool, PetscInt, const PetscInt [], PetscSection *);
409 PETSC_EXTERN PetscErrorCode PetscSectionCreateSubsection(PetscSection, PetscInt, PetscInt [], PetscSection *);
410 PETSC_EXTERN PetscErrorCode PetscSectionCreateSubmeshSection(PetscSection, IS, PetscSection *);
411 PETSC_EXTERN PetscErrorCode PetscSectionGetPointLayout(MPI_Comm, PetscSection, PetscLayout *);
412 PETSC_EXTERN PetscErrorCode PetscSectionGetValueLayout(MPI_Comm, PetscSection, PetscLayout *);
413 PETSC_EXTERN PetscErrorCode PetscSectionPermute(PetscSection, IS, PetscSection *);
414 PETSC_EXTERN PetscErrorCode PetscSectionGetField(PetscSection, PetscInt, PetscSection *);
415 
416 PETSC_EXTERN PetscErrorCode PetscSectionSetClosureIndex(PetscSection, PetscObject, PetscSection, IS);
417 PETSC_EXTERN PetscErrorCode PetscSectionGetClosureIndex(PetscSection, PetscObject, PetscSection *, IS *);
418 
419 /* PetscSF support */
420 PETSC_EXTERN PetscErrorCode PetscSFConvertPartition(PetscSF, PetscSection, IS, ISLocalToGlobalMapping *, PetscSF *);
421 PETSC_EXTERN PetscErrorCode PetscSFCreateRemoteOffsets(PetscSF, PetscSection, PetscSection, PetscInt **);
422 PETSC_EXTERN PetscErrorCode PetscSFDistributeSection(PetscSF, PetscSection, PetscInt **, PetscSection);
423 PETSC_EXTERN PetscErrorCode PetscSFCreateSectionSF(PetscSF, PetscSection, PetscInt [], PetscSection, PetscSF *);
424 
425 /* Reset __FUNCT__ in case the user does not define it themselves */
426 #undef __FUNCT__
427 #define __FUNCT__ "User provided function"
428 
429 #endif
430