xref: /petsc/src/sys/objects/inherit.c (revision 665c2ded495bb9782a7454dcfef3abf1536c3670)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manipulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5afcb2eb5SJed Brown #include <petsc-private/petscimpl.h>  /*I   "petscsys.h"    I*/
6*665c2dedSJed Brown #include <petscviewer.h>
7e5c89e4eSSatish Balay 
82eff7a51SBarry Smith PetscObject *PetscObjects      = 0;
92eff7a51SBarry Smith PetscInt    PetscObjectsCounts = 0, PetscObjectsMaxCounts = 0;
102e82e6d1SBarry Smith 
1109573ac7SBarry Smith extern PetscErrorCode PetscObjectGetComm_Petsc(PetscObject,MPI_Comm*);
1209573ac7SBarry Smith extern PetscErrorCode PetscObjectCompose_Petsc(PetscObject,const char[],PetscObject);
1309573ac7SBarry Smith extern PetscErrorCode PetscObjectQuery_Petsc(PetscObject,const char[],PetscObject*);
1409573ac7SBarry Smith extern PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject,const char[],const char[],void (*)(void));
1509573ac7SBarry Smith extern PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject,const char[],void (**)(void));
16e5c89e4eSSatish Balay 
17e5c89e4eSSatish Balay #undef __FUNCT__
18e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderCreate_Private"
19e5c89e4eSSatish Balay /*
20e5c89e4eSSatish Balay    PetscHeaderCreate_Private - Creates a base PETSc object header and fills
21e5c89e4eSSatish Balay    in the default values.  Called by the macro PetscHeaderCreate().
22e5c89e4eSSatish Balay */
2367c2884eSBarry Smith PetscErrorCode  PetscHeaderCreate_Private(PetscObject h,PetscClassId classid,const char class_name[],const char descr[],const char mansec[],
243194b578SJed Brown                                           MPI_Comm comm,PetscErrorCode (*des)(PetscObject*),PetscErrorCode (*vie)(PetscObject,PetscViewer))
25e5c89e4eSSatish Balay {
26e5c89e4eSSatish Balay   static PetscInt idcnt = 1;
27e5c89e4eSSatish Balay   PetscErrorCode  ierr;
282e82e6d1SBarry Smith   PetscObject     *newPetscObjects;
292e82e6d1SBarry Smith   PetscInt         newPetscObjectsMaxCounts,i;
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay   PetscFunctionBegin;
320700a824SBarry Smith   h->classid               = classid;
3367c2884eSBarry Smith   h->type                  = 0;
34e5c89e4eSSatish Balay   h->class_name            = (char*)class_name;
353194b578SJed Brown   h->description           = (char*)descr;
363194b578SJed Brown   h->mansec                = (char*)mansec;
37e5c89e4eSSatish Balay   h->prefix                = 0;
38e5c89e4eSSatish Balay   h->refct                 = 1;
39e5c89e4eSSatish Balay   h->amem                  = -1;
40e5c89e4eSSatish Balay   h->id                    = idcnt++;
41e5c89e4eSSatish Balay   h->parentid              = 0;
42e5c89e4eSSatish Balay   h->qlist                 = 0;
43e5c89e4eSSatish Balay   h->olist                 = 0;
44d3229121SJed Brown   h->precision             = (PetscPrecision) sizeof(PetscReal);
45e5c89e4eSSatish Balay   h->bops->destroy         = des;
46e5c89e4eSSatish Balay   h->bops->view            = vie;
47e5c89e4eSSatish Balay   h->bops->getcomm         = PetscObjectGetComm_Petsc;
48e5c89e4eSSatish Balay   h->bops->compose         = PetscObjectCompose_Petsc;
49e5c89e4eSSatish Balay   h->bops->query           = PetscObjectQuery_Petsc;
50e5c89e4eSSatish Balay   h->bops->composefunction = PetscObjectComposeFunction_Petsc;
51e5c89e4eSSatish Balay   h->bops->queryfunction   = PetscObjectQueryFunction_Petsc;
52a297a907SKarl Rupp 
53e5c89e4eSSatish Balay   ierr = PetscCommDuplicate(comm,&h->comm,&h->tag);CHKERRQ(ierr);
542e82e6d1SBarry Smith 
552e82e6d1SBarry Smith   /* Keep a record of object created */
562e82e6d1SBarry Smith   PetscObjectsCounts++;
572e82e6d1SBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
582e82e6d1SBarry Smith     if (!PetscObjects[i]) {
592e82e6d1SBarry Smith       PetscObjects[i] = h;
602e82e6d1SBarry Smith       PetscFunctionReturn(0);
612e82e6d1SBarry Smith     }
622e82e6d1SBarry Smith   }
632e82e6d1SBarry Smith   /* Need to increase the space for storing PETSc objects */
642e82e6d1SBarry Smith   if (!PetscObjectsMaxCounts) newPetscObjectsMaxCounts = 100;
652e82e6d1SBarry Smith   else                        newPetscObjectsMaxCounts = 2*PetscObjectsMaxCounts;
662e82e6d1SBarry Smith   ierr = PetscMalloc(newPetscObjectsMaxCounts*sizeof(PetscObject),&newPetscObjects);CHKERRQ(ierr);
672eff7a51SBarry Smith   ierr = PetscMemcpy(newPetscObjects,PetscObjects,PetscObjectsMaxCounts*sizeof(PetscObject));CHKERRQ(ierr);
682e82e6d1SBarry Smith   ierr = PetscMemzero(newPetscObjects+PetscObjectsMaxCounts,(newPetscObjectsMaxCounts - PetscObjectsMaxCounts)*sizeof(PetscObject));CHKERRQ(ierr);
692e82e6d1SBarry Smith   ierr = PetscFree(PetscObjects);CHKERRQ(ierr);
70a297a907SKarl Rupp 
712e82e6d1SBarry Smith   PetscObjects                        = newPetscObjects;
722e82e6d1SBarry Smith   PetscObjects[PetscObjectsMaxCounts] = h;
732e82e6d1SBarry Smith   PetscObjectsMaxCounts               = newPetscObjectsMaxCounts;
74e5c89e4eSSatish Balay   PetscFunctionReturn(0);
75e5c89e4eSSatish Balay }
76e5c89e4eSSatish Balay 
77ace3abfcSBarry Smith extern PetscBool      PetscMemoryCollectMaximumUsage;
78e5c89e4eSSatish Balay extern PetscLogDouble PetscMemoryMaximumUsage;
79e5c89e4eSSatish Balay 
80e5c89e4eSSatish Balay #undef __FUNCT__
81e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderDestroy_Private"
82e5c89e4eSSatish Balay /*
83e5c89e4eSSatish Balay     PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by
84e5c89e4eSSatish Balay     the macro PetscHeaderDestroy().
85e5c89e4eSSatish Balay */
867087cfbeSBarry Smith PetscErrorCode  PetscHeaderDestroy_Private(PetscObject h)
87e5c89e4eSSatish Balay {
88e5c89e4eSSatish Balay   PetscErrorCode ierr;
892e82e6d1SBarry Smith   PetscInt       i;
90e5c89e4eSSatish Balay 
91e5c89e4eSSatish Balay   PetscFunctionBegin;
920defdb15SJed Brown   PetscValidHeader(h,1);
9317a064c4SBarry Smith   ierr = PetscLogObjectDestroy(h);CHKERRQ(ierr);
9417a064c4SBarry Smith   ierr = PetscComposedQuantitiesDestroy(h);
9592e62aa6SBarry Smith #if defined(PETSC_HAVE_AMS)
969fb22e1aSBarry Smith   if (PetscAMSPublishAll) {
97c457296dSBarry Smith     ierr = PetscObjectUnPublish((PetscObject)h);CHKERRQ(ierr);
9869590be7SBarry Smith   }
9992e62aa6SBarry Smith #endif
100e5c89e4eSSatish Balay   if (PetscMemoryCollectMaximumUsage) {
101e5c89e4eSSatish Balay     PetscLogDouble usage;
102e5c89e4eSSatish Balay     ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr);
103e5c89e4eSSatish Balay     if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage;
104e5c89e4eSSatish Balay   }
10508a557f7SLisandro Dalcin   /* first destroy things that could execute arbitrary code */
10608a557f7SLisandro Dalcin   if (h->python_destroy) {
10708a557f7SLisandro Dalcin     void           *python_context = h->python_context;
10808a557f7SLisandro Dalcin     PetscErrorCode (*python_destroy)(void*) = h->python_destroy;
10908a557f7SLisandro Dalcin     h->python_context = 0;
11008a557f7SLisandro Dalcin     h->python_destroy = 0;
111a297a907SKarl Rupp 
11208a557f7SLisandro Dalcin     ierr = (*python_destroy)(python_context);CHKERRQ(ierr);
11308a557f7SLisandro Dalcin   }
114140e18c1SBarry Smith   ierr = PetscObjectListDestroy(&h->olist);CHKERRQ(ierr);
11508a557f7SLisandro Dalcin   ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr);
11608a557f7SLisandro Dalcin   /* next destroy other things */
1170700a824SBarry Smith   h->classid = PETSCFREEDHEADER;
118a297a907SKarl Rupp 
11908a557f7SLisandro Dalcin   ierr = PetscFree(h->bops);CHKERRQ(ierr);
120140e18c1SBarry Smith   ierr = PetscFunctionListDestroy(&h->qlist);CHKERRQ(ierr);
121503cfb0cSBarry Smith   ierr = PetscFree(h->type_name);CHKERRQ(ierr);
122503cfb0cSBarry Smith   ierr = PetscFree(h->name);CHKERRQ(ierr);
123503cfb0cSBarry Smith   ierr = PetscFree(h->prefix);CHKERRQ(ierr);
124e5c89e4eSSatish Balay   ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr);
125f6291634SJed Brown   ierr = PetscFree(h->fortrancallback[PETSC_FORTRAN_CALLBACK_CLASS]);CHKERRQ(ierr);
126f6291634SJed Brown   ierr = PetscFree(h->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE]);CHKERRQ(ierr);
1272e82e6d1SBarry Smith 
1282e82e6d1SBarry Smith   /* Record object removal from list of all objects */
1292e82e6d1SBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
1302e82e6d1SBarry Smith     if (PetscObjects[i] == h) {
1312e82e6d1SBarry Smith       PetscObjects[i] = 0;
1322e82e6d1SBarry Smith       PetscObjectsCounts--;
1332e82e6d1SBarry Smith       break;
1342e82e6d1SBarry Smith     }
1352e82e6d1SBarry Smith   }
1362eff7a51SBarry Smith   if (!PetscObjectsCounts) {
1372e82e6d1SBarry Smith     ierr = PetscFree(PetscObjects);CHKERRQ(ierr);
1382e82e6d1SBarry Smith     PetscObjectsMaxCounts = 0;
1392e82e6d1SBarry Smith   }
140e5c89e4eSSatish Balay   PetscFunctionReturn(0);
141e5c89e4eSSatish Balay }
142e5c89e4eSSatish Balay 
143e5c89e4eSSatish Balay #undef __FUNCT__
1448cd211a4SJed Brown #define __FUNCT__ "PetscObjectCopyFortranFunctionPointers"
1458cd211a4SJed Brown /*@C
1468cd211a4SJed Brown    PetscObjectCopyFortranFunctionPointers - Copy function pointers to another object
1478cd211a4SJed Brown 
1488cd211a4SJed Brown    Logically Collective on PetscObject
1498cd211a4SJed Brown 
1508cd211a4SJed Brown    Input Parameter:
1518cd211a4SJed Brown +  src - source object
1528cd211a4SJed Brown -  dest - destination object
1538cd211a4SJed Brown 
1548cd211a4SJed Brown    Level: developer
1558cd211a4SJed Brown 
1568cd211a4SJed Brown    Note:
1578cd211a4SJed Brown    Both objects must have the same class.
1588cd211a4SJed Brown @*/
1598cd211a4SJed Brown PetscErrorCode PetscObjectCopyFortranFunctionPointers(PetscObject src,PetscObject dest)
1608cd211a4SJed Brown {
1618cd211a4SJed Brown   PetscErrorCode ierr;
162e1e95054SJed Brown   PetscInt       cbtype,numcb[PETSC_FORTRAN_CALLBACK_MAXTYPE];
1638cd211a4SJed Brown 
1648cd211a4SJed Brown   PetscFunctionBegin;
1658cd211a4SJed Brown   PetscValidHeader(src,1);
1668cd211a4SJed Brown   PetscValidHeader(dest,2);
1678cd211a4SJed Brown   if (src->classid != dest->classid) SETERRQ(src->comm,PETSC_ERR_ARG_INCOMP,"Objects must be of the same class");
1688cd211a4SJed Brown 
1698cd211a4SJed Brown   ierr = PetscFree(dest->fortran_func_pointers);CHKERRQ(ierr);
1708cd211a4SJed Brown   ierr = PetscMalloc(src->num_fortran_func_pointers*sizeof(void(*)(void)),&dest->fortran_func_pointers);CHKERRQ(ierr);
1718cd211a4SJed Brown   ierr = PetscMemcpy(dest->fortran_func_pointers,src->fortran_func_pointers,src->num_fortran_func_pointers*sizeof(void(*)(void)));CHKERRQ(ierr);
172a297a907SKarl Rupp 
1738cd211a4SJed Brown   dest->num_fortran_func_pointers = src->num_fortran_func_pointers;
174f6291634SJed Brown 
175f6291634SJed Brown   ierr = PetscFortranCallbackGetSizes(src->classid,&numcb[PETSC_FORTRAN_CALLBACK_CLASS],&numcb[PETSC_FORTRAN_CALLBACK_SUBTYPE]);CHKERRQ(ierr);
176f6291634SJed Brown   for (cbtype=PETSC_FORTRAN_CALLBACK_CLASS; cbtype<PETSC_FORTRAN_CALLBACK_MAXTYPE; cbtype++) {
177f6291634SJed Brown     ierr = PetscFree(dest->fortrancallback[cbtype]);CHKERRQ(ierr);
178f6291634SJed Brown     ierr = PetscMalloc(numcb[cbtype]*sizeof(PetscFortranCallback),&dest->fortrancallback[cbtype]);CHKERRQ(ierr);
179f6291634SJed Brown     ierr = PetscMemzero(dest->fortrancallback[cbtype],numcb[cbtype]*sizeof(PetscFortranCallback));CHKERRQ(ierr);
180f6291634SJed Brown     ierr = PetscMemcpy(dest->fortrancallback[cbtype],src->fortrancallback[cbtype],src->num_fortrancallback[cbtype]*sizeof(PetscFortranCallback));CHKERRQ(ierr);
181f6291634SJed Brown   }
182f6291634SJed Brown   PetscFunctionReturn(0);
183f6291634SJed Brown }
184f6291634SJed Brown 
185f6291634SJed Brown #undef __FUNCT__
186f6291634SJed Brown #define __FUNCT__ "PetscObjectSetFortranCallback"
187de6d466bSJed Brown /*@C
188f6291634SJed Brown    PetscObjectSetFortranCallback - set fortran callback function pointer and context
189f6291634SJed Brown 
190f6291634SJed Brown    Logically Collective
191f6291634SJed Brown 
192f6291634SJed Brown    Input Arguments:
193f6291634SJed Brown +  obj - object on which to set callback
194f6291634SJed Brown .  cbtype - callback type (class or subtype)
195f6291634SJed Brown .  cid - address of callback Id, updated if not yet initialized (zero)
196f6291634SJed Brown .  func - Fortran function
197f6291634SJed Brown -  ctx - Fortran context
198f6291634SJed Brown 
199f6291634SJed Brown    Level: developer
200f6291634SJed Brown 
201f6291634SJed Brown .seealso: PetscObjectGetFortranCallback()
202f6291634SJed Brown @*/
203f6291634SJed Brown PetscErrorCode PetscObjectSetFortranCallback(PetscObject obj,PetscFortranCallbackType cbtype,PetscFortranCallbackId *cid,void (*func)(void),void *ctx)
204f6291634SJed Brown {
205f6291634SJed Brown   PetscErrorCode ierr;
2060298fd71SBarry Smith   const char     *subtype = NULL;
207f6291634SJed Brown 
208f6291634SJed Brown   PetscFunctionBegin;
209f6291634SJed Brown   PetscValidHeader(obj,1);
210f6291634SJed Brown   if (cbtype == PETSC_FORTRAN_CALLBACK_SUBTYPE) subtype = obj->type_name;
211f6291634SJed Brown   if (!*cid) {ierr = PetscFortranCallbackRegister(obj->classid,subtype,cid);CHKERRQ(ierr);}
212f6291634SJed Brown   if (*cid >= PETSC_SMALLEST_FORTRAN_CALLBACK+obj->num_fortrancallback[cbtype]) {
213f6291634SJed Brown     PetscInt             oldnum = obj->num_fortrancallback[cbtype],newnum = PetscMax(1,2*oldnum);
214f6291634SJed Brown     PetscFortranCallback *callback;
215f6291634SJed Brown     ierr = PetscMalloc(newnum*sizeof(callback[0]),&callback);CHKERRQ(ierr);
216f6291634SJed Brown     ierr = PetscMemcpy(callback,obj->fortrancallback[cbtype],oldnum*sizeof(*obj->fortrancallback[cbtype]));CHKERRQ(ierr);
217f6291634SJed Brown     ierr = PetscFree(obj->fortrancallback[cbtype]);CHKERRQ(ierr);
218a297a907SKarl Rupp 
219f6291634SJed Brown     obj->fortrancallback[cbtype] = callback;
220f6291634SJed Brown     obj->num_fortrancallback[cbtype] = newnum;
221f6291634SJed Brown   }
222f6291634SJed Brown   obj->fortrancallback[cbtype][*cid-PETSC_SMALLEST_FORTRAN_CALLBACK].func = func;
223f6291634SJed Brown   obj->fortrancallback[cbtype][*cid-PETSC_SMALLEST_FORTRAN_CALLBACK].ctx = ctx;
224f6291634SJed Brown   PetscFunctionReturn(0);
225f6291634SJed Brown }
226f6291634SJed Brown 
227f6291634SJed Brown #undef __FUNCT__
228f6291634SJed Brown #define __FUNCT__ "PetscObjectGetFortranCallback"
229de6d466bSJed Brown /*@C
230f6291634SJed Brown    PetscObjectGetFortranCallback - get fortran callback function pointer and context
231f6291634SJed Brown 
232f6291634SJed Brown    Logically Collective
233f6291634SJed Brown 
234f6291634SJed Brown    Input Arguments:
235f6291634SJed Brown +  obj - object on which to get callback
236f6291634SJed Brown .  cbtype - callback type
237f6291634SJed Brown -  cid - address of callback Id
238f6291634SJed Brown 
239f6291634SJed Brown    Output Arguments:
2400298fd71SBarry Smith +  func - Fortran function (or NULL if not needed)
2410298fd71SBarry Smith -  ctx - Fortran context (or NULL if not needed)
242f6291634SJed Brown 
243f6291634SJed Brown    Level: developer
244f6291634SJed Brown 
245f6291634SJed Brown .seealso: PetscObjectSetFortranCallback()
246f6291634SJed Brown @*/
247f6291634SJed Brown PetscErrorCode PetscObjectGetFortranCallback(PetscObject obj,PetscFortranCallbackType cbtype,PetscFortranCallbackId cid,void (**func)(void),void **ctx)
248f6291634SJed Brown {
249f6291634SJed Brown   PetscFortranCallback *cb;
250f6291634SJed Brown 
251f6291634SJed Brown   PetscFunctionBegin;
252f6291634SJed Brown   PetscValidHeader(obj,1);
253f6291634SJed Brown   if (PetscUnlikely(cid < PETSC_SMALLEST_FORTRAN_CALLBACK)) SETERRQ(obj->comm,PETSC_ERR_ARG_CORRUPT,"Fortran callback Id invalid");
254f6291634SJed Brown   if (PetscUnlikely(cid >= PETSC_SMALLEST_FORTRAN_CALLBACK+obj->num_fortrancallback[cbtype])) SETERRQ(obj->comm,PETSC_ERR_ARG_CORRUPT,"Fortran callback not set on this object");
255f6291634SJed Brown   cb = &obj->fortrancallback[cbtype][cid-PETSC_SMALLEST_FORTRAN_CALLBACK];
256f6291634SJed Brown   if (func) *func = cb->func;
257f6291634SJed Brown   if (ctx) *ctx = cb->ctx;
2588cd211a4SJed Brown   PetscFunctionReturn(0);
2598cd211a4SJed Brown }
2608cd211a4SJed Brown 
2618cd211a4SJed Brown #undef __FUNCT__
262a64a8e02SBarry Smith #define __FUNCT__ "PetscObjectsDump"
263a64a8e02SBarry Smith /*@C
264a64a8e02SBarry Smith    PetscObjectsDump - Prints the currently existing objects.
265a64a8e02SBarry Smith 
266a64a8e02SBarry Smith    Logically Collective on PetscViewer
267a64a8e02SBarry Smith 
268a64a8e02SBarry Smith    Input Parameter:
2697eb1d149SBarry Smith +  viewer - must be an PETSCVIEWERASCII viewer
2707eb1d149SBarry Smith -  all - by default only tries to display objects created explicitly by the user, if all is PETSC_TRUE then lists all outstanding objects
271a64a8e02SBarry Smith 
272a64a8e02SBarry Smith    Level: advanced
273a64a8e02SBarry Smith 
274a64a8e02SBarry Smith    Concepts: options database^printing
275a64a8e02SBarry Smith 
276a64a8e02SBarry Smith @*/
2777eb1d149SBarry Smith PetscErrorCode  PetscObjectsDump(FILE *fd,PetscBool all)
278a64a8e02SBarry Smith {
279a64a8e02SBarry Smith   PetscErrorCode ierr;
280f5351476SHong Zhang   PetscInt       i;
281f5351476SHong Zhang #if defined(PETSC_USE_DEBUG)
282f5351476SHong Zhang   PetscInt       j,k;
283f5351476SHong Zhang #endif
284a64a8e02SBarry Smith   PetscObject    h;
285a64a8e02SBarry Smith 
286a64a8e02SBarry Smith   PetscFunctionBegin;
287a64a8e02SBarry Smith   if (PetscObjectsCounts) {
288a2ea699eSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"The following objects were never freed\n");CHKERRQ(ierr);
289a2ea699eSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-----------------------------------------\n");CHKERRQ(ierr);
290a64a8e02SBarry Smith     for (i=0; i<PetscObjectsMaxCounts; i++) {
291a64a8e02SBarry Smith       if ((h = PetscObjects[i])) {
292a64a8e02SBarry Smith         ierr = PetscObjectName(h);CHKERRQ(ierr);
2932c9581d2SBarry Smith         {
294a64a8e02SBarry Smith #if defined(PETSC_USE_DEBUG)
295a64a8e02SBarry Smith         PetscStack *stack;
296719d7bfeSBarry Smith         char       *create,*rclass;
297a8d2bbe5SBarry Smith 
298a8d2bbe5SBarry Smith         /* if the PETSc function the user calls is not a create then this object was NOT directly created by them */
299a64a8e02SBarry Smith         ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr);
30068f616c8SBarry Smith         k    = stack->currentsize-2;
3017eb1d149SBarry Smith         if (!all) {
30268f616c8SBarry Smith           k = 0;
30368f616c8SBarry Smith           while (!stack->petscroutine[k]) k++;
30468f616c8SBarry Smith           ierr = PetscStrstr(stack->function[k],"Create",&create);CHKERRQ(ierr);
30568f616c8SBarry Smith           if (!create) {
30668f616c8SBarry Smith             ierr = PetscStrstr(stack->function[k],"Get",&create);CHKERRQ(ierr);
30768f616c8SBarry Smith           }
308719d7bfeSBarry Smith           ierr = PetscStrstr(stack->function[k],h->class_name,&rclass);CHKERRQ(ierr);
3092c9581d2SBarry Smith 
3102c9581d2SBarry Smith           if (!create) continue;
311719d7bfeSBarry Smith           if (!rclass) continue;
3127eb1d149SBarry Smith         }
313a64a8e02SBarry Smith #endif
3142c9581d2SBarry Smith 
3152c9581d2SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"[%d] %s %s %s\n",PetscGlobalRank,h->class_name,h->type_name,h->name);CHKERRQ(ierr);
3162c9581d2SBarry Smith 
3172c9581d2SBarry Smith #if defined(PETSC_USE_DEBUG)
3182c9581d2SBarry Smith         ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr);
31968f616c8SBarry Smith         for (j=k; j>=0; j--) {
3202c9581d2SBarry Smith           fprintf(fd,"      [%d]  %s() in %s%s\n",PetscGlobalRank,stack->function[j],stack->directory[j],stack->file[j]);
3212c9581d2SBarry Smith         }
3222c9581d2SBarry Smith #endif
3232c9581d2SBarry Smith         }
324a64a8e02SBarry Smith       }
325a64a8e02SBarry Smith     }
326a64a8e02SBarry Smith   }
327a64a8e02SBarry Smith   PetscFunctionReturn(0);
328a64a8e02SBarry Smith }
329a64a8e02SBarry Smith 
330a64a8e02SBarry Smith 
331a64a8e02SBarry Smith #undef __FUNCT__
332c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsView"
333c139c21fSBarry Smith /*@C
334c139c21fSBarry Smith    PetscObjectsView - Prints the currently existing objects.
335c139c21fSBarry Smith 
336c139c21fSBarry Smith    Logically Collective on PetscViewer
337c139c21fSBarry Smith 
338c139c21fSBarry Smith    Input Parameter:
339c139c21fSBarry Smith .  viewer - must be an PETSCVIEWERASCII viewer
340c139c21fSBarry Smith 
341c139c21fSBarry Smith    Level: advanced
342c139c21fSBarry Smith 
343c139c21fSBarry Smith    Concepts: options database^printing
344c139c21fSBarry Smith 
345c139c21fSBarry Smith @*/
346c139c21fSBarry Smith PetscErrorCode  PetscObjectsView(PetscViewer viewer)
347c139c21fSBarry Smith {
348c139c21fSBarry Smith   PetscErrorCode ierr;
349c139c21fSBarry Smith   PetscBool      isascii;
350a64a8e02SBarry Smith   FILE           *fd;
351c139c21fSBarry Smith 
352c139c21fSBarry Smith   PetscFunctionBegin;
353c139c21fSBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
354251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
355ce94432eSBarry Smith   if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Only supports ASCII viewer");
356a64a8e02SBarry Smith   ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr);
3577eb1d149SBarry Smith   ierr = PetscObjectsDump(fd,PETSC_TRUE);CHKERRQ(ierr);
358c139c21fSBarry Smith   PetscFunctionReturn(0);
359c139c21fSBarry Smith }
360c139c21fSBarry Smith 
361c139c21fSBarry Smith #undef __FUNCT__
362c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObject"
363c139c21fSBarry Smith /*@C
364c139c21fSBarry Smith    PetscObjectsGetObject - Get a pointer to a named object
365c139c21fSBarry Smith 
366c139c21fSBarry Smith    Not collective
367c139c21fSBarry Smith 
368c139c21fSBarry Smith    Input Parameter:
369c139c21fSBarry Smith .  name - the name of an object
370c139c21fSBarry Smith 
371c139c21fSBarry Smith    Output Parameter:
372c139c21fSBarry Smith .   obj - the object or null if there is no object
373c139c21fSBarry Smith 
374c139c21fSBarry Smith    Level: advanced
375c139c21fSBarry Smith 
376c139c21fSBarry Smith    Concepts: options database^printing
377c139c21fSBarry Smith 
378c139c21fSBarry Smith @*/
379c139c21fSBarry Smith PetscErrorCode  PetscObjectsGetObject(const char *name,PetscObject *obj,char **classname)
380c139c21fSBarry Smith {
381c139c21fSBarry Smith   PetscErrorCode ierr;
382c139c21fSBarry Smith   PetscInt       i;
383c139c21fSBarry Smith   PetscObject    h;
384c139c21fSBarry Smith   PetscBool      flg;
385c139c21fSBarry Smith 
386c139c21fSBarry Smith   PetscFunctionBegin;
3870298fd71SBarry Smith   *obj = NULL;
388c139c21fSBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
389c139c21fSBarry Smith     if ((h = PetscObjects[i])) {
390c139c21fSBarry Smith       ierr = PetscObjectName(h);CHKERRQ(ierr);
391c139c21fSBarry Smith       ierr = PetscStrcmp(h->name,name,&flg);CHKERRQ(ierr);
392c139c21fSBarry Smith       if (flg) {
393c139c21fSBarry Smith         *obj = h;
394c139c21fSBarry Smith         if (classname) *classname = h->class_name;
395c139c21fSBarry Smith         PetscFunctionReturn(0);
396c139c21fSBarry Smith       }
397c139c21fSBarry Smith     }
398c139c21fSBarry Smith   }
399c139c21fSBarry Smith   PetscFunctionReturn(0);
400c139c21fSBarry Smith }
401c139c21fSBarry Smith 
402c139c21fSBarry Smith #undef __FUNCT__
403c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObjectMatlab"
404c139c21fSBarry Smith char *PetscObjectsGetObjectMatlab(const char* name,PetscObject *obj)
405c139c21fSBarry Smith {
406c139c21fSBarry Smith   PetscErrorCode ierr;
407c139c21fSBarry Smith   PetscInt       i;
408c139c21fSBarry Smith   PetscObject    h;
409c139c21fSBarry Smith   PetscBool      flg;
410c139c21fSBarry Smith 
411c139c21fSBarry Smith   PetscFunctionBegin;
4120298fd71SBarry Smith   *obj = NULL;
413c139c21fSBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
414c139c21fSBarry Smith     if ((h = PetscObjects[i])) {
415c139c21fSBarry Smith       ierr = PetscObjectName(h);if (ierr) PetscFunctionReturn(0);
416c139c21fSBarry Smith       ierr = PetscStrcmp(h->name,name,&flg);if (ierr) PetscFunctionReturn(0);
417c139c21fSBarry Smith       if (flg) {
418c139c21fSBarry Smith         *obj = h;
419c139c21fSBarry Smith         PetscFunctionReturn(h->class_name);
420c139c21fSBarry Smith       }
421c139c21fSBarry Smith     }
422c139c21fSBarry Smith   }
423c139c21fSBarry Smith   PetscFunctionReturn(0);
424c139c21fSBarry Smith }
425c139c21fSBarry Smith 
426c139c21fSBarry Smith #undef __FUNCT__
427af272810SBarry Smith #define __FUNCT__ "PetscObjectAddOptionsHandler"
428af272810SBarry Smith /*@C
429af272810SBarry Smith     PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called.
430af272810SBarry Smith 
431af272810SBarry Smith     Not Collective
432af272810SBarry Smith 
433af272810SBarry Smith     Input Parameter:
434af272810SBarry Smith +   obj - the PETSc object
435af272810SBarry Smith .   handle - function that checks for options
436af272810SBarry Smith .   destroy - function to destroy context if provided
437af272810SBarry Smith -   ctx - optional context for check function
438af272810SBarry Smith 
439af272810SBarry Smith     Level: developer
440af272810SBarry Smith 
441af272810SBarry Smith 
442af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers()
443af272810SBarry Smith 
444af272810SBarry Smith @*/
4457087cfbeSBarry Smith PetscErrorCode  PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx)
446af272810SBarry Smith {
447af272810SBarry Smith   PetscFunctionBegin;
4480defdb15SJed Brown   PetscValidHeader(obj,1);
449af272810SBarry Smith   if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added");
450af272810SBarry Smith   obj->optionhandler[obj->noptionhandler] = handle;
451af272810SBarry Smith   obj->optiondestroy[obj->noptionhandler] = destroy;
452af272810SBarry Smith   obj->optionctx[obj->noptionhandler++]   = ctx;
453af272810SBarry Smith   PetscFunctionReturn(0);
454af272810SBarry Smith }
455af272810SBarry Smith 
456af272810SBarry Smith #undef __FUNCT__
457af272810SBarry Smith #define __FUNCT__ "PetscObjectProcessOptionsHandlers"
458af272810SBarry Smith /*@C
459db05f41bSBarry Smith     PetscObjectProcessOptionsHandlers - Calls all the options handlers attached to an object
460af272810SBarry Smith 
461af272810SBarry Smith     Not Collective
462af272810SBarry Smith 
463af272810SBarry Smith     Input Parameter:
464af272810SBarry Smith .   obj - the PETSc object
465af272810SBarry Smith 
466af272810SBarry Smith     Level: developer
467af272810SBarry Smith 
468af272810SBarry Smith 
469af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectDestroyOptionsHandlers()
470af272810SBarry Smith 
471af272810SBarry Smith @*/
4727087cfbeSBarry Smith PetscErrorCode  PetscObjectProcessOptionsHandlers(PetscObject obj)
473af272810SBarry Smith {
474af272810SBarry Smith   PetscInt       i;
475af272810SBarry Smith   PetscErrorCode ierr;
476af272810SBarry Smith 
477af272810SBarry Smith   PetscFunctionBegin;
4780defdb15SJed Brown   PetscValidHeader(obj,1);
479af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
480af272810SBarry Smith     ierr = (*obj->optionhandler[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
481af272810SBarry Smith   }
482af272810SBarry Smith   PetscFunctionReturn(0);
483af272810SBarry Smith }
484af272810SBarry Smith 
485af272810SBarry Smith #undef __FUNCT__
486af272810SBarry Smith #define __FUNCT__ "PetscObjectDestroyOptionsHandlers"
487af272810SBarry Smith /*@C
488af272810SBarry Smith     PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an objeft
489af272810SBarry Smith 
490af272810SBarry Smith     Not Collective
491af272810SBarry Smith 
492af272810SBarry Smith     Input Parameter:
493af272810SBarry Smith .   obj - the PETSc object
494af272810SBarry Smith 
495af272810SBarry Smith     Level: developer
496af272810SBarry Smith 
497af272810SBarry Smith 
498af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectProcessOptionsHandlers()
499af272810SBarry Smith 
500af272810SBarry Smith @*/
5017087cfbeSBarry Smith PetscErrorCode  PetscObjectDestroyOptionsHandlers(PetscObject obj)
502af272810SBarry Smith {
503af272810SBarry Smith   PetscInt       i;
504af272810SBarry Smith   PetscErrorCode ierr;
505af272810SBarry Smith 
506af272810SBarry Smith   PetscFunctionBegin;
5070defdb15SJed Brown   PetscValidHeader(obj,1);
508af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
509af272810SBarry Smith     ierr = (*obj->optiondestroy[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
510af272810SBarry Smith   }
511af272810SBarry Smith   obj->noptionhandler = 0;
512af272810SBarry Smith   PetscFunctionReturn(0);
513af272810SBarry Smith }
514af272810SBarry Smith 
515af272810SBarry Smith 
516af272810SBarry Smith #undef __FUNCT__
517e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectReference"
518ee978a2eSBarry Smith /*@
519e5c89e4eSSatish Balay    PetscObjectReference - Indicates to any PetscObject that it is being
520e5c89e4eSSatish Balay    referenced by another PetscObject. This increases the reference
521e5c89e4eSSatish Balay    count for that object by one.
522e5c89e4eSSatish Balay 
5233f9fe445SBarry Smith    Logically Collective on PetscObject
524e5c89e4eSSatish Balay 
525e5c89e4eSSatish Balay    Input Parameter:
526e5c89e4eSSatish Balay .  obj - the PETSc object. This must be cast with (PetscObject), for example,
527e5c89e4eSSatish Balay          PetscObjectReference((PetscObject)mat);
528e5c89e4eSSatish Balay 
529e5c89e4eSSatish Balay    Level: advanced
530e5c89e4eSSatish Balay 
531e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference()
532e5c89e4eSSatish Balay @*/
5337087cfbeSBarry Smith PetscErrorCode  PetscObjectReference(PetscObject obj)
534e5c89e4eSSatish Balay {
535e5c89e4eSSatish Balay   PetscFunctionBegin;
53652536dc3SBarry Smith   if (!obj) PetscFunctionReturn(0);
537e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
538e5c89e4eSSatish Balay   obj->refct++;
539e5c89e4eSSatish Balay   PetscFunctionReturn(0);
540e5c89e4eSSatish Balay }
541e5c89e4eSSatish Balay 
542e5c89e4eSSatish Balay #undef __FUNCT__
543e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetReference"
544ee978a2eSBarry Smith /*@
545e5c89e4eSSatish Balay    PetscObjectGetReference - Gets the current reference count for
546e5c89e4eSSatish Balay    any PETSc object.
547e5c89e4eSSatish Balay 
548e5c89e4eSSatish Balay    Not Collective
549e5c89e4eSSatish Balay 
550e5c89e4eSSatish Balay    Input Parameter:
551e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
552e5c89e4eSSatish Balay          PetscObjectGetReference((PetscObject)mat,&cnt);
553e5c89e4eSSatish Balay 
554e5c89e4eSSatish Balay    Output Parameter:
555e5c89e4eSSatish Balay .  cnt - the reference count
556e5c89e4eSSatish Balay 
557e5c89e4eSSatish Balay    Level: advanced
558e5c89e4eSSatish Balay 
559e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference()
560e5c89e4eSSatish Balay @*/
5617087cfbeSBarry Smith PetscErrorCode  PetscObjectGetReference(PetscObject obj,PetscInt *cnt)
562e5c89e4eSSatish Balay {
563e5c89e4eSSatish Balay   PetscFunctionBegin;
564e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
565e5c89e4eSSatish Balay   PetscValidIntPointer(cnt,2);
566e5c89e4eSSatish Balay   *cnt = obj->refct;
567e5c89e4eSSatish Balay   PetscFunctionReturn(0);
568e5c89e4eSSatish Balay }
569e5c89e4eSSatish Balay 
570e5c89e4eSSatish Balay #undef __FUNCT__
571e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDereference"
572e5c89e4eSSatish Balay /*@
573e5c89e4eSSatish Balay    PetscObjectDereference - Indicates to any PetscObject that it is being
574e5c89e4eSSatish Balay    referenced by one less PetscObject. This decreases the reference
575e5c89e4eSSatish Balay    count for that object by one.
576e5c89e4eSSatish Balay 
5773f9fe445SBarry Smith    Collective on PetscObject if reference reaches 0 otherwise Logically Collective
578e5c89e4eSSatish Balay 
579e5c89e4eSSatish Balay    Input Parameter:
580e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
581e5c89e4eSSatish Balay          PetscObjectDereference((PetscObject)mat);
582e5c89e4eSSatish Balay 
5836bf464f9SBarry Smith    Notes: PetscObjectDestroy(PetscObject *obj)  sets the obj pointer to null after the call, this routine does not.
5846bf464f9SBarry Smith 
585e5c89e4eSSatish Balay    Level: advanced
586e5c89e4eSSatish Balay 
587e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectReference()
588e5c89e4eSSatish Balay @*/
5897087cfbeSBarry Smith PetscErrorCode  PetscObjectDereference(PetscObject obj)
590e5c89e4eSSatish Balay {
591e5c89e4eSSatish Balay   PetscErrorCode ierr;
592e5c89e4eSSatish Balay 
593e5c89e4eSSatish Balay   PetscFunctionBegin;
594e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
595e5c89e4eSSatish Balay   if (obj->bops->destroy) {
5966bf464f9SBarry Smith     ierr = (*obj->bops->destroy)(&obj);CHKERRQ(ierr);
597f7923d8aSBarry Smith   } else if (!--obj->refct) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine");
598e5c89e4eSSatish Balay   PetscFunctionReturn(0);
599e5c89e4eSSatish Balay }
600e5c89e4eSSatish Balay 
601e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */
602e5c89e4eSSatish Balay /*
603e5c89e4eSSatish Balay      The following routines are the versions private to the PETSc object
604e5c89e4eSSatish Balay      data structures.
605e5c89e4eSSatish Balay */
606e5c89e4eSSatish Balay #undef __FUNCT__
607e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetComm_Petsc"
608e5c89e4eSSatish Balay PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm)
609e5c89e4eSSatish Balay {
610e5c89e4eSSatish Balay   PetscFunctionBegin;
6110defdb15SJed Brown   PetscValidHeader(obj,1);
612e5c89e4eSSatish Balay   *comm = obj->comm;
613e5c89e4eSSatish Balay   PetscFunctionReturn(0);
614e5c89e4eSSatish Balay }
615e5c89e4eSSatish Balay 
616e5c89e4eSSatish Balay #undef __FUNCT__
6176ba4bc90SBarry Smith #define __FUNCT__ "PetscObjectRemoveReference"
6186ba4bc90SBarry Smith PetscErrorCode PetscObjectRemoveReference(PetscObject obj,const char name[])
6196ba4bc90SBarry Smith {
6206ba4bc90SBarry Smith   PetscErrorCode ierr;
6216ba4bc90SBarry Smith 
6226ba4bc90SBarry Smith   PetscFunctionBegin;
6230defdb15SJed Brown   PetscValidHeader(obj,1);
624140e18c1SBarry Smith   ierr = PetscObjectListRemoveReference(&obj->olist,name);CHKERRQ(ierr);
6256ba4bc90SBarry Smith   PetscFunctionReturn(0);
6266ba4bc90SBarry Smith }
6276ba4bc90SBarry Smith 
6286ba4bc90SBarry Smith #undef __FUNCT__
629e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose_Petsc"
630e5c89e4eSSatish Balay PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr)
631e5c89e4eSSatish Balay {
632e5c89e4eSSatish Balay   PetscErrorCode ierr;
633e5c89e4eSSatish Balay   char           *tname;
634bfec8eecSBarry Smith   PetscBool      skipreference;
635e5c89e4eSSatish Balay 
636e5c89e4eSSatish Balay   PetscFunctionBegin;
637e5c89e4eSSatish Balay   if (ptr) {
638140e18c1SBarry Smith     ierr = PetscObjectListReverseFind(ptr->olist,obj,&tname,&skipreference);CHKERRQ(ierr);
639f851cb64SDmitry Karpeev     if (tname && !skipreference) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"An object cannot be composed with an object that was composed with it");
640e5c89e4eSSatish Balay   }
641140e18c1SBarry Smith   ierr = PetscObjectListAdd(&obj->olist,name,ptr);CHKERRQ(ierr);
642e5c89e4eSSatish Balay   PetscFunctionReturn(0);
643e5c89e4eSSatish Balay }
644e5c89e4eSSatish Balay 
645e5c89e4eSSatish Balay #undef __FUNCT__
646e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery_Petsc"
647e5c89e4eSSatish Balay PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr)
648e5c89e4eSSatish Balay {
649e5c89e4eSSatish Balay   PetscErrorCode ierr;
650e5c89e4eSSatish Balay 
651e5c89e4eSSatish Balay   PetscFunctionBegin;
6520defdb15SJed Brown   PetscValidHeader(obj,1);
653140e18c1SBarry Smith   ierr = PetscObjectListFind(obj->olist,name,ptr);CHKERRQ(ierr);
654e5c89e4eSSatish Balay   PetscFunctionReturn(0);
655e5c89e4eSSatish Balay }
656e5c89e4eSSatish Balay 
657e5c89e4eSSatish Balay #undef __FUNCT__
658e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction_Petsc"
659e5c89e4eSSatish Balay PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
660e5c89e4eSSatish Balay {
661e5c89e4eSSatish Balay   PetscErrorCode ierr;
662e5c89e4eSSatish Balay 
663e5c89e4eSSatish Balay   PetscFunctionBegin;
6640defdb15SJed Brown   PetscValidHeader(obj,1);
665140e18c1SBarry Smith   ierr = PetscFunctionListAdd(obj->comm,&obj->qlist,name,fname,ptr);CHKERRQ(ierr);
666e5c89e4eSSatish Balay   PetscFunctionReturn(0);
667e5c89e4eSSatish Balay }
668e5c89e4eSSatish Balay 
669e5c89e4eSSatish Balay #undef __FUNCT__
670e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction_Petsc"
671e5c89e4eSSatish Balay PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void))
672e5c89e4eSSatish Balay {
673e5c89e4eSSatish Balay   PetscErrorCode ierr;
674e5c89e4eSSatish Balay 
675e5c89e4eSSatish Balay   PetscFunctionBegin;
6760defdb15SJed Brown   PetscValidHeader(obj,1);
677140e18c1SBarry Smith   ierr = PetscFunctionListFind(obj->comm,obj->qlist,name,PETSC_FALSE,ptr);CHKERRQ(ierr);
678e5c89e4eSSatish Balay   PetscFunctionReturn(0);
679e5c89e4eSSatish Balay }
680e5c89e4eSSatish Balay 
681e5c89e4eSSatish Balay #undef __FUNCT__
682e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose"
683e5c89e4eSSatish Balay /*@C
684e5c89e4eSSatish Balay    PetscObjectCompose - Associates another PETSc object with a given PETSc object.
685e5c89e4eSSatish Balay 
686e5c89e4eSSatish Balay    Not Collective
687e5c89e4eSSatish Balay 
688e5c89e4eSSatish Balay    Input Parameters:
689e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
690e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
691e5c89e4eSSatish Balay .  name - name associated with the child object
692e5c89e4eSSatish Balay -  ptr - the other PETSc object to associate with the PETSc object; this must also be
693e5c89e4eSSatish Balay          cast with (PetscObject)
694e5c89e4eSSatish Balay 
695e5c89e4eSSatish Balay    Level: advanced
696e5c89e4eSSatish Balay 
697e5c89e4eSSatish Balay    Notes:
698e5c89e4eSSatish Balay    The second objects reference count is automatically increased by one when it is
699e5c89e4eSSatish Balay    composed.
700e5c89e4eSSatish Balay 
701e5c89e4eSSatish Balay    Replaces any previous object that had the same name.
702e5c89e4eSSatish Balay 
703e5c89e4eSSatish Balay    If ptr is null and name has previously been composed using an object, then that
704e5c89e4eSSatish Balay    entry is removed from the obj.
705e5c89e4eSSatish Balay 
706e5c89e4eSSatish Balay    PetscObjectCompose() can be used with any PETSc object (such as
707e5c89e4eSSatish Balay    Mat, Vec, KSP, SNES, etc.) or any user-provided object.  See
708776b82aeSLisandro Dalcin    PetscContainerCreate() for info on how to create an object from a
709e5c89e4eSSatish Balay    user-provided pointer that may then be composed with PETSc objects.
710e5c89e4eSSatish Balay 
711e5c89e4eSSatish Balay    Concepts: objects^composing
712e5c89e4eSSatish Balay    Concepts: composing objects
713e5c89e4eSSatish Balay 
714776b82aeSLisandro Dalcin .seealso: PetscObjectQuery(), PetscContainerCreate()
715e5c89e4eSSatish Balay @*/
7167087cfbeSBarry Smith PetscErrorCode  PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr)
717e5c89e4eSSatish Balay {
718e5c89e4eSSatish Balay   PetscErrorCode ierr;
719e5c89e4eSSatish Balay 
720e5c89e4eSSatish Balay   PetscFunctionBegin;
7213cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7223cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
7233cfa8680SLisandro Dalcin   if (ptr) PetscValidHeader(ptr,3);
724e5c89e4eSSatish Balay   ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr);
725e5c89e4eSSatish Balay   PetscFunctionReturn(0);
726e5c89e4eSSatish Balay }
727e5c89e4eSSatish Balay 
72858b60935SBarry Smith #undef __FUNCT__
72958b60935SBarry Smith #define __FUNCT__ "PetscObjectSetPrecision"
73058b60935SBarry Smith /*@C
73158b60935SBarry Smith    PetscObjectSetPrecision - sets the precision used within a given object.
7329f8a2776SDmitry Karpeev 
73358b60935SBarry Smith    Collective on the PetscObject
73458b60935SBarry Smith 
73558b60935SBarry Smith    Input Parameters:
73658b60935SBarry Smith +  obj - the PETSc object; this must be cast with (PetscObject), for example,
73758b60935SBarry Smith          PetscObjectCompose((PetscObject)mat,...);
73858b60935SBarry Smith -  precision - the precision
73958b60935SBarry Smith 
74058b60935SBarry Smith    Level: advanced
74158b60935SBarry Smith 
74258b60935SBarry Smith .seealso: PetscObjectQuery(), PetscContainerCreate()
74358b60935SBarry Smith @*/
7447087cfbeSBarry Smith PetscErrorCode  PetscObjectSetPrecision(PetscObject obj,PetscPrecision precision)
74558b60935SBarry Smith {
74658b60935SBarry Smith   PetscFunctionBegin;
74758b60935SBarry Smith   PetscValidHeader(obj,1);
74858b60935SBarry Smith   obj->precision = precision;
74958b60935SBarry Smith   PetscFunctionReturn(0);
75058b60935SBarry Smith }
7519f8a2776SDmitry Karpeev 
752e5c89e4eSSatish Balay #undef __FUNCT__
753e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery"
754e5c89e4eSSatish Balay /*@C
755e5c89e4eSSatish Balay    PetscObjectQuery  - Gets a PETSc object associated with a given object.
756e5c89e4eSSatish Balay 
757e5c89e4eSSatish Balay    Not Collective
758e5c89e4eSSatish Balay 
759e5c89e4eSSatish Balay    Input Parameters:
760e5c89e4eSSatish Balay +  obj - the PETSc object
761e5c89e4eSSatish Balay          Thus must be cast with a (PetscObject), for example,
762e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
763e5c89e4eSSatish Balay .  name - name associated with child object
7643c0c59f3SBarry Smith -  ptr - the other PETSc object associated with the PETSc object, this must be
7653c0c59f3SBarry Smith          cast with (PetscObject*)
766e5c89e4eSSatish Balay 
767e5c89e4eSSatish Balay    Level: advanced
768e5c89e4eSSatish Balay 
7693c0c59f3SBarry Smith    The reference count of neither object is increased in this call
7703c0c59f3SBarry Smith 
771e5c89e4eSSatish Balay    Concepts: objects^composing
772e5c89e4eSSatish Balay    Concepts: composing objects
773e5c89e4eSSatish Balay    Concepts: objects^querying
774e5c89e4eSSatish Balay    Concepts: querying objects
775e5c89e4eSSatish Balay 
77688674abaSJed Brown .seealso: PetscObjectCompose()
777e5c89e4eSSatish Balay @*/
7787087cfbeSBarry Smith PetscErrorCode  PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr)
779e5c89e4eSSatish Balay {
780e5c89e4eSSatish Balay   PetscErrorCode ierr;
781e5c89e4eSSatish Balay 
782e5c89e4eSSatish Balay   PetscFunctionBegin;
7833cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7843cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
7853cfa8680SLisandro Dalcin   PetscValidPointer(ptr,3);
786e5c89e4eSSatish Balay   ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr);
787e5c89e4eSSatish Balay   PetscFunctionReturn(0);
788e5c89e4eSSatish Balay }
789e5c89e4eSSatish Balay 
790e5c89e4eSSatish Balay #undef __FUNCT__
791e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction"
7927087cfbeSBarry Smith PetscErrorCode  PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
793e5c89e4eSSatish Balay {
794e5c89e4eSSatish Balay   PetscErrorCode ierr;
795e5c89e4eSSatish Balay 
796e5c89e4eSSatish Balay   PetscFunctionBegin;
7973cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7983cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
799e5c89e4eSSatish Balay   ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr);
800e5c89e4eSSatish Balay   PetscFunctionReturn(0);
801e5c89e4eSSatish Balay }
802e5c89e4eSSatish Balay 
803e5c89e4eSSatish Balay #undef __FUNCT__
804e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction"
805e5c89e4eSSatish Balay /*@C
806e5c89e4eSSatish Balay    PetscObjectQueryFunction - Gets a function associated with a given object.
807e5c89e4eSSatish Balay 
8083f9fe445SBarry Smith    Logically Collective on PetscObject
809e5c89e4eSSatish Balay 
810e5c89e4eSSatish Balay    Input Parameters:
811e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
812e5c89e4eSSatish Balay          PetscObjectQueryFunction((PetscObject)ksp,...);
813e5c89e4eSSatish Balay -  name - name associated with the child function
814e5c89e4eSSatish Balay 
815e5c89e4eSSatish Balay    Output Parameter:
816e5c89e4eSSatish Balay .  ptr - function pointer
817e5c89e4eSSatish Balay 
818e5c89e4eSSatish Balay    Level: advanced
819e5c89e4eSSatish Balay 
820e5c89e4eSSatish Balay    Concepts: objects^composing functions
821e5c89e4eSSatish Balay    Concepts: composing functions
822e5c89e4eSSatish Balay    Concepts: functions^querying
823e5c89e4eSSatish Balay    Concepts: objects^querying
824e5c89e4eSSatish Balay    Concepts: querying objects
825e5c89e4eSSatish Balay 
826e5c89e4eSSatish Balay .seealso: PetscObjectComposeFunctionDynamic()
827e5c89e4eSSatish Balay @*/
8287087cfbeSBarry Smith PetscErrorCode  PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void))
829e5c89e4eSSatish Balay {
830e5c89e4eSSatish Balay   PetscErrorCode ierr;
831e5c89e4eSSatish Balay 
832e5c89e4eSSatish Balay   PetscFunctionBegin;
8333cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
8343cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
835e5c89e4eSSatish Balay   ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr);
836e5c89e4eSSatish Balay   PetscFunctionReturn(0);
837e5c89e4eSSatish Balay }
838e5c89e4eSSatish Balay 
839776b82aeSLisandro Dalcin struct _p_PetscContainer {
840e5c89e4eSSatish Balay   PETSCHEADER(int);
841e5c89e4eSSatish Balay   void           *ptr;
842e5c89e4eSSatish Balay   PetscErrorCode (*userdestroy)(void*);
843e5c89e4eSSatish Balay };
844e5c89e4eSSatish Balay 
845e5c89e4eSSatish Balay #undef __FUNCT__
846776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerGetPointer"
847e5c89e4eSSatish Balay /*@C
848776b82aeSLisandro Dalcin    PetscContainerGetPointer - Gets the pointer value contained in the container.
849e5c89e4eSSatish Balay 
8503f9fe445SBarry Smith    Not Collective
851e5c89e4eSSatish Balay 
852e5c89e4eSSatish Balay    Input Parameter:
853776b82aeSLisandro Dalcin .  obj - the object created with PetscContainerCreate()
854e5c89e4eSSatish Balay 
855e5c89e4eSSatish Balay    Output Parameter:
856e5c89e4eSSatish Balay .  ptr - the pointer value
857e5c89e4eSSatish Balay 
858e5c89e4eSSatish Balay    Level: advanced
859e5c89e4eSSatish Balay 
860776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
861776b82aeSLisandro Dalcin           PetscContainerSetPointer()
862e5c89e4eSSatish Balay @*/
8637087cfbeSBarry Smith PetscErrorCode  PetscContainerGetPointer(PetscContainer obj,void **ptr)
864e5c89e4eSSatish Balay {
865e5c89e4eSSatish Balay   PetscFunctionBegin;
8660700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
8673cfa8680SLisandro Dalcin   PetscValidPointer(ptr,2);
868e5c89e4eSSatish Balay   *ptr = obj->ptr;
869e5c89e4eSSatish Balay   PetscFunctionReturn(0);
870e5c89e4eSSatish Balay }
871e5c89e4eSSatish Balay 
872e5c89e4eSSatish Balay 
873e5c89e4eSSatish Balay #undef __FUNCT__
874776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetPointer"
875e5c89e4eSSatish Balay /*@C
876776b82aeSLisandro Dalcin    PetscContainerSetPointer - Sets the pointer value contained in the container.
877e5c89e4eSSatish Balay 
8783f9fe445SBarry Smith    Logically Collective on PetscContainer
879e5c89e4eSSatish Balay 
880e5c89e4eSSatish Balay    Input Parameters:
881776b82aeSLisandro Dalcin +  obj - the object created with PetscContainerCreate()
882e5c89e4eSSatish Balay -  ptr - the pointer value
883e5c89e4eSSatish Balay 
884e5c89e4eSSatish Balay    Level: advanced
885e5c89e4eSSatish Balay 
886776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
887776b82aeSLisandro Dalcin           PetscContainerGetPointer()
888e5c89e4eSSatish Balay @*/
8897087cfbeSBarry Smith PetscErrorCode  PetscContainerSetPointer(PetscContainer obj,void *ptr)
890e5c89e4eSSatish Balay {
891e5c89e4eSSatish Balay   PetscFunctionBegin;
8920700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
8933cfa8680SLisandro Dalcin   if (ptr) PetscValidPointer(ptr,2);
894e5c89e4eSSatish Balay   obj->ptr = ptr;
895e5c89e4eSSatish Balay   PetscFunctionReturn(0);
896e5c89e4eSSatish Balay }
897e5c89e4eSSatish Balay 
898e5c89e4eSSatish Balay #undef __FUNCT__
899776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerDestroy"
900e5c89e4eSSatish Balay /*@C
901776b82aeSLisandro Dalcin    PetscContainerDestroy - Destroys a PETSc container object.
902e5c89e4eSSatish Balay 
903776b82aeSLisandro Dalcin    Collective on PetscContainer
904e5c89e4eSSatish Balay 
905e5c89e4eSSatish Balay    Input Parameter:
906776b82aeSLisandro Dalcin .  obj - an object that was created with PetscContainerCreate()
907e5c89e4eSSatish Balay 
908e5c89e4eSSatish Balay    Level: advanced
909e5c89e4eSSatish Balay 
91077012dfaSBarry Smith .seealso: PetscContainerCreate(), PetscContainerSetUserDestroy()
911e5c89e4eSSatish Balay @*/
9126bf464f9SBarry Smith PetscErrorCode  PetscContainerDestroy(PetscContainer *obj)
913e5c89e4eSSatish Balay {
914e5c89e4eSSatish Balay   PetscErrorCode ierr;
9155fd66863SKarl Rupp 
916e5c89e4eSSatish Balay   PetscFunctionBegin;
9176bf464f9SBarry Smith   if (!*obj) PetscFunctionReturn(0);
9186bf464f9SBarry Smith   PetscValidHeaderSpecific(*obj,PETSC_CONTAINER_CLASSID,1);
919835d1d25SJed Brown   if (--((PetscObject)(*obj))->refct > 0) {*obj = 0; PetscFunctionReturn(0);}
9206bf464f9SBarry Smith   if ((*obj)->userdestroy) (*(*obj)->userdestroy)((*obj)->ptr);
921e5c89e4eSSatish Balay   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
922e5c89e4eSSatish Balay   PetscFunctionReturn(0);
923e5c89e4eSSatish Balay }
924e5c89e4eSSatish Balay 
925e5c89e4eSSatish Balay #undef __FUNCT__
926776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetUserDestroy"
927e5c89e4eSSatish Balay /*@C
928776b82aeSLisandro Dalcin    PetscContainerSetUserDestroy - Sets name of the user destroy function.
929e5c89e4eSSatish Balay 
9303f9fe445SBarry Smith    Logically Collective on PetscContainer
931e5c89e4eSSatish Balay 
932e5c89e4eSSatish Balay    Input Parameter:
933776b82aeSLisandro Dalcin +  obj - an object that was created with PetscContainerCreate()
934e5c89e4eSSatish Balay -  des - name of the user destroy function
935e5c89e4eSSatish Balay 
936e5c89e4eSSatish Balay    Level: advanced
937e5c89e4eSSatish Balay 
938776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy()
939e5c89e4eSSatish Balay @*/
9407087cfbeSBarry Smith PetscErrorCode  PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void*))
941e5c89e4eSSatish Balay {
942e5c89e4eSSatish Balay   PetscFunctionBegin;
9430700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
944e5c89e4eSSatish Balay   obj->userdestroy = des;
945e5c89e4eSSatish Balay   PetscFunctionReturn(0);
946e5c89e4eSSatish Balay }
947e5c89e4eSSatish Balay 
9487087cfbeSBarry Smith PetscClassId PETSC_CONTAINER_CLASSID;
949e5c89e4eSSatish Balay 
950e5c89e4eSSatish Balay #undef __FUNCT__
951776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerCreate"
952e5c89e4eSSatish Balay /*@C
953776b82aeSLisandro Dalcin    PetscContainerCreate - Creates a PETSc object that has room to hold
954e5c89e4eSSatish Balay    a single pointer. This allows one to attach any type of data (accessible
955e5c89e4eSSatish Balay    through a pointer) with the PetscObjectCompose() function to a PetscObject.
9563c0c59f3SBarry Smith    The data item itself is attached by a call to PetscContainerSetPointer().
957e5c89e4eSSatish Balay 
958e5c89e4eSSatish Balay    Collective on MPI_Comm
959e5c89e4eSSatish Balay 
960e5c89e4eSSatish Balay    Input Parameters:
961e5c89e4eSSatish Balay .  comm - MPI communicator that shares the object
962e5c89e4eSSatish Balay 
963e5c89e4eSSatish Balay    Output Parameters:
964e5c89e4eSSatish Balay .  container - the container created
965e5c89e4eSSatish Balay 
966e5c89e4eSSatish Balay    Level: advanced
967e5c89e4eSSatish Balay 
968776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy(), PetscContainerSetPointer(), PetscContainerGetPointer()
969e5c89e4eSSatish Balay @*/
9707087cfbeSBarry Smith PetscErrorCode  PetscContainerCreate(MPI_Comm comm,PetscContainer *container)
971e5c89e4eSSatish Balay {
972e5c89e4eSSatish Balay   PetscErrorCode ierr;
973776b82aeSLisandro Dalcin   PetscContainer contain;
974e5c89e4eSSatish Balay 
975e5c89e4eSSatish Balay   PetscFunctionBegin;
9763cfa8680SLisandro Dalcin   PetscValidPointer(container,2);
97767c2884eSBarry Smith   ierr = PetscHeaderCreate(contain,_p_PetscContainer,PetscInt,PETSC_CONTAINER_CLASSID,"PetscContainer","Container","Sys",comm,PetscContainerDestroy,0);CHKERRQ(ierr);
978e5c89e4eSSatish Balay   *container = contain;
979e5c89e4eSSatish Balay   PetscFunctionReturn(0);
980e5c89e4eSSatish Balay }
981e5c89e4eSSatish Balay 
982e5c89e4eSSatish Balay #undef __FUNCT__
983e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetFromOptions"
984e5c89e4eSSatish Balay /*@
985e5c89e4eSSatish Balay    PetscObjectSetFromOptions - Sets generic parameters from user options.
986e5c89e4eSSatish Balay 
987e5c89e4eSSatish Balay    Collective on obj
988e5c89e4eSSatish Balay 
989e5c89e4eSSatish Balay    Input Parameter:
990e5c89e4eSSatish Balay .  obj - the PetscObjcet
991e5c89e4eSSatish Balay 
992e5c89e4eSSatish Balay    Options Database Keys:
993e5c89e4eSSatish Balay 
994e5c89e4eSSatish Balay    Notes:
995e5c89e4eSSatish Balay    We have no generic options at present, so this does nothing
996e5c89e4eSSatish Balay 
997e5c89e4eSSatish Balay    Level: beginner
998e5c89e4eSSatish Balay 
999e5c89e4eSSatish Balay .keywords: set, options, database
1000e5c89e4eSSatish Balay .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix()
1001e5c89e4eSSatish Balay @*/
10027087cfbeSBarry Smith PetscErrorCode  PetscObjectSetFromOptions(PetscObject obj)
1003e5c89e4eSSatish Balay {
1004e5c89e4eSSatish Balay   PetscFunctionBegin;
10053cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
1006e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1007e5c89e4eSSatish Balay }
1008e5c89e4eSSatish Balay 
1009e5c89e4eSSatish Balay #undef __FUNCT__
1010e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetUp"
1011e5c89e4eSSatish Balay /*@
1012e5c89e4eSSatish Balay    PetscObjectSetUp - Sets up the internal data structures for the later use.
1013e5c89e4eSSatish Balay 
1014e5c89e4eSSatish Balay    Collective on PetscObject
1015e5c89e4eSSatish Balay 
1016e5c89e4eSSatish Balay    Input Parameters:
1017e5c89e4eSSatish Balay .  obj - the PetscObject
1018e5c89e4eSSatish Balay 
1019e5c89e4eSSatish Balay    Notes:
1020e5c89e4eSSatish Balay    This does nothing at present.
1021e5c89e4eSSatish Balay 
1022e5c89e4eSSatish Balay    Level: advanced
1023e5c89e4eSSatish Balay 
1024e5c89e4eSSatish Balay .keywords: setup
1025e5c89e4eSSatish Balay .seealso: PetscObjectDestroy()
1026e5c89e4eSSatish Balay @*/
10277087cfbeSBarry Smith PetscErrorCode  PetscObjectSetUp(PetscObject obj)
1028e5c89e4eSSatish Balay {
1029e5c89e4eSSatish Balay   PetscFunctionBegin;
10303cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
1031e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1032e5c89e4eSSatish Balay }
1033