/*@C PetscObjectCopyFortranFunctionPointers - Copy function pointers to another object Logically Collective on PetscObject Input Parameter: + src - source object - dest - destination object Level: developer Note: Both objects must have the same class. @*/ PetscErrorCode PetscObjectCopyFortranFunctionPointers(PetscObject src,PetscObject dest) { PetscErrorCode ierr; PetscInt cbtype,numcb[PETSC_FORTRAN_CALLBACK_MAXTYPE]; PetscFunctionBegin; PetscValidHeader(src,1); PetscValidHeader(dest,2); if (src->classid != dest->classid) SETERRQ(src->comm,PETSC_ERR_ARG_INCOMP,"Objects must be of the same class"); ierr = PetscFree(dest->fortran_func_pointers);CHKERRQ(ierr); ierr = PetscMalloc(src->num_fortran_func_pointers*sizeof(void(*)(void)),&dest->fortran_func_pointers);CHKERRQ(ierr); ierr = PetscMemcpy(dest->fortran_func_pointers,src->fortran_func_pointers,src->num_fortran_func_pointers*sizeof(void(*)(void)));CHKERRQ(ierr); dest->num_fortran_func_pointers = src->num_fortran_func_pointers; ierr = PetscFortranCallbackGetSizes(src->classid,&numcb[PETSC_FORTRAN_CALLBACK_CLASS],&numcb[PETSC_FORTRAN_CALLBACK_SUBTYPE]);CHKERRQ(ierr); for (cbtype=PETSC_FORTRAN_CALLBACK_CLASS; cbtype<PETSC_FORTRAN_CALLBACK_MAXTYPE; cbtype++) { ierr = PetscFree(dest->fortrancallback[cbtype]);CHKERRQ(ierr); ierr = PetscCalloc1(numcb[cbtype],&dest->fortrancallback[cbtype]);CHKERRQ(ierr); ierr = PetscMemcpy(dest->fortrancallback[cbtype],src->fortrancallback[cbtype],src->num_fortrancallback[cbtype]*sizeof(PetscFortranCallback));CHKERRQ(ierr); dest->num_fortrancallback[cbtype] = src->num_fortrancallback[cbtype]; } PetscFunctionReturn(0); }
/*@C PetscViewerVTKAddField - Add a field to the viewer Collective Input Arguments: + viewer - VTK viewer . dm - DM on which Vec lives . PetscViewerVTKWriteFunction - function to write this Vec . fieldtype - Either PETSC_VTK_POINT_FIELD or PETSC_VTK_CELL_FIELD - vec - Vec to write Level: developer Note: This routine keeps exclusive ownership of the Vec. The caller should not use or destroy the Vec after adding it. .seealso: PetscViewerVTKOpen(), DMDAVTKWriteAll(), PetscViewerVTKWriteFunction @*/ PetscErrorCode PetscViewerVTKAddField(PetscViewer viewer,PetscObject dm,PetscErrorCode (*PetscViewerVTKWriteFunction)(PetscObject,PetscViewer),PetscViewerVTKFieldType fieldtype,PetscObject vec) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); PetscValidHeader(dm,2); PetscValidHeader(vec,4); ierr = PetscUseMethod(viewer,"PetscViewerVTKAddField_C",(PetscViewer,PetscObject,PetscErrorCode (*)(PetscObject,PetscViewer),PetscViewerVTKFieldType,PetscObject),(viewer,dm,PetscViewerVTKWriteFunction,fieldtype,vec));CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscObjectCompose - Associates another PETSc object with a given PETSc object. Not Collective Input Parameters: + obj - the PETSc object; this must be cast with (PetscObject), for example, PetscObjectCompose((PetscObject)mat,...); . name - name associated with the child object - ptr - the other PETSc object to associate with the PETSc object; this must also be cast with (PetscObject) Level: advanced Notes: The second objects reference count is automatically increased by one when it is composed. Replaces any previous object that had the same name. If ptr is null and name has previously been composed using an object, then that entry is removed from the obj. PetscObjectCompose() can be used with any PETSc object (such as Mat, Vec, KSP, SNES, etc.) or any user-provided object. See PetscContainerCreate() for info on how to create an object from a user-provided pointer that may then be composed with PETSc objects. Concepts: objects^composing Concepts: composing objects .seealso: PetscObjectQuery(), PetscContainerCreate() @*/ PetscErrorCode PETSC_DLLEXPORT PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidCharPointer(name,2); if (ptr) PetscValidHeader(ptr,3); ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscObjectCompose - Associates another PETSc object with a given PETSc object. Not Collective Input Parameters: + obj - the PETSc object; this must be cast with (PetscObject), for example, PetscObjectCompose((PetscObject)mat,...); . name - name associated with the child object - ptr - the other PETSc object to associate with the PETSc object; this must also be cast with (PetscObject) Level: advanced Notes: The second objects reference count is automatically increased by one when it is composed. Replaces any previous object that had the same name. If ptr is null and name has previously been composed using an object, then that entry is removed from the obj. PetscObjectCompose() can be used with any PETSc object (such as Mat, Vec, KSP, SNES, etc.) or any user-provided object. See PetscContainerCreate() for info on how to create an object from a user-provided pointer that may then be composed with PETSc objects. Concepts: objects^composing Concepts: composing objects .seealso: PetscObjectQuery(), PetscContainerCreate() @*/ PetscErrorCode PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidCharPointer(name,2); if (ptr) PetscValidHeader(ptr,3); if (obj == ptr) SETERRQ(PetscObjectComm((PetscObject)obj),PETSC_ERR_SUP,"Cannot compose object with itself"); ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscObjectSAWsSetBlock - Sets whether an object will block at PetscObjectSAWsBlock() Collective on PetscObject Input Parameters: + obj - the Petsc variable Thus must be cast with a (PetscObject), for example, PetscObjectSetName((PetscObject)mat,name); - flg - whether it should block Level: advanced Concepts: publishing object .seealso: PetscObjectSetName(), PetscObjectSAWsViewOff(), PetscObjectSAWsBlock() @*/ PetscErrorCode PetscObjectSAWsSetBlock(PetscObject obj,PetscBool flg) { PetscFunctionBegin; PetscValidHeader(obj,1); obj->amspublishblock = flg; PetscFunctionReturn(0); }
/*@C PetscObjectGetClassId - Gets the classid for any PetscObject Not Collective Input Parameter: . obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be cast with a (PetscObject), for example, PetscObjectGetClassId((PetscObject)mat,&classid); Output Parameter: . classid - the classid Level: developer @*/ PetscErrorCode PetscObjectGetClassId(PetscObject obj,PetscClassId *classid) { PetscFunctionBegin; PetscValidHeader(obj,1); *classid = obj->classid; PetscFunctionReturn(0); }
EXTERN_C_END #undef __FUNCT__ #define __FUNCT__ "PetscPythonMonitorSet" /*@C PetscPythonMonitorSet - Set Python monitor Level: developer .keywords: Python @*/ PetscErrorCode PetscPythonMonitorSet(PetscObject obj, const char url[]) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidCharPointer(url,2); if (PetscPythonMonitorSet_C == PETSC_NULL) { ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); if (PetscPythonMonitorSet_C == PETSC_NULL) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Couldn't initialize Python support for monitors"); } ierr = PetscPythonMonitorSet_C(obj,url);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscObjectSetType - Sets the object type of any PetscObject. Not Collective Input Parameters: + obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be cast with a (PetscObject), for example, PetscObjectGetType((PetscObject)mat,&type); - type - the object type Note: This does not currently work since we need to dispatch by type. Level: advanced Concepts: object type @*/ PetscErrorCode PETSC_DLLEXPORT PetscObjectSetType(PetscObject obj, const char type[]) { PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidCharPointer(type,2); SETERRQ(PETSC_ERR_SUP, "Cannot set the type of a generic PetscObject") }
/*@C PetscObjectStateSet - Sets the state of any PetscObject, regardless of the type. Logically Collective Input Parameter: + obj - any PETSc object, for example a Vec, Mat or KSP. This must be cast with a (PetscObject), for example, PetscObjectStateSet((PetscObject)mat,state); - state - the object state Notes: This function should be used with extreme caution. There is essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), which increases the state, but does not alter the data, then this routine can be used to reset the state. Such a reset must be collective. Level: advanced seealso: PetscObjectStateGet(),PetscObjectStateIncrease() Concepts: state @*/ PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state) { PetscFunctionBegin; PetscValidHeader(obj,1); obj->state = state; PetscFunctionReturn(0); }
/*@C PetscObjectName - Gives an object a name if it does not have one Collective Input Parameters: . obj - the Petsc variable Thus must be cast with a (PetscObject), for example, PetscObjectName((PetscObject)mat,name); Level: developer Concepts: object name^setting default Notes: This is used in a small number of places when an object NEEDS a name, for example when it is saved to MATLAB with that variable name. Use PetscObjectSetName() to set the name of an object to what you want. The SAWs viewer requires that no two published objects share the same name. Developer Note: this needs to generate the exact same string on all ranks that share the object. The current algorithm may not always work. .seealso: PetscObjectGetName(), PetscObjectSetName() @*/ PetscErrorCode PetscObjectName(PetscObject obj) { PetscErrorCode ierr; PetscCommCounter *counter; PetscMPIInt flg; char name[64]; PetscFunctionBegin; PetscValidHeader(obj,1); if (!obj->name) { union { MPI_Comm comm; void *ptr; char raw[sizeof(MPI_Comm)]; } ucomm; ierr = MPI_Attr_get(obj->comm,Petsc_Counter_keyval,(void*)&counter,&flg); CHKERRQ(ierr); if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"Bad MPI communicator supplied; must be a PETSc communicator"); ucomm.ptr = NULL; ucomm.comm = obj->comm; ierr = MPI_Bcast(ucomm.raw,sizeof(MPI_Comm),MPI_BYTE,0,obj->comm); CHKERRQ(ierr); /* If the union has extra bytes, their value is implementation-dependent, but they will normally be what we set last * in 'ucomm.ptr = NULL'. This output is always implementation-defined (and varies from run to run) so the union * abuse acceptable. */ ierr = PetscSNPrintf(name,64,"%s_%p_%D",obj->class_name,ucomm.ptr,counter->namecount++); CHKERRQ(ierr); ierr = PetscStrallocpy(name,&obj->name); CHKERRQ(ierr); } PetscFunctionReturn(0); }
/*@ PetscObjectGetTabLevel - Gets the number of tabs that ASCII output for that object use Not Collective Input Parameter: . obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be cast with a (PetscObject), for example, PetscObjectGetComm((PetscObject)mat,&comm); Output Parameter: . tab - the number of tabs Level: developer Notes: this is used to manage the output from options that are imbedded in other objects. For example the KSP object inside a SNES object. By indenting each lower level further the heirarchy of objects is very clear. .seealso: PetscObjectIncrementTabLevel() @*/ PetscErrorCode PetscObjectGetTabLevel(PetscObject obj,PetscInt *tab) { PetscFunctionBegin; PetscValidHeader(obj,1); *tab = obj->tablevel; PetscFunctionReturn(0); }
/*@C PetscObjectSetOptions - Sets the options database used by the object Collective on PetscObject Input Parameters: + obj - any PETSc object, for example a Vec, Mat or KSP. - options - the options database, use NULL for default Notes: if this is not called the object will use the default options database Level: advanced .seealso: PetscOptionsCreate(), PetscOptionsDestroy() @*/ PetscErrorCode PetscObjectSetOptions(PetscObject obj,PetscOptions options) { PetscFunctionBegin; PetscValidHeader(obj,1); obj->options = options; PetscFunctionReturn(0); }
/*@ PetscObjectSetTabLevel - Sets the number of tabs that ASCII output for that object use Not Collective Input Parameters: + obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be cast with a (PetscObject), for example, PetscObjectGetComm((PetscObject)mat,&comm); - tab - the number of tabs Level: developer Notes: this is used to manage the output from options that are imbedded in other objects. For example the KSP object inside a SNES object. By indenting each lower level further the heirarchy of objects is very clear. .seealso: PetscObjectIncrementTabLevel() @*/ PetscErrorCode PetscObjectSetTabLevel(PetscObject obj,PetscInt tab) { PetscFunctionBegin; PetscValidHeader(obj,1); obj->tablevel = tab; PetscFunctionReturn(0); }
/* The following routines are the versions private to the PETSc object data structures. */ PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm) { PetscFunctionBegin; PetscValidHeader(obj,1); *comm = obj->comm; PetscFunctionReturn(0); }
/*@C PetscObjectSetPrecision - sets the precision used within a given object. Collective on the PetscObject Input Parameters: + obj - the PETSc object; this must be cast with (PetscObject), for example, PetscObjectCompose((PetscObject)mat,...); - precision - the precision Level: advanced .seealso: PetscObjectQuery(), PetscContainerCreate() @*/ PetscErrorCode PetscObjectSetPrecision(PetscObject obj,PetscPrecision precision) { PetscFunctionBegin; PetscValidHeader(obj,1); obj->precision = precision; PetscFunctionReturn(0); }
/*@C PetscObjectReference - Indicates to any PetscObject that it is being referenced by another PetscObject. This increases the reference count for that object by one. Collective on PetscObject Input Parameter: . obj - the PETSc object. This must be cast with (PetscObject), for example, PetscObjectReference((PetscObject)mat); Level: advanced .seealso: PetscObjectCompose(), PetscObjectDereference() @*/ PetscErrorCode PETSC_DLLEXPORT PetscObjectReference(PetscObject obj) { PetscFunctionBegin; PetscValidHeader(obj,1); obj->refct++; PetscFunctionReturn(0); }
/*@C PetscObjectGetReference - Gets the current reference count for any PETSc object. Not Collective Input Parameter: . obj - the PETSc object; this must be cast with (PetscObject), for example, PetscObjectGetReference((PetscObject)mat,&cnt); Output Parameter: . cnt - the reference count Level: advanced .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference() @*/ PetscErrorCode PetscObjectGetReference(PetscObject obj,PetscInt *cnt) { PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidIntPointer(cnt,2); *cnt = obj->refct; PetscFunctionReturn(0); }
/*@C PetscObjectReference - Indicates to any PetscObject that it is being referenced by another PetscObject. This increases the reference count for that object by one. Logically Collective on PetscObject Input Parameter: . obj - the PETSc object. This must be cast with (PetscObject), for example, PetscObjectReference((PetscObject)mat); Level: advanced .seealso: PetscObjectCompose(), PetscObjectDereference() @*/ PetscErrorCode PetscObjectReference(PetscObject obj) { PetscFunctionBegin; if (!obj) PetscFunctionReturn(0); PetscValidHeader(obj,1); obj->refct++; PetscFunctionReturn(0); }
/*@C PetscObjectStateGet - Gets the state of any PetscObject, regardless of the type. Not Collective Input Parameter: . obj - any PETSc object, for example a Vec, Mat or KSP. This must be cast with a (PetscObject), for example, PetscObjectStateGet((PetscObject)mat,&state); Output Parameter: . state - the object state Notes: object state is an integer which gets increased every time the object is changed. By saving and later querying the object state one can determine whether information about the object is still current. Currently, state is maintained for Vec and Mat objects. Level: advanced seealso: PetscObjectStateIncrease(), PetscObjectStateSet() Concepts: state @*/ PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state) { PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidIntPointer(state,2); *state = obj->state; PetscFunctionReturn(0); }
/*@C PetscObjectGetType - Gets the object type of any PetscObject. Not Collective Input Parameter: . obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be cast with a (PetscObject), for example, PetscObjectGetType((PetscObject)mat,&type); Output Parameter: . type - the object type Level: advanced Concepts: object type @*/ PetscErrorCode PETSC_DLLEXPORT PetscObjectGetType(PetscObject obj, const char *type[]) { PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidPointer(type,2); *type = obj->type_name; PetscFunctionReturn(0); }
/* PetscObjectGetOptionsPrefix - Gets the prefix of the PetscObject. Input Parameters: . obj - any PETSc object, for example a Vec, Mat or KSP. Output Parameters: . prefix - pointer to the prefix string used is returned Concepts: prefix^getting */ PetscErrorCode PetscObjectGetOptionsPrefix(PetscObject obj,const char *prefix[]) { PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidPointer(prefix,2); *prefix = obj->prefix; PetscFunctionReturn(0); }
/*@C PetscObjectGetClassName - Gets the class name for any PetscObject Not Collective Input Parameter: . obj - any PETSc object, for example a Vec, Mat or KSP. Thus must be cast with a (PetscObject), for example, PetscObjectGetClassName((PetscObject)mat,&classname); Output Parameter: . classname - the class name Level: developer @*/ PetscErrorCode PetscObjectGetClassName(PetscObject obj, const char *classname[]) { PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidPointer(classname,2); *classname = obj->class_name; PetscFunctionReturn(0); }
PetscErrorCode PetscObjectRemoveReference(PetscObject obj,const char name[]) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); ierr = PetscObjectListRemoveReference(&obj->olist,name);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when PetscFinalize() is called. Logically Collective on PetscObject Input Parameter: . obj - any PETSc object, for example a Vec, Mat or KSP. This must be cast with a (PetscObject), for example, PetscObjectRegisterDestroy((PetscObject)mat); Level: developer Notes: This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer when PETSc ends. .seealso: PetscObjectRegisterDestroyAll() @*/ PetscErrorCode PetscObjectRegisterDestroy(PetscObject obj) { PetscFunctionBegin; PetscValidHeader(obj,1); if (PetscObjectRegisterDestroy_Count < MAXREGDESOBJS) PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"No more room in array, limit %d \n recompile src/sys/objects/destroy.c with larger value for MAXREGDESOBJS\n",MAXREGDESOBJS); PetscFunctionReturn(0); }
/*@ PetscObjectIncrementTabLevel - Sets the number of tabs that ASCII output for that object use based on the tablevel of another object. This should be called immediately after the object is created. Not Collective Input Parameter: + obj - any PETSc object where we are changing the tab . oldobj - the object providing the tab - tab - the increment that is added to the old objects tab Level: developer Notes: this is used to manage the output from options that are imbedded in other objects. For example the KSP object inside a SNES object. By indenting each lower level further the heirarchy of objects is very clear. .seealso: PetscObjectSetTabLevel(), PetscObjectGetTabLevel() @*/ PetscErrorCode PetscObjectIncrementTabLevel(PetscObject obj,PetscObject oldobj,PetscInt tab) { PetscFunctionBegin; PetscValidHeader(obj,1); if (oldobj) obj->tablevel = oldobj->tablevel + tab; else obj->tablevel = tab; PetscFunctionReturn(0); }
PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void)) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); ierr = PetscFunctionListFind(obj->qlist,name,ptr);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); ierr = PetscObjectListFind(obj->olist,name,ptr);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called. Not Collective Input Parameter: + obj - the PETSc object . handle - function that checks for options . destroy - function to destroy context if provided - ctx - optional context for check function Level: developer .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers() @*/ PetscErrorCode PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscOptionItems*,PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx) { PetscFunctionBegin; PetscValidHeader(obj,1); if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added"); obj->optionhandler[obj->noptionhandler] = handle; obj->optiondestroy[obj->noptionhandler] = destroy; obj->optionctx[obj->noptionhandler++] = ctx; PetscFunctionReturn(0); }
/*MC PetscObjectQueryFunction - Gets a function associated with a given object. Synopsis: #include <petscsys.h> PetscErrorCode PetscObjectQueryFunction(PetscObject obj,const char name[],void (**fptr)(void)) Logically Collective on PetscObject Input Parameters: + obj - the PETSc object; this must be cast with (PetscObject), for example, PetscObjectQueryFunction((PetscObject)ksp,...); - name - name associated with the child function Output Parameter: . fptr - function pointer Level: advanced Concepts: objects^composing functions Concepts: composing functions Concepts: functions^querying Concepts: objects^querying Concepts: querying objects .seealso: PetscObjectComposeFunction(), PetscFunctionListFind() M*/ PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject obj,const char name[],void (**ptr)(void)) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidCharPointer(name,2); ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscErrorCode PetscObjectComposeFunction_Private(PetscObject obj,const char name[],void (*fptr)(void)) { PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeader(obj,1); PetscValidCharPointer(name,2); ierr = (*obj->bops->composefunction)(obj,name,fptr);CHKERRQ(ierr); PetscFunctionReturn(0); }