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