xref: /petsc/include/petsc.h (revision 96854ed6ad2ded53123cd28a73515071866c9e4e)
1 /* $Id: petsc.h,v 1.157 1997/04/14 17:02:15 balay 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       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  PetscMemzero(void *,int);
104 extern int   PetscMemcmp(void*, void*, int);
105 extern int   PetscStrlen(char *);
106 extern int   PetscStrcmp(char *,char *);
107 extern int   PetscStrncmp(char *,char *,int );
108 extern void  PetscStrcpy(char *,char *);
109 extern void  PetscStrcat(char *,char *);
110 extern void  PetscStrncat(char *,char *,int);
111 extern void  PetscStrncpy(char *,char *,int);
112 extern char* PetscStrchr(char *,char);
113 extern char* PetscStrrchr(char *,char);
114 extern char* PetscStrstr(char*,char*);
115 extern char* PetscStrtok(char*,char*);
116 extern char* PetscStrrtok(char*,char*);
117 
118 typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth;
119 #define PETSC_NULL            0
120 #define PETSC_DECIDE         -1
121 #define PETSC_DEFAULT        -2
122 
123 /*
124     Each PETSc object class has it's own cookie (internal integer in the
125   data structure used for error checking). These are all defined by an offset
126   from the lowest one, PETSC_COOKIE. If you increase these you must
127   increase the field sizes in petsc/src/plog/src/plog.c
128 */
129 #define PETSC_COOKIE                    1211211
130 #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30
131 #define LARGEST_PETSC_COOKIE_ALLOWED    PETSC_COOKIE + 50
132 extern int LARGEST_PETSC_COOKIE;
133 
134 #include "viewer.h"
135 #include "options.h"
136 #include "draw.h"
137 
138 extern PLogDouble PetscGetTime();
139 extern PLogDouble PetscGetCPUTime();
140 extern void       PetscSleep(int);
141 
142 extern int    PetscInitialize(int*,char***,char*,char*);
143 extern int    PetscFinalize();
144 extern void   PetscInitializeFortran();
145 
146 /*
147     Functions that can act on any PETSc object.
148 */
149 typedef struct _PetscObject* PetscObject;
150 extern int PetscObjectDestroy(PetscObject);
151 extern int PetscObjectExists(PetscObject,int*);
152 extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
153 extern int PetscObjectGetCookie(PetscObject,int *cookie);
154 extern int PetscObjectGetChild(PetscObject,void **child);
155 extern int PetscObjectGetType(PetscObject,int *type);
156 extern int PetscObjectSetName(PetscObject,char*);
157 extern int PetscObjectGetName(PetscObject,char**);
158 extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*));
159 extern int PetscObjectReference(PetscObject);
160 extern int PetscObjectGetNewTag(PetscObject,int *);
161 extern int PetscObjectRestoreNewTag(PetscObject,int *);
162 
163 #include "petscerror.h"
164 #include "petschead.h"
165 #include "petsclog.h"
166 
167 extern int  PetscSequentialPhaseBegin(MPI_Comm,int);
168 extern int  PetscSequentialPhaseEnd(MPI_Comm,int);
169 
170 /*M
171     PetscBarrier - Blocks until this routine is executed by all
172                    processors owning the object A.
173 
174    Input Parameters:
175 .  A - PETSc object  ( Mat, Vec, IS, SNES etc...)
176 
177    Synopsis:
178    void PetscBarrier(PetscObject obj)
179 
180   Notes:
181   This routine calls MPI_Barrier with the communicator
182   of the PETSc Object "A".
183 
184 .keywords: barrier, petscobject
185 M*/
186 
187 #define PetscBarrier(A) \
188   { \
189     PetscValidHeader(A); \
190     PLogEventBegin(Petsc_Barrier,A,0,0,0); \
191     MPI_Barrier(((PetscObject)A)->comm); \
192     PLogEventEnd(Petsc_Barrier,A,0,0,0); \
193   }
194 
195 extern int PetscMPIDump(FILE *);
196 
197 /*
198       This code allows one to pass a PETSc object in C
199   to a Fortran routine, where (like all PETSc objects in
200   Fortran) it is treated as an integer.
201 */
202 extern int  PetscCObjectToFortranObject(void *a,int *b);
203 extern int  PetscFortranObjectToCObject(int a,void *b);
204 
205 extern FILE *PetscFOpen(MPI_Comm,char *,char *);
206 extern int  PetscFClose(MPI_Comm,FILE*);
207 extern int  PetscFPrintf(MPI_Comm,FILE*,char *,...);
208 extern int  PetscPrintf(MPI_Comm,char *,...);
209 
210 extern int  PetscSynchronizedPrintf(MPI_Comm,char *,...);
211 extern int  PetscSynchronizedFlush(MPI_Comm);
212 
213 /*
214    For incremental debugging
215 */
216 extern int PetscCompare;
217 extern int PetscCompareDouble(double);
218 extern int PetscCompareScalar(Scalar);
219 extern int PetscCompareInt(int);
220 
221 /*
222    For use in debuggers
223 */
224 extern int PetscGlobalRank,PetscGlobalSize;
225 extern int PetscIntView(int,int*,Viewer);
226 extern int PetscDoubleView(int,double *,Viewer);
227 
228 #endif
229