Professional Documents
Culture Documents
r
example, MatView() is the general matrix viewing routi
ne.
This is used by PetscObjectView((PetscObject)obj) to a
llow
destroy()
to allow
compose()
th a name
query()
ted
(*getcomm)(PetscObject,MPI_Comm *);
(*view)(PetscObject,PetscViewer);
(*destroy)(PetscObject*);
(*compose)(PetscObject,const char[],PetscObject);
(*query)(PetscObject,const char[],PetscObject *);
(*composefunction)(PetscObject,const char[],void (*)(void));
(*queryfunction)(PetscObject,const char[],void (**)(void));
PetscInt*);
typedef struct {
void (*func)(void);
void *ctx;
} PetscFortranCallback;
/*
All PETSc objects begin with the fields defined in PETSCHEADER.
The PetscObject is a way of examining these fields regardless of
the specific object. In C++ this could be a base abstract class
from which all objects are derived.
*/
#define PETSC_MAX_OPTIONS_HANDLER 5
typedef struct _p_PetscObject {
PetscClassId
classid;
PetscOps
*bops;
MPI_Comm
comm;
PetscInt
type;
PetscLogDouble
flops,time,mem,memchildren;
PetscObjectId
id;
PetscInt
refct;
PetscMPIInt
tag;
PetscFunctionList
qlist;
PetscObjectList
olist;
char
*class_name;
/* for example, "Vec" */
char
*description;
char
*mansec;
char
*type_name;
/* this is the subclass, for example VEC
SEQ which equals "seq" */
PetscObject
parent;
PetscObjectId
parentid;
char*
name;
char
*prefix;
PetscInt
tablevel;
void
*cpp;
PetscObjectState
state;
PetscInt
int_idmax,
intstar_idmax;
PetscObjectState
*intcomposedstate,*intstarcomposedstate;
PetscInt
*intcomposeddata, **intstarcomposeddata;
PetscInt
real_idmax,
realstar_idmax;
PetscObjectState
*realcomposedstate,*realstarcomposedstate;
PetscReal
*realcomposeddata, **realstarcomposeddata;
PetscInt
scalar_idmax,
scalarstar_idmax;
PetscObjectState
*scalarcomposedstate,*scalarstarcomposedstate;
PetscScalar
*scalarcomposeddata, **scalarstarcomposeddata;
void
(**fortran_func_pointers)(void);
/* used
by Fortran interface functions to stash user provided Fortran functions */
PetscInt
num_fortran_func_pointers;
/* numb
er of Fortran function pointers allocated */
PetscFortranCallback *fortrancallback[PETSC_FORTRAN_CALLBACK_MAXTYPE];
PetscInt
num_fortrancallback[PETSC_FORTRAN_CALLBACK_MAXTYPE];
void
*python_context;
PetscErrorCode
(*python_destroy)(void*);
PetscInt
PetscErrorCode
oid*);
PetscErrorCode
oid*);
noptionhandler;
(*optionhandler[PETSC_MAX_OPTIONS_HANDLER])(PetscObject,v
(*optiondestroy[PETSC_MAX_OPTIONS_HANDLER])(PetscObject,v
void
*optionctx[PETSC_MAX_OPTIONS_HANDLER];
PetscPrecision
precision;
PetscBool
optionsprinted;
#if defined(PETSC_HAVE_SAWS)
PetscBool
amsmem;
/* if PETSC_TRUE then this object is reg
istered with SAWs and visible to clients */
PetscBool
amspublishblock; /* if PETSC_TRUE and publishing objects
then will block at PetscObjectSAWsBlock() */
#endif
} _p_PetscObject;
#define PETSCHEADER(ObjectOps) \
_p_PetscObject hdr;
\
ObjectOps
*ops
#define PETSCFREEDHEADER -1
PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscObjectFunction)(PetscObject*)
; /* force cast in next macro to NEVER use extern "C" style */
PETSC_EXTERN_TYPEDEF typedef PetscErrorCode (*PetscObjectViewerFunction)(PetscOb
ject,PetscViewer);
/*@C
PetscHeaderCreate - Creates a PETSc object of a particular class, indicated
by tp
Input Parameters:
tp - the data structure type of the object (for example _p_Vec)
pops - the data structure type of the objects operations (for example VecOps
+
.
)
.
.
.
.
-
classid - the classid associated with this object (for example VEC_CLASSID)
class_name - string name of class; should be static (for example "Vec")
com - the MPI Communicator
des - the destroy routine for this object (for example VecDestroy())
vie - the view routine for this object (for example VecView())
Output Parameter:
h - the newly created object
Level: developer
Developer Note: This currently is a CPP macro because it takes the types (for
example _p_Vec and VecOps) as arguments
.seealso: PetscHeaderDestroy(), PetscClassIdRegister()
@*/
#define PetscHeaderCreate(h,tp,pops,classid,class_name,descr,mansec,com,des,vie)
\
(PetscNew(&(h)) ||
\
PetscNew(&(((PetscObject)(h))->bops)) ||
\
PetscNew(&((h)->ops)) ||
\
PetscHeaderCreate_Private((PetscObject)h,classid,class_name,descr,mansec,com,
(PetscObjectFunction)des,(PetscObjectViewerFunction)vie) || \
PetscLogObjectCreate(h) ||
\
PetscLogObjectMemory((PetscObject)h, sizeof(struct tp) + sizeof(PetscOps) + s
izeof(pops)))
PETSC_EXTERN PetscErrorCode PetscComposedQuantitiesDestroy(PetscObject obj);
Input Parameters:
h - the header created with PetscHeaderCreate()
Level: developer
\
\
\
#else
#define PetscValidHeaderSpecific(h,ck,arg)
\
do {
\
if (!h) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Null Object: Parameter
# %d",arg); \
if (!PetscCheckPointer(h,PETSC_OBJECT)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_A
RG_CORRUPT,"Invalid Pointer to Object: Parameter # %d",arg); \
if (((PetscObject)(h))->classid != ck) {
\
if (((PetscObject)(h))->classid == PETSCFREEDHEADER) SETERRQ1(PETSC_COMM_S
do {
\
if (!f) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_NULL,"Null Function Pointer:
Parameter # %d",arg); \
} while (0)
#endif
#if !defined(PETSC_USE_DEBUG)
#define
#define
#define
#define
#define
#define
#define
#define
#define
#else
/*
For example, in the dot product between two vectors,
both vectors must be either Seq or MPI, not one of each
*/
#define PetscCheckSameType(a,arga,b,argb) \
if (((PetscObject)a)->type != ((PetscObject)b)->type) SETERRQ2(PETSC_COMM_SELF
,PETSC_ERR_ARG_NOTSAMETYPE,"Objects not of same type: Argument # %d and %d",arga
,argb);
/*
Use this macro to check if the type is set
*/
#define PetscValidType(a,arg) \
if (!((PetscObject)a)->type_name) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG
STATE,"%s object's type is not set: Argument # %d",((PetscObject)a)->class_name,
arg);
/*
Sometimes object must live on same communicator to inter-operate
*/
#define PetscCheckSameComm(a,arga,b,argb)
\
do {
\
PetscErrorCode _6_ierr,__flag;
\
_6_ierr = MPI_Comm_compare(PetscObjectComm((PetscObject)a),PetscObjectComm((
PetscObject)b),&__flag);CHKERRQ(_6_ierr);
\
if (__flag != MPI_CONGRUENT && __flag != MPI_IDENT) SETERRQ3(PETSC_COMM_SELF
,PETSC_ERR_ARG_NOTSAMECOMM,"Different communicators in the two objects: Argument
# %d and %d flag %d",arga,argb,__flag); \
} while (0)
#define PetscCheckSameTypeAndComm(a,arga,b,argb)
do {
PetscCheckSameType(a,arga,b,argb);
PetscCheckSameComm(a,arga,b,argb);
} while (0)
#define PetscValidLogicalCollectiveScalar(a,b,c)
do {
PetscErrorCode _7_ierr;
PetscReal b1[2],b2[2];
\
\
\
\
\
\
\
\
*/
#define PetscTryMethod(obj,A,B,C) \
0;{ PetscErrorCode (*f)B, __ierr; \
__ierr = PetscObjectQueryFunction((PetscObject)obj,A,&f);CHKERRQ(__ierr); \
if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\
}
/*
PetscUseMethod - Queries an object for a method, if it exists then calls it,
otherwise generates an error.
These are intended to be used only inside PETSc functions.
Level: developer
.seealso: PetscTryMethod()
*/
#define PetscUseMethod(obj,A,B,C) \
0;{ PetscErrorCode (*f)B, __ierr; \
__ierr = PetscObjectQueryFunction((PetscObject)obj,A,&f);CHKERRQ(__ierr); \
if (f) {__ierr = (*f)C;CHKERRQ(__ierr);}\
else SETERRQ1(PetscObjectComm((PetscObject)obj),PETSC_ERR_SUP,"Cannot locate
function %s in object",A); \
}
/*MC
PetscObjectStateIncrease - Increases the state of any PetscObject
Synopsis:
#include "petsc-private/petscimpl.h"
PetscErrorCode PetscObjectStateIncrease(PetscObject obj)
Logically Collective
Input Parameter:
. obj - any PETSc object, for example a Vec, Mat or KSP. This must be
cast with a (PetscObject), for example,
PetscObjectStateIncrease((PetscObject)mat);
Notes: object state is an integer which gets increased every time
the object is changed internally. By saving and later querying the object sta
te
one can determine whether information about the object is still current.
Currently, state is maintained for Vec and Mat objects.
This routine is mostly for internal use by PETSc; a developer need only
call it after explicit access to an object's internals. Routines such
as VecSet() or MatScale() already call this routine. It is also called, as a
precaution, in VecRestoreArray(), MatRestoreRow(), MatDenseRestoreArray().
This routine is logically collective because state equality comparison needs
to be possible without communication.
Level: developer
seealso: PetscObjectStateGet()
Concepts: state
M*/
#define PetscObjectStateIncrease(obj) ((obj)->state++,0)
Level: developer
M*/
#define PetscObjectComposedDataGetInt(obj,id,data,flag)
\
((((obj)->intcomposedstate && ((obj)->intcomposedstate[id] == (obj)->state)) ?
\
(data = (obj)->intcomposeddata[id],flag = PETSC_TRUE) : (flag = PETSC_FALSE))
,0)
/*MC
PetscObjectComposedDataSetIntstar - attach integer array data to a PetscObjec
t
Synopsis:
#include "petsc-private/petscimpl.h"
PetscErrorCode PetscObjectComposedDataSetIntstar(PetscObject obj,int id,int *
data)
Not collective
Input parameters:
+ obj - the object to which data is to be attached
. id - the identifier for the data
- data - the data to be attached
Notes
The data identifier can best be determined through a call to
PetscObjectComposedDataRegister()
Level: developer
M*/
#define PetscObjectComposedDataSetIntstar(obj,id,data)
\
((((obj)->intstar_idmax < PetscObjectComposedDataMax) && PetscObjectComposedDa
taIncreaseIntstar(obj)) || \
((obj)->intstarcomposeddata[id] = data,(obj)->intstarcomposedstate[id] = (obj
)->state, 0))
/*MC
PetscObjectComposedDataGetIntstar - retrieve integer array data
attached to an object
Synopsis:
#include "petsc-private/petscimpl.h"
PetscErrorCode PetscObjectComposedDataGetIntstar(PetscObject obj,int id,int *
data,PetscBool flag)
Not collective
Input parameters:
+ obj - the object from which data is to be retrieved
- id - the identifier for the data
Output parameters
+ data - the data to be retrieved
- flag - PETSC_TRUE if the data item exists and is valid, PETSC_FALSE otherwise
The 'data' and 'flag' variables are inlined, so they are not pointers.
Level: developer
M*/
#define PetscObjectComposedDataGetIntstar(obj,id,data,flag)
\
((((obj)->intstarcomposedstate && ((obj)->intstarcomposedstate[id] == (obj)->s
tate)) ? \
(data = (obj)->intstarcomposeddata[id],flag = PETSC_TRUE) : (flag = PETSC_FAL
SE)),0)
/*MC
PetscObjectComposedDataSetReal - attach real data to a PetscObject
Synopsis:
#include "petsc-private/petscimpl.h"
PetscErrorCode PetscObjectComposedDataSetReal(PetscObject obj,int id,PetscRea
l data)
Not collective
Input parameters:
+ obj - the object to which data is to be attached
. id - the identifier for the data
- data - the data to be attached
Notes
The data identifier can best be determined through a call to
PetscObjectComposedDataRegister()
Level: developer
M*/
#define PetscObjectComposedDataSetReal(obj,id,data)
\
((((obj)->real_idmax < PetscObjectComposedDataMax) && PetscObjectComposedDataI
ncreaseReal(obj)) || \
((obj)->realcomposeddata[id] = data,(obj)->realcomposedstate[id] = (obj)->sta
te, 0))
/*MC
PetscObjectComposedDataGetReal - retrieve real data attached to an object
Synopsis:
#include "petsc-private/petscimpl.h"
PetscErrorCode PetscObjectComposedDataGetReal(PetscObject obj,int id,PetscRea
l data,PetscBool flag)
Not collective
Input parameters:
+ obj - the object from which data is to be retrieved
- id - the identifier for the data
Output parameters
+ data - the data to be retrieved
- flag - PETSC_TRUE if the data item exists and is valid, PETSC_FALSE otherwise
The 'data' and 'flag' variables are inlined, so they are not pointers.
Level: developer
M*/
#define PetscObjectComposedDataGetReal(obj,id,data,flag)
\
- flag - PETSC_TRUE if the data item exists and is valid, PETSC_FALSE otherwise
The 'data' and 'flag' variables are inlined, so they are not pointers.
Level: developer
M*/
#if defined(PETSC_USE_COMPLEX)
#define PetscObjectComposedDataGetScalarstar(obj,id,data,flag)
\
((((obj)->scalarstarcomposedstate && ((obj)->scalarstarcomposedstate[id] == (o
bj)->state)) ? \
(data = (obj)->scalarstarcomposeddata[id],flag = PETSC_TRUE) : (flag = PE
TSC_FALSE)),0)
#else
#define PetscObjectComposedDataGetScalarstar(obj,id,data,flag)
\
PetscObjectComposedDataGetRealstar(obj,id,data,flag)
#endif
PETSC_EXTERN PetscErrorCode PetscObjectGetId(PetscObject,PetscObjectId*);
PETSC_EXTERN PetscMPIInt Petsc_Counter_keyval;
PETSC_EXTERN PetscMPIInt Petsc_InnerComm_keyval;
PETSC_EXTERN PetscMPIInt Petsc_OuterComm_keyval;
/*
PETSc communicators have this attribute, see
PetscCommDuplicate(), PetscCommDestroy(), PetscCommGetNewTag(), PetscObjectGet
Name()
*/
typedef struct {
PetscMPIInt tag;
/* next free tag value */
PetscInt
refcount;
/* number of references, communicator can be fre
ed when this reaches 0 */
PetscInt
namecount;
/* used to generate the next name, as in Vec_0,
Mat_1, ... */
} PetscCommCounter;
#if defined(PETSC_HAVE_CUSP)
/*E
PetscCUSPFlag - indicates which memory (CPU, GPU, or none contains valid vec
tor
PETSC_CUSP_UNALLOCATED - no memory contains valid matrix entries; NEVER used
for vectors
PETSC_CUSP_GPU - GPU has valid vector/matrix entries
PETSC_CUSP_CPU - CPU has valid vector/matrix entries
PETSC_CUSP_BOTH - Both GPU and CPU have valid vector/matrix entries and they
match
Level: developer
E*/
typedef enum {PETSC_CUSP_UNALLOCATED,PETSC_CUSP_GPU,PETSC_CUSP_CPU,PETSC_CUSP_BO
TH} PetscCUSPFlag;
#endif
#if defined(PETSC_HAVE_VIENNACL)
/*E
PetscViennaCLFlag - indicates which memory (CPU, GPU, or none contains valid
vector