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