1e5c89e4eSSatish Balay /* 2e5c89e4eSSatish Balay Provides utility routines for manipulating any type of PETSc object. 3e5c89e4eSSatish Balay */ 4af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 5665c2dedSJed Brown #include <petscviewer.h> 6e5c89e4eSSatish Balay 795c0884eSLisandro Dalcin PETSC_INTERN PetscObject *PetscObjects; 8ecfe9a72SLisandro Dalcin PETSC_INTERN PetscInt PetscObjectsCounts; 9ecfe9a72SLisandro Dalcin PETSC_INTERN PetscInt PetscObjectsMaxCounts; 1095c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscObjectsLog; 1195c0884eSLisandro Dalcin 1202c9f0b5SLisandro Dalcin PetscObject *PetscObjects = NULL; 132eff7a51SBarry Smith PetscInt PetscObjectsCounts = 0, PetscObjectsMaxCounts = 0; 1405df10baSBarry Smith PetscBool PetscObjectsLog = PETSC_FALSE; 152e82e6d1SBarry Smith 16d71ae5a4SJacob Faibussowitsch PetscObjectId PetscObjectNewId_Internal(void) 17d71ae5a4SJacob Faibussowitsch { 180e6b6b59SJacob Faibussowitsch static PetscObjectId idcnt = 1; 190e6b6b59SJacob Faibussowitsch return idcnt++; 200e6b6b59SJacob Faibussowitsch } 210e6b6b59SJacob Faibussowitsch 22e5c89e4eSSatish Balay /* 23e5c89e4eSSatish Balay PetscHeaderCreate_Private - Creates a base PETSc object header and fills 24e5c89e4eSSatish Balay in the default values. Called by the macro PetscHeaderCreate(). 25e5c89e4eSSatish Balay */ 26d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscHeaderCreate_Private(PetscObject h, PetscClassId classid, const char class_name[], const char descr[], const char mansec[], MPI_Comm comm, PetscObjectDestroyFunction destroy, PetscObjectViewFunction view) 27d71ae5a4SJacob Faibussowitsch { 2862e5d2d2SJDBetteridge void *get_tmp; 2962e5d2d2SJDBetteridge PetscInt64 *cidx; 3062e5d2d2SJDBetteridge PetscMPIInt flg; 3162e5d2d2SJDBetteridge 32e5c89e4eSSatish Balay PetscFunctionBegin; 330700a824SBarry Smith h->classid = classid; 34e5c89e4eSSatish Balay h->class_name = (char *)class_name; 353194b578SJed Brown h->description = (char *)descr; 363194b578SJed Brown h->mansec = (char *)mansec; 37e5c89e4eSSatish Balay h->refct = 1; 3862e5d2d2SJDBetteridge h->non_cyclic_references = NULL; 390e6b6b59SJacob Faibussowitsch h->id = PetscObjectNewId_Internal(); 4073107ff1SLisandro Dalcin h->bops->destroy = destroy; 4173107ff1SLisandro Dalcin h->bops->view = view; 42a297a907SKarl Rupp 439566063dSJacob Faibussowitsch PetscCall(PetscCommDuplicate(comm, &h->comm, &h->tag)); 442e82e6d1SBarry Smith 4562e5d2d2SJDBetteridge /* Increment and store current object creation index */ 4662e5d2d2SJDBetteridge PetscCallMPI(MPI_Comm_get_attr(h->comm, Petsc_CreationIdx_keyval, &get_tmp, &flg)); 47ff6a9541SJacob Faibussowitsch PetscCheck(flg, h->comm, PETSC_ERR_ARG_CORRUPT, "MPI_Comm does not have an object creation index"); 4862e5d2d2SJDBetteridge cidx = (PetscInt64 *)get_tmp; 4962e5d2d2SJDBetteridge h->cidx = (*cidx)++; 5062e5d2d2SJDBetteridge PetscCallMPI(MPI_Comm_set_attr(h->comm, Petsc_CreationIdx_keyval, cidx)); 5162e5d2d2SJDBetteridge 522e82e6d1SBarry Smith /* Keep a record of object created */ 53*2611ad71SToby Isaac if (PetscDefined(USE_LOG) && PetscObjectsLog) { 540e6b6b59SJacob Faibussowitsch PetscObject *newPetscObjects; 550e6b6b59SJacob Faibussowitsch PetscInt newPetscObjectsMaxCounts; 560e6b6b59SJacob Faibussowitsch 572e82e6d1SBarry Smith PetscObjectsCounts++; 580e6b6b59SJacob Faibussowitsch for (PetscInt i = 0; i < PetscObjectsMaxCounts; ++i) { 592e82e6d1SBarry Smith if (!PetscObjects[i]) { 602e82e6d1SBarry Smith PetscObjects[i] = h; 613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 622e82e6d1SBarry Smith } 632e82e6d1SBarry Smith } 642e82e6d1SBarry Smith /* Need to increase the space for storing PETSc objects */ 652e82e6d1SBarry Smith if (!PetscObjectsMaxCounts) newPetscObjectsMaxCounts = 100; 662e82e6d1SBarry Smith else newPetscObjectsMaxCounts = 2 * PetscObjectsMaxCounts; 679566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(newPetscObjectsMaxCounts, &newPetscObjects)); 689566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(newPetscObjects, PetscObjects, PetscObjectsMaxCounts)); 699566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscObjects)); 70a297a907SKarl Rupp 712e82e6d1SBarry Smith PetscObjects = newPetscObjects; 722e82e6d1SBarry Smith PetscObjects[PetscObjectsMaxCounts] = h; 732e82e6d1SBarry Smith PetscObjectsMaxCounts = newPetscObjectsMaxCounts; 7405df10baSBarry Smith } 753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 76e5c89e4eSSatish Balay } 77e5c89e4eSSatish Balay 7895c0884eSLisandro Dalcin PETSC_INTERN PetscBool PetscMemoryCollectMaximumUsage; 7995c0884eSLisandro Dalcin PETSC_INTERN PetscLogDouble PetscMemoryMaximumUsage; 80e5c89e4eSSatish Balay 81e5c89e4eSSatish Balay /* 82e5c89e4eSSatish Balay PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by 83e5c89e4eSSatish Balay the macro PetscHeaderDestroy(). 84e5c89e4eSSatish Balay */ 85d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscHeaderDestroy_Private(PetscObject obj, PetscBool clear_for_reuse) 86d71ae5a4SJacob Faibussowitsch { 87e5c89e4eSSatish Balay PetscFunctionBegin; 880e6b6b59SJacob Faibussowitsch PetscValidHeader(obj, 1); 890e6b6b59SJacob Faibussowitsch PetscCall(PetscComposedQuantitiesDestroy(obj)); 90e5c89e4eSSatish Balay if (PetscMemoryCollectMaximumUsage) { 91e5c89e4eSSatish Balay PetscLogDouble usage; 920e6b6b59SJacob Faibussowitsch 939566063dSJacob Faibussowitsch PetscCall(PetscMemoryGetCurrentUsage(&usage)); 94e5c89e4eSSatish Balay if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage; 95e5c89e4eSSatish Balay } 9608a557f7SLisandro Dalcin /* first destroy things that could execute arbitrary code */ 970e6b6b59SJacob Faibussowitsch if (obj->python_destroy) { 980e6b6b59SJacob Faibussowitsch void *python_context = obj->python_context; 990e6b6b59SJacob Faibussowitsch PetscErrorCode (*python_destroy)(void *) = obj->python_destroy; 100a297a907SKarl Rupp 1010e6b6b59SJacob Faibussowitsch obj->python_context = NULL; 1020e6b6b59SJacob Faibussowitsch obj->python_destroy = NULL; 1039566063dSJacob Faibussowitsch PetscCall((*python_destroy)(python_context)); 10408a557f7SLisandro Dalcin } 1050e6b6b59SJacob Faibussowitsch PetscCall(PetscObjectDestroyOptionsHandlers(obj)); 1060e6b6b59SJacob Faibussowitsch PetscCall(PetscObjectListDestroy(&obj->olist)); 107a297a907SKarl Rupp 1080e6b6b59SJacob Faibussowitsch /* destroy allocated quantities */ 1090e6b6b59SJacob Faibussowitsch if (PetscPrintFunctionList) PetscCall(PetscFunctionListPrintNonEmpty(obj->qlist)); 1100e6b6b59SJacob Faibussowitsch PetscCheck(--(obj->refct) <= 0, obj->comm, PETSC_ERR_PLIB, "Destroying a PetscObject (%s) with reference count %" PetscInt_FMT " >= 1", obj->name ? obj->name : "unnamed", obj->refct); 1110e6b6b59SJacob Faibussowitsch PetscCall(PetscFree(obj->name)); 1120e6b6b59SJacob Faibussowitsch PetscCall(PetscFree(obj->prefix)); 1130e6b6b59SJacob Faibussowitsch PetscCall(PetscFree(obj->type_name)); 1142e82e6d1SBarry Smith 1150e6b6b59SJacob Faibussowitsch if (clear_for_reuse) { 1160e6b6b59SJacob Faibussowitsch /* we will assume that obj->bops->view and destroy are safe to leave as-is */ 1170e6b6b59SJacob Faibussowitsch 1180e6b6b59SJacob Faibussowitsch /* reset quantities, in order of appearance in _p_PetscObject */ 1190e6b6b59SJacob Faibussowitsch obj->id = PetscObjectNewId_Internal(); 1200e6b6b59SJacob Faibussowitsch obj->refct = 1; 1210e6b6b59SJacob Faibussowitsch obj->tablevel = 0; 1220e6b6b59SJacob Faibussowitsch obj->state = 0; 1230e6b6b59SJacob Faibussowitsch /* don't deallocate, zero these out instead */ 1240e6b6b59SJacob Faibussowitsch PetscCall(PetscFunctionListClear(obj->qlist)); 1250e6b6b59SJacob Faibussowitsch PetscCall(PetscArrayzero(obj->fortran_func_pointers, obj->num_fortran_func_pointers)); 1260e6b6b59SJacob Faibussowitsch PetscCall(PetscArrayzero(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_CLASS], obj->num_fortrancallback[PETSC_FORTRAN_CALLBACK_CLASS])); 1270e6b6b59SJacob Faibussowitsch PetscCall(PetscArrayzero(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE], obj->num_fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE])); 1280e6b6b59SJacob Faibussowitsch obj->optionsprinted = PETSC_FALSE; 1290e6b6b59SJacob Faibussowitsch #if PetscDefined(HAVE_SAWS) 1300e6b6b59SJacob Faibussowitsch obj->amsmem = PETSC_FALSE; 1310e6b6b59SJacob Faibussowitsch obj->amspublishblock = PETSC_FALSE; 1320e6b6b59SJacob Faibussowitsch #endif 1330e6b6b59SJacob Faibussowitsch obj->options = NULL; 1340e6b6b59SJacob Faibussowitsch obj->donotPetscObjectPrintClassNamePrefixType = PETSC_FALSE; 1350e6b6b59SJacob Faibussowitsch } else { 1360e6b6b59SJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&obj->qlist)); 1370e6b6b59SJacob Faibussowitsch PetscCall(PetscFree(obj->fortran_func_pointers)); 1380e6b6b59SJacob Faibussowitsch PetscCall(PetscFree(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_CLASS])); 1390e6b6b59SJacob Faibussowitsch PetscCall(PetscFree(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE])); 1400e6b6b59SJacob Faibussowitsch PetscCall(PetscCommDestroy(&obj->comm)); 1410e6b6b59SJacob Faibussowitsch obj->classid = PETSCFREEDHEADER; 1420e6b6b59SJacob Faibussowitsch 143*2611ad71SToby Isaac if (PetscDefined(USE_LOG) && PetscObjectsLog) { 1442e82e6d1SBarry Smith /* Record object removal from list of all objects */ 1450e6b6b59SJacob Faibussowitsch for (PetscInt i = 0; i < PetscObjectsMaxCounts; ++i) { 1460e6b6b59SJacob Faibussowitsch if (PetscObjects[i] == obj) { 14702c9f0b5SLisandro Dalcin PetscObjects[i] = NULL; 1480e6b6b59SJacob Faibussowitsch --PetscObjectsCounts; 1492e82e6d1SBarry Smith break; 1502e82e6d1SBarry Smith } 1512e82e6d1SBarry Smith } 1522eff7a51SBarry Smith if (!PetscObjectsCounts) { 1539566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscObjects)); 1542e82e6d1SBarry Smith PetscObjectsMaxCounts = 0; 1552e82e6d1SBarry Smith } 1564097062eSBarry Smith } 1570e6b6b59SJacob Faibussowitsch } 1583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1590e6b6b59SJacob Faibussowitsch } 1600e6b6b59SJacob Faibussowitsch 1610e6b6b59SJacob Faibussowitsch /* 1620e6b6b59SJacob Faibussowitsch PetscHeaderReset_Internal - "Reset" a PetscObject header. This is tantamount to destroying 1630e6b6b59SJacob Faibussowitsch the object but does not free all resources. The object retains its: 1640e6b6b59SJacob Faibussowitsch 1650e6b6b59SJacob Faibussowitsch - classid 1660e6b6b59SJacob Faibussowitsch - bops->view 1670e6b6b59SJacob Faibussowitsch - bops->destroy 1680e6b6b59SJacob Faibussowitsch - comm 1690e6b6b59SJacob Faibussowitsch - tag 1700e6b6b59SJacob Faibussowitsch - class_name 1710e6b6b59SJacob Faibussowitsch - description 1720e6b6b59SJacob Faibussowitsch - mansec 1730e6b6b59SJacob Faibussowitsch - cpp 1740e6b6b59SJacob Faibussowitsch 1750e6b6b59SJacob Faibussowitsch Note that while subclass information is lost, superclass info remains. Thus this function is 1760e6b6b59SJacob Faibussowitsch intended to be used to reuse a PetscObject within the same class to avoid reallocating its 1770e6b6b59SJacob Faibussowitsch resources. 1780e6b6b59SJacob Faibussowitsch */ 179d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscHeaderReset_Internal(PetscObject obj) 180d71ae5a4SJacob Faibussowitsch { 1810e6b6b59SJacob Faibussowitsch PetscFunctionBegin; 1820e6b6b59SJacob Faibussowitsch PetscCall(PetscHeaderDestroy_Private(obj, PETSC_TRUE)); 1833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 184e5c89e4eSSatish Balay } 185e5c89e4eSSatish Balay 1868cd211a4SJed Brown /*@C 1878cd211a4SJed Brown PetscObjectCopyFortranFunctionPointers - Copy function pointers to another object 1888cd211a4SJed Brown 189c3339decSBarry Smith Logically Collective 1908cd211a4SJed Brown 191d8d19677SJose E. Roman Input Parameters: 1928cd211a4SJed Brown + src - source object 1938cd211a4SJed Brown - dest - destination object 1948cd211a4SJed Brown 1958cd211a4SJed Brown Level: developer 1968cd211a4SJed Brown 1978cd211a4SJed Brown Note: 1988cd211a4SJed Brown Both objects must have the same class. 199811af0c4SBarry Smith 200811af0c4SBarry Smith This is used to help manage user callback functions that were provided in Fortran 20121532e8aSBarry Smith 20221532e8aSBarry Smith .seealso: `PetscFortranCallbackRegister()`, `PetscFortranCallbackGetSizes()` 2038cd211a4SJed Brown @*/ 204d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectCopyFortranFunctionPointers(PetscObject src, PetscObject dest) 205d71ae5a4SJacob Faibussowitsch { 206e0cd13aeSBarry Smith PetscFortranCallbackId cbtype, numcb[PETSC_FORTRAN_CALLBACK_MAXTYPE]; 2078cd211a4SJed Brown 2088cd211a4SJed Brown PetscFunctionBegin; 2098cd211a4SJed Brown PetscValidHeader(src, 1); 2108cd211a4SJed Brown PetscValidHeader(dest, 2); 2115f80ce2aSJacob Faibussowitsch PetscCheck(src->classid == dest->classid, src->comm, PETSC_ERR_ARG_INCOMP, "Objects must be of the same class"); 2128cd211a4SJed Brown 2139566063dSJacob Faibussowitsch PetscCall(PetscFree(dest->fortran_func_pointers)); 2149566063dSJacob Faibussowitsch PetscCall(PetscMalloc(src->num_fortran_func_pointers * sizeof(void (*)(void)), &dest->fortran_func_pointers)); 2159566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(dest->fortran_func_pointers, src->fortran_func_pointers, src->num_fortran_func_pointers * sizeof(void (*)(void)))); 216a297a907SKarl Rupp 2178cd211a4SJed Brown dest->num_fortran_func_pointers = src->num_fortran_func_pointers; 218f6291634SJed Brown 2199566063dSJacob Faibussowitsch PetscCall(PetscFortranCallbackGetSizes(src->classid, &numcb[PETSC_FORTRAN_CALLBACK_CLASS], &numcb[PETSC_FORTRAN_CALLBACK_SUBTYPE])); 220f6291634SJed Brown for (cbtype = PETSC_FORTRAN_CALLBACK_CLASS; cbtype < PETSC_FORTRAN_CALLBACK_MAXTYPE; cbtype++) { 2219566063dSJacob Faibussowitsch PetscCall(PetscFree(dest->fortrancallback[cbtype])); 2229566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(numcb[cbtype], &dest->fortrancallback[cbtype])); 2239566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(dest->fortrancallback[cbtype], src->fortrancallback[cbtype], src->num_fortrancallback[cbtype] * sizeof(PetscFortranCallback))); 224c6d7f657SBarry Smith dest->num_fortrancallback[cbtype] = src->num_fortrancallback[cbtype]; 225f6291634SJed Brown } 2263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 227f6291634SJed Brown } 228f6291634SJed Brown 229de6d466bSJed Brown /*@C 230f6291634SJed Brown PetscObjectSetFortranCallback - set fortran callback function pointer and context 231f6291634SJed Brown 232f6291634SJed Brown Logically Collective 233f6291634SJed Brown 2344165533cSJose E. Roman Input Parameters: 235f6291634SJed Brown + obj - object on which to set callback 236f6291634SJed Brown . cbtype - callback type (class or subtype) 237f6291634SJed Brown . cid - address of callback Id, updated if not yet initialized (zero) 238f6291634SJed Brown . func - Fortran function 239f6291634SJed Brown - ctx - Fortran context 240f6291634SJed Brown 241f6291634SJed Brown Level: developer 242f6291634SJed Brown 243811af0c4SBarry Smith Note: 244811af0c4SBarry Smith This is used to help manage user callback functions that were provided in Fortran 245811af0c4SBarry Smith 24621532e8aSBarry Smith .seealso: `PetscObjectGetFortranCallback()`, `PetscFortranCallbackRegister()`, `PetscFortranCallbackGetSizes()` 247f6291634SJed Brown @*/ 248d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSetFortranCallback(PetscObject obj, PetscFortranCallbackType cbtype, PetscFortranCallbackId *cid, void (*func)(void), void *ctx) 249d71ae5a4SJacob Faibussowitsch { 2500298fd71SBarry Smith const char *subtype = NULL; 251f6291634SJed Brown 252f6291634SJed Brown PetscFunctionBegin; 253f6291634SJed Brown PetscValidHeader(obj, 1); 254f6291634SJed Brown if (cbtype == PETSC_FORTRAN_CALLBACK_SUBTYPE) subtype = obj->type_name; 2559566063dSJacob Faibussowitsch if (!*cid) PetscCall(PetscFortranCallbackRegister(obj->classid, subtype, cid)); 256f6291634SJed Brown if (*cid >= PETSC_SMALLEST_FORTRAN_CALLBACK + obj->num_fortrancallback[cbtype]) { 257e0cd13aeSBarry Smith PetscFortranCallbackId oldnum = obj->num_fortrancallback[cbtype]; 258e0cd13aeSBarry Smith PetscFortranCallbackId newnum = PetscMax(*cid - PETSC_SMALLEST_FORTRAN_CALLBACK + 1, 2 * oldnum); 259f6291634SJed Brown PetscFortranCallback *callback; 2609566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(newnum, &callback)); 2619566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(callback, obj->fortrancallback[cbtype], oldnum * sizeof(*obj->fortrancallback[cbtype]))); 2629566063dSJacob Faibussowitsch PetscCall(PetscFree(obj->fortrancallback[cbtype])); 263a297a907SKarl Rupp 264f6291634SJed Brown obj->fortrancallback[cbtype] = callback; 265f6291634SJed Brown obj->num_fortrancallback[cbtype] = newnum; 266f6291634SJed Brown } 267f6291634SJed Brown obj->fortrancallback[cbtype][*cid - PETSC_SMALLEST_FORTRAN_CALLBACK].func = func; 268f6291634SJed Brown obj->fortrancallback[cbtype][*cid - PETSC_SMALLEST_FORTRAN_CALLBACK].ctx = ctx; 2693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 270f6291634SJed Brown } 271f6291634SJed Brown 272de6d466bSJed Brown /*@C 273f6291634SJed Brown PetscObjectGetFortranCallback - get fortran callback function pointer and context 274f6291634SJed Brown 275f6291634SJed Brown Logically Collective 276f6291634SJed Brown 2774165533cSJose E. Roman Input Parameters: 278f6291634SJed Brown + obj - object on which to get callback 279f6291634SJed Brown . cbtype - callback type 280f6291634SJed Brown - cid - address of callback Id 281f6291634SJed Brown 2824165533cSJose E. Roman Output Parameters: 28321532e8aSBarry Smith + func - Fortran function (or `NULL` if not needed) 28421532e8aSBarry Smith - ctx - Fortran context (or `NULL` if not needed) 285f6291634SJed Brown 286f6291634SJed Brown Level: developer 287f6291634SJed Brown 288811af0c4SBarry Smith Note: 289811af0c4SBarry Smith This is used to help manage user callback functions that were provided in Fortran 290811af0c4SBarry Smith 29142747ad1SJacob Faibussowitsch .seealso: `PetscObjectSetFortranCallback()`, `PetscFortranCallbackRegister()`, `PetscFortranCallbackGetSizes()` 292f6291634SJed Brown @*/ 293d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectGetFortranCallback(PetscObject obj, PetscFortranCallbackType cbtype, PetscFortranCallbackId cid, void (**func)(void), void **ctx) 294d71ae5a4SJacob Faibussowitsch { 295f6291634SJed Brown PetscFortranCallback *cb; 296f6291634SJed Brown 297f6291634SJed Brown PetscFunctionBegin; 298f6291634SJed Brown PetscValidHeader(obj, 1); 2995f80ce2aSJacob Faibussowitsch PetscCheck(cid >= PETSC_SMALLEST_FORTRAN_CALLBACK, obj->comm, PETSC_ERR_ARG_CORRUPT, "Fortran callback Id invalid"); 3005f80ce2aSJacob Faibussowitsch PetscCheck(cid < PETSC_SMALLEST_FORTRAN_CALLBACK + obj->num_fortrancallback[cbtype], obj->comm, PETSC_ERR_ARG_CORRUPT, "Fortran callback not set on this object"); 301f6291634SJed Brown cb = &obj->fortrancallback[cbtype][cid - PETSC_SMALLEST_FORTRAN_CALLBACK]; 302f6291634SJed Brown if (func) *func = cb->func; 303f6291634SJed Brown if (ctx) *ctx = cb->ctx; 3043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3058cd211a4SJed Brown } 3068cd211a4SJed Brown 3074097062eSBarry Smith #if defined(PETSC_USE_LOG) 308a64a8e02SBarry Smith /*@C 309811af0c4SBarry Smith PetscObjectsDump - Prints all the currently existing objects. 310a64a8e02SBarry Smith 311811af0c4SBarry Smith On rank 0 of `PETSC_COMM_WORLD` prints the values 312a64a8e02SBarry Smith 313d8d19677SJose E. Roman Input Parameters: 314bbe210f1SBarry Smith + fd - file pointer 315811af0c4SBarry Smith - all - by default only tries to display objects created explicitly by the user, if all is `PETSC_TRUE` then lists all outstanding objects 316a64a8e02SBarry Smith 317811af0c4SBarry Smith Options Database Key: 31810699b91SBarry Smith . -objects_dump <all> - print information about all the objects that exist at the end of the programs run 319bbe210f1SBarry Smith 320a64a8e02SBarry Smith Level: advanced 321a64a8e02SBarry Smith 32221532e8aSBarry Smith .seealso: `PetscObject` 323a64a8e02SBarry Smith @*/ 324d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectsDump(FILE *fd, PetscBool all) 325d71ae5a4SJacob Faibussowitsch { 326dfb7d7afSStefano Zampini PetscInt i, j, k = 0; 327a64a8e02SBarry Smith PetscObject h; 328a64a8e02SBarry Smith 329a64a8e02SBarry Smith PetscFunctionBegin; 330a64a8e02SBarry Smith if (PetscObjectsCounts) { 3319566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_WORLD, fd, "The following objects were never freed\n")); 3329566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_WORLD, fd, "-----------------------------------------\n")); 333a64a8e02SBarry Smith for (i = 0; i < PetscObjectsMaxCounts; i++) { 334a64a8e02SBarry Smith if ((h = PetscObjects[i])) { 3359566063dSJacob Faibussowitsch PetscCall(PetscObjectName(h)); 3362c9581d2SBarry Smith { 33702c9f0b5SLisandro Dalcin PetscStack *stack = NULL; 338bbcf679cSJacob Faibussowitsch char *create = NULL, *rclass = NULL; 339a8d2bbe5SBarry Smith 340a8d2bbe5SBarry Smith /* if the PETSc function the user calls is not a create then this object was NOT directly created by them */ 3419566063dSJacob Faibussowitsch PetscCall(PetscMallocGetStack(h, &stack)); 34276386721SLisandro Dalcin if (stack) { 34368f616c8SBarry Smith k = stack->currentsize - 2; 3447eb1d149SBarry Smith if (!all) { 34568f616c8SBarry Smith k = 0; 34668f616c8SBarry Smith while (!stack->petscroutine[k]) k++; 3479566063dSJacob Faibussowitsch PetscCall(PetscStrstr(stack->function[k], "Create", &create)); 34848a46eb9SPierre Jolivet if (!create) PetscCall(PetscStrstr(stack->function[k], "Get", &create)); 3499566063dSJacob Faibussowitsch PetscCall(PetscStrstr(stack->function[k], h->class_name, &rclass)); 3502c9581d2SBarry Smith if (!create) continue; 351719d7bfeSBarry Smith if (!rclass) continue; 3527eb1d149SBarry Smith } 35376386721SLisandro Dalcin } 3542c9581d2SBarry Smith 3559566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_WORLD, fd, "[%d] %s %s %s\n", PetscGlobalRank, h->class_name, h->type_name, h->name)); 3562c9581d2SBarry Smith 3579566063dSJacob Faibussowitsch PetscCall(PetscMallocGetStack(h, &stack)); 35876386721SLisandro Dalcin if (stack) { 359ad540459SPierre Jolivet for (j = k; j >= 0; j--) fprintf(fd, " [%d] %s() in %s\n", PetscGlobalRank, stack->function[j], stack->file[j]); 36076386721SLisandro Dalcin } 3612c9581d2SBarry Smith } 362a64a8e02SBarry Smith } 363a64a8e02SBarry Smith } 364a64a8e02SBarry Smith } 3653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 366a64a8e02SBarry Smith } 367a64a8e02SBarry Smith 368c139c21fSBarry Smith /*@C 369c139c21fSBarry Smith PetscObjectsView - Prints the currently existing objects. 370c139c21fSBarry Smith 371c3339decSBarry Smith Logically Collective 372c139c21fSBarry Smith 373c139c21fSBarry Smith Input Parameter: 374811af0c4SBarry Smith . viewer - must be an `PETSCVIEWERASCII` viewer 375c139c21fSBarry Smith 376c139c21fSBarry Smith Level: advanced 377c139c21fSBarry Smith 37821532e8aSBarry Smith .seealso: `PetscObject` 379c139c21fSBarry Smith @*/ 380d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectsView(PetscViewer viewer) 381d71ae5a4SJacob Faibussowitsch { 382c139c21fSBarry Smith PetscBool isascii; 383a64a8e02SBarry Smith FILE *fd; 384c139c21fSBarry Smith 385c139c21fSBarry Smith PetscFunctionBegin; 386c139c21fSBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 3879566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 3885f80ce2aSJacob Faibussowitsch PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Only supports ASCII viewer"); 3899566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetPointer(viewer, &fd)); 3909566063dSJacob Faibussowitsch PetscCall(PetscObjectsDump(fd, PETSC_TRUE)); 3913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 392c139c21fSBarry Smith } 393c139c21fSBarry Smith 394c139c21fSBarry Smith /*@C 395c139c21fSBarry Smith PetscObjectsGetObject - Get a pointer to a named object 396c139c21fSBarry Smith 39720f4b53cSBarry Smith Not Collective 398c139c21fSBarry Smith 399c139c21fSBarry Smith Input Parameter: 400c139c21fSBarry Smith . name - the name of an object 401c139c21fSBarry Smith 4026b867d5aSJose E. Roman Output Parameters: 40321532e8aSBarry Smith + obj - the object or `NULL` if there is no object 4046b867d5aSJose E. Roman - classname - the name of the class 405c139c21fSBarry Smith 406c139c21fSBarry Smith Level: advanced 407c139c21fSBarry Smith 40821532e8aSBarry Smith .seealso: `PetscObject` 409c139c21fSBarry Smith @*/ 410d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectsGetObject(const char *name, PetscObject *obj, char **classname) 411d71ae5a4SJacob Faibussowitsch { 412c139c21fSBarry Smith PetscInt i; 413c139c21fSBarry Smith PetscObject h; 414c139c21fSBarry Smith PetscBool flg; 415c139c21fSBarry Smith 416c139c21fSBarry Smith PetscFunctionBegin; 4174f572ea9SToby Isaac PetscAssertPointer(name, 1); 4184f572ea9SToby Isaac PetscAssertPointer(obj, 2); 4190298fd71SBarry Smith *obj = NULL; 420c139c21fSBarry Smith for (i = 0; i < PetscObjectsMaxCounts; i++) { 421c139c21fSBarry Smith if ((h = PetscObjects[i])) { 4229566063dSJacob Faibussowitsch PetscCall(PetscObjectName(h)); 4239566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(h->name, name, &flg)); 424c139c21fSBarry Smith if (flg) { 425c139c21fSBarry Smith *obj = h; 426c139c21fSBarry Smith if (classname) *classname = h->class_name; 4273ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 428c139c21fSBarry Smith } 429c139c21fSBarry Smith } 430c139c21fSBarry Smith } 4313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 432c139c21fSBarry Smith } 4334097062eSBarry Smith #endif 434c139c21fSBarry Smith 4352d747510SLisandro Dalcin /*@ 436811af0c4SBarry Smith PetscObjectSetPrintedOptions - indicate to an object that it should behave as if it has already printed the help for its options so it will not display the help message 4372d747510SLisandro Dalcin 43820f4b53cSBarry Smith Input Parameter: 439811af0c4SBarry Smith . obj - the `PetscObject` 4402d747510SLisandro Dalcin 4412d747510SLisandro Dalcin Level: developer 4422d747510SLisandro Dalcin 443aec76313SJacob Faibussowitsch Developer Notes: 44438eedad8SBarry Smith This is used, for example to prevent sequential objects that are created from a parallel object; such as the `KSP` created by 44538eedad8SBarry Smith `PCBJACOBI` from all printing the same help messages to the screen 4462d747510SLisandro Dalcin 44721532e8aSBarry Smith .seealso: `PetscOptionsInsert()`, `PetscObject` 4482d747510SLisandro Dalcin @*/ 449d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSetPrintedOptions(PetscObject obj) 450d71ae5a4SJacob Faibussowitsch { 4512d747510SLisandro Dalcin PetscFunctionBegin; 4524f572ea9SToby Isaac PetscAssertPointer(obj, 1); 4532d747510SLisandro Dalcin obj->optionsprinted = PETSC_TRUE; 4543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4552d747510SLisandro Dalcin } 4562d747510SLisandro Dalcin 4572d747510SLisandro Dalcin /*@ 4582d747510SLisandro Dalcin PetscObjectInheritPrintedOptions - If the child object is not on the rank 0 process of the parent object and the child is sequential then the child gets it set. 4592d747510SLisandro Dalcin 4602d747510SLisandro Dalcin Input Parameters: 4612d747510SLisandro Dalcin + pobj - the parent object 46221532e8aSBarry Smith - obj - the `PetscObject` 4632d747510SLisandro Dalcin 4642d747510SLisandro Dalcin Level: developer 4652d747510SLisandro Dalcin 4662d747510SLisandro Dalcin Developer Notes: 46738eedad8SBarry Smith This is used, for example to prevent sequential objects that are created from a parallel object; such as the `KSP` created by 46838eedad8SBarry Smith `PCBJACOBI` from all printing the same help messages to the screen 4692d747510SLisandro Dalcin 47038eedad8SBarry Smith This will not handle more complicated situations like with `PCGASM` where children may live on any subset of the parent's processes and overlap 4712d747510SLisandro Dalcin 47221532e8aSBarry Smith .seealso: `PetscOptionsInsert()`, `PetscObjectSetPrintedOptions()`, `PetscObject` 4732d747510SLisandro Dalcin @*/ 474d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectInheritPrintedOptions(PetscObject pobj, PetscObject obj) 475d71ae5a4SJacob Faibussowitsch { 4762d747510SLisandro Dalcin PetscMPIInt prank, size; 4772d747510SLisandro Dalcin 4782d747510SLisandro Dalcin PetscFunctionBegin; 4795f80ce2aSJacob Faibussowitsch PetscValidHeader(pobj, 1); 4805f80ce2aSJacob Faibussowitsch PetscValidHeader(obj, 2); 4819566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(pobj->comm, &prank)); 4829566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(obj->comm, &size)); 4832d747510SLisandro Dalcin if (size == 1 && prank > 0) obj->optionsprinted = PETSC_TRUE; 4843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4852d747510SLisandro Dalcin } 4862d747510SLisandro Dalcin 487af272810SBarry Smith /*@C 48821532e8aSBarry Smith PetscObjectAddOptionsHandler - Adds an additional function to check for options when `XXXSetFromOptions()` is called. 489af272810SBarry Smith 490af272810SBarry Smith Not Collective 491af272810SBarry Smith 492d8d19677SJose E. Roman Input Parameters: 493af272810SBarry Smith + obj - the PETSc object 494af272810SBarry Smith . handle - function that checks for options 495af272810SBarry Smith . destroy - function to destroy context if provided 496af272810SBarry Smith - ctx - optional context for check function 497af272810SBarry Smith 498af272810SBarry Smith Level: developer 499af272810SBarry Smith 50021532e8aSBarry Smith .seealso: `KSPSetFromOptions()`, `PCSetFromOptions()`, `SNESSetFromOptions()`, `PetscObjectProcessOptionsHandlers()`, `PetscObjectDestroyOptionsHandlers()`, 50121532e8aSBarry Smith `PetscObject` 502af272810SBarry Smith @*/ 503d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectAddOptionsHandler(PetscObject obj, PetscErrorCode (*handle)(PetscObject, PetscOptionItems *, void *), PetscErrorCode (*destroy)(PetscObject, void *), void *ctx) 504d71ae5a4SJacob Faibussowitsch { 505af272810SBarry Smith PetscFunctionBegin; 5060defdb15SJed Brown PetscValidHeader(obj, 1); 5075f80ce2aSJacob Faibussowitsch PetscCheck(obj->noptionhandler < PETSC_MAX_OPTIONS_HANDLER, obj->comm, PETSC_ERR_ARG_OUTOFRANGE, "To many options handlers added"); 508af272810SBarry Smith obj->optionhandler[obj->noptionhandler] = handle; 509af272810SBarry Smith obj->optiondestroy[obj->noptionhandler] = destroy; 510af272810SBarry Smith obj->optionctx[obj->noptionhandler++] = ctx; 5113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 512af272810SBarry Smith } 513af272810SBarry Smith 514af272810SBarry Smith /*@C 515db05f41bSBarry Smith PetscObjectProcessOptionsHandlers - Calls all the options handlers attached to an object 516af272810SBarry Smith 517af272810SBarry Smith Not Collective 518af272810SBarry Smith 5195cb80ecdSBarry Smith Input Parameters: 520dbbe0bcdSBarry Smith + obj - the PETSc object 521dbbe0bcdSBarry Smith - PetscOptionsObject - the options context 522af272810SBarry Smith 523af272810SBarry Smith Level: developer 524af272810SBarry Smith 52521532e8aSBarry Smith .seealso: `KSPSetFromOptions()`, `PCSetFromOptions()`, `SNESSetFromOptions()`, `PetscObjectAddOptionsHandler()`, `PetscObjectDestroyOptionsHandlers()`, 52621532e8aSBarry Smith `PetscObject` 527af272810SBarry Smith @*/ 528d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectProcessOptionsHandlers(PetscObject obj, PetscOptionItems *PetscOptionsObject) 529d71ae5a4SJacob Faibussowitsch { 530af272810SBarry Smith PetscFunctionBegin; 531dbbe0bcdSBarry Smith PetscValidHeader(obj, 1); 532dbbe0bcdSBarry Smith for (PetscInt i = 0; i < obj->noptionhandler; i++) PetscCall((*obj->optionhandler[i])(obj, PetscOptionsObject, obj->optionctx[i])); 5333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 534af272810SBarry Smith } 535af272810SBarry Smith 536af272810SBarry Smith /*@C 5375878ec2dSJed Brown PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an object 538af272810SBarry Smith 539af272810SBarry Smith Not Collective 540af272810SBarry Smith 541af272810SBarry Smith Input Parameter: 542af272810SBarry Smith . obj - the PETSc object 543af272810SBarry Smith 544af272810SBarry Smith Level: developer 545af272810SBarry Smith 54621532e8aSBarry Smith .seealso: `KSPSetFromOptions()`, `PCSetFromOptions()`, `SNESSetFromOptions()`, `PetscObjectAddOptionsHandler()`, `PetscObjectProcessOptionsHandlers()`, 54721532e8aSBarry Smith `PetscObject` 548af272810SBarry Smith @*/ 549d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectDestroyOptionsHandlers(PetscObject obj) 550d71ae5a4SJacob Faibussowitsch { 551af272810SBarry Smith PetscFunctionBegin; 5520defdb15SJed Brown PetscValidHeader(obj, 1); 5535f80ce2aSJacob Faibussowitsch for (PetscInt i = 0; i < obj->noptionhandler; i++) { 5549566063dSJacob Faibussowitsch if (obj->optiondestroy[i]) PetscCall((*obj->optiondestroy[i])(obj, obj->optionctx[i])); 5556d87326dSLisandro Dalcin } 556af272810SBarry Smith obj->noptionhandler = 0; 5573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 558af272810SBarry Smith } 559af272810SBarry Smith 560260663b8SBarry Smith /*@C 56138eedad8SBarry Smith PetscObjectReference - Indicates to any `PetscObject` that it is being 56238eedad8SBarry Smith referenced by another `PetscObject`. This increases the reference 563e5c89e4eSSatish Balay count for that object by one. 564e5c89e4eSSatish Balay 565c3339decSBarry Smith Logically Collective 566e5c89e4eSSatish Balay 567e5c89e4eSSatish Balay Input Parameter: 568811af0c4SBarry Smith . obj - the PETSc object. This must be cast with (`PetscObject`), for example, 569811af0c4SBarry Smith `PetscObjectReference`((`PetscObject`)mat); 570e5c89e4eSSatish Balay 571e5c89e4eSSatish Balay Level: advanced 572e5c89e4eSSatish Balay 57321532e8aSBarry Smith .seealso: `PetscObjectCompose()`, `PetscObjectDereference()`, `PetscObject` 574afc39838SBarry Smith @*/ 575d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectReference(PetscObject obj) 576d71ae5a4SJacob Faibussowitsch { 577e5c89e4eSSatish Balay PetscFunctionBegin; 5783ba16761SJacob Faibussowitsch if (!obj) PetscFunctionReturn(PETSC_SUCCESS); 579e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 580e5c89e4eSSatish Balay obj->refct++; 5813ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 582e5c89e4eSSatish Balay } 583e5c89e4eSSatish Balay 584260663b8SBarry Smith /*@C 585e5c89e4eSSatish Balay PetscObjectGetReference - Gets the current reference count for 586e5c89e4eSSatish Balay any PETSc object. 587e5c89e4eSSatish Balay 588e5c89e4eSSatish Balay Not Collective 589e5c89e4eSSatish Balay 590e5c89e4eSSatish Balay Input Parameter: 591811af0c4SBarry Smith . obj - the PETSc object; this must be cast with (`PetscObject`), for example, 592811af0c4SBarry Smith `PetscObjectGetReference`((`PetscObject`)mat,&cnt); 593e5c89e4eSSatish Balay 594e5c89e4eSSatish Balay Output Parameter: 595e5c89e4eSSatish Balay . cnt - the reference count 596e5c89e4eSSatish Balay 597e5c89e4eSSatish Balay Level: advanced 598e5c89e4eSSatish Balay 59921532e8aSBarry Smith .seealso: `PetscObjectCompose()`, `PetscObjectDereference()`, `PetscObjectReference()`, `PetscObject` 600afc39838SBarry Smith @*/ 601d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectGetReference(PetscObject obj, PetscInt *cnt) 602d71ae5a4SJacob Faibussowitsch { 603e5c89e4eSSatish Balay PetscFunctionBegin; 604e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 6054f572ea9SToby Isaac PetscAssertPointer(cnt, 2); 606e5c89e4eSSatish Balay *cnt = obj->refct; 6073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 608e5c89e4eSSatish Balay } 609e5c89e4eSSatish Balay 610260663b8SBarry Smith /*@C 61138eedad8SBarry Smith PetscObjectDereference - Indicates to any `PetscObject` that it is being 61238eedad8SBarry Smith referenced by one less `PetscObject`. This decreases the reference 613e5c89e4eSSatish Balay count for that object by one. 614e5c89e4eSSatish Balay 615811af0c4SBarry Smith Collective on obj if reference reaches 0 otherwise Logically Collective 616e5c89e4eSSatish Balay 617e5c89e4eSSatish Balay Input Parameter: 618811af0c4SBarry Smith . obj - the PETSc object; this must be cast with (`PetscObject`), for example, 619811af0c4SBarry Smith `PetscObjectDereference`((`PetscObject`)mat); 620e5c89e4eSSatish Balay 62120f4b53cSBarry Smith Level: advanced 62220f4b53cSBarry Smith 623811af0c4SBarry Smith Note: 62438eedad8SBarry Smith `PetscObjectDestroy()` sets the obj pointer to null after the call, this routine does not. 6256bf464f9SBarry Smith 62621532e8aSBarry Smith .seealso: `PetscObjectCompose()`, `PetscObjectReference()`, `PetscObjectDestroy()`, `PetscObject` 627afc39838SBarry Smith @*/ 628d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectDereference(PetscObject obj) 629d71ae5a4SJacob Faibussowitsch { 630e5c89e4eSSatish Balay PetscFunctionBegin; 6313ba16761SJacob Faibussowitsch if (!obj) PetscFunctionReturn(PETSC_SUCCESS); 632e5c89e4eSSatish Balay PetscValidHeader(obj, 1); 6339566063dSJacob Faibussowitsch if (obj->bops->destroy) PetscCall((*obj->bops->destroy)(&obj)); 6345f80ce2aSJacob Faibussowitsch else PetscCheck(--(obj->refct), PETSC_COMM_SELF, PETSC_ERR_SUP, "This PETSc object does not have a generic destroy routine"); 6353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 636e5c89e4eSSatish Balay } 637e5c89e4eSSatish Balay 638e5c89e4eSSatish Balay /* 639e5c89e4eSSatish Balay The following routines are the versions private to the PETSc object 640e5c89e4eSSatish Balay data structures. 641e5c89e4eSSatish Balay */ 642d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectRemoveReference(PetscObject obj, const char name[]) 643d71ae5a4SJacob Faibussowitsch { 6446ba4bc90SBarry Smith PetscFunctionBegin; 6450defdb15SJed Brown PetscValidHeader(obj, 1); 6469566063dSJacob Faibussowitsch PetscCall(PetscObjectListRemoveReference(&obj->olist, name)); 6473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6486ba4bc90SBarry Smith } 6496ba4bc90SBarry Smith 650e5c89e4eSSatish Balay /*@C 651e5c89e4eSSatish Balay PetscObjectCompose - Associates another PETSc object with a given PETSc object. 652e5c89e4eSSatish Balay 653e5c89e4eSSatish Balay Not Collective 654e5c89e4eSSatish Balay 655e5c89e4eSSatish Balay Input Parameters: 656811af0c4SBarry Smith + obj - the PETSc object; this must be cast with (`PetscObject`), for example, 657811af0c4SBarry Smith `PetscObjectCompose`((`PetscObject`)mat,...); 658e5c89e4eSSatish Balay . name - name associated with the child object 659e5c89e4eSSatish Balay - ptr - the other PETSc object to associate with the PETSc object; this must also be 660811af0c4SBarry Smith cast with (`PetscObject`) 661e5c89e4eSSatish Balay 662e5c89e4eSSatish Balay Level: advanced 663e5c89e4eSSatish Balay 664e5c89e4eSSatish Balay Notes: 665e5c89e4eSSatish Balay The second objects reference count is automatically increased by one when it is 666e5c89e4eSSatish Balay composed. 667e5c89e4eSSatish Balay 668e5c89e4eSSatish Balay Replaces any previous object that had the same name. 669e5c89e4eSSatish Balay 670e5c89e4eSSatish Balay If ptr is null and name has previously been composed using an object, then that 671e5c89e4eSSatish Balay entry is removed from the obj. 672e5c89e4eSSatish Balay 67338eedad8SBarry Smith `PetscObjectCompose()` can be used with any PETSc object (such as 67438eedad8SBarry Smith `Mat`, `Vec`, `KSP`, `SNES`, etc.) or any user-provided object. 675e5c89e4eSSatish Balay 67638eedad8SBarry Smith `PetscContainerCreate()` can be used to create an object from a 67738eedad8SBarry Smith user-provided pointer that may then be composed with PETSc objects using `PetscObjectCompose()` 67838eedad8SBarry Smith 67938eedad8SBarry Smith .seealso: `PetscObjectQuery()`, `PetscContainerCreate()`, `PetscObjectComposeFunction()`, `PetscObjectQueryFunction()`, `PetscContainer`, 68021532e8aSBarry Smith `PetscContainerSetPointer()`, `PetscObject` 681e5c89e4eSSatish Balay @*/ 682d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectCompose(PetscObject obj, const char name[], PetscObject ptr) 683d71ae5a4SJacob Faibussowitsch { 684e5c89e4eSSatish Balay PetscFunctionBegin; 6853cfa8680SLisandro Dalcin PetscValidHeader(obj, 1); 6864f572ea9SToby Isaac PetscAssertPointer(name, 2); 6873cfa8680SLisandro Dalcin if (ptr) PetscValidHeader(ptr, 3); 6885f80ce2aSJacob Faibussowitsch PetscCheck(obj != ptr, PetscObjectComm((PetscObject)obj), PETSC_ERR_SUP, "Cannot compose object with itself"); 68946ba2dfcSBarry Smith if (ptr) { 69046ba2dfcSBarry Smith char *tname; 69146ba2dfcSBarry Smith PetscBool skipreference; 69246ba2dfcSBarry Smith 69346ba2dfcSBarry Smith PetscCall(PetscObjectListReverseFind(ptr->olist, obj, &tname, &skipreference)); 69446ba2dfcSBarry Smith if (tname) PetscCheck(skipreference, PETSC_COMM_SELF, PETSC_ERR_ARG_INCOMP, "An object cannot be composed with an object that was composed with it"); 69546ba2dfcSBarry Smith } 69646ba2dfcSBarry Smith PetscCall(PetscObjectListAdd(&obj->olist, name, ptr)); 6973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 698e5c89e4eSSatish Balay } 699e5c89e4eSSatish Balay 70058b60935SBarry Smith /*@C 70138eedad8SBarry Smith PetscObjectQuery - Gets a PETSc object associated with a given object that was composed with `PetscObjectCompose()` 702e5c89e4eSSatish Balay 703e5c89e4eSSatish Balay Not Collective 704e5c89e4eSSatish Balay 705e5c89e4eSSatish Balay Input Parameters: 706e5c89e4eSSatish Balay + obj - the PETSc object 707811af0c4SBarry Smith Thus must be cast with a (`PetscObject`), for example, 708811af0c4SBarry Smith `PetscObjectCompose`((`PetscObject`)mat,...); 709e5c89e4eSSatish Balay . name - name associated with child object 7103c0c59f3SBarry Smith - ptr - the other PETSc object associated with the PETSc object, this must be 711811af0c4SBarry Smith cast with (`PetscObject`*) 712e5c89e4eSSatish Balay 713e5c89e4eSSatish Balay Level: advanced 714e5c89e4eSSatish Balay 71538eedad8SBarry Smith Note: 7163c0c59f3SBarry Smith The reference count of neither object is increased in this call 7173c0c59f3SBarry Smith 71838eedad8SBarry Smith .seealso: `PetscObjectCompose()`, `PetscObjectComposeFunction()`, `PetscObjectQueryFunction()`, `PetscContainer` 71921532e8aSBarry Smith `PetscContainerGetPointer()`, `PetscObject` 720e5c89e4eSSatish Balay @*/ 721d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectQuery(PetscObject obj, const char name[], PetscObject *ptr) 722d71ae5a4SJacob Faibussowitsch { 723e5c89e4eSSatish Balay PetscFunctionBegin; 7243cfa8680SLisandro Dalcin PetscValidHeader(obj, 1); 7254f572ea9SToby Isaac PetscAssertPointer(name, 2); 7264f572ea9SToby Isaac PetscAssertPointer(ptr, 3); 72746ba2dfcSBarry Smith PetscCall(PetscObjectListFind(obj->olist, name, ptr)); 7283ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 729e5c89e4eSSatish Balay } 730e5c89e4eSSatish Balay 7311c84c290SBarry Smith /*MC 7321c84c290SBarry Smith PetscObjectComposeFunction - Associates a function with a given PETSc object. 7331c84c290SBarry Smith 7341c84c290SBarry Smith Synopsis: 735aaa7dc30SBarry Smith #include <petscsys.h> 7360b062f91SJed Brown PetscErrorCode PetscObjectComposeFunction(PetscObject obj, const char name[], void (*fptr)(void)) 7371c84c290SBarry Smith 738c3339decSBarry Smith Logically Collective 7391c84c290SBarry Smith 7401c84c290SBarry Smith Input Parameters: 741811af0c4SBarry Smith + obj - the PETSc object; this must be cast with a (`PetscObject`), for example, 742811af0c4SBarry Smith `PetscObjectCompose`((`PetscObject`)mat,...); 7431c84c290SBarry Smith . name - name associated with the child function 7440b062f91SJed Brown - fptr - function pointer 7451c84c290SBarry Smith 7461c84c290SBarry Smith Level: advanced 7471c84c290SBarry Smith 7481c84c290SBarry Smith Notes: 749405d7811SJacob Faibussowitsch When the first argument of `fptr` is (or is derived from) a `PetscObject` then `PetscTryMethod()` and `PetscUseMethod()` 750296d8154SBarry Smith can be used to call the function directly with error checking. 751296d8154SBarry Smith 752405d7811SJacob Faibussowitsch To remove a registered routine, pass in `NULL` for `fptr`. 7531c84c290SBarry Smith 754405d7811SJacob Faibussowitsch `PetscObjectComposeFunction()` can be used with any PETSc object (such as 75538eedad8SBarry Smith `Mat`, `Vec`, `KSP`, `SNES`, etc.) or any user-provided object. 7561c84c290SBarry Smith 75775bc957bSAidan Hamilton `PetscUseTypeMethod()` and `PetscTryTypeMethod()` are used to call a function that is stored in the objects `obj->ops` table. 758296d8154SBarry Smith 759296d8154SBarry Smith .seealso: `PetscObjectQueryFunction()`, `PetscContainerCreate()` `PetscObjectCompose()`, `PetscObjectQuery()`, `PetscTryMethod()`, `PetscUseMethod()`, 76021532e8aSBarry Smith `PetscUseTypeMethod()`, `PetscTryTypeMethod()`, `PetscObject` 7611c84c290SBarry Smith M*/ 762d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposeFunction_Private(PetscObject obj, const char name[], void (*fptr)(void)) 763d71ae5a4SJacob Faibussowitsch { 764e5c89e4eSSatish Balay PetscFunctionBegin; 7653cfa8680SLisandro Dalcin PetscValidHeader(obj, 1); 7664f572ea9SToby Isaac PetscAssertPointer(name, 2); 76746ba2dfcSBarry Smith PetscCall(PetscFunctionListAdd(&obj->qlist, name, fptr)); 7683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 769e5c89e4eSSatish Balay } 770e5c89e4eSSatish Balay 7710005d66cSJed Brown /*MC 772e5c89e4eSSatish Balay PetscObjectQueryFunction - Gets a function associated with a given object. 773e5c89e4eSSatish Balay 7740005d66cSJed Brown Synopsis: 775aaa7dc30SBarry Smith #include <petscsys.h> 7760005d66cSJed Brown PetscErrorCode PetscObjectQueryFunction(PetscObject obj, const char name[], void (**fptr)(void)) 7770005d66cSJed Brown 778c3339decSBarry Smith Logically Collective 779e5c89e4eSSatish Balay 780e5c89e4eSSatish Balay Input Parameters: 781811af0c4SBarry Smith + obj - the PETSc object; this must be cast with (`PetscObject`), for example, 782811af0c4SBarry Smith `PetscObjectQueryFunction`((`PetscObject`)ksp,...); 783e5c89e4eSSatish Balay - name - name associated with the child function 784e5c89e4eSSatish Balay 785e5c89e4eSSatish Balay Output Parameter: 7860005d66cSJed Brown . fptr - function pointer 787e5c89e4eSSatish Balay 788e5c89e4eSSatish Balay Level: advanced 789e5c89e4eSSatish Balay 79021532e8aSBarry Smith .seealso: `PetscObjectComposeFunction()`, `PetscFunctionListFind()`, `PetscObjectCompose()`, `PetscObjectQuery()`, `PetscObject` 7910005d66cSJed Brown M*/ 79210450e9eSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscObjectQueryFunction_Private(PetscObject obj, const char name[], void (**fptr)(void)) 793d71ae5a4SJacob Faibussowitsch { 794e5c89e4eSSatish Balay PetscFunctionBegin; 7953cfa8680SLisandro Dalcin PetscValidHeader(obj, 1); 7964f572ea9SToby Isaac PetscAssertPointer(name, 2); 79710450e9eSJacob Faibussowitsch PetscCall(PetscFunctionListFind(obj->qlist, name, fptr)); 7983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 799e5c89e4eSSatish Balay } 800e5c89e4eSSatish Balay 801776b82aeSLisandro Dalcin struct _p_PetscContainer { 802e5c89e4eSSatish Balay PETSCHEADER(int); 803e5c89e4eSSatish Balay void *ptr; 804e5c89e4eSSatish Balay PetscErrorCode (*userdestroy)(void *); 805e5c89e4eSSatish Balay }; 806e5c89e4eSSatish Balay 807e5c89e4eSSatish Balay /*@C 80838eedad8SBarry Smith PetscContainerUserDestroyDefault - Default destroy routine for user-provided data that simply calls `PetscFree()` in the data 80938eedad8SBarry Smith provided with `PetscContainerSetPointer()` 810b61ba218SStefano Zampini 811811af0c4SBarry Smith Logically Collective on the `PetscContainer` containing the user data 812b61ba218SStefano Zampini 813b61ba218SStefano Zampini Input Parameter: 814b61ba218SStefano Zampini . ctx - pointer to user-provided data 815b61ba218SStefano Zampini 816b61ba218SStefano Zampini Level: advanced 817b61ba218SStefano Zampini 818aec76313SJacob Faibussowitsch .seealso: `PetscContainerDestroy()`, `PetscContainerSetUserDestroy()`, `PetscObject` 819b61ba218SStefano Zampini @*/ 820d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscContainerUserDestroyDefault(void *ctx) 821d71ae5a4SJacob Faibussowitsch { 822b61ba218SStefano Zampini PetscFunctionBegin; 8239566063dSJacob Faibussowitsch PetscCall(PetscFree(ctx)); 8243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 825b61ba218SStefano Zampini } 826b61ba218SStefano Zampini 827b61ba218SStefano Zampini /*@C 82838eedad8SBarry Smith PetscContainerGetPointer - Gets the pointer value contained in the container that was provided with `PetscContainerSetPointer()` 829e5c89e4eSSatish Balay 8303f9fe445SBarry Smith Not Collective 831e5c89e4eSSatish Balay 832e5c89e4eSSatish Balay Input Parameter: 83338eedad8SBarry Smith . obj - the object created with `PetscContainerCreate()` 834e5c89e4eSSatish Balay 835e5c89e4eSSatish Balay Output Parameter: 836e5c89e4eSSatish Balay . ptr - the pointer value 837e5c89e4eSSatish Balay 838e5c89e4eSSatish Balay Level: advanced 839e5c89e4eSSatish Balay 84021532e8aSBarry Smith .seealso: `PetscContainerCreate()`, `PetscContainerDestroy()`, `PetscObject`, 841db781477SPatrick Sanan `PetscContainerSetPointer()` 842e5c89e4eSSatish Balay @*/ 843d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscContainerGetPointer(PetscContainer obj, void **ptr) 844d71ae5a4SJacob Faibussowitsch { 845e5c89e4eSSatish Balay PetscFunctionBegin; 8460700a824SBarry Smith PetscValidHeaderSpecific(obj, PETSC_CONTAINER_CLASSID, 1); 8474f572ea9SToby Isaac PetscAssertPointer(ptr, 2); 848e5c89e4eSSatish Balay *ptr = obj->ptr; 8493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 850e5c89e4eSSatish Balay } 851e5c89e4eSSatish Balay 852e5c89e4eSSatish Balay /*@C 853776b82aeSLisandro Dalcin PetscContainerSetPointer - Sets the pointer value contained in the container. 854e5c89e4eSSatish Balay 855c3339decSBarry Smith Logically Collective 856e5c89e4eSSatish Balay 857e5c89e4eSSatish Balay Input Parameters: 85838eedad8SBarry Smith + obj - the object created with `PetscContainerCreate()` 859e5c89e4eSSatish Balay - ptr - the pointer value 860e5c89e4eSSatish Balay 861e5c89e4eSSatish Balay Level: advanced 862e5c89e4eSSatish Balay 86321532e8aSBarry Smith .seealso: `PetscContainerCreate()`, `PetscContainerDestroy()`, `PetscObjectCompose()`, `PetscObjectQuery()`, `PetscObject`, 864db781477SPatrick Sanan `PetscContainerGetPointer()` 865e5c89e4eSSatish Balay @*/ 866d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscContainerSetPointer(PetscContainer obj, void *ptr) 867d71ae5a4SJacob Faibussowitsch { 868e5c89e4eSSatish Balay PetscFunctionBegin; 8690700a824SBarry Smith PetscValidHeaderSpecific(obj, PETSC_CONTAINER_CLASSID, 1); 8704f572ea9SToby Isaac if (ptr) PetscAssertPointer(ptr, 2); 871e5c89e4eSSatish Balay obj->ptr = ptr; 8723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 873e5c89e4eSSatish Balay } 874e5c89e4eSSatish Balay 875e5c89e4eSSatish Balay /*@C 876776b82aeSLisandro Dalcin PetscContainerDestroy - Destroys a PETSc container object. 877e5c89e4eSSatish Balay 878c3339decSBarry Smith Collective 879e5c89e4eSSatish Balay 880e5c89e4eSSatish Balay Input Parameter: 88138eedad8SBarry Smith . obj - an object that was created with `PetscContainerCreate()` 882e5c89e4eSSatish Balay 883e5c89e4eSSatish Balay Level: advanced 884e5c89e4eSSatish Balay 885811af0c4SBarry Smith Note: 88638eedad8SBarry Smith If `PetscContainerSetUserDestroy()` was used to provide a user destroy object for the data provided with `PetscContainerSetPointer()` 88738eedad8SBarry Smith then that function is called to destroy the data. 88838eedad8SBarry Smith 88921532e8aSBarry Smith .seealso: `PetscContainerCreate()`, `PetscContainerSetUserDestroy()`, `PetscObject` 890e5c89e4eSSatish Balay @*/ 891d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscContainerDestroy(PetscContainer *obj) 892d71ae5a4SJacob Faibussowitsch { 893e5c89e4eSSatish Balay PetscFunctionBegin; 8943ba16761SJacob Faibussowitsch if (!*obj) PetscFunctionReturn(PETSC_SUCCESS); 8956bf464f9SBarry Smith PetscValidHeaderSpecific(*obj, PETSC_CONTAINER_CLASSID, 1); 8969371c9d4SSatish Balay if (--((PetscObject)(*obj))->refct > 0) { 8979371c9d4SSatish Balay *obj = NULL; 8983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8999371c9d4SSatish Balay } 9009566063dSJacob Faibussowitsch if ((*obj)->userdestroy) PetscCall((*(*obj)->userdestroy)((*obj)->ptr)); 9019566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(obj)); 9023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 903e5c89e4eSSatish Balay } 904e5c89e4eSSatish Balay 905e5c89e4eSSatish Balay /*@C 90638eedad8SBarry Smith PetscContainerSetUserDestroy - Sets name of the user destroy function for the data provided to the `PetscContainer` with `PetscContainerSetPointer()` 907e5c89e4eSSatish Balay 908c3339decSBarry Smith Logically Collective 909e5c89e4eSSatish Balay 910d8d19677SJose E. Roman Input Parameters: 91138eedad8SBarry Smith + obj - an object that was created with `PetscContainerCreate()` 912e5c89e4eSSatish Balay - des - name of the user destroy function 913e5c89e4eSSatish Balay 91420f4b53cSBarry Smith Level: advanced 91520f4b53cSBarry Smith 916811af0c4SBarry Smith Note: 91738eedad8SBarry Smith Use `PetscContainerUserDestroyDefault()` if the memory was obtained by calling `PetscMalloc()` or one of its variants for single memory allocation. 918b61ba218SStefano Zampini 91921532e8aSBarry Smith .seealso: `PetscContainerDestroy()`, `PetscContainerUserDestroyDefault()`, `PetscMalloc()`, `PetscMalloc1()`, `PetscCalloc()`, `PetscCalloc1()`, `PetscObject` 920e5c89e4eSSatish Balay @*/ 921d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void *)) 922d71ae5a4SJacob Faibussowitsch { 923e5c89e4eSSatish Balay PetscFunctionBegin; 9240700a824SBarry Smith PetscValidHeaderSpecific(obj, PETSC_CONTAINER_CLASSID, 1); 925e5c89e4eSSatish Balay obj->userdestroy = des; 9263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 927e5c89e4eSSatish Balay } 928e5c89e4eSSatish Balay 9297087cfbeSBarry Smith PetscClassId PETSC_CONTAINER_CLASSID; 930e5c89e4eSSatish Balay 931e5c89e4eSSatish Balay /*@C 93210450e9eSJacob Faibussowitsch PetscContainerCreate - Creates a PETSc object that has room to hold a single pointer. 933e5c89e4eSSatish Balay 934d083f849SBarry Smith Collective 935e5c89e4eSSatish Balay 93620f4b53cSBarry Smith Input Parameter: 937e5c89e4eSSatish Balay . comm - MPI communicator that shares the object 938e5c89e4eSSatish Balay 93920f4b53cSBarry Smith Output Parameter: 940e5c89e4eSSatish Balay . container - the container created 941e5c89e4eSSatish Balay 942e5c89e4eSSatish Balay Level: advanced 943e5c89e4eSSatish Balay 94410450e9eSJacob Faibussowitsch Notes: 94510450e9eSJacob Faibussowitsch This allows one to attach any type of data (accessible through a pointer) with the 94610450e9eSJacob Faibussowitsch `PetscObjectCompose()` function to a `PetscObject`. The data item itself is attached by a 94710450e9eSJacob Faibussowitsch call to `PetscContainerSetPointer()`. 94810450e9eSJacob Faibussowitsch 949db781477SPatrick Sanan .seealso: `PetscContainerDestroy()`, `PetscContainerSetPointer()`, `PetscContainerGetPointer()`, `PetscObjectCompose()`, `PetscObjectQuery()`, 95021532e8aSBarry Smith `PetscContainerSetUserDestroy()`, `PetscObject` 951e5c89e4eSSatish Balay @*/ 952d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscContainerCreate(MPI_Comm comm, PetscContainer *container) 953d71ae5a4SJacob Faibussowitsch { 954e5c89e4eSSatish Balay PetscFunctionBegin; 9554f572ea9SToby Isaac PetscAssertPointer(container, 2); 9569566063dSJacob Faibussowitsch PetscCall(PetscSysInitializePackage()); 9579566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(*container, PETSC_CONTAINER_CLASSID, "PetscContainer", "Container", "Sys", comm, PetscContainerDestroy, NULL)); 9583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 959e5c89e4eSSatish Balay } 960e5c89e4eSSatish Balay 961e5c89e4eSSatish Balay /*@ 962e5c89e4eSSatish Balay PetscObjectSetFromOptions - Sets generic parameters from user options. 963e5c89e4eSSatish Balay 964c3339decSBarry Smith Collective 965e5c89e4eSSatish Balay 966e5c89e4eSSatish Balay Input Parameter: 96738eedad8SBarry Smith . obj - the `PetscObject` 968e5c89e4eSSatish Balay 96920f4b53cSBarry Smith Level: beginner 97020f4b53cSBarry Smith 971811af0c4SBarry Smith Note: 972e5c89e4eSSatish Balay We have no generic options at present, so this does nothing 973e5c89e4eSSatish Balay 97421532e8aSBarry Smith .seealso: `PetscObjectSetOptionsPrefix()`, `PetscObjectGetOptionsPrefix()`, `PetscObject` 975e5c89e4eSSatish Balay @*/ 976d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSetFromOptions(PetscObject obj) 977d71ae5a4SJacob Faibussowitsch { 978e5c89e4eSSatish Balay PetscFunctionBegin; 9793cfa8680SLisandro Dalcin PetscValidHeader(obj, 1); 9803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 981e5c89e4eSSatish Balay } 982e5c89e4eSSatish Balay 983e5c89e4eSSatish Balay /*@ 984e5c89e4eSSatish Balay PetscObjectSetUp - Sets up the internal data structures for the later use. 985e5c89e4eSSatish Balay 986c3339decSBarry Smith Collective 987e5c89e4eSSatish Balay 98820f4b53cSBarry Smith Input Parameter: 98938eedad8SBarry Smith . obj - the `PetscObject` 990e5c89e4eSSatish Balay 99120f4b53cSBarry Smith Level: advanced 99220f4b53cSBarry Smith 993811af0c4SBarry Smith Note: 994e5c89e4eSSatish Balay This does nothing at present. 995e5c89e4eSSatish Balay 99621532e8aSBarry Smith .seealso: `PetscObjectDestroy()`, `PetscObject` 997e5c89e4eSSatish Balay @*/ 998d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSetUp(PetscObject obj) 999d71ae5a4SJacob Faibussowitsch { 1000e5c89e4eSSatish Balay PetscFunctionBegin; 10013cfa8680SLisandro Dalcin PetscValidHeader(obj, 1); 10023ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1003e5c89e4eSSatish Balay } 1004