Actual source code: petscsystypes.h

petsc-master 2019-06-22
Report Typos and Errors

  4: #include <petscconf.h>
  5: #include <petscfix.h>

  7: /*MC
  8:     PetscErrorCode - datatype used for return error code from almost all PETSc functions

 10:     Level: beginner

 12: .seealso: CHKERRQ, SETERRQ
 13: M*/
 14: typedef int PetscErrorCode;

 16: /*MC

 18:     PetscClassId - A unique id used to identify each PETSc class.

 20:     Notes:
 21:     Use PetscClassIdRegister() to obtain a new value for a new class being created. Usually
 22:          XXXInitializePackage() calls it for each class it defines.

 24:     Developer Notes:
 25:     Internal integer stored in the _p_PetscObject data structure.
 26:          These are all computed by an offset from the lowest one, PETSC_SMALLEST_CLASSID.

 28:     Level: developer

 30: .seealso: PetscClassIdRegister(), PetscLogEventRegister(), PetscHeaderCreate()
 31: M*/
 32: typedef int PetscClassId;

 34: /*MC
 35:     PetscMPIInt - datatype used to represent 'int' parameters to MPI functions.

 37:     Level: intermediate

 39:     Notes:
 40:     usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but
 41:            standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt; it remains 32 bit.

 43:     PetscMPIIntCast(a,&b) checks if the given PetscInt a will fit in a PetscMPIInt, if not it
 44:       generates a PETSC_ERR_ARG_OUTOFRANGE error.

 46: .seealso: PetscBLASInt, PetscInt, PetscMPIIntCast()

 48: M*/
 49: typedef int PetscMPIInt;

 51: /*MC
 52:     PetscEnum - datatype used to pass enum types within PETSc functions.

 54:     Level: intermediate

 56: .seealso: PetscOptionsGetEnum(), PetscOptionsEnum(), PetscBagRegisterEnum()
 57: M*/
 58: typedef enum { ENUM_DUMMY } PetscEnum;

 60: typedef short PetscShort;
 61: typedef char  PetscChar;
 62: typedef float PetscFloat;

 64: /*MC
 65:   PetscInt - PETSc type that represents an integer, used primarily to
 66:       represent size of arrays and indexing into arrays. Its size can be configured with the option --with-64-bit-indices to be either 32-bit (default) or 64-bit.

 68:   Notes:
 69:   For MPI calls that require datatypes, use MPIU_INT as the datatype for PetscInt. It will automatically work correctly regardless of the size of PetscInt.

 71:   Level: beginner

 73: .seealso: PetscBLASInt, PetscMPIInt, PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
 74: M*/

 76: #if defined(PETSC_HAVE_STDINT_H)
 77: #  include <stdint.h>
 78: #endif
 79: #if defined (PETSC_HAVE_INTTYPES_H)
 80: #  if !defined(__STDC_FORMAT_MACROS)
 81: #    define __STDC_FORMAT_MACROS /* required for using PRId64 from c++ */
 82: #  endif
 83: #  include <inttypes.h>
 84: #  if !defined(PRId64)
 85: #    define PRId64 "ld"
 86: #  endif
 87: #endif

 89: #if defined(PETSC_HAVE_STDINT_H) && defined(PETSC_HAVE_INTTYPES_H) && defined(PETSC_HAVE_MPI_INT64_T) /* MPI_INT64_T is not guaranteed to be a macro */
 90:    typedef int64_t PetscInt64;
 91: #elif (PETSC_SIZEOF_LONG_LONG == 8)
 92:    typedef long long PetscInt64;
 93: #elif defined(PETSC_HAVE___INT64)
 94:    typedef __int64 PetscInt64;
 95: #else
 96: #  error "cannot determine PetscInt64 type"
 97: #endif

 99: #if defined(PETSC_USE_64BIT_INDICES)
100:    typedef PetscInt64 PetscInt;
101: #else
102:    typedef int PetscInt;
103: #endif

