xref: /petsc/include/petsc.h (revision 029af93f72d387caa45cf6909ac9aed2d04296ca)
1 /* $Id: petsc.h,v 1.155 1997/04/05 15:27:50 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.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 void       PetscSleep(int);
129 
130 extern int    PetscInitialize(int*,char***,char*,char*);
131 extern int    PetscFinalize();
132 extern void   PetscInitializeFortran();
133 
134 /*
135     Functions that can act on any PETSc object.
136 */
137 typedef struct _PetscObject* PetscObject;
138 extern int PetscObjectDestroy(PetscObject);
139 extern int PetscObjectExists(PetscObject,int*);
140 extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
141 extern int PetscObjectGetCookie(PetscObject,int *cookie);
142 extern int PetscObjectGetChild(PetscObject,void **child);
143 extern int PetscObjectGetType(PetscObject,int *type);
144 extern int PetscObjectSetName(PetscObject,char*);
145 extern int PetscObjectGetName(PetscObject,char**);
146 extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*));
147 extern int PetscObjectReference(PetscObject);
148 extern int PetscObjectGetNewTag(PetscObject,int *);
149 extern int PetscObjectRestoreNewTag(PetscObject,int *);
150 
151 #include "petscerror.h"
152 #include "petschead.h"
153 #include "petsclog.h"
154 
155 extern int  PetscSequentialPhaseBegin(MPI_Comm,int);
156 extern int  PetscSequentialPhaseEnd(MPI_Comm,int);
157 
158 /*M
159     PetscBarrier - Blocks until this routine is executed by all
160                    processors owning the object A.
161 
162    Input Parameters:
163 .  A - PETSc object  ( Mat, Vec, IS, SNES etc...)
164 
165    Synopsis:
166    void PetscBarrier(PetscObject obj)
167 
168   Notes:
169   This routine calls MPI_Barrier with the communicator
170   of the PETSc Object "A".
171 
172 .keywords: barrier, petscobject
173 M*/
174 
175 #define PetscBarrier(A) \
176   { \
177     PetscValidHeader(A); \
178     PLogEventBegin(Petsc_Barrier,A,0,0,0); \
179     MPI_Barrier(((PetscObject)A)->comm); \
180     PLogEventEnd(Petsc_Barrier,A,0,0,0); \
181   }
182 
183 extern int PetscMPIDump(FILE *);
184 
185 /*
186       This code allows one to pass a PETSc object in C
187   to a Fortran routine, where (like all PETSc objects in
188   Fortran) it is treated as an integer.
189 */
190 extern int  PetscCObjectToFortranObject(void *a,int *b);
191 extern int  PetscFortranObjectToCObject(int a,void *b);
192 
193 extern FILE *PetscFOpen(MPI_Comm,char *,char *);
194 extern int  PetscFClose(MPI_Comm,FILE*);
195 extern int  PetscFPrintf(MPI_Comm,FILE*,char *,...);
196 extern int  PetscPrintf(MPI_Comm,char *,...);
197 
198 extern int  PetscSynchronizedPrintf(MPI_Comm,char *,...);
199 extern int  PetscSynchronizedFlush(MPI_Comm);
200 
201 /*
202    For incremental debugging
203 */
204 extern int PetscCompare;
205 extern int PetscCompareDouble(double);
206 extern int PetscCompareScalar(Scalar);
207 extern int PetscCompareInt(int);
208 
209 /*
210    For use in debuggers
211 */
212 extern int PetscGlobalRank,PetscGlobalSize;
213 extern int PetscIntView(int,int*,Viewer);
214 extern int PetscDoubleView(int,double *,Viewer);
215 
216 #endif
217