1*cafa780aSBarry Smith /* $Id: petsc.h,v 1.244 1999/03/31 03:40:39 bsmith Exp balay $ */ 2*cafa780aSBarry Smith /* 3*cafa780aSBarry Smith This is the main PETSc include file (for C and C++). It is included by all 4*cafa780aSBarry Smith other PETSc include files, so it almost never has to be specifically included. 5*cafa780aSBarry Smith */ 6*cafa780aSBarry Smith #if !defined(__PETSC_H) 7*cafa780aSBarry Smith #define __PETSC_H 8*cafa780aSBarry Smith 9*cafa780aSBarry Smith /* ========================================================================== */ 10*cafa780aSBarry Smith /* 11*cafa780aSBarry Smith Current PETSc version number and release date, also listed in 12*cafa780aSBarry Smith docs/changes.html 13*cafa780aSBarry Smith docs/tex/manual/manual.tex and 14*cafa780aSBarry Smith docs/tex/manual/manual_tex.tex. 15*cafa780aSBarry Smith */ 16*cafa780aSBarry Smith #define PETSC_VERSION_NUMBER "PETSc Version 2.0.24, Released April 6, 1999" 17*cafa780aSBarry Smith 18*cafa780aSBarry Smith #define PETSC_VERSION_MAJOR 2 19*cafa780aSBarry Smith #define PETSC_VERSION_MINOR 0 20*cafa780aSBarry Smith #define PETSC_VERSION_SUBMINOR 24 21*cafa780aSBarry Smith #define PETSC_VERSION_DATE "April 6, 1998" 22*cafa780aSBarry Smith #define PETSC_AUTHOR_INFO "The PETSc Team:\ 23*cafa780aSBarry Smith Satish Balay, Bill Gropp, Lois Curfman McInnes, Barry Smith\n\ 24*cafa780aSBarry Smith Bug reports, questions: petsc-maint@mcs.anl.gov\n\ 25*cafa780aSBarry Smith Web page: http://www.mcs.anl.gov/petsc/\n" 26*cafa780aSBarry Smith 27*cafa780aSBarry Smith /* ========================================================================== */ 28*cafa780aSBarry Smith /* 29*cafa780aSBarry Smith The PETSc configuration file. Contains various definitions that 30*cafa780aSBarry Smith handle portability issues and the presence of machine features. 31*cafa780aSBarry Smith 32*cafa780aSBarry Smith petscconf.h is contained in bmake/${PETSC_ARCH}/petscconf.h it is 33*cafa780aSBarry Smith found automatically by the compiler due to the -I${PETSC_DIR}/bmake/${PETSC_ARCH} 34*cafa780aSBarry Smith in the bmake/common definition of PETSC_INCLUDE 35*cafa780aSBarry Smith */ 36*cafa780aSBarry Smith #include "petscconf.h" 37*cafa780aSBarry Smith 38*cafa780aSBarry Smith /* ========================================================================== */ 39*cafa780aSBarry Smith 40*cafa780aSBarry Smith #include <stdio.h> 41*cafa780aSBarry Smith /* 42*cafa780aSBarry Smith Defines the interface to MPI allowing the use of all MPI functions. 43*cafa780aSBarry Smith */ 44*cafa780aSBarry Smith #include "mpi.h" 45*cafa780aSBarry Smith 46*cafa780aSBarry Smith /* 47*cafa780aSBarry Smith Defines some elementary mathematics functions and constants. 48*cafa780aSBarry Smith */ 49*cafa780aSBarry Smith #include "petscmath.h" 50*cafa780aSBarry Smith 51*cafa780aSBarry Smith /* 52*cafa780aSBarry Smith Variable type where we stash PETSc object pointers in Fortran. 53*cafa780aSBarry Smith Assumes that sizeof(long) == sizeof(void *) which is true on 54*cafa780aSBarry Smith all machines that we know. 55*cafa780aSBarry Smith */ 56*cafa780aSBarry Smith #define PetscFortranAddr long 57*cafa780aSBarry Smith 58*cafa780aSBarry Smith extern MPI_Comm PETSC_COMM_WORLD; 59*cafa780aSBarry Smith extern MPI_Comm PETSC_COMM_SELF; 60*cafa780aSBarry Smith extern int PetscInitializedCalled; 61*cafa780aSBarry Smith extern int PetscSetCommWorld(MPI_Comm); 62*cafa780aSBarry Smith 63*cafa780aSBarry Smith /* 64*cafa780aSBarry Smith Defines the malloc employed by PETSc. Users may use these routines as well. 65*cafa780aSBarry Smith */ 66*cafa780aSBarry Smith #define PetscMalloc(a) (*PetscTrMalloc)(a,__LINE__,__FUNC__,__FILE__,__SDIR__) 67*cafa780aSBarry Smith #define PetscNew(A) (A*) PetscMalloc(sizeof(A)) 68*cafa780aSBarry Smith #define PetscFree(a) (*PetscTrFree)(a,__LINE__,__FUNC__,__FILE__,__SDIR__) 69*cafa780aSBarry Smith extern void *(*PetscTrMalloc)(int,int,char*,char*,char*); 70*cafa780aSBarry Smith extern int (*PetscTrFree)(void *,int,char*,char*,char*); 71*cafa780aSBarry Smith extern int PetscSetMalloc(void *(*)(int,int,char*,char*,char*), 72*cafa780aSBarry Smith int (*)(void *,int,char*,char*,char*)); 73*cafa780aSBarry Smith extern int PetscClearMalloc(void); 74*cafa780aSBarry Smith 75*cafa780aSBarry Smith /* 76*cafa780aSBarry Smith Routines for tracing memory corruption/bleeding with default PETSc 77*cafa780aSBarry Smith memory allocation 78*cafa780aSBarry Smith */ 79*cafa780aSBarry Smith extern int PetscTrDump(FILE *); 80*cafa780aSBarry Smith extern int PetscTrSpace(PLogDouble *, PLogDouble *,PLogDouble *); 81*cafa780aSBarry Smith extern int PetscTrValid(int,const char[],const char[],const char[]); 82*cafa780aSBarry Smith extern int PetscTrDebugLevel(int); 83*cafa780aSBarry Smith extern int PetscTrLog(void); 84*cafa780aSBarry Smith extern int PetscTrLogDump(FILE *); 85*cafa780aSBarry Smith extern int PetscGetResidentSetSize(PLogDouble *); 86*cafa780aSBarry Smith 87*cafa780aSBarry Smith /* 88*cafa780aSBarry Smith Constants and functions used for handling different basic data types. 89*cafa780aSBarry Smith These are used, for example, in binary IO routines 90*cafa780aSBarry Smith */ 91*cafa780aSBarry Smith typedef enum {PETSC_INT = 0, PETSC_DOUBLE = 1, PETSC_SHORT = 2, PETSC_FLOAT = 3, 92*cafa780aSBarry Smith PETSC_COMPLEX = 4, PETSC_CHAR = 5, PETSC_LOGICAL = 6} PetscDataType; 93*cafa780aSBarry Smith #if defined(USE_PETSC_COMPLEX) 94*cafa780aSBarry Smith #define PETSC_SCALAR PETSC_COMPLEX 95*cafa780aSBarry Smith #else 96*cafa780aSBarry Smith #define PETSC_SCALAR PETSC_DOUBLE 97*cafa780aSBarry Smith #endif 98*cafa780aSBarry Smith typedef enum {PETSC_INT_SIZE = sizeof(int), PETSC_DOUBLE_SIZE = sizeof(double), 99*cafa780aSBarry Smith PETSC_SCALAR_SIZE = sizeof(Scalar), PETSC_COMPLEX_SIZE = sizeof(double), 100*cafa780aSBarry Smith PETSC_CHAR_SIZE = sizeof(char), PETSC_LOGICAL_SIZE = 1} PetscDataTypeSize; 101*cafa780aSBarry Smith extern int PetscDataTypeToMPIDataType(PetscDataType,MPI_Datatype*); 102*cafa780aSBarry Smith extern int PetscDataTypeGetSize(PetscDataType,int*); 103*cafa780aSBarry Smith extern int PetscDataTypeGetName(PetscDataType,char*[]); 104*cafa780aSBarry Smith 105*cafa780aSBarry Smith /* 106*cafa780aSBarry Smith Basic memory and string operations. These are usually simple wrappers 107*cafa780aSBarry Smith around the basic Unix system calls, but a few of them have additional 108*cafa780aSBarry Smith functionality and/or error checking. 109*cafa780aSBarry Smith */ 110*cafa780aSBarry Smith extern int PetscMemcpy(void *,const void *,int); 111*cafa780aSBarry Smith extern int PetscBitMemcpy(void*,int,const void*,int,int,PetscDataType); 112*cafa780aSBarry Smith extern int PetscMemmove(void *,void *,int); 113*cafa780aSBarry Smith extern int PetscMemzero(void *,int); 114*cafa780aSBarry Smith extern int PetscMemcmp(const void*,const void*, int); 115*cafa780aSBarry Smith extern int PetscStrlen(const char[]); 116*cafa780aSBarry Smith extern int PetscStrcmp(const char[],const char[]); 117*cafa780aSBarry Smith extern int PetscStrcasecmp(const char[],const char[]); 118*cafa780aSBarry Smith extern int PetscStrncmp(const char[],const char[],int ); 119*cafa780aSBarry Smith extern int PetscStrcpy(char[],const char[]); 120*cafa780aSBarry Smith extern int PetscStrcat(char[],const char[]); 121*cafa780aSBarry Smith extern int PetscStrncat(char[],const char[],int); 122*cafa780aSBarry Smith extern int PetscStrncpy(char[],const char[],int); 123*cafa780aSBarry Smith extern char* PetscStrchr(const char[],char); 124*cafa780aSBarry Smith extern char* PetscStrrchr(const char[],char); 125*cafa780aSBarry Smith extern char* PetscStrstr(const char[],const char[]); 126*cafa780aSBarry Smith extern char* PetscStrtok(const char[],const char[]); 127*cafa780aSBarry Smith 128*cafa780aSBarry Smith #define PetscTypeCompare(a,b) (!PetscStrcmp((char*)(a),(char *)(b))) 129*cafa780aSBarry Smith 130*cafa780aSBarry Smith /* 131*cafa780aSBarry Smith Basic PETSc constants 132*cafa780aSBarry Smith */ 133*cafa780aSBarry Smith typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth; 134*cafa780aSBarry Smith #define PETSC_NULL 0 135*cafa780aSBarry Smith #define PETSC_DECIDE -1 136*cafa780aSBarry Smith #define PETSC_DETERMINE PETSC_DECIDE 137*cafa780aSBarry Smith #define PETSC_DEFAULT -2 138*cafa780aSBarry Smith 139*cafa780aSBarry Smith /* 140*cafa780aSBarry Smith Each PETSc object class has it's own cookie (internal integer in the 141*cafa780aSBarry Smith data structure used for error checking). These are all defined by an offset 142*cafa780aSBarry Smith from the lowest one, PETSC_COOKIE. If you increase these you must 143*cafa780aSBarry Smith increase the field sizes in petsc/src/sys/src/plog/plog.c 144*cafa780aSBarry Smith */ 145*cafa780aSBarry Smith #define PETSC_COOKIE 1211211 146*cafa780aSBarry Smith #define LARGEST_PETSC_COOKIE_PREDEFINED PETSC_COOKIE + 30 147*cafa780aSBarry Smith #define LARGEST_PETSC_COOKIE_ALLOWED PETSC_COOKIE + 50 148*cafa780aSBarry Smith extern int LARGEST_PETSC_COOKIE; 149*cafa780aSBarry Smith 150*cafa780aSBarry Smith typedef struct _FList *FList; 151*cafa780aSBarry Smith 152*cafa780aSBarry Smith #include "viewer.h" 153*cafa780aSBarry Smith #include "options.h" 154*cafa780aSBarry Smith 155*cafa780aSBarry Smith extern int PetscGetTime(PLogDouble*); 156*cafa780aSBarry Smith extern int PetscGetCPUTime(PLogDouble*); 157*cafa780aSBarry Smith extern int PetscSleep(int); 158*cafa780aSBarry Smith 159*cafa780aSBarry Smith /* 160*cafa780aSBarry Smith Initialization of PETSc or its micro-kernel ALICE 161*cafa780aSBarry Smith */ 162*cafa780aSBarry Smith extern int AliceInitialize(int*,char***,const char[],const char[]); 163*cafa780aSBarry Smith extern int AliceInitializeNoArguments(void); 164*cafa780aSBarry Smith extern int AliceFinalize(void); 165*cafa780aSBarry Smith extern void AliceInitializeFortran(void); 166*cafa780aSBarry Smith 167*cafa780aSBarry Smith extern int PetscInitialize(int*,char***,char[],const char[]); 168*cafa780aSBarry Smith extern int PetscInitializeNoArguments(void); 169*cafa780aSBarry Smith extern int PetscFinalize(void); 170*cafa780aSBarry Smith extern void PetscInitializeFortran(void); 171*cafa780aSBarry Smith 172*cafa780aSBarry Smith /* 173*cafa780aSBarry Smith Functions that can act on any PETSc object. 174*cafa780aSBarry Smith */ 175*cafa780aSBarry Smith typedef struct _p_PetscObject* PetscObject; 176*cafa780aSBarry Smith extern int PetscObjectDestroy(PetscObject); 177*cafa780aSBarry Smith extern int PetscObjectExists(PetscObject,PetscTruth*); 178*cafa780aSBarry Smith extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm); 179*cafa780aSBarry Smith extern int PetscObjectGetCookie(PetscObject,int *cookie); 180*cafa780aSBarry Smith extern int PetscObjectGetType(PetscObject,int *type); 181*cafa780aSBarry Smith extern int PetscObjectSetName(PetscObject,const char[]); 182*cafa780aSBarry Smith extern int PetscObjectGetName(PetscObject,char*[]); 183*cafa780aSBarry Smith extern int PetscObjectReference(PetscObject); 184*cafa780aSBarry Smith extern int PetscObjectGetReference(PetscObject,int*); 185*cafa780aSBarry Smith extern int PetscObjectDereference(PetscObject); 186*cafa780aSBarry Smith extern int PetscObjectGetNewTag(PetscObject,int *); 187*cafa780aSBarry Smith extern int PetscObjectRestoreNewTag(PetscObject,int *); 188*cafa780aSBarry Smith extern int PetscCommGetNewTag(MPI_Comm,int *); 189*cafa780aSBarry Smith extern int PetscCommRestoreNewTag(MPI_Comm,int *); 190*cafa780aSBarry Smith extern int PetscObjectView(PetscObject,Viewer); 191*cafa780aSBarry Smith extern int PetscObjectCompose(PetscObject,const char[],PetscObject); 192*cafa780aSBarry Smith extern int PetscObjectQuery(PetscObject,const char[],PetscObject *); 193*cafa780aSBarry Smith extern int PetscObjectComposeFunction_Private(PetscObject,const char[],const char[],void *); 194*cafa780aSBarry Smith #if defined(USE_DYNAMIC_LIBRARIES) 195*cafa780aSBarry Smith #define PetscObjectComposeFunction(a,b,c,d) PetscObjectComposeFunction_Private(a,b,c,0) 196*cafa780aSBarry Smith #else 197*cafa780aSBarry Smith #define PetscObjectComposeFunction(a,b,c,d) PetscObjectComposeFunction_Private(a,b,c,d) 198*cafa780aSBarry Smith #endif 199*cafa780aSBarry Smith extern int PetscObjectQueryFunction(PetscObject,const char[],void **); 200*cafa780aSBarry Smith extern int PetscObjectSetOptionsPrefix(PetscObject,const char[]); 201*cafa780aSBarry Smith extern int PetscObjectAppendOptionsPrefix(PetscObject,const char[]); 202*cafa780aSBarry Smith extern int PetscObjectPrependOptionsPrefix(PetscObject,const char[]); 203*cafa780aSBarry Smith extern int PetscObjectGetOptionsPrefix(PetscObject,char*[]); 204*cafa780aSBarry Smith extern int PetscObjectPublish(PetscObject); 205*cafa780aSBarry Smith 206*cafa780aSBarry Smith /* 207*cafa780aSBarry Smith Defines PETSc error handling. 208*cafa780aSBarry Smith */ 209*cafa780aSBarry Smith #include "petscerror.h" 210*cafa780aSBarry Smith 211*cafa780aSBarry Smith /* 212*cafa780aSBarry Smith Mechanism for managing lists of objects attached (composed) with 213*cafa780aSBarry Smith a PETSc object. 214*cafa780aSBarry Smith */ 215*cafa780aSBarry Smith typedef struct _OList *OList; 216*cafa780aSBarry Smith extern int OListDestroy(OList *); 217*cafa780aSBarry Smith extern int OListFind(OList,const char[],PetscObject*); 218*cafa780aSBarry Smith extern int OListReverseFind(OList,PetscObject,char**); 219*cafa780aSBarry Smith extern int OListAdd(OList *,const char[],PetscObject); 220*cafa780aSBarry Smith extern int OListDuplicate(OList,OList *); 221*cafa780aSBarry Smith 222*cafa780aSBarry Smith /* 223*cafa780aSBarry Smith Dynamic library lists. Lists of names of routines in dynamic 224*cafa780aSBarry Smith link libraries that will be loaded as needed. 225*cafa780aSBarry Smith */ 226*cafa780aSBarry Smith extern int FListAdd_Private(FList*,const char[],const char[],int (*)(void *)); 227*cafa780aSBarry Smith extern int FListDestroy(FList); 228*cafa780aSBarry Smith extern int FListFind(MPI_Comm,FList,const char[],int (**)(void*)); 229*cafa780aSBarry Smith extern int FListPrintTypes(MPI_Comm,FILE*,const char[],const char[],FList); 230*cafa780aSBarry Smith #if defined(USE_DYNAMIC_LIBRARIES) 231*cafa780aSBarry Smith #define FListAdd(a,b,p,c) FListAdd_Private(a,b,p,0) 232*cafa780aSBarry Smith #else 233*cafa780aSBarry Smith #define FListAdd(a,b,p,c) FListAdd_Private(a,b,p,(int (*)(void *))c) 234*cafa780aSBarry Smith #endif 235*cafa780aSBarry Smith extern int FListDuplicate(FList,FList *); 236*cafa780aSBarry Smith extern int FListView(FList,Viewer); 237*cafa780aSBarry Smith 238*cafa780aSBarry Smith /* 239*cafa780aSBarry Smith Routines for handling dynamic libraries. PETSc uses dynamic libraries 240*cafa780aSBarry Smith by default on most machines (except IBM). This is controlled by the 241*cafa780aSBarry Smith flag USE_DYNAMIC_LIBRARIES in petscconf.h 242*cafa780aSBarry Smith */ 243*cafa780aSBarry Smith typedef struct _DLLibraryList *DLLibraryList; 244*cafa780aSBarry Smith extern DLLibraryList DLLibrariesLoaded; 245*cafa780aSBarry Smith extern int DLLibraryRetrieve(MPI_Comm,const char[],char *,int,PetscTruth *); 246*cafa780aSBarry Smith extern int DLLibraryOpen(MPI_Comm,const char[],void **); 247*cafa780aSBarry Smith extern int DLLibrarySym(MPI_Comm,DLLibraryList *,const char[],const char[],void **); 248*cafa780aSBarry Smith extern int DLLibraryAppend(MPI_Comm,DLLibraryList *,const char[]); 249*cafa780aSBarry Smith extern int DLLibraryPrepend(MPI_Comm,DLLibraryList *,const char[]); 250*cafa780aSBarry Smith extern int DLLibraryClose(DLLibraryList); 251*cafa780aSBarry Smith extern int DLLibraryPrintPath(void); 252*cafa780aSBarry Smith extern int DLLibraryGetInfo(void *,char *,char **); 253*cafa780aSBarry Smith 254*cafa780aSBarry Smith /* 255*cafa780aSBarry Smith Mechanism for translating PETSc object representations between languages 256*cafa780aSBarry Smith Not currently used. 257*cafa780aSBarry Smith */ 258*cafa780aSBarry Smith typedef enum {PETSC_LANGUAGE_C,PETSC_LANGUAGE_CPP} PetscLanguage; 259*cafa780aSBarry Smith #define PETSC_LANGUAGE_F77 PETSC_LANGUAGE_C 260*cafa780aSBarry Smith extern int PetscObjectComposeLanguage(PetscObject,PetscLanguage,void *); 261*cafa780aSBarry Smith extern int PetscObjectQueryLanguage(PetscObject,PetscLanguage,void **); 262*cafa780aSBarry Smith 263*cafa780aSBarry Smith /* 264*cafa780aSBarry Smith Useful utility routines 265*cafa780aSBarry Smith */ 266*cafa780aSBarry Smith extern int PetscSplitOwnership(MPI_Comm,int*,int*); 267*cafa780aSBarry Smith extern int PetscSequentialPhaseBegin(MPI_Comm,int); 268*cafa780aSBarry Smith extern int PetscSequentialPhaseEnd(MPI_Comm,int); 269*cafa780aSBarry Smith extern int PetscBarrier(PetscObject); 270*cafa780aSBarry Smith extern int PetscMPIDump(FILE*); 271*cafa780aSBarry Smith 272*cafa780aSBarry Smith /* 273*cafa780aSBarry Smith Defines basic graphics available from PETSc. 274*cafa780aSBarry Smith */ 275*cafa780aSBarry Smith #include "draw.h" 276*cafa780aSBarry Smith 277*cafa780aSBarry Smith /* 278*cafa780aSBarry Smith Defines the base data structures for all PETSc objects 279*cafa780aSBarry Smith */ 280*cafa780aSBarry Smith #include "petschead.h" 281*cafa780aSBarry Smith 282*cafa780aSBarry Smith /* 283*cafa780aSBarry Smith Defines PETSc profiling. 284*cafa780aSBarry Smith */ 285*cafa780aSBarry Smith #include "petsclog.h" 286*cafa780aSBarry Smith 287*cafa780aSBarry Smith #if defined(HAVE_AMS) 288*cafa780aSBarry Smith extern PetscTruth PetscAMSPublishAll; 289*cafa780aSBarry Smith #define PetscPublishAll(v)\ 290*cafa780aSBarry Smith { if (PetscAMSPublishAll) { \ 291*cafa780aSBarry Smith int __ierr;\ 292*cafa780aSBarry Smith __ierr = PetscObjectPublish((PetscObject)v);CHKERRQ(__ierr);\ 293*cafa780aSBarry Smith }} 294*cafa780aSBarry Smith #else 295*cafa780aSBarry Smith #define PetscPublishAll(v) 296*cafa780aSBarry Smith #endif 297*cafa780aSBarry Smith 298*cafa780aSBarry Smith /* 299*cafa780aSBarry Smith This code allows one to pass a MPI communicator between 300*cafa780aSBarry Smith C and Fortran. MPI 2.0 defines a standard API for doing this. 301*cafa780aSBarry Smith The code here is provided to allow PETSc to work with MPI 1.1 302*cafa780aSBarry Smith standard MPI libraries. 303*cafa780aSBarry Smith */ 304*cafa780aSBarry Smith extern int MPICCommToFortranComm(MPI_Comm,int *); 305*cafa780aSBarry Smith extern int MPIFortranCommToCComm(int,MPI_Comm*); 306*cafa780aSBarry Smith 307*cafa780aSBarry Smith /* 308*cafa780aSBarry Smith Simple PETSc parallel IO for ASCII printing 309*cafa780aSBarry Smith */ 310*cafa780aSBarry Smith extern int PetscFixFilename(const char[],char[]); 311*cafa780aSBarry Smith extern FILE *PetscFOpen(MPI_Comm,const char[],const char[]); 312*cafa780aSBarry Smith extern int PetscFClose(MPI_Comm,FILE*); 313*cafa780aSBarry Smith extern int PetscFPrintf(MPI_Comm,FILE*,const char[],...); 314*cafa780aSBarry Smith extern int PetscPrintf(MPI_Comm,const char[],...); 315*cafa780aSBarry Smith extern int (*PetscErrorPrintf)(const char[],...); 316*cafa780aSBarry Smith extern int (*PetscHelpPrintf)(MPI_Comm,const char[],...); 317*cafa780aSBarry Smith 318*cafa780aSBarry Smith extern int PetscSynchronizedPrintf(MPI_Comm,const char[],...); 319*cafa780aSBarry Smith extern int PetscSynchronizedFPrintf(MPI_Comm,FILE*,const char[],...); 320*cafa780aSBarry Smith extern int PetscSynchronizedFlush(MPI_Comm); 321*cafa780aSBarry Smith 322*cafa780aSBarry Smith /* 323*cafa780aSBarry Smith Simple PETSc object that contains a pointer to any required data 324*cafa780aSBarry Smith */ 325*cafa780aSBarry Smith typedef struct _p_PetscObjectContainer* PetscObjectContainer; 326*cafa780aSBarry Smith extern int PetscObjectContainerGetPointer(PetscObjectContainer,void **); 327*cafa780aSBarry Smith extern int PetscObjectContainerSetPointer(PetscObjectContainer,void *); 328*cafa780aSBarry Smith extern int PetscObjectContainerDestroy(PetscObjectContainer); 329*cafa780aSBarry Smith extern int PetscObjectContainerCreate(MPI_Comm comm,PetscObjectContainer *); 330*cafa780aSBarry Smith 331*cafa780aSBarry Smith /* 332*cafa780aSBarry Smith For incremental debugging 333*cafa780aSBarry Smith */ 334*cafa780aSBarry Smith extern int PetscCompare; 335*cafa780aSBarry Smith extern int PetscCompareDouble(double); 336*cafa780aSBarry Smith extern int PetscCompareScalar(Scalar); 337*cafa780aSBarry Smith extern int PetscCompareInt(int); 338*cafa780aSBarry Smith 339*cafa780aSBarry Smith /* 340*cafa780aSBarry Smith For use in debuggers 341*cafa780aSBarry Smith */ 342*cafa780aSBarry Smith extern int PetscGlobalRank,PetscGlobalSize; 343*cafa780aSBarry Smith extern int PetscIntView(int,int[],Viewer); 344*cafa780aSBarry Smith extern int PetscDoubleView(int,double[],Viewer); 345*cafa780aSBarry Smith extern int PetscScalarView(int,Scalar[],Viewer); 346*cafa780aSBarry Smith 347*cafa780aSBarry Smith /* 348*cafa780aSBarry Smith C code optimization is often enhanced by telling the compiler 349*cafa780aSBarry Smith that certain pointer arguments to functions are not aliased to 350*cafa780aSBarry Smith to other arguments. This is not yet ANSI C standard so we define 351*cafa780aSBarry Smith the macro "restrict" to indicate that the variable is not aliased 352*cafa780aSBarry Smith to any other argument. 353*cafa780aSBarry Smith */ 354*cafa780aSBarry Smith #if defined(HAVE_RESTRICT) && !defined(__cplusplus) 355*cafa780aSBarry Smith #define restrict _Restrict 356*cafa780aSBarry Smith #else 357*cafa780aSBarry Smith #define restrict 358*cafa780aSBarry Smith #endif 359*cafa780aSBarry Smith 360*cafa780aSBarry Smith /* 361*cafa780aSBarry Smith Determine if some of the kernel computation routines use 362*cafa780aSBarry Smith Fortran (rather than C) for the numerical calculations. On some machines 363*cafa780aSBarry Smith and compilers (like complex numbers) the Fortran version of the routines 364*cafa780aSBarry Smith is faster than the C/C++ versions. The flag USE_FORTRAN_KERNELS 365*cafa780aSBarry Smith would be set in the petscconf.h file 366*cafa780aSBarry Smith */ 367*cafa780aSBarry Smith #if defined(USE_FORTRAN_KERNELS) 368*cafa780aSBarry Smith 369*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MULTAIJ) 370*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MULTAIJ 371*cafa780aSBarry Smith #endif 372*cafa780aSBarry Smith 373*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_NORMSQR) 374*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_NORMSQR 375*cafa780aSBarry Smith #endif 376*cafa780aSBarry Smith 377*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MAXPY) 378*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MAXPY 379*cafa780aSBarry Smith #endif 380*cafa780aSBarry Smith 381*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_SOLVEAIJ) 382*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_SOLVEAIJ 383*cafa780aSBarry Smith #endif 384*cafa780aSBarry Smith 385*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_SOLVEBAIJ) 386*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_SOLVEBAIJ 387*cafa780aSBarry Smith #endif 388*cafa780aSBarry Smith 389*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MULTADDAIJ) 390*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MULTADDAIJ 391*cafa780aSBarry Smith #endif 392*cafa780aSBarry Smith 393*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_MDOT) 394*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_MDOT 395*cafa780aSBarry Smith #endif 396*cafa780aSBarry Smith 397*cafa780aSBarry Smith #if !defined(USE_FORTRAN_KERNEL_XTIMESY) 398*cafa780aSBarry Smith #define USE_FORTRAN_KERNEL_XTIMESY 399*cafa780aSBarry Smith #endif 400*cafa780aSBarry Smith 401*cafa780aSBarry Smith #endif 402*cafa780aSBarry Smith 403*cafa780aSBarry Smith /* 404*cafa780aSBarry Smith Macros for indicating code that should be compiled with a C interface, 405*cafa780aSBarry Smith rather than a C++ interface. Any routines that are dynamically loaded 406*cafa780aSBarry Smith (such as the PCCreate_XXX() routines) must be wrapped so that the name 407*cafa780aSBarry Smith mangler does not change the functions symbol name. This just hides the 408*cafa780aSBarry Smith ugly extern "C" {} wrappers. 409*cafa780aSBarry Smith */ 410*cafa780aSBarry Smith #if defined(__cplusplus) 411*cafa780aSBarry Smith #define EXTERN_C_BEGIN extern "C" { 412*cafa780aSBarry Smith #define EXTERN_C_END } 413*cafa780aSBarry Smith #else 414*cafa780aSBarry Smith #define EXTERN_C_BEGIN 415*cafa780aSBarry Smith #define EXTERN_C_END 416*cafa780aSBarry Smith #endif 417*cafa780aSBarry Smith 418*cafa780aSBarry Smith #endif 419