xref: /petsc/include/petsc.h (revision 7a00f4a9c32e0cfbbf28c557905ad8a9142e24e7)
1 /* $Id: petsc.h,v 1.148 1997/01/06 20:31:55 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.16, Released Dec. 10, 1996."
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 extern MPI_Comm PETSC_COMM_WORLD;
47 extern int      PetscInitializedCalled;
48 extern int      PetscSetCommWorld(MPI_Comm);
49 
50 /* PETSC_i is the imaginary number, i */
51 extern  Scalar            PETSC_i;
52 
53 #define PetscMin(a,b)      ( ((a)<(b)) ? (a) : (b) )
54 #define PetscMax(a,b)      ( ((a)<(b)) ? (b) : (a) )
55 #define PetscAbsInt(a)     ( ((a)<0)   ? -(a) : (a) )
56 #define PetscAbsDouble(a)  ( ((a)<0)   ? -(a) : (a) )
57 
58 /*
59     Defines the malloc employed by PETSc. Users may employ these routines as well.
60 */
61 extern void *(*PetscTrMalloc)(unsigned int,int,char*,char*,char*);
62 extern int  (*PetscTrFree)(void *,int,char*,char*,char*);
63 extern int  PetscSetMalloc(void *(*)(unsigned int,int,char*,char*,char*),
64                            int (*)(void *,int,char*,char*,char*));
65 #define PetscMalloc(a)       (*PetscTrMalloc)(a,__LINE__,__FUNC__,__FILE__,__DIR__)
66 #define PetscNew(A)          (A*) PetscMalloc(sizeof(A))
67 #define PetscFree(a)         (*PetscTrFree)(a,__LINE__,__FUNC__,__FILE__,__DIR__)
68 
69 extern int   PetscTrDump(FILE *);
70 extern int   PetscTrSpace( double *, double *,double *);
71 extern int   PetscTrValid(int,char *,char *,char *);
72 extern int   PetscTrDebugLevel(int);
73 
74 extern void  PetscMemcpy(void *,void *,int);
75 extern void  PetscMemzero(void *,int);
76 extern int   PetscMemcmp(void*, void*, int);
77 extern int   PetscStrlen(char *);
78 extern int   PetscStrcmp(char *,char *);
79 extern int   PetscStrncmp(char *,char *,int );
80 extern void  PetscStrcpy(char *,char *);
81 extern void  PetscStrcat(char *,char *);
82 extern void  PetscStrncat(char *,char *,int);
83 extern void  PetscStrncpy(char *,char *,int);
84 extern char* PetscStrchr(char *,char);
85 extern char* PetscStrrchr(char *,char);
86 extern char* PetscStrstr(char*,char*);
87 extern char* PetscStrtok(char*,char*);
88 extern char* PetscStrrtok(char*,char*);
89 
90 typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth;
91 #define PETSC_NULL            0
92 #define PETSC_DECIDE         -1
93 #define PETSC_DEFAULT        -2
94 
95 /*
96     Each PETSc object class has it's own cookie (internal integer in the
97   data structure used for error checking). These are all defined by an offset
98   from the lowest one, PETSC_COOKIE. If you increase these you must
99   increase the field sizes in petsc/src/plog/src/plog.c
100 */
101 #define PETSC_COOKIE                1211211
102 #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30
103 #define LARGEST_PETSC_COOKIE_ALLOWED    PETSC_COOKIE + 50
104 extern int LARGEST_PETSC_COOKIE;
105 
106 #include "viewer.h"
107 #include "options.h"
108 
109 extern double PetscGetTime();
110 extern void   PetscSleep(int);
111 
112 extern int    PetscInitialize(int*,char***,char*,char*);
113 extern int    PetscFinalize();
114 extern void   PetscInitializeFortran();
115 
116 /*
117     Functions that can act on any PETSc object.
118 */
119 typedef struct _PetscObject* PetscObject;
120 extern int PetscObjectDestroy(PetscObject);
121 extern int PetscObjectExists(PetscObject,int*);
122 extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
123 extern int PetscObjectGetCookie(PetscObject,int *cookie);
124 extern int PetscObjectGetChild(PetscObject,void **child);
125 extern int PetscObjectGetType(PetscObject,int *type);
126 extern int PetscObjectSetName(PetscObject,char*);
127 extern int PetscObjectGetName(PetscObject,char**);
128 extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*));
129 extern int PetscObjectReference(PetscObject);
130 extern int PetscObjectGetNewTag(PetscObject,int *);
131 extern int PetscObjectRestoreNewTag(PetscObject,int *);
132 
133 #include "petscerror.h"
134 #include "petschead.h"
135 #include "petsclog.h"
136 
137 extern int  PetscSequentialPhaseBegin(MPI_Comm,int);
138 extern int  PetscSequentialPhaseEnd(MPI_Comm,int);
139 
140 /*M
141     PetscBarrier - Blocks Until this routine is executed by all
142                    processors owning the object A.
143 
144    Input Parameters:
145 .  A - PETSc object  ( Mat, Vec, IS, SNES etc...)
146 
147    Synopsis:
148    void PetscBarrier(PetscObject obj)
149 
150   Notes:
151   This routine calls MPI_Barrier with the communicator
152   of the PETSc Object "A".
153 
154 .keywords: barrier, petscobject
155 M*/
156 
157 #define PetscBarrier(A) \
158   { \
159     PetscValidHeader(A); \
160     PLogEventBegin(Petsc_Barrier,A,0,0,0); \
161     MPI_Barrier(((PetscObject)A)->comm); \
162     PLogEventEnd(Petsc_Barrier,A,0,0,0); \
163   }
164 
165 extern int PetscMPIDump(FILE *);
166 
167 /*
168       This code allows one to pass a PETSc object in C
169   to a Fortran routine, where (like all PETSc objects in
170   Fortran) it is treated as an integer.
171 */
172 extern int PetscCObjectToFortranObject(void *a,int *b);
173 extern int PetscFortranObjectToCObject(int a,void *b);
174 
175 extern FILE *PetscFOpen(MPI_Comm,char *,char *);
176 extern int  PetscFClose(MPI_Comm,FILE*);
177 extern int  PetscFPrintf(MPI_Comm,FILE*,char *,...);
178 extern int  PetscPrintf(MPI_Comm,char *,...);
179 
180 extern int  PetscSynchronizedPrintf(MPI_Comm,char *,...);
181 extern int  PetscSynchronizedFlush(MPI_Comm);
182 
183 /*
184    For incremental debugging
185 */
186 extern int PetscCompare;
187 extern int PetscCompareDouble(double);
188 extern int PetscCompareScalar(Scalar);
189 extern int PetscCompareInt(int);
190 
191 /*
192    For use in debuggers
193 */
194 extern int PetscGlobalRank,PetscGlobalSize;
195 extern int PetscIntView(int,int*,Viewer);
196 extern int PetscDoubleView(int,double *,Viewer);
197 
198 #endif
199