105: /*MC
106:    PetscBLASInt - datatype used to represent 'int' parameters to BLAS/LAPACK functions.

108:    Notes:
109:     Usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but
110:            standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt it remains 32 bit
111:            (except on very rare BLAS/LAPACK implementations that support 64 bit integers see the notes below).

113:     PetscErrorCode PetscBLASIntCast(a,&b) checks if the given PetscInt a will fit in a PetscBLASInt, if not it
114:       generates a PETSC_ERR_ARG_OUTOFRANGE error

116:    Installation Notes:
117:     ./configure automatically determines the size of the integers used by BLAS/LAPACK except when --with-batch is used
118:     in that situation one must know (by some other means) if the integers used by BLAS/LAPACK are 64 bit and if so pass the flag --known-64-bit-blas-indice

120:     MATLAB ships with BLAS and LAPACK that use 64 bit integers, for example if you run ./configure with, the option
121:      --with-blaslapack-lib=[/Applications/MATLAB_R2010b.app/bin/maci64/libmwblas.dylib,/Applications/MATLAB_R2010b.app/bin/maci64/libmwlapack.dylib]

123:     MKL ships with both 32 and 64 bit integer versions of the BLAS and LAPACK. If you pass the flag -with-64-bit-blas-indices PETSc will link
124:     against the 64 bit version, otherwise it use the 32 bit version

126:     OpenBLAS can be built to use 64 bit integers. The ./configure options --download-openblas -with-64-bit-blas-indices will build a 64 bit integer version

128:     External packages such as hypre, ML, SuperLU etc do not provide any support for passing 64 bit integers to BLAS/LAPACK so cannot
129:     be used with PETSc when PETSc links against 64 bit integer BLAS/LAPACK. ./configure will generate an error if you attempt to link PETSc against any of
130:     these external libraries while using 64 bit integer BLAS/LAPACK.

132:    Level: intermediate

134: .seealso: PetscMPIInt, PetscInt, PetscBLASIntCast()

136: M*/
137: #if defined(PETSC_HAVE_64BIT_BLAS_INDICES)
138:    typedef PetscInt64 PetscBLASInt;
139: #else
140:    typedef int PetscBLASInt;
141: #endif

143: /*E
144:     PetscBool  - Logical variable. Actually an int in C and a logical in Fortran.

146:    Level: beginner

148:    Developer Note:
149:    Why have PetscBool , why not use bool in C? The problem is that K and R C, C99 and C++ all have different mechanisms for
150:       boolean values. It is not easy to have a simple macro that that will work properly in all circumstances with all three mechanisms.

152: .seealso: PETSC_TRUE, PETSC_FALSE, PetscNot()
153: E*/
154: typedef enum { PETSC_FALSE,PETSC_TRUE } PetscBool;

156: /*MC
157:    PetscReal - PETSc type that represents a real number version of PetscScalar


160:    Notes:
161:    For MPI calls that require datatypes, use MPIU_REAL as the datatype for PetscScalar and MPIU_SUM, MPIU_MAX, etc. for operations.
162:           They will automatically work correctly regardless of the size of PetscReal.

164:           See PetscScalar for details on how to ./configure the size of PetscReal.

166:    Level: beginner

168: .seealso: PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT
169: M*/

171: #if defined(PETSC_USE_REAL_SINGLE)
172:    typedef float PetscReal;
173: #elif defined(PETSC_USE_REAL_DOUBLE)
174:    typedef double PetscReal;
175: #elif defined(PETSC_USE_REAL___FLOAT128)
176: #  if defined(__cplusplus)
177:      extern "C" {
178: #  endif
179: #  include <quadmath.h>
180: #  if defined(__cplusplus)
181:      }
182: #  endif
183:    typedef __float128 PetscReal;
184: #elif defined(PETSC_USE_REAL___FP16)
185:    typedef __fp16 PetscReal;
186: #endif /* PETSC_USE_REAL_* */

