1*54a8ef01SBarry Smith /* $Id: petsc.h,v 1.143 1996/10/29 18:26:41 bsmith Exp bsmith $ */ 2*54a8ef01SBarry Smith /* 3*54a8ef01SBarry Smith This is the main PETSc include file (for C and C++). It is included by 4*54a8ef01SBarry Smith all other PETSc include files so almost never has to be specifically included. 5*54a8ef01SBarry Smith */ 6*54a8ef01SBarry Smith #if !defined(__PETSC_PACKAGE) 7*54a8ef01SBarry Smith #define __PETSC_PACKAGE 8*54a8ef01SBarry Smith 9*54a8ef01SBarry Smith #define PETSC_VERSION_NUMBER "PETSc Version 2.0.16, Released ???. ?, ????." 10*54a8ef01SBarry Smith 11*54a8ef01SBarry Smith #include <stdio.h> 12*54a8ef01SBarry Smith #include "mpi.h" 13*54a8ef01SBarry Smith 14*54a8ef01SBarry Smith #if defined(PETSC_COMPLEX) 15*54a8ef01SBarry Smith #if defined(PARCH_t3d) 16*54a8ef01SBarry Smith #include "/usr/include/mpp/CC/complex.h" 17*54a8ef01SBarry Smith #else 18*54a8ef01SBarry Smith #include <complex.h> 19*54a8ef01SBarry Smith #endif 20*54a8ef01SBarry Smith extern MPI_Datatype MPIU_COMPLEX; 21*54a8ef01SBarry Smith #define MPIU_SCALAR MPIU_COMPLEX 22*54a8ef01SBarry Smith #define PetscReal(a) real(a) 23*54a8ef01SBarry Smith #define PetscImaginary(a) imag(a) 24*54a8ef01SBarry Smith #define PetscAbsScalar(a) abs(a) 25*54a8ef01SBarry Smith /* 26*54a8ef01SBarry Smith The new complex class for GNU C++ is based on templates and is not backward 27*54a8ef01SBarry Smith compatible with all previous complex class libraries. 28*54a8ef01SBarry Smith */ 29*54a8ef01SBarry Smith #if defined(USES_TEMPLATED_COMPLEX) 30*54a8ef01SBarry Smith #define Scalar complex<double> 31*54a8ef01SBarry Smith #else 32*54a8ef01SBarry Smith #define Scalar complex 33*54a8ef01SBarry Smith #endif 34*54a8ef01SBarry Smith 35*54a8ef01SBarry Smith /* Compiling for real numbers only */ 36*54a8ef01SBarry Smith #else 37*54a8ef01SBarry Smith #define MPIU_SCALAR MPI_DOUBLE 38*54a8ef01SBarry Smith #define PetscReal(a) a 39*54a8ef01SBarry Smith #define PetscImaginary(a) a 40*54a8ef01SBarry Smith #define PetscAbsScalar(a) ( ((a)<0.0) ? -(a) : (a) ) 41*54a8ef01SBarry Smith #define Scalar double 42*54a8ef01SBarry Smith #endif 43*54a8ef01SBarry Smith 44*54a8ef01SBarry Smith extern MPI_Comm PETSC_COMM_WORLD; 45*54a8ef01SBarry Smith extern int PetscInitializedCalled; 46*54a8ef01SBarry Smith extern int PetscSetCommWorld(MPI_Comm); 47*54a8ef01SBarry Smith 48*54a8ef01SBarry Smith /* PETSC_i is the imaginary number, i */ 49*54a8ef01SBarry Smith extern Scalar PETSC_i; 50*54a8ef01SBarry Smith 51*54a8ef01SBarry Smith #define PetscMin(a,b) ( ((a)<(b)) ? (a) : (b) ) 52*54a8ef01SBarry Smith #define PetscMax(a,b) ( ((a)<(b)) ? (b) : (a) ) 53*54a8ef01SBarry Smith #define PetscAbsInt(a) ( ((a)<0) ? -(a) : (a) ) 54*54a8ef01SBarry Smith #define PetscAbsDouble(a) ( ((a)<0) ? -(a) : (a) ) 55*54a8ef01SBarry Smith 56*54a8ef01SBarry Smith /* 57*54a8ef01SBarry Smith Defines the malloc employed by PETSc. Users may employ these routines as well. 58*54a8ef01SBarry Smith */ 59*54a8ef01SBarry Smith extern void *(*PetscTrMalloc)(unsigned int,int,char*); 60*54a8ef01SBarry Smith extern int (*PetscTrFree)(void *,int,char*); 61*54a8ef01SBarry Smith extern int PetscSetMalloc(void *(*)(unsigned int,int,char*),int (*)(void *,int,char*)); 62*54a8ef01SBarry Smith #define PetscMalloc(a) (*PetscTrMalloc)(a,__LINE__,__FILE__) 63*54a8ef01SBarry Smith #define PetscNew(A) (A*) PetscMalloc(sizeof(A)) 64*54a8ef01SBarry Smith #define PetscFree(a) (*PetscTrFree)(a,__LINE__,__FILE__) 65*54a8ef01SBarry Smith 66*54a8ef01SBarry Smith extern int PetscTrDump(FILE *); 67*54a8ef01SBarry Smith extern int PetscTrSpace( double *, double *,double *); 68*54a8ef01SBarry Smith extern int PetscTrValid(int ,char*); 69*54a8ef01SBarry Smith extern int PetscTrDebugLevel(int); 70*54a8ef01SBarry Smith 71*54a8ef01SBarry Smith extern void PetscMemcpy(void *,void *,int); 72*54a8ef01SBarry Smith extern void PetscMemzero(void *,int); 73*54a8ef01SBarry Smith extern int PetscMemcmp(void*, void*, int); 74*54a8ef01SBarry Smith extern int PetscStrlen(char *); 75*54a8ef01SBarry Smith extern int PetscStrcmp(char *,char *); 76*54a8ef01SBarry Smith extern int PetscStrncmp(char *,char *,int ); 77*54a8ef01SBarry Smith extern void PetscStrcpy(char *,char *); 78*54a8ef01SBarry Smith extern void PetscStrcat(char *,char *); 79*54a8ef01SBarry Smith extern void PetscStrncat(char *,char *,int); 80*54a8ef01SBarry Smith extern void PetscStrncpy(char *,char *,int); 81*54a8ef01SBarry Smith extern char* PetscStrchr(char *,char); 82*54a8ef01SBarry Smith extern char* PetscStrrchr(char *,char); 83*54a8ef01SBarry Smith extern char* PetscStrstr(char*,char*); 84*54a8ef01SBarry Smith extern char* PetscStrtok(char*,char*); 85*54a8ef01SBarry Smith extern char* PetscStrrtok(char*,char*); 86*54a8ef01SBarry Smith 87*54a8ef01SBarry Smith typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth; 88*54a8ef01SBarry Smith #define PETSC_NULL 0 89*54a8ef01SBarry Smith #define PETSC_DECIDE -1 90*54a8ef01SBarry Smith #define PETSC_DEFAULT -2 91*54a8ef01SBarry Smith 92*54a8ef01SBarry Smith /* 93*54a8ef01SBarry Smith Defines the directory where the compiled source is located; used 94*54a8ef01SBarry Smith in print error messages. __DIR__ is usually defined in the makefile. 95*54a8ef01SBarry Smith */ 96*54a8ef01SBarry Smith #if !defined(__DIR__) 97*54a8ef01SBarry Smith #define __DIR__ 0 98*54a8ef01SBarry Smith #endif 99*54a8ef01SBarry Smith 100*54a8ef01SBarry Smith /* 101*54a8ef01SBarry Smith Error codes (incomplete) 102*54a8ef01SBarry Smith */ 103*54a8ef01SBarry Smith #define PETSC_ERR_MEM 55 /* unable to allocate requested memory */ 104*54a8ef01SBarry Smith #define PETSC_ERR_SUP 56 /* no support yet for this operation */ 105*54a8ef01SBarry Smith #define PETSC_ERR_ARG 57 /* bad input argument */ 106*54a8ef01SBarry Smith #define PETSC_ERR_OBJ 58 /* null or corrupt PETSc object */ 107*54a8ef01SBarry Smith #define PETSC_ERR_SIG 59 /* signal received */ 108*54a8ef01SBarry Smith #define PETSC_ERR_SIZ 60 /* nonconforming object sizes */ 109*54a8ef01SBarry Smith #define PETSC_ERR_IDN 61 /* two arguments not allowed to be the same */ 110*54a8ef01SBarry Smith 111*54a8ef01SBarry Smith #if defined(PETSC_DEBUG) 112*54a8ef01SBarry Smith #define SETERRQ(n,s) {return PetscError(__LINE__,__DIR__,__FILE__,n,s);} 113*54a8ef01SBarry Smith #define SETERRA(n,s) {int _ierr = PetscError(__LINE__,__DIR__,__FILE__,n,s);\ 114*54a8ef01SBarry Smith MPI_Abort(PETSC_COMM_WORLD,_ierr);} 115*54a8ef01SBarry Smith #define CHKERRQ(n) {if (n) SETERRQ(n,(char *)0);} 116*54a8ef01SBarry Smith #define CHKERRA(n) {if (n) SETERRA(n,(char *)0);} 117*54a8ef01SBarry Smith #define CHKPTRQ(p) if (!p) SETERRQ(PETSC_ERR_MEM,(char*)0); 118*54a8ef01SBarry Smith #define CHKPTRA(p) if (!p) SETERRA(PETSC_ERR_MEM,(char*)0); 119*54a8ef01SBarry Smith #else 120*54a8ef01SBarry Smith #define SETERRQ(n,s) {return PetscError(__LINE__,__DIR__,__FILE__,n,s);} 121*54a8ef01SBarry Smith #define SETERRA(n,s) {int _ierr = PetscError(__LINE__,__DIR__,__FILE__,n,s);\ 122*54a8ef01SBarry Smith MPI_Abort(PETSC_COMM_WORLD,_ierr);} 123*54a8ef01SBarry Smith #define CHKERRQ(n) {if (n) SETERRQ(n,(char *)0);} 124*54a8ef01SBarry Smith #define CHKERRA(n) {if (n) SETERRA(n,(char *)0);} 125*54a8ef01SBarry Smith #define CHKPTRQ(p) if (!p) SETERRQ(PETSC_ERR_MEM,(char*)0); 126*54a8ef01SBarry Smith #define CHKPTRA(p) if (!p) SETERRA(PETSC_ERR_MEM,(char*)0); 127*54a8ef01SBarry Smith #endif 128*54a8ef01SBarry Smith 129*54a8ef01SBarry Smith /* 130*54a8ef01SBarry Smith Each PETSc object class has it's own cookie (internal integer in the 131*54a8ef01SBarry Smith data structure used for error checking). These are all defined by an offset 132*54a8ef01SBarry Smith from the lowest one, PETSC_COOKIE. If you increase these you must 133*54a8ef01SBarry Smith increase the field sizes in petsc/src/plog/src/plog.c 134*54a8ef01SBarry Smith */ 135*54a8ef01SBarry Smith #define PETSC_COOKIE 1211211 136*54a8ef01SBarry Smith #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30 137*54a8ef01SBarry Smith #define LARGEST_PETSC_COOKIE_ALLOWED PETSC_COOKIE + 50 138*54a8ef01SBarry Smith extern int LARGEST_PETSC_COOKIE; 139*54a8ef01SBarry Smith 140*54a8ef01SBarry Smith #include "viewer.h" 141*54a8ef01SBarry Smith #include "options.h" 142*54a8ef01SBarry Smith 143*54a8ef01SBarry Smith extern double PetscGetTime(); 144*54a8ef01SBarry Smith extern void PetscSleep(int); 145*54a8ef01SBarry Smith 146*54a8ef01SBarry Smith extern int PetscInitialize(int*,char***,char*,char*); 147*54a8ef01SBarry Smith extern int PetscFinalize(); 148*54a8ef01SBarry Smith extern void PetscInitializeFortran(); 149*54a8ef01SBarry Smith 150*54a8ef01SBarry Smith /* 151*54a8ef01SBarry Smith Functions that can act on any PETSc object. 152*54a8ef01SBarry Smith */ 153*54a8ef01SBarry Smith typedef struct _PetscObject* PetscObject; 154*54a8ef01SBarry Smith extern int PetscObjectDestroy(PetscObject); 155*54a8ef01SBarry Smith extern int PetscObjectExists(PetscObject,int*); 156*54a8ef01SBarry Smith extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm); 157*54a8ef01SBarry Smith extern int PetscObjectGetCookie(PetscObject,int *cookie); 158*54a8ef01SBarry Smith extern int PetscObjectGetChild(PetscObject,void **child); 159*54a8ef01SBarry Smith extern int PetscObjectGetType(PetscObject,int *type); 160*54a8ef01SBarry Smith extern int PetscObjectSetName(PetscObject,char*); 161*54a8ef01SBarry Smith extern int PetscObjectGetName(PetscObject,char**); 162*54a8ef01SBarry Smith extern int PetscObjectInherit(PetscObject,void *, int (*)(void *,void **),int (*)(void*)); 163*54a8ef01SBarry Smith extern int PetscObjectReference(PetscObject); 164*54a8ef01SBarry Smith extern int PetscObjectGetNewTag(PetscObject,int *); 165*54a8ef01SBarry Smith extern int PetscObjectRestoreNewTag(PetscObject,int *); 166*54a8ef01SBarry Smith 167*54a8ef01SBarry Smith extern int PetscTraceBackErrorHandler(int,char*,char*,int,char*,void*); 168*54a8ef01SBarry Smith extern int PetscStopErrorHandler(int,char*,char*,int,char*,void*); 169*54a8ef01SBarry Smith extern int PetscAbortErrorHandler(int,char*,char*,int,char*,void* ); 170*54a8ef01SBarry Smith extern int PetscAttachDebuggerErrorHandler(int,char*,char*,int,char*,void*); 171*54a8ef01SBarry Smith extern int PetscError(int,char*,char*,int,char*); 172*54a8ef01SBarry Smith extern int PetscPushErrorHandler(int (*handler)(int,char*,char*,int,char*,void*),void*); 173*54a8ef01SBarry Smith extern int PetscPopErrorHandler(); 174*54a8ef01SBarry Smith 175*54a8ef01SBarry Smith extern int PetscDefaultSignalHandler(int,void*); 176*54a8ef01SBarry Smith extern int PetscPushSignalHandler(int (*)(int,void *),void*); 177*54a8ef01SBarry Smith extern int PetscPopSignalHandler(); 178*54a8ef01SBarry Smith #define PETSC_FP_TRAP_OFF 0 179*54a8ef01SBarry Smith #define PETSC_FP_TRAP_ON 1 180*54a8ef01SBarry Smith extern int PetscSetFPTrap(int); 181*54a8ef01SBarry Smith 182*54a8ef01SBarry Smith #include "phead.h" 183*54a8ef01SBarry Smith #include "plog.h" 184*54a8ef01SBarry Smith 185*54a8ef01SBarry Smith extern int PetscSequentialPhaseBegin(MPI_Comm,int); 186*54a8ef01SBarry Smith extern int PetscSequentialPhaseEnd(MPI_Comm,int); 187*54a8ef01SBarry Smith 188*54a8ef01SBarry Smith /*M 189*54a8ef01SBarry Smith PetscBarrier - Blocks Until this routine is executed by all 190*54a8ef01SBarry Smith processors owning the object A. 191*54a8ef01SBarry Smith 192*54a8ef01SBarry Smith Input Parameters: 193*54a8ef01SBarry Smith . A - PETSc object ( Mat, Vec, IS, SNES etc...) 194*54a8ef01SBarry Smith 195*54a8ef01SBarry Smith Synopsis: 196*54a8ef01SBarry Smith void PetscBarrier(PetscObject obj) 197*54a8ef01SBarry Smith 198*54a8ef01SBarry Smith Notes: 199*54a8ef01SBarry Smith This routine calls MPI_Barrier with the communicator 200*54a8ef01SBarry Smith of the PETSc Object "A". 201*54a8ef01SBarry Smith 202*54a8ef01SBarry Smith .keywords: barrier, petscobject 203*54a8ef01SBarry Smith M*/ 204*54a8ef01SBarry Smith 205*54a8ef01SBarry Smith #define PetscBarrier(A) \ 206*54a8ef01SBarry Smith { \ 207*54a8ef01SBarry Smith PetscValidHeader(A); \ 208*54a8ef01SBarry Smith PLogEventBegin(Petsc_Barrier,A,0,0,0); \ 209*54a8ef01SBarry Smith MPI_Barrier(((PetscObject)A)->comm); \ 210*54a8ef01SBarry Smith PLogEventEnd(Petsc_Barrier,A,0,0,0); \ 211*54a8ef01SBarry Smith } 212*54a8ef01SBarry Smith 213*54a8ef01SBarry Smith extern int PetscMPIDump(FILE *); 214*54a8ef01SBarry Smith 215*54a8ef01SBarry Smith /* 216*54a8ef01SBarry Smith This code allows one to pass a PETSc object in C 217*54a8ef01SBarry Smith to a Fortran routine, where (like all PETSc objects in 218*54a8ef01SBarry Smith Fortran) it is treated as an integer. 219*54a8ef01SBarry Smith */ 220*54a8ef01SBarry Smith extern int PetscCObjectToFortranObject(void *a,int *b); 221*54a8ef01SBarry Smith extern int PetscFortranObjectToCObject(int a,void *b); 222*54a8ef01SBarry Smith 223*54a8ef01SBarry Smith extern FILE *PetscFOpen(MPI_Comm,char *,char *); 224*54a8ef01SBarry Smith extern int PetscFClose(MPI_Comm,FILE*); 225*54a8ef01SBarry Smith extern int PetscFPrintf(MPI_Comm,FILE*,char *,...); 226*54a8ef01SBarry Smith extern int PetscPrintf(MPI_Comm,char *,...); 227*54a8ef01SBarry Smith 228*54a8ef01SBarry Smith extern int PetscSynchronizedPrintf(MPI_Comm,char *,...); 229*54a8ef01SBarry Smith extern int PetscSynchronizedFlush(MPI_Comm); 230*54a8ef01SBarry Smith 231*54a8ef01SBarry Smith /* 232*54a8ef01SBarry Smith For incremental debugging 233*54a8ef01SBarry Smith */ 234*54a8ef01SBarry Smith extern int PetscCompare; 235*54a8ef01SBarry Smith extern int PetscCompareDouble(double); 236*54a8ef01SBarry Smith extern int PetscCompareScalar(Scalar); 237*54a8ef01SBarry Smith extern int PetscCompareInt(int); 238*54a8ef01SBarry Smith 239*54a8ef01SBarry Smith /* 240*54a8ef01SBarry Smith For use in debuggers 241*54a8ef01SBarry Smith */ 242*54a8ef01SBarry Smith extern int PetscGlobalRank,PetscGlobalSize; 243*54a8ef01SBarry Smith extern int PetscIntView(int,int*,Viewer); 244*54a8ef01SBarry Smith extern int PetscDoubleView(int,double *,Viewer); 245*54a8ef01SBarry Smith 246*54a8ef01SBarry Smith #endif 247