xref: /petsc/src/sys/objects/inherit.c (revision 2611ad710242b3c70d66651ef7e40f9450d305e2)
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