188: /*MC
189:    PetscComplex - PETSc type that represents a complex number with precision matching that of PetscReal.

191:    Synopsis:
192:    #include <petscsys.h>
193:    PetscComplex number = 1. + 2.*PETSC_i;

195:    Notes:
196:    For MPI calls that require datatypes, use MPIU_COMPLEX as the datatype for PetscComplex and MPIU_SUM etc for operations.
197:           They will automatically work correctly regardless of the size of PetscComplex.

199:           See PetscScalar for details on how to ./configure the size of PetscReal

201:           Complex numbers are automatically available if PETSc was able to find a working complex implementation

203:    Level: beginner

205: .seealso: PetscReal, PetscScalar, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PETSC_i
206: M*/

208: #if defined(__cplusplus) && defined(PETSC_HAVE_CXX_COMPLEX) && !defined(PETSC_USE_REAL___FLOAT128)
209: #  if !defined(PETSC_SKIP_COMPLEX)
210:      /* C++ support of complex number */
211: #    define PETSC_HAVE_COMPLEX 1
212: #    if defined(PETSC_HAVE_CUDA) && __CUDACC_VER_MAJOR__ > 6
213:        /* complex headers in thrust only available in CUDA 7.0 and above */
214: #      define petsccomplexlib thrust
215: #      include <thrust/complex.h>
216: #    else
217: #      define petsccomplexlib std
218: #      include <complex>
219: #    endif
220: #    if defined(PETSC_USE_REAL_SINGLE)
221:        typedef petsccomplexlib::complex<float> PetscComplex;
222: #    elif defined(PETSC_USE_REAL_DOUBLE)
223:        typedef petsccomplexlib::complex<double> PetscComplex;
224: #    elif defined(PETSC_USE_REAL___FLOAT128)
225:        typedef petsccomplexlib::complex<__float128> PetscComplex; /* Notstandard and not expected to work, use __complex128 */
226: #    endif  /* PETSC_USE_REAL_ */
227: #  endif  /* ! PETSC_SKIP_COMPLEX */
228: #elif defined(PETSC_HAVE_C99_COMPLEX) && !defined(PETSC_USE_REAL___FP16)
229: #  if !defined(PETSC_SKIP_COMPLEX)
230: #    define PETSC_HAVE_COMPLEX 1
231: #    include <complex.h>
232: #    if defined(PETSC_USE_REAL_SINGLE) || defined(PETSC_USE_REAL___FP16)
233:        typedef float _Complex PetscComplex;
234: #    elif defined(PETSC_USE_REAL_DOUBLE)
235:        typedef double _Complex PetscComplex;
236: #    elif defined(PETSC_USE_REAL___FLOAT128)
237:        typedef __complex128 PetscComplex;
238: #    endif /* PETSC_USE_REAL_* */
239: #  endif /* !PETSC_SKIP_COMPLEX */
240: #elif (defined(PETSC_USE_COMPLEX) && !defined(PETSC_SKIP_COMPLEX))
241: #  error "PETSc was configured --with-scalar-type=complex, but a language-appropriate complex library is not available"
242: #endif /* !PETSC_SKIP_COMPLEX */

244: /*MC
245:    PetscScalar - PETSc type that represents either a double precision real number, a double precision
246:        complex number, a single precision real number, a __float128 real or complex or a __fp16 real - if the code is configured
247:        with --with-scalar-type=real,complex --with-precision=single,double,__float128,__fp16

249:    Notes:
250:    For MPI calls that require datatypes, use MPIU_SCALAR as the datatype for PetscScalar and MPIU_SUM, MPIU_MAX etc for operations. They will automatically work correctly regardless of the size of PetscScalar.

252:    Level: beginner

254: .seealso: PetscReal, PetscComplex, PetscInt, MPIU_REAL, MPIU_SCALAR, MPIU_COMPLEX, MPIU_INT, PetscRealPart(), PetscImaginaryPart()
255: M*/

