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