xref: /petsc/include/petsc.h (revision 81745bc79c86c33c9ea77f954d6d2c4b0d699d06)
1*81745bc7SBarry Smith /* $Id: petsc.h,v 1.48 1995/07/30 15:53:11 bsmith Exp bsmith $ */
22eac72dbSBarry Smith 
32eac72dbSBarry Smith #if !defined(__PETSC_PACKAGE)
42eac72dbSBarry Smith #define __PETSC_PACKAGE
52eac72dbSBarry Smith 
68e4b569cSBarry Smith #define PETSC_VERSION_NUMBER "PETSc Version 2.0.Beta.6 Released July 30, 1995."
77e59f0e8SBarry Smith 
8f0479e8cSBarry Smith #include <stdio.h>
928988994SBarry Smith #if defined(PARCH_sun4)
106abc6512SBarry Smith int fprintf(FILE*,char*,...);
116abc6512SBarry Smith int printf(char*,...);
126abc6512SBarry Smith int fflush(FILE*);
136abc6512SBarry Smith int fclose(FILE*);
1428988994SBarry Smith #endif
15f0479e8cSBarry Smith 
16f0479e8cSBarry Smith /* MPI interface */
17f0479e8cSBarry Smith #include "mpi.h"
187f813858SBarry Smith #include "mpiu.h"
19f0479e8cSBarry Smith 
20c6a45a97SBarry Smith #if defined(PETSC_COMPLEX)
21c6a45a97SBarry Smith /* work around for bug in alpha g++ compiler */
22c6a45a97SBarry Smith #if defined(PARCH_alpha)
23c6a45a97SBarry Smith #define hypot(a,b) (double) sqrt((a)*(a)+(b)*(b))
24c6a45a97SBarry Smith /* extern double hypot(double,double); */
25c6a45a97SBarry Smith #endif
268ed539a5SBarry Smith #include <complex.h>
2720563c6bSBarry Smith #define PETSCREAL(a) real(a)
288ed539a5SBarry Smith #define Scalar       complex
298ed539a5SBarry Smith #else
3020563c6bSBarry Smith #define PETSCREAL(a) a
318ed539a5SBarry Smith #define Scalar       double
328ed539a5SBarry Smith #endif
338ed539a5SBarry Smith 
34d90ea2a1SBarry Smith extern void *(*PetscMalloc)(unsigned int,int,char*);
35d90ea2a1SBarry Smith extern int  (*PetscFree)(void *,int,char*);
3678b31e54SBarry Smith #define PETSCMALLOC(a)       (*PetscMalloc)(a,__LINE__,__FILE__)
3778b31e54SBarry Smith #define PETSCFREE(a)         (*PetscFree)(a,__LINE__,__FILE__)
387f813858SBarry Smith extern int  PetscSetMalloc(void *(*)(unsigned int,int,char*),
397f813858SBarry Smith                            int (*)(void *,int,char*));
407f813858SBarry Smith extern int  Trdump(FILE *);
41e9f47e53SBarry Smith extern int  TrGetMaximumAllocated(double*);
428ed539a5SBarry Smith 
4378b31e54SBarry Smith #define PETSCNEW(A)         (A*) PETSCMALLOC(sizeof(A))
4478b31e54SBarry Smith #define PETSCMEMCPY(a,b,n)   memcpy((char*)(a),(char*)(b),n)
4578b31e54SBarry Smith #define PETSCMEMSET(a,b,n)   memset((char*)(a),(int)(b),n)
4620563c6bSBarry Smith #include <memory.h>
472eac72dbSBarry Smith 
48145fe58dSBarry Smith #define PETSCMIN(a,b)      ( ((a)<(b)) ? (a) : (b) )
49145fe58dSBarry Smith #define PETSCMAX(a,b)      ( ((a)<(b)) ? (b) : (a) )
50*81745bc7SBarry Smith #define PETSCABS(a)        ( ((a)<0)   ? -(a) : (a) )
51145fe58dSBarry Smith 
522eac72dbSBarry Smith /*  Macros for error checking */
53f0479e8cSBarry Smith #if !defined(__DIR__)
54f0479e8cSBarry Smith #define __DIR__ 0
55f0479e8cSBarry Smith #endif
5628988994SBarry Smith #if defined(PETSC_DEBUG)
5778b31e54SBarry Smith #define SETERRQ(n,s)     {return PetscError(__LINE__,__DIR__,__FILE__,s,n);}
58d6dfbf8fSBarry Smith #define SETERRA(n,s)    \
59d6dfbf8fSBarry Smith                 {int _ierr = PetscError(__LINE__,__DIR__,__FILE__,s,n);\
60d6dfbf8fSBarry Smith                  MPI_Abort(MPI_COMM_WORLD,_ierr);}
6178b31e54SBarry Smith #define CHKERRQ(n)       {if (n) SETERRQ(n,(char *)0);}
62d6dfbf8fSBarry Smith #define CHKERRA(n)      {if (n) SETERRA(n,(char *)0);}
63145fe58dSBarry Smith #define CHKPTRQ(p)       if (!p) SETERRQ(1,"PETSC ERROR: No memory");
64145fe58dSBarry Smith #define CHKPTRA(p)      if (!p) SETERRA(1,"PETSC ERROR: No memory");
6528988994SBarry Smith #else
6678b31e54SBarry Smith #define SETERRQ(n,s)     {return PetscError(__LINE__,__DIR__,__FILE__,s,n);}
6728988994SBarry Smith #define SETERRA(n,s)    \
6828988994SBarry Smith                 {int _ierr = PetscError(__LINE__,__DIR__,__FILE__,s,n);\
6928988994SBarry Smith                  MPI_Abort(MPI_COMM_WORLD,_ierr);}
7078b31e54SBarry Smith #define CHKERRQ(n)       {if (n) SETERRQ(n,(char *)0);}
7128988994SBarry Smith #define CHKERRA(n)      {if (n) SETERRA(n,(char *)0);}
72145fe58dSBarry Smith #define CHKPTRQ(p)       if (!p) SETERRQ(1,"PETSC ERROR: No memory");
73145fe58dSBarry Smith #define CHKPTRA(p)      if (!p) SETERRA(1,"PETSC ERROR: No memory");
7428988994SBarry Smith #endif
752eac72dbSBarry Smith 
768ed539a5SBarry Smith typedef struct _PetscObject* PetscObject;
779e25ed09SBarry Smith #define PETSC_COOKIE         0x12121212
786b5873e3SBarry Smith #define PETSC_DECIDE         -1
792fe66929SLois Curfman McInnes #define PETSC_DEFAULT        0
80da69df5fSBarry Smith 
81ca9b4cbeSLois Curfman McInnes typedef enum { PETSC_FALSE, PETSC_TRUE } PetscTruth;
82ca9b4cbeSLois Curfman McInnes 
83da69df5fSBarry Smith #include "viewer.h"
848c8d4905SLois Curfman McInnes #include "options.h"
852eac72dbSBarry Smith 
86a0a59b22SBarry Smith extern int PetscInitialize(int*,char***,char*,char*);
87a0a59b22SBarry Smith extern int PetscFinalize();
88a0a59b22SBarry Smith 
89c60448a5SBarry Smith extern int PetscObjectDestroy(PetscObject);
908f4c47bcSLois Curfman McInnes extern int PetscObjectExists(PetscObject,int*);
917f223b93SBarry Smith extern int PetscObjectGetComm(PetscObject,MPI_Comm *comm);
92a5a9c739SBarry Smith extern int PetscObjectSetName(PetscObject,char*);
93a5a9c739SBarry Smith extern int PetscObjectGetName(PetscObject,char**);
942eac72dbSBarry Smith 
95f0479e8cSBarry Smith extern int PetscDefaultErrorHandler(int,char*,char*,char*,int,void*);
96f0479e8cSBarry Smith extern int PetscAbortErrorHandler(int,char*,char*,char*,int,void* );
97f0479e8cSBarry Smith extern int PetscAttachDebuggerErrorHandler(int,char*,char*,char*,int,void*);
98f0479e8cSBarry Smith extern int PetscError(int,char*,char*,char*,int);
99f0479e8cSBarry Smith extern int PetscPushErrorHandler(int
100f0479e8cSBarry Smith                          (*handler)(int,char*,char*,char*,int,void*),void* );
1018ed539a5SBarry Smith extern int PetscPopErrorHandler();
1028ed539a5SBarry Smith 
1038ed539a5SBarry Smith extern int PetscSetDebugger(char *,int,char *);
1048ed539a5SBarry Smith extern int PetscAttachDebugger();
1058ed539a5SBarry Smith 
106f0479e8cSBarry Smith extern int PetscDefaultSignalHandler(int,void*);
107f0479e8cSBarry Smith extern int PetscPushSignalHandler(int (*)(int,void *),void*);
108f0479e8cSBarry Smith extern int PetscPopSignalHandler();
109f0479e8cSBarry Smith extern int PetscSetFPTrap(int);
1106b5873e3SBarry Smith #define FP_TRAP_OFF    0
1116b5873e3SBarry Smith #define FP_TRAP_ON     1
112fba13676SBarry Smith #define FP_TRAP_ALWAYS 2
1138ed539a5SBarry Smith 
11431b41497SLois Curfman McInnes /*
11531b41497SLois Curfman McInnes    Definitions used for the Fortran interface:
11631b41497SLois Curfman McInnes    FORTRANCAPS:       Names are uppercase, no trailing underscore
11731b41497SLois Curfman McInnes    FORTRANUNDERSCORE: Names are lowercase, trailing underscore
11831b41497SLois Curfman McInnes  */
119602c2b74SBarry Smith #if defined(PARCH_cray) || defined(PARCH_NCUBE) || defined(PARCH_t3d)
1208ed539a5SBarry Smith #define FORTRANCAPS
121d90ea2a1SBarry Smith #elif !defined(PARCH_rs6000) && !defined(PARCH_NeXT) && !defined(PARCH_hpux)
1228ed539a5SBarry Smith #define FORTRANUNDERSCORE
1232eac72dbSBarry Smith #endif
1242eac72dbSBarry Smith 
1257857610eSBarry Smith /* Global flop counter */
1267857610eSBarry Smith extern double _TotalFlops;
1277857610eSBarry Smith #if defined(PETSC_LOG)
1287857610eSBarry Smith #define PLogFlops(n) {_TotalFlops += n;}
1297857610eSBarry Smith #else
1307857610eSBarry Smith #define PLogFlops(n)
1317857610eSBarry Smith #endif
132affa3d11SLois Curfman McInnes 
133affa3d11SLois Curfman McInnes /*M
134affa3d11SLois Curfman McInnes    PLogFlops - Adds floating point operations to the global counter.
135affa3d11SLois Curfman McInnes 
136affa3d11SLois Curfman McInnes    Input Parameter:
137affa3d11SLois Curfman McInnes .  f - flop counter
138affa3d11SLois Curfman McInnes 
139affa3d11SLois Curfman McInnes    Synopsis:
140affa3d11SLois Curfman McInnes    PLogFlops(int f)
141affa3d11SLois Curfman McInnes 
142affa3d11SLois Curfman McInnes    Notes:
143affa3d11SLois Curfman McInnes    A global counter logs all PETSc flop counts.  The user can use
144affa3d11SLois Curfman McInnes    PLogFlops() to increment this counter to include flops for the
145d41b535cSLois Curfman McInnes    application code.
146affa3d11SLois Curfman McInnes 
147d41b535cSLois Curfman McInnes    PETSc automatically logs library events if the code has been
148d41b535cSLois Curfman McInnes    compiled with -DPETSC_LOG (which is the default), and -log,
149d41b535cSLois Curfman McInnes    -log_summary, or -log_all are specified.  PLogFlops() is
150d41b535cSLois Curfman McInnes    intended for logging user flops to supplement this PETSc
151d41b535cSLois Curfman McInnes    information.
152d41b535cSLois Curfman McInnes 
153d41b535cSLois Curfman McInnes     Example of Usage:
154d41b535cSLois Curfman McInnes $     #define USER_EVENT 75
155d41b535cSLois Curfman McInnes $     PLogEventRegister(USER_EVENT,"User event");
156d41b535cSLois Curfman McInnes $     PLogEventBegin(USER_EVENT,0,0,0,0);
157d41b535cSLois Curfman McInnes $     [code segment to monitor]
158d41b535cSLois Curfman McInnes $     PLogFlops(user_flops)
159d41b535cSLois Curfman McInnes $     PLogEventEnd(USER_EVENT,0,0,0,0);
160d41b535cSLois Curfman McInnes 
161d41b535cSLois Curfman McInnes .seealso:  PLogEventRegister(), PLogEventBegin(), PLogEventEnd()
162affa3d11SLois Curfman McInnes 
163affa3d11SLois Curfman McInnes .keywords:  Petsc, log, flops, floating point operations
164affa3d11SLois Curfman McInnes M*/
165affa3d11SLois Curfman McInnes 
16606259719SBarry Smith extern int PLogPrint(MPI_Comm,FILE *);
16706259719SBarry Smith extern int PLogBegin();
16806259719SBarry Smith extern int PLogAllBegin();
16906259719SBarry Smith extern int PLogDump(char*);
1707857610eSBarry Smith 
1712eac72dbSBarry Smith #endif
172