xref: /petsc/include/petscversion.h (revision cafa780aa8aa254e819dd3f5181368b803b74899)
1*cafa780aSBarry Smith /* $Id: petsc.h,v 1.244 1999/03/31 03:40:39 bsmith Exp balay $ */
2*cafa780aSBarry Smith /*
3*cafa780aSBarry Smith    This is the main PETSc include file (for C and C++).  It is included by all
4*cafa780aSBarry Smith    other PETSc include files, so it almost never has to be specifically included.
5*cafa780aSBarry Smith */
6*cafa780aSBarry Smith #if !defined(__PETSC_H)
7*cafa780aSBarry Smith #define __PETSC_H
8*cafa780aSBarry Smith 
9*cafa780aSBarry Smith /* ========================================================================== */
10*cafa780aSBarry Smith /*
11*cafa780aSBarry Smith    Current PETSc version number and release date, also listed in
12*cafa780aSBarry Smith     docs/changes.html
13*cafa780aSBarry Smith     docs/tex/manual/manual.tex and
14*cafa780aSBarry Smith     docs/tex/manual/manual_tex.tex.
15*cafa780aSBarry Smith */
16*cafa780aSBarry Smith #define PETSC_VERSION_NUMBER "PETSc Version 2.0.24, Released April 6, 1999"
17*cafa780aSBarry Smith 
18*cafa780aSBarry Smith #define PETSC_VERSION_MAJOR    2
19*cafa780aSBarry Smith #define PETSC_VERSION_MINOR    0
20*cafa780aSBarry Smith #define PETSC_VERSION_SUBMINOR 24
21*cafa780aSBarry Smith #define PETSC_VERSION_DATE     "April 6, 1998"
22*cafa780aSBarry Smith #define PETSC_AUTHOR_INFO      "The PETSc Team:\
23*cafa780aSBarry Smith  Satish Balay, Bill Gropp, Lois Curfman McInnes, Barry Smith\n\
24*cafa780aSBarry Smith  Bug reports, questions: petsc-maint@mcs.anl.gov\n\
25*cafa780aSBarry Smith  Web page: http://www.mcs.anl.gov/petsc/\n"
26*cafa780aSBarry Smith 
27*cafa780aSBarry Smith /* ========================================================================== */
28*cafa780aSBarry Smith /*
29*cafa780aSBarry Smith    The PETSc configuration file.  Contains various definitions that
30*cafa780aSBarry Smith    handle portability issues and the presence of machine features.
31*cafa780aSBarry Smith 
32*cafa780aSBarry Smith    petscconf.h is contained in bmake/${PETSC_ARCH}/petscconf.h it is
33*cafa780aSBarry Smith    found automatically by the compiler due to the -I${PETSC_DIR}/bmake/${PETSC_ARCH}
34*cafa780aSBarry Smith    in the bmake/common definition of PETSC_INCLUDE
35*cafa780aSBarry Smith */
36*cafa780aSBarry Smith #include "petscconf.h"
37*cafa780aSBarry Smith 
38*cafa780aSBarry Smith /* ========================================================================== */
39*cafa780aSBarry Smith 
40*cafa780aSBarry Smith #include <stdio.h>
41*cafa780aSBarry Smith /*
42*cafa780aSBarry Smith     Defines the interface to MPI allowing the use of all MPI functions.
43*cafa780aSBarry Smith */
44*cafa780aSBarry Smith #include "mpi.h"
45*cafa780aSBarry Smith 
46*cafa780aSBarry Smith /*
47*cafa780aSBarry Smith     Defines some elementary mathematics functions and constants.
48*cafa780aSBarry Smith */
49*cafa780aSBarry Smith #include "petscmath.h"
50*cafa780aSBarry Smith 
51*cafa780aSBarry Smith /*
52*cafa780aSBarry Smith     Variable type where we stash PETSc object pointers in Fortran.
53*cafa780aSBarry Smith     Assumes that sizeof(long) == sizeof(void *) which is true on
54*cafa780aSBarry Smith     all machines that we know.
55*cafa780aSBarry Smith */
56*cafa780aSBarry Smith #define PetscFortranAddr   long
57*cafa780aSBarry Smith 
58*cafa780aSBarry Smith extern MPI_Comm PETSC_COMM_WORLD;
59*cafa780aSBarry Smith extern MPI_Comm PETSC_COMM_SELF;
60*cafa780aSBarry Smith extern int      PetscInitializedCalled;
61*cafa780aSBarry Smith extern int      PetscSetCommWorld(MPI_Comm);
62*cafa780aSBarry Smith 
63*cafa780aSBarry Smith /*
64*cafa780aSBarry Smith     Defines the malloc employed by PETSc. Users may use these routines as well.
65*cafa780aSBarry Smith */
66*cafa780aSBarry Smith #define PetscMalloc(a)       (*PetscTrMalloc)(a,__LINE__,__FUNC__,__FILE__,__SDIR__)
67*cafa780aSBarry Smith #define PetscNew(A)          (A*) PetscMalloc(sizeof(A))
68*cafa780aSBarry Smith #define PetscFree(a)         (*PetscTrFree)(a,__LINE__,__FUNC__,__FILE__,__SDIR__)
69*cafa780aSBarry Smith extern void *(*PetscTrMalloc)(int,int,char*,char*,char*);
70*cafa780aSBarry Smith extern int  (*PetscTrFree)(void *,int,char*,char*,char*);
71*cafa780aSBarry Smith extern int  PetscSetMalloc(void *(*)(int,int,char*,char*,char*),
72*cafa780aSBarry Smith                            int (*)(void *,int,char*,char*,char*));
73*cafa780aSBarry Smith extern int  PetscClearMalloc(void);
74*cafa780aSBarry Smith 
75*cafa780aSBarry Smith /*
76*cafa780aSBarry Smith    Routines for tracing memory corruption/bleeding with default PETSc
77*cafa780aSBarry Smith    memory allocation
78*cafa780aSBarry Smith */
79*cafa780aSBarry Smith extern int   PetscTrDump(FILE *);
80*cafa780aSBarry Smith extern int   PetscTrSpace(PLogDouble *, PLogDouble *,PLogDouble *);
81*cafa780aSBarry Smith extern int   PetscTrValid(int,const char[],const char[],const char[]);
82*cafa780aSBarry Smith extern int   PetscTrDebugLevel(int);
83*cafa780aSBarry Smith extern int   PetscTrLog(void);
84*cafa780aSBarry Smith extern int   PetscTrLogDump(FILE *);
85*cafa780aSBarry Smith extern int   PetscGetResidentSetSize(PLogDouble *);
86*cafa780aSBarry Smith 
87*cafa780aSBarry Smith /*
88*cafa780aSBarry Smith      Constants and functions used for handling different basic data types.
89*cafa780aSBarry Smith      These are used, for example, in binary IO routines
90*cafa780aSBarry Smith */
91*cafa780aSBarry Smith typedef enum {PETSC_INT = 0, PETSC_DOUBLE = 1, PETSC_SHORT = 2, PETSC_FLOAT = 3,
92*cafa780aSBarry Smith               PETSC_COMPLEX = 4, PETSC_CHAR = 5, PETSC_LOGICAL = 6} PetscDataType;
93*cafa780aSBarry Smith #if defined(USE_PETSC_COMPLEX)
94*cafa780aSBarry Smith #define PETSC_SCALAR PETSC_COMPLEX
95*cafa780aSBarry Smith #else
96*cafa780aSBarry Smith #define PETSC_SCALAR PETSC_DOUBLE
97*cafa780aSBarry Smith #endif
98*cafa780aSBarry Smith typedef enum {PETSC_INT_SIZE = sizeof(int), PETSC_DOUBLE_SIZE = sizeof(double),
99*cafa780aSBarry Smith               PETSC_SCALAR_SIZE = sizeof(Scalar), PETSC_COMPLEX_SIZE = sizeof(double),
100*cafa780aSBarry Smith               PETSC_CHAR_SIZE = sizeof(char), PETSC_LOGICAL_SIZE = 1} PetscDataTypeSize;
101*cafa780aSBarry Smith extern int PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*);
102*cafa780aSBarry Smith extern int PetscDataTypeGetSize(PetscDataType,int*);
103*cafa780aSBarry Smith extern int PetscDataTypeGetName(PetscDataType,char*[]);
104*cafa780aSBarry Smith 
105*cafa780aSBarry Smith /*
106*cafa780aSBarry Smith     Basic memory and string operations. These are usually simple wrappers
107*cafa780aSBarry Smith    around the basic Unix system calls, but a few of them have additional
108*cafa780aSBarry Smith    functionality and/or error checking.
109*cafa780aSBarry Smith */
110*cafa780aSBarry Smith extern int   PetscMemcpy(void *,const void *,int);
111*cafa780aSBarry Smith extern int   PetscBitMemcpy(void*,int,const void*,int,int,PetscDataType);
112*cafa780aSBarry Smith extern int   PetscMemmove(void *,void *,int);
113*cafa780aSBarry Smith extern int   PetscMemzero(void *,int);
114*cafa780aSBarry Smith extern int   PetscMemcmp(const void*,const void*, int);
115*cafa780aSBarry Smith extern int   PetscStrlen(const char[]);
116*cafa780aSBarry Smith extern int   PetscStrcmp(const char[],const char[]);
117*cafa780aSBarry Smith extern int   PetscStrcasecmp(const char[],const char[]);
118*cafa780aSBarry Smith extern int   PetscStrncmp(const char[],const char[],int );
119*cafa780aSBarry Smith extern int   PetscStrcpy(char[],const char[]);
120*cafa780aSBarry Smith extern int   PetscStrcat(char[],const char[]);
121*cafa780aSBarry Smith extern int   PetscStrncat(char[],const char[],int);
122*cafa780aSBarry Smith extern int   PetscStrncpy(char[],const char[],int);
123*cafa780aSBarry Smith extern char* PetscStrchr(const char[],char);
124*cafa780aSBarry Smith extern char* PetscStrrchr(const char[],char);
125*cafa780aSBarry Smith extern char* PetscStrstr(const char[],const char[]);
126*cafa780aSBarry Smith extern char* PetscStrtok(const char[],const char[]);
127*cafa780aSBarry Smith 
128*cafa780aSBarry Smith #define PetscTypeCompare(a,b) (!PetscStrcmp((char*)(a),(char *)(b)))
129*cafa780aSBarry Smith 
130*cafa780aSBarry Smith /*
131*cafa780aSBarry Smith        Basic PETSc constants
132*cafa780aSBarry Smith */
133*cafa780aSBarry Smith typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth;
134*cafa780aSBarry Smith #define PETSC_NULL            0
135*cafa780aSBarry Smith #define PETSC_DECIDE         -1
136*cafa780aSBarry Smith #define PETSC_DETERMINE      PETSC_DECIDE
137*cafa780aSBarry Smith #define PETSC_DEFAULT        -2
138*cafa780aSBarry Smith 
139*cafa780aSBarry Smith /*
140*cafa780aSBarry Smith     Each PETSc object class has it's own cookie (internal integer in the
141*cafa780aSBarry Smith   data structure used for error checking). These are all defined by an offset
142*cafa780aSBarry Smith   from the lowest one, PETSC_COOKIE. If you increase these you must
143*cafa780aSBarry Smith   increase the field sizes in petsc/src/sys/src/plog/plog.c
144*cafa780aSBarry Smith */
145*cafa780aSBarry Smith #define PETSC_COOKIE                    1211211
146*cafa780aSBarry Smith #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30
147*cafa780aSBarry Smith #define LARGEST_PETSC_COOKIE_ALLOWED    PETSC_COOKIE + 50
148*cafa780aSBarry Smith extern int LARGEST_PETSC_COOKIE;
149*cafa780aSBarry Smith 
150*cafa780aSBarry Smith typedef struct _FList *FList;
151*cafa780aSBarry Smith 
152*cafa780aSBarry Smith #include "viewer.h"
153*cafa780aSBarry Smith #include "options.h"
154*cafa780aSBarry Smith 
155*cafa780aSBarry Smith extern int PetscGetTime(PLogDouble*);
156*cafa780aSBarry Smith extern int PetscGetCPUTime(PLogDouble*);
157*cafa780aSBarry Smith extern int PetscSleep(int);
158*cafa780aSBarry Smith 
159*cafa780aSBarry Smith /*
160*cafa780aSBarry Smith     Initialization of PETSc or its micro-kernel ALICE
161*cafa780aSBarry Smith */
162*cafa780aSBarry Smith extern int  AliceInitialize(int*,char***,const char[],const char[]);
163*cafa780aSBarry Smith extern int  AliceInitializeNoArguments(void);
164*cafa780aSBarry Smith extern int  AliceFinalize(void);
165*cafa780aSBarry Smith extern void AliceInitializeFortran(void);
166*cafa780aSBarry Smith 
167*cafa780aSBarry Smith extern int  PetscInitialize(int*,char***,char[],const char[]);
168*cafa780aSBarry Smith extern int  PetscInitializeNoArguments(void);
169*cafa780aSBarry Smith extern int  PetscFinalize(void);
170*cafa780aSBarry Smith extern void PetscInitializeFortran(void);
171*cafa780aSBarry Smith 
172*cafa780aSBarry Smith /*
173*cafa780aSBarry Smith     Functions that can act on any PETSc object.
174*cafa780aSBarry Smith */
175*cafa780aSBarry Smith typedef struct _p_PetscObject* PetscObject;
176*cafa780aSBarry Smith extern int PetscObjectDestroy(PetscObject);
177*cafa780aSBarry Smith extern int PetscObjectExists(PetscObject,PetscTruth*);
178*cafa780aSBarry Smith extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
179*cafa780aSBarry Smith extern int PetscObjectGetCookie(PetscObject,int *cookie);
180*cafa780aSBarry Smith extern int PetscObjectGetType(PetscObject,int *type);
181*cafa780aSBarry Smith extern int PetscObjectSetName(PetscObject,const char[]);
182*cafa780aSBarry Smith extern int PetscObjectGetName(PetscObject,char*[]);
183*cafa780aSBarry Smith extern int PetscObjectReference(PetscObject);
184*cafa780aSBarry Smith extern int PetscObjectGetReference(PetscObject,int*);
185*cafa780aSBarry Smith extern int PetscObjectDereference(PetscObject);
186*cafa780aSBarry Smith extern int PetscObjectGetNewTag(PetscObject,int *);
187*cafa780aSBarry Smith extern int PetscObjectRestoreNewTag(PetscObject,int *);
188*cafa780aSBarry Smith extern int PetscCommGetNewTag(MPI_Comm,int *);
189*cafa780aSBarry Smith extern int PetscCommRestoreNewTag(MPI_Comm,int *);
190*cafa780aSBarry Smith extern int PetscObjectView(PetscObject,Viewer);
191*cafa780aSBarry Smith extern int PetscObjectCompose(PetscObject,const char[],PetscObject);
192*cafa780aSBarry Smith extern int PetscObjectQuery(PetscObject,const char[],PetscObject *);
193*cafa780aSBarry Smith extern int PetscObjectComposeFunction_Private(PetscObject,const char[],const char[],void *);
194*cafa780aSBarry Smith #if defined(USE_DYNAMIC_LIBRARIES)
195*cafa780aSBarry Smith #define PetscObjectComposeFunction(a,b,c,d) PetscObjectComposeFunction_Private(a,b,c,0)
196*cafa780aSBarry Smith #else
197*cafa780aSBarry Smith #define PetscObjectComposeFunction(a,b,c,d) PetscObjectComposeFunction_Private(a,b,c,d)
198*cafa780aSBarry Smith #endif
199*cafa780aSBarry Smith extern int PetscObjectQueryFunction(PetscObject,const char[],void **);
200*cafa780aSBarry Smith extern int PetscObjectSetOptionsPrefix(PetscObject,const char[]);
201*cafa780aSBarry Smith extern int PetscObjectAppendOptionsPrefix(PetscObject,const char[]);
202*cafa780aSBarry Smith extern int PetscObjectPrependOptionsPrefix(PetscObject,const char[]);
203*cafa780aSBarry Smith extern int PetscObjectGetOptionsPrefix(PetscObject,char*[]);
204*cafa780aSBarry Smith extern int PetscObjectPublish(PetscObject);
205*cafa780aSBarry Smith 
206*cafa780aSBarry Smith /*
207*cafa780aSBarry Smith     Defines PETSc error handling.
208*cafa780aSBarry Smith */
209*cafa780aSBarry Smith #include "petscerror.h"
210*cafa780aSBarry Smith 
211*cafa780aSBarry Smith /*
212*cafa780aSBarry Smith     Mechanism for managing lists of objects attached (composed) with
213*cafa780aSBarry Smith    a PETSc object.
214*cafa780aSBarry Smith */
215*cafa780aSBarry Smith typedef struct _OList *OList;
216*cafa780aSBarry Smith extern int OListDestroy(OList *);
217*cafa780aSBarry Smith extern int OListFind(OList,const char[],PetscObject*);
218*cafa780aSBarry Smith extern int OListReverseFind(OList,PetscObject,char**);
219*cafa780aSBarry Smith extern int OListAdd(OList *,const char[],PetscObject);
220*cafa780aSBarry Smith extern int OListDuplicate(OList,OList *);
221*cafa780aSBarry Smith 
222*cafa780aSBarry Smith /*
223*cafa780aSBarry Smith     Dynamic library lists. Lists of names of routines in dynamic
224*cafa780aSBarry Smith   link libraries that will be loaded as needed.
225*cafa780aSBarry Smith */
226*cafa780aSBarry Smith extern int FListAdd_Private(FList*,const char[],const char[],int (*)(void *));
227*cafa780aSBarry Smith extern int FListDestroy(FList);
228*cafa780aSBarry Smith extern int FListFind(MPI_Comm,FList,const char[],int (**)(void*));
229*cafa780aSBarry Smith extern int FListPrintTypes(MPI_Comm,FILE*,const char[],const char[],FList);
230*cafa780aSBarry Smith #if defined(USE_DYNAMIC_LIBRARIES)
231*cafa780aSBarry Smith #define    FListAdd(a,b,p,c) FListAdd_Private(a,b,p,0)
232*cafa780aSBarry Smith #else
233*cafa780aSBarry Smith #define    FListAdd(a,b,p,c) FListAdd_Private(a,b,p,(int (*)(void *))c)
234*cafa780aSBarry Smith #endif
235*cafa780aSBarry Smith extern int FListDuplicate(FList,FList *);
236*cafa780aSBarry Smith extern int FListView(FList,Viewer);
237*cafa780aSBarry Smith 
238*cafa780aSBarry Smith /*
239*cafa780aSBarry Smith    Routines for handling dynamic libraries. PETSc uses dynamic libraries
240*cafa780aSBarry Smith   by default on most machines (except IBM). This is controlled by the
241*cafa780aSBarry Smith   flag USE_DYNAMIC_LIBRARIES in petscconf.h
242*cafa780aSBarry Smith */
243*cafa780aSBarry Smith typedef struct _DLLibraryList *DLLibraryList;
244*cafa780aSBarry Smith extern DLLibraryList DLLibrariesLoaded;
245*cafa780aSBarry Smith extern int DLLibraryRetrieve(MPI_Comm,const char[],char *,int,PetscTruth *);
246*cafa780aSBarry Smith extern int DLLibraryOpen(MPI_Comm,const char[],void **);
247*cafa780aSBarry Smith extern int DLLibrarySym(MPI_Comm,DLLibraryList *,const char[],const char[],void **);
248*cafa780aSBarry Smith extern int DLLibraryAppend(MPI_Comm,DLLibraryList *,const char[]);
249*cafa780aSBarry Smith extern int DLLibraryPrepend(MPI_Comm,DLLibraryList *,const char[]);
250*cafa780aSBarry Smith extern int DLLibraryClose(DLLibraryList);
251*cafa780aSBarry Smith extern int DLLibraryPrintPath(void);
252*cafa780aSBarry Smith extern int DLLibraryGetInfo(void *,char *,char **);
253*cafa780aSBarry Smith 
254*cafa780aSBarry Smith /*
255*cafa780aSBarry Smith     Mechanism for translating PETSc object representations between languages
256*cafa780aSBarry Smith     Not currently used.
257*cafa780aSBarry Smith */
258*cafa780aSBarry Smith typedef enum {PETSC_LANGUAGE_C,PETSC_LANGUAGE_CPP} PetscLanguage;
259*cafa780aSBarry Smith #define PETSC_LANGUAGE_F77 PETSC_LANGUAGE_C
260*cafa780aSBarry Smith extern int PetscObjectComposeLanguage(PetscObject,PetscLanguage,void *);
261*cafa780aSBarry Smith extern int PetscObjectQueryLanguage(PetscObject,PetscLanguage,void **);
262*cafa780aSBarry Smith 
263*cafa780aSBarry Smith /*
264*cafa780aSBarry Smith      Useful utility routines
265*cafa780aSBarry Smith */
266*cafa780aSBarry Smith extern int PetscSplitOwnership(MPI_Comm,int*,int*);
267*cafa780aSBarry Smith extern int  PetscSequentialPhaseBegin(MPI_Comm,int);
268*cafa780aSBarry Smith extern int  PetscSequentialPhaseEnd(MPI_Comm,int);
269*cafa780aSBarry Smith extern int  PetscBarrier(PetscObject);
270*cafa780aSBarry Smith extern int  PetscMPIDump(FILE*);
271*cafa780aSBarry Smith 
272*cafa780aSBarry Smith /*
273*cafa780aSBarry Smith     Defines basic graphics available from PETSc.
274*cafa780aSBarry Smith */
275*cafa780aSBarry Smith #include "draw.h"
276*cafa780aSBarry Smith 
277*cafa780aSBarry Smith /*
278*cafa780aSBarry Smith     Defines the base data structures for all PETSc objects
279*cafa780aSBarry Smith */
280*cafa780aSBarry Smith #include "petschead.h"
281*cafa780aSBarry Smith 
282*cafa780aSBarry Smith /*
283*cafa780aSBarry Smith      Defines PETSc profiling.
284*cafa780aSBarry Smith */
285*cafa780aSBarry Smith #include "petsclog.h"
286*cafa780aSBarry Smith 
287*cafa780aSBarry Smith #if defined(HAVE_AMS)
288*cafa780aSBarry Smith extern PetscTruth PetscAMSPublishAll;
289*cafa780aSBarry Smith #define PetscPublishAll(v)\
290*cafa780aSBarry Smith   { if (PetscAMSPublishAll) { \
291*cafa780aSBarry Smith     int __ierr;\
292*cafa780aSBarry Smith     __ierr = PetscObjectPublish((PetscObject)v);CHKERRQ(__ierr);\
293*cafa780aSBarry Smith   }}
294*cafa780aSBarry Smith #else
295*cafa780aSBarry Smith #define PetscPublishAll(v)
296*cafa780aSBarry Smith #endif
297*cafa780aSBarry Smith 
298*cafa780aSBarry Smith /*
299*cafa780aSBarry Smith       This code allows one to pass a MPI communicator between
300*cafa780aSBarry Smith     C and Fortran. MPI 2.0 defines a standard API for doing this.
301*cafa780aSBarry Smith     The code here is provided to allow PETSc to work with MPI 1.1
302*cafa780aSBarry Smith     standard MPI libraries.
303*cafa780aSBarry Smith */
304*cafa780aSBarry Smith extern int  MPICCommToFortranComm(MPI_Comm,int *);
305*cafa780aSBarry Smith extern int  MPIFortranCommToCComm(int,MPI_Comm*);
306*cafa780aSBarry Smith 
307*cafa780aSBarry Smith /*
308*cafa780aSBarry Smith       Simple PETSc parallel IO for ASCII printing
309*cafa780aSBarry Smith */
310*cafa780aSBarry Smith extern int  PetscFixFilename(const char[],char[]);
311*cafa780aSBarry Smith extern FILE *PetscFOpen(MPI_Comm,const char[],const char[]);
312*cafa780aSBarry Smith extern int  PetscFClose(MPI_Comm,FILE*);
313*cafa780aSBarry Smith extern int  PetscFPrintf(MPI_Comm,FILE*,const char[],...);
314*cafa780aSBarry Smith extern int  PetscPrintf(MPI_Comm,const char[],...);
315*cafa780aSBarry Smith extern int  (*PetscErrorPrintf)(const char[],...);
316*cafa780aSBarry Smith extern int  (*PetscHelpPrintf)(MPI_Comm,const char[],...);
317*cafa780aSBarry Smith 
318*cafa780aSBarry Smith extern int  PetscSynchronizedPrintf(MPI_Comm,const char[],...);
319*cafa780aSBarry Smith extern int  PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...);
320*cafa780aSBarry Smith extern int  PetscSynchronizedFlush(MPI_Comm);
321*cafa780aSBarry Smith 
322*cafa780aSBarry Smith /*
323*cafa780aSBarry Smith     Simple PETSc object that contains a pointer to any required data
324*cafa780aSBarry Smith */
325*cafa780aSBarry Smith typedef struct _p_PetscObjectContainer*  PetscObjectContainer;
326*cafa780aSBarry Smith extern int PetscObjectContainerGetPointer(PetscObjectContainer,void **);
327*cafa780aSBarry Smith extern int PetscObjectContainerSetPointer(PetscObjectContainer,void *);
328*cafa780aSBarry Smith extern int PetscObjectContainerDestroy(PetscObjectContainer);
329*cafa780aSBarry Smith extern int PetscObjectContainerCreate(MPI_Comm comm,PetscObjectContainer *);
330*cafa780aSBarry Smith 
331*cafa780aSBarry Smith /*
332*cafa780aSBarry Smith    For incremental debugging
333*cafa780aSBarry Smith */
334*cafa780aSBarry Smith extern int PetscCompare;
335*cafa780aSBarry Smith extern int PetscCompareDouble(double);
336*cafa780aSBarry Smith extern int PetscCompareScalar(Scalar);
337*cafa780aSBarry Smith extern int PetscCompareInt(int);
338*cafa780aSBarry Smith 
339*cafa780aSBarry Smith /*
340*cafa780aSBarry Smith    For use in debuggers
341*cafa780aSBarry Smith */
342*cafa780aSBarry Smith extern int PetscGlobalRank,PetscGlobalSize;
343*cafa780aSBarry Smith extern int PetscIntView(int,int[],Viewer);
344*cafa780aSBarry Smith extern int PetscDoubleView(int,double[],Viewer);
345*cafa780aSBarry Smith extern int PetscScalarView(int,Scalar[],Viewer);
346*cafa780aSBarry Smith 
347*cafa780aSBarry Smith /*
348*cafa780aSBarry Smith     C code optimization is often enhanced by telling the compiler
349*cafa780aSBarry Smith   that certain pointer arguments to functions are not aliased to
350*cafa780aSBarry Smith   to other arguments. This is not yet ANSI C standard so we define
351*cafa780aSBarry Smith   the macro "restrict" to indicate that the variable is not aliased
352*cafa780aSBarry Smith   to any other argument.
353*cafa780aSBarry Smith */
354*cafa780aSBarry Smith #if defined(HAVE_RESTRICT) && !defined(__cplusplus)
355*cafa780aSBarry Smith #define restrict _Restrict
356*cafa780aSBarry Smith #else
357*cafa780aSBarry Smith #define restrict
358*cafa780aSBarry Smith #endif
359*cafa780aSBarry Smith 
360*cafa780aSBarry Smith /*
361*cafa780aSBarry Smith       Determine if some of the kernel computation routines use
362*cafa780aSBarry Smith    Fortran (rather than C) for the numerical calculations. On some machines
363*cafa780aSBarry Smith    and compilers (like complex numbers) the Fortran version of the routines
364*cafa780aSBarry Smith    is faster than the C/C++ versions. The flag USE_FORTRAN_KERNELS
365*cafa780aSBarry Smith    would be set in the petscconf.h file
366*cafa780aSBarry Smith */
367*cafa780aSBarry Smith #if defined(USE_FORTRAN_KERNELS)
368*cafa780aSBarry Smith 
369*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MULTAIJ)
370*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MULTAIJ
371*cafa780aSBarry Smith #endif
372*cafa780aSBarry Smith 
373*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_NORMSQR)
374*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_NORMSQR
375*cafa780aSBarry Smith #endif
376*cafa780aSBarry Smith 
377*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MAXPY)
378*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MAXPY
379*cafa780aSBarry Smith #endif
380*cafa780aSBarry Smith 
381*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_SOLVEAIJ)
382*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_SOLVEAIJ
383*cafa780aSBarry Smith #endif
384*cafa780aSBarry Smith 
385*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_SOLVEBAIJ)
386*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_SOLVEBAIJ
387*cafa780aSBarry Smith #endif
388*cafa780aSBarry Smith 
389*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MULTADDAIJ)
390*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MULTADDAIJ
391*cafa780aSBarry Smith #endif
392*cafa780aSBarry Smith 
393*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MDOT)
394*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MDOT
395*cafa780aSBarry Smith #endif
396*cafa780aSBarry Smith 
397*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_XTIMESY)
398*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_XTIMESY
399*cafa780aSBarry Smith #endif
400*cafa780aSBarry Smith 
401*cafa780aSBarry Smith #endif
402*cafa780aSBarry Smith 
403*cafa780aSBarry Smith /*
404*cafa780aSBarry Smith     Macros for indicating code that should be compiled with a C interface,
405*cafa780aSBarry Smith    rather than a C++ interface. Any routines that are dynamically loaded
406*cafa780aSBarry Smith    (such as the PCCreate_XXX() routines) must be wrapped so that the name
407*cafa780aSBarry Smith    mangler does not change the functions symbol name. This just hides the
408*cafa780aSBarry Smith    ugly extern "C" {} wrappers.
409*cafa780aSBarry Smith */
410*cafa780aSBarry Smith #if defined(__cplusplus)
411*cafa780aSBarry Smith #define EXTERN_C_BEGIN extern "C" {
412*cafa780aSBarry Smith #define EXTERN_C_END }
413*cafa780aSBarry Smith #else
414*cafa780aSBarry Smith #define EXTERN_C_BEGIN
415*cafa780aSBarry Smith #define EXTERN_C_END
416*cafa780aSBarry Smith #endif
417*cafa780aSBarry Smith 
418*cafa780aSBarry Smith #endif
419