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