1 /* $Id: petsc.h,v 1.156 1997/04/10 00:08:17 bsmith Exp balay $ */ 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 PLogDouble PetscGetCPUTime(); 129 extern void PetscSleep(int); 130 131 extern int PetscInitialize(int*,char***,char*,char*); 132 extern int PetscFinalize(); 133 extern void PetscInitializeFortran(); 134 135 /* 136 Functions that can act on any PETSc object. 137 */ 138 typedef struct _PetscObject* PetscObject; 139 extern int PetscObjectDestroy(PetscObject); 140 extern int PetscObjectExists(PetscObject,int*); 141 extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm); 142 extern int PetscObjectGetCookie(PetscObject,int *cookie); 143 extern int PetscObjectGetChild(PetscObject,void **child); 144 extern int PetscObjectGetType(PetscObject,int *type); 145 extern int PetscObjectSetName(PetscObject,char*); 146 extern int PetscObjectGetName(PetscObject,char**); 147 extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*)); 148 extern int PetscObjectReference(PetscObject); 149 extern int PetscObjectGetNewTag(PetscObject,int *); 150 extern int PetscObjectRestoreNewTag(PetscObject,int *); 151 152 #include "petscerror.h" 153 #include "petschead.h" 154 #include "petsclog.h" 155 156 extern int PetscSequentialPhaseBegin(MPI_Comm,int); 157 extern int PetscSequentialPhaseEnd(MPI_Comm,int); 158 159 /*M 160 PetscBarrier - Blocks until this routine is executed by all 161 processors owning the object A. 162 163 Input Parameters: 164 . A - PETSc object ( Mat, Vec, IS, SNES etc...) 165 166 Synopsis: 167 void PetscBarrier(PetscObject obj) 168 169 Notes: 170 This routine calls MPI_Barrier with the communicator 171 of the PETSc Object "A". 172 173 .keywords: barrier, petscobject 174 M*/ 175 176 #define PetscBarrier(A) \ 177 { \ 178 PetscValidHeader(A); \ 179 PLogEventBegin(Petsc_Barrier,A,0,0,0); \ 180 MPI_Barrier(((PetscObject)A)->comm); \ 181 PLogEventEnd(Petsc_Barrier,A,0,0,0); \ 182 } 183 184 extern int PetscMPIDump(FILE *); 185 186 /* 187 This code allows one to pass a PETSc object in C 188 to a Fortran routine, where (like all PETSc objects in 189 Fortran) it is treated as an integer. 190 */ 191 extern int PetscCObjectToFortranObject(void *a,int *b); 192 extern int PetscFortranObjectToCObject(int a,void *b); 193 194 extern FILE *PetscFOpen(MPI_Comm,char *,char *); 195 extern int PetscFClose(MPI_Comm,FILE*); 196 extern int PetscFPrintf(MPI_Comm,FILE*,char *,...); 197 extern int PetscPrintf(MPI_Comm,char *,...); 198 199 extern int PetscSynchronizedPrintf(MPI_Comm,char *,...); 200 extern int PetscSynchronizedFlush(MPI_Comm); 201 202 /* 203 For incremental debugging 204 */ 205 extern int PetscCompare; 206 extern int PetscCompareDouble(double); 207 extern int PetscCompareScalar(Scalar); 208 extern int PetscCompareInt(int); 209 210 /* 211 For use in debuggers 212 */ 213 extern int PetscGlobalRank,PetscGlobalSize; 214 extern int PetscIntView(int,int*,Viewer); 215 extern int PetscDoubleView(int,double *,Viewer); 216 217 #endif 218