257: #if (defined(PETSC_USE_COMPLEX) && !defined(PETSC_SKIP_COMPLEX))
258:    typedef PetscComplex PetscScalar;
259: #else /* PETSC_USE_COMPLEX */
260:    typedef PetscReal PetscScalar;
261: #endif /* PETSC_USE_COMPLEX */

263: /*E
264:     PetscCopyMode  - Determines how an array passed to certain functions is copied or retained

266:    Level: beginner

268: $   PETSC_COPY_VALUES - the array values are copied into new space, the user is free to reuse or delete the passed in array
269: $   PETSC_OWN_POINTER - the array values are NOT copied, the object takes ownership of the array and will free it later, the user cannot change or
270: $                       delete the array. The array MUST have been obtained with PetscMalloc(). Hence this mode cannot be used in Fortran.
271: $   PETSC_USE_POINTER - the array values are NOT copied, the object uses the array but does NOT take ownership of the array. The user cannot use
272:                         the array but the user must delete the array after the object is destroyed.

274: E*/
275: typedef enum {PETSC_COPY_VALUES, PETSC_OWN_POINTER, PETSC_USE_POINTER} PetscCopyMode;

277: /*MC
278:     PETSC_FALSE - False value of PetscBool

280:     Level: beginner

282:     Note:
283:     Zero integer

285: .seealso: PetscBool, PETSC_TRUE
286: M*/

288: /*MC
289:     PETSC_TRUE - True value of PetscBool

291:     Level: beginner

293:     Note:
294:     Nonzero integer

296: .seealso: PetscBool, PETSC_FALSE
297: M*/

299: /*MC
300:     PetscLogDouble - Used for logging times

302:   Notes:
303:   Contains double precision numbers that are not used in the numerical computations, but rather in logging, timing etc.

305:   Level: developer

307: M*/
308: typedef double PetscLogDouble;

310: /*E
311:     PetscDataType - Used for handling different basic data types.

313:    Level: beginner

315:    Notes:
316:    Use of this should be avoided if one can directly use MPI_Datatype instead.

318:    Developer comment:
319:    It would be nice if we could always just use MPI Datatypes, why can we not?

321:    If you change any values in PetscDatatype make sure you update their usage in
322:    share/petsc/matlab/PetscBagRead.m

324: .seealso: PetscBinaryRead(), PetscBinaryWrite(), PetscDataTypeToMPIDataType(),
325:           PetscDataTypeGetSize()

327: E*/
328: typedef enum {PETSC_DATATYPE_UNKNOWN = 0,
329:               PETSC_DOUBLE = 1, PETSC_COMPLEX = 2, PETSC_LONG = 3, PETSC_SHORT = 4, PETSC_FLOAT = 5,
330:               PETSC_CHAR = 6, PETSC_BIT_LOGICAL = 7, PETSC_ENUM = 8, PETSC_BOOL = 9, PETSC___FLOAT128 = 10,
331:               PETSC_OBJECT = 11, PETSC_FUNCTION = 12, PETSC_STRING = 13, PETSC___FP16 = 14, PETSC_STRUCT = 15,
332:               PETSC_INT = 16, PETSC_INT64 = 17} PetscDataType;

334: #if defined(PETSC_USE_COMPLEX)
335: #  define PETSC_SCALAR PETSC_COMPLEX
336: #else
337: #  if defined(PETSC_USE_REAL_SINGLE)
338: #    define PETSC_SCALAR PETSC_FLOAT
339: #  elif defined(PETSC_USE_REAL___FLOAT128)
340: #    define PETSC_SCALAR PETSC___FLOAT128
341: #  elif defined(PETSC_USE_REAL___FP16)
342: #    define PETSC_SCALAR PETSC___FP16
343: #  else
344: #    define PETSC_SCALAR PETSC_DOUBLE
345: #  endif
346: #endif
347: #if defined(PETSC_USE_REAL_SINGLE)
348: #  define PETSC_REAL PETSC_FLOAT
349: #elif defined(PETSC_USE_REAL___FLOAT128)
350: #  define PETSC_REAL PETSC___FLOAT128
351: #elif defined(PETSC_USE_REAL___FP16)
352: #  define PETSC_REAL PETSC___FP16
353: #else
354: #  define PETSC_REAL PETSC_DOUBLE
355: #endif
356: #define PETSC_FORTRANADDR PETSC_LONG

