1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manipulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5d382aafbSBarry Smith #include "petscsys.h" /*I "petscsys.h" I*/ 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectGetComm_Petsc(PetscObject,MPI_Comm *); 8e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectCompose_Petsc(PetscObject,const char[],PetscObject); 9e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectQuery_Petsc(PetscObject,const char[],PetscObject *); 10e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject,const char[],const char[],void (*)(void)); 11e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject,const char[],void (**)(void)); 12e5c89e4eSSatish Balay 13e5c89e4eSSatish Balay #undef __FUNCT__ 14e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderCreate_Private" 15e5c89e4eSSatish Balay /* 16e5c89e4eSSatish Balay PetscHeaderCreate_Private - Creates a base PETSc object header and fills 17e5c89e4eSSatish Balay in the default values. Called by the macro PetscHeaderCreate(). 18e5c89e4eSSatish Balay */ 198738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscHeaderCreate_Private(PetscObject h,PetscClassId classid,PetscInt type,const char class_name[],MPI_Comm comm, 20e5c89e4eSSatish Balay PetscErrorCode (*des)(PetscObject),PetscErrorCode (*vie)(PetscObject,PetscViewer)) 21e5c89e4eSSatish Balay { 22e5c89e4eSSatish Balay static PetscInt idcnt = 1; 23e5c89e4eSSatish Balay PetscErrorCode ierr; 24e5c89e4eSSatish Balay 25e5c89e4eSSatish Balay PetscFunctionBegin; 260700a824SBarry Smith h->classid = classid; 27e5c89e4eSSatish Balay h->type = type; 28e5c89e4eSSatish Balay h->class_name = (char*)class_name; 29e5c89e4eSSatish Balay h->prefix = 0; 30e5c89e4eSSatish Balay h->refct = 1; 31e5c89e4eSSatish Balay h->amem = -1; 32e5c89e4eSSatish Balay h->id = idcnt++; 33e5c89e4eSSatish Balay h->parentid = 0; 34e5c89e4eSSatish Balay h->qlist = 0; 35e5c89e4eSSatish Balay h->olist = 0; 36e5c89e4eSSatish Balay h->bops->destroy = des; 37e5c89e4eSSatish Balay h->bops->view = vie; 38e5c89e4eSSatish Balay h->bops->getcomm = PetscObjectGetComm_Petsc; 39e5c89e4eSSatish Balay h->bops->compose = PetscObjectCompose_Petsc; 40e5c89e4eSSatish Balay h->bops->query = PetscObjectQuery_Petsc; 41e5c89e4eSSatish Balay h->bops->composefunction = PetscObjectComposeFunction_Petsc; 42e5c89e4eSSatish Balay h->bops->queryfunction = PetscObjectQueryFunction_Petsc; 43e5c89e4eSSatish Balay ierr = PetscCommDuplicate(comm,&h->comm,&h->tag);CHKERRQ(ierr); 4469590be7SBarry Smith #if defined(PETSC_HAVE_AMS) 4569590be7SBarry Smith if (PetscAMSPublishAll && classid != PETSC_VIEWER_CLASSID) { 46*c457296dSBarry Smith ierr = PetscObjectPublish((PetscObject)h);CHKERRQ(ierr); 4769590be7SBarry Smith } 4869590be7SBarry Smith #endif 4969590be7SBarry Smith 50e5c89e4eSSatish Balay PetscFunctionReturn(0); 51e5c89e4eSSatish Balay } 52e5c89e4eSSatish Balay 53e5c89e4eSSatish Balay extern PetscTruth PetscMemoryCollectMaximumUsage; 54e5c89e4eSSatish Balay extern PetscLogDouble PetscMemoryMaximumUsage; 55e5c89e4eSSatish Balay 56e5c89e4eSSatish Balay #undef __FUNCT__ 57e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderDestroy_Private" 58e5c89e4eSSatish Balay /* 59e5c89e4eSSatish Balay PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by 60e5c89e4eSSatish Balay the macro PetscHeaderDestroy(). 61e5c89e4eSSatish Balay */ 628738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscHeaderDestroy_Private(PetscObject h) 63e5c89e4eSSatish Balay { 64e5c89e4eSSatish Balay PetscErrorCode ierr; 65e5c89e4eSSatish Balay 66e5c89e4eSSatish Balay PetscFunctionBegin; 6792e62aa6SBarry Smith #if defined(PETSC_HAVE_AMS) 6869590be7SBarry Smith if (PetscAMSPublishAll && h->classid != PETSC_VIEWER_CLASSID) { 69*c457296dSBarry Smith ierr = PetscObjectUnPublish((PetscObject)h);CHKERRQ(ierr); 7069590be7SBarry Smith } 7192e62aa6SBarry Smith #endif 72e5c89e4eSSatish Balay if (PetscMemoryCollectMaximumUsage) { 73e5c89e4eSSatish Balay PetscLogDouble usage; 74e5c89e4eSSatish Balay ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr); 75e5c89e4eSSatish Balay if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage; 76e5c89e4eSSatish Balay } 7708a557f7SLisandro Dalcin /* first destroy things that could execute arbitrary code */ 7808a557f7SLisandro Dalcin if (h->python_destroy) { 7908a557f7SLisandro Dalcin void *python_context = h->python_context; 8008a557f7SLisandro Dalcin PetscErrorCode (*python_destroy)(void*) = h->python_destroy; 8108a557f7SLisandro Dalcin h->python_context = 0; 8208a557f7SLisandro Dalcin h->python_destroy = 0; 8308a557f7SLisandro Dalcin ierr = (*python_destroy)(python_context);CHKERRQ(ierr); 8408a557f7SLisandro Dalcin } 859c666560SBarry Smith ierr = PetscOListDestroy(h->olist);CHKERRQ(ierr); 8608a557f7SLisandro Dalcin ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr); 8708a557f7SLisandro Dalcin /* next destroy other things */ 880700a824SBarry Smith h->classid = PETSCFREEDHEADER; 8908a557f7SLisandro Dalcin ierr = PetscFree(h->bops);CHKERRQ(ierr); 901441b1d3SBarry Smith ierr = PetscFListDestroy(&h->qlist);CHKERRQ(ierr); 91503cfb0cSBarry Smith ierr = PetscFree(h->type_name);CHKERRQ(ierr); 92503cfb0cSBarry Smith ierr = PetscFree(h->name);CHKERRQ(ierr); 93503cfb0cSBarry Smith ierr = PetscFree(h->prefix);CHKERRQ(ierr); 94e5c89e4eSSatish Balay ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr); 95e5c89e4eSSatish Balay ierr = PetscFree(h->intcomposeddata);CHKERRQ(ierr); 96e5c89e4eSSatish Balay ierr = PetscFree(h->intcomposedstate);CHKERRQ(ierr); 97e5c89e4eSSatish Balay ierr = PetscFree(h->realcomposeddata);CHKERRQ(ierr); 98e5c89e4eSSatish Balay ierr = PetscFree(h->realcomposedstate);CHKERRQ(ierr); 99e5c89e4eSSatish Balay ierr = PetscFree(h->scalarcomposeddata);CHKERRQ(ierr); 100e5c89e4eSSatish Balay ierr = PetscFree(h->scalarcomposedstate);CHKERRQ(ierr); 101e5c89e4eSSatish Balay PetscFunctionReturn(0); 102e5c89e4eSSatish Balay } 103e5c89e4eSSatish Balay 104e5c89e4eSSatish Balay #undef __FUNCT__ 105af272810SBarry Smith #define __FUNCT__ "PetscObjectAddOptionsHandler" 106af272810SBarry Smith /*@C 107af272810SBarry Smith PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called. 108af272810SBarry Smith 109af272810SBarry Smith Not Collective 110af272810SBarry Smith 111af272810SBarry Smith Input Parameter: 112af272810SBarry Smith + obj - the PETSc object 113af272810SBarry Smith . handle - function that checks for options 114af272810SBarry Smith . destroy - function to destroy context if provided 115af272810SBarry Smith - ctx - optional context for check function 116af272810SBarry Smith 117af272810SBarry Smith Level: developer 118af272810SBarry Smith 119af272810SBarry Smith 120af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers() 121af272810SBarry Smith 122af272810SBarry Smith @*/ 1238738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx) 124af272810SBarry Smith { 125af272810SBarry Smith PetscFunctionBegin; 126af272810SBarry Smith if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added"); 127af272810SBarry Smith obj->optionhandler[obj->noptionhandler] = handle; 128af272810SBarry Smith obj->optiondestroy[obj->noptionhandler] = destroy; 129af272810SBarry Smith obj->optionctx[obj->noptionhandler++] = ctx; 130af272810SBarry Smith PetscFunctionReturn(0); 131af272810SBarry Smith } 132af272810SBarry Smith 133af272810SBarry Smith #undef __FUNCT__ 134af272810SBarry Smith #define __FUNCT__ "PetscObjectProcessOptionsHandlers" 135af272810SBarry Smith /*@C 136af272810SBarry Smith PetscObjectProcessOptionsHandlers - Calls all the options handler attached to an object 137af272810SBarry Smith 138af272810SBarry Smith Not Collective 139af272810SBarry Smith 140af272810SBarry Smith Input Parameter: 141af272810SBarry Smith . obj - the PETSc object 142af272810SBarry Smith 143af272810SBarry Smith Level: developer 144af272810SBarry Smith 145af272810SBarry Smith 146af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectDestroyOptionsHandlers() 147af272810SBarry Smith 148af272810SBarry Smith @*/ 1498738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectProcessOptionsHandlers(PetscObject obj) 150af272810SBarry Smith { 151af272810SBarry Smith PetscInt i; 152af272810SBarry Smith PetscErrorCode ierr; 153af272810SBarry Smith 154af272810SBarry Smith PetscFunctionBegin; 155af272810SBarry Smith for (i=0; i<obj->noptionhandler; i++) { 156af272810SBarry Smith ierr = (*obj->optionhandler[i])(obj,obj->optionctx[i]);CHKERRQ(ierr); 157af272810SBarry Smith } 158af272810SBarry Smith PetscFunctionReturn(0); 159af272810SBarry Smith } 160af272810SBarry Smith 161af272810SBarry Smith #undef __FUNCT__ 162af272810SBarry Smith #define __FUNCT__ "PetscObjectDestroyOptionsHandlers" 163af272810SBarry Smith /*@C 164af272810SBarry Smith PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an objeft 165af272810SBarry Smith 166af272810SBarry Smith Not Collective 167af272810SBarry Smith 168af272810SBarry Smith Input Parameter: 169af272810SBarry Smith . obj - the PETSc object 170af272810SBarry Smith 171af272810SBarry Smith Level: developer 172af272810SBarry Smith 173af272810SBarry Smith 174af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectProcessOptionsHandlers() 175af272810SBarry Smith 176af272810SBarry Smith @*/ 1778738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectDestroyOptionsHandlers(PetscObject obj) 178af272810SBarry Smith { 179af272810SBarry Smith PetscInt i; 180af272810SBarry Smith PetscErrorCode ierr; 181af272810SBarry Smith 182af272810SBarry Smith PetscFunctionBegin; 183af272810SBarry Smith for (i=0; i<obj->noptionhandler; i++) { 184af272810SBarry Smith ierr = (*obj->optiondestroy[i])(obj,obj->optionctx[i]);CHKERRQ(ierr); 185af272810SBarry Smith } 186af272810SBarry Smith obj->noptionhandler = 0; 187af272810SBarry Smith PetscFunctionReturn(0); 188af272810SBarry Smith } 189af272810SBarry Smith 190af272810SBarry Smith 191af272810SBarry Smith #undef __FUNCT__ 192e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectReference" 193ee978a2eSBarry Smith /*@ 194e5c89e4eSSatish Balay PetscObjectReference - Indicates to any PetscObject that it is being 195e5c89e4eSSatish Balay referenced by another PetscObject. This increases the reference 196e5c89e4eSSatish Balay count for that object by one. 197e5c89e4eSSatish Balay 1983f9fe445SBarry Smith Logically Collective on PetscObject 199e5c89e4eSSatish Balay 200e5c89e4eSSatish Balay Input Parameter: 201e5c89e4eSSatish Balay . obj - the PETSc object. This must be cast with (PetscObject), for example, 202e5c89e4eSSatish Balay PetscObjectReference((PetscObject)mat); 203e5c89e4eSSatish Balay 204e5c89e4eSSatish Balay Level: advanced 205e5c89e4eSSatish Balay 206e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference() 207e5c89e4eSSatish Balay @*/ 2088738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectReference(PetscObject obj) 209e5c89e4eSSatish Balay { 210e5c89e4eSSatish Balay PetscFunctionBegin; 211e5c89e4eSSatish Balay PetscValidHeader(obj,1); 212e5c89e4eSSatish Balay obj->refct++; 213e5c89e4eSSatish Balay PetscFunctionReturn(0); 214e5c89e4eSSatish Balay } 215e5c89e4eSSatish Balay 216e5c89e4eSSatish Balay #undef __FUNCT__ 217e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetReference" 218ee978a2eSBarry Smith /*@ 219e5c89e4eSSatish Balay PetscObjectGetReference - Gets the current reference count for 220e5c89e4eSSatish Balay any PETSc object. 221e5c89e4eSSatish Balay 222e5c89e4eSSatish Balay Not Collective 223e5c89e4eSSatish Balay 224e5c89e4eSSatish Balay Input Parameter: 225e5c89e4eSSatish Balay . obj - the PETSc object; this must be cast with (PetscObject), for example, 226e5c89e4eSSatish Balay PetscObjectGetReference((PetscObject)mat,&cnt); 227e5c89e4eSSatish Balay 228e5c89e4eSSatish Balay Output Parameter: 229e5c89e4eSSatish Balay . cnt - the reference count 230e5c89e4eSSatish Balay 231e5c89e4eSSatish Balay Level: advanced 232e5c89e4eSSatish Balay 233e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference() 234e5c89e4eSSatish Balay @*/ 2358738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectGetReference(PetscObject obj,PetscInt *cnt) 236e5c89e4eSSatish Balay { 237e5c89e4eSSatish Balay PetscFunctionBegin; 238e5c89e4eSSatish Balay PetscValidHeader(obj,1); 239e5c89e4eSSatish Balay PetscValidIntPointer(cnt,2); 240e5c89e4eSSatish Balay *cnt = obj->refct; 241e5c89e4eSSatish Balay PetscFunctionReturn(0); 242e5c89e4eSSatish Balay } 243e5c89e4eSSatish Balay 244e5c89e4eSSatish Balay #undef __FUNCT__ 245e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDereference" 246e5c89e4eSSatish Balay /*@ 247e5c89e4eSSatish Balay PetscObjectDereference - Indicates to any PetscObject that it is being 248e5c89e4eSSatish Balay referenced by one less PetscObject. This decreases the reference 249e5c89e4eSSatish Balay count for that object by one. 250e5c89e4eSSatish Balay 2513f9fe445SBarry Smith Collective on PetscObject if reference reaches 0 otherwise Logically Collective 252e5c89e4eSSatish Balay 253e5c89e4eSSatish Balay Input Parameter: 254e5c89e4eSSatish Balay . obj - the PETSc object; this must be cast with (PetscObject), for example, 255e5c89e4eSSatish Balay PetscObjectDereference((PetscObject)mat); 256e5c89e4eSSatish Balay 257e5c89e4eSSatish Balay Level: advanced 258e5c89e4eSSatish Balay 259e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectReference() 260e5c89e4eSSatish Balay @*/ 2618738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectDereference(PetscObject obj) 262e5c89e4eSSatish Balay { 263e5c89e4eSSatish Balay PetscErrorCode ierr; 264e5c89e4eSSatish Balay 265e5c89e4eSSatish Balay PetscFunctionBegin; 266e5c89e4eSSatish Balay PetscValidHeader(obj,1); 267e5c89e4eSSatish Balay if (obj->bops->destroy) { 268e5c89e4eSSatish Balay ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr); 269e5c89e4eSSatish Balay } else if (!--obj->refct) { 270e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine"); 271e5c89e4eSSatish Balay } 272e5c89e4eSSatish Balay PetscFunctionReturn(0); 273e5c89e4eSSatish Balay } 274e5c89e4eSSatish Balay 275e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */ 276e5c89e4eSSatish Balay /* 277e5c89e4eSSatish Balay The following routines are the versions private to the PETSc object 278e5c89e4eSSatish Balay data structures. 279e5c89e4eSSatish Balay */ 280e5c89e4eSSatish Balay #undef __FUNCT__ 281e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetComm_Petsc" 282e5c89e4eSSatish Balay PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm) 283e5c89e4eSSatish Balay { 284e5c89e4eSSatish Balay PetscFunctionBegin; 285e5c89e4eSSatish Balay *comm = obj->comm; 286e5c89e4eSSatish Balay PetscFunctionReturn(0); 287e5c89e4eSSatish Balay } 288e5c89e4eSSatish Balay 289e5c89e4eSSatish Balay #undef __FUNCT__ 290e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose_Petsc" 291e5c89e4eSSatish Balay PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr) 292e5c89e4eSSatish Balay { 293e5c89e4eSSatish Balay PetscErrorCode ierr; 294e5c89e4eSSatish Balay char *tname; 295e5c89e4eSSatish Balay 296e5c89e4eSSatish Balay PetscFunctionBegin; 297e5c89e4eSSatish Balay if (ptr) { 298e5c89e4eSSatish Balay ierr = PetscOListReverseFind(ptr->olist,obj,&tname);CHKERRQ(ierr); 29917186662SBarry Smith if (tname) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"An object cannot be composed with an object that was compose with it"); 300e5c89e4eSSatish Balay } 301e5c89e4eSSatish Balay ierr = PetscOListAdd(&obj->olist,name,ptr);CHKERRQ(ierr); 302e5c89e4eSSatish Balay PetscFunctionReturn(0); 303e5c89e4eSSatish Balay } 304e5c89e4eSSatish Balay 305e5c89e4eSSatish Balay #undef __FUNCT__ 306e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery_Petsc" 307e5c89e4eSSatish Balay PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr) 308e5c89e4eSSatish Balay { 309e5c89e4eSSatish Balay PetscErrorCode ierr; 310e5c89e4eSSatish Balay 311e5c89e4eSSatish Balay PetscFunctionBegin; 312e5c89e4eSSatish Balay ierr = PetscOListFind(obj->olist,name,ptr);CHKERRQ(ierr); 313e5c89e4eSSatish Balay PetscFunctionReturn(0); 314e5c89e4eSSatish Balay } 315e5c89e4eSSatish Balay 316e5c89e4eSSatish Balay #undef __FUNCT__ 317e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction_Petsc" 318e5c89e4eSSatish Balay PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void)) 319e5c89e4eSSatish Balay { 320e5c89e4eSSatish Balay PetscErrorCode ierr; 321e5c89e4eSSatish Balay 322e5c89e4eSSatish Balay PetscFunctionBegin; 323e5c89e4eSSatish Balay ierr = PetscFListAdd(&obj->qlist,name,fname,ptr);CHKERRQ(ierr); 324e5c89e4eSSatish Balay PetscFunctionReturn(0); 325e5c89e4eSSatish Balay } 326e5c89e4eSSatish Balay 327e5c89e4eSSatish Balay #undef __FUNCT__ 328e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction_Petsc" 329e5c89e4eSSatish Balay PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void)) 330e5c89e4eSSatish Balay { 331e5c89e4eSSatish Balay PetscErrorCode ierr; 332e5c89e4eSSatish Balay 333e5c89e4eSSatish Balay PetscFunctionBegin; 3341d280d73SBarry Smith ierr = PetscFListFind(obj->qlist,obj->comm,name,ptr);CHKERRQ(ierr); 335e5c89e4eSSatish Balay PetscFunctionReturn(0); 336e5c89e4eSSatish Balay } 337e5c89e4eSSatish Balay 338e5c89e4eSSatish Balay /* 339e5c89e4eSSatish Balay These are the versions that are usable to any CCA compliant objects 340e5c89e4eSSatish Balay */ 341e5c89e4eSSatish Balay #undef __FUNCT__ 342e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose" 343e5c89e4eSSatish Balay /*@C 344e5c89e4eSSatish Balay PetscObjectCompose - Associates another PETSc object with a given PETSc object. 345e5c89e4eSSatish Balay 346e5c89e4eSSatish Balay Not Collective 347e5c89e4eSSatish Balay 348e5c89e4eSSatish Balay Input Parameters: 349e5c89e4eSSatish Balay + obj - the PETSc object; this must be cast with (PetscObject), for example, 350e5c89e4eSSatish Balay PetscObjectCompose((PetscObject)mat,...); 351e5c89e4eSSatish Balay . name - name associated with the child object 352e5c89e4eSSatish Balay - ptr - the other PETSc object to associate with the PETSc object; this must also be 353e5c89e4eSSatish Balay cast with (PetscObject) 354e5c89e4eSSatish Balay 355e5c89e4eSSatish Balay Level: advanced 356e5c89e4eSSatish Balay 357e5c89e4eSSatish Balay Notes: 358e5c89e4eSSatish Balay The second objects reference count is automatically increased by one when it is 359e5c89e4eSSatish Balay composed. 360e5c89e4eSSatish Balay 361e5c89e4eSSatish Balay Replaces any previous object that had the same name. 362e5c89e4eSSatish Balay 363e5c89e4eSSatish Balay If ptr is null and name has previously been composed using an object, then that 364e5c89e4eSSatish Balay entry is removed from the obj. 365e5c89e4eSSatish Balay 366e5c89e4eSSatish Balay PetscObjectCompose() can be used with any PETSc object (such as 367e5c89e4eSSatish Balay Mat, Vec, KSP, SNES, etc.) or any user-provided object. See 368776b82aeSLisandro Dalcin PetscContainerCreate() for info on how to create an object from a 369e5c89e4eSSatish Balay user-provided pointer that may then be composed with PETSc objects. 370e5c89e4eSSatish Balay 371e5c89e4eSSatish Balay Concepts: objects^composing 372e5c89e4eSSatish Balay Concepts: composing objects 373e5c89e4eSSatish Balay 374776b82aeSLisandro Dalcin .seealso: PetscObjectQuery(), PetscContainerCreate() 375e5c89e4eSSatish Balay @*/ 3768738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr) 377e5c89e4eSSatish Balay { 378e5c89e4eSSatish Balay PetscErrorCode ierr; 379e5c89e4eSSatish Balay 380e5c89e4eSSatish Balay PetscFunctionBegin; 3813cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 3823cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 3833cfa8680SLisandro Dalcin if (ptr) PetscValidHeader(ptr,3); 384e5c89e4eSSatish Balay ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr); 385e5c89e4eSSatish Balay PetscFunctionReturn(0); 386e5c89e4eSSatish Balay } 387e5c89e4eSSatish Balay 3889f8a2776SDmitry Karpeev 3899f8a2776SDmitry Karpeev 390e5c89e4eSSatish Balay #undef __FUNCT__ 391e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery" 392e5c89e4eSSatish Balay /*@C 393e5c89e4eSSatish Balay PetscObjectQuery - Gets a PETSc object associated with a given object. 394e5c89e4eSSatish Balay 395e5c89e4eSSatish Balay Not Collective 396e5c89e4eSSatish Balay 397e5c89e4eSSatish Balay Input Parameters: 398e5c89e4eSSatish Balay + obj - the PETSc object 399e5c89e4eSSatish Balay Thus must be cast with a (PetscObject), for example, 400e5c89e4eSSatish Balay PetscObjectCompose((PetscObject)mat,...); 401e5c89e4eSSatish Balay . name - name associated with child object 402e5c89e4eSSatish Balay - ptr - the other PETSc object associated with the PETSc object, this must also be 403e5c89e4eSSatish Balay cast with (PetscObject) 404e5c89e4eSSatish Balay 405e5c89e4eSSatish Balay Level: advanced 406e5c89e4eSSatish Balay 407e5c89e4eSSatish Balay Concepts: objects^composing 408e5c89e4eSSatish Balay Concepts: composing objects 409e5c89e4eSSatish Balay Concepts: objects^querying 410e5c89e4eSSatish Balay Concepts: querying objects 411e5c89e4eSSatish Balay 412e5c89e4eSSatish Balay .seealso: PetscObjectQuery() 413e5c89e4eSSatish Balay @*/ 4148738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr) 415e5c89e4eSSatish Balay { 416e5c89e4eSSatish Balay PetscErrorCode ierr; 417e5c89e4eSSatish Balay 418e5c89e4eSSatish Balay PetscFunctionBegin; 4193cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 4203cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 4213cfa8680SLisandro Dalcin PetscValidPointer(ptr,3); 422e5c89e4eSSatish Balay ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr); 423e5c89e4eSSatish Balay PetscFunctionReturn(0); 424e5c89e4eSSatish Balay } 425e5c89e4eSSatish Balay 426e5c89e4eSSatish Balay #undef __FUNCT__ 427e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction" 4288738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void)) 429e5c89e4eSSatish Balay { 430e5c89e4eSSatish Balay PetscErrorCode ierr; 431e5c89e4eSSatish Balay 432e5c89e4eSSatish Balay PetscFunctionBegin; 4333cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 4343cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 4353cfa8680SLisandro Dalcin PetscValidCharPointer(fname,2); 436e5c89e4eSSatish Balay ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr); 437e5c89e4eSSatish Balay PetscFunctionReturn(0); 438e5c89e4eSSatish Balay } 439e5c89e4eSSatish Balay 440e5c89e4eSSatish Balay #undef __FUNCT__ 441e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction" 442e5c89e4eSSatish Balay /*@C 443e5c89e4eSSatish Balay PetscObjectQueryFunction - Gets a function associated with a given object. 444e5c89e4eSSatish Balay 4453f9fe445SBarry Smith Logically Collective on PetscObject 446e5c89e4eSSatish Balay 447e5c89e4eSSatish Balay Input Parameters: 448e5c89e4eSSatish Balay + obj - the PETSc object; this must be cast with (PetscObject), for example, 449e5c89e4eSSatish Balay PetscObjectQueryFunction((PetscObject)ksp,...); 450e5c89e4eSSatish Balay - name - name associated with the child function 451e5c89e4eSSatish Balay 452e5c89e4eSSatish Balay Output Parameter: 453e5c89e4eSSatish Balay . ptr - function pointer 454e5c89e4eSSatish Balay 455e5c89e4eSSatish Balay Level: advanced 456e5c89e4eSSatish Balay 457e5c89e4eSSatish Balay Concepts: objects^composing functions 458e5c89e4eSSatish Balay Concepts: composing functions 459e5c89e4eSSatish Balay Concepts: functions^querying 460e5c89e4eSSatish Balay Concepts: objects^querying 461e5c89e4eSSatish Balay Concepts: querying objects 462e5c89e4eSSatish Balay 463e5c89e4eSSatish Balay .seealso: PetscObjectComposeFunctionDynamic() 464e5c89e4eSSatish Balay @*/ 4658738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void)) 466e5c89e4eSSatish Balay { 467e5c89e4eSSatish Balay PetscErrorCode ierr; 468e5c89e4eSSatish Balay 469e5c89e4eSSatish Balay PetscFunctionBegin; 4703cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 4713cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 472e5c89e4eSSatish Balay ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr); 473e5c89e4eSSatish Balay PetscFunctionReturn(0); 474e5c89e4eSSatish Balay } 475e5c89e4eSSatish Balay 476776b82aeSLisandro Dalcin struct _p_PetscContainer { 477e5c89e4eSSatish Balay PETSCHEADER(int); 478e5c89e4eSSatish Balay void *ptr; 479e5c89e4eSSatish Balay PetscErrorCode (*userdestroy)(void*); 480e5c89e4eSSatish Balay }; 481e5c89e4eSSatish Balay 482e5c89e4eSSatish Balay #undef __FUNCT__ 483776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerGetPointer" 484e5c89e4eSSatish Balay /*@C 485776b82aeSLisandro Dalcin PetscContainerGetPointer - Gets the pointer value contained in the container. 486e5c89e4eSSatish Balay 4873f9fe445SBarry Smith Not Collective 488e5c89e4eSSatish Balay 489e5c89e4eSSatish Balay Input Parameter: 490776b82aeSLisandro Dalcin . obj - the object created with PetscContainerCreate() 491e5c89e4eSSatish Balay 492e5c89e4eSSatish Balay Output Parameter: 493e5c89e4eSSatish Balay . ptr - the pointer value 494e5c89e4eSSatish Balay 495e5c89e4eSSatish Balay Level: advanced 496e5c89e4eSSatish Balay 497776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(), 498776b82aeSLisandro Dalcin PetscContainerSetPointer() 499e5c89e4eSSatish Balay @*/ 5008738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerGetPointer(PetscContainer obj,void **ptr) 501e5c89e4eSSatish Balay { 502e5c89e4eSSatish Balay PetscFunctionBegin; 5030700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 5043cfa8680SLisandro Dalcin PetscValidPointer(ptr,2); 505e5c89e4eSSatish Balay *ptr = obj->ptr; 506e5c89e4eSSatish Balay PetscFunctionReturn(0); 507e5c89e4eSSatish Balay } 508e5c89e4eSSatish Balay 509e5c89e4eSSatish Balay 510e5c89e4eSSatish Balay #undef __FUNCT__ 511776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetPointer" 512e5c89e4eSSatish Balay /*@C 513776b82aeSLisandro Dalcin PetscContainerSetPointer - Sets the pointer value contained in the container. 514e5c89e4eSSatish Balay 5153f9fe445SBarry Smith Logically Collective on PetscContainer 516e5c89e4eSSatish Balay 517e5c89e4eSSatish Balay Input Parameters: 518776b82aeSLisandro Dalcin + obj - the object created with PetscContainerCreate() 519e5c89e4eSSatish Balay - ptr - the pointer value 520e5c89e4eSSatish Balay 521e5c89e4eSSatish Balay Level: advanced 522e5c89e4eSSatish Balay 523776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(), 524776b82aeSLisandro Dalcin PetscContainerGetPointer() 525e5c89e4eSSatish Balay @*/ 5268738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerSetPointer(PetscContainer obj,void *ptr) 527e5c89e4eSSatish Balay { 528e5c89e4eSSatish Balay PetscFunctionBegin; 5290700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 5303cfa8680SLisandro Dalcin if (ptr) PetscValidPointer(ptr,2); 531e5c89e4eSSatish Balay obj->ptr = ptr; 532e5c89e4eSSatish Balay PetscFunctionReturn(0); 533e5c89e4eSSatish Balay } 534e5c89e4eSSatish Balay 535e5c89e4eSSatish Balay #undef __FUNCT__ 536776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerDestroy" 537e5c89e4eSSatish Balay /*@C 538776b82aeSLisandro Dalcin PetscContainerDestroy - Destroys a PETSc container object. 539e5c89e4eSSatish Balay 540776b82aeSLisandro Dalcin Collective on PetscContainer 541e5c89e4eSSatish Balay 542e5c89e4eSSatish Balay Input Parameter: 543776b82aeSLisandro Dalcin . obj - an object that was created with PetscContainerCreate() 544e5c89e4eSSatish Balay 545e5c89e4eSSatish Balay Level: advanced 546e5c89e4eSSatish Balay 547776b82aeSLisandro Dalcin .seealso: PetscContainerCreate() 548e5c89e4eSSatish Balay @*/ 5498738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerDestroy(PetscContainer obj) 550e5c89e4eSSatish Balay { 551e5c89e4eSSatish Balay PetscErrorCode ierr; 552e5c89e4eSSatish Balay PetscFunctionBegin; 5530700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 5547adad957SLisandro Dalcin if (--((PetscObject)obj)->refct > 0) PetscFunctionReturn(0); 555e5c89e4eSSatish Balay if (obj->userdestroy) (*obj->userdestroy)(obj->ptr); 556e5c89e4eSSatish Balay ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr); 557e5c89e4eSSatish Balay PetscFunctionReturn(0); 558e5c89e4eSSatish Balay } 559e5c89e4eSSatish Balay 560e5c89e4eSSatish Balay #undef __FUNCT__ 561776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetUserDestroy" 562e5c89e4eSSatish Balay /*@C 563776b82aeSLisandro Dalcin PetscContainerSetUserDestroy - Sets name of the user destroy function. 564e5c89e4eSSatish Balay 5653f9fe445SBarry Smith Logically Collective on PetscContainer 566e5c89e4eSSatish Balay 567e5c89e4eSSatish Balay Input Parameter: 568776b82aeSLisandro Dalcin + obj - an object that was created with PetscContainerCreate() 569e5c89e4eSSatish Balay - des - name of the user destroy function 570e5c89e4eSSatish Balay 571e5c89e4eSSatish Balay Level: advanced 572e5c89e4eSSatish Balay 573776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy() 574e5c89e4eSSatish Balay @*/ 5758738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void*)) 576e5c89e4eSSatish Balay { 577e5c89e4eSSatish Balay PetscFunctionBegin; 5780700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 579e5c89e4eSSatish Balay obj->userdestroy = des; 580e5c89e4eSSatish Balay PetscFunctionReturn(0); 581e5c89e4eSSatish Balay } 582e5c89e4eSSatish Balay 5838738c821SJed Brown PetscClassId PETSCSYS_DLLEXPORT PETSC_CONTAINER_CLASSID; 584e5c89e4eSSatish Balay 585e5c89e4eSSatish Balay #undef __FUNCT__ 586776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerCreate" 587e5c89e4eSSatish Balay /*@C 588776b82aeSLisandro Dalcin PetscContainerCreate - Creates a PETSc object that has room to hold 589e5c89e4eSSatish Balay a single pointer. This allows one to attach any type of data (accessible 590e5c89e4eSSatish Balay through a pointer) with the PetscObjectCompose() function to a PetscObject. 591776b82aeSLisandro Dalcin The data item itself is attached by a call to PetscContainerSetPointer. 592e5c89e4eSSatish Balay 593e5c89e4eSSatish Balay Collective on MPI_Comm 594e5c89e4eSSatish Balay 595e5c89e4eSSatish Balay Input Parameters: 596e5c89e4eSSatish Balay . comm - MPI communicator that shares the object 597e5c89e4eSSatish Balay 598e5c89e4eSSatish Balay Output Parameters: 599e5c89e4eSSatish Balay . container - the container created 600e5c89e4eSSatish Balay 601e5c89e4eSSatish Balay Level: advanced 602e5c89e4eSSatish Balay 603776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy(), PetscContainerSetPointer(), PetscContainerGetPointer() 604e5c89e4eSSatish Balay @*/ 6058738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerCreate(MPI_Comm comm,PetscContainer *container) 606e5c89e4eSSatish Balay { 607e5c89e4eSSatish Balay PetscErrorCode ierr; 608776b82aeSLisandro Dalcin PetscContainer contain; 609e5c89e4eSSatish Balay 610e5c89e4eSSatish Balay PetscFunctionBegin; 6113cfa8680SLisandro Dalcin PetscValidPointer(container,2); 6120700a824SBarry Smith ierr = PetscHeaderCreate(contain,_p_PetscContainer,PetscInt,PETSC_CONTAINER_CLASSID,0,"PetscContainer",comm,PetscContainerDestroy,0);CHKERRQ(ierr); 613e5c89e4eSSatish Balay *container = contain; 614e5c89e4eSSatish Balay PetscFunctionReturn(0); 615e5c89e4eSSatish Balay } 616e5c89e4eSSatish Balay 617e5c89e4eSSatish Balay #undef __FUNCT__ 618e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetFromOptions" 619e5c89e4eSSatish Balay /*@ 620e5c89e4eSSatish Balay PetscObjectSetFromOptions - Sets generic parameters from user options. 621e5c89e4eSSatish Balay 622e5c89e4eSSatish Balay Collective on obj 623e5c89e4eSSatish Balay 624e5c89e4eSSatish Balay Input Parameter: 625e5c89e4eSSatish Balay . obj - the PetscObjcet 626e5c89e4eSSatish Balay 627e5c89e4eSSatish Balay Options Database Keys: 628e5c89e4eSSatish Balay 629e5c89e4eSSatish Balay Notes: 630e5c89e4eSSatish Balay We have no generic options at present, so this does nothing 631e5c89e4eSSatish Balay 632e5c89e4eSSatish Balay Level: beginner 633e5c89e4eSSatish Balay 634e5c89e4eSSatish Balay .keywords: set, options, database 635e5c89e4eSSatish Balay .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix() 636e5c89e4eSSatish Balay @*/ 6378738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectSetFromOptions(PetscObject obj) 638e5c89e4eSSatish Balay { 639e5c89e4eSSatish Balay PetscFunctionBegin; 6403cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 641e5c89e4eSSatish Balay PetscFunctionReturn(0); 642e5c89e4eSSatish Balay } 643e5c89e4eSSatish Balay 644e5c89e4eSSatish Balay #undef __FUNCT__ 645e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetUp" 646e5c89e4eSSatish Balay /*@ 647e5c89e4eSSatish Balay PetscObjectSetUp - Sets up the internal data structures for the later use. 648e5c89e4eSSatish Balay 649e5c89e4eSSatish Balay Collective on PetscObject 650e5c89e4eSSatish Balay 651e5c89e4eSSatish Balay Input Parameters: 652e5c89e4eSSatish Balay . obj - the PetscObject 653e5c89e4eSSatish Balay 654e5c89e4eSSatish Balay Notes: 655e5c89e4eSSatish Balay This does nothing at present. 656e5c89e4eSSatish Balay 657e5c89e4eSSatish Balay Level: advanced 658e5c89e4eSSatish Balay 659e5c89e4eSSatish Balay .keywords: setup 660e5c89e4eSSatish Balay .seealso: PetscObjectDestroy() 661e5c89e4eSSatish Balay @*/ 6628738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectSetUp(PetscObject obj) 663e5c89e4eSSatish Balay { 664e5c89e4eSSatish Balay PetscFunctionBegin; 6653cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 666e5c89e4eSSatish Balay PetscFunctionReturn(0); 667e5c89e4eSSatish Balay } 668