xref: /petsc/include/petsc.h (revision 3c94ec114b93ba0cfbf7331735f0e93b9db506db)
1 /* $Id: petsc.h,v 1.297 2001/09/07 20:13:16 bsmith Exp $ */
2 /*
3    This is the main PETSc include file (for C and C++).  It is included by all
4    other PETSc include files, so it almost never has to be specifically included.
5 */
6 #if !defined(__PETSC_H)
7 #define __PETSC_H
8 /* ========================================================================== */
9 /*
10    This facilitates using C version of PETSc from C++
11 */
12 
13 #if defined(PETSC_USE_EXTERN_CXX) && defined(__cplusplus)
14 #define PETSC_EXTERN_CXX_BEGIN extern "C" {
15 #define PETSC_EXTERN_CXX_END  }
16 #else
17 #define PETSC_EXTERN_CXX_BEGIN
18 #define PETSC_EXTERN_CXX_END
19 #endif
20 /* ========================================================================== */
21 /*
22    Current PETSc version number and release date
23 */
24 #include "petscversion.h"
25 
26 /* ========================================================================== */
27 /*
28    petscconf.h is contained in bmake/${PETSC_ARCH}/petscconf.h it is
29    found automatically by the compiler due to the -I${PETSC_DIR}/bmake/${PETSC_ARCH}
30    in the bmake/common_variables definition of PETSC_INCLUDE
31 */
32 #include "petscconf.h"
33 /*
34    Fixes for configure time choices which impact our interface. Currently only
35    calling conventions and extra compiler checking falls under this category.
36 */
37 #if !defined(PETSC_PRINTF_FORMAT_CHECK)
38 #define PETSC_PRINTF_FORMAT_CHECK(a,b)
39 #endif
40 #if !defined (PETSC_STDCALL)
41 #define PETSC_STDCALL
42 #endif
43 #if !defined (PETSC_TEMPLATE)
44 #define PETSC_TEMPLATE
45 #endif
46 
47 /* ========================================================================== */
48 
49 #include <stdio.h>
50 /*
51     Defines the interface to MPI allowing the use of all MPI functions.
52 */
53 #include "mpi.h"
54 
55 
56 /*
57     Declare extern C stuff after incuding external header files
58 */
59 
60 PETSC_EXTERN_CXX_BEGIN
61 
62 /*
63     EXTERN indicates a PETSc function defined elsewhere
64 */
65 #if !defined(EXTERN)
66 #define EXTERN extern
67 #endif
68 
69 /*
70     Defines some elementary mathematics functions and constants.
71 */
72 #include "petscmath.h"
73 
74 /*
75        Basic PETSc constants
76 */
77 
78 /*E
79     PetscTruth - Logical variable. Actually an integer
80 
81    Level: beginner
82 
83 E*/
84 typedef enum { PETSC_FALSE,PETSC_TRUE } PetscTruth;
85 
86 /*M
87     PETSC_NULL - standard way of passing in a null or array or pointer
88 
89    Level: beginner
90 
91    Notes: accepted by many PETSc functions to not set a parameter and instead use
92           some default
93 
94           This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER,
95           PETSC_NULL_DOUBLE_PRECISION etc
96 
97 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE
98 
99 M*/
100 #define PETSC_NULL           0
101 
102 /*M
103     PETSC_DECIDE - standard way of passing in integer or floating point parameter
104        where you wish PETSc to use the default.
105 
106    Level: beginner
107 
108 .seealso: PETSC_NULL, PETSC_DEFAULT, PETSC_IGNORE, PETSC_DETERMINE
109 
110 M*/
111 #define PETSC_DECIDE         -1
112 
113 /*M
114     PETSC_DEFAULT - standard way of passing in integer or floating point parameter
115        where you wish PETSc to use the default.
116 
117    Level: beginner
118 
119 .seealso: PETSC_DECIDE, PETSC_NULL, PETSC_IGNORE, PETSC_DETERMINE
120 
121 M*/
122 #define PETSC_DEFAULT        -2
123 
124 #define PETSC_YES            PETSC_TRUE
125 #define PETSC_NO             PETSC_FALSE
126 
127 /*M
128     PETSC_IGNORE - same as PETSC_NULL, means PETSc will ignore this argument
129 
130    Level: beginner
131 
132    Notes: accepted by many PETSc functions to not set a parameter and instead use
133           some default
134 
135           This macro does not exist in Fortran; you must use PETSC_NULL_INTEGER,
136           PETSC_NULL_DOUBLE_PRECISION etc
137 
138 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_NULL, PETSC_DETERMINE
139 
140 M*/
141 #define PETSC_IGNORE         PETSC_NULL
142 
143 /*M
144     PETSC_DETERMINE - standard way of passing in integer or floating point parameter
145        where you wish PETSc to compute the required value.
146 
147    Level: beginner
148 
149 .seealso: PETSC_DECIDE, PETSC_DEFAULT, PETSC_IGNORE, PETSC_NULL, VecSetSizes()
150 
151 M*/
152 #define PETSC_DETERMINE      PETSC_DECIDE
153 
154 /*M
155     PETSC_COMM_WORLD - a duplicate of the MPI_COMM_WORLD communicator which represents
156            all the processs
157 
158    Level: beginner
159 
160    Notes: PETSC_COMM_WORLD and MPI_COMM_WORLD are equivalent except that passing MPI_COMM_WORLD
161           into PETSc object constructors will result in using more MPI resources since an MPI_Comm_dup()
162           will be done on it internally. We recommend always using PETSC_COMM_WORLD
163 
164 .seealso: PETSC_COMM_SELF
165 
166 M*/
167 extern MPI_Comm   PETSC_COMM_WORLD;
168 
169 /*M
170     PETSC_COMM_SELF - a duplicate of the MPI_COMM_SELF communicator which represents
171            the current process
172 
173    Level: beginner
174 
175    Notes: PETSC_COMM_SELF and MPI_COMM_SELF are equivalent except that passint MPI_COMM_SELF
176           into PETSc object constructors will result in using more MPI resources since an MPI_Comm_dup()
177           will be done on it internally. We recommend always using PETSC_COMM_SELF
178 
179 .seealso: PETSC_COMM_WORLD
180 
181 M*/
182 extern MPI_Comm   PETSC_COMM_SELF;
183 
184 extern PetscTruth PetscInitializeCalled;
185 EXTERN int        PetscSetCommWorld(MPI_Comm);
186 EXTERN int        PetscSetHelpVersionFunctions(int (*)(MPI_Comm),int (*)(MPI_Comm));
187 EXTERN int        PetscCommDuplicate(MPI_Comm,MPI_Comm*,int*);
188 EXTERN int        PetscCommDestroy(MPI_Comm*);
189 
190 /*MC
191    PetscMalloc - Allocates memory
192 
193    Input Parameter:
194 .  m - number of bytes to allocate
195 
196    Output Parameter:
197 .  result - memory allocated
198 
199    Synopsis:
200    int PetscMalloc(size_t m,void **result)
201 
202    Level: beginner
203 
204    Notes: Memory is always allocated at least double aligned
205 
206 .seealso: PetscFree(), PetscNew()
207 
208   Concepts: memory allocation
209 
210 M*/
211 #define PetscMalloc(a,b)     (*PetscTrMalloc)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__,(void**)(b))
212 /*MC
213    PetscNew - Allocates memory of a particular type
214 
215    Input Parameter:
216 . type - structure name of space to be allocated. Memory of size sizeof(type) is allocated
217 
218    Output Parameter:
219 .  result - memory allocated
220 
221    Synopsis:
222    int PetscNew(struct type,((type *))result)
223 
224    Level: beginner
225 
226 .seealso: PetscFree(), PetscMalloc()
227 
228   Concepts: memory allocation
229 
230 M*/
231 #define PetscNew(A,b)        PetscMalloc(sizeof(A),(b))
232 /*MC
233    PetscFree - Frees memory
234 
235    Input Parameter:
236 .   memory - memory to free
237 
238    Synopsis:
239    int PetscFree(void *memory)
240 
241    Level: beginner
242 
243    Notes: Memory must have been obtained with PetscNew() or PetscMalloc()
244 
245 .seealso: PetscNew(), PetscMalloc()
246 
247   Concepts: memory allocation
248 
249 M*/
250 #define PetscFree(a)         (*PetscTrFree)((a),__LINE__,__FUNCT__,__FILE__,__SDIR__)
251 EXTERN int  (*PetscTrMalloc)(size_t,int,const char[],const char[],const char[],void**);
252 EXTERN int  (*PetscTrFree)(void *,int,const char[],const char[],const char[]);
253 EXTERN int  PetscSetMalloc(int (*)(size_t,int,const char[],const char[],const char[],void**),int (*)(void *,int,const char[],const char[],const char[]));
254 EXTERN int  PetscClearMalloc(void);
255 
256 /*
257    Routines for tracing memory corruption/bleeding with default PETSc
258    memory allocation
259 */
260 EXTERN int   PetscTrDump(FILE *);
261 EXTERN int   PetscTrSpace(PetscLogDouble *,PetscLogDouble *,PetscLogDouble *);
262 EXTERN int   PetscTrValid(int,const char[],const char[],const char[]);
263 EXTERN int   PetscTrDebugLevel(int);
264 EXTERN int   PetscTrLog(void);
265 EXTERN int   PetscTrLogDump(FILE *);
266 EXTERN int   PetscGetResidentSetSize(PetscLogDouble *);
267 
268 /*
269     Variable type where we stash PETSc object pointers in Fortran.
270     Assumes that sizeof(long) == sizeof(void*)which is true on
271     all machines that we know.
272 */
273 #define PetscFortranAddr   long
274 
275 /*E
276     PetscDataType - Used for handling different basic data types.
277 
278    Level: beginner
279 
280 .seealso: PetscBinaryRead(), PetscBinaryWrite(), PetscDataTypeToMPIDataType(),
281           PetscDataTypeGetSize(), PetscDataTypeGetName()
282 
283 E*/
284 typedef enum {PETSC_INT = 0,PETSC_DOUBLE = 1,PETSC_COMPLEX = 2,
285               PETSC_LONG =3 ,PETSC_SHORT = 4,PETSC_FLOAT = 5,
286               PETSC_CHAR = 6,PETSC_LOGICAL = 7} PetscDataType;
287 #if defined(PETSC_USE_COMPLEX)
288 #define PETSC_SCALAR PETSC_COMPLEX
289 #else
290 #if defined(PETSC_USE_SINGLE)
291 #define PETSC_SCALAR PETSC_FLOAT
292 #else
293 #define PETSC_SCALAR PETSC_DOUBLE
294 #endif
295 #endif
296 #if defined(PETSC_USE_SINGLE)
297 #define PETSC_REAL PETSC_FLOAT
298 #else
299 #define PETSC_REAL PETSC_DOUBLE
300 #endif
301 #define PETSC_FORTRANADDR PETSC_LONG
302 
303 EXTERN int PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*);
304 EXTERN int PetscDataTypeGetSize(PetscDataType,int*);
305 EXTERN int PetscDataTypeGetName(PetscDataType,const char*[]);
306 
307 /*
308     Basic memory and string operations. These are usually simple wrappers
309    around the basic Unix system calls, but a few of them have additional
310    functionality and/or error checking.
311 */
312 EXTERN int   PetscMemcpy(void *,const void *,int);
313 EXTERN int   PetscBitMemcpy(void*,int,const void*,int,int,PetscDataType);
314 EXTERN int   PetscMemmove(void *,void *,int);
315 EXTERN int   PetscMemzero(void *,int);
316 EXTERN int   PetscMemcmp(const void*,const void*,int,PetscTruth *);
317 EXTERN int   PetscStrlen(const char[],int*);
318 EXTERN int   PetscStrcmp(const char[],const char[],PetscTruth *);
319 EXTERN int   PetscStrgrt(const char[],const char[],PetscTruth *);
320 EXTERN int   PetscStrcasecmp(const char[],const char[],PetscTruth*);
321 EXTERN int   PetscStrncmp(const char[],const char[],int,PetscTruth*);
322 EXTERN int   PetscStrcpy(char[],const char[]);
323 EXTERN int   PetscStrcat(char[],const char[]);
324 EXTERN int   PetscStrncat(char[],const char[],int);
325 EXTERN int   PetscStrncpy(char[],const char[],int);
326 EXTERN int   PetscStrchr(const char[],char,char *[]);
327 EXTERN int   PetscStrtolower(char[]);
328 EXTERN int   PetscStrrchr(const char[],char,char *[]);
329 EXTERN int   PetscStrstr(const char[],const char[],char *[]);
330 EXTERN int   PetscStrallocpy(const char[],char *[]);
331 EXTERN int   PetscStrreplace(MPI_Comm,const char[],char[],int);
332 #define      PetscStrfree(a) ((a) ? PetscFree(a) : 0)
333 typedef struct {char token;char *array;char *current;} PetscToken;
334 EXTERN int   PetscTokenCreate(const char[],const char,PetscToken**);
335 EXTERN int   PetscTokenFind(PetscToken*,char *[]);
336 EXTERN int   PetscTokenDestroy(PetscToken*);
337 
338 /*
339    These are  MPI operations for MPI_Allreduce() etc
340 */
341 EXTERN MPI_Op PetscMaxSum_Op;
342 #if defined(PETSC_USE_COMPLEX)
343 EXTERN MPI_Op PetscSum_Op;
344 #else
345 #define PetscSum_Op MPI_SUM
346 #endif
347 EXTERN int PetscMaxSum(MPI_Comm,const int[],int*,int*);
348 
349 /*S
350      PetscObject - any PETSc object, PetscViewer, Mat, Vec, KSP etc
351 
352    Level: beginner
353 
354    Note: This is the base class from which all objects appear.
355 
356 .seealso:  PetscObjectDestroy(), PetscObjectView(), PetscObjectGetName(), PetscObjectSetName()
357 S*/
358 typedef struct _p_PetscObject* PetscObject;
359 
360 /*S
361      PetscFList - Linked list of functions, possibly stored in dynamic libraries, accessed
362       by string name
363 
364    Level: advanced
365 
366 .seealso:  PetscFListAdd(), PetscFListDestroy()
367 S*/
368 typedef struct _PetscFList *PetscFList;
369 
370 #include "petscviewer.h"
371 #include "petscoptions.h"
372 
373 EXTERN int PetscShowMemoryUsage(PetscViewer,const char[]);
374 EXTERN int PetscGetTime(PetscLogDouble*);
375 EXTERN int PetscGetCPUTime(PetscLogDouble*);
376 EXTERN int PetscSleep(int);
377 
378 /*
379     Initialization of PETSc
380 */
381 EXTERN int  PetscInitialize(int*,char***,const char[],const char[]);
382 EXTERN int  PetscInitializeNoArguments(void);
383 EXTERN int  PetscFinalize(void);
384 EXTERN int  PetscInitializeFortran(void);
385 EXTERN int  PetscGetArgs(int*,char ***);
386 EXTERN int  PetscEnd(void);
387 
388 /*
389    ParameterDict is an abstraction for arguments to interface mechanisms
390 */
391 extern int DICT_COOKIE;
392 typedef struct _p_Dict *ParameterDict;
393 
394 typedef void (**PetscVoidFunction)(void);
395 
396 /*
397    PetscTryMethod - Queries an object for a method, if it exists then calls it.
398           Can support argument checking. This was an experiment that seems to work ok
399           (see KSPGMRESSetRestart()) but we never followed through on it.
400 */
401 #if defined(PETSC_FORTRAN_STUBS)
402 #define  PetscTryMethod(obj,A,B,C) \
403   0;{ int (*f)B; \
404    *ierr = PetscObjectQueryFunction((PetscObject)obj,#A,(PetscVoidFunction)&f);if (*ierr) return; \
405     if (f) {*ierr = (*f)C;if (*ierr) return;}\
406   }
407 #else
408 #define  PetscTryMethod(obj,A,B,C) \
409   0;{ int (*f)B, __ierr; \
410     __ierr = PetscObjectQueryFunction((PetscObject)obj,#A,(PetscVoidFunction)&f);CHKERRQ(__ierr); \
411     if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\
412   }
413 #endif
414 
415 /*
416     Functions that can act on any PETSc object.
417 */
418 EXTERN int PetscObjectDestroy(PetscObject);
419 EXTERN int PetscObjectExists(PetscObject,PetscTruth*);
420 EXTERN int PetscObjectGetComm(PetscObject,MPI_Comm *);
421 EXTERN int PetscObjectGetCookie(PetscObject,int *);
422 EXTERN int PetscObjectGetType(PetscObject,int *);
423 EXTERN int PetscObjectSetName(PetscObject,const char[]);
424 EXTERN int PetscObjectGetName(PetscObject,char*[]);
425 EXTERN int PetscObjectReference(PetscObject);
426 EXTERN int PetscObjectGetReference(PetscObject,int*);
427 EXTERN int PetscObjectDereference(PetscObject);
428 EXTERN int PetscObjectGetNewTag(PetscObject,int *);
429 EXTERN int PetscObjectSetParameterDict(PetscObject,ParameterDict);
430 EXTERN int PetscObjectGetParameterDict(PetscObject,ParameterDict*);
431 EXTERN int PetscCommGetNewTag(MPI_Comm,int *);
432 EXTERN int PetscObjectView(PetscObject,PetscViewer);
433 EXTERN int PetscObjectCompose(PetscObject,const char[],PetscObject);
434 EXTERN int PetscObjectQuery(PetscObject,const char[],PetscObject *);
435 EXTERN int PetscObjectComposeFunction(PetscObject,const char[],const char[],void (*)(void));
436 
437 typedef void (*FCNVOID)(void); /* cast in next macro should never be extern C */
438 typedef int  (*FCNINTVOID)(void); /* used in casts to make sure they are not extern C */
439 /*MC
440    PetscObjectComposeFunctionDynamic - Associates a function with a given PETSc object.
441 
442    Collective on PetscObject
443 
444    Input Parameters:
445 +  obj - the PETSc object; this must be cast with a (PetscObject), for example,
446          PetscObjectCompose((PetscObject)mat,...);
447 .  name - name associated with the child function
448 .  fname - name of the function
449 -  ptr - function pointer (or PETSC_NULL if using dynamic libraries)
450 
451    Level: advanced
452 
453     Synopsis:
454     int PetscObjectComposeFunctionDynamic(PetscObject obj,const char name[],const char fname[],void *ptr)
455 
456    Notes:
457    PetscObjectComposeFunctionDynamic() can be used with any PETSc object (such as
458    Mat, Vec, KSP, SNES, etc.) or any user-provided object.
459 
460    The composed function must be wrapped in a EXTERN_C_BEGIN/END for this to
461    work in C++/complex with dynamic link libraries (PETSC_USE_DYNAMIC_LIBRARIES)
462    enabled.
463 
464    Concepts: objects^composing functions
465    Concepts: composing functions
466    Concepts: functions^querying
467    Concepts: objects^querying
468    Concepts: querying objects
469 
470 .seealso: PetscObjectQueryFunction()
471 M*/
472 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
473 #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,0)
474 #else
475 #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,(FCNVOID)(d))
476 #endif
477 
478 EXTERN int PetscObjectQueryFunction(PetscObject,const char[],void (**)(void));
479 EXTERN int PetscObjectSetOptionsPrefix(PetscObject,const char[]);
480 EXTERN int PetscObjectAppendOptionsPrefix(PetscObject,const char[]);
481 EXTERN int PetscObjectPrependOptionsPrefix(PetscObject,const char[]);
482 EXTERN int PetscObjectGetOptionsPrefix(PetscObject,char*[]);
483 EXTERN int PetscObjectPublish(PetscObject);
484 EXTERN int PetscObjectChangeTypeName(PetscObject,const char[]);
485 EXTERN int PetscObjectRegisterDestroy(PetscObject);
486 EXTERN int PetscObjectRegisterDestroyAll(void);
487 EXTERN int PetscObjectName(PetscObject);
488 EXTERN int PetscTypeCompare(PetscObject,const char[],PetscTruth*);
489 
490 /*
491     Defines PETSc error handling.
492 */
493 #include "petscerror.h"
494 
495 /*S
496      PetscOList - Linked list of PETSc objects, accessable by string name
497 
498    Level: advanced
499 
500 .seealso:  PetscOListAdd(), PetscOListDestroy(), PetscOListFind()
501 S*/
502 typedef struct _PetscOList *PetscOList;
503 
504 EXTERN int PetscOListDestroy(PetscOList *);
505 EXTERN int PetscOListFind(PetscOList,const char[],PetscObject*);
506 EXTERN int PetscOListReverseFind(PetscOList,PetscObject,char**);
507 EXTERN int PetscOListAdd(PetscOList *,const char[],PetscObject);
508 EXTERN int PetscOListDuplicate(PetscOList,PetscOList *);
509 
510 /*
511     Dynamic library lists. Lists of names of routines in dynamic
512   link libraries that will be loaded as needed.
513 */
514 EXTERN int PetscFListAdd(PetscFList*,const char[],const char[],void (*)(void));
515 EXTERN int PetscFListDestroy(PetscFList*);
516 EXTERN int PetscFListFind(MPI_Comm,PetscFList,const char[],void (**)(void));
517 EXTERN int PetscFListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFList);
518 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
519 #define    PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,0)
520 #else
521 #define    PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,(void (*)(void))c)
522 #endif
523 EXTERN int PetscFListDuplicate(PetscFList,PetscFList *);
524 EXTERN int PetscFListView(PetscFList,PetscViewer);
525 EXTERN int PetscFListConcat(const char [],const char [],char []);
526 EXTERN int PetscFListGet(PetscFList,char ***,int*);
527 
528 /*S
529      PetscDLLibraryList - Linked list of dynamics libraries to search for functions
530 
531    Level: advanced
532 
533    PETSC_USE_DYNAMIC_LIBRARIES must be defined in petscconf.h to use dynamic libraries
534 
535 .seealso:  PetscDLLibraryOpen()
536 S*/
537 typedef struct _PetscDLLibraryList *PetscDLLibraryList;
538 extern PetscDLLibraryList DLLibrariesLoaded;
539 EXTERN int PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,int,PetscTruth *);
540 EXTERN int PetscDLLibraryOpen(MPI_Comm,const char[],void **);
541 EXTERN int PetscDLLibrarySym(MPI_Comm,PetscDLLibraryList *,const char[],const char[],void **);
542 EXTERN int PetscDLLibraryAppend(MPI_Comm,PetscDLLibraryList *,const char[]);
543 EXTERN int PetscDLLibraryPrepend(MPI_Comm,PetscDLLibraryList *,const char[]);
544 EXTERN int PetscDLLibraryClose(PetscDLLibraryList);
545 EXTERN int PetscDLLibraryPrintPath(void);
546 EXTERN int PetscDLLibraryGetInfo(void *,const char[],const char *[]);
547 
548 /*
549     Mechanism for translating PETSc object representations between languages
550     Not currently used.
551 */
552 typedef enum {PETSC_LANGUAGE_C,PETSC_LANGUAGE_CPP} PetscLanguage;
553 #define PETSC_LANGUAGE_F77 PETSC_LANGUAGE_C
554 EXTERN int PetscObjectComposeLanguage(PetscObject,PetscLanguage,void *);
555 EXTERN int PetscObjectQueryLanguage(PetscObject,PetscLanguage,void **);
556 
557 /*
558      Useful utility routines
559 */
560 EXTERN int PetscSplitOwnership(MPI_Comm,int*,int*);
561 EXTERN int PetscSplitOwnershipBlock(MPI_Comm,int,int*,int*);
562 EXTERN int PetscSequentialPhaseBegin(MPI_Comm,int);
563 EXTERN int PetscSequentialPhaseEnd(MPI_Comm,int);
564 EXTERN int PetscBarrier(PetscObject);
565 EXTERN int PetscMPIDump(FILE*);
566 
567 #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
568 /*
569     Defines basic graphics available from PETSc.
570 */
571 #include "petscdraw.h"
572 
573 /*
574     Defines the base data structures for all PETSc objects
575 */
576 #include "petschead.h"
577 
578 /*
579      Defines PETSc profiling.
580 */
581 #include "petsclog.h"
582 
583 /*
584           For locking, unlocking and destroying AMS memories associated with
585     PETSc objects
586 */
587 #if defined(PETSC_HAVE_AMS)
588 
589 extern PetscTruth PetscAMSPublishAll;
590 #define PetscPublishAll(v) (PetscAMSPublishAll ? PetscObjectPublish((PetscObject)v) : 0)
591 #define PetscObjectTakeAccess(obj)  ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_take_access(((PetscObject)(obj))->amem))
592 #define PetscObjectGrantAccess(obj) ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_grant_access(((PetscObject)(obj))->amem))
593 #define PetscObjectDepublish(obj)   ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_destroy(((PetscObject)(obj))->amem)); \
594     ((PetscObject)(obj))->amem = -1;
595 
596 #else
597 
598 #define PetscPublishAll(v)           0
599 #define PetscObjectTakeAccess(obj)   0
600 #define PetscObjectGrantAccess(obj)  0
601 #define PetscObjectDepublish(obj)      0
602 
603 #endif
604 
605 
606 
607 /*
608       This code allows one to pass a MPI communicator between
609     C and Fortran. MPI 2.0 defines a standard API for doing this.
610     The code here is provided to allow PETSc to work with MPI 1.1
611     standard MPI libraries.
612 */
613 EXTERN int  MPICCommToFortranComm(MPI_Comm,int *);
614 EXTERN int  MPIFortranCommToCComm(int,MPI_Comm*);
615 
616 /*
617       Simple PETSc parallel IO for ASCII printing
618 */
619 EXTERN int  PetscFixFilename(const char[],char[]);
620 EXTERN int  PetscFOpen(MPI_Comm,const char[],const char[],FILE**);
621 EXTERN int  PetscFClose(MPI_Comm,FILE*);
622 EXTERN int  PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
623 EXTERN int  PetscPrintf(MPI_Comm,const char[],...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
624 
625 /*MC
626     PetscErrorPrintf - Prints error messages.
627 
628     Not Collective
629 
630    Synopsis:
631      int (*PetscErrorPrintf)(const char format[],...);
632 
633     Input Parameters:
634 .   format - the usual printf() format string
635 
636    Options Database Keys:
637 .    -error_output_stderr - cause error messages to be printed to stderr instead of the
638          (default) stdout
639 
640 
641    Level: developer
642 
643     Fortran Note:
644     This routine is not supported in Fortran.
645 
646     Concepts: error messages^printing
647     Concepts: printing^error messages
648 
649 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf()
650 M*/
651 EXTERN int  (*PetscErrorPrintf)(const char[],...);
652 
653 /*MC
654     PetscHelpPrintf - Prints help messages.
655 
656     Not Collective
657 
658    Synopsis:
659      int (*PetscHelpPrintf)(const char format[],...);
660 
661     Input Parameters:
662 .   format - the usual printf() format string
663 
664    Level: developer
665 
666     Fortran Note:
667     This routine is not supported in Fortran.
668 
669     Concepts: help messages^printing
670     Concepts: printing^help messages
671 
672 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf()
673 M*/
674 EXTERN int  (*PetscHelpPrintf)(MPI_Comm,const char[],...);
675 
676 EXTERN int  PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **);
677 EXTERN int  PetscPClose(MPI_Comm,FILE*);
678 EXTERN int  PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
679 EXTERN int  PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
680 EXTERN int  PetscSynchronizedFlush(MPI_Comm);
681 EXTERN int  PetscSynchronizedFGets(MPI_Comm,FILE*,int,char[]);
682 EXTERN int  PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**);
683 EXTERN int  PetscStartJava(MPI_Comm,const char[],const char[],FILE**);
684 EXTERN int  PetscGetPetscDir(const char*[]);
685 
686 EXTERN int  PetscPopUpSelect(MPI_Comm,char*,char*,int,char**,int*);
687 /*S
688      PetscObjectContainer - Simple PETSc object that contains a pointer to any required data
689 
690    Level: advanced
691 
692 .seealso:  PetscObject, PetscObjectContainerCreate()
693 S*/
694 typedef struct _p_PetscObjectContainer*  PetscObjectContainer;
695 EXTERN int PetscObjectContainerGetPointer(PetscObjectContainer,void **);
696 EXTERN int PetscObjectContainerSetPointer(PetscObjectContainer,void *);
697 EXTERN int PetscObjectContainerDestroy(PetscObjectContainer);
698 EXTERN int PetscObjectContainerCreate(MPI_Comm comm,PetscObjectContainer *);
699 
700 /*
701    For incremental debugging
702 */
703 extern PetscTruth PetscCompare;
704 EXTERN int        PetscCompareDouble(double);
705 EXTERN int        PetscCompareScalar(PetscScalar);
706 EXTERN int        PetscCompareInt(int);
707 
708 /*
709    For use in debuggers
710 */
711 extern int PetscGlobalRank,PetscGlobalSize;
712 EXTERN int PetscIntView(int,int[],PetscViewer);
713 EXTERN int PetscRealView(int,PetscReal[],PetscViewer);
714 EXTERN int PetscScalarView(int,PetscScalar[],PetscViewer);
715 
716 /*
717     Allows accessing Matlab Engine
718 */
719 #include "petscmatlab.h"
720 
721 /*
722     C code optimization is often enhanced by telling the compiler
723   that certain pointer arguments to functions are not aliased to
724   to other arguments. This is not yet ANSI C standard so we define
725   the macro "restrict" to indicate that the variable is not aliased
726   to any other argument.
727 */
728 #if defined(PETSC_HAVE_RESTRICT) && !defined(__cplusplus)
729 #define restrict _Restrict
730 #else
731 #if defined(restrict)
732 #undef restrict
733 #endif
734 #define restrict
735 #endif
736 
737 /*
738       Determine if some of the kernel computation routines use
739    Fortran (rather than C) for the numerical calculations. On some machines
740    and compilers (like complex numbers) the Fortran version of the routines
741    is faster than the C/C++ versions. The flag PETSC_USE_FORTRAN_KERNELS
742    would be set in the petscconf.h file
743 */
744 #if defined(PETSC_USE_FORTRAN_KERNELS)
745 
746 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
747 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
748 #endif
749 
750 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
751 #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
752 #endif
753 
754 #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
755 #define PETSC_USE_FORTRAN_KERNEL_NORM
756 #endif
757 
758 #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
759 #define PETSC_USE_FORTRAN_KERNEL_MAXPY
760 #endif
761 
762 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
763 #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
764 #endif
765 
766 #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
767 #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
768 #endif
769 
770 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
771 #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
772 #endif
773 
774 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
775 #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
776 #endif
777 
778 #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
779 #define PETSC_USE_FORTRAN_KERNEL_MDOT
780 #endif
781 
782 #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
783 #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
784 #endif
785 
786 #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
787 #define PETSC_USE_FORTRAN_KERNEL_AYPX
788 #endif
789 
790 #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
791 #define PETSC_USE_FORTRAN_KERNEL_WAXPY
792 #endif
793 
794 #endif
795 
796 /*
797     Macros for indicating code that should be compiled with a C interface,
798    rather than a C++ interface. Any routines that are dynamically loaded
799    (such as the PCCreate_XXX() routines) must be wrapped so that the name
800    mangler does not change the functions symbol name. This just hides the
801    ugly extern "C" {} wrappers.
802 */
803 #if defined(__cplusplus)
804 #define EXTERN_C_BEGIN extern "C" {
805 #define EXTERN_C_END }
806 #else
807 #define EXTERN_C_BEGIN
808 #define EXTERN_C_END
809 #endif
810 
811 /* --------------------------------------------------------------------*/
812 
813 /*M
814     size - integer variable used to contain the number of processors in
815            the relevent MPI_Comm
816 
817    Level: beginner
818 
819 .seealso: rank, comm
820 M*/
821 
822 /*M
823     rank - integer variable used to contain the number of this processor relative
824            to all in the relevent MPI_Comm
825 
826    Level: beginner
827 
828 .seealso: size, comm
829 M*/
830 
831 /*M
832     comm - MPI_Comm used in the current routine or object
833 
834    Level: beginner
835 
836 .seealso: size, rank
837 M*/
838 
839 /*M
840     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
841         communication
842 
843    Level: beginner
844 
845    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
846 
847 .seealso: size, rank, comm, PETSC_COMM_WORLD, PETSC_COMM_SELF
848 M*/
849 
850 /*M
851     PetscScalar - PETSc type that represents either a double precision real number or
852        a double precision complex number if the code is compiled with BOPT=g_complex or O_complex
853 
854    Level: beginner
855 
856 .seealso: PetscReal, PassiveReal, PassiveScalar
857 M*/
858 
859 /*M
860     PetscReal - PETSc type that represents a double precision real number
861 
862    Level: beginner
863 
864 .seealso: PetscScalar, PassiveReal, PassiveScalar
865 M*/
866 
867 /*M
868     PassiveScalar - PETSc type that represents either a double precision real number or
869        a double precision complex number if the code is compiled with BOPT=g_complex or O_complex
870 
871    Level: beginner
872 
873     This is the same as a PetscScalar except in code that is automatically differentiated it is
874    treated as a constant (not an indendent or dependent variable)
875 
876 .seealso: PetscReal, PassiveReal, PetscScalar
877 M*/
878 
879 /*M
880     PassiveReal - PETSc type that represents a double precision real number
881 
882    Level: beginner
883 
884     This is the same as a PetscReal except in code that is automatically differentiated it is
885    treated as a constant (not an indendent or dependent variable)
886 
887 .seealso: PetscScalar, PetscReal, PassiveScalar
888 M*/
889 
890 /*
891      The IBM include files define hz, here we hide it so that it may be used
892    as a regular user variable.
893 */
894 #if defined(hz)
895 #undef hz
896 #endif
897 
898 /*  For arrays that contain filenames or paths */
899 
900 
901 #if defined(PETSC_HAVE_LIMITS_H)
902 #include <limits.h>
903 #endif
904 #if defined(PETSC_HAVE_SYS_PARAM_H)
905 #include <sys/param.h>
906 #endif
907 
908 #if defined(MAXPATHLEN)
909 #  define PETSC_MAX_PATH_LEN     MAXPATHLEN
910 #elif defined(MAX_PATH)
911 #  define PETSC_MAX_PATH_LEN     MAX_PATH
912 #elif defined(_MAX_PATH)
913 #  define PETSC_MAX_PATH_LEN     _MAX_PATH
914 #else
915 #  define PETSC_MAX_PATH_LEN     4096
916 #endif
917 
918 PETSC_EXTERN_CXX_END
919 #endif
920 
921 
922