xref: /petsc/include/petsc.h (revision 2903362c7633d42ccfb3d67653a8bc3758ca884d)
1 /* $Id: petsc.h,v 1.156 1997/04/10 00:08:17 bsmith Exp balay $ */
2 /*
3    This is the main PETSc include file (for C and C++).  It is included by
4    all other PETSc include files so almost never has to be specifically included.
5 */
6 #if !defined(__PETSC_PACKAGE)
7 #define __PETSC_PACKAGE
8 
9 #define PETSC_VERSION_NUMBER "PETSc Version 2.0.17, Released April 5, 1997."
10 
11 #include <stdio.h>
12 #include "mpi.h"
13 
14 #if defined(PETSC_COMPLEX)
15 #if defined(HAVE_NONSTANDARD_COMPLEX_H)
16 #include HAVE_NONSTANDARD_COMPLEX_H
17 #else
18 #include <complex.h>
19 #endif
20 extern  MPI_Datatype      MPIU_COMPLEX;
21 #define MPIU_SCALAR       MPIU_COMPLEX
22 #define PetscReal(a)      real(a)
23 #define PetscImaginary(a) imag(a)
24 #define PetscAbsScalar(a) abs(a)
25 #define PetscConj(a)      conj(a)
26 /*
27   The new complex class for GNU C++ is based on templates and is not backward
28   compatible with all previous complex class libraries.
29 */
30 #if defined(USES_TEMPLATED_COMPLEX)
31 #define Scalar            complex<double>
32 #else
33 #define Scalar            complex
34 #endif
35 
36 /* Compiling for real numbers only */
37 #else
38 #define MPIU_SCALAR       MPI_DOUBLE
39 #define PetscReal(a)      (a)
40 #define PetscImaginary(a) (a)
41 #define PetscAbsScalar(a) ( ((a)<0.0)   ? -(a) : (a) )
42 #define Scalar            double
43 #define PetscConj(a)      (a)
44 #endif
45 
46 /*
47    Certain objects may be created using either single
48   or double precision.
49 */
50 typedef enum { SCALAR_DOUBLE, SCALAR_SINGLE } ScalarPrecision;
51 
52 extern MPI_Comm PETSC_COMM_WORLD;
53 extern MPI_Comm PETSC_COMM_SELF;
54 extern int      PetscInitializedCalled;
55 extern int      PetscSetCommWorld(MPI_Comm);
56 
57 /* PETSC_i is the imaginary number, i */
58 extern  Scalar            PETSC_i;
59 
60 #define PetscMin(a,b)      ( ((a)<(b)) ? (a) : (b) )
61 #define PetscMax(a,b)      ( ((a)<(b)) ? (b) : (a) )
62 #define PetscAbsInt(a)     ( ((a)<0)   ? -(a) : (a) )
63 #define PetscAbsDouble(a)  ( ((a)<0)   ? -(a) : (a) )
64 
65 /*
66     PLogDouble variables are used to contain double precision numbers
67   that are not used in the numerical computations, but rather in logging,
68   timing etc.
69 */
70 typedef double PLogDouble;
71 
72 /*
73     Defines the malloc employed by PETSc. Users may employ these routines as well.
74 */
75 extern void *(*PetscTrMalloc)(unsigned int,int,char*,char*,char*);
76 extern int  (*PetscTrFree)(void *,int,char*,char*,char*);
77 extern int  PetscSetMalloc(void *(*)(unsigned int,int,char*,char*,char*),
78                            int (*)(void *,int,char*,char*,char*));
79 #define PetscMalloc(a)       (*PetscTrMalloc)(a,__LINE__,__FUNC__,__FILE__,__SDIR__)
80 #define PetscNew(A)          (A*) PetscMalloc(sizeof(A))
81 #define PetscFree(a)         (*PetscTrFree)(a,__LINE__,__FUNC__,__FILE__,__SDIR__)
82 
83 extern int   PetscTrDump(FILE *);
84 extern int   PetscTrSpace( PLogDouble *, PLogDouble *,PLogDouble *);
85 extern int   PetscTrValid(int,char *,char *,char *);
86 extern int   PetscTrDebugLevel(int);
87 extern int   PetscTrLog();
88 extern int   PetscTrLogDump(FILE *);
89 extern int   PetscGetResidentSetSize(PLogDouble *);
90 
91 extern void  PetscMemcpy(void *,void *,int);
92 extern void  PetscMemzero(void *,int);
93 extern int   PetscMemcmp(void*, void*, int);
94 extern int   PetscStrlen(char *);
95 extern int   PetscStrcmp(char *,char *);
96 extern int   PetscStrncmp(char *,char *,int );
97 extern void  PetscStrcpy(char *,char *);
98 extern void  PetscStrcat(char *,char *);
99 extern void  PetscStrncat(char *,char *,int);
100 extern void  PetscStrncpy(char *,char *,int);
101 extern char* PetscStrchr(char *,char);
102 extern char* PetscStrrchr(char *,char);
103 extern char* PetscStrstr(char*,char*);
104 extern char* PetscStrtok(char*,char*);
105 extern char* PetscStrrtok(char*,char*);
106 
107 typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth;
108 #define PETSC_NULL            0
109 #define PETSC_DECIDE         -1
110 #define PETSC_DEFAULT        -2
111 
112 /*
113     Each PETSc object class has it's own cookie (internal integer in the
114   data structure used for error checking). These are all defined by an offset
115   from the lowest one, PETSC_COOKIE. If you increase these you must
116   increase the field sizes in petsc/src/plog/src/plog.c
117 */
118 #define PETSC_COOKIE                    1211211
119 #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30
120 #define LARGEST_PETSC_COOKIE_ALLOWED    PETSC_COOKIE + 50
121 extern int LARGEST_PETSC_COOKIE;
122 
123 #include "viewer.h"
124 #include "options.h"
125 #include "draw.h"
126 
127 extern PLogDouble PetscGetTime();
128 extern PLogDouble PetscGetCPUTime();
129 extern void       PetscSleep(int);
130 
131 extern int    PetscInitialize(int*,char***,char*,char*);
132 extern int    PetscFinalize();
133 extern void   PetscInitializeFortran();
134 
135 /*
136     Functions that can act on any PETSc object.
137 */
138 typedef struct _PetscObject* PetscObject;
139 extern int PetscObjectDestroy(PetscObject);
140 extern int PetscObjectExists(PetscObject,int*);
141 extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
142 extern int PetscObjectGetCookie(PetscObject,int *cookie);
143 extern int PetscObjectGetChild(PetscObject,void **child);
144 extern int PetscObjectGetType(PetscObject,int *type);
145 extern int PetscObjectSetName(PetscObject,char*);
146 extern int PetscObjectGetName(PetscObject,char**);
147 extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*));
148 extern int PetscObjectReference(PetscObject);
149 extern int PetscObjectGetNewTag(PetscObject,int *);
150 extern int PetscObjectRestoreNewTag(PetscObject,int *);
151 
152 #include "petscerror.h"
153 #include "petschead.h"
154 #include "petsclog.h"
155 
156 extern int  PetscSequentialPhaseBegin(MPI_Comm,int);
157 extern int  PetscSequentialPhaseEnd(MPI_Comm,int);
158 
159 /*M
160     PetscBarrier - Blocks until this routine is executed by all
161                    processors owning the object A.
162 
163    Input Parameters:
164 .  A - PETSc object  ( Mat, Vec, IS, SNES etc...)
165 
166    Synopsis:
167    void PetscBarrier(PetscObject obj)
168 
169   Notes:
170   This routine calls MPI_Barrier with the communicator
171   of the PETSc Object "A".
172 
173 .keywords: barrier, petscobject
174 M*/
175 
176 #define PetscBarrier(A) \
177   { \
178     PetscValidHeader(A); \
179     PLogEventBegin(Petsc_Barrier,A,0,0,0); \
180     MPI_Barrier(((PetscObject)A)->comm); \
181     PLogEventEnd(Petsc_Barrier,A,0,0,0); \
182   }
183 
184 extern int PetscMPIDump(FILE *);
185 
186 /*
187       This code allows one to pass a PETSc object in C
188   to a Fortran routine, where (like all PETSc objects in
189   Fortran) it is treated as an integer.
190 */
191 extern int  PetscCObjectToFortranObject(void *a,int *b);
192 extern int  PetscFortranObjectToCObject(int a,void *b);
193 
194 extern FILE *PetscFOpen(MPI_Comm,char *,char *);
195 extern int  PetscFClose(MPI_Comm,FILE*);
196 extern int  PetscFPrintf(MPI_Comm,FILE*,char *,...);
197 extern int  PetscPrintf(MPI_Comm,char *,...);
198 
199 extern int  PetscSynchronizedPrintf(MPI_Comm,char *,...);
200 extern int  PetscSynchronizedFlush(MPI_Comm);
201 
202 /*
203    For incremental debugging
204 */
205 extern int PetscCompare;
206 extern int PetscCompareDouble(double);
207 extern int PetscCompareScalar(Scalar);
208 extern int PetscCompareInt(int);
209 
210 /*
211    For use in debuggers
212 */
213 extern int PetscGlobalRank,PetscGlobalSize;
214 extern int PetscIntView(int,int*,Viewer);
215 extern int PetscDoubleView(int,double *,Viewer);
216 
217 #endif
218