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