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