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