xref: /petsc/include/petsc.h (revision e962a117223ded444dc709944f007eac2d53e466)
1 /* $Id: petsc.h,v 1.165 1997/07/12 17:57:19 bsmith Exp bsmith $ */
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.19, Released August 13, 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       Once PETSc is compiling with a ADIC enhanced version of MPI
73    we will create a new MPI_Datatype for the inactive double variables.
74 */
75 #if defined(AD_DERIV_H)
76 /* extern  MPI_Datatype  MPIU_PLOGDOUBLE; */
77 #else
78 #if !defined(PETSC_USING_MPIUNI)
79 #define MPIU_PLOGDOUBLE MPI_DOUBLE
80 #endif
81 #endif
82 
83 /*
84     Defines the malloc employed by PETSc. Users may employ these routines as well.
85 */
86 extern void *(*PetscTrMalloc)(unsigned int,int,char*,char*,char*);
87 extern int  (*PetscTrFree)(void *,int,char*,char*,char*);
88 extern int  PetscSetMalloc(void *(*)(unsigned int,int,char*,char*,char*),
89                            int (*)(void *,int,char*,char*,char*));
90 #define PetscMalloc(a)       (*PetscTrMalloc)(a,__LINE__,__FUNC__,__FILE__,__SDIR__)
91 #define PetscNew(A)          (A*) PetscMalloc(sizeof(A))
92 #define PetscFree(a)         (*PetscTrFree)(a,__LINE__,__FUNC__,__FILE__,__SDIR__)
93 
94 extern int   PetscTrDump(FILE *);
95 extern int   PetscTrSpace( PLogDouble *, PLogDouble *,PLogDouble *);
96 extern int   PetscTrValid(int,char *,char *,char *);
97 extern int   PetscTrDebugLevel(int);
98 extern int   PetscTrLog();
99 extern int   PetscTrLogDump(FILE *);
100 extern int   PetscGetResidentSetSize(PLogDouble *);
101 
102 extern void  PetscMemcpy(void *,void *,int);
103 extern void  PetscMemmove(void *,void *,int);
104 extern void  PetscMemzero(void *,int);
105 extern int   PetscMemcmp(void*, void*, int);
106 extern int   PetscStrlen(char *);
107 extern int   PetscStrcmp(char *,char *);
108 extern int   PetscStrcasecmp(char *,char *);
109 extern int   PetscStrncmp(char *,char *,int );
110 extern void  PetscStrcpy(char *,char *);
111 extern void  PetscStrcat(char *,char *);
112 extern void  PetscStrncat(char *,char *,int);
113 extern void  PetscStrncpy(char *,char *,int);
114 extern char* PetscStrchr(char *,char);
115 extern char* PetscStrrchr(char *,char);
116 extern char* PetscStrstr(char*,char*);
117 extern char* PetscStrtok(char*,char*);
118 extern char* PetscStrrtok(char*,char*);
119 
120 typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth;
121 #define PETSC_NULL            0
122 #define PETSC_DECIDE         -1
123 #define PETSC_DEFAULT        -2
124 
125 /*
126     Each PETSc object class has it's own cookie (internal integer in the
127   data structure used for error checking). These are all defined by an offset
128   from the lowest one, PETSC_COOKIE. If you increase these you must
129   increase the field sizes in petsc/src/plog/src/plog.c
130 */
131 #define PETSC_COOKIE                    1211211
132 #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30
133 #define LARGEST_PETSC_COOKIE_ALLOWED    PETSC_COOKIE + 50
134 extern int LARGEST_PETSC_COOKIE;
135 
136 #include "viewer.h"
137 #include "options.h"
138 #include "draw.h"
139 
140 extern PLogDouble PetscGetTime();
141 extern PLogDouble PetscGetCPUTime();
142 extern void       PetscSleep(int);
143 
144 extern int    PetscInitialize(int*,char***,char*,char*);
145 extern int    PetscFinalize();
146 extern void   PetscInitializeFortran();
147 
148 /*
149     Functions that can act on any PETSc object.
150 */
151 typedef struct _p_PetscObject* PetscObject;
152 extern int PetscObjectDestroy(PetscObject);
153 extern int PetscObjectExists(PetscObject,int*);
154 extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
155 extern int PetscObjectGetCookie(PetscObject,int *cookie);
156 extern int PetscObjectGetChild(PetscObject,void **child);
157 extern int PetscObjectGetType(PetscObject,int *type);
158 extern int PetscObjectSetName(PetscObject,char*);
159 extern int PetscObjectGetName(PetscObject,char**);
160 extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*));
161 extern int PetscObjectReference(PetscObject);
162 extern int PetscObjectGetNewTag(PetscObject,int *);
163 extern int PetscObjectRestoreNewTag(PetscObject,int *);
164 
165 #include "petscerror.h"
166 #include "petschead.h"
167 #include "petsclog.h"
168 
169 extern int  PetscSequentialPhaseBegin(MPI_Comm,int);
170 extern int  PetscSequentialPhaseEnd(MPI_Comm,int);
171 
172 /*M
173     PetscBarrier - Blocks until this routine is executed by all
174                    processors owning the object A.
175 
176    Input Parameters:
177 .  A - PETSc object  ( Mat, Vec, IS, SNES etc...)
178 
179    Synopsis:
180    void PetscBarrier(PetscObject obj)
181 
182   Notes:
183   This routine calls MPI_Barrier with the communicator
184   of the PETSc Object "A".
185 
186 .keywords: barrier, petscobject
187 M*/
188 
189 #define PetscBarrier(A) \
190   { \
191     PetscValidHeader(A); \
192     PLogEventBegin(Petsc_Barrier,A,0,0,0); \
193     MPI_Barrier(((PetscObject)A)->comm); \
194     PLogEventEnd(Petsc_Barrier,A,0,0,0); \
195   }
196 
197 extern int PetscMPIDump(FILE *);
198 
199 /*
200       This code allows one to pass a PETSc object in C
201   to a Fortran routine, where (like all PETSc objects in
202   Fortran) it is treated as an integer.
203 */
204 extern int  PetscCObjectToFortranObject(void *,int *);
205 extern int  PetscFortranObjectToCObject(int,void *);
206 extern int  MPICCommToFortranComm(MPI_Comm,int *);
207 extern int  MPIFortranCommToCComm(int,MPI_Comm*);
208 
209 extern FILE *PetscFOpen(MPI_Comm,char *,char *);
210 extern int  PetscFClose(MPI_Comm,FILE*);
211 extern int  PetscFPrintf(MPI_Comm,FILE*,char *,...);
212 extern int  PetscPrintf(MPI_Comm,char *,...);
213 
214 extern int  PetscSynchronizedPrintf(MPI_Comm,char *,...);
215 extern int  PetscSynchronizedFlush(MPI_Comm);
216 
217 /*
218    For incremental debugging
219 */
220 extern int PetscCompare;
221 extern int PetscCompareDouble(double);
222 extern int PetscCompareScalar(Scalar);
223 extern int PetscCompareInt(int);
224 
225 /*
226    For use in debuggers
227 */
228 extern int PetscGlobalRank,PetscGlobalSize;
229 extern int PetscIntView(int,int*,Viewer);
230 extern int PetscDoubleView(int,double *,Viewer);
231 
232 #endif
233