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