358: /*S
359:     PetscToken - 'Token' used for managing tokenizing strings

361:   Level: intermediate

363: .seealso: PetscTokenCreate(), PetscTokenFind(), PetscTokenDestroy()
364: S*/
365: typedef struct _p_PetscToken* PetscToken;

367: /*S
368:      PetscObject - any PETSc object, PetscViewer, Mat, Vec, KSP etc

370:    Level: beginner

372:    Note:
373:    This is the base class from which all PETSc objects are derived from.

375: .seealso:  PetscObjectDestroy(), PetscObjectView(), PetscObjectGetName(), PetscObjectSetName(), PetscObjectReference(), PetscObjectDereference()
376: S*/
377: typedef struct _p_PetscObject* PetscObject;

379: /*MC
380:     PetscObjectId - unique integer Id for a PetscObject

382:     Level: developer

384:     Notes:
385:     Unlike pointer values, object ids are never reused.

387: .seealso: PetscObjectState, PetscObjectGetId()
388: M*/
389: #if defined(PETSC_USING_F90) && !defined(PETSC_USE_FORTRANKIND) /* compaq F90 */
390:    typedef int PetscObjectId;
391: #else
392:    typedef PetscInt64 PetscObjectId;
393: #endif

395: /*MC
396:     PetscObjectState - integer state for a PetscObject

398:     Level: developer

400:     Notes:
401:     Object state is always-increasing and (for objects that track state) can be used to determine if an object has
402:     changed since the last time you interacted with it.  It is 64-bit so that it will not overflow for a very long time.

404: .seealso: PetscObjectId, PetscObjectStateGet(), PetscObjectStateIncrease(), PetscObjectStateSet()
405: M*/
406: #if defined(PETSC_USING_F90) && !defined(PETSC_USE_FORTRANKIND) /* compaq F90 */
407:    typedef int PetscObjectState;
408: #else
409:    typedef PetscInt64 PetscObjectState;
410: #endif

412: /*S
413:      PetscFunctionList - Linked list of functions, possibly stored in dynamic libraries, accessed
414:       by string name

416:    Level: advanced

418: .seealso:  PetscFunctionListAdd(), PetscFunctionListDestroy(), PetscOpFlist
419: S*/
420: typedef struct _n_PetscFunctionList *PetscFunctionList;

422: /*E
423:   PetscFileMode - Access mode for a file.

425:   Level: beginner

427: $  FILE_MODE_READ - open a file at its beginning for reading
428: $  FILE_MODE_WRITE - open a file at its beginning for writing (will create if the file does not exist)
429: $  FILE_MODE_APPEND - open a file at end for writing
430: $  FILE_MODE_UPDATE - open a file for updating, meaning for reading and writing
431: $  FILE_MODE_APPEND_UPDATE - open a file for updating, meaning for reading and writing, at the end

433: .seealso: PetscViewerFileSetMode()
434: E*/
435: typedef enum {FILE_MODE_READ, FILE_MODE_WRITE, FILE_MODE_APPEND, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE} PetscFileMode;

437: typedef void* PetscDLHandle;
438: typedef enum {PETSC_DL_DECIDE=0,PETSC_DL_NOW=1,PETSC_DL_LOCAL=2} PetscDLMode;

440: /*S
441:      PetscObjectList - Linked list of PETSc objects, each accessable by string name

443:    Level: developer

445:    Notes:
446:    Used by PetscObjectCompose() and PetscObjectQuery()

448: .seealso:  PetscObjectListAdd(), PetscObjectListDestroy(), PetscObjectListFind(), PetscObjectCompose(), PetscObjectQuery(), PetscFunctionList
449: S*/
450: typedef struct _n_PetscObjectList *PetscObjectList;

452: /*S
453:      PetscDLLibrary - Linked list of dynamics libraries to search for functions

455:    Level: advanced

457: .seealso:  PetscDLLibraryOpen()
458: S*/
459: typedef struct _n_PetscDLLibrary *PetscDLLibrary;

461: /*S
462:      PetscContainer - Simple PETSc object that contains a pointer to any required data

464:    Level: advanced

466: .seealso:  PetscObject, PetscContainerCreate()
467: S*/
468: typedef struct _p_PetscContainer*  PetscContainer;

470: /*S
471:      PetscRandom - Abstract PETSc object that manages generating random numbers

473:    Level: intermediate

475: .seealso:  PetscRandomCreate(), PetscRandomGetValue(), PetscRandomType
476: S*/
477: typedef struct _p_PetscRandom*   PetscRandom;

479: /*
480:    In binary files variables are stored using the following lengths,
481:   regardless of how they are stored in memory on any one particular
482:   machine. Use these rather then sizeof() in computing sizes for
483:   PetscBinarySeek().
484: */
485: #define PETSC_BINARY_INT_SIZE    (32/8)
486: #define PETSC_BINARY_FLOAT_SIZE  (32/8)
487: #define PETSC_BINARY_CHAR_SIZE   (8/8)
488: #define PETSC_BINARY_SHORT_SIZE  (16/8)
489: #define PETSC_BINARY_DOUBLE_SIZE (64/8)
490: #define PETSC_BINARY_SCALAR_SIZE sizeof(PetscScalar)

492: /*E
493:   PetscBinarySeekType - argument to PetscBinarySeek()

495:   Level: advanced

497: .seealso: PetscBinarySeek(), PetscBinarySynchronizedSeek()
498: E*/
499: typedef enum {PETSC_BINARY_SEEK_SET = 0,PETSC_BINARY_SEEK_CUR = 1,PETSC_BINARY_SEEK_END = 2} PetscBinarySeekType;

501: /*E
502:     PetscBuildTwoSidedType - algorithm for setting up two-sided communication

504: $  PETSC_BUILDTWOSIDED_ALLREDUCE - classical algorithm using an MPI_Allreduce with
505: $      a buffer of length equal to the communicator size. Not memory-scalable due to
506: $      the large reduction size. Requires only MPI-1.
507: $  PETSC_BUILDTWOSIDED_IBARRIER - nonblocking algorithm based on MPI_Issend and MPI_Ibarrier.
508: $      Proved communication-optimal in Hoefler, Siebert, and Lumsdaine (2010). Requires MPI-3.
509: $  PETSC_BUILDTWOSIDED_REDSCATTER - similar to above, but use more optimized function
510: $      that only communicates the part of the reduction that is necessary.  Requires MPI-2.

512:    Level: developer

514: .seealso: PetscCommBuildTwoSided(), PetscCommBuildTwoSidedSetType(), PetscCommBuildTwoSidedGetType()
515: E*/
516: typedef enum {
517:   PETSC_BUILDTWOSIDED_NOTSET = -1,
518:   PETSC_BUILDTWOSIDED_ALLREDUCE = 0,
519:   PETSC_BUILDTWOSIDED_IBARRIER = 1,
520:   PETSC_BUILDTWOSIDED_REDSCATTER = 2
521:   /* Updates here must be accompanied by updates in finclude/petscsys.h and the string array in mpits.c */
522: } PetscBuildTwoSidedType;

524: /*E
525:   InsertMode - Whether entries are inserted or added into vectors or matrices

527:   Level: beginner

529: .seealso: VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
530:           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(),
531:           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd()
532: E*/
533:  typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES, MAX_VALUES, INSERT_ALL_VALUES, ADD_ALL_VALUES, INSERT_BC_VALUES, ADD_BC_VALUES} InsertMode;

535: /*MC
536:     INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value

538:     Level: beginner

540: .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
541:           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES,
542:           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd(), MAX_VALUES

544: M*/

546: /*MC
547:     ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the
548:                 value into that location

550:     Level: beginner

552: .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
553:           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), INSERT_VALUES,
554:           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd(), MAX_VALUES

556: M*/

558: /*MC
559:     MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location

561:     Level: beginner

563: .seealso: InsertMode, VecScatterBegin(), VecScatterEnd(), ADD_VALUES, INSERT_VALUES

565: M*/

567: /*S
568:    PetscSubcomm - A decomposition of an MPI communicator into subcommunicators

570:    Notes:
571:    After a call to PetscSubcommSetType(), PetscSubcommSetTypeGeneral(), or PetscSubcommSetFromOptions() one may call
572: $     PetscSubcommChild() returns the associated subcommunicator on this process
573: $     PetscSubcommContiguousParent() returns a parent communitor but with all child of the same subcommunicator having contiguous rank

575:    Sample Usage:
576:        PetscSubcommCreate()
577:        PetscSubcommSetNumber()
578:        PetscSubcommSetType(PETSC_SUBCOMM_INTERLACED);
579:        ccomm = PetscSubcommChild()
580:        PetscSubcommDestroy()

582:    Level: advanced

584:    Notes:
585: $   PETSC_SUBCOMM_GENERAL - similar to MPI_Comm_split() each process sets the new communicator (color) they will belong to and the order within that communicator
586: $   PETSC_SUBCOMM_CONTIGUOUS - each new communicator contains a set of process with contiguous ranks in the original MPI communicator
587: $   PETSC_SUBCOMM_INTERLACED - each new communictor contains a set of processes equally far apart in rank from the others in that new communicator

589:    Example: Consider a communicator with six processes split into 3 subcommunicators.
590: $     PETSC_SUBCOMM_CONTIGUOUS - the first communicator contains rank 0,1  the second rank 2,3 and the third rank 4,5 in the original ordering of the original communicator
591: $     PETSC_SUBCOMM_INTERLACED - the first communicator contains rank 0,3, the second 1,4 and the third 2,5

593:    Developer Notes:
594:    This is used in objects such as PCREDUNDANT to manage the subcommunicators on which the redundant computations
595:       are performed.


598: .seealso: PetscSubcommCreate(), PetscSubcommSetNumber(), PetscSubcommSetType(), PetscSubcommView(), PetscSubcommSetFromOptions()

600: S*/
601: typedef struct _n_PetscSubcomm* PetscSubcomm;
602: typedef enum {PETSC_SUBCOMM_GENERAL=0,PETSC_SUBCOMM_CONTIGUOUS=1,PETSC_SUBCOMM_INTERLACED=2} PetscSubcommType;

604: /*S
605:      PetscHeap - A simple class for managing heaps

607:    Level: intermediate

609: .seealso:  PetscHeapCreate(), PetscHeapAdd(), PetscHeapPop(), PetscHeapPeek(), PetscHeapStash(), PetscHeapUnstash(), PetscHeapView(), PetscHeapDestroy()
610: S*/
611: typedef struct _PetscHeap *PetscHeap;

613: typedef struct _n_PetscShmComm* PetscShmComm;
614: typedef struct _n_PetscOmpCtrl* PetscOmpCtrl;

616: /*S
617:    PetscSegBuffer - a segmented extendable buffer

619:    Level: developer

621: .seealso: PetscSegBufferCreate(), PetscSegBufferGet(), PetscSegBufferExtract(), PetscSegBufferDestroy()
622: S*/
623: typedef struct _n_PetscSegBuffer *PetscSegBuffer;

625: typedef struct _n_PetscOptionsHelpPrinted *PetscOptionsHelpPrinted;

627: #endif