xref: /petsc/include/petsc.h (revision 4482741e5b2e2bbc854fb1f8dba65221386520f2)
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 /*MC
439    PetscObjectComposeFunctionDynamic - Associates a function with a given PETSc object.
440 
441    Collective on PetscObject
442 
443    Input Parameters:
444 +  obj - the PETSc object; this must be cast with a (PetscObject), for example,
445          PetscObjectCompose((PetscObject)mat,...);
446 .  name - name associated with the child function
447 .  fname - name of the function
448 -  ptr - function pointer (or PETSC_NULL if using dynamic libraries)
449 
450    Level: advanced
451 
452     Synopsis:
453     int PetscObjectComposeFunctionDynamic(PetscObject obj,const char name[],const char fname[],void *ptr)
454 
455    Notes:
456    PetscObjectComposeFunctionDynamic() can be used with any PETSc object (such as
457    Mat, Vec, KSP, SNES, etc.) or any user-provided object.
458 
459    The composed function must be wrapped in a EXTERN_C_BEGIN/END for this to
460    work in C++/complex with dynamic link libraries (PETSC_USE_DYNAMIC_LIBRARIES)
461    enabled.
462 
463    Concepts: objects^composing functions
464    Concepts: composing functions
465    Concepts: functions^querying
466    Concepts: objects^querying
467    Concepts: querying objects
468 
469 .seealso: PetscObjectQueryFunction()
470 M*/
471 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
472 #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,0)
473 #else
474 #define PetscObjectComposeFunctionDynamic(a,b,c,d) PetscObjectComposeFunction(a,b,c,(FCNVOID)(d))
475 #endif
476 
477 EXTERN int PetscObjectQueryFunction(PetscObject,const char[],void (**)(void));
478 EXTERN int PetscObjectSetOptionsPrefix(PetscObject,const char[]);
479 EXTERN int PetscObjectAppendOptionsPrefix(PetscObject,const char[]);
480 EXTERN int PetscObjectPrependOptionsPrefix(PetscObject,const char[]);
481 EXTERN int PetscObjectGetOptionsPrefix(PetscObject,char*[]);
482 EXTERN int PetscObjectPublish(PetscObject);
483 EXTERN int PetscObjectChangeTypeName(PetscObject,const char[]);
484 EXTERN int PetscObjectRegisterDestroy(PetscObject);
485 EXTERN int PetscObjectRegisterDestroyAll(void);
486 EXTERN int PetscObjectName(PetscObject);
487 EXTERN int PetscTypeCompare(PetscObject,const char[],PetscTruth*);
488 
489 /*
490     Defines PETSc error handling.
491 */
492 #include "petscerror.h"
493 
494 /*S
495      PetscOList - Linked list of PETSc objects, accessable by string name
496 
497    Level: advanced
498 
499 .seealso:  PetscOListAdd(), PetscOListDestroy(), PetscOListFind()
500 S*/
501 typedef struct _PetscOList *PetscOList;
502 
503 EXTERN int PetscOListDestroy(PetscOList *);
504 EXTERN int PetscOListFind(PetscOList,const char[],PetscObject*);
505 EXTERN int PetscOListReverseFind(PetscOList,PetscObject,char**);
506 EXTERN int PetscOListAdd(PetscOList *,const char[],PetscObject);
507 EXTERN int PetscOListDuplicate(PetscOList,PetscOList *);
508 
509 /*
510     Dynamic library lists. Lists of names of routines in dynamic
511   link libraries that will be loaded as needed.
512 */
513 EXTERN int PetscFListAdd(PetscFList*,const char[],const char[],void (*)(void));
514 EXTERN int PetscFListDestroy(PetscFList*);
515 EXTERN int PetscFListFind(MPI_Comm,PetscFList,const char[],void (**)(void));
516 EXTERN int PetscFListPrintTypes(MPI_Comm,FILE*,const char[],const char[],const char[],const char[],PetscFList);
517 #if defined(PETSC_USE_DYNAMIC_LIBRARIES)
518 #define    PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,0)
519 #else
520 #define    PetscFListAddDynamic(a,b,p,c) PetscFListAdd(a,b,p,(void (*)(void))c)
521 #endif
522 EXTERN int PetscFListDuplicate(PetscFList,PetscFList *);
523 EXTERN int PetscFListView(PetscFList,PetscViewer);
524 EXTERN int PetscFListConcat(const char [],const char [],char []);
525 EXTERN int PetscFListGet(PetscFList,char ***,int*);
526 
527 /*S
528      PetscDLLibraryList - Linked list of dynamics libraries to search for functions
529 
530    Level: advanced
531 
532    PETSC_USE_DYNAMIC_LIBRARIES must be defined in petscconf.h to use dynamic libraries
533 
534 .seealso:  PetscDLLibraryOpen()
535 S*/
536 typedef struct _PetscDLLibraryList *PetscDLLibraryList;
537 extern PetscDLLibraryList DLLibrariesLoaded;
538 EXTERN int PetscDLLibraryRetrieve(MPI_Comm,const char[],char *,int,PetscTruth *);
539 EXTERN int PetscDLLibraryOpen(MPI_Comm,const char[],void **);
540 EXTERN int PetscDLLibrarySym(MPI_Comm,PetscDLLibraryList *,const char[],const char[],void **);
541 EXTERN int PetscDLLibraryAppend(MPI_Comm,PetscDLLibraryList *,const char[]);
542 EXTERN int PetscDLLibraryPrepend(MPI_Comm,PetscDLLibraryList *,const char[]);
543 EXTERN int PetscDLLibraryClose(PetscDLLibraryList);
544 EXTERN int PetscDLLibraryPrintPath(void);
545 EXTERN int PetscDLLibraryGetInfo(void *,const char[],const char *[]);
546 
547 /*
548     Mechanism for translating PETSc object representations between languages
549     Not currently used.
550 */
551 typedef enum {PETSC_LANGUAGE_C,PETSC_LANGUAGE_CPP} PetscLanguage;
552 #define PETSC_LANGUAGE_F77 PETSC_LANGUAGE_C
553 EXTERN int PetscObjectComposeLanguage(PetscObject,PetscLanguage,void *);
554 EXTERN int PetscObjectQueryLanguage(PetscObject,PetscLanguage,void **);
555 
556 /*
557      Useful utility routines
558 */
559 EXTERN int PetscSplitOwnership(MPI_Comm,int*,int*);
560 EXTERN int PetscSplitOwnershipBlock(MPI_Comm,int,int*,int*);
561 EXTERN int PetscSequentialPhaseBegin(MPI_Comm,int);
562 EXTERN int PetscSequentialPhaseEnd(MPI_Comm,int);
563 EXTERN int PetscBarrier(PetscObject);
564 EXTERN int PetscMPIDump(FILE*);
565 
566 #define PetscNot(a) ((a) ? PETSC_FALSE : PETSC_TRUE)
567 /*
568     Defines basic graphics available from PETSc.
569 */
570 #include "petscdraw.h"
571 
572 /*
573     Defines the base data structures for all PETSc objects
574 */
575 #include "petschead.h"
576 
577 /*
578      Defines PETSc profiling.
579 */
580 #include "petsclog.h"
581 
582 /*
583           For locking, unlocking and destroying AMS memories associated with
584     PETSc objects
585 */
586 #if defined(PETSC_HAVE_AMS)
587 
588 extern PetscTruth PetscAMSPublishAll;
589 #define PetscPublishAll(v) (PetscAMSPublishAll ? PetscObjectPublish((PetscObject)v) : 0)
590 #define PetscObjectTakeAccess(obj)  ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_take_access(((PetscObject)(obj))->amem))
591 #define PetscObjectGrantAccess(obj) ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_grant_access(((PetscObject)(obj))->amem))
592 #define PetscObjectDepublish(obj)   ((((PetscObject)(obj))->amem == -1) ? 0 : AMS_Memory_destroy(((PetscObject)(obj))->amem)); \
593     ((PetscObject)(obj))->amem = -1;
594 
595 #else
596 
597 #define PetscPublishAll(v)           0
598 #define PetscObjectTakeAccess(obj)   0
599 #define PetscObjectGrantAccess(obj)  0
600 #define PetscObjectDepublish(obj)      0
601 
602 #endif
603 
604 
605 
606 /*
607       This code allows one to pass a MPI communicator between
608     C and Fortran. MPI 2.0 defines a standard API for doing this.
609     The code here is provided to allow PETSc to work with MPI 1.1
610     standard MPI libraries.
611 */
612 EXTERN int  MPICCommToFortranComm(MPI_Comm,int *);
613 EXTERN int  MPIFortranCommToCComm(int,MPI_Comm*);
614 
615 /*
616       Simple PETSc parallel IO for ASCII printing
617 */
618 EXTERN int  PetscFixFilename(const char[],char[]);
619 EXTERN int  PetscFOpen(MPI_Comm,const char[],const char[],FILE**);
620 EXTERN int  PetscFClose(MPI_Comm,FILE*);
621 EXTERN int  PetscFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
622 EXTERN int  PetscPrintf(MPI_Comm,const char[],...)  PETSC_PRINTF_FORMAT_CHECK(2,3);
623 
624 /*MC
625     PetscErrorPrintf - Prints error messages.
626 
627     Not Collective
628 
629    Synopsis:
630      int (*PetscErrorPrintf)(const char format[],...);
631 
632     Input Parameters:
633 .   format - the usual printf() format string
634 
635    Options Database Keys:
636 .    -error_output_stderr - cause error messages to be printed to stderr instead of the
637          (default) stdout
638 
639 
640    Level: developer
641 
642     Fortran Note:
643     This routine is not supported in Fortran.
644 
645     Concepts: error messages^printing
646     Concepts: printing^error messages
647 
648 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscHelpPrintf()
649 M*/
650 EXTERN int  (*PetscErrorPrintf)(const char[],...);
651 
652 /*MC
653     PetscHelpPrintf - Prints help messages.
654 
655     Not Collective
656 
657    Synopsis:
658      int (*PetscHelpPrintf)(const char format[],...);
659 
660     Input Parameters:
661 .   format - the usual printf() format string
662 
663    Level: developer
664 
665     Fortran Note:
666     This routine is not supported in Fortran.
667 
668     Concepts: help messages^printing
669     Concepts: printing^help messages
670 
671 .seealso: PetscFPrintf(), PetscSynchronizedPrintf(), PetscErrorPrintf()
672 M*/
673 EXTERN int  (*PetscHelpPrintf)(MPI_Comm,const char[],...);
674 
675 EXTERN int  PetscPOpen(MPI_Comm,const char[],const char[],const char[],FILE **);
676 EXTERN int  PetscPClose(MPI_Comm,FILE*);
677 EXTERN int  PetscSynchronizedPrintf(MPI_Comm,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3);
678 EXTERN int  PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4);
679 EXTERN int  PetscSynchronizedFlush(MPI_Comm);
680 EXTERN int  PetscSynchronizedFGets(MPI_Comm,FILE*,int,char[]);
681 EXTERN int  PetscStartMatlab(MPI_Comm,const char[],const char[],FILE**);
682 EXTERN int  PetscStartJava(MPI_Comm,const char[],const char[],FILE**);
683 EXTERN int  PetscGetPetscDir(const char*[]);
684 
685 EXTERN int  PetscPopUpSelect(MPI_Comm,char*,char*,int,char**,int*);
686 /*S
687      PetscObjectContainer - Simple PETSc object that contains a pointer to any required data
688 
689    Level: advanced
690 
691 .seealso:  PetscObject, PetscObjectContainerCreate()
692 S*/
693 typedef struct _p_PetscObjectContainer*  PetscObjectContainer;
694 EXTERN int PetscObjectContainerGetPointer(PetscObjectContainer,void **);
695 EXTERN int PetscObjectContainerSetPointer(PetscObjectContainer,void *);
696 EXTERN int PetscObjectContainerDestroy(PetscObjectContainer);
697 EXTERN int PetscObjectContainerCreate(MPI_Comm comm,PetscObjectContainer *);
698 
699 /*
700    For incremental debugging
701 */
702 extern PetscTruth PetscCompare;
703 EXTERN int        PetscCompareDouble(double);
704 EXTERN int        PetscCompareScalar(PetscScalar);
705 EXTERN int        PetscCompareInt(int);
706 
707 /*
708    For use in debuggers
709 */
710 extern int PetscGlobalRank,PetscGlobalSize;
711 EXTERN int PetscIntView(int,int[],PetscViewer);
712 EXTERN int PetscRealView(int,PetscReal[],PetscViewer);
713 EXTERN int PetscScalarView(int,PetscScalar[],PetscViewer);
714 
715 /*
716     Allows accessing Matlab Engine
717 */
718 #include "petscmatlab.h"
719 
720 /*
721     C code optimization is often enhanced by telling the compiler
722   that certain pointer arguments to functions are not aliased to
723   to other arguments. This is not yet ANSI C standard so we define
724   the macro "restrict" to indicate that the variable is not aliased
725   to any other argument.
726 */
727 #if defined(PETSC_HAVE_RESTRICT) && !defined(__cplusplus)
728 #define restrict _Restrict
729 #else
730 #if defined(restrict)
731 #undef restrict
732 #endif
733 #define restrict
734 #endif
735 
736 /*
737       Determine if some of the kernel computation routines use
738    Fortran (rather than C) for the numerical calculations. On some machines
739    and compilers (like complex numbers) the Fortran version of the routines
740    is faster than the C/C++ versions. The flag PETSC_USE_FORTRAN_KERNELS
741    would be set in the petscconf.h file
742 */
743 #if defined(PETSC_USE_FORTRAN_KERNELS)
744 
745 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTAIJ)
746 #define PETSC_USE_FORTRAN_KERNEL_MULTAIJ
747 #endif
748 
749 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ)
750 #define PETSC_USE_FORTRAN_KERNEL_MULTTRANSPOSEAIJ
751 #endif
752 
753 #if !defined(PETSC_USE_FORTRAN_KERNEL_NORM)
754 #define PETSC_USE_FORTRAN_KERNEL_NORM
755 #endif
756 
757 #if !defined(PETSC_USE_FORTRAN_KERNEL_MAXPY)
758 #define PETSC_USE_FORTRAN_KERNEL_MAXPY
759 #endif
760 
761 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ)
762 #define PETSC_USE_FORTRAN_KERNEL_SOLVEAIJ
763 #endif
764 
765 #if !defined(PETSC_USE_FORTRAN_KERNEL_RELAXAIJ)
766 #define PETSC_USE_FORTRAN_KERNEL_RELAXAIJ
767 #endif
768 
769 #if !defined(PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ)
770 #define PETSC_USE_FORTRAN_KERNEL_SOLVEBAIJ
771 #endif
772 
773 #if !defined(PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ)
774 #define PETSC_USE_FORTRAN_KERNEL_MULTADDAIJ
775 #endif
776 
777 #if !defined(PETSC_USE_FORTRAN_KERNEL_MDOT)
778 #define PETSC_USE_FORTRAN_KERNEL_MDOT
779 #endif
780 
781 #if !defined(PETSC_USE_FORTRAN_KERNEL_XTIMESY)
782 #define PETSC_USE_FORTRAN_KERNEL_XTIMESY
783 #endif
784 
785 #if !defined(PETSC_USE_FORTRAN_KERNEL_AYPX)
786 #define PETSC_USE_FORTRAN_KERNEL_AYPX
787 #endif
788 
789 #if !defined(PETSC_USE_FORTRAN_KERNEL_WAXPY)
790 #define PETSC_USE_FORTRAN_KERNEL_WAXPY
791 #endif
792 
793 #endif
794 
795 /*
796     Macros for indicating code that should be compiled with a C interface,
797    rather than a C++ interface. Any routines that are dynamically loaded
798    (such as the PCCreate_XXX() routines) must be wrapped so that the name
799    mangler does not change the functions symbol name. This just hides the
800    ugly extern "C" {} wrappers.
801 */
802 #if defined(__cplusplus)
803 #define EXTERN_C_BEGIN extern "C" {
804 #define EXTERN_C_END }
805 #else
806 #define EXTERN_C_BEGIN
807 #define EXTERN_C_END
808 #endif
809 
810 /* --------------------------------------------------------------------*/
811 
812 /*M
813     size - integer variable used to contain the number of processors in
814            the relevent MPI_Comm
815 
816    Level: beginner
817 
818 .seealso: rank, comm
819 M*/
820 
821 /*M
822     rank - integer variable used to contain the number of this processor relative
823            to all in the relevent MPI_Comm
824 
825    Level: beginner
826 
827 .seealso: size, comm
828 M*/
829 
830 /*M
831     comm - MPI_Comm used in the current routine or object
832 
833    Level: beginner
834 
835 .seealso: size, rank
836 M*/
837 
838 /*M
839     MPI_Comm - the basic object used by MPI to determine which processes are involved in a
840         communication
841 
842    Level: beginner
843 
844    Note: This manual page is a place-holder because MPICH does not have a manual page for MPI_Comm
845 
846 .seealso: size, rank, comm, PETSC_COMM_WORLD, PETSC_COMM_SELF
847 M*/
848 
849 /*M
850     PetscScalar - PETSc type that represents either a double precision real number or
851        a double precision complex number if the code is compiled with BOPT=g_complex or O_complex
852 
853    Level: beginner
854 
855 .seealso: PetscReal, PassiveReal, PassiveScalar
856 M*/
857 
858 /*M
859     PetscReal - PETSc type that represents a double precision real number
860 
861    Level: beginner
862 
863 .seealso: PetscScalar, PassiveReal, PassiveScalar
864 M*/
865 
866 /*M
867     PassiveScalar - PETSc type that represents either a double precision real number or
868        a double precision complex number if the code is compiled with BOPT=g_complex or O_complex
869 
870    Level: beginner
871 
872     This is the same as a PetscScalar except in code that is automatically differentiated it is
873    treated as a constant (not an indendent or dependent variable)
874 
875 .seealso: PetscReal, PassiveReal, PetscScalar
876 M*/
877 
878 /*M
879     PassiveReal - PETSc type that represents a double precision real number
880 
881    Level: beginner
882 
883     This is the same as a PetscReal except in code that is automatically differentiated it is
884    treated as a constant (not an indendent or dependent variable)
885 
886 .seealso: PetscScalar, PetscReal, PassiveScalar
887 M*/
888 
889 /*
890      The IBM include files define hz, here we hide it so that it may be used
891    as a regular user variable.
892 */
893 #if defined(hz)
894 #undef hz
895 #endif
896 
897 /*  For arrays that contain filenames or paths */
898 
899 
900 #if defined(PETSC_HAVE_LIMITS_H)
901 #include <limits.h>
902 #endif
903 #if defined(PETSC_HAVE_SYS_PARAM_H)
904 #include <sys/param.h>
905 #endif
906 
907 #if defined(MAXPATHLEN)
908 #  define PETSC_MAX_PATH_LEN     MAXPATHLEN
909 #elif defined(MAX_PATH)
910 #  define PETSC_MAX_PATH_LEN     MAX_PATH
911 #elif defined(_MAX_PATH)
912 #  define PETSC_MAX_PATH_LEN     _MAX_PATH
913 #else
914 #  define PETSC_MAX_PATH_LEN     4096
915 #endif
916 
917 PETSC_EXTERN_CXX_END
918 #endif
919 
920 
921