xref: /petsc/include/petscsys.h (revision d382aafbaf988181ac6819ef14789c4ab78c7a0e)
1*d382aafbSBarry Smith /*
2*d382aafbSBarry Smith    This is the main PETSc include file (for C and C++).  It is included by all
3*d382aafbSBarry Smith    other PETSc include files, so it almost never has to be specifically included.
4*d382aafbSBarry Smith */
5*d382aafbSBarry Smith #if !defined(__PETSC_H)
6*d382aafbSBarry Smith #define __PETSC_H
7*d382aafbSBarry Smith /* ========================================================================== */
8*d382aafbSBarry Smith /*
9*d382aafbSBarry Smith    petscconf.h is contained in ${PETSC_ARCH}/include/petscconf.h it is
10*d382aafbSBarry Smith    found automatically by the compiler due to the -I${PETSC_DIR}/${PETSC_ARCH}/include
11*d382aafbSBarry Smith    in the conf/variables definition of PETSC_INCLUDE
12*d382aafbSBarry Smith */
13*d382aafbSBarry Smith #include "petscconf.h"
14*d382aafbSBarry Smith #include "petscfix.h"
15*d382aafbSBarry Smith 
16*d382aafbSBarry Smith /* ========================================================================== */
17*d382aafbSBarry Smith /*
18*d382aafbSBarry Smith    This facilitates using C version of PETSc from C++ and
19*d382aafbSBarry Smith    C++ version from C. Use --with-c-support --with-clanguage=c++ with config/configure.py for the latter)
20*d382aafbSBarry Smith */
21*d382aafbSBarry Smith #if defined(PETSC_CLANGUAGE_CXX) && !defined(PETSC_USE_EXTERN_CXX) && !defined(__cplusplus)
22*d382aafbSBarry Smith #error "PETSc configured with --with-clanguage=c++ and NOT --with-c-support - it can be used only with a C++ compiler"
23*d382aafbSBarry Smith #endif
24*d382aafbSBarry Smith 
25*d382aafbSBarry Smith #if defined(PETSC_USE_EXTERN_CXX) && defined(__cplusplus)
26*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_BEGIN extern "C" {
27*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_END  }
28*d382aafbSBarry Smith #else
29*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_BEGIN
30*d382aafbSBarry Smith #define PETSC_EXTERN_CXX_END
31*d382aafbSBarry Smith #endif
32*d382aafbSBarry Smith /* ========================================================================== */
33*d382aafbSBarry Smith /*
34*d382aafbSBarry Smith    Current PETSc version number and release date. Also listed in
35*d382aafbSBarry Smith     Web page
36*d382aafbSBarry Smith     src/docs/tex/manual/intro.tex,
37*d382aafbSBarry Smith     src/docs/tex/manual/manual.tex.
38*d382aafbSBarry Smith     src/docs/website/index.html.
39*d382aafbSBarry Smith */
40*d382aafbSBarry Smith #include "petscversion.h"
41*d382aafbSBarry Smith #define PETSC_AUTHOR_INFO        "\
42*d382aafbSBarry Smith        The PETSc Team\n\
43*d382aafbSBarry Smith     petsc-maint@mcs.anl.gov\n\
44*d382aafbSBarry Smith  http://www.mcs.anl.gov/petsc/\n"
45*d382aafbSBarry Smith #if (PETSC_VERSION_RELEASE == 1)
46*d382aafbSBarry Smith #define PetscGetVersion(version,len) (PetscSNPrintf(version,len,"Petsc Release Version %d.%d.%d, Patch %d, ", \
47*d382aafbSBarry Smith                                          PETSC_VERSION_MAJOR,PETSC_VERSION_MINOR, PETSC_VERSION_SUBMINOR, \
48*d382aafbSBarry Smith                                          PETSC_VERSION_PATCH),PetscStrcat(version,PETSC_VERSION_PATCH_DATE))
49*d382aafbSBarry Smith #else
50*d382aafbSBarry Smith #define PetscGetVersion(version,len) (PetscSNPrintf(version,len,"Petsc Development"), \
51*d382aafbSBarry Smith                                          PetscStrcat(version," HG revision: "),PetscStrcat(version,PETSC_VERSION_HG), \
52*d382aafbSBarry Smith                                          PetscStrcat(version," HG Date: "),PetscStrcat(version,PETSC_VERSION_DATE_HG))
53*d382aafbSBarry Smith #endif
54*d382aafbSBarry Smith 
55*d382aafbSBarry Smith /*MC
56*d382aafbSBarry Smith     PetscGetVersion - Gets the PETSc version information in a string.
57*d382aafbSBarry Smith 
58*d382aafbSBarry Smith     Input Parameter:
59*d382aafbSBarry Smith .   len - length of the string
60*d382aafbSBarry Smith 
61*d382aafbSBarry Smith     Output Parameter:
62*d382aafbSBarry Smith .   version - version string
63*d382aafbSBarry Smith 
64*d382aafbSBarry Smith     Level: developer
65*d382aafbSBarry Smith 
66*d382aafbSBarry Smith     Usage:
67*d382aafbSBarry Smith     char version[256];
68*d382aafbSBarry Smith     ierr = PetscGetVersion(version,256);CHKERRQ(ierr)
69*d382aafbSBarry Smith 
70*d382aafbSBarry Smith     Fortran Note:
71*d382aafbSBarry Smith     This routine is not supported in Fortran.
72*d382aafbSBarry Smith 
73*d382aafbSBarry Smith .seealso: PetscGetProgramName()
74*d382aafbSBarry Smith 
75*d382aafbSBarry Smith M*/
76*d382aafbSBarry Smith 
77*d382aafbSBarry Smith /* ========================================================================== */
78*d382aafbSBarry Smith 
79*d382aafbSBarry Smith /*
80*d382aafbSBarry Smith    Currently cannot check formatting for PETSc print statements because we have our
81*d382aafbSBarry Smith    own format %D and %G
82*d382aafbSBarry Smith */
83*d382aafbSBarry Smith #undef  PETSC_PRINTF_FORMAT_CHECK
84*d382aafbSBarry Smith #define PETSC_PRINTF_FORMAT_CHECK(a,b)
85*d382aafbSBarry Smith #undef  PETSC_FPRINTF_FORMAT_CHECK
86*d382aafbSBarry Smith #define PETSC_FPRINTF_FORMAT_CHECK(a,b)
87*d382aafbSBarry Smith 
88*d382aafbSBarry Smith /*
89*d382aafbSBarry Smith    Fixes for config/configure.py time choices which impact our interface. Currently only
90*d382aafbSBarry Smith    calling conventions and extra compiler checking falls under this category.
91*d382aafbSBarry Smith */
92*d382aafbSBarry Smith #if !defined(PETSC_STDCALL)
93*d382aafbSBarry Smith #define PETSC_STDCALL
94*d382aafbSBarry Smith #endif
95*d382aafbSBarry Smith #if !defined(PETSC_TEMPLATE)
96*d382aafbSBarry Smith #define PETSC_TEMPLATE
97*d382aafbSBarry Smith #endif
98*d382aafbSBarry Smith #if !defined(PETSC_HAVE_DLL_EXPORT)
99*d382aafbSBarry Smith #define PETSC_DLL_EXPORT
100*d382aafbSBarry Smith #define PETSC_DLL_IMPORT
101*d382aafbSBarry Smith #endif
102*d382aafbSBarry Smith #if !defined(PETSC_DLLEXPORT)
103*d382aafbSBarry Smith #define PETSC_DLLEXPORT
104*d382aafbSBarry Smith #endif
105*d382aafbSBarry Smith #if !defined(PETSCVEC_DLLEXPORT)
106*d382aafbSBarry Smith #define PETSCVEC_DLLEXPORT
107*d382aafbSBarry Smith #endif
108*d382aafbSBarry Smith #if !defined(PETSCMAT_DLLEXPORT)
109*d382aafbSBarry Smith #define PETSCMAT_DLLEXPORT
110*d382aafbSBarry Smith #endif
111*d382aafbSBarry Smith #if !defined(PETSCDM_DLLEXPORT)
112*d382aafbSBarry Smith #define PETSCDM_DLLEXPORT
113*d382aafbSBarry Smith #endif
114*d382aafbSBarry Smith #if !defined(PETSCKSP_DLLEXPORT)
115*d382aafbSBarry Smith #define PETSCKSP_DLLEXPORT
116*d382aafbSBarry Smith #endif
117*d382aafbSBarry Smith #if !defined(PETSCSNES_DLLEXPORT)
118*d382aafbSBarry Smith #define PETSCSNES_DLLEXPORT
119*d382aafbSBarry Smith #endif
120*d382aafbSBarry Smith #if !defined(PETSCTS_DLLEXPORT)
121*d382aafbSBarry Smith #define PETSCTS_DLLEXPORT
122*d382aafbSBarry Smith #endif
123*d382aafbSBarry Smith #if !defined(PETSCFORTRAN_DLLEXPORT)
124*d382aafbSBarry Smith #define PETSCFORTRAN_DLLEXPORT
125*d382aafbSBarry Smith #endif
126*d382aafbSBarry Smith /* ========================================================================== */
127*d382aafbSBarry Smith 
128*d382aafbSBarry Smith /*
129*d382aafbSBarry Smith     Defines the interface to MPI allowing the use of all MPI functions.
130*d382aafbSBarry Smith 
131*d382aafbSBarry Smith     PETSc does not use the C++ binding of MPI at ALL. The following flag
132*d382aafbSBarry Smith     makes sure the C++ bindings are not included. The C++ bindings REQUIRE
133*d382aafbSBarry Smith     putting mpi.h before ANY C++ include files, we cannot control this
134*d382aafbSBarry Smith     with all PETSc users. Users who want to use the MPI C++ bindings can include
135*d382aafbSBarry Smith     mpicxx.h directly in their code
136*d382aafbSBarry Smith */
137*d382aafbSBarry Smith #if defined(PETSC_HAVE_MPI)
138*d382aafbSBarry Smith #define MPICH_SKIP_MPICXX 1
139*d382aafbSBarry Smith #define OMPI_SKIP_MPICXX 1
140*d382aafbSBarry Smith #include "mpi.h"
141*d382aafbSBarry Smith #else
142*d382aafbSBarry Smith #include "mpiuni/mpi.h"
143*d382aafbSBarry Smith #endif
144*d382aafbSBarry Smith /*
145*d382aafbSBarry Smith     Yuck, we need to put stdio.h AFTER mpi.h for MPICH2 with C++ compiler
146*d382aafbSBarry Smith     see the top of mpicxx.h in the MPICH2 distribution.
147*d382aafbSBarry Smith 
148*d382aafbSBarry Smith     The MPI STANDARD HAS TO BE CHANGED to prevent this nonsense.
149*d382aafbSBarry Smith */
150*d382aafbSBarry Smith #include <stdio.h>
151*d382aafbSBarry Smith 
152*d382aafbSBarry Smith /* MSMPI on 32bit windows requires this yukky hack - that breaks MPI standard compliance */
153*d382aafbSBarry Smith #if !defined(MPIAPI)
154*d382aafbSBarry Smith #define MPIAPI
155*d382aafbSBarry Smith #endif
156*d382aafbSBarry Smith 
157*d382aafbSBarry Smith /*MC
158*d382aafbSBarry Smith     PetscErrorCode - datatype used for return error code from all PETSc functions
159*d382aafbSBarry Smith 
160*d382aafbSBarry Smith     Level: beginner
161*d382aafbSBarry Smith 
162*d382aafbSBarry Smith .seealso: CHKERRQ, SETERRQ
163*d382aafbSBarry Smith M*/
164*d382aafbSBarry Smith typedef int PetscErrorCode;
165*d382aafbSBarry Smith 
166*d382aafbSBarry Smith /*MC
167*d382aafbSBarry Smith 
168*d382aafbSBarry Smith     PetscCookie - A unique id used to identify each PETSc object.
169*d382aafbSBarry Smith          (internal integer in the data structure used for error
170*d382aafbSBarry Smith          checking). These are all defined by an offset from the lowest
171*d382aafbSBarry Smith          one, PETSC_SMALLEST_COOKIE.
172*d382aafbSBarry Smith 
173*d382aafbSBarry Smith     Level: advanced
174*d382aafbSBarry Smith 
175*d382aafbSBarry Smith .seealso: PetscCookieRegister(), PetscLogEventRegister(), PetscHeaderCreate()
176*d382aafbSBarry Smith M*/
177*d382aafbSBarry Smith typedef int PetscCookie;
178*d382aafbSBarry Smith 
179*d382aafbSBarry Smith /*MC
180*d382aafbSBarry Smith     PetscLogEvent - id used to identify PETSc or user events - primarily for logging
181*d382aafbSBarry Smith 
182*d382aafbSBarry Smith     Level: intermediate
183*d382aafbSBarry Smith 
184*d382aafbSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
185*d382aafbSBarry Smith M*/
186*d382aafbSBarry Smith typedef int PetscLogEvent;
187*d382aafbSBarry Smith 
188*d382aafbSBarry Smith /*MC
189*d382aafbSBarry Smith     PetscLogStage - id used to identify user stages of runs - for logging
190*d382aafbSBarry Smith 
191*d382aafbSBarry Smith     Level: intermediate
192*d382aafbSBarry Smith 
193*d382aafbSBarry Smith .seealso: PetscLogStageRegister(), PetscLogStageBegin(), PetscLogStageEnd(), PetscLogEvent
194*d382aafbSBarry Smith M*/
195*d382aafbSBarry Smith typedef int PetscLogStage;
196*d382aafbSBarry Smith 
197*d382aafbSBarry Smith /*MC
198*d382aafbSBarry Smith     PetscBLASInt - datatype used to represent 'int' parameters to BLAS/LAPACK functions.
199*d382aafbSBarry Smith 
200*d382aafbSBarry Smith     Level: intermediate
201*d382aafbSBarry Smith 
202*d382aafbSBarry Smith     Notes: usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but
203*d382aafbSBarry Smith            standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt
204*d382aafbSBarry Smith 
205*d382aafbSBarry Smith .seealso: PetscMPIInt, PetscInt
206*d382aafbSBarry Smith 
207*d382aafbSBarry Smith M*/
208*d382aafbSBarry Smith typedef int PetscBLASInt;
209*d382aafbSBarry Smith 
210*d382aafbSBarry Smith /*MC
211*d382aafbSBarry Smith     PetscMPIInt - datatype used to represent 'int' parameters to MPI functions.
212*d382aafbSBarry Smith 
213*d382aafbSBarry Smith     Level: intermediate
214*d382aafbSBarry Smith 
215*d382aafbSBarry Smith     Notes: usually this is the same as PetscInt, but if PETSc was built with --with-64-bit-indices but
216*d382aafbSBarry Smith            standard C/Fortran integers are 32 bit then this is NOT the same as PetscInt
217*d382aafbSBarry Smith 
218*d382aafbSBarry Smith     PetscBLASIntCheck(a) checks if the given PetscInt a will fit in a PetscBLASInt, if not it generates a
219*d382aafbSBarry Smith       PETSC_ERR_ARG_OUTOFRANGE.
220*d382aafbSBarry Smith 
221*d382aafbSBarry Smith     PetscBLASInt b = PetscBLASIntCast(a) checks if the given PetscInt a will fit in a PetscBLASInt, if not it
222*d382aafbSBarry Smith       generates a PETSC_ERR_ARG_OUTOFRANGE
223*d382aafbSBarry Smith 
224*d382aafbSBarry Smith .seealso: PetscBLASInt, PetscInt
225*d382aafbSBarry Smith 
226*d382aafbSBarry Smith M*/
227*d382aafbSBarry Smith typedef int PetscMPIInt;
228*d382aafbSBarry Smith 
229*d382aafbSBarry Smith /*MC
230*d382aafbSBarry Smith     PetscEnum - datatype used to pass enum types within PETSc functions.
231*d382aafbSBarry Smith 
232*d382aafbSBarry Smith     Level: intermediate
233*d382aafbSBarry Smith 
234*d382aafbSBarry Smith     PetscMPIIntCheck(a) checks if the given PetscInt a will fit in a PetscMPIInt, if not it generates a
235*d382aafbSBarry Smith       PETSC_ERR_ARG_OUTOFRANGE.
236*d382aafbSBarry Smith 
237*d382aafbSBarry Smith     PetscMPIInt b = PetscMPIIntCast(a) checks if the given PetscInt a will fit in a PetscMPIInt, if not it
238*d382aafbSBarry Smith       generates a PETSC_ERR_ARG_OUTOFRANGE
239*d382aafbSBarry Smith 
240*d382aafbSBarry Smith .seealso: PetscOptionsGetEnum(), PetscOptionsEnum(), PetscBagRegisterEnum()
241*d382aafbSBarry Smith M*/
242*d382aafbSBarry Smith typedef enum { ENUM_DUMMY } PetscEnum;
243*d382aafbSBarry Smith 
244*d382aafbSBarry Smith /*MC
245*d382aafbSBarry Smith     PetscInt - PETSc type that represents integer - used primarily to
246*d382aafbSBarry Smith       represent size of objects. Its size can be configured with the option
247*d382aafbSBarry Smith       --with-64-bit-indices - to be either 32bit or 64bit [default 32 bit ints]
248*d382aafbSBarry Smith 
249*d382aafbSBarry Smith    Level: intermediate
250*d382aafbSBarry Smith 
251*d382aafbSBarry Smith 
252*d382aafbSBarry Smith .seealso: PetscScalar, PetscBLASInt, PetscMPIInt
253*d382aafbSBarry Smith M*/
254*d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES)
255*d382aafbSBarry Smith typedef long long PetscInt;
256*d382aafbSBarry Smith #define MPIU_INT MPI_LONG_LONG_INT
257*d382aafbSBarry Smith #else
258*d382aafbSBarry Smith typedef int PetscInt;
259*d382aafbSBarry Smith #define MPIU_INT MPI_INT
260*d382aafbSBarry Smith #endif
261*d382aafbSBarry Smith 
262*d382aafbSBarry Smith /* add in MPIU type for size_t */
263*d382aafbSBarry Smith #if (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_INT)
264*d382aafbSBarry Smith #define MPIU_SIZE_T MPI_INT
265*d382aafbSBarry Smith #elif  (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_LONG)
266*d382aafbSBarry Smith #define MPIU_SIZE_T MPI_LONG
267*d382aafbSBarry Smith #elif  (PETSC_SIZEOF_SIZE_T) == (PETSC_SIZEOF_LONG_LONG)
268*d382aafbSBarry Smith #define MPIU_SIZE_T MPI_LONG_LONG_INT
269*d382aafbSBarry Smith #else
270*d382aafbSBarry Smith #error "Unknown size for size_t! Send us a bugreport at petsc-maint@mcs.anl.gov"
271*d382aafbSBarry Smith #endif
272*d382aafbSBarry Smith 
273*d382aafbSBarry Smith 
274*d382aafbSBarry Smith /*
275*d382aafbSBarry Smith       You can use PETSC_STDOUT as a replacement of stdout. You can also change
276*d382aafbSBarry Smith     the value of PETSC_STDOUT to redirect all standard output elsewhere
277*d382aafbSBarry Smith */
278*d382aafbSBarry Smith 
279*d382aafbSBarry Smith extern FILE* PETSC_STDOUT;
280*d382aafbSBarry Smith 
281*d382aafbSBarry Smith /*
282*d382aafbSBarry Smith       You can use PETSC_STDERR as a replacement of stderr. You can also change
283*d382aafbSBarry Smith     the value of PETSC_STDERR to redirect all standard error elsewhere
284*d382aafbSBarry Smith */
285*d382aafbSBarry Smith extern FILE* PETSC_STDERR;
286*d382aafbSBarry Smith 
287*d382aafbSBarry Smith /*
288*d382aafbSBarry Smith       PETSC_ZOPEFD is used to send data to the PETSc webpage.  It can be used
289*d382aafbSBarry Smith     in conjunction with PETSC_STDOUT, or by itself.
290*d382aafbSBarry Smith */
291*d382aafbSBarry Smith extern FILE* PETSC_ZOPEFD;
292*d382aafbSBarry Smith 
293*d382aafbSBarry Smith #if !defined(PETSC_USE_EXTERN_CXX) && defined(__cplusplus)
294*d382aafbSBarry Smith /*MC
295*d382aafbSBarry Smith       PetscPolymorphicSubroutine - allows defining a C++ polymorphic version of
296*d382aafbSBarry Smith             a PETSc function that remove certain optional arguments for a simplier user interface
297*d382aafbSBarry Smith 
298*d382aafbSBarry Smith      Not collective
299*d382aafbSBarry Smith 
300*d382aafbSBarry Smith    Synopsis:
301*d382aafbSBarry Smith    PetscPolymorphicSubroutine(Functionname,(arguments of C++ function),(arguments of C function))
302*d382aafbSBarry Smith 
303*d382aafbSBarry Smith    Level: developer
304*d382aafbSBarry Smith 
305*d382aafbSBarry Smith     Example:
306*d382aafbSBarry Smith       PetscPolymorphicSubroutine(VecNorm,(Vec x,PetscReal *r),(x,NORM_2,r)) generates the new routine
307*d382aafbSBarry Smith            PetscErrorCode VecNorm(Vec x,PetscReal *r) = VecNorm(x,NORM_2,r)
308*d382aafbSBarry Smith 
309*d382aafbSBarry Smith .seealso: PetscPolymorphicFunction()
310*d382aafbSBarry Smith 
311*d382aafbSBarry Smith M*/
312*d382aafbSBarry Smith #define PetscPolymorphicSubroutine(A,B,C) PETSC_STATIC_INLINE PetscErrorCode A B {return A C;}
313*d382aafbSBarry Smith 
314*d382aafbSBarry Smith /*MC
315*d382aafbSBarry Smith       PetscPolymorphicScalar - allows defining a C++ polymorphic version of
316*d382aafbSBarry Smith             a PETSc function that replaces a PetscScalar * argument with a PetscScalar argument
317*d382aafbSBarry Smith 
318*d382aafbSBarry Smith      Not collective
319*d382aafbSBarry Smith 
320*d382aafbSBarry Smith    Synopsis:
321*d382aafbSBarry Smith    PetscPolymorphicScalar(Functionname,(arguments of C++ function),(arguments of C function))
322*d382aafbSBarry Smith 
323*d382aafbSBarry Smith    Level: developer
324*d382aafbSBarry Smith 
325*d382aafbSBarry Smith     Example:
326*d382aafbSBarry Smith       PetscPolymorphicScalar(VecAXPY,(PetscScalar _val,Vec x,Vec y),(&_Val,x,y)) generates the new routine
327*d382aafbSBarry Smith            PetscErrorCode VecAXPY(PetscScalar _val,Vec x,Vec y) = {PetscScalar _Val = _val; return VecAXPY(&_Val,x,y);}
328*d382aafbSBarry Smith 
329*d382aafbSBarry Smith .seealso: PetscPolymorphicFunction(),PetscPolymorphicSubroutine()
330*d382aafbSBarry Smith 
331*d382aafbSBarry Smith M*/
332*d382aafbSBarry Smith #define PetscPolymorphicScalar(A,B,C) PETSC_STATIC_INLINE PetscErrorCode A B {PetscScalar _Val = _val; return A C;}
333*d382aafbSBarry Smith 
334*d382aafbSBarry Smith /*MC
335*d382aafbSBarry Smith       PetscPolymorphicFunction - allows defining a C++ polymorphic version of
336*d382aafbSBarry Smith             a PETSc function that remove certain optional arguments for a simplier user interface
337*d382aafbSBarry Smith             and returns the computed value (istead of an error code)
338*d382aafbSBarry Smith 
339*d382aafbSBarry Smith      Not collective
340*d382aafbSBarry Smith 
341*d382aafbSBarry Smith    Synopsis:
342*d382aafbSBarry Smith    PetscPolymorphicFunction(Functionname,(arguments of C++ function),(arguments of C function),return type,return variable name)
343*d382aafbSBarry Smith 
344*d382aafbSBarry Smith    Level: developer
345*d382aafbSBarry Smith 
346*d382aafbSBarry Smith     Example:
347*d382aafbSBarry Smith       PetscPolymorphicFunction(VecNorm,(Vec x,NormType t),(x,t,&r),PetscReal,r) generates the new routine
348*d382aafbSBarry Smith          PetscReal VecNorm(Vec x,NormType t) = {PetscReal r; VecNorm(x,t,&r); return r;}
349*d382aafbSBarry Smith 
350*d382aafbSBarry Smith .seealso: PetscPolymorphicSubroutine()
351*d382aafbSBarry Smith 
352*d382aafbSBarry Smith M*/
353*d382aafbSBarry Smith #define PetscPolymorphicFunction(A,B,C,D,E) PETSC_STATIC_INLINE D A B {D E; A C;return E;}
354*d382aafbSBarry Smith 
355*d382aafbSBarry Smith #else
356*d382aafbSBarry Smith #define PetscPolymorphicSubroutine(A,B,C)
357*d382aafbSBarry Smith #define PetscPolymorphicScalar(A,B,C)
358*d382aafbSBarry Smith #define PetscPolymorphicFunction(A,B,C,D,E)
359*d382aafbSBarry Smith #endif
360*d382aafbSBarry Smith 
361*d382aafbSBarry Smith /*MC
362*d382aafbSBarry Smith     PetscUnlikely - hints the compiler that the given condition is usually FALSE
363*d382aafbSBarry Smith 
364*d382aafbSBarry Smith     Not Collective
365*d382aafbSBarry Smith 
366*d382aafbSBarry Smith     Synopsis:
367*d382aafbSBarry Smith     PetscTruth PetscUnlikely(PetscTruth cond)
368*d382aafbSBarry Smith 
369*d382aafbSBarry Smith     Input Parameters:
370*d382aafbSBarry Smith .   cond - condition or expression
371*d382aafbSBarry Smith 
372*d382aafbSBarry Smith     Note: This returns the same truth value, it is only a hint to compilers that the resulting
373*d382aafbSBarry Smith     branch is unlikely.
374*d382aafbSBarry Smith 
375*d382aafbSBarry Smith     Level: advanced
376*d382aafbSBarry Smith 
377*d382aafbSBarry Smith .seealso: PetscLikely(), CHKERRQ
378*d382aafbSBarry Smith M*/
379*d382aafbSBarry Smith 
380*d382aafbSBarry Smith /*MC
381*d382aafbSBarry Smith     PetscLikely - hints the compiler that the given condition is usually TRUE
382*d382aafbSBarry Smith 
383*d382aafbSBarry Smith     Not Collective
384*d382aafbSBarry Smith 
385*d382aafbSBarry Smith     Synopsis:
386*d382aafbSBarry Smith     PetscTruth PetscUnlikely(PetscTruth cond)
387*d382aafbSBarry Smith 
388*d382aafbSBarry Smith     Input Parameters:
389*d382aafbSBarry Smith .   cond - condition or expression
390*d382aafbSBarry Smith 
391*d382aafbSBarry Smith     Note: This returns the same truth value, it is only a hint to compilers that the resulting
392*d382aafbSBarry Smith     branch is likely.
393*d382aafbSBarry Smith 
394*d382aafbSBarry Smith     Level: advanced
395*d382aafbSBarry Smith 
396*d382aafbSBarry Smith .seealso: PetscUnlikely()
397*d382aafbSBarry Smith M*/
398*d382aafbSBarry Smith #if defined(PETSC_HAVE_BUILTIN_EXPECT)
399*d382aafbSBarry Smith #  define PetscUnlikely(cond)   __builtin_expect(!!(cond),0)
400*d382aafbSBarry Smith #  define PetscLikely(cond)     __builtin_expect(!!(cond),1)
401*d382aafbSBarry Smith #else
402*d382aafbSBarry Smith #  define PetscUnlikely(cond)   cond
403*d382aafbSBarry Smith #  define PetscLikely(cond)     cond
404*d382aafbSBarry Smith #endif
405*d382aafbSBarry Smith 
406*d382aafbSBarry Smith /*
407*d382aafbSBarry Smith     Extern indicates a PETSc function defined elsewhere
408*d382aafbSBarry Smith */
409*d382aafbSBarry Smith #if !defined(EXTERN)
410*d382aafbSBarry Smith #define EXTERN extern
411*d382aafbSBarry Smith #endif
412*d382aafbSBarry Smith 
413*d382aafbSBarry Smith /*
414*d382aafbSBarry Smith     Defines some elementary mathematics functions and constants.
415*d382aafbSBarry Smith */
416*d382aafbSBarry Smith #include "petscmath.h"
417*d382aafbSBarry Smith 
418*d382aafbSBarry Smith /*
419*d382aafbSBarry Smith     Declare extern C stuff after including external header files
420*d382aafbSBarry Smith */
421*d382aafbSBarry Smith 
422*d382aafbSBarry Smith PETSC_EXTERN_CXX_BEGIN
423*d382aafbSBarry Smith 
424*d382aafbSBarry Smith /*
425*d382aafbSBarry Smith        Basic PETSc constants
426*d382aafbSBarry Smith */
427*d382aafbSBarry Smith 
428*d382aafbSBarry Smith /*E
429*d382aafbSBarry Smith     PetscTruth - Logical variable. Actually an integer
430*d382aafbSBarry Smith 
431*d382aafbSBarry Smith    Level: beginner
432*d382aafbSBarry Smith 
433*d382aafbSBarry Smith E*/
434*d382aafbSBarry Smith typedef enum { PETSC_FALSE,PETSC_TRUE } PetscTruth;
435*d382aafbSBarry Smith extern const char *PetscTruths[];
436*d382aafbSBarry Smith 
437*d382aafbSBarry Smith /*MC
438*d382aafbSBarry Smith     PETSC_FALSE - False value of PetscTruth
439*d382aafbSBarry Smith 
440*d382aafbSBarry Smith     Level: beginner
441*d382aafbSBarry Smith 
442*d382aafbSBarry Smith     Note: Zero integer
443*d382aafbSBarry Smith 
444*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_TRUE
445*d382aafbSBarry Smith M*/
446*d382aafbSBarry Smith 
447*d382aafbSBarry Smith /*MC
448*d382aafbSBarry Smith     PETSC_TRUE - True value of PetscTruth
449*d382aafbSBarry Smith 
450*d382aafbSBarry Smith     Level: beginner
451*d382aafbSBarry Smith 
452*d382aafbSBarry Smith     Note: Nonzero integer
453*d382aafbSBarry Smith 
454*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_FALSE
455*d382aafbSBarry Smith M*/
456*d382aafbSBarry Smith 
457*d382aafbSBarry Smith /*MC
458*d382aafbSBarry Smith     PETSC_YES - Alias for PETSC_TRUE
459*d382aafbSBarry Smith 
460*d382aafbSBarry Smith     Level: beginner
461*d382aafbSBarry Smith 
462*d382aafbSBarry Smith     Note: Zero integer
463*d382aafbSBarry Smith 
464*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_TRUE, PETSC_FALSE, PETSC_NO
465*d382aafbSBarry Smith M*/
466*d382aafbSBarry Smith #define PETSC_YES            PETSC_TRUE
467*d382aafbSBarry Smith 
468*d382aafbSBarry Smith /*MC
469*d382aafbSBarry Smith     PETSC_NO - Alias for PETSC_FALSE
470*d382aafbSBarry Smith 
471*d382aafbSBarry Smith     Level: beginner
472*d382aafbSBarry Smith 
473*d382aafbSBarry Smith     Note: Nonzero integer
474*d382aafbSBarry Smith 
475*d382aafbSBarry Smith .seealso: PetscTruth, PETSC_TRUE, PETSC_FALSE, PETSC_YES
476*d382aafbSBarry Smith M*/
477*d382aafbSBarry Smith #define PETSC_NO             PETSC_FALSE
478*d382aafbSBarry Smith 
479*d382aafbSBarry Smith /*MC
480*d382aafbSBarry Smith     PETSC_NULL - standard way of passing in a null or array or pointer
481*d382aafbSBarry Smith 
482*d382aafbSBarry Smith    Level: beginner
483*d382aafbSBarry Smith 
484*d382aafbSBarry Smith    Notes: accepted by many PETSc functions to not set a parameter and instead use
485*d382aafbSBarry Smith           some default
486*d382aafbSBarry Smith 
487*d382aafbSBarry Smith           This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER,
488*d382aafbSBarry Smith           PETSC_NULL_DOUBLE_PRECISION etc
489*d382aafbSBarry Smith 
490*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE
491*d382aafbSBarry Smith 
492*d382aafbSBarry Smith M*/
493*d382aafbSBarry Smith #define PETSC_NULL           0
494*d382aafbSBarry Smith 
495*d382aafbSBarry Smith /*MC
496*d382aafbSBarry Smith     PETSC_DECIDE - standard way of passing in integer or floating point parameter
497*d382aafbSBarry Smith        where you wish PETSc to use the default.
498*d382aafbSBarry Smith 
499*d382aafbSBarry Smith    Level: beginner
500*d382aafbSBarry Smith 
501*d382aafbSBarry Smith .seealso: PETSC_NULL, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE
502*d382aafbSBarry Smith 
503*d382aafbSBarry Smith M*/
504*d382aafbSBarry Smith #define PETSC_DECIDE         -1
505*d382aafbSBarry Smith 
506*d382aafbSBarry Smith /*MC
507*d382aafbSBarry Smith     PETSC_DEFAULT - standard way of passing in integer or floating point parameter
508*d382aafbSBarry Smith        where you wish PETSc to use the default.
509*d382aafbSBarry Smith 
510*d382aafbSBarry Smith    Level: beginner
511*d382aafbSBarry Smith 
512*d382aafbSBarry Smith    Fortran Notes: You need to use PETSC_DEFAULT_INTEGER or PETSC_DEFAULT_DOUBLE_PRECISION.
513*d382aafbSBarry Smith 
514*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_NULL, PETSC_IGNORE, PETSC_DETERMINE
515*d382aafbSBarry Smith 
516*d382aafbSBarry Smith M*/
517*d382aafbSBarry Smith #define PETSC_DEFAULT        -2
518*d382aafbSBarry Smith 
519*d382aafbSBarry Smith 
520*d382aafbSBarry Smith /*MC
521*d382aafbSBarry Smith     PETSC_IGNORE - same as PETSC_NULL, means PETSc will ignore this argument
522*d382aafbSBarry Smith 
523*d382aafbSBarry Smith    Level: beginner
524*d382aafbSBarry Smith 
525*d382aafbSBarry Smith    Note: accepted by many PETSc functions to not set a parameter and instead use
526*d382aafbSBarry Smith           some default
527*d382aafbSBarry Smith 
528*d382aafbSBarry Smith    Fortran Notes: This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER,
529*d382aafbSBarry Smith           PETSC_NULL_DOUBLE_PRECISION etc
530*d382aafbSBarry Smith 
531*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_NULL, PETSC_DETERMINE
532*d382aafbSBarry Smith 
533*d382aafbSBarry Smith M*/
534*d382aafbSBarry Smith #define PETSC_IGNORE         PETSC_NULL
535*d382aafbSBarry Smith 
536*d382aafbSBarry Smith /*MC
537*d382aafbSBarry Smith     PETSC_DETERMINE - standard way of passing in integer or floating point parameter
538*d382aafbSBarry Smith        where you wish PETSc to compute the required value.
539*d382aafbSBarry Smith 
540*d382aafbSBarry Smith    Level: beginner
541*d382aafbSBarry Smith 
542*d382aafbSBarry Smith .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_NULL, VecSetSizes()
543*d382aafbSBarry Smith 
544*d382aafbSBarry Smith M*/
545*d382aafbSBarry Smith #define PETSC_DETERMINE      PETSC_DECIDE
546*d382aafbSBarry Smith 
547*d382aafbSBarry Smith /*MC
548*d382aafbSBarry Smith     PETSC_COMM_WORLD - the equivalent of the MPI_COMM_WORLD communicator which represents
549*d382aafbSBarry Smith            all the processs that PETSc knows about.
550*d382aafbSBarry Smith 
551*d382aafbSBarry Smith    Level: beginner
552*d382aafbSBarry Smith 
553*d382aafbSBarry Smith    Notes: By default PETSC_COMM_WORLD and MPI_COMM_WORLD are identical unless you wish to
554*d382aafbSBarry Smith           run PETSc on ONLY a subset of MPI_COMM_WORLD. In that case create your new (smaller)
555*d382aafbSBarry Smith           communicator, call it, say comm, and set PETSC_COMM_WORLD = comm BEFORE calling
556*d382aafbSBarry Smith           PetscInitialize()
557*d382aafbSBarry Smith 
558*d382aafbSBarry Smith .seealso: PETSC_COMM_SELF
559*d382aafbSBarry Smith 
560*d382aafbSBarry Smith M*/
561*d382aafbSBarry Smith extern MPI_Comm PETSC_COMM_WORLD;
562*d382aafbSBarry Smith 
563*d382aafbSBarry Smith /*MC
564*d382aafbSBarry Smith     PETSC_COMM_SELF - a duplicate of the MPI_COMM_SELF communicator which represents
565*d382aafbSBarry Smith            the current process
566*d382aafbSBarry Smith 
567*d382aafbSBarry Smith    Level: beginner
568*d382aafbSBarry Smith 
569*d382aafbSBarry Smith    Notes: PETSC_COMM_SELF and MPI_COMM_SELF are equivalent.
570*d382aafbSBarry Smith 
571*d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD
572*d382aafbSBarry Smith 
573*d382aafbSBarry Smith M*/
574*d382aafbSBarry Smith #define PETSC_COMM_SELF MPI_COMM_SELF
575*d382aafbSBarry Smith 
576*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscTruth PetscInitializeCalled;
577*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscTruth PetscFinalizeCalled;
578*d382aafbSBarry Smith 
579*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetHelpVersionFunctions(PetscErrorCode (*)(MPI_Comm),PetscErrorCode (*)(MPI_Comm));
580*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*);
581*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCommDestroy(MPI_Comm*);
582*d382aafbSBarry Smith 
583*d382aafbSBarry Smith /*MC
584*d382aafbSBarry Smith    PetscMalloc - Allocates memory
585*d382aafbSBarry Smith 
586*d382aafbSBarry Smith    Input Parameter:
587*d382aafbSBarry Smith .  m - number of bytes to allocate
588*d382aafbSBarry Smith 
589*d382aafbSBarry Smith    Output Parameter:
590*d382aafbSBarry Smith .  result - memory allocated
591*d382aafbSBarry Smith 
592*d382aafbSBarry Smith    Synopsis:
593*d382aafbSBarry Smith    PetscErrorCode PetscMalloc(size_t m,void **result)
594*d382aafbSBarry Smith 
595*d382aafbSBarry Smith    Level: beginner
596*d382aafbSBarry Smith 
597*d382aafbSBarry Smith    Notes: Memory is always allocated at least double aligned
598*d382aafbSBarry Smith 
599*d382aafbSBarry Smith           If you request memory of zero size it will allocate no space and assign the pointer to 0; PetscFree() will
600*d382aafbSBarry Smith           properly handle not freeing the null pointer.
601*d382aafbSBarry Smith 
602*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew()
603*d382aafbSBarry Smith 
604*d382aafbSBarry Smith   Concepts: memory allocation
605*d382aafbSBarry Smith 
606*d382aafbSBarry Smith M*/
607*d382aafbSBarry Smith #define PetscMalloc(a,b)  ((a != 0) ? (*PetscTrMalloc)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__,(void**)(b)) : (*(b) = 0,0) )
608*d382aafbSBarry Smith 
609*d382aafbSBarry Smith /*MC
610*d382aafbSBarry Smith    PetscAddrAlign - Returns an address with PETSC_MEMALIGN alignment
611*d382aafbSBarry Smith 
612*d382aafbSBarry Smith    Input Parameters:
613*d382aafbSBarry Smith .  addr - address to align (any pointer type)
614*d382aafbSBarry Smith 
615*d382aafbSBarry Smith    Synopsis:
616*d382aafbSBarry Smith    void *PetscAddrAlign(void *addr)
617*d382aafbSBarry Smith 
618*d382aafbSBarry Smith    Level: developer
619*d382aafbSBarry Smith 
620*d382aafbSBarry Smith .seealso: PetscMallocAlign()
621*d382aafbSBarry Smith 
622*d382aafbSBarry Smith   Concepts: memory allocation
623*d382aafbSBarry Smith M*/
624*d382aafbSBarry Smith #if defined PETSC_UINTPTR_T
625*d382aafbSBarry Smith #  define PetscAddrAlign(a) (void*)((((PETSC_UINTPTR_T)(a))+(PETSC_MEMALIGN-1)) & ~(PETSC_MEMALIGN-1))
626*d382aafbSBarry Smith #else
627*d382aafbSBarry Smith #  define PetscAddrAlign(a) (void*)(a)
628*d382aafbSBarry Smith #endif
629*d382aafbSBarry Smith 
630*d382aafbSBarry Smith /*MC
631*d382aafbSBarry Smith    PetscMalloc2 - Allocates 2 chunks of  memory
632*d382aafbSBarry Smith 
633*d382aafbSBarry Smith    Input Parameter:
634*d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
635*d382aafbSBarry Smith .  t1 - type of first memory elements
636*d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
637*d382aafbSBarry Smith -  t2 - type of second memory elements
638*d382aafbSBarry Smith 
639*d382aafbSBarry Smith    Output Parameter:
640*d382aafbSBarry Smith +  r1 - memory allocated in first chunk
641*d382aafbSBarry Smith -  r2 - memory allocated in second chunk
642*d382aafbSBarry Smith 
643*d382aafbSBarry Smith    Synopsis:
644*d382aafbSBarry Smith    PetscErrorCode PetscMalloc2(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2)
645*d382aafbSBarry Smith 
646*d382aafbSBarry Smith    Level: developer
647*d382aafbSBarry Smith 
648*d382aafbSBarry Smith    Notes: Memory of first chunk is always allocated at least double aligned
649*d382aafbSBarry Smith 
650*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc()
651*d382aafbSBarry Smith 
652*d382aafbSBarry Smith   Concepts: memory allocation
653*d382aafbSBarry Smith 
654*d382aafbSBarry Smith M*/
655*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
656*d382aafbSBarry Smith #define PetscMalloc2(m1,t1,r1,m2,t2,r2) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2))
657*d382aafbSBarry Smith #else
658*d382aafbSBarry Smith #define PetscMalloc2(m1,t1,r1,m2,t2,r2) (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(PETSC_MEMALIGN-1),r1) \
659*d382aafbSBarry Smith                                          || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),0))
660*d382aafbSBarry Smith #endif
661*d382aafbSBarry Smith 
662*d382aafbSBarry Smith /*MC
663*d382aafbSBarry Smith    PetscMalloc3 - Allocates 3 chunks of  memory
664*d382aafbSBarry Smith 
665*d382aafbSBarry Smith    Input Parameter:
666*d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
667*d382aafbSBarry Smith .  t1 - type of first memory elements
668*d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
669*d382aafbSBarry Smith .  t2 - type of second memory elements
670*d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
671*d382aafbSBarry Smith -  t3 - type of third memory elements
672*d382aafbSBarry Smith 
673*d382aafbSBarry Smith    Output Parameter:
674*d382aafbSBarry Smith +  r1 - memory allocated in first chunk
675*d382aafbSBarry Smith .  r2 - memory allocated in second chunk
676*d382aafbSBarry Smith -  r3 - memory allocated in third chunk
677*d382aafbSBarry Smith 
678*d382aafbSBarry Smith    Synopsis:
679*d382aafbSBarry Smith    PetscErrorCode PetscMalloc3(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3)
680*d382aafbSBarry Smith 
681*d382aafbSBarry Smith    Level: developer
682*d382aafbSBarry Smith 
683*d382aafbSBarry Smith    Notes: Memory of first chunk is always allocated at least double aligned
684*d382aafbSBarry Smith 
685*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3()
686*d382aafbSBarry Smith 
687*d382aafbSBarry Smith   Concepts: memory allocation
688*d382aafbSBarry Smith 
689*d382aafbSBarry Smith M*/
690*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
691*d382aafbSBarry Smith #define PetscMalloc3(m1,t1,r1,m2,t2,r2,m3,t3,r3) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3))
692*d382aafbSBarry Smith #else
693*d382aafbSBarry Smith #define PetscMalloc3(m1,t1,r1,m2,t2,r2,m3,t3,r3) (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+2*(PETSC_MEMALIGN-1),r1) \
694*d382aafbSBarry Smith                                                   || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),0))
695*d382aafbSBarry Smith #endif
696*d382aafbSBarry Smith 
697*d382aafbSBarry Smith /*MC
698*d382aafbSBarry Smith    PetscMalloc4 - Allocates 4 chunks of  memory
699*d382aafbSBarry Smith 
700*d382aafbSBarry Smith    Input Parameter:
701*d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
702*d382aafbSBarry Smith .  t1 - type of first memory elements
703*d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
704*d382aafbSBarry Smith .  t2 - type of second memory elements
705*d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
706*d382aafbSBarry Smith .  t3 - type of third memory elements
707*d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
708*d382aafbSBarry Smith -  t4 - type of fourth memory elements
709*d382aafbSBarry Smith 
710*d382aafbSBarry Smith    Output Parameter:
711*d382aafbSBarry Smith +  r1 - memory allocated in first chunk
712*d382aafbSBarry Smith .  r2 - memory allocated in second chunk
713*d382aafbSBarry Smith .  r3 - memory allocated in third chunk
714*d382aafbSBarry Smith -  r4 - memory allocated in fourth chunk
715*d382aafbSBarry Smith 
716*d382aafbSBarry Smith    Synopsis:
717*d382aafbSBarry Smith    PetscErrorCode PetscMalloc4(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4)
718*d382aafbSBarry Smith 
719*d382aafbSBarry Smith    Level: developer
720*d382aafbSBarry Smith 
721*d382aafbSBarry Smith    Notes: Memory of first chunk is always allocated at least double aligned
722*d382aafbSBarry Smith 
723*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4()
724*d382aafbSBarry Smith 
725*d382aafbSBarry Smith   Concepts: memory allocation
726*d382aafbSBarry Smith 
727*d382aafbSBarry Smith M*/
728*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
729*d382aafbSBarry Smith #define PetscMalloc4(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4))
730*d382aafbSBarry Smith #else
731*d382aafbSBarry Smith #define PetscMalloc4(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4)               \
732*d382aafbSBarry Smith   (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+3*(PETSC_MEMALIGN-1),r1) \
733*d382aafbSBarry Smith    || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),0))
734*d382aafbSBarry Smith #endif
735*d382aafbSBarry Smith 
736*d382aafbSBarry Smith /*MC
737*d382aafbSBarry Smith    PetscMalloc5 - Allocates 5 chunks of  memory
738*d382aafbSBarry Smith 
739*d382aafbSBarry Smith    Input Parameter:
740*d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
741*d382aafbSBarry Smith .  t1 - type of first memory elements
742*d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
743*d382aafbSBarry Smith .  t2 - type of second memory elements
744*d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
745*d382aafbSBarry Smith .  t3 - type of third memory elements
746*d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
747*d382aafbSBarry Smith .  t4 - type of fourth memory elements
748*d382aafbSBarry Smith .  m5 - number of elements to allocate in 5th chunk  (may be zero)
749*d382aafbSBarry Smith -  t5 - type of fifth memory elements
750*d382aafbSBarry Smith 
751*d382aafbSBarry Smith    Output Parameter:
752*d382aafbSBarry Smith +  r1 - memory allocated in first chunk
753*d382aafbSBarry Smith .  r2 - memory allocated in second chunk
754*d382aafbSBarry Smith .  r3 - memory allocated in third chunk
755*d382aafbSBarry Smith .  r4 - memory allocated in fourth chunk
756*d382aafbSBarry Smith -  r5 - memory allocated in fifth chunk
757*d382aafbSBarry Smith 
758*d382aafbSBarry Smith    Synopsis:
759*d382aafbSBarry Smith    PetscErrorCode PetscMalloc5(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4,size_t m5,type t5,void **r5)
760*d382aafbSBarry Smith 
761*d382aafbSBarry Smith    Level: developer
762*d382aafbSBarry Smith 
763*d382aafbSBarry Smith    Notes: Memory of first chunk is always allocated at least double aligned
764*d382aafbSBarry Smith 
765*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4(), PetscFree5()
766*d382aafbSBarry Smith 
767*d382aafbSBarry Smith   Concepts: memory allocation
768*d382aafbSBarry Smith 
769*d382aafbSBarry Smith M*/
770*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
771*d382aafbSBarry Smith #define PetscMalloc5(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4) || PetscMalloc((m5)*sizeof(t5),r5))
772*d382aafbSBarry Smith #else
773*d382aafbSBarry Smith #define PetscMalloc5(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5)      \
774*d382aafbSBarry Smith   (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+(m5)*sizeof(t5)+4*(PETSC_MEMALIGN-1),r1) \
775*d382aafbSBarry Smith    || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),*(r5) = (t5*)PetscAddrAlign(*(r4)+m4),0))
776*d382aafbSBarry Smith #endif
777*d382aafbSBarry Smith 
778*d382aafbSBarry Smith 
779*d382aafbSBarry Smith /*MC
780*d382aafbSBarry Smith    PetscMalloc6 - Allocates 6 chunks of  memory
781*d382aafbSBarry Smith 
782*d382aafbSBarry Smith    Input Parameter:
783*d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
784*d382aafbSBarry Smith .  t1 - type of first memory elements
785*d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
786*d382aafbSBarry Smith .  t2 - type of second memory elements
787*d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
788*d382aafbSBarry Smith .  t3 - type of third memory elements
789*d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
790*d382aafbSBarry Smith .  t4 - type of fourth memory elements
791*d382aafbSBarry Smith .  m5 - number of elements to allocate in 5th chunk  (may be zero)
792*d382aafbSBarry Smith .  t5 - type of fifth memory elements
793*d382aafbSBarry Smith .  m6 - number of elements to allocate in 6th chunk  (may be zero)
794*d382aafbSBarry Smith -  t6 - type of sixth memory elements
795*d382aafbSBarry Smith 
796*d382aafbSBarry Smith    Output Parameter:
797*d382aafbSBarry Smith +  r1 - memory allocated in first chunk
798*d382aafbSBarry Smith .  r2 - memory allocated in second chunk
799*d382aafbSBarry Smith .  r3 - memory allocated in third chunk
800*d382aafbSBarry Smith .  r4 - memory allocated in fourth chunk
801*d382aafbSBarry Smith .  r5 - memory allocated in fifth chunk
802*d382aafbSBarry Smith -  r6 - memory allocated in sixth chunk
803*d382aafbSBarry Smith 
804*d382aafbSBarry Smith    Synopsis:
805*d382aafbSBarry Smith    PetscErrorCode PetscMalloc6(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4,size_t m5,type t5,void **r5,size_t m6,type t6,void **r6)
806*d382aafbSBarry Smith 
807*d382aafbSBarry Smith    Level: developer
808*d382aafbSBarry Smith 
809*d382aafbSBarry Smith    Notes: Memory of first chunk is always allocated at least double aligned
810*d382aafbSBarry Smith 
811*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6()
812*d382aafbSBarry Smith 
813*d382aafbSBarry Smith   Concepts: memory allocation
814*d382aafbSBarry Smith 
815*d382aafbSBarry Smith M*/
816*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
817*d382aafbSBarry Smith #define PetscMalloc6(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4) || PetscMalloc((m5)*sizeof(t5),r5) || PetscMalloc((m6)*sizeof(t6),r6))
818*d382aafbSBarry Smith #else
819*d382aafbSBarry Smith #define PetscMalloc6(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6) \
820*d382aafbSBarry Smith   (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+(m5)*sizeof(t5)+(m6)*sizeof(t6)+5*(PETSC_MEMALIGN-1),r1) \
821*d382aafbSBarry Smith    || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),*(r5) = (t5*)PetscAddrAlign(*(r4)+m4),*(r6) = (t6*)PetscAddrAlign(*(r5)+m5),0))
822*d382aafbSBarry Smith #endif
823*d382aafbSBarry Smith 
824*d382aafbSBarry Smith /*MC
825*d382aafbSBarry Smith    PetscMalloc7 - Allocates 7 chunks of  memory
826*d382aafbSBarry Smith 
827*d382aafbSBarry Smith    Input Parameter:
828*d382aafbSBarry Smith +  m1 - number of elements to allocate in 1st chunk  (may be zero)
829*d382aafbSBarry Smith .  t1 - type of first memory elements
830*d382aafbSBarry Smith .  m2 - number of elements to allocate in 2nd chunk  (may be zero)
831*d382aafbSBarry Smith .  t2 - type of second memory elements
832*d382aafbSBarry Smith .  m3 - number of elements to allocate in 3rd chunk  (may be zero)
833*d382aafbSBarry Smith .  t3 - type of third memory elements
834*d382aafbSBarry Smith .  m4 - number of elements to allocate in 4th chunk  (may be zero)
835*d382aafbSBarry Smith .  t4 - type of fourth memory elements
836*d382aafbSBarry Smith .  m5 - number of elements to allocate in 5th chunk  (may be zero)
837*d382aafbSBarry Smith .  t5 - type of fifth memory elements
838*d382aafbSBarry Smith .  m6 - number of elements to allocate in 6th chunk  (may be zero)
839*d382aafbSBarry Smith .  t6 - type of sixth memory elements
840*d382aafbSBarry Smith .  m7 - number of elements to allocate in 7th chunk  (may be zero)
841*d382aafbSBarry Smith -  t7 - type of sixth memory elements
842*d382aafbSBarry Smith 
843*d382aafbSBarry Smith    Output Parameter:
844*d382aafbSBarry Smith +  r1 - memory allocated in first chunk
845*d382aafbSBarry Smith .  r2 - memory allocated in second chunk
846*d382aafbSBarry Smith .  r3 - memory allocated in third chunk
847*d382aafbSBarry Smith .  r4 - memory allocated in fourth chunk
848*d382aafbSBarry Smith .  r5 - memory allocated in fifth chunk
849*d382aafbSBarry Smith .  r6 - memory allocated in sixth chunk
850*d382aafbSBarry Smith -  r7 - memory allocated in sixth chunk
851*d382aafbSBarry Smith 
852*d382aafbSBarry Smith    Synopsis:
853*d382aafbSBarry Smith    PetscErrorCode PetscMalloc7(size_t m1,type, t1,void **r1,size_t m2,type t2,void **r2,size_t m3,type t3,void **r3,size_t m4,type t4,void **r4,size_t m5,type t5,void **r5,size_t m6,type t6,void **r6,size_t m7,type t7,void **r7)
854*d382aafbSBarry Smith 
855*d382aafbSBarry Smith    Level: developer
856*d382aafbSBarry Smith 
857*d382aafbSBarry Smith    Notes: Memory of first chunk is always allocated at least double aligned
858*d382aafbSBarry Smith 
859*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree3(), PetscFree4(), PetscFree5(), PetscFree6(), PetscFree7()
860*d382aafbSBarry Smith 
861*d382aafbSBarry Smith   Concepts: memory allocation
862*d382aafbSBarry Smith 
863*d382aafbSBarry Smith M*/
864*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
865*d382aafbSBarry Smith #define PetscMalloc7(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6,m7,t7,r7) (PetscMalloc((m1)*sizeof(t1),r1) || PetscMalloc((m2)*sizeof(t2),r2) || PetscMalloc((m3)*sizeof(t3),r3) || PetscMalloc((m4)*sizeof(t4),r4) || PetscMalloc((m5)*sizeof(t5),r5) || PetscMalloc((m6)*sizeof(t6),r6) || PetscMalloc((m7)*sizeof(t7),r7))
866*d382aafbSBarry Smith #else
867*d382aafbSBarry Smith #define PetscMalloc7(m1,t1,r1,m2,t2,r2,m3,t3,r3,m4,t4,r4,m5,t5,r5,m6,t6,r6,m7,t7,r7) \
868*d382aafbSBarry Smith   (PetscMalloc((m1)*sizeof(t1)+(m2)*sizeof(t2)+(m3)*sizeof(t3)+(m4)*sizeof(t4)+(m5)*sizeof(t5)+(m6)*sizeof(t6)+(m7)*sizeof(t7)+6*(PETSC_MEMALIGN-1),r1) \
869*d382aafbSBarry Smith    || (*(r2) = (t2*)PetscAddrAlign(*(r1)+m1),*(r3) = (t3*)PetscAddrAlign(*(r2)+m2),*(r4) = (t4*)PetscAddrAlign(*(r3)+m3),*(r5) = (t5*)PetscAddrAlign(*(r4)+m4),*(r6) = (t6*)PetscAddrAlign(*(r5)+m5),*(r7) = (t7*)PetscAddrAlign(*(r6)+m6),0))
870*d382aafbSBarry Smith #endif
871*d382aafbSBarry Smith 
872*d382aafbSBarry Smith /*MC
873*d382aafbSBarry Smith    PetscNew - Allocates memory of a particular type, zeros the memory!
874*d382aafbSBarry Smith 
875*d382aafbSBarry Smith    Input Parameter:
876*d382aafbSBarry Smith .  type - structure name of space to be allocated. Memory of size sizeof(type) is allocated
877*d382aafbSBarry Smith 
878*d382aafbSBarry Smith    Output Parameter:
879*d382aafbSBarry Smith .  result - memory allocated
880*d382aafbSBarry Smith 
881*d382aafbSBarry Smith    Synopsis:
882*d382aafbSBarry Smith    PetscErrorCode PetscNew(struct type,((type *))result)
883*d382aafbSBarry Smith 
884*d382aafbSBarry Smith    Level: beginner
885*d382aafbSBarry Smith 
886*d382aafbSBarry Smith .seealso: PetscFree(), PetscMalloc()
887*d382aafbSBarry Smith 
888*d382aafbSBarry Smith   Concepts: memory allocation
889*d382aafbSBarry Smith 
890*d382aafbSBarry Smith M*/
891*d382aafbSBarry Smith #define PetscNew(A,b)      (PetscMalloc(sizeof(A),(b)) || PetscMemzero(*(b),sizeof(A)))
892*d382aafbSBarry Smith #define PetscNewLog(o,A,b) (PetscNew(A,b) || ((o) ? PetscLogObjectMemory(o,sizeof(A)) : 0))
893*d382aafbSBarry Smith 
894*d382aafbSBarry Smith /*MC
895*d382aafbSBarry Smith    PetscFree - Frees memory
896*d382aafbSBarry Smith 
897*d382aafbSBarry Smith    Input Parameter:
898*d382aafbSBarry Smith .   memory - memory to free (the pointer is ALWAYS set to 0 upon sucess)
899*d382aafbSBarry Smith 
900*d382aafbSBarry Smith    Synopsis:
901*d382aafbSBarry Smith    PetscErrorCode PetscFree(void *memory)
902*d382aafbSBarry Smith 
903*d382aafbSBarry Smith    Level: beginner
904*d382aafbSBarry Smith 
905*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscNew() or PetscMalloc()
906*d382aafbSBarry Smith 
907*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscFreeVoid()
908*d382aafbSBarry Smith 
909*d382aafbSBarry Smith   Concepts: memory allocation
910*d382aafbSBarry Smith 
911*d382aafbSBarry Smith M*/
912*d382aafbSBarry Smith #define PetscFree(a)   ((a) ? ((*PetscTrFree)((void*)(a),__LINE__,__FUNCT__,__FILE__,__SDIR__) || ((a = 0),0)) : 0)
913*d382aafbSBarry Smith 
914*d382aafbSBarry Smith /*MC
915*d382aafbSBarry Smith    PetscFreeVoid - Frees memory
916*d382aafbSBarry Smith 
917*d382aafbSBarry Smith    Input Parameter:
918*d382aafbSBarry Smith .   memory - memory to free
919*d382aafbSBarry Smith 
920*d382aafbSBarry Smith    Synopsis:
921*d382aafbSBarry Smith    void PetscFreeVoid(void *memory)
922*d382aafbSBarry Smith 
923*d382aafbSBarry Smith    Level: beginner
924*d382aafbSBarry Smith 
925*d382aafbSBarry Smith    Notes: This is different from PetscFree() in that no error code is returned
926*d382aafbSBarry Smith 
927*d382aafbSBarry Smith .seealso: PetscFree(), PetscNew(), PetscMalloc()
928*d382aafbSBarry Smith 
929*d382aafbSBarry Smith   Concepts: memory allocation
930*d382aafbSBarry Smith 
931*d382aafbSBarry Smith M*/
932*d382aafbSBarry Smith #define PetscFreeVoid(a) ((*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__),(a) = 0)
933*d382aafbSBarry Smith 
934*d382aafbSBarry Smith 
935*d382aafbSBarry Smith /*MC
936*d382aafbSBarry Smith    PetscFree2 - Frees 2 chunks of memory obtained with PetscMalloc2()
937*d382aafbSBarry Smith 
938*d382aafbSBarry Smith    Input Parameter:
939*d382aafbSBarry Smith +   memory1 - memory to free
940*d382aafbSBarry Smith -   memory2 - 2nd memory to free
941*d382aafbSBarry Smith 
942*d382aafbSBarry Smith 
943*d382aafbSBarry Smith    Synopsis:
944*d382aafbSBarry Smith    PetscErrorCode PetscFree2(void *memory1,void *memory2)
945*d382aafbSBarry Smith 
946*d382aafbSBarry Smith    Level: developer
947*d382aafbSBarry Smith 
948*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscMalloc2()
949*d382aafbSBarry Smith 
950*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree()
951*d382aafbSBarry Smith 
952*d382aafbSBarry Smith   Concepts: memory allocation
953*d382aafbSBarry Smith 
954*d382aafbSBarry Smith M*/
955*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
956*d382aafbSBarry Smith #define PetscFree2(m1,m2)   (PetscFree(m2) || PetscFree(m1))
957*d382aafbSBarry Smith #else
958*d382aafbSBarry Smith #define PetscFree2(m1,m2)   (PetscFree(m1))
959*d382aafbSBarry Smith #endif
960*d382aafbSBarry Smith 
961*d382aafbSBarry Smith /*MC
962*d382aafbSBarry Smith    PetscFree3 - Frees 3 chunks of memory obtained with PetscMalloc3()
963*d382aafbSBarry Smith 
964*d382aafbSBarry Smith    Input Parameter:
965*d382aafbSBarry Smith +   memory1 - memory to free
966*d382aafbSBarry Smith .   memory2 - 2nd memory to free
967*d382aafbSBarry Smith -   memory3 - 3rd memory to free
968*d382aafbSBarry Smith 
969*d382aafbSBarry Smith 
970*d382aafbSBarry Smith    Synopsis:
971*d382aafbSBarry Smith    PetscErrorCode PetscFree3(void *memory1,void *memory2,void *memory3)
972*d382aafbSBarry Smith 
973*d382aafbSBarry Smith    Level: developer
974*d382aafbSBarry Smith 
975*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscMalloc3()
976*d382aafbSBarry Smith 
977*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3()
978*d382aafbSBarry Smith 
979*d382aafbSBarry Smith   Concepts: memory allocation
980*d382aafbSBarry Smith 
981*d382aafbSBarry Smith M*/
982*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
983*d382aafbSBarry Smith #define PetscFree3(m1,m2,m3)   (PetscFree(m3) || PetscFree(m2) || PetscFree(m1))
984*d382aafbSBarry Smith #else
985*d382aafbSBarry Smith #define PetscFree3(m1,m2,m3)   (PetscFree(m1))
986*d382aafbSBarry Smith #endif
987*d382aafbSBarry Smith 
988*d382aafbSBarry Smith /*MC
989*d382aafbSBarry Smith    PetscFree4 - Frees 4 chunks of memory obtained with PetscMalloc4()
990*d382aafbSBarry Smith 
991*d382aafbSBarry Smith    Input Parameter:
992*d382aafbSBarry Smith +   m1 - memory to free
993*d382aafbSBarry Smith .   m2 - 2nd memory to free
994*d382aafbSBarry Smith .   m3 - 3rd memory to free
995*d382aafbSBarry Smith -   m4 - 4th memory to free
996*d382aafbSBarry Smith 
997*d382aafbSBarry Smith 
998*d382aafbSBarry Smith    Synopsis:
999*d382aafbSBarry Smith    PetscErrorCode PetscFree4(void *m1,void *m2,void *m3,void *m4)
1000*d382aafbSBarry Smith 
1001*d382aafbSBarry Smith    Level: developer
1002*d382aafbSBarry Smith 
1003*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscMalloc4()
1004*d382aafbSBarry Smith 
1005*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4()
1006*d382aafbSBarry Smith 
1007*d382aafbSBarry Smith   Concepts: memory allocation
1008*d382aafbSBarry Smith 
1009*d382aafbSBarry Smith M*/
1010*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1011*d382aafbSBarry Smith #define PetscFree4(m1,m2,m3,m4)   (PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1))
1012*d382aafbSBarry Smith #else
1013*d382aafbSBarry Smith #define PetscFree4(m1,m2,m3,m4)   (PetscFree(m1))
1014*d382aafbSBarry Smith #endif
1015*d382aafbSBarry Smith 
1016*d382aafbSBarry Smith /*MC
1017*d382aafbSBarry Smith    PetscFree5 - Frees 5 chunks of memory obtained with PetscMalloc5()
1018*d382aafbSBarry Smith 
1019*d382aafbSBarry Smith    Input Parameter:
1020*d382aafbSBarry Smith +   m1 - memory to free
1021*d382aafbSBarry Smith .   m2 - 2nd memory to free
1022*d382aafbSBarry Smith .   m3 - 3rd memory to free
1023*d382aafbSBarry Smith .   m4 - 4th memory to free
1024*d382aafbSBarry Smith -   m5 - 5th memory to free
1025*d382aafbSBarry Smith 
1026*d382aafbSBarry Smith 
1027*d382aafbSBarry Smith    Synopsis:
1028*d382aafbSBarry Smith    PetscErrorCode PetscFree5(void *m1,void *m2,void *m3,void *m4,void *m5)
1029*d382aafbSBarry Smith 
1030*d382aafbSBarry Smith    Level: developer
1031*d382aafbSBarry Smith 
1032*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscMalloc5()
1033*d382aafbSBarry Smith 
1034*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5()
1035*d382aafbSBarry Smith 
1036*d382aafbSBarry Smith   Concepts: memory allocation
1037*d382aafbSBarry Smith 
1038*d382aafbSBarry Smith M*/
1039*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1040*d382aafbSBarry Smith #define PetscFree5(m1,m2,m3,m4,m5)   (PetscFree(m5) || PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1))
1041*d382aafbSBarry Smith #else
1042*d382aafbSBarry Smith #define PetscFree5(m1,m2,m3,m4,m5)   (PetscFree(m1))
1043*d382aafbSBarry Smith #endif
1044*d382aafbSBarry Smith 
1045*d382aafbSBarry Smith 
1046*d382aafbSBarry Smith /*MC
1047*d382aafbSBarry Smith    PetscFree6 - Frees 6 chunks of memory obtained with PetscMalloc6()
1048*d382aafbSBarry Smith 
1049*d382aafbSBarry Smith    Input Parameter:
1050*d382aafbSBarry Smith +   m1 - memory to free
1051*d382aafbSBarry Smith .   m2 - 2nd memory to free
1052*d382aafbSBarry Smith .   m3 - 3rd memory to free
1053*d382aafbSBarry Smith .   m4 - 4th memory to free
1054*d382aafbSBarry Smith .   m5 - 5th memory to free
1055*d382aafbSBarry Smith -   m6 - 6th memory to free
1056*d382aafbSBarry Smith 
1057*d382aafbSBarry Smith 
1058*d382aafbSBarry Smith    Synopsis:
1059*d382aafbSBarry Smith    PetscErrorCode PetscFree6(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6)
1060*d382aafbSBarry Smith 
1061*d382aafbSBarry Smith    Level: developer
1062*d382aafbSBarry Smith 
1063*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscMalloc6()
1064*d382aafbSBarry Smith 
1065*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6()
1066*d382aafbSBarry Smith 
1067*d382aafbSBarry Smith   Concepts: memory allocation
1068*d382aafbSBarry Smith 
1069*d382aafbSBarry Smith M*/
1070*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1071*d382aafbSBarry Smith #define PetscFree6(m1,m2,m3,m4,m5,m6)   (PetscFree(m6) || PetscFree(m5) || PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1))
1072*d382aafbSBarry Smith #else
1073*d382aafbSBarry Smith #define PetscFree6(m1,m2,m3,m4,m5,m6)   (PetscFree(m1))
1074*d382aafbSBarry Smith #endif
1075*d382aafbSBarry Smith 
1076*d382aafbSBarry Smith /*MC
1077*d382aafbSBarry Smith    PetscFree7 - Frees 7 chunks of memory obtained with PetscMalloc7()
1078*d382aafbSBarry Smith 
1079*d382aafbSBarry Smith    Input Parameter:
1080*d382aafbSBarry Smith +   m1 - memory to free
1081*d382aafbSBarry Smith .   m2 - 2nd memory to free
1082*d382aafbSBarry Smith .   m3 - 3rd memory to free
1083*d382aafbSBarry Smith .   m4 - 4th memory to free
1084*d382aafbSBarry Smith .   m5 - 5th memory to free
1085*d382aafbSBarry Smith .   m6 - 6th memory to free
1086*d382aafbSBarry Smith -   m7 - 7th memory to free
1087*d382aafbSBarry Smith 
1088*d382aafbSBarry Smith 
1089*d382aafbSBarry Smith    Synopsis:
1090*d382aafbSBarry Smith    PetscErrorCode PetscFree7(void *m1,void *m2,void *m3,void *m4,void *m5,void *m6,void *m7)
1091*d382aafbSBarry Smith 
1092*d382aafbSBarry Smith    Level: developer
1093*d382aafbSBarry Smith 
1094*d382aafbSBarry Smith    Notes: Memory must have been obtained with PetscMalloc7()
1095*d382aafbSBarry Smith 
1096*d382aafbSBarry Smith .seealso: PetscNew(), PetscMalloc(), PetscMalloc2(), PetscFree(), PetscMalloc3(), PetscMalloc4(), PetscMalloc5(), PetscMalloc6(),
1097*d382aafbSBarry Smith           PetscMalloc7()
1098*d382aafbSBarry Smith 
1099*d382aafbSBarry Smith   Concepts: memory allocation
1100*d382aafbSBarry Smith 
1101*d382aafbSBarry Smith M*/
1102*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1103*d382aafbSBarry Smith #define PetscFree7(m1,m2,m3,m4,m5,m6,m7)   (PetscFree(m7) || PetscFree(m6) || PetscFree(m5) || PetscFree(m4) || PetscFree(m3) || PetscFree(m2) || PetscFree(m1))
1104*d382aafbSBarry Smith #else
1105*d382aafbSBarry Smith #define PetscFree7(m1,m2,m3,m4,m5,m6,m7)   (PetscFree(m1))
1106*d382aafbSBarry Smith #endif
1107*d382aafbSBarry Smith 
1108*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscTrMalloc)(size_t,int,const char[],const char[],const char[],void**);
1109*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscTrFree)(void*,int,const char[],const char[],const char[]);
1110*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscMallocSet(PetscErrorCode (*)(size_t,int,const char[],const char[],const char[],void**),PetscErrorCode (*)(void*,int,const char[],const char[],const char[]));
1111*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscMallocClear(void);
1112*d382aafbSBarry Smith 
1113*d382aafbSBarry Smith /*
1114*d382aafbSBarry Smith    Routines for tracing memory corruption/bleeding with default PETSc
1115*d382aafbSBarry Smith    memory allocation
1116*d382aafbSBarry Smith */
1117*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocDump(FILE *);
1118*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocDumpLog(FILE *);
1119*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocGetCurrentUsage(PetscLogDouble *);
1120*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocGetMaximumUsage(PetscLogDouble *);
1121*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocDebug(PetscTruth);
1122*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocValidate(int,const char[],const char[],const char[]);
1123*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMallocSetDumpLog(void);
1124*d382aafbSBarry Smith 
1125*d382aafbSBarry Smith 
1126*d382aafbSBarry Smith /*
1127*d382aafbSBarry Smith     Variable type where we stash PETSc object pointers in Fortran.
1128*d382aafbSBarry Smith     On most machines size(pointer) == sizeof(long) - except windows
1129*d382aafbSBarry Smith     where its sizeof(long long)
1130*d382aafbSBarry Smith */
1131*d382aafbSBarry Smith 
1132*d382aafbSBarry Smith #if (PETSC_SIZEOF_VOID_P) == (PETSC_SIZEOF_LONG)
1133*d382aafbSBarry Smith #define PetscFortranAddr   long
1134*d382aafbSBarry Smith #elif  (PETSC_SIZEOF_VOID_P) == (PETSC_SIZEOF_LONG_LONG)
1135*d382aafbSBarry Smith #define PetscFortranAddr   long long
1136*d382aafbSBarry Smith #else
1137*d382aafbSBarry Smith #error "Unknown size for PetscFortranAddr! Send us a bugreport at petsc-maint@mcs.anl.gov"
1138*d382aafbSBarry Smith #endif
1139*d382aafbSBarry Smith 
1140*d382aafbSBarry Smith /*E
1141*d382aafbSBarry Smith     PetscDataType - Used for handling different basic data types.
1142*d382aafbSBarry Smith 
1143*d382aafbSBarry Smith    Level: beginner
1144*d382aafbSBarry Smith 
1145*d382aafbSBarry Smith    Developer comment: It would be nice if we could always just use MPI Datatypes, why can we not?
1146*d382aafbSBarry Smith 
1147*d382aafbSBarry Smith .seealso: PetscBinaryRead(), PetscBinaryWrite(), PetscDataTypeToMPIDataType(),
1148*d382aafbSBarry Smith           PetscDataTypeGetSize()
1149*d382aafbSBarry Smith 
1150*d382aafbSBarry Smith E*/
1151*d382aafbSBarry Smith typedef enum {PETSC_INT = 0,PETSC_DOUBLE = 1,PETSC_COMPLEX = 2, PETSC_LONG = 3 ,PETSC_SHORT = 4,PETSC_FLOAT = 5,
1152*d382aafbSBarry Smith               PETSC_CHAR = 6,PETSC_LOGICAL = 7,PETSC_ENUM = 8,PETSC_TRUTH=9, PETSC_LONG_DOUBLE = 10, PETSC_QD_DD = 11} PetscDataType;
1153*d382aafbSBarry Smith extern const char *PetscDataTypes[];
1154*d382aafbSBarry Smith 
1155*d382aafbSBarry Smith #if defined(PETSC_USE_COMPLEX)
1156*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_COMPLEX
1157*d382aafbSBarry Smith #else
1158*d382aafbSBarry Smith #if defined(PETSC_USE_SCALAR_SINGLE)
1159*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_FLOAT
1160*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_LONG_DOUBLE)
1161*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_LONG_DOUBLE
1162*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_INT)
1163*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_INT
1164*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_QD_DD)
1165*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_QD_DD
1166*d382aafbSBarry Smith #else
1167*d382aafbSBarry Smith #define PETSC_SCALAR PETSC_DOUBLE
1168*d382aafbSBarry Smith #endif
1169*d382aafbSBarry Smith #endif
1170*d382aafbSBarry Smith #if defined(PETSC_USE_SCALAR_SINGLE)
1171*d382aafbSBarry Smith #define PETSC_REAL PETSC_FLOAT
1172*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_LONG_DOUBLE)
1173*d382aafbSBarry Smith #define PETSC_REAL PETSC_LONG_DOUBLE
1174*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_INT)
1175*d382aafbSBarry Smith #define PETSC_REAL PETSC_INT
1176*d382aafbSBarry Smith #elif defined(PETSC_USE_SCALAR_QD_DD)
1177*d382aafbSBarry Smith #define PETSC_REAL PETSC_QD_DD
1178*d382aafbSBarry Smith #else
1179*d382aafbSBarry Smith #define PETSC_REAL PETSC_DOUBLE
1180*d382aafbSBarry Smith #endif
1181*d382aafbSBarry Smith #define PETSC_FORTRANADDR PETSC_LONG
1182*d382aafbSBarry Smith 
1183*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*);
1184*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMPIDataTypeToPetscDataType(MPI_Datatype,PetscDataType*);
1185*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDataTypeGetSize(PetscDataType,size_t*);
1186*d382aafbSBarry Smith 
1187*d382aafbSBarry Smith /*
1188*d382aafbSBarry Smith     Basic memory and string operations. These are usually simple wrappers
1189*d382aafbSBarry Smith    around the basic Unix system calls, but a few of them have additional
1190*d382aafbSBarry Smith    functionality and/or error checking.
1191*d382aafbSBarry Smith */
1192*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscBitMemcpy(void*,PetscInt,const void*,PetscInt,PetscInt,PetscDataType);
1193*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMemmove(void*,void *,size_t);
1194*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscMemcmp(const void*,const void*,size_t,PetscTruth *);
1195*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrlen(const char[],size_t*);
1196*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrcmp(const char[],const char[],PetscTruth *);
1197*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrgrt(const char[],const char[],PetscTruth *);
1198*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrcasecmp(const char[],const char[],PetscTruth*);
1199*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrncmp(const char[],const char[],size_t,PetscTruth*);
1200*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrcpy(char[],const char[]);
1201*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrcat(char[],const char[]);
1202*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrncat(char[],const char[],size_t);
1203*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrncpy(char[],const char[],size_t);
1204*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrchr(const char[],char,char *[]);
1205*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrtolower(char[]);
1206*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrrchr(const char[],char,char *[]);
1207*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrstr(const char[],const char[],char *[]);
1208*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrrstr(const char[],const char[],char *[]);
1209*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrallocpy(const char[],char *[]);
1210*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscStrreplace(MPI_Comm,const char[],char[],size_t);
1211*d382aafbSBarry Smith #define      PetscStrfree(a) ((a) ? PetscFree(a) : 0)
1212*d382aafbSBarry Smith 
1213*d382aafbSBarry Smith 
1214*d382aafbSBarry Smith /*S
1215*d382aafbSBarry Smith     PetscToken - 'Token' used for managing tokenizing strings
1216*d382aafbSBarry Smith 
1217*d382aafbSBarry Smith   Level: intermediate
1218*d382aafbSBarry Smith 
1219*d382aafbSBarry Smith .seealso: PetscTokenCreate(), PetscTokenFind(), PetscTokenDestroy()
1220*d382aafbSBarry Smith S*/
1221*d382aafbSBarry Smith typedef struct _p_PetscToken* PetscToken;
1222*d382aafbSBarry Smith 
1223*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscTokenCreate(const char[],const char,PetscToken*);
1224*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscTokenFind(PetscToken,char *[]);
1225*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT   PetscTokenDestroy(PetscToken);
1226*d382aafbSBarry Smith 
1227*d382aafbSBarry Smith /*
1228*d382aafbSBarry Smith    These are  MPI operations for MPI_Allreduce() etc
1229*d382aafbSBarry Smith */
1230*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT MPI_Op PetscMaxSum_Op;
1231*d382aafbSBarry Smith #if defined(PETSC_USE_COMPLEX) && !defined(PETSC_HAVE_MPI_C_DOUBLE_COMPLEX)
1232*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT MPI_Op MPIU_SUM;
1233*d382aafbSBarry Smith #else
1234*d382aafbSBarry Smith #define MPIU_SUM MPI_SUM
1235*d382aafbSBarry Smith #endif
1236*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMaxSum(MPI_Comm,const PetscInt[],PetscInt*,PetscInt*);
1237*d382aafbSBarry Smith 
1238*d382aafbSBarry Smith /*S
1239*d382aafbSBarry Smith      PetscObject - any PETSc object, PetscViewer, Mat, Vec, KSP etc
1240*d382aafbSBarry Smith 
1241*d382aafbSBarry Smith    Level: beginner
1242*d382aafbSBarry Smith 
1243*d382aafbSBarry Smith    Note: This is the base class from which all objects appear.
1244*d382aafbSBarry Smith 
1245*d382aafbSBarry Smith .seealso:  PetscObjectDestroy(), PetscObjectView(), PetscObjectGetName(), PetscObjectSetName()
1246*d382aafbSBarry Smith S*/
1247*d382aafbSBarry Smith typedef struct _p_PetscObject* PetscObject;
1248*d382aafbSBarry Smith 
1249*d382aafbSBarry Smith /*S
1250*d382aafbSBarry Smith      PetscFList - Linked list of functions, possibly stored in dynamic libraries, accessed
1251*d382aafbSBarry Smith       by string name
1252*d382aafbSBarry Smith 
1253*d382aafbSBarry Smith    Level: advanced
1254*d382aafbSBarry Smith 
1255*d382aafbSBarry Smith .seealso:  PetscFListAdd(), PetscFListDestroy()
1256*d382aafbSBarry Smith S*/
1257*d382aafbSBarry Smith typedef struct _n_PetscFList *PetscFList;
1258*d382aafbSBarry Smith 
1259*d382aafbSBarry Smith /*E
1260*d382aafbSBarry Smith   PetscFileMode - Access mode for a file.
1261*d382aafbSBarry Smith 
1262*d382aafbSBarry Smith   Level: beginner
1263*d382aafbSBarry Smith 
1264*d382aafbSBarry Smith   FILE_MODE_READ - open a file at its beginning for reading
1265*d382aafbSBarry Smith 
1266*d382aafbSBarry Smith   FILE_MODE_WRITE - open a file at its beginning for writing (will create if the file does not exist)
1267*d382aafbSBarry Smith 
1268*d382aafbSBarry Smith   FILE_MODE_APPEND - open a file at end for writing
1269*d382aafbSBarry Smith 
1270*d382aafbSBarry Smith   FILE_MODE_UPDATE - open a file for updating, meaning for reading and writing
1271*d382aafbSBarry Smith 
1272*d382aafbSBarry Smith   FILE_MODE_APPEND_UPDATE - open a file for updating, meaning for reading and writing, at the end
1273*d382aafbSBarry Smith 
1274*d382aafbSBarry Smith .seealso: PetscViewerFileSetMode()
1275*d382aafbSBarry Smith E*/
1276*d382aafbSBarry Smith typedef enum {FILE_MODE_READ, FILE_MODE_WRITE, FILE_MODE_APPEND, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE} PetscFileMode;
1277*d382aafbSBarry Smith 
1278*d382aafbSBarry Smith #include "petscviewer.h"
1279*d382aafbSBarry Smith #include "petscoptions.h"
1280*d382aafbSBarry Smith 
1281*d382aafbSBarry Smith #define PETSC_SMALLEST_COOKIE 1211211
1282*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscCookie PETSC_LARGEST_COOKIE;
1283*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscCookie PETSC_OBJECT_COOKIE;
1284*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCookieRegister(const char[],PetscCookie *);
1285*d382aafbSBarry Smith 
1286*d382aafbSBarry Smith /*
1287*d382aafbSBarry Smith    Routines that get memory usage information from the OS
1288*d382aafbSBarry Smith */
1289*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetCurrentUsage(PetscLogDouble *);
1290*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemoryGetMaximumUsage(PetscLogDouble *);
1291*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemorySetGetMaximumUsage(void);
1292*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMemoryShowUsage(PetscViewer,const char[]);
1293*d382aafbSBarry Smith 
1294*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoAllow(PetscTruth,const char []);
1295*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetTime(PetscLogDouble*);
1296*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetCPUTime(PetscLogDouble*);
1297*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSleep(PetscReal);
1298*d382aafbSBarry Smith 
1299*d382aafbSBarry Smith /*
1300*d382aafbSBarry Smith     Initialization of PETSc
1301*d382aafbSBarry Smith */
1302*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitialize(int*,char***,const char[],const char[]);
1303*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscInitialize,(int *argc,char ***args),(argc,args,PETSC_NULL,PETSC_NULL))
1304*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitializeNoArguments(void);
1305*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitialized(PetscTruth *);
1306*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFinalized(PetscTruth *);
1307*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFinalize(void);
1308*d382aafbSBarry Smith EXTERN PetscErrorCode PetscInitializeFortran(void);
1309*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetArgs(int*,char ***);
1310*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetArguments(char ***);
1311*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFreeArguments(char **);
1312*d382aafbSBarry Smith 
1313*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscEnd(void);
1314*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInitializePackage(const char[]);
1315*d382aafbSBarry Smith 
1316*d382aafbSBarry Smith extern MPI_Comm PETSC_COMM_LOCAL_WORLD;
1317*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPMerge(PetscMPIInt,PetscErrorCode (*)(void*),void*);
1318*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPSpawn(PetscMPIInt);
1319*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPFinalize(void);
1320*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPRun(MPI_Comm,PetscErrorCode (*)(MPI_Comm,void *),void*);
1321*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPRunCtx(MPI_Comm,PetscErrorCode (*)(MPI_Comm,void*,void *),void*);
1322*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPFree(MPI_Comm,void*);
1323*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenMPMalloc(MPI_Comm,size_t,void**);
1324*d382aafbSBarry Smith 
1325*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPythonInitialize(const char[],const char[]);
1326*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPythonFinalize(void);
1327*d382aafbSBarry Smith 
1328*d382aafbSBarry Smith /*
1329*d382aafbSBarry Smith      These are so that in extern C code we can caste function pointers to non-extern C
1330*d382aafbSBarry Smith    function pointers. Since the regular C++ code expects its function pointers to be
1331*d382aafbSBarry Smith    C++.
1332*d382aafbSBarry Smith */
1333*d382aafbSBarry Smith typedef void (**PetscVoidStarFunction)(void);
1334*d382aafbSBarry Smith typedef void (*PetscVoidFunction)(void);
1335*d382aafbSBarry Smith typedef PetscErrorCode (*PetscErrorCodeFunction)(void);
1336*d382aafbSBarry Smith 
1337*d382aafbSBarry Smith /*
1338*d382aafbSBarry Smith    PetscTryMethod - Queries an object for a method, if it exists then calls it.
1339*d382aafbSBarry Smith               These are intended to be used only inside PETSc functions.
1340*d382aafbSBarry Smith */
1341*d382aafbSBarry Smith #define  PetscTryMethod(obj,A,B,C) \
1342*d382aafbSBarry Smith   0;{ PetscErrorCode (*f)B, __ierr; \
1343*d382aafbSBarry Smith     __ierr = PetscObjectQueryFunction((PetscObject)obj,A,(PetscVoidStarFunction)&f);CHKERRQ(__ierr); \
1344*d382aafbSBarry Smith     if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\
1345*d382aafbSBarry Smith   }
1346*d382aafbSBarry Smith #define  PetscUseMethod(obj,A,B,C) \
1347*d382aafbSBarry Smith   0;{ PetscErrorCode (*f)B, __ierr; \
1348*d382aafbSBarry Smith     __ierr = PetscObjectQueryFunction((PetscObject)obj,A,(PetscVoidStarFunction)&f);CHKERRQ(__ierr); \
1349*d382aafbSBarry Smith     if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\
1350*d382aafbSBarry Smith     else {SETERRQ1(PETSC_ERR_SUP,"Cannot locate function %s in object",A);} \
1351*d382aafbSBarry Smith   }
1352*d382aafbSBarry Smith /*
1353*d382aafbSBarry Smith     Functions that can act on any PETSc object.
1354*d382aafbSBarry Smith */
1355*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm,PetscObject*);
1356*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectCreateGeneric(MPI_Comm, PetscCookie, const char [], PetscObject *);
1357*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject);
1358*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectExists(PetscObject,PetscTruth*);
1359*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetComm(PetscObject,MPI_Comm *);
1360*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetCookie(PetscObject,PetscCookie *);
1361*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetType(PetscObject,const char []);
1362*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetType(PetscObject,const char *[]);
1363*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetName(PetscObject,const char[]);
1364*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetName(PetscObject,const char*[]);
1365*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetTabLevel(PetscObject,PetscInt);
1366*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetTabLevel(PetscObject,PetscInt*);
1367*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectIncrementTabLevel(PetscObject,PetscObject,PetscInt);
1368*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectReference(PetscObject);
1369*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetReference(PetscObject,PetscInt*);
1370*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectDereference(PetscObject);
1371*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetNewTag(PetscObject,PetscMPIInt *);
1372*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject,PetscViewer);
1373*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectCompose(PetscObject,const char[],PetscObject);
1374*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectQuery(PetscObject,const char[],PetscObject *);
1375*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectComposeFunction(PetscObject,const char[],const char[],void (*)(void));
1376*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetFromOptions(PetscObject);
1377*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetUp(PetscObject);
1378*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscCommGetNewTag(MPI_Comm,PetscMPIInt *);
1379*d382aafbSBarry Smith 
1380*d382aafbSBarry Smith /*MC
1381*d382aafbSBarry Smith    PetscObjectComposeFunctionDynamic - Associates a function with a given PETSc object.
1382*d382aafbSBarry Smith 
1383*d382aafbSBarry Smith    Collective on PetscObject
1384*d382aafbSBarry Smith 
1385*d382aafbSBarry Smith    Input Parameters:
1386*d382aafbSBarry Smith +  obj - the PETSc object; this must be cast with a (PetscObject), for example,
1387*d382aafbSBarry Smith          PetscObjectCompose((PetscObject)mat,...);
1388*d382aafbSBarry Smith .  name - name associated with the child function
1389*d382aafbSBarry Smith .  fname - name of the function
1390*d382aafbSBarry Smith -  ptr - function pointer (or PETSC_NULL if using dynamic libraries)
1391*d382aafbSBarry Smith 
1392*d382aafbSBarry Smith    Level: advanced
1393*d382aafbSBarry Smith 
1394*d382aafbSBarry Smith     Synopsis:
1395*d382aafbSBarry Smith     PetscErrorCode PetscObjectComposeFunctionDynamic(PetscObject obj,const char name[],const char fname[],void *ptr)
1396*d382aafbSBarry Smith 
1397*d382aafbSBarry Smith    Notes:
1398*d382aafbSBarry Smith    To remove a registered routine, pass in a PETSC_NULL rname and fnc().
1399*d382aafbSBarry Smith 
1400*d382aafbSBarry Smith    PetscObjectComposeFunctionDynamic() can be used with any PETSc object (such as
1401*d382aafbSBarry Smith    Mat, Vec, KSP, SNES, etc.) or any user-provided object.
1402*d382aafbSBarry Smith 
1403*d382aafbSBarry Smith    The composed function must be wrapped in a EXTERN_C_BEGIN/END for this to
1404*d382aafbSBarry Smith    work in C++/complex with dynamic link libraries (config/configure.py options --with-shared --with-dynamic)
1405*d382aafbSBarry Smith    enabled.
1406*d382aafbSBarry Smith 
1407*d382aafbSBarry Smith    Concepts: objects^composing functions
1408*d382aafbSBarry Smith    Concepts: composing functions
1409*d382aafbSBarry Smith    Concepts: functions^querying
1410*d382aafbSBarry Smith    Concepts: objects^querying
1411*d382aafbSBarry Smith    Concepts: querying objects
1412*d382aafbSBarry Smith 
1413*d382aafbSBarry Smith .seealso: PetscObjectQueryFunction()
1414*d382aafbSBarry Smith M*/
1415*d382aafbSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1416*d382aafbSBarry Smith #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,0)
1417*d382aafbSBarry Smith #else
1418*d382aafbSBarry Smith #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,(PetscVoidFunction)(d))
1419*d382aafbSBarry Smith #endif
1420*d382aafbSBarry Smith 
1421*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectQueryFunction(PetscObject,const char[],void (**)(void));
1422*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectSetOptionsPrefix(PetscObject,const char[]);
1423*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectAppendOptionsPrefix(PetscObject,const char[]);
1424*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectPrependOptionsPrefix(PetscObject,const char[]);
1425*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectGetOptionsPrefix(PetscObject,const char*[]);
1426*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectPublish(PetscObject);
1427*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectChangeTypeName(PetscObject,const char[]);
1428*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject);
1429*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void);
1430*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscObjectName(PetscObject);
1431*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject,const char[],PetscTruth*);
1432*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRegisterFinalize(PetscErrorCode (*)(void));
1433*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRegisterFinalizeAll(void);
1434*d382aafbSBarry Smith 
1435*d382aafbSBarry Smith /*
1436*d382aafbSBarry Smith     Defines PETSc error handling.
1437*d382aafbSBarry Smith */
1438*d382aafbSBarry Smith #include "petscerror.h"
1439*d382aafbSBarry Smith 
1440*d382aafbSBarry Smith /*S
1441*d382aafbSBarry Smith      PetscOList - Linked list of PETSc objects, accessable by string name
1442*d382aafbSBarry Smith 
1443*d382aafbSBarry Smith    Level: advanced
1444*d382aafbSBarry Smith 
1445*d382aafbSBarry Smith .seealso:  PetscOListAdd(), PetscOListDestroy(), PetscOListFind()
1446*d382aafbSBarry Smith S*/
1447*d382aafbSBarry Smith typedef struct _n_PetscOList *PetscOList;
1448*d382aafbSBarry Smith 
1449*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListDestroy(PetscOList);
1450*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListFind(PetscOList,const char[],PetscObject*);
1451*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListReverseFind(PetscOList,PetscObject,char**);
1452*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListAdd(PetscOList *,const char[],PetscObject);
1453*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOListDuplicate(PetscOList,PetscOList *);
1454*d382aafbSBarry Smith 
1455*d382aafbSBarry Smith /*
1456*d382aafbSBarry Smith     Dynamic library lists. Lists of names of routines in dynamic
1457*d382aafbSBarry Smith   link libraries that will be loaded as needed.
1458*d382aafbSBarry Smith */
1459*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListAdd(PetscFList*,const char[],const char[],void (*)(void));
1460*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListDestroy(PetscFList*);
1461*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListFind(PetscFList,MPI_Comm,const char[],void (**)(void));
1462*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFList,const char[]);
1463*d382aafbSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
1464*d382aafbSBarry Smith #define    PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,0)
1465*d382aafbSBarry Smith #else
1466*d382aafbSBarry Smith #define    PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,(void (*)(void))c)
1467*d382aafbSBarry Smith #endif
1468*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListDuplicate(PetscFList,PetscFList *);
1469*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListView(PetscFList,PetscViewer);
1470*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListConcat(const char [],const char [],char []);
1471*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFListGet(PetscFList,char ***,int*);
1472*d382aafbSBarry Smith 
1473*d382aafbSBarry Smith /*S
1474*d382aafbSBarry Smith      PetscDLLibrary - Linked list of dynamics libraries to search for functions
1475*d382aafbSBarry Smith 
1476*d382aafbSBarry Smith    Level: advanced
1477*d382aafbSBarry Smith 
1478*d382aafbSBarry Smith    --with-shared --with-dynamic must be used with config/configure.py to use dynamic libraries
1479*d382aafbSBarry Smith 
1480*d382aafbSBarry Smith .seealso:  PetscDLLibraryOpen()
1481*d382aafbSBarry Smith S*/
1482*d382aafbSBarry Smith typedef struct _n_PetscDLLibrary *PetscDLLibrary;
1483*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscDLLibrary DLLibrariesLoaded;
1484*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryAppend(MPI_Comm,PetscDLLibrary *,const char[]);
1485*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryPrepend(MPI_Comm,PetscDLLibrary *,const char[]);
1486*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibrarySym(MPI_Comm,PetscDLLibrary *,const char[],const char[],void **);
1487*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryPrintPath(PetscDLLibrary);
1488*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,size_t,PetscTruth *);
1489*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryOpen(MPI_Comm,const char[],PetscDLLibrary *);
1490*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryClose(PetscDLLibrary);
1491*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscDLLibraryCCAAppend(MPI_Comm,PetscDLLibrary *,const char[]);
1492*d382aafbSBarry Smith 
1493*d382aafbSBarry Smith /*
1494*d382aafbSBarry Smith      Useful utility routines
1495*d382aafbSBarry Smith */
1496*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSplitOwnership(MPI_Comm,PetscInt*,PetscInt*);
1497*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSplitOwnershipBlock(MPI_Comm,PetscInt,PetscInt*,PetscInt*);
1498*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSequentialPhaseBegin(MPI_Comm,PetscMPIInt);
1499*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseBegin,(MPI_Comm comm),(comm,1))
1500*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseBegin,(void),(PETSC_COMM_WORLD,1))
1501*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSequentialPhaseEnd(MPI_Comm,PetscMPIInt);
1502*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseEnd,(MPI_Comm comm),(comm,1))
1503*d382aafbSBarry Smith PetscPolymorphicSubroutine(PetscSequentialPhaseEnd,(void),(PETSC_COMM_WORLD,1))
1504*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBarrier(PetscObject);
1505*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscMPIDump(FILE*);
1506*d382aafbSBarry Smith 
1507*d382aafbSBarry Smith #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
1508*d382aafbSBarry Smith /*
1509*d382aafbSBarry Smith     Defines basic graphics available from PETSc.
1510*d382aafbSBarry Smith */
1511*d382aafbSBarry Smith #include "petscdraw.h"
1512*d382aafbSBarry Smith 
1513*d382aafbSBarry Smith /*
1514*d382aafbSBarry Smith     Defines the base data structures for all PETSc objects
1515*d382aafbSBarry Smith */
1516*d382aafbSBarry Smith #include "private/petscimpl.h"
1517*d382aafbSBarry Smith /*
1518*d382aafbSBarry Smith      Defines PETSc profiling.
1519*d382aafbSBarry Smith */
1520*d382aafbSBarry Smith #include "petsclog.h"
1521*d382aafbSBarry Smith 
1522*d382aafbSBarry Smith /*
1523*d382aafbSBarry Smith           For locking, unlocking and destroying AMS memories associated with
1524*d382aafbSBarry Smith     PETSc objects. Not currently used.
1525*d382aafbSBarry Smith */
1526*d382aafbSBarry Smith #define PetscPublishAll(v)           0
1527*d382aafbSBarry Smith #define PetscObjectTakeAccess(obj)   0
1528*d382aafbSBarry Smith #define PetscObjectGrantAccess(obj)  0
1529*d382aafbSBarry Smith #define PetscObjectDepublish(obj)    0
1530*d382aafbSBarry Smith 
1531*d382aafbSBarry Smith /*
1532*d382aafbSBarry Smith       Simple PETSc parallel IO for ASCII printing
1533*d382aafbSBarry Smith */
1534*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscFixFilename(const char[],char[]);
1535*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscFOpen(MPI_Comm,const char[],const char[],FILE**);
1536*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscFClose(MPI_Comm,FILE*);
1537*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
1538*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscPrintf(MPI_Comm,const char[],...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
1539*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscSNPrintf(char*,size_t,const char [],...);
1540*d382aafbSBarry Smith 
1541*d382aafbSBarry Smith /* These are used internally by PETSc ASCII IO routines*/
1542*d382aafbSBarry Smith #include <stdarg.h>
1543*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscVSNPrintf(char*,size_t,const char[],int*,va_list);
1544*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  (*PetscVFPrintf)(FILE*,const char[],va_list);
1545*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscVFPrintfDefault(FILE*,const char[],va_list);
1546*d382aafbSBarry Smith 
1547*d382aafbSBarry Smith /*MC
1548*d382aafbSBarry Smith     PetscErrorPrintf - Prints error messages.
1549*d382aafbSBarry Smith 
1550*d382aafbSBarry Smith     Not Collective
1551*d382aafbSBarry Smith 
1552*d382aafbSBarry Smith    Synopsis:
1553*d382aafbSBarry Smith      PetscErrorCode (*PetscErrorPrintf)(const char format[],...);
1554*d382aafbSBarry Smith 
1555*d382aafbSBarry Smith     Input Parameters:
1556*d382aafbSBarry Smith .   format - the usual printf() format string
1557*d382aafbSBarry Smith 
1558*d382aafbSBarry Smith    Options Database Keys:
1559*d382aafbSBarry Smith +    -error_output_stdout - cause error messages to be printed to stdout instead of the
1560*d382aafbSBarry Smith          (default) stderr
1561*d382aafbSBarry Smith -    -error_output_none to turn off all printing of error messages (does not change the way the
1562*d382aafbSBarry Smith           error is handled.)
1563*d382aafbSBarry Smith 
1564*d382aafbSBarry Smith    Notes: Use
1565*d382aafbSBarry Smith $     PetscErrorPrintf = PetscErrorPrintfNone; to turn off all printing of error messages (does not change the way the
1566*d382aafbSBarry Smith $                        error is handled.) and
1567*d382aafbSBarry Smith $     PetscErrorPrintf = PetscErrorPrintfDefault; to turn it back on
1568*d382aafbSBarry Smith 
1569*d382aafbSBarry Smith           Use
1570*d382aafbSBarry Smith      PETSC_STDERR = FILE* obtained from a file open etc. to have stderr printed to the file.
1571*d382aafbSBarry Smith      PETSC_STDOUT = FILE* obtained from a file open etc. to have stdout printed to the file.
1572*d382aafbSBarry Smith 
1573*d382aafbSBarry Smith           Use
1574*d382aafbSBarry Smith       PetscPushErrorHandler() to provide your own error handler that determines what kind of messages to print
1575*d382aafbSBarry Smith 
1576*d382aafbSBarry Smith    Level: developer
1577*d382aafbSBarry Smith 
1578*d382aafbSBarry Smith     Fortran Note:
1579*d382aafbSBarry Smith     This routine is not supported in Fortran.
1580*d382aafbSBarry Smith 
1581*d382aafbSBarry Smith     Concepts: error messages^printing
1582*d382aafbSBarry Smith     Concepts: printing^error messages
1583*d382aafbSBarry Smith 
1584*d382aafbSBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf(), PetscPrintf(), PetscErrorHandlerPush()
1585*d382aafbSBarry Smith M*/
1586*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*PetscErrorPrintf)(const char[],...);
1587*d382aafbSBarry Smith 
1588*d382aafbSBarry Smith /*MC
1589*d382aafbSBarry Smith     PetscHelpPrintf - Prints help messages.
1590*d382aafbSBarry Smith 
1591*d382aafbSBarry Smith     Not Collective
1592*d382aafbSBarry Smith 
1593*d382aafbSBarry Smith    Synopsis:
1594*d382aafbSBarry Smith      PetscErrorCode (*PetscHelpPrintf)(const char format[],...);
1595*d382aafbSBarry Smith 
1596*d382aafbSBarry Smith     Input Parameters:
1597*d382aafbSBarry Smith .   format - the usual printf() format string
1598*d382aafbSBarry Smith 
1599*d382aafbSBarry Smith    Level: developer
1600*d382aafbSBarry Smith 
1601*d382aafbSBarry Smith     Fortran Note:
1602*d382aafbSBarry Smith     This routine is not supported in Fortran.
1603*d382aafbSBarry Smith 
1604*d382aafbSBarry Smith     Concepts: help messages^printing
1605*d382aafbSBarry Smith     Concepts: printing^help messages
1606*d382aafbSBarry Smith 
1607*d382aafbSBarry Smith .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf()
1608*d382aafbSBarry Smith M*/
1609*d382aafbSBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode  (*PetscHelpPrintf)(MPI_Comm,const char[],...);
1610*d382aafbSBarry Smith 
1611*d382aafbSBarry Smith EXTERN PetscErrorCode  PetscErrorPrintfDefault(const char [],...);
1612*d382aafbSBarry Smith EXTERN PetscErrorCode  PetscErrorPrintfNone(const char [],...);
1613*d382aafbSBarry Smith EXTERN PetscErrorCode  PetscHelpPrintfDefault(MPI_Comm,const char [],...);
1614*d382aafbSBarry Smith 
1615*d382aafbSBarry Smith #if defined(PETSC_HAVE_POPEN)
1616*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **);
1617*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscPClose(MPI_Comm,FILE*);
1618*d382aafbSBarry Smith #endif
1619*d382aafbSBarry Smith 
1620*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
1621*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
1622*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscSynchronizedFlush(MPI_Comm);
1623*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscSynchronizedFGets(MPI_Comm,FILE*,size_t,char[]);
1624*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**);
1625*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscStartJava(MPI_Comm,const char[],const char[],FILE**);
1626*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscGetPetscDir(const char*[]);
1627*d382aafbSBarry Smith 
1628*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT  PetscPopUpSelect(MPI_Comm,const char*,const char*,int,const char**,int*);
1629*d382aafbSBarry Smith 
1630*d382aafbSBarry Smith /*S
1631*d382aafbSBarry Smith      PetscContainer - Simple PETSc object that contains a pointer to any required data
1632*d382aafbSBarry Smith 
1633*d382aafbSBarry Smith    Level: advanced
1634*d382aafbSBarry Smith 
1635*d382aafbSBarry Smith .seealso:  PetscObject, PetscContainerCreate()
1636*d382aafbSBarry Smith S*/
1637*d382aafbSBarry Smith extern PetscCookie PETSC_DLLEXPORT PETSC_CONTAINER_COOKIE;
1638*d382aafbSBarry Smith typedef struct _p_PetscContainer*  PetscContainer;
1639*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerGetPointer(PetscContainer,void **);
1640*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerSetPointer(PetscContainer,void *);
1641*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerDestroy(PetscContainer);
1642*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerCreate(MPI_Comm,PetscContainer *);
1643*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscContainerSetUserDestroy(PetscContainer, PetscErrorCode (*)(void*));
1644*d382aafbSBarry Smith 
1645*d382aafbSBarry Smith /*
1646*d382aafbSBarry Smith    For use in debuggers
1647*d382aafbSBarry Smith */
1648*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscMPIInt PetscGlobalRank;
1649*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscMPIInt PetscGlobalSize;
1650*d382aafbSBarry Smith 
1651*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscIntView(PetscInt,const PetscInt[],PetscViewer);
1652*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRealView(PetscInt,const PetscReal[],PetscViewer);
1653*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscScalarView(PetscInt,const PetscScalar[],PetscViewer);
1654*d382aafbSBarry Smith 
1655*d382aafbSBarry Smith #if defined(PETSC_HAVE_MEMORY_H)
1656*d382aafbSBarry Smith #include <memory.h>
1657*d382aafbSBarry Smith #endif
1658*d382aafbSBarry Smith #if defined(PETSC_HAVE_STDLIB_H)
1659*d382aafbSBarry Smith #include <stdlib.h>
1660*d382aafbSBarry Smith #endif
1661*d382aafbSBarry Smith #if defined(PETSC_HAVE_STRINGS_H)
1662*d382aafbSBarry Smith #include <strings.h>
1663*d382aafbSBarry Smith #endif
1664*d382aafbSBarry Smith #if defined(PETSC_HAVE_STRING_H)
1665*d382aafbSBarry Smith #include <string.h>
1666*d382aafbSBarry Smith #endif
1667*d382aafbSBarry Smith #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY)
1668*d382aafbSBarry Smith #include "petscblaslapack.h"
1669*d382aafbSBarry Smith #endif
1670*d382aafbSBarry Smith #if defined(PETSC_HAVE_XMMINTRIN_H)
1671*d382aafbSBarry Smith #include <xmmintrin.h>
1672*d382aafbSBarry Smith #endif
1673*d382aafbSBarry Smith #if defined(PETSC_HAVE_STDINT_H)
1674*d382aafbSBarry Smith #include <stdint.h>
1675*d382aafbSBarry Smith #endif
1676*d382aafbSBarry Smith 
1677*d382aafbSBarry Smith /*@C
1678*d382aafbSBarry Smith    PetscMemcpy - Copies n bytes, beginning at location b, to the space
1679*d382aafbSBarry Smith    beginning at location a. The two memory regions CANNOT overlap, use
1680*d382aafbSBarry Smith    PetscMemmove() in that case.
1681*d382aafbSBarry Smith 
1682*d382aafbSBarry Smith    Not Collective
1683*d382aafbSBarry Smith 
1684*d382aafbSBarry Smith    Input Parameters:
1685*d382aafbSBarry Smith +  b - pointer to initial memory space
1686*d382aafbSBarry Smith -  n - length (in bytes) of space to copy
1687*d382aafbSBarry Smith 
1688*d382aafbSBarry Smith    Output Parameter:
1689*d382aafbSBarry Smith .  a - pointer to copy space
1690*d382aafbSBarry Smith 
1691*d382aafbSBarry Smith    Level: intermediate
1692*d382aafbSBarry Smith 
1693*d382aafbSBarry Smith    Compile Option:
1694*d382aafbSBarry Smith     PETSC_PREFER_DCOPY_FOR_MEMCPY will cause the BLAS dcopy() routine to be used
1695*d382aafbSBarry Smith                                   for memory copies on double precision values.
1696*d382aafbSBarry Smith     PETSC_PREFER_COPY_FOR_MEMCPY will cause C code to be used
1697*d382aafbSBarry Smith                                   for memory copies on double precision values.
1698*d382aafbSBarry Smith     PETSC_PREFER_FORTRAN_FORMEMCPY will cause Fortran code to be used
1699*d382aafbSBarry Smith                                   for memory copies on double precision values.
1700*d382aafbSBarry Smith 
1701*d382aafbSBarry Smith    Note:
1702*d382aafbSBarry Smith    This routine is analogous to memcpy().
1703*d382aafbSBarry Smith 
1704*d382aafbSBarry Smith   Concepts: memory^copying
1705*d382aafbSBarry Smith   Concepts: copying^memory
1706*d382aafbSBarry Smith 
1707*d382aafbSBarry Smith .seealso: PetscMemmove()
1708*d382aafbSBarry Smith 
1709*d382aafbSBarry Smith @*/
1710*d382aafbSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PETSC_DLLEXPORT PetscMemcpy(void *a,const void *b,size_t n)
1711*d382aafbSBarry Smith {
1712*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1713*d382aafbSBarry Smith   unsigned long al = (unsigned long) a,bl = (unsigned long) b;
1714*d382aafbSBarry Smith   unsigned long nl = (unsigned long) n;
1715*d382aafbSBarry Smith   if (n > 0 && !b) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to copy from a null pointer");
1716*d382aafbSBarry Smith   if (n > 0 && !a) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to copy to a null pointer");
1717*d382aafbSBarry Smith #endif
1718*d382aafbSBarry Smith   PetscFunctionBegin;
1719*d382aafbSBarry Smith   if (a != b) {
1720*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1721*d382aafbSBarry Smith     if ((al > bl && (al - bl) < nl) || (bl - al) < nl) {
1722*d382aafbSBarry Smith       SETERRQ3(PETSC_ERR_ARG_INCOMP,"Memory regions overlap: either use PetscMemmov()\n\
1723*d382aafbSBarry Smith               or make sure your copy regions and lengths are correct. \n\
1724*d382aafbSBarry Smith               Length (bytes) %ld first address %ld second address %ld",nl,al,bl);
1725*d382aafbSBarry Smith     }
1726*d382aafbSBarry Smith #endif
1727*d382aafbSBarry Smith #if (defined(PETSC_PREFER_DCOPY_FOR_MEMCPY) || defined(PETSC_PREFER_COPY_FOR_MEMCPY) || defined(PETSC_PREFER_FORTRAN_FORMEMCPY))
1728*d382aafbSBarry Smith    if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1729*d382aafbSBarry Smith       size_t len = n/sizeof(PetscScalar);
1730*d382aafbSBarry Smith #if defined(PETSC_PREFER_DCOPY_FOR_MEMCPY)
1731*d382aafbSBarry Smith       PetscBLASInt one = 1,blen = PetscBLASIntCast(len);
1732*d382aafbSBarry Smith       BLAScopy_(&blen,(PetscScalar *)b,&one,(PetscScalar *)a,&one);
1733*d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FORMEMCPY)
1734*d382aafbSBarry Smith       fortrancopy_(&len,(PetscScalar*)b,(PetscScalar*)a);
1735*d382aafbSBarry Smith #else
1736*d382aafbSBarry Smith       size_t      i;
1737*d382aafbSBarry Smith       PetscScalar *x = (PetscScalar*)b, *y = (PetscScalar*)a;
1738*d382aafbSBarry Smith       for (i=0; i<len; i++) y[i] = x[i];
1739*d382aafbSBarry Smith #endif
1740*d382aafbSBarry Smith     } else {
1741*d382aafbSBarry Smith       memcpy((char*)(a),(char*)(b),n);
1742*d382aafbSBarry Smith     }
1743*d382aafbSBarry Smith #elif defined(PETSC_HAVE__INTEL_FAST_MEMCPY)
1744*d382aafbSBarry Smith     _intel_fast_memcpy((char*)(a),(char*)(b),n);
1745*d382aafbSBarry Smith #else
1746*d382aafbSBarry Smith     memcpy((char*)(a),(char*)(b),n);
1747*d382aafbSBarry Smith #endif
1748*d382aafbSBarry Smith   }
1749*d382aafbSBarry Smith   PetscFunctionReturn(0);
1750*d382aafbSBarry Smith }
1751*d382aafbSBarry Smith 
1752*d382aafbSBarry Smith /*@C
1753*d382aafbSBarry Smith    PetscMemzero - Zeros the specified memory.
1754*d382aafbSBarry Smith 
1755*d382aafbSBarry Smith    Not Collective
1756*d382aafbSBarry Smith 
1757*d382aafbSBarry Smith    Input Parameters:
1758*d382aafbSBarry Smith +  a - pointer to beginning memory location
1759*d382aafbSBarry Smith -  n - length (in bytes) of memory to initialize
1760*d382aafbSBarry Smith 
1761*d382aafbSBarry Smith    Level: intermediate
1762*d382aafbSBarry Smith 
1763*d382aafbSBarry Smith    Compile Option:
1764*d382aafbSBarry Smith    PETSC_PREFER_BZERO - on certain machines (the IBM RS6000) the bzero() routine happens
1765*d382aafbSBarry Smith   to be faster than the memset() routine. This flag causes the bzero() routine to be used.
1766*d382aafbSBarry Smith 
1767*d382aafbSBarry Smith    Concepts: memory^zeroing
1768*d382aafbSBarry Smith    Concepts: zeroing^memory
1769*d382aafbSBarry Smith 
1770*d382aafbSBarry Smith .seealso: PetscMemcpy()
1771*d382aafbSBarry Smith @*/
1772*d382aafbSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PETSC_DLLEXPORT PetscMemzero(void *a,size_t n)
1773*d382aafbSBarry Smith {
1774*d382aafbSBarry Smith   if (n > 0) {
1775*d382aafbSBarry Smith #if defined(PETSC_USE_DEBUG)
1776*d382aafbSBarry Smith     if (!a) SETERRQ(PETSC_ERR_ARG_NULL,"Trying to zero at a null pointer");
1777*d382aafbSBarry Smith #endif
1778*d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO)
1779*d382aafbSBarry Smith     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1780*d382aafbSBarry Smith       size_t      i,len = n/sizeof(PetscScalar);
1781*d382aafbSBarry Smith       PetscScalar *x = (PetscScalar*)a;
1782*d382aafbSBarry Smith       for (i=0; i<len; i++) x[i] = 0.0;
1783*d382aafbSBarry Smith     } else {
1784*d382aafbSBarry Smith #elif defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
1785*d382aafbSBarry Smith     if (!(((long) a) % sizeof(PetscScalar)) && !(n % sizeof(PetscScalar))) {
1786*d382aafbSBarry Smith       PetscInt len = n/sizeof(PetscScalar);
1787*d382aafbSBarry Smith       fortranzero_(&len,(PetscScalar*)a);
1788*d382aafbSBarry Smith     } else {
1789*d382aafbSBarry Smith #endif
1790*d382aafbSBarry Smith #if defined(PETSC_PREFER_BZERO)
1791*d382aafbSBarry Smith       bzero((char *)a,n);
1792*d382aafbSBarry Smith #elif defined (PETSC_HAVE__INTEL_FAST_MEMSET)
1793*d382aafbSBarry Smith       _intel_fast_memset((char*)a,0,n);
1794*d382aafbSBarry Smith #else
1795*d382aafbSBarry Smith       memset((char*)a,0,n);
1796*d382aafbSBarry Smith #endif
1797*d382aafbSBarry Smith #if defined(PETSC_PREFER_ZERO_FOR_MEMZERO) || defined(PETSC_PREFER_FORTRAN_FOR_MEMZERO)
1798*d382aafbSBarry Smith     }
1799*d382aafbSBarry Smith #endif
1800*d382aafbSBarry Smith   }
1801*d382aafbSBarry Smith   return 0;
1802*d382aafbSBarry Smith }
1803*d382aafbSBarry Smith 
1804*d382aafbSBarry Smith /*MC
1805*d382aafbSBarry Smith    PetscPrefetchBlock - Prefetches a block of memory
1806*d382aafbSBarry Smith 
1807*d382aafbSBarry Smith    Not Collective
1808*d382aafbSBarry Smith 
1809*d382aafbSBarry Smith    Input Parameters:
1810*d382aafbSBarry Smith +  a - pointer to first element to fetch (any type but usually PetscInt or PetscScalar)
1811*d382aafbSBarry Smith .  n - number of elements to fetch
1812*d382aafbSBarry Smith .  rw - 1 if the memory will be written to, otherwise 0 (ignored by many processors)
1813*d382aafbSBarry Smith -  t - temporal locality (0,1,2,3), see note
1814*d382aafbSBarry Smith 
1815*d382aafbSBarry Smith    Level: developer
1816*d382aafbSBarry Smith 
1817*d382aafbSBarry Smith    Synopsis:
1818*d382aafbSBarry Smith     void PetscPrefetchBlock(const anytype *a,size_t n,int rw,int t)
1819*d382aafbSBarry Smith 
1820*d382aafbSBarry Smith    Notes:
1821*d382aafbSBarry Smith    The last two arguments (rw and t) must be compile-time constants.
1822*d382aafbSBarry Smith 
1823*d382aafbSBarry Smith    There are four levels of temporal locality (not all architectures distinguish)
1824*d382aafbSBarry Smith +  0 - Non-temporal.  Prefetches directly to L1, evicts to memory (skips higher level cache unless it was already there when prefetched).
1825*d382aafbSBarry Smith .  1 - Temporal with respect to high-level cache only.  Only prefetches to high-level cache (not L1), kept at high levels after eviction from L1.
1826*d382aafbSBarry Smith .  2 - Same as 1, but keep in mid-level cache.  (On most systems, 1 and 2 are equivalent.)
1827*d382aafbSBarry Smith -  3 - Fetch to all levels of cache and evict to the closest level.  Use this when the memory will be reused regularly despite necessary eviction from L1.
1828*d382aafbSBarry Smith 
1829*d382aafbSBarry Smith    This function does nothing on architectures that do not support prefetch and never errors (even if passed an invalid
1830*d382aafbSBarry Smith    address).
1831*d382aafbSBarry Smith 
1832*d382aafbSBarry Smith    Concepts: memory
1833*d382aafbSBarry Smith M*/
1834*d382aafbSBarry Smith #define PetscPrefetchBlock(a,n,rw,t) do {                               \
1835*d382aafbSBarry Smith     const char *_p = (const char*)(a),*_end = (const char*)((a)+(n));   \
1836*d382aafbSBarry Smith     for ( ; _p < _end; _p += PETSC_LEVEL1_DCACHE_LINESIZE) PETSC_Prefetch(_p,(rw),(t)); \
1837*d382aafbSBarry Smith   } while (0)
1838*d382aafbSBarry Smith 
1839*d382aafbSBarry Smith /*
1840*d382aafbSBarry Smith     Allows accessing Matlab Engine
1841*d382aafbSBarry Smith */
1842*d382aafbSBarry Smith #include "petscmatlab.h"
1843*d382aafbSBarry Smith 
1844*d382aafbSBarry Smith /*
1845*d382aafbSBarry Smith       Determine if some of the kernel computation routines use
1846*d382aafbSBarry Smith    Fortran (rather than C) for the numerical calculations. On some machines
1847*d382aafbSBarry Smith    and compilers (like complex numbers) the Fortran version of the routines
1848*d382aafbSBarry Smith    is faster than the C/C++ versions. The flag --with-fortran-kernels
1849*d382aafbSBarry Smith    should be used with config/configure.py to turn these on.
1850*d382aafbSBarry Smith */
1851*d382aafbSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS)
1852*d382aafbSBarry Smith 
1853*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCRL)
1854*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTCRL
1855*d382aafbSBarry Smith #endif
1856*d382aafbSBarry Smith 
1857*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTCSRPERM)
1858*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTCSRPERM
1859*d382aafbSBarry Smith #endif
1860*d382aafbSBarry Smith 
1861*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
1862*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
1863*d382aafbSBarry Smith #endif
1864*d382aafbSBarry Smith 
1865*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
1866*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
1867*d382aafbSBarry Smith #endif
1868*d382aafbSBarry Smith 
1869*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
1870*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_NORM
1871*d382aafbSBarry Smith #endif
1872*d382aafbSBarry Smith 
1873*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
1874*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MAXPY
1875*d382aafbSBarry Smith #endif
1876*d382aafbSBarry Smith 
1877*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
1878*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
1879*d382aafbSBarry Smith #endif
1880*d382aafbSBarry Smith 
1881*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
1882*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
1883*d382aafbSBarry Smith #endif
1884*d382aafbSBarry Smith 
1885*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
1886*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
1887*d382aafbSBarry Smith #endif
1888*d382aafbSBarry Smith 
1889*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
1890*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
1891*d382aafbSBarry Smith #endif
1892*d382aafbSBarry Smith 
1893*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
1894*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_MDOT
1895*d382aafbSBarry Smith #endif
1896*d382aafbSBarry Smith 
1897*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
1898*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
1899*d382aafbSBarry Smith #endif
1900*d382aafbSBarry Smith 
1901*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
1902*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_AYPX
1903*d382aafbSBarry Smith #endif
1904*d382aafbSBarry Smith 
1905*d382aafbSBarry Smith #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
1906*d382aafbSBarry Smith #define PETSC_USE_FORTRAN_KERNEL_WAXPY
1907*d382aafbSBarry Smith #endif
1908*d382aafbSBarry Smith 
1909*d382aafbSBarry Smith #endif
1910*d382aafbSBarry Smith 
1911*d382aafbSBarry Smith /*
1912*d382aafbSBarry Smith     Macros for indicating code that should be compiled with a C interface,
1913*d382aafbSBarry Smith    rather than a C++ interface. Any routines that are dynamically loaded
1914*d382aafbSBarry Smith    (such as the PCCreate_XXX() routines) must be wrapped so that the name
1915*d382aafbSBarry Smith    mangler does not change the functions symbol name. This just hides the
1916*d382aafbSBarry Smith    ugly extern "C" {} wrappers.
1917*d382aafbSBarry Smith */
1918*d382aafbSBarry Smith #if defined(__cplusplus)
1919*d382aafbSBarry Smith #define EXTERN_C_BEGIN extern "C" {
1920*d382aafbSBarry Smith #define EXTERN_C_END }
1921*d382aafbSBarry Smith #else
1922*d382aafbSBarry Smith #define EXTERN_C_BEGIN
1923*d382aafbSBarry Smith #define EXTERN_C_END
1924*d382aafbSBarry Smith #endif
1925*d382aafbSBarry Smith 
1926*d382aafbSBarry Smith /* --------------------------------------------------------------------*/
1927*d382aafbSBarry Smith 
1928*d382aafbSBarry Smith /*MC
1929*d382aafbSBarry Smith     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
1930*d382aafbSBarry Smith         communication
1931*d382aafbSBarry Smith 
1932*d382aafbSBarry Smith    Level: beginner
1933*d382aafbSBarry Smith 
1934*d382aafbSBarry Smith    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
1935*d382aafbSBarry Smith 
1936*d382aafbSBarry Smith .seealso: PETSC_COMM_WORLD, PETSC_COMM_SELF
1937*d382aafbSBarry Smith M*/
1938*d382aafbSBarry Smith 
1939*d382aafbSBarry Smith /*MC
1940*d382aafbSBarry Smith     PetscScalar - PETSc type that represents either a double precision real number, a double precision
1941*d382aafbSBarry Smith        complex number, a single precision real number, a long double or an int - if the code is configured
1942*d382aafbSBarry Smith        with --with-scalar-type=real,complex --with-precision=single,double,longdouble,int,matsingle
1943*d382aafbSBarry Smith 
1944*d382aafbSBarry Smith 
1945*d382aafbSBarry Smith    Level: beginner
1946*d382aafbSBarry Smith 
1947*d382aafbSBarry Smith .seealso: PetscReal, PassiveReal, PassiveScalar, MPIU_SCALAR, PetscInt
1948*d382aafbSBarry Smith M*/
1949*d382aafbSBarry Smith 
1950*d382aafbSBarry Smith /*MC
1951*d382aafbSBarry Smith     PetscReal - PETSc type that represents a real number version of PetscScalar
1952*d382aafbSBarry Smith 
1953*d382aafbSBarry Smith    Level: beginner
1954*d382aafbSBarry Smith 
1955*d382aafbSBarry Smith .seealso: PetscScalar, PassiveReal, PassiveScalar
1956*d382aafbSBarry Smith M*/
1957*d382aafbSBarry Smith 
1958*d382aafbSBarry Smith /*MC
1959*d382aafbSBarry Smith     PassiveScalar - PETSc type that represents a PetscScalar
1960*d382aafbSBarry Smith    Level: beginner
1961*d382aafbSBarry Smith 
1962*d382aafbSBarry Smith     This is the same as a PetscScalar except in code that is automatically differentiated it is
1963*d382aafbSBarry Smith    treated as a constant (not an indendent or dependent variable)
1964*d382aafbSBarry Smith 
1965*d382aafbSBarry Smith .seealso: PetscReal, PassiveReal, PetscScalar
1966*d382aafbSBarry Smith M*/
1967*d382aafbSBarry Smith 
1968*d382aafbSBarry Smith /*MC
1969*d382aafbSBarry Smith     PassiveReal - PETSc type that represents a PetscReal
1970*d382aafbSBarry Smith 
1971*d382aafbSBarry Smith    Level: beginner
1972*d382aafbSBarry Smith 
1973*d382aafbSBarry Smith     This is the same as a PetscReal except in code that is automatically differentiated it is
1974*d382aafbSBarry Smith    treated as a constant (not an indendent or dependent variable)
1975*d382aafbSBarry Smith 
1976*d382aafbSBarry Smith .seealso: PetscScalar, PetscReal, PassiveScalar
1977*d382aafbSBarry Smith M*/
1978*d382aafbSBarry Smith 
1979*d382aafbSBarry Smith /*MC
1980*d382aafbSBarry Smith     MPIU_SCALAR - MPI datatype corresponding to PetscScalar
1981*d382aafbSBarry Smith 
1982*d382aafbSBarry Smith    Level: beginner
1983*d382aafbSBarry Smith 
1984*d382aafbSBarry Smith     Note: In MPI calls that require an MPI datatype that matches a PetscScalar or array of PetscScalars
1985*d382aafbSBarry Smith           pass this value
1986*d382aafbSBarry Smith 
1987*d382aafbSBarry Smith .seealso: PetscReal, PassiveReal, PassiveScalar, PetscScalar, MPIU_INT
1988*d382aafbSBarry Smith M*/
1989*d382aafbSBarry Smith 
1990*d382aafbSBarry Smith #if defined(PETSC_HAVE_MPIIO)
1991*d382aafbSBarry Smith #if !defined(PETSC_WORDS_BIGENDIAN)
1992*d382aafbSBarry Smith extern PetscErrorCode MPIU_File_write_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1993*d382aafbSBarry Smith extern PetscErrorCode MPIU_File_read_all(MPI_File,void*,PetscMPIInt,MPI_Datatype,MPI_Status*);
1994*d382aafbSBarry Smith #else
1995*d382aafbSBarry Smith #define MPIU_File_write_all(a,b,c,d,e) MPI_File_write_all(a,b,c,d,e)
1996*d382aafbSBarry Smith #define MPIU_File_read_all(a,b,c,d,e) MPI_File_read_all(a,b,c,d,e)
1997*d382aafbSBarry Smith #endif
1998*d382aafbSBarry Smith #endif
1999*d382aafbSBarry Smith 
2000*d382aafbSBarry Smith /* the following petsc_static_inline require petscerror.h */
2001*d382aafbSBarry Smith 
2002*d382aafbSBarry Smith /* Limit MPI to 32-bits */
2003*d382aafbSBarry Smith #define PETSC_MPI_INT_MAX  2147483647
2004*d382aafbSBarry Smith #define PETSC_MPI_INT_MIN -2147483647
2005*d382aafbSBarry Smith /* Limit BLAS to 32-bits */
2006*d382aafbSBarry Smith #define PETSC_BLAS_INT_MAX  2147483647
2007*d382aafbSBarry Smith #define PETSC_BLAS_INT_MIN -2147483647
2008*d382aafbSBarry Smith /* On 32 bit systems HDF5 is limited by size of integer, because hsize_t is defined as size_t */
2009*d382aafbSBarry Smith #define PETSC_HDF5_INT_MAX  2147483647
2010*d382aafbSBarry Smith #define PETSC_HDF5_INT_MIN -2147483647
2011*d382aafbSBarry Smith 
2012*d382aafbSBarry Smith #if defined(PETSC_USE_64BIT_INDICES)
2013*d382aafbSBarry Smith #define PetscMPIIntCheck(a)  if ((a) > PETSC_MPI_INT_MAX) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Message too long for MPI")
2014*d382aafbSBarry Smith #define PetscBLASIntCheck(a)  if ((a) > PETSC_BLAS_INT_MAX) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Array too long for BLAS/LAPACK")
2015*d382aafbSBarry Smith #define PetscMPIIntCast(a) (a);PetscMPIIntCheck(a)
2016*d382aafbSBarry Smith #define PetscBLASIntCast(a) (a);PetscBLASIntCheck(a)
2017*d382aafbSBarry Smith 
2018*d382aafbSBarry Smith #if (PETSC_SIZEOF_SIZE_T == 4)
2019*d382aafbSBarry Smith #define PetscHDF5IntCheck(a)  if ((a) > PETSC_HDF5_INT_MAX) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Array too long for HDF5")
2020*d382aafbSBarry Smith #define PetscHDF5IntCast(a) (a);PetscHDF5IntCheck(a)
2021*d382aafbSBarry Smith #else
2022*d382aafbSBarry Smith #define PetscHDF5IntCheck(a)
2023*d382aafbSBarry Smith #define PetscHDF5IntCast(a) a
2024*d382aafbSBarry Smith #endif
2025*d382aafbSBarry Smith 
2026*d382aafbSBarry Smith #else
2027*d382aafbSBarry Smith #define PetscMPIIntCheck(a)
2028*d382aafbSBarry Smith #define PetscBLASIntCheck(a)
2029*d382aafbSBarry Smith #define PetscHDF5IntCheck(a)
2030*d382aafbSBarry Smith #define PetscMPIIntCast(a) a
2031*d382aafbSBarry Smith #define PetscBLASIntCast(a) a
2032*d382aafbSBarry Smith #define PetscHDF5IntCast(a) a
2033*d382aafbSBarry Smith #endif
2034*d382aafbSBarry Smith 
2035*d382aafbSBarry Smith 
2036*d382aafbSBarry Smith /*
2037*d382aafbSBarry Smith      The IBM include files define hz, here we hide it so that it may be used
2038*d382aafbSBarry Smith    as a regular user variable.
2039*d382aafbSBarry Smith */
2040*d382aafbSBarry Smith #if defined(hz)
2041*d382aafbSBarry Smith #undef hz
2042*d382aafbSBarry Smith #endif
2043*d382aafbSBarry Smith 
2044*d382aafbSBarry Smith /*  For arrays that contain filenames or paths */
2045*d382aafbSBarry Smith 
2046*d382aafbSBarry Smith 
2047*d382aafbSBarry Smith #if defined(PETSC_HAVE_LIMITS_H)
2048*d382aafbSBarry Smith #include <limits.h>
2049*d382aafbSBarry Smith #endif
2050*d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_PARAM_H)
2051*d382aafbSBarry Smith #include <sys/param.h>
2052*d382aafbSBarry Smith #endif
2053*d382aafbSBarry Smith #if defined(PETSC_HAVE_SYS_TYPES_H)
2054*d382aafbSBarry Smith #include <sys/types.h>
2055*d382aafbSBarry Smith #endif
2056*d382aafbSBarry Smith #if defined(MAXPATHLEN)
2057*d382aafbSBarry Smith #  define PETSC_MAX_PATH_LEN     MAXPATHLEN
2058*d382aafbSBarry Smith #elif defined(MAX_PATH)
2059*d382aafbSBarry Smith #  define PETSC_MAX_PATH_LEN     MAX_PATH
2060*d382aafbSBarry Smith #elif defined(_MAX_PATH)
2061*d382aafbSBarry Smith #  define PETSC_MAX_PATH_LEN     _MAX_PATH
2062*d382aafbSBarry Smith #else
2063*d382aafbSBarry Smith #  define PETSC_MAX_PATH_LEN     4096
2064*d382aafbSBarry Smith #endif
2065*d382aafbSBarry Smith 
2066*d382aafbSBarry Smith /* Special support for C++ */
2067*d382aafbSBarry Smith #include "petscsys.hh"
2068*d382aafbSBarry Smith 
2069*d382aafbSBarry Smith /*MC
2070*d382aafbSBarry Smith 
2071*d382aafbSBarry Smith     UsingFortran - Fortran can be used with PETSc in four distinct approaches
2072*d382aafbSBarry Smith 
2073*d382aafbSBarry Smith $    1) classic Fortran 77 style
2074*d382aafbSBarry Smith $#include "petscXXX.h" to work with material from the XXX component of PETSc
2075*d382aafbSBarry Smith $       XXX variablename
2076*d382aafbSBarry Smith $      You cannot use this approach if you wish to use the Fortran 90 specific PETSc routines
2077*d382aafbSBarry Smith $      which end in F90; such as VecGetArrayF90()
2078*d382aafbSBarry Smith $
2079*d382aafbSBarry Smith $    2) classic Fortran 90 style
2080*d382aafbSBarry Smith $#include "petscXXX.h"
2081*d382aafbSBarry Smith $#include "petscXXX.h90" to work with material from the XXX component of PETSc
2082*d382aafbSBarry Smith $       XXX variablename
2083*d382aafbSBarry Smith $
2084*d382aafbSBarry Smith $    3) Using Fortran modules
2085*d382aafbSBarry Smith $#include "petscXXXdef.h"
2086*d382aafbSBarry Smith $         use petscXXXX
2087*d382aafbSBarry Smith $       XXX variablename
2088*d382aafbSBarry Smith $
2089*d382aafbSBarry Smith $    4) Use Fortran modules and Fortran data types for PETSc types
2090*d382aafbSBarry Smith $#include "petscXXXdef.h"
2091*d382aafbSBarry Smith $         use petscXXXX
2092*d382aafbSBarry Smith $       type(XXX) variablename
2093*d382aafbSBarry Smith $      To use this approach you must config/configure.py PETSc with the additional
2094*d382aafbSBarry Smith $      option --with-fortran-datatypes You cannot use the type(XXX) declaration approach without using Fortran modules
2095*d382aafbSBarry Smith 
2096*d382aafbSBarry Smith     Finally if you absolutely do not want to use any #include you can use either
2097*d382aafbSBarry Smith 
2098*d382aafbSBarry Smith $    3a) skip the #include BUT you cannot use any PETSc data type names like Vec, Mat, PetscInt, PetscErrorCode etc
2099*d382aafbSBarry Smith $        and you must declare the variables as integer, for example
2100*d382aafbSBarry Smith $        integer variablename
2101*d382aafbSBarry Smith $
2102*d382aafbSBarry Smith $    4a) skip the #include, you use the object types like type(Vec) type(Mat) but cannot use the data type
2103*d382aafbSBarry Smith $        names like PetscErrorCode, PetscInt etc. again for those you must use integer
2104*d382aafbSBarry Smith 
2105*d382aafbSBarry Smith    We recommend either 2 or 3. Approaches 2 and 3 provide type checking for most PETSc function calls; 4 has type checking
2106*d382aafbSBarry Smith for only a few PETSc functions.
2107*d382aafbSBarry Smith 
2108*d382aafbSBarry Smith    Fortran type checking with interfaces is strick, this means you cannot pass a scalar value when an array value
2109*d382aafbSBarry Smith is expected (even though it is legal Fortran). For example when setting a single value in a matrix with MatSetValues()
2110*d382aafbSBarry Smith you cannot have something like
2111*d382aafbSBarry Smith $      PetscInt row,col
2112*d382aafbSBarry Smith $      PetscScalar val
2113*d382aafbSBarry Smith $        ...
2114*d382aafbSBarry Smith $      call MatSetValues(mat,1,row,1,col,val,INSERT_VALUES,ierr)
2115*d382aafbSBarry Smith You must instead have
2116*d382aafbSBarry Smith $      PetscInt row(1),col(1)
2117*d382aafbSBarry Smith $      PetscScalar val(1)
2118*d382aafbSBarry Smith $        ...
2119*d382aafbSBarry Smith $      call MatSetValues(mat,1,row,1,col,val,INSERT_VALUES,ierr)
2120*d382aafbSBarry Smith 
2121*d382aafbSBarry Smith 
2122*d382aafbSBarry Smith     See the example src/vec/vec/examples/tutorials/ex20f90.F90 for an example that can use all four approaches
2123*d382aafbSBarry Smith 
2124*d382aafbSBarry Smith     Developer Notes: The finclude/petscXXXdef.h contain all the #defines (would be typedefs in C code) these
2125*d382aafbSBarry Smith      automatically include their predecessors; for example finclude/petscvecdef.h includes finclude/petscisdef.h
2126*d382aafbSBarry Smith 
2127*d382aafbSBarry Smith      The finclude/petscXXXX.h contain all the parameter statements for that package. These automatically include
2128*d382aafbSBarry Smith      their finclude/petscXXXdef.h file but DO NOT automatically include their predecessors;  for example
2129*d382aafbSBarry Smith      finclude/petscvec.h does NOT automatically include finclude/petscis.h
2130*d382aafbSBarry Smith 
2131*d382aafbSBarry Smith      The finclude/ftn-custom/petscXXXdef.h90 are not intended to be used directly in code, they define the
2132*d382aafbSBarry Smith      Fortran data type type(XXX) (for example type(Vec)) when PETSc is config/configure.py with the --with-fortran-datatypes option.
2133*d382aafbSBarry Smith 
2134*d382aafbSBarry Smith      The finclude/ftn-custom/petscXXX.h90 (not included directly by code) contain interface definitions for
2135*d382aafbSBarry Smith      the PETSc Fortran stubs that have different bindings then their C version (for example VecGetArrayF90).
2136*d382aafbSBarry Smith 
2137*d382aafbSBarry Smith      The finclude/ftn-auto/petscXXX.h90 (not included directly by code) contain interface definitions generated
2138*d382aafbSBarry Smith      automatically by "make allfortranstubs".
2139*d382aafbSBarry Smith 
2140*d382aafbSBarry Smith      The finclude/petscXXX.h90 includes the custom finclude/ftn-custom/petscXXX.h90 and if config/configure.py
2141*d382aafbSBarry Smith      was run with --with-fortran-interfaces it also includes the finclude/ftn-auto/petscXXX.h90 These DO NOT automatically
2142*d382aafbSBarry Smith      include their predecessors
2143*d382aafbSBarry Smith 
2144*d382aafbSBarry Smith     Level: beginner
2145*d382aafbSBarry Smith 
2146*d382aafbSBarry Smith M*/
2147*d382aafbSBarry Smith 
2148*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetArchType(char[],size_t);
2149*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetHostName(char[],size_t);
2150*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetUserName(char[],size_t);
2151*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetProgramName(char[],size_t);
2152*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetProgramName(const char[]);
2153*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetDate(char[],size_t);
2154*d382aafbSBarry Smith 
2155*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortInt(PetscInt,PetscInt[]);
2156*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortIntWithPermutation(PetscInt,const PetscInt[],PetscInt[]);
2157*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortStrWithPermutation(PetscInt,const char*[],PetscInt[]);
2158*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortIntWithArray(PetscInt,PetscInt[],PetscInt[]);
2159*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortMPIIntWithArray(PetscMPIInt,PetscMPIInt[],PetscMPIInt[]);
2160*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortIntWithScalarArray(PetscInt,PetscInt[],PetscScalar[]);
2161*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortReal(PetscInt,PetscReal[]);
2162*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortRealWithPermutation(PetscInt,const PetscReal[],PetscInt[]);
2163*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortSplit(PetscInt,PetscInt,PetscScalar[],PetscInt[]);
2164*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSortSplitReal(PetscInt,PetscInt,PetscReal[],PetscInt[]);
2165*d382aafbSBarry Smith 
2166*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDisplay(void);
2167*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetDisplay(char[],size_t);
2168*d382aafbSBarry Smith 
2169*d382aafbSBarry Smith /*E
2170*d382aafbSBarry Smith     PetscRandomType - String with the name of a PETSc randomizer
2171*d382aafbSBarry Smith        with an optional dynamic library name, for example
2172*d382aafbSBarry Smith        http://www.mcs.anl.gov/petsc/lib.a:myrandcreate()
2173*d382aafbSBarry Smith 
2174*d382aafbSBarry Smith    Level: beginner
2175*d382aafbSBarry Smith 
2176*d382aafbSBarry Smith    Notes: to use the SPRNG you must have config/configure.py PETSc
2177*d382aafbSBarry Smith    with the option --download-sprng
2178*d382aafbSBarry Smith 
2179*d382aafbSBarry Smith .seealso: PetscRandomSetType(), PetscRandom
2180*d382aafbSBarry Smith E*/
2181*d382aafbSBarry Smith #define PetscRandomType char*
2182*d382aafbSBarry Smith #define PETSCRAND       "rand"
2183*d382aafbSBarry Smith #define PETSCRAND48     "rand48"
2184*d382aafbSBarry Smith #define PETSCSPRNG      "sprng"
2185*d382aafbSBarry Smith 
2186*d382aafbSBarry Smith /* Logging support */
2187*d382aafbSBarry Smith extern PETSC_DLLEXPORT PetscCookie PETSC_RANDOM_COOKIE;
2188*d382aafbSBarry Smith 
2189*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomInitializePackage(const char[]);
2190*d382aafbSBarry Smith 
2191*d382aafbSBarry Smith /*S
2192*d382aafbSBarry Smith      PetscRandom - Abstract PETSc object that manages generating random numbers
2193*d382aafbSBarry Smith 
2194*d382aafbSBarry Smith    Level: intermediate
2195*d382aafbSBarry Smith 
2196*d382aafbSBarry Smith   Concepts: random numbers
2197*d382aafbSBarry Smith 
2198*d382aafbSBarry Smith .seealso:  PetscRandomCreate(), PetscRandomGetValue(), PetscRandomType
2199*d382aafbSBarry Smith S*/
2200*d382aafbSBarry Smith typedef struct _p_PetscRandom*   PetscRandom;
2201*d382aafbSBarry Smith 
2202*d382aafbSBarry Smith /* Dynamic creation and loading functions */
2203*d382aafbSBarry Smith extern PetscFList PetscRandomList;
2204*d382aafbSBarry Smith extern PetscTruth PetscRandomRegisterAllCalled;
2205*d382aafbSBarry Smith 
2206*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomRegisterAll(const char []);
2207*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomRegister(const char[],const char[],const char[],PetscErrorCode (*)(PetscRandom));
2208*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomRegisterDestroy(void);
2209*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetType(PetscRandom, const PetscRandomType);
2210*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetFromOptions(PetscRandom);
2211*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetType(PetscRandom, const PetscRandomType*);
2212*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomViewFromOptions(PetscRandom,char*);
2213*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomView(PetscRandom,PetscViewer);
2214*d382aafbSBarry Smith 
2215*d382aafbSBarry Smith /*MC
2216*d382aafbSBarry Smith   PetscRandomRegisterDynamic - Adds a new PetscRandom component implementation
2217*d382aafbSBarry Smith 
2218*d382aafbSBarry Smith   Synopsis:
2219*d382aafbSBarry Smith   PetscErrorCode PetscRandomRegisterDynamic(char *name, char *path, char *func_name, PetscErrorCode (*create_func)(PetscRandom))
2220*d382aafbSBarry Smith 
2221*d382aafbSBarry Smith   Not Collective
2222*d382aafbSBarry Smith 
2223*d382aafbSBarry Smith   Input Parameters:
2224*d382aafbSBarry Smith + name        - The name of a new user-defined creation routine
2225*d382aafbSBarry Smith . path        - The path (either absolute or relative) of the library containing this routine
2226*d382aafbSBarry Smith . func_name   - The name of routine to create method context
2227*d382aafbSBarry Smith - create_func - The creation routine itself
2228*d382aafbSBarry Smith 
2229*d382aafbSBarry Smith   Notes:
2230*d382aafbSBarry Smith   PetscRandomRegisterDynamic() may be called multiple times to add several user-defined randome number generators
2231*d382aafbSBarry Smith 
2232*d382aafbSBarry Smith   If dynamic libraries are used, then the fourth input argument (routine_create) is ignored.
2233*d382aafbSBarry Smith 
2234*d382aafbSBarry Smith   Sample usage:
2235*d382aafbSBarry Smith .vb
2236*d382aafbSBarry Smith     PetscRandomRegisterDynamic("my_rand","/home/username/my_lib/lib/libO/solaris/libmy.a", "MyPetscRandomtorCreate", MyPetscRandomtorCreate);
2237*d382aafbSBarry Smith .ve
2238*d382aafbSBarry Smith 
2239*d382aafbSBarry Smith   Then, your random type can be chosen with the procedural interface via
2240*d382aafbSBarry Smith .vb
2241*d382aafbSBarry Smith     PetscRandomCreate(MPI_Comm, PetscRandom *);
2242*d382aafbSBarry Smith     PetscRandomSetType(PetscRandom,"my_random_name");
2243*d382aafbSBarry Smith .ve
2244*d382aafbSBarry Smith    or at runtime via the option
2245*d382aafbSBarry Smith .vb
2246*d382aafbSBarry Smith     -random_type my_random_name
2247*d382aafbSBarry Smith .ve
2248*d382aafbSBarry Smith 
2249*d382aafbSBarry Smith   Notes: $PETSC_ARCH occuring in pathname will be replaced with appropriate values.
2250*d382aafbSBarry Smith 
2251*d382aafbSBarry Smith          For an example of the code needed to interface your own random number generator see
2252*d382aafbSBarry Smith          src/sys/random/impls/rand/rand.c
2253*d382aafbSBarry Smith 
2254*d382aafbSBarry Smith   Level: advanced
2255*d382aafbSBarry Smith 
2256*d382aafbSBarry Smith .keywords: PetscRandom, register
2257*d382aafbSBarry Smith .seealso: PetscRandomRegisterAll(), PetscRandomRegisterDestroy(), PetscRandomRegister()
2258*d382aafbSBarry Smith M*/
2259*d382aafbSBarry Smith #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
2260*d382aafbSBarry Smith #define PetscRandomRegisterDynamic(a,b,c,d) PetscRandomRegister(a,b,c,0)
2261*d382aafbSBarry Smith #else
2262*d382aafbSBarry Smith #define PetscRandomRegisterDynamic(a,b,c,d) PetscRandomRegister(a,b,c,d)
2263*d382aafbSBarry Smith #endif
2264*d382aafbSBarry Smith 
2265*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomCreate(MPI_Comm,PetscRandom*);
2266*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetValue(PetscRandom,PetscScalar*);
2267*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetValueReal(PetscRandom,PetscReal*);
2268*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetInterval(PetscRandom,PetscScalar*,PetscScalar*);
2269*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetInterval(PetscRandom,PetscScalar,PetscScalar);
2270*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSetSeed(PetscRandom,unsigned long);
2271*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomGetSeed(PetscRandom,unsigned long *);
2272*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomSeed(PetscRandom);
2273*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscRandomDestroy(PetscRandom);
2274*d382aafbSBarry Smith 
2275*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFullPath(const char[],char[],size_t);
2276*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetRelativePath(const char[],char[],size_t);
2277*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetWorkingDirectory(char[],size_t);
2278*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetRealPath(const char[],char[]);
2279*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetHomeDirectory(char[],size_t);
2280*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTestFile(const char[],char,PetscTruth*);
2281*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscTestDirectory(const char[],char,PetscTruth*);
2282*d382aafbSBarry Smith 
2283*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryRead(int,void*,PetscInt,PetscDataType);
2284*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySynchronizedRead(MPI_Comm,int,void*,PetscInt,PetscDataType);
2285*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySynchronizedWrite(MPI_Comm,int,void*,PetscInt,PetscDataType,PetscTruth);
2286*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryWrite(int,void*,PetscInt,PetscDataType,PetscTruth);
2287*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryOpen(const char[],PetscFileMode,int *);
2288*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinaryClose(int);
2289*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSharedTmp(MPI_Comm,PetscTruth *);
2290*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSharedWorkingDirectory(MPI_Comm,PetscTruth *);
2291*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetTmp(MPI_Comm,char[],size_t);
2292*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscFileRetrieve(MPI_Comm,const char[],char[],size_t,PetscTruth*);
2293*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLs(MPI_Comm,const char[],char[],size_t,PetscTruth*);
2294*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscOpenSocket(char*,int,int*);
2295*d382aafbSBarry Smith 
2296*d382aafbSBarry Smith /*
2297*d382aafbSBarry Smith    In binary files variables are stored using the following lengths,
2298*d382aafbSBarry Smith   regardless of how they are stored in memory on any one particular
2299*d382aafbSBarry Smith   machine. Use these rather then sizeof() in computing sizes for
2300*d382aafbSBarry Smith   PetscBinarySeek().
2301*d382aafbSBarry Smith */
2302*d382aafbSBarry Smith #define PETSC_BINARY_INT_SIZE    (32/8)
2303*d382aafbSBarry Smith #define PETSC_BINARY_FLOAT_SIZE  (32/8)
2304*d382aafbSBarry Smith #define PETSC_BINARY_CHAR_SIZE    (8/8)
2305*d382aafbSBarry Smith #define PETSC_BINARY_SHORT_SIZE  (16/8)
2306*d382aafbSBarry Smith #define PETSC_BINARY_DOUBLE_SIZE (64/8)
2307*d382aafbSBarry Smith #define PETSC_BINARY_SCALAR_SIZE sizeof(PetscScalar)
2308*d382aafbSBarry Smith 
2309*d382aafbSBarry Smith /*E
2310*d382aafbSBarry Smith   PetscBinarySeekType - argument to PetscBinarySeek()
2311*d382aafbSBarry Smith 
2312*d382aafbSBarry Smith   Level: advanced
2313*d382aafbSBarry Smith 
2314*d382aafbSBarry Smith .seealso: PetscBinarySeek(), PetscBinarySynchronizedSeek()
2315*d382aafbSBarry Smith E*/
2316*d382aafbSBarry Smith typedef enum {PETSC_BINARY_SEEK_SET = 0,PETSC_BINARY_SEEK_CUR = 1,PETSC_BINARY_SEEK_END = 2} PetscBinarySeekType;
2317*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySeek(int,off_t,PetscBinarySeekType,off_t*);
2318*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscBinarySynchronizedSeek(MPI_Comm,int,off_t,PetscBinarySeekType,off_t*);
2319*d382aafbSBarry Smith 
2320*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDebugTerminal(const char[]);
2321*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDebugger(const char[],PetscTruth);
2322*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDefaultDebugger(void);
2323*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSetDebuggerFromString(char*);
2324*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscAttachDebugger(void);
2325*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscStopForDebugger(void);
2326*d382aafbSBarry Smith 
2327*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGatherNumberOfMessages(MPI_Comm,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt*);
2328*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGatherMessageLengths(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**);
2329*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGatherMessageLengths2(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscMPIInt**,PetscMPIInt**,PetscMPIInt**);
2330*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPostIrecvInt(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscInt***,MPI_Request**);
2331*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscPostIrecvScalar(MPI_Comm,PetscMPIInt,PetscMPIInt,const PetscMPIInt[],const PetscMPIInt[],PetscScalar***,MPI_Request**);
2332*d382aafbSBarry Smith 
2333*d382aafbSBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscSSEIsEnabled(MPI_Comm,PetscTruth *,PetscTruth *);
2334*d382aafbSBarry Smith 
2335*d382aafbSBarry Smith /*E
2336*d382aafbSBarry Smith   InsertMode - Whether entries are inserted or added into vectors or matrices
2337*d382aafbSBarry Smith 
2338*d382aafbSBarry Smith   Level: beginner
2339*d382aafbSBarry Smith 
2340*d382aafbSBarry Smith .seealso: VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
2341*d382aafbSBarry Smith           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(),
2342*d382aafbSBarry Smith           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd()
2343*d382aafbSBarry Smith E*/
2344*d382aafbSBarry Smith typedef enum {NOT_SET_VALUES, INSERT_VALUES, ADD_VALUES, MAX_VALUES} InsertMode;
2345*d382aafbSBarry Smith 
2346*d382aafbSBarry Smith /*MC
2347*d382aafbSBarry Smith     INSERT_VALUES - Put a value into a vector or matrix, overwrites any previous value
2348*d382aafbSBarry Smith 
2349*d382aafbSBarry Smith     Level: beginner
2350*d382aafbSBarry Smith 
2351*d382aafbSBarry Smith .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
2352*d382aafbSBarry Smith           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES,
2353*d382aafbSBarry Smith           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd()
2354*d382aafbSBarry Smith 
2355*d382aafbSBarry Smith M*/
2356*d382aafbSBarry Smith 
2357*d382aafbSBarry Smith /*MC
2358*d382aafbSBarry Smith     ADD_VALUES - Adds a value into a vector or matrix, if there previously was no value, just puts the
2359*d382aafbSBarry Smith                 value into that location
2360*d382aafbSBarry Smith 
2361*d382aafbSBarry Smith     Level: beginner
2362*d382aafbSBarry Smith 
2363*d382aafbSBarry Smith .seealso: InsertMode, VecSetValues(), MatSetValues(), VecSetValue(), VecSetValuesBlocked(),
2364*d382aafbSBarry Smith           VecSetValuesLocal(), VecSetValuesBlockedLocal(), MatSetValuesBlocked(), ADD_VALUES, INSERT_VALUES,
2365*d382aafbSBarry Smith           MatSetValuesBlockedLocal(), MatSetValuesLocal(), VecScatterBegin(), VecScatterEnd()
2366*d382aafbSBarry Smith 
2367*d382aafbSBarry Smith M*/
2368*d382aafbSBarry Smith 
2369*d382aafbSBarry Smith /*MC
2370*d382aafbSBarry Smith     MAX_VALUES - Puts the maximum of the scattered/gathered value and the current value into each location
2371*d382aafbSBarry Smith 
2372*d382aafbSBarry Smith     Level: beginner
2373*d382aafbSBarry Smith 
2374*d382aafbSBarry Smith .seealso: InsertMode, VecScatterBegin(), VecScatterEnd(), ADD_VALUES, INSERT_VALUES
2375*d382aafbSBarry Smith 
2376*d382aafbSBarry Smith M*/
2377*d382aafbSBarry Smith 
2378*d382aafbSBarry Smith /*E
2379*d382aafbSBarry Smith   ScatterMode - Determines the direction of a scatter
2380*d382aafbSBarry Smith 
2381*d382aafbSBarry Smith   Level: beginner
2382*d382aafbSBarry Smith 
2383*d382aafbSBarry Smith .seealso: VecScatter, VecScatterBegin(), VecScatterEnd()
2384*d382aafbSBarry Smith E*/
2385*d382aafbSBarry Smith typedef enum {SCATTER_FORWARD=0, SCATTER_REVERSE=1, SCATTER_FORWARD_LOCAL=2, SCATTER_REVERSE_LOCAL=3, SCATTER_LOCAL=2} ScatterMode;
2386*d382aafbSBarry Smith 
2387*d382aafbSBarry Smith /*MC
2388*d382aafbSBarry Smith     SCATTER_FORWARD - Scatters the values as dictated by the VecScatterCreate() call
2389*d382aafbSBarry Smith 
2390*d382aafbSBarry Smith     Level: beginner
2391*d382aafbSBarry Smith 
2392*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD_LOCAL,
2393*d382aafbSBarry Smith           SCATTER_REVERSE_LOCAL
2394*d382aafbSBarry Smith 
2395*d382aafbSBarry Smith M*/
2396*d382aafbSBarry Smith 
2397*d382aafbSBarry Smith /*MC
2398*d382aafbSBarry Smith     SCATTER_REVERSE - Moves the values in the opposite direction then the directions indicated in
2399*d382aafbSBarry Smith          in the VecScatterCreate()
2400*d382aafbSBarry Smith 
2401*d382aafbSBarry Smith     Level: beginner
2402*d382aafbSBarry Smith 
2403*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL,
2404*d382aafbSBarry Smith           SCATTER_REVERSE_LOCAL
2405*d382aafbSBarry Smith 
2406*d382aafbSBarry Smith M*/
2407*d382aafbSBarry Smith 
2408*d382aafbSBarry Smith /*MC
2409*d382aafbSBarry Smith     SCATTER_FORWARD_LOCAL - Scatters the values as dictated by the VecScatterCreate() call except NO parallel communication
2410*d382aafbSBarry Smith        is done. Any variables that have be moved between processes are ignored
2411*d382aafbSBarry Smith 
2412*d382aafbSBarry Smith     Level: developer
2413*d382aafbSBarry Smith 
2414*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_REVERSE, SCATTER_FORWARD,
2415*d382aafbSBarry Smith           SCATTER_REVERSE_LOCAL
2416*d382aafbSBarry Smith 
2417*d382aafbSBarry Smith M*/
2418*d382aafbSBarry Smith 
2419*d382aafbSBarry Smith /*MC
2420*d382aafbSBarry Smith     SCATTER_REVERSE_LOCAL - Moves the values in the opposite direction then the directions indicated in
2421*d382aafbSBarry Smith          in the VecScatterCreate()  except NO parallel communication
2422*d382aafbSBarry Smith        is done. Any variables that have be moved between processes are ignored
2423*d382aafbSBarry Smith 
2424*d382aafbSBarry Smith     Level: developer
2425*d382aafbSBarry Smith 
2426*d382aafbSBarry Smith .seealso: VecScatter, ScatterMode, VecScatterCreate(), VecScatterBegin(), VecScatterEnd(), SCATTER_FORWARD, SCATTER_FORWARD_LOCAL,
2427*d382aafbSBarry Smith           SCATTER_REVERSE
2428*d382aafbSBarry Smith 
2429*d382aafbSBarry Smith M*/
2430*d382aafbSBarry Smith 
2431*d382aafbSBarry Smith /*S
2432*d382aafbSBarry Smith    PetscSubcomm - Context of MPI subcommunicators, used by PCREDUNDANT
2433*d382aafbSBarry Smith 
2434*d382aafbSBarry Smith    Level: advanced
2435*d382aafbSBarry Smith 
2436*d382aafbSBarry Smith    Concepts: communicator, create
2437*d382aafbSBarry Smith S*/
2438*d382aafbSBarry Smith typedef struct _n_PetscSubcomm* PetscSubcomm;
2439*d382aafbSBarry Smith 
2440*d382aafbSBarry Smith struct _n_PetscSubcomm {
2441*d382aafbSBarry Smith   MPI_Comm   parent;      /* parent communicator */
2442*d382aafbSBarry Smith   MPI_Comm   dupparent;   /* duplicate parent communicator, under which the processors of this subcomm have contiguous rank */
2443*d382aafbSBarry Smith   MPI_Comm   comm;        /* this communicator */
2444*d382aafbSBarry Smith   PetscInt   n;           /* num of subcommunicators under the parent communicator */
2445*d382aafbSBarry Smith   PetscInt   color;       /* color of processors belong to this communicator */
2446*d382aafbSBarry Smith };
2447*d382aafbSBarry Smith 
2448*d382aafbSBarry Smith EXTERN PetscErrorCode PETSCMAT_DLLEXPORT PetscSubcommCreate(MPI_Comm,PetscInt,PetscSubcomm*);
2449*d382aafbSBarry Smith EXTERN PetscErrorCode PETSCMAT_DLLEXPORT PetscSubcommDestroy(PetscSubcomm);
2450*d382aafbSBarry Smith 
2451*d382aafbSBarry Smith PETSC_EXTERN_CXX_END
2452*d382aafbSBarry Smith #endif
2453