xref: /petsc/src/sys/objects/inherit.c (revision e1e9505483b27f72b037cbb21afc3d9dad2e290c)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manipulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5c6db04a5SJed Brown #include <petscsys.h>  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
72eff7a51SBarry Smith PetscObject *PetscObjects = 0;
82eff7a51SBarry Smith PetscInt    PetscObjectsCounts = 0, PetscObjectsMaxCounts = 0;
92e82e6d1SBarry Smith 
1009573ac7SBarry Smith extern PetscErrorCode PetscObjectGetComm_Petsc(PetscObject,MPI_Comm *);
1109573ac7SBarry Smith extern PetscErrorCode PetscObjectCompose_Petsc(PetscObject,const char[],PetscObject);
1209573ac7SBarry Smith extern PetscErrorCode PetscObjectQuery_Petsc(PetscObject,const char[],PetscObject *);
1309573ac7SBarry Smith extern PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject,const char[],const char[],void (*)(void));
1409573ac7SBarry Smith extern PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject,const char[],void (**)(void));
15e5c89e4eSSatish Balay 
16e5c89e4eSSatish Balay #undef __FUNCT__
17e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderCreate_Private"
18e5c89e4eSSatish Balay /*
19e5c89e4eSSatish Balay    PetscHeaderCreate_Private - Creates a base PETSc object header and fills
20e5c89e4eSSatish Balay    in the default values.  Called by the macro PetscHeaderCreate().
21e5c89e4eSSatish Balay */
223194b578SJed Brown PetscErrorCode  PetscHeaderCreate_Private(PetscObject h,PetscClassId classid,PetscInt type,const char class_name[],const char descr[],const char mansec[],
233194b578SJed Brown                                           MPI_Comm comm,PetscErrorCode (*des)(PetscObject*),PetscErrorCode (*vie)(PetscObject,PetscViewer))
24e5c89e4eSSatish Balay {
25e5c89e4eSSatish Balay   static PetscInt idcnt = 1;
26e5c89e4eSSatish Balay   PetscErrorCode  ierr;
272e82e6d1SBarry Smith   PetscObject     *newPetscObjects;
282e82e6d1SBarry Smith   PetscInt         newPetscObjectsMaxCounts,i;
29e5c89e4eSSatish Balay 
30e5c89e4eSSatish Balay   PetscFunctionBegin;
310700a824SBarry Smith   h->classid                = classid;
32e5c89e4eSSatish Balay   h->type                   = type;
33e5c89e4eSSatish Balay   h->class_name             = (char*)class_name;
343194b578SJed Brown   h->description            = (char*)descr;
353194b578SJed Brown   h->mansec                 = (char*)mansec;
36e5c89e4eSSatish Balay   h->prefix                 = 0;
37e5c89e4eSSatish Balay   h->refct                  = 1;
38e5c89e4eSSatish Balay   h->amem                   = -1;
39e5c89e4eSSatish Balay   h->id                     = idcnt++;
40e5c89e4eSSatish Balay   h->parentid               = 0;
41e5c89e4eSSatish Balay   h->qlist                  = 0;
42e5c89e4eSSatish Balay   h->olist                  = 0;
43d3229121SJed Brown   h->precision              = (PetscPrecision) sizeof(PetscReal);
44e5c89e4eSSatish Balay   h->bops->destroy          = des;
45e5c89e4eSSatish Balay   h->bops->view             = vie;
46e5c89e4eSSatish Balay   h->bops->getcomm          = PetscObjectGetComm_Petsc;
47e5c89e4eSSatish Balay   h->bops->compose          = PetscObjectCompose_Petsc;
48e5c89e4eSSatish Balay   h->bops->query            = PetscObjectQuery_Petsc;
49e5c89e4eSSatish Balay   h->bops->composefunction  = PetscObjectComposeFunction_Petsc;
50e5c89e4eSSatish Balay   h->bops->queryfunction    = PetscObjectQueryFunction_Petsc;
51e5c89e4eSSatish Balay   ierr = PetscCommDuplicate(comm,&h->comm,&h->tag);CHKERRQ(ierr);
522e82e6d1SBarry Smith 
532e82e6d1SBarry Smith   /* Keep a record of object created */
542e82e6d1SBarry Smith   PetscObjectsCounts++;
552e82e6d1SBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
562e82e6d1SBarry Smith     if (!PetscObjects[i]) {
572e82e6d1SBarry Smith       PetscObjects[i] = h;
582e82e6d1SBarry Smith       PetscFunctionReturn(0);
592e82e6d1SBarry Smith     }
602e82e6d1SBarry Smith   }
612e82e6d1SBarry Smith   /* Need to increase the space for storing PETSc objects */
622e82e6d1SBarry Smith   if (!PetscObjectsMaxCounts) newPetscObjectsMaxCounts = 100;
632e82e6d1SBarry Smith   else                        newPetscObjectsMaxCounts = 2*PetscObjectsMaxCounts;
642e82e6d1SBarry Smith   ierr = PetscMalloc(newPetscObjectsMaxCounts*sizeof(PetscObject),&newPetscObjects);CHKERRQ(ierr);
652eff7a51SBarry Smith   ierr = PetscMemcpy(newPetscObjects,PetscObjects,PetscObjectsMaxCounts*sizeof(PetscObject));CHKERRQ(ierr);
662e82e6d1SBarry Smith   ierr = PetscMemzero(newPetscObjects+PetscObjectsMaxCounts,(newPetscObjectsMaxCounts - PetscObjectsMaxCounts)*sizeof(PetscObject));CHKERRQ(ierr);
672e82e6d1SBarry Smith   ierr = PetscFree(PetscObjects);CHKERRQ(ierr);
682e82e6d1SBarry Smith   PetscObjects                        = newPetscObjects;
692e82e6d1SBarry Smith   PetscObjects[PetscObjectsMaxCounts] = h;
702e82e6d1SBarry Smith   PetscObjectsMaxCounts               = newPetscObjectsMaxCounts;
712e82e6d1SBarry Smith 
72e5c89e4eSSatish Balay   PetscFunctionReturn(0);
73e5c89e4eSSatish Balay }
74e5c89e4eSSatish Balay 
75ace3abfcSBarry Smith extern PetscBool      PetscMemoryCollectMaximumUsage;
76e5c89e4eSSatish Balay extern PetscLogDouble PetscMemoryMaximumUsage;
77e5c89e4eSSatish Balay 
78e5c89e4eSSatish Balay #undef __FUNCT__
79e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderDestroy_Private"
80e5c89e4eSSatish Balay /*
81e5c89e4eSSatish Balay     PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by
82e5c89e4eSSatish Balay     the macro PetscHeaderDestroy().
83e5c89e4eSSatish Balay */
847087cfbeSBarry Smith PetscErrorCode  PetscHeaderDestroy_Private(PetscObject h)
85e5c89e4eSSatish Balay {
86e5c89e4eSSatish Balay   PetscErrorCode ierr;
872e82e6d1SBarry Smith   PetscInt       i;
88e5c89e4eSSatish Balay 
89e5c89e4eSSatish Balay   PetscFunctionBegin;
900defdb15SJed Brown   PetscValidHeader(h,1);
9192e62aa6SBarry Smith #if defined(PETSC_HAVE_AMS)
929fb22e1aSBarry Smith   if (PetscAMSPublishAll) {
93c457296dSBarry Smith     ierr = PetscObjectUnPublish((PetscObject)h);CHKERRQ(ierr);
9469590be7SBarry Smith   }
9592e62aa6SBarry Smith #endif
96e5c89e4eSSatish Balay   if (PetscMemoryCollectMaximumUsage) {
97e5c89e4eSSatish Balay     PetscLogDouble usage;
98e5c89e4eSSatish Balay     ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr);
99e5c89e4eSSatish Balay     if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage;
100e5c89e4eSSatish Balay   }
10108a557f7SLisandro Dalcin   /* first destroy things that could execute arbitrary code */
10208a557f7SLisandro Dalcin   if (h->python_destroy) {
10308a557f7SLisandro Dalcin     void           *python_context          = h->python_context;
10408a557f7SLisandro Dalcin     PetscErrorCode (*python_destroy)(void*) = h->python_destroy;
10508a557f7SLisandro Dalcin     h->python_context = 0;
10608a557f7SLisandro Dalcin     h->python_destroy = 0;
10708a557f7SLisandro Dalcin     ierr = (*python_destroy)(python_context);CHKERRQ(ierr);
10808a557f7SLisandro Dalcin   }
1096bf464f9SBarry Smith   ierr = PetscOListDestroy(&h->olist);CHKERRQ(ierr);
11008a557f7SLisandro Dalcin   ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr);
11108a557f7SLisandro Dalcin   /* next destroy other things */
1120700a824SBarry Smith   h->classid = PETSCFREEDHEADER;
11308a557f7SLisandro Dalcin   ierr = PetscFree(h->bops);CHKERRQ(ierr);
1141441b1d3SBarry Smith   ierr = PetscFListDestroy(&h->qlist);CHKERRQ(ierr);
115503cfb0cSBarry Smith   ierr = PetscFree(h->type_name);CHKERRQ(ierr);
116503cfb0cSBarry Smith   ierr = PetscFree(h->name);CHKERRQ(ierr);
117503cfb0cSBarry Smith   ierr = PetscFree(h->prefix);CHKERRQ(ierr);
118e5c89e4eSSatish Balay   ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr);
119f6291634SJed Brown   ierr = PetscFree(h->fortrancallback[PETSC_FORTRAN_CALLBACK_CLASS]);CHKERRQ(ierr);
120f6291634SJed Brown   ierr = PetscFree(h->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE]);CHKERRQ(ierr);
1212e82e6d1SBarry Smith 
1222e82e6d1SBarry Smith   /* Record object removal from list of all objects */
1232e82e6d1SBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
1242e82e6d1SBarry Smith     if (PetscObjects[i] == h) {
1252e82e6d1SBarry Smith       PetscObjects[i] = 0;
1262e82e6d1SBarry Smith       PetscObjectsCounts--;
1272e82e6d1SBarry Smith       break;
1282e82e6d1SBarry Smith     }
1292e82e6d1SBarry Smith   }
1302eff7a51SBarry Smith   if (!PetscObjectsCounts) {
1312e82e6d1SBarry Smith     ierr = PetscFree(PetscObjects);CHKERRQ(ierr);
1322e82e6d1SBarry Smith     PetscObjectsMaxCounts = 0;
1332e82e6d1SBarry Smith   }
134e5c89e4eSSatish Balay   PetscFunctionReturn(0);
135e5c89e4eSSatish Balay }
136e5c89e4eSSatish Balay 
137e5c89e4eSSatish Balay #undef __FUNCT__
1388cd211a4SJed Brown #define __FUNCT__ "PetscObjectCopyFortranFunctionPointers"
1398cd211a4SJed Brown /*@C
1408cd211a4SJed Brown    PetscObjectCopyFortranFunctionPointers - Copy function pointers to another object
1418cd211a4SJed Brown 
1428cd211a4SJed Brown    Logically Collective on PetscObject
1438cd211a4SJed Brown 
1448cd211a4SJed Brown    Input Parameter:
1458cd211a4SJed Brown +  src - source object
1468cd211a4SJed Brown -  dest - destination object
1478cd211a4SJed Brown 
1488cd211a4SJed Brown    Level: developer
1498cd211a4SJed Brown 
1508cd211a4SJed Brown    Note:
1518cd211a4SJed Brown    Both objects must have the same class.
1528cd211a4SJed Brown @*/
1538cd211a4SJed Brown PetscErrorCode PetscObjectCopyFortranFunctionPointers(PetscObject src,PetscObject dest)
1548cd211a4SJed Brown {
1558cd211a4SJed Brown   PetscErrorCode ierr;
156*e1e95054SJed Brown   PetscInt cbtype,numcb[PETSC_FORTRAN_CALLBACK_MAXTYPE];
1578cd211a4SJed Brown 
1588cd211a4SJed Brown   PetscFunctionBegin;
1598cd211a4SJed Brown   PetscValidHeader(src,1);
1608cd211a4SJed Brown   PetscValidHeader(dest,2);
1618cd211a4SJed Brown   if (src->classid != dest->classid) SETERRQ(src->comm,PETSC_ERR_ARG_INCOMP,"Objects must be of the same class");
1628cd211a4SJed Brown 
1638cd211a4SJed Brown   ierr = PetscFree(dest->fortran_func_pointers);CHKERRQ(ierr);
1648cd211a4SJed Brown   ierr = PetscMalloc(src->num_fortran_func_pointers*sizeof(void(*)(void)),&dest->fortran_func_pointers);CHKERRQ(ierr);
1658cd211a4SJed Brown   ierr = PetscMemcpy(dest->fortran_func_pointers,src->fortran_func_pointers,src->num_fortran_func_pointers*sizeof(void(*)(void)));CHKERRQ(ierr);
1668cd211a4SJed Brown   dest->num_fortran_func_pointers = src->num_fortran_func_pointers;
167f6291634SJed Brown 
168f6291634SJed Brown   ierr = PetscFortranCallbackGetSizes(src->classid,&numcb[PETSC_FORTRAN_CALLBACK_CLASS],&numcb[PETSC_FORTRAN_CALLBACK_SUBTYPE]);CHKERRQ(ierr);
169f6291634SJed Brown   for (cbtype=PETSC_FORTRAN_CALLBACK_CLASS; cbtype<PETSC_FORTRAN_CALLBACK_MAXTYPE; cbtype++) {
170f6291634SJed Brown     ierr = PetscFree(dest->fortrancallback[cbtype]);CHKERRQ(ierr);
171f6291634SJed Brown     ierr = PetscMalloc(numcb[cbtype]*sizeof(PetscFortranCallback),&dest->fortrancallback[cbtype]);CHKERRQ(ierr);
172f6291634SJed Brown     ierr = PetscMemzero(dest->fortrancallback[cbtype],numcb[cbtype]*sizeof(PetscFortranCallback));CHKERRQ(ierr);
173f6291634SJed Brown     ierr = PetscMemcpy(dest->fortrancallback[cbtype],src->fortrancallback[cbtype],src->num_fortrancallback[cbtype]*sizeof(PetscFortranCallback));CHKERRQ(ierr);
174f6291634SJed Brown   }
175f6291634SJed Brown   PetscFunctionReturn(0);
176f6291634SJed Brown }
177f6291634SJed Brown 
178f6291634SJed Brown #undef __FUNCT__
179f6291634SJed Brown #define __FUNCT__ "PetscObjectSetFortranCallback"
180de6d466bSJed Brown /*@C
181f6291634SJed Brown    PetscObjectSetFortranCallback - set fortran callback function pointer and context
182f6291634SJed Brown 
183f6291634SJed Brown    Logically Collective
184f6291634SJed Brown 
185f6291634SJed Brown    Input Arguments:
186f6291634SJed Brown +  obj - object on which to set callback
187f6291634SJed Brown .  cbtype - callback type (class or subtype)
188f6291634SJed Brown .  cid - address of callback Id, updated if not yet initialized (zero)
189f6291634SJed Brown .  func - Fortran function
190f6291634SJed Brown -  ctx - Fortran context
191f6291634SJed Brown 
192f6291634SJed Brown    Level: developer
193f6291634SJed Brown 
194f6291634SJed Brown .seealso: PetscObjectGetFortranCallback()
195f6291634SJed Brown @*/
196f6291634SJed Brown PetscErrorCode PetscObjectSetFortranCallback(PetscObject obj,PetscFortranCallbackType cbtype,PetscFortranCallbackId *cid,void (*func)(void),void *ctx)
197f6291634SJed Brown {
198f6291634SJed Brown   PetscErrorCode ierr;
199f6291634SJed Brown   const char *subtype = PETSC_NULL;
200f6291634SJed Brown 
201f6291634SJed Brown   PetscFunctionBegin;
202f6291634SJed Brown   PetscValidHeader(obj,1);
203f6291634SJed Brown   if (cbtype == PETSC_FORTRAN_CALLBACK_SUBTYPE) subtype = obj->type_name;
204f6291634SJed Brown   if (!*cid) {ierr = PetscFortranCallbackRegister(obj->classid,subtype,cid);CHKERRQ(ierr);}
205f6291634SJed Brown   if (*cid >= PETSC_SMALLEST_FORTRAN_CALLBACK+obj->num_fortrancallback[cbtype]) {
206f6291634SJed Brown     PetscInt oldnum = obj->num_fortrancallback[cbtype],newnum = PetscMax(1,2*oldnum);
207f6291634SJed Brown     PetscFortranCallback *callback;
208f6291634SJed Brown     ierr = PetscMalloc(newnum*sizeof(callback[0]),&callback);CHKERRQ(ierr);
209f6291634SJed Brown     ierr = PetscMemcpy(callback,obj->fortrancallback[cbtype],oldnum*sizeof(*obj->fortrancallback[cbtype]));CHKERRQ(ierr);
210f6291634SJed Brown     ierr = PetscFree(obj->fortrancallback[cbtype]);CHKERRQ(ierr);
211f6291634SJed Brown     obj->fortrancallback[cbtype] = callback;
212f6291634SJed Brown     obj->num_fortrancallback[cbtype] = newnum;
213f6291634SJed Brown   }
214f6291634SJed Brown   obj->fortrancallback[cbtype][*cid-PETSC_SMALLEST_FORTRAN_CALLBACK].func = func;
215f6291634SJed Brown   obj->fortrancallback[cbtype][*cid-PETSC_SMALLEST_FORTRAN_CALLBACK].ctx = ctx;
216f6291634SJed Brown   PetscFunctionReturn(0);
217f6291634SJed Brown }
218f6291634SJed Brown 
219f6291634SJed Brown #undef __FUNCT__
220f6291634SJed Brown #define __FUNCT__ "PetscObjectGetFortranCallback"
221de6d466bSJed Brown /*@C
222f6291634SJed Brown    PetscObjectGetFortranCallback - get fortran callback function pointer and context
223f6291634SJed Brown 
224f6291634SJed Brown    Logically Collective
225f6291634SJed Brown 
226f6291634SJed Brown    Input Arguments:
227f6291634SJed Brown +  obj - object on which to get callback
228f6291634SJed Brown .  cbtype - callback type
229f6291634SJed Brown -  cid - address of callback Id
230f6291634SJed Brown 
231f6291634SJed Brown    Output Arguments:
232f6291634SJed Brown +  func - Fortran function (or PETSC_NULL if not needed)
233f6291634SJed Brown -  ctx - Fortran context (or PETSC_NULL if not needed)
234f6291634SJed Brown 
235f6291634SJed Brown    Level: developer
236f6291634SJed Brown 
237f6291634SJed Brown .seealso: PetscObjectSetFortranCallback()
238f6291634SJed Brown @*/
239f6291634SJed Brown PetscErrorCode PetscObjectGetFortranCallback(PetscObject obj,PetscFortranCallbackType cbtype,PetscFortranCallbackId cid,void (**func)(void),void **ctx)
240f6291634SJed Brown {
241f6291634SJed Brown   PetscFortranCallback *cb;
242f6291634SJed Brown 
243f6291634SJed Brown   PetscFunctionBegin;
244f6291634SJed Brown   PetscValidHeader(obj,1);
245f6291634SJed Brown   PetscValidPointer(func,4);
246f6291634SJed Brown   if (PetscUnlikely(cid < PETSC_SMALLEST_FORTRAN_CALLBACK)) SETERRQ(obj->comm,PETSC_ERR_ARG_CORRUPT,"Fortran callback Id invalid");
247f6291634SJed 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");
248f6291634SJed Brown   cb = &obj->fortrancallback[cbtype][cid-PETSC_SMALLEST_FORTRAN_CALLBACK];
249f6291634SJed Brown   if (func) *func = cb->func;
250f6291634SJed Brown   if (ctx) *ctx = cb->ctx;
2518cd211a4SJed Brown   PetscFunctionReturn(0);
2528cd211a4SJed Brown }
2538cd211a4SJed Brown 
2548cd211a4SJed Brown #undef __FUNCT__
255a64a8e02SBarry Smith #define __FUNCT__ "PetscObjectsDump"
256a64a8e02SBarry Smith /*@C
257a64a8e02SBarry Smith    PetscObjectsDump - Prints the currently existing objects.
258a64a8e02SBarry Smith 
259a64a8e02SBarry Smith    Logically Collective on PetscViewer
260a64a8e02SBarry Smith 
261a64a8e02SBarry Smith    Input Parameter:
2627eb1d149SBarry Smith +  viewer - must be an PETSCVIEWERASCII viewer
2637eb1d149SBarry Smith -  all - by default only tries to display objects created explicitly by the user, if all is PETSC_TRUE then lists all outstanding objects
264a64a8e02SBarry Smith 
265a64a8e02SBarry Smith    Level: advanced
266a64a8e02SBarry Smith 
267a64a8e02SBarry Smith    Concepts: options database^printing
268a64a8e02SBarry Smith 
269a64a8e02SBarry Smith @*/
2707eb1d149SBarry Smith PetscErrorCode  PetscObjectsDump(FILE *fd,PetscBool all)
271a64a8e02SBarry Smith {
272a64a8e02SBarry Smith   PetscErrorCode ierr;
273f5351476SHong Zhang   PetscInt       i;
274f5351476SHong Zhang #if defined(PETSC_USE_DEBUG)
275f5351476SHong Zhang   PetscInt       j,k;
276f5351476SHong Zhang #endif
277a64a8e02SBarry Smith   PetscObject    h;
278a64a8e02SBarry Smith 
279a64a8e02SBarry Smith   PetscFunctionBegin;
280a64a8e02SBarry Smith   if (PetscObjectsCounts) {
281a2ea699eSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"The following objects were never freed\n");CHKERRQ(ierr);
282a2ea699eSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-----------------------------------------\n");CHKERRQ(ierr);
283a64a8e02SBarry Smith     for (i=0; i<PetscObjectsMaxCounts; i++) {
284a64a8e02SBarry Smith       if ((h = PetscObjects[i])) {
285a64a8e02SBarry Smith         ierr = PetscObjectName(h);CHKERRQ(ierr);
2862c9581d2SBarry Smith         {
287a64a8e02SBarry Smith #if defined(PETSC_USE_DEBUG)
288a64a8e02SBarry Smith         PetscStack *stack;
289719d7bfeSBarry Smith         char        *create,*rclass;
290a8d2bbe5SBarry Smith 
291a8d2bbe5SBarry Smith         /* if the PETSc function the user calls is not a create then this object was NOT directly created by them */
292a64a8e02SBarry Smith         ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr);
29368f616c8SBarry Smith         k = stack->currentsize-2;
2947eb1d149SBarry Smith         if (!all) {
29568f616c8SBarry Smith           k = 0;
29668f616c8SBarry Smith           while (!stack->petscroutine[k]) k++;
29768f616c8SBarry Smith           ierr = PetscStrstr(stack->function[k],"Create",&create);CHKERRQ(ierr);
29868f616c8SBarry Smith           if (!create) {
29968f616c8SBarry Smith             ierr = PetscStrstr(stack->function[k],"Get",&create);CHKERRQ(ierr);
30068f616c8SBarry Smith           }
301719d7bfeSBarry Smith           ierr = PetscStrstr(stack->function[k],h->class_name,&rclass);CHKERRQ(ierr);
3022c9581d2SBarry Smith 
3032c9581d2SBarry Smith           if (!create) continue;
304719d7bfeSBarry Smith           if (!rclass) continue;
3057eb1d149SBarry Smith         }
306a64a8e02SBarry Smith #endif
3072c9581d2SBarry Smith 
3082c9581d2SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"[%d] %s %s %s\n",PetscGlobalRank,h->class_name,h->type_name,h->name);CHKERRQ(ierr);
3092c9581d2SBarry Smith 
3102c9581d2SBarry Smith #if defined(PETSC_USE_DEBUG)
3112c9581d2SBarry Smith         ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr);
31268f616c8SBarry Smith         for (j=k; j>=0; j--) {
3132c9581d2SBarry Smith           fprintf(fd,"      [%d]  %s() in %s%s\n",PetscGlobalRank,stack->function[j],stack->directory[j],stack->file[j]);
3142c9581d2SBarry Smith         }
3152c9581d2SBarry Smith #endif
3162c9581d2SBarry Smith         }
317a64a8e02SBarry Smith       }
318a64a8e02SBarry Smith     }
319a64a8e02SBarry Smith   }
320a64a8e02SBarry Smith   PetscFunctionReturn(0);
321a64a8e02SBarry Smith }
322a64a8e02SBarry Smith 
323a64a8e02SBarry Smith 
324a64a8e02SBarry Smith #undef __FUNCT__
325c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsView"
326c139c21fSBarry Smith /*@C
327c139c21fSBarry Smith    PetscObjectsView - Prints the currently existing objects.
328c139c21fSBarry Smith 
329c139c21fSBarry Smith    Logically Collective on PetscViewer
330c139c21fSBarry Smith 
331c139c21fSBarry Smith    Input Parameter:
332c139c21fSBarry Smith .  viewer - must be an PETSCVIEWERASCII viewer
333c139c21fSBarry Smith 
334c139c21fSBarry Smith    Level: advanced
335c139c21fSBarry Smith 
336c139c21fSBarry Smith    Concepts: options database^printing
337c139c21fSBarry Smith 
338c139c21fSBarry Smith @*/
339c139c21fSBarry Smith PetscErrorCode  PetscObjectsView(PetscViewer viewer)
340c139c21fSBarry Smith {
341c139c21fSBarry Smith   PetscErrorCode ierr;
342c139c21fSBarry Smith   PetscBool      isascii;
343a64a8e02SBarry Smith   FILE           *fd;
344c139c21fSBarry Smith 
345c139c21fSBarry Smith   PetscFunctionBegin;
346c139c21fSBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
347251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
348c139c21fSBarry Smith   if (!isascii) SETERRQ(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Only supports ASCII viewer");
349a64a8e02SBarry Smith   ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr);
3507eb1d149SBarry Smith   ierr = PetscObjectsDump(fd,PETSC_TRUE);CHKERRQ(ierr);
351c139c21fSBarry Smith   PetscFunctionReturn(0);
352c139c21fSBarry Smith }
353c139c21fSBarry Smith 
354c139c21fSBarry Smith #undef __FUNCT__
355c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObject"
356c139c21fSBarry Smith /*@C
357c139c21fSBarry Smith    PetscObjectsGetObject - Get a pointer to a named object
358c139c21fSBarry Smith 
359c139c21fSBarry Smith    Not collective
360c139c21fSBarry Smith 
361c139c21fSBarry Smith    Input Parameter:
362c139c21fSBarry Smith .  name - the name of an object
363c139c21fSBarry Smith 
364c139c21fSBarry Smith    Output Parameter:
365c139c21fSBarry Smith .   obj - the object or null if there is no object
366c139c21fSBarry Smith 
367c139c21fSBarry Smith    Level: advanced
368c139c21fSBarry Smith 
369c139c21fSBarry Smith    Concepts: options database^printing
370c139c21fSBarry Smith 
371c139c21fSBarry Smith @*/
372c139c21fSBarry Smith PetscErrorCode  PetscObjectsGetObject(const char* name,PetscObject *obj,char **classname)
373c139c21fSBarry Smith {
374c139c21fSBarry Smith   PetscErrorCode ierr;
375c139c21fSBarry Smith   PetscInt       i;
376c139c21fSBarry Smith   PetscObject    h;
377c139c21fSBarry Smith   PetscBool      flg;
378c139c21fSBarry Smith 
379c139c21fSBarry Smith   PetscFunctionBegin;
380c139c21fSBarry Smith   *obj = PETSC_NULL;
381c139c21fSBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
382c139c21fSBarry Smith     if ((h = PetscObjects[i])) {
383c139c21fSBarry Smith       ierr = PetscObjectName(h);CHKERRQ(ierr);
384c139c21fSBarry Smith       ierr = PetscStrcmp(h->name,name,&flg);CHKERRQ(ierr);
385c139c21fSBarry Smith       if (flg) {
386c139c21fSBarry Smith         *obj = h;
387c139c21fSBarry Smith         if (classname) *classname = h->class_name;
388c139c21fSBarry Smith         PetscFunctionReturn(0);
389c139c21fSBarry Smith       }
390c139c21fSBarry Smith     }
391c139c21fSBarry Smith   }
392c139c21fSBarry Smith   PetscFunctionReturn(0);
393c139c21fSBarry Smith }
394c139c21fSBarry Smith 
395c139c21fSBarry Smith #undef __FUNCT__
396c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObjectMatlab"
397c139c21fSBarry Smith char* PetscObjectsGetObjectMatlab(const char* name,PetscObject *obj)
398c139c21fSBarry Smith {
399c139c21fSBarry Smith   PetscErrorCode ierr;
400c139c21fSBarry Smith   PetscInt       i;
401c139c21fSBarry Smith   PetscObject    h;
402c139c21fSBarry Smith   PetscBool      flg;
403c139c21fSBarry Smith 
404c139c21fSBarry Smith   PetscFunctionBegin;
405c139c21fSBarry Smith   *obj = PETSC_NULL;
406c139c21fSBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
407c139c21fSBarry Smith     if ((h = PetscObjects[i])) {
408c139c21fSBarry Smith       ierr = PetscObjectName(h);if (ierr) PetscFunctionReturn(0);
409c139c21fSBarry Smith       ierr = PetscStrcmp(h->name,name,&flg);if (ierr) PetscFunctionReturn(0);
410c139c21fSBarry Smith       if (flg) {
411c139c21fSBarry Smith         *obj = h;
412c139c21fSBarry Smith         PetscFunctionReturn(h->class_name);
413c139c21fSBarry Smith       }
414c139c21fSBarry Smith     }
415c139c21fSBarry Smith   }
416c139c21fSBarry Smith   PetscFunctionReturn(0);
417c139c21fSBarry Smith }
418c139c21fSBarry Smith 
419c139c21fSBarry Smith #undef __FUNCT__
420af272810SBarry Smith #define __FUNCT__ "PetscObjectAddOptionsHandler"
421af272810SBarry Smith /*@C
422af272810SBarry Smith     PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called.
423af272810SBarry Smith 
424af272810SBarry Smith     Not Collective
425af272810SBarry Smith 
426af272810SBarry Smith     Input Parameter:
427af272810SBarry Smith +   obj - the PETSc object
428af272810SBarry Smith .   handle - function that checks for options
429af272810SBarry Smith .   destroy - function to destroy context if provided
430af272810SBarry Smith -   ctx - optional context for check function
431af272810SBarry Smith 
432af272810SBarry Smith     Level: developer
433af272810SBarry Smith 
434af272810SBarry Smith 
435af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers()
436af272810SBarry Smith 
437af272810SBarry Smith @*/
4387087cfbeSBarry Smith PetscErrorCode  PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx)
439af272810SBarry Smith {
440af272810SBarry Smith   PetscFunctionBegin;
4410defdb15SJed Brown   PetscValidHeader(obj,1);
442af272810SBarry Smith   if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added");
443af272810SBarry Smith   obj->optionhandler[obj->noptionhandler]   = handle;
444af272810SBarry Smith   obj->optiondestroy[obj->noptionhandler]   = destroy;
445af272810SBarry Smith   obj->optionctx[obj->noptionhandler++]     = ctx;
446af272810SBarry Smith   PetscFunctionReturn(0);
447af272810SBarry Smith }
448af272810SBarry Smith 
449af272810SBarry Smith #undef __FUNCT__
450af272810SBarry Smith #define __FUNCT__ "PetscObjectProcessOptionsHandlers"
451af272810SBarry Smith /*@C
452db05f41bSBarry Smith     PetscObjectProcessOptionsHandlers - Calls all the options handlers attached to an object
453af272810SBarry Smith 
454af272810SBarry Smith     Not Collective
455af272810SBarry Smith 
456af272810SBarry Smith     Input Parameter:
457af272810SBarry Smith .   obj - the PETSc object
458af272810SBarry Smith 
459af272810SBarry Smith     Level: developer
460af272810SBarry Smith 
461af272810SBarry Smith 
462af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectDestroyOptionsHandlers()
463af272810SBarry Smith 
464af272810SBarry Smith @*/
4657087cfbeSBarry Smith PetscErrorCode  PetscObjectProcessOptionsHandlers(PetscObject obj)
466af272810SBarry Smith {
467af272810SBarry Smith   PetscInt       i;
468af272810SBarry Smith   PetscErrorCode ierr;
469af272810SBarry Smith 
470af272810SBarry Smith   PetscFunctionBegin;
4710defdb15SJed Brown   PetscValidHeader(obj,1);
472af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
473af272810SBarry Smith     ierr = (*obj->optionhandler[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
474af272810SBarry Smith   }
475af272810SBarry Smith   PetscFunctionReturn(0);
476af272810SBarry Smith }
477af272810SBarry Smith 
478af272810SBarry Smith #undef __FUNCT__
479af272810SBarry Smith #define __FUNCT__ "PetscObjectDestroyOptionsHandlers"
480af272810SBarry Smith /*@C
481af272810SBarry Smith     PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an objeft
482af272810SBarry Smith 
483af272810SBarry Smith     Not Collective
484af272810SBarry Smith 
485af272810SBarry Smith     Input Parameter:
486af272810SBarry Smith .   obj - the PETSc object
487af272810SBarry Smith 
488af272810SBarry Smith     Level: developer
489af272810SBarry Smith 
490af272810SBarry Smith 
491af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectProcessOptionsHandlers()
492af272810SBarry Smith 
493af272810SBarry Smith @*/
4947087cfbeSBarry Smith PetscErrorCode  PetscObjectDestroyOptionsHandlers(PetscObject obj)
495af272810SBarry Smith {
496af272810SBarry Smith   PetscInt       i;
497af272810SBarry Smith   PetscErrorCode ierr;
498af272810SBarry Smith 
499af272810SBarry Smith   PetscFunctionBegin;
5000defdb15SJed Brown   PetscValidHeader(obj,1);
501af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
502af272810SBarry Smith     ierr = (*obj->optiondestroy[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
503af272810SBarry Smith   }
504af272810SBarry Smith   obj->noptionhandler = 0;
505af272810SBarry Smith   PetscFunctionReturn(0);
506af272810SBarry Smith }
507af272810SBarry Smith 
508af272810SBarry Smith 
509af272810SBarry Smith #undef __FUNCT__
510e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectReference"
511ee978a2eSBarry Smith /*@
512e5c89e4eSSatish Balay    PetscObjectReference - Indicates to any PetscObject that it is being
513e5c89e4eSSatish Balay    referenced by another PetscObject. This increases the reference
514e5c89e4eSSatish Balay    count for that object by one.
515e5c89e4eSSatish Balay 
5163f9fe445SBarry Smith    Logically Collective on PetscObject
517e5c89e4eSSatish Balay 
518e5c89e4eSSatish Balay    Input Parameter:
519e5c89e4eSSatish Balay .  obj - the PETSc object. This must be cast with (PetscObject), for example,
520e5c89e4eSSatish Balay          PetscObjectReference((PetscObject)mat);
521e5c89e4eSSatish Balay 
522e5c89e4eSSatish Balay    Level: advanced
523e5c89e4eSSatish Balay 
524e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference()
525e5c89e4eSSatish Balay @*/
5267087cfbeSBarry Smith PetscErrorCode  PetscObjectReference(PetscObject obj)
527e5c89e4eSSatish Balay {
528e5c89e4eSSatish Balay   PetscFunctionBegin;
52952536dc3SBarry Smith   if (!obj) PetscFunctionReturn(0);
530e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
531e5c89e4eSSatish Balay   obj->refct++;
532e5c89e4eSSatish Balay   PetscFunctionReturn(0);
533e5c89e4eSSatish Balay }
534e5c89e4eSSatish Balay 
535e5c89e4eSSatish Balay #undef __FUNCT__
536e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetReference"
537ee978a2eSBarry Smith /*@
538e5c89e4eSSatish Balay    PetscObjectGetReference - Gets the current reference count for
539e5c89e4eSSatish Balay    any PETSc object.
540e5c89e4eSSatish Balay 
541e5c89e4eSSatish Balay    Not Collective
542e5c89e4eSSatish Balay 
543e5c89e4eSSatish Balay    Input Parameter:
544e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
545e5c89e4eSSatish Balay          PetscObjectGetReference((PetscObject)mat,&cnt);
546e5c89e4eSSatish Balay 
547e5c89e4eSSatish Balay    Output Parameter:
548e5c89e4eSSatish Balay .  cnt - the reference count
549e5c89e4eSSatish Balay 
550e5c89e4eSSatish Balay    Level: advanced
551e5c89e4eSSatish Balay 
552e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference()
553e5c89e4eSSatish Balay @*/
5547087cfbeSBarry Smith PetscErrorCode  PetscObjectGetReference(PetscObject obj,PetscInt *cnt)
555e5c89e4eSSatish Balay {
556e5c89e4eSSatish Balay   PetscFunctionBegin;
557e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
558e5c89e4eSSatish Balay   PetscValidIntPointer(cnt,2);
559e5c89e4eSSatish Balay   *cnt = obj->refct;
560e5c89e4eSSatish Balay   PetscFunctionReturn(0);
561e5c89e4eSSatish Balay }
562e5c89e4eSSatish Balay 
563e5c89e4eSSatish Balay #undef __FUNCT__
564e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDereference"
565e5c89e4eSSatish Balay /*@
566e5c89e4eSSatish Balay    PetscObjectDereference - Indicates to any PetscObject that it is being
567e5c89e4eSSatish Balay    referenced by one less PetscObject. This decreases the reference
568e5c89e4eSSatish Balay    count for that object by one.
569e5c89e4eSSatish Balay 
5703f9fe445SBarry Smith    Collective on PetscObject if reference reaches 0 otherwise Logically Collective
571e5c89e4eSSatish Balay 
572e5c89e4eSSatish Balay    Input Parameter:
573e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
574e5c89e4eSSatish Balay          PetscObjectDereference((PetscObject)mat);
575e5c89e4eSSatish Balay 
5766bf464f9SBarry Smith    Notes: PetscObjectDestroy(PetscObject *obj)  sets the obj pointer to null after the call, this routine does not.
5776bf464f9SBarry Smith 
578e5c89e4eSSatish Balay    Level: advanced
579e5c89e4eSSatish Balay 
580e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectReference()
581e5c89e4eSSatish Balay @*/
5827087cfbeSBarry Smith PetscErrorCode  PetscObjectDereference(PetscObject obj)
583e5c89e4eSSatish Balay {
584e5c89e4eSSatish Balay   PetscErrorCode ierr;
585e5c89e4eSSatish Balay 
586e5c89e4eSSatish Balay   PetscFunctionBegin;
587e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
588e5c89e4eSSatish Balay   if (obj->bops->destroy) {
5896bf464f9SBarry Smith     ierr = (*obj->bops->destroy)(&obj);CHKERRQ(ierr);
590f7923d8aSBarry Smith   } else if (!--obj->refct) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine");
591e5c89e4eSSatish Balay   PetscFunctionReturn(0);
592e5c89e4eSSatish Balay }
593e5c89e4eSSatish Balay 
594e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */
595e5c89e4eSSatish Balay /*
596e5c89e4eSSatish Balay      The following routines are the versions private to the PETSc object
597e5c89e4eSSatish Balay      data structures.
598e5c89e4eSSatish Balay */
599e5c89e4eSSatish Balay #undef __FUNCT__
600e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetComm_Petsc"
601e5c89e4eSSatish Balay PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm)
602e5c89e4eSSatish Balay {
603e5c89e4eSSatish Balay   PetscFunctionBegin;
6040defdb15SJed Brown   PetscValidHeader(obj,1);
605e5c89e4eSSatish Balay   *comm = obj->comm;
606e5c89e4eSSatish Balay   PetscFunctionReturn(0);
607e5c89e4eSSatish Balay }
608e5c89e4eSSatish Balay 
609e5c89e4eSSatish Balay #undef __FUNCT__
6106ba4bc90SBarry Smith #define __FUNCT__ "PetscObjectRemoveReference"
6116ba4bc90SBarry Smith PetscErrorCode PetscObjectRemoveReference(PetscObject obj,const char name[])
6126ba4bc90SBarry Smith {
6136ba4bc90SBarry Smith   PetscErrorCode ierr;
6146ba4bc90SBarry Smith 
6156ba4bc90SBarry Smith   PetscFunctionBegin;
6160defdb15SJed Brown   PetscValidHeader(obj,1);
6176ba4bc90SBarry Smith   ierr = PetscOListRemoveReference(&obj->olist,name);CHKERRQ(ierr);
6186ba4bc90SBarry Smith   PetscFunctionReturn(0);
6196ba4bc90SBarry Smith }
6206ba4bc90SBarry Smith 
6216ba4bc90SBarry Smith #undef __FUNCT__
622e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose_Petsc"
623e5c89e4eSSatish Balay PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr)
624e5c89e4eSSatish Balay {
625e5c89e4eSSatish Balay   PetscErrorCode ierr;
626e5c89e4eSSatish Balay   char           *tname;
627bfec8eecSBarry Smith   PetscBool      skipreference;
628e5c89e4eSSatish Balay 
629e5c89e4eSSatish Balay   PetscFunctionBegin;
630e5c89e4eSSatish Balay   if (ptr) {
631bfec8eecSBarry Smith     ierr = PetscOListReverseFind(ptr->olist,obj,&tname,&skipreference);CHKERRQ(ierr);
632f851cb64SDmitry 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");
633e5c89e4eSSatish Balay   }
634e5c89e4eSSatish Balay   ierr = PetscOListAdd(&obj->olist,name,ptr);CHKERRQ(ierr);
635e5c89e4eSSatish Balay   PetscFunctionReturn(0);
636e5c89e4eSSatish Balay }
637e5c89e4eSSatish Balay 
638e5c89e4eSSatish Balay #undef __FUNCT__
639e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery_Petsc"
640e5c89e4eSSatish Balay PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr)
641e5c89e4eSSatish Balay {
642e5c89e4eSSatish Balay   PetscErrorCode ierr;
643e5c89e4eSSatish Balay 
644e5c89e4eSSatish Balay   PetscFunctionBegin;
6450defdb15SJed Brown   PetscValidHeader(obj,1);
646e5c89e4eSSatish Balay   ierr = PetscOListFind(obj->olist,name,ptr);CHKERRQ(ierr);
647e5c89e4eSSatish Balay   PetscFunctionReturn(0);
648e5c89e4eSSatish Balay }
649e5c89e4eSSatish Balay 
650e5c89e4eSSatish Balay #undef __FUNCT__
651e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction_Petsc"
652e5c89e4eSSatish Balay PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
653e5c89e4eSSatish Balay {
654e5c89e4eSSatish Balay   PetscErrorCode ierr;
655e5c89e4eSSatish Balay 
656e5c89e4eSSatish Balay   PetscFunctionBegin;
6570defdb15SJed Brown   PetscValidHeader(obj,1);
658e5c89e4eSSatish Balay   ierr = PetscFListAdd(&obj->qlist,name,fname,ptr);CHKERRQ(ierr);
659e5c89e4eSSatish Balay   PetscFunctionReturn(0);
660e5c89e4eSSatish Balay }
661e5c89e4eSSatish Balay 
662e5c89e4eSSatish Balay #undef __FUNCT__
663e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction_Petsc"
664e5c89e4eSSatish Balay PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void))
665e5c89e4eSSatish Balay {
666e5c89e4eSSatish Balay   PetscErrorCode ierr;
667e5c89e4eSSatish Balay 
668e5c89e4eSSatish Balay   PetscFunctionBegin;
6690defdb15SJed Brown   PetscValidHeader(obj,1);
6704b91b6eaSBarry Smith   ierr = PetscFListFind(obj->qlist,obj->comm,name,PETSC_FALSE,ptr);CHKERRQ(ierr);
671e5c89e4eSSatish Balay   PetscFunctionReturn(0);
672e5c89e4eSSatish Balay }
673e5c89e4eSSatish Balay 
674e5c89e4eSSatish Balay #undef __FUNCT__
675e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose"
676e5c89e4eSSatish Balay /*@C
677e5c89e4eSSatish Balay    PetscObjectCompose - Associates another PETSc object with a given PETSc object.
678e5c89e4eSSatish Balay 
679e5c89e4eSSatish Balay    Not Collective
680e5c89e4eSSatish Balay 
681e5c89e4eSSatish Balay    Input Parameters:
682e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
683e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
684e5c89e4eSSatish Balay .  name - name associated with the child object
685e5c89e4eSSatish Balay -  ptr - the other PETSc object to associate with the PETSc object; this must also be
686e5c89e4eSSatish Balay          cast with (PetscObject)
687e5c89e4eSSatish Balay 
688e5c89e4eSSatish Balay    Level: advanced
689e5c89e4eSSatish Balay 
690e5c89e4eSSatish Balay    Notes:
691e5c89e4eSSatish Balay    The second objects reference count is automatically increased by one when it is
692e5c89e4eSSatish Balay    composed.
693e5c89e4eSSatish Balay 
694e5c89e4eSSatish Balay    Replaces any previous object that had the same name.
695e5c89e4eSSatish Balay 
696e5c89e4eSSatish Balay    If ptr is null and name has previously been composed using an object, then that
697e5c89e4eSSatish Balay    entry is removed from the obj.
698e5c89e4eSSatish Balay 
699e5c89e4eSSatish Balay    PetscObjectCompose() can be used with any PETSc object (such as
700e5c89e4eSSatish Balay    Mat, Vec, KSP, SNES, etc.) or any user-provided object.  See
701776b82aeSLisandro Dalcin    PetscContainerCreate() for info on how to create an object from a
702e5c89e4eSSatish Balay    user-provided pointer that may then be composed with PETSc objects.
703e5c89e4eSSatish Balay 
704e5c89e4eSSatish Balay    Concepts: objects^composing
705e5c89e4eSSatish Balay    Concepts: composing objects
706e5c89e4eSSatish Balay 
707776b82aeSLisandro Dalcin .seealso: PetscObjectQuery(), PetscContainerCreate()
708e5c89e4eSSatish Balay @*/
7097087cfbeSBarry Smith PetscErrorCode  PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr)
710e5c89e4eSSatish Balay {
711e5c89e4eSSatish Balay   PetscErrorCode ierr;
712e5c89e4eSSatish Balay 
713e5c89e4eSSatish Balay   PetscFunctionBegin;
7143cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7153cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
7163cfa8680SLisandro Dalcin   if (ptr) PetscValidHeader(ptr,3);
717e5c89e4eSSatish Balay   ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr);
718e5c89e4eSSatish Balay   PetscFunctionReturn(0);
719e5c89e4eSSatish Balay }
720e5c89e4eSSatish Balay 
72158b60935SBarry Smith #undef __FUNCT__
72258b60935SBarry Smith #define __FUNCT__ "PetscObjectSetPrecision"
72358b60935SBarry Smith /*@C
72458b60935SBarry Smith    PetscObjectSetPrecision - sets the precision used within a given object.
7259f8a2776SDmitry Karpeev 
72658b60935SBarry Smith    Collective on the PetscObject
72758b60935SBarry Smith 
72858b60935SBarry Smith    Input Parameters:
72958b60935SBarry Smith +  obj - the PETSc object; this must be cast with (PetscObject), for example,
73058b60935SBarry Smith          PetscObjectCompose((PetscObject)mat,...);
73158b60935SBarry Smith -  precision - the precision
73258b60935SBarry Smith 
73358b60935SBarry Smith    Level: advanced
73458b60935SBarry Smith 
73558b60935SBarry Smith .seealso: PetscObjectQuery(), PetscContainerCreate()
73658b60935SBarry Smith @*/
7377087cfbeSBarry Smith PetscErrorCode  PetscObjectSetPrecision(PetscObject obj,PetscPrecision precision)
73858b60935SBarry Smith {
73958b60935SBarry Smith   PetscFunctionBegin;
74058b60935SBarry Smith   PetscValidHeader(obj,1);
74158b60935SBarry Smith   obj->precision = precision;
74258b60935SBarry Smith   PetscFunctionReturn(0);
74358b60935SBarry Smith }
7449f8a2776SDmitry Karpeev 
745e5c89e4eSSatish Balay #undef __FUNCT__
746e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery"
747e5c89e4eSSatish Balay /*@C
748e5c89e4eSSatish Balay    PetscObjectQuery  - Gets a PETSc object associated with a given object.
749e5c89e4eSSatish Balay 
750e5c89e4eSSatish Balay    Not Collective
751e5c89e4eSSatish Balay 
752e5c89e4eSSatish Balay    Input Parameters:
753e5c89e4eSSatish Balay +  obj - the PETSc object
754e5c89e4eSSatish Balay          Thus must be cast with a (PetscObject), for example,
755e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
756e5c89e4eSSatish Balay .  name - name associated with child object
7573c0c59f3SBarry Smith -  ptr - the other PETSc object associated with the PETSc object, this must be
7583c0c59f3SBarry Smith          cast with (PetscObject *)
759e5c89e4eSSatish Balay 
760e5c89e4eSSatish Balay    Level: advanced
761e5c89e4eSSatish Balay 
7623c0c59f3SBarry Smith    The reference count of neither object is increased in this call
7633c0c59f3SBarry Smith 
764e5c89e4eSSatish Balay    Concepts: objects^composing
765e5c89e4eSSatish Balay    Concepts: composing objects
766e5c89e4eSSatish Balay    Concepts: objects^querying
767e5c89e4eSSatish Balay    Concepts: querying objects
768e5c89e4eSSatish Balay 
76988674abaSJed Brown .seealso: PetscObjectCompose()
770e5c89e4eSSatish Balay @*/
7717087cfbeSBarry Smith PetscErrorCode  PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr)
772e5c89e4eSSatish Balay {
773e5c89e4eSSatish Balay   PetscErrorCode ierr;
774e5c89e4eSSatish Balay 
775e5c89e4eSSatish Balay   PetscFunctionBegin;
7763cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7773cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
7783cfa8680SLisandro Dalcin   PetscValidPointer(ptr,3);
779e5c89e4eSSatish Balay   ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr);
780e5c89e4eSSatish Balay   PetscFunctionReturn(0);
781e5c89e4eSSatish Balay }
782e5c89e4eSSatish Balay 
783e5c89e4eSSatish Balay #undef __FUNCT__
784e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction"
7857087cfbeSBarry Smith PetscErrorCode  PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
786e5c89e4eSSatish Balay {
787e5c89e4eSSatish Balay   PetscErrorCode ierr;
788e5c89e4eSSatish Balay 
789e5c89e4eSSatish Balay   PetscFunctionBegin;
7903cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7913cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
792e5c89e4eSSatish Balay   ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr);
793e5c89e4eSSatish Balay   PetscFunctionReturn(0);
794e5c89e4eSSatish Balay }
795e5c89e4eSSatish Balay 
796e5c89e4eSSatish Balay #undef __FUNCT__
797e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction"
798e5c89e4eSSatish Balay /*@C
799e5c89e4eSSatish Balay    PetscObjectQueryFunction - Gets a function associated with a given object.
800e5c89e4eSSatish Balay 
8013f9fe445SBarry Smith    Logically Collective on PetscObject
802e5c89e4eSSatish Balay 
803e5c89e4eSSatish Balay    Input Parameters:
804e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
805e5c89e4eSSatish Balay          PetscObjectQueryFunction((PetscObject)ksp,...);
806e5c89e4eSSatish Balay -  name - name associated with the child function
807e5c89e4eSSatish Balay 
808e5c89e4eSSatish Balay    Output Parameter:
809e5c89e4eSSatish Balay .  ptr - function pointer
810e5c89e4eSSatish Balay 
811e5c89e4eSSatish Balay    Level: advanced
812e5c89e4eSSatish Balay 
813e5c89e4eSSatish Balay    Concepts: objects^composing functions
814e5c89e4eSSatish Balay    Concepts: composing functions
815e5c89e4eSSatish Balay    Concepts: functions^querying
816e5c89e4eSSatish Balay    Concepts: objects^querying
817e5c89e4eSSatish Balay    Concepts: querying objects
818e5c89e4eSSatish Balay 
819e5c89e4eSSatish Balay .seealso: PetscObjectComposeFunctionDynamic()
820e5c89e4eSSatish Balay @*/
8217087cfbeSBarry Smith PetscErrorCode  PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void))
822e5c89e4eSSatish Balay {
823e5c89e4eSSatish Balay   PetscErrorCode ierr;
824e5c89e4eSSatish Balay 
825e5c89e4eSSatish Balay   PetscFunctionBegin;
8263cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
8273cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
828e5c89e4eSSatish Balay   ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr);
829e5c89e4eSSatish Balay   PetscFunctionReturn(0);
830e5c89e4eSSatish Balay }
831e5c89e4eSSatish Balay 
832776b82aeSLisandro Dalcin struct _p_PetscContainer {
833e5c89e4eSSatish Balay   PETSCHEADER(int);
834e5c89e4eSSatish Balay   void   *ptr;
835e5c89e4eSSatish Balay   PetscErrorCode (*userdestroy)(void*);
836e5c89e4eSSatish Balay };
837e5c89e4eSSatish Balay 
838e5c89e4eSSatish Balay #undef __FUNCT__
839776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerGetPointer"
840e5c89e4eSSatish Balay /*@C
841776b82aeSLisandro Dalcin    PetscContainerGetPointer - Gets the pointer value contained in the container.
842e5c89e4eSSatish Balay 
8433f9fe445SBarry Smith    Not Collective
844e5c89e4eSSatish Balay 
845e5c89e4eSSatish Balay    Input Parameter:
846776b82aeSLisandro Dalcin .  obj - the object created with PetscContainerCreate()
847e5c89e4eSSatish Balay 
848e5c89e4eSSatish Balay    Output Parameter:
849e5c89e4eSSatish Balay .  ptr - the pointer value
850e5c89e4eSSatish Balay 
851e5c89e4eSSatish Balay    Level: advanced
852e5c89e4eSSatish Balay 
853776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
854776b82aeSLisandro Dalcin           PetscContainerSetPointer()
855e5c89e4eSSatish Balay @*/
8567087cfbeSBarry Smith PetscErrorCode  PetscContainerGetPointer(PetscContainer obj,void **ptr)
857e5c89e4eSSatish Balay {
858e5c89e4eSSatish Balay   PetscFunctionBegin;
8590700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
8603cfa8680SLisandro Dalcin   PetscValidPointer(ptr,2);
861e5c89e4eSSatish Balay   *ptr = obj->ptr;
862e5c89e4eSSatish Balay   PetscFunctionReturn(0);
863e5c89e4eSSatish Balay }
864e5c89e4eSSatish Balay 
865e5c89e4eSSatish Balay 
866e5c89e4eSSatish Balay #undef __FUNCT__
867776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetPointer"
868e5c89e4eSSatish Balay /*@C
869776b82aeSLisandro Dalcin    PetscContainerSetPointer - Sets the pointer value contained in the container.
870e5c89e4eSSatish Balay 
8713f9fe445SBarry Smith    Logically Collective on PetscContainer
872e5c89e4eSSatish Balay 
873e5c89e4eSSatish Balay    Input Parameters:
874776b82aeSLisandro Dalcin +  obj - the object created with PetscContainerCreate()
875e5c89e4eSSatish Balay -  ptr - the pointer value
876e5c89e4eSSatish Balay 
877e5c89e4eSSatish Balay    Level: advanced
878e5c89e4eSSatish Balay 
879776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
880776b82aeSLisandro Dalcin           PetscContainerGetPointer()
881e5c89e4eSSatish Balay @*/
8827087cfbeSBarry Smith PetscErrorCode  PetscContainerSetPointer(PetscContainer obj,void *ptr)
883e5c89e4eSSatish Balay {
884e5c89e4eSSatish Balay   PetscFunctionBegin;
8850700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
8863cfa8680SLisandro Dalcin   if (ptr) PetscValidPointer(ptr,2);
887e5c89e4eSSatish Balay   obj->ptr = ptr;
888e5c89e4eSSatish Balay   PetscFunctionReturn(0);
889e5c89e4eSSatish Balay }
890e5c89e4eSSatish Balay 
891e5c89e4eSSatish Balay #undef __FUNCT__
892776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerDestroy"
893e5c89e4eSSatish Balay /*@C
894776b82aeSLisandro Dalcin    PetscContainerDestroy - Destroys a PETSc container object.
895e5c89e4eSSatish Balay 
896776b82aeSLisandro Dalcin    Collective on PetscContainer
897e5c89e4eSSatish Balay 
898e5c89e4eSSatish Balay    Input Parameter:
899776b82aeSLisandro Dalcin .  obj - an object that was created with PetscContainerCreate()
900e5c89e4eSSatish Balay 
901e5c89e4eSSatish Balay    Level: advanced
902e5c89e4eSSatish Balay 
90377012dfaSBarry Smith .seealso: PetscContainerCreate(), PetscContainerSetUserDestroy()
904e5c89e4eSSatish Balay @*/
9056bf464f9SBarry Smith PetscErrorCode  PetscContainerDestroy(PetscContainer *obj)
906e5c89e4eSSatish Balay {
907e5c89e4eSSatish Balay   PetscErrorCode ierr;
908e5c89e4eSSatish Balay   PetscFunctionBegin;
9096bf464f9SBarry Smith   if (!*obj) PetscFunctionReturn(0);
9106bf464f9SBarry Smith   PetscValidHeaderSpecific(*obj,PETSC_CONTAINER_CLASSID,1);
911835d1d25SJed Brown   if (--((PetscObject)(*obj))->refct > 0) {*obj = 0; PetscFunctionReturn(0);}
9126bf464f9SBarry Smith   if ((*obj)->userdestroy) (*(*obj)->userdestroy)((*obj)->ptr);
913e5c89e4eSSatish Balay   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
914e5c89e4eSSatish Balay   PetscFunctionReturn(0);
915e5c89e4eSSatish Balay }
916e5c89e4eSSatish Balay 
917e5c89e4eSSatish Balay #undef __FUNCT__
918776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetUserDestroy"
919e5c89e4eSSatish Balay /*@C
920776b82aeSLisandro Dalcin    PetscContainerSetUserDestroy - Sets name of the user destroy function.
921e5c89e4eSSatish Balay 
9223f9fe445SBarry Smith    Logically Collective on PetscContainer
923e5c89e4eSSatish Balay 
924e5c89e4eSSatish Balay    Input Parameter:
925776b82aeSLisandro Dalcin +  obj - an object that was created with PetscContainerCreate()
926e5c89e4eSSatish Balay -  des - name of the user destroy function
927e5c89e4eSSatish Balay 
928e5c89e4eSSatish Balay    Level: advanced
929e5c89e4eSSatish Balay 
930776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy()
931e5c89e4eSSatish Balay @*/
9327087cfbeSBarry Smith PetscErrorCode  PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void*))
933e5c89e4eSSatish Balay {
934e5c89e4eSSatish Balay   PetscFunctionBegin;
9350700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
936e5c89e4eSSatish Balay   obj->userdestroy = des;
937e5c89e4eSSatish Balay   PetscFunctionReturn(0);
938e5c89e4eSSatish Balay }
939e5c89e4eSSatish Balay 
9407087cfbeSBarry Smith PetscClassId  PETSC_CONTAINER_CLASSID;
941e5c89e4eSSatish Balay 
942e5c89e4eSSatish Balay #undef __FUNCT__
943776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerCreate"
944e5c89e4eSSatish Balay /*@C
945776b82aeSLisandro Dalcin    PetscContainerCreate - Creates a PETSc object that has room to hold
946e5c89e4eSSatish Balay    a single pointer. This allows one to attach any type of data (accessible
947e5c89e4eSSatish Balay    through a pointer) with the PetscObjectCompose() function to a PetscObject.
9483c0c59f3SBarry Smith    The data item itself is attached by a call to PetscContainerSetPointer().
949e5c89e4eSSatish Balay 
950e5c89e4eSSatish Balay    Collective on MPI_Comm
951e5c89e4eSSatish Balay 
952e5c89e4eSSatish Balay    Input Parameters:
953e5c89e4eSSatish Balay .  comm - MPI communicator that shares the object
954e5c89e4eSSatish Balay 
955e5c89e4eSSatish Balay    Output Parameters:
956e5c89e4eSSatish Balay .  container - the container created
957e5c89e4eSSatish Balay 
958e5c89e4eSSatish Balay    Level: advanced
959e5c89e4eSSatish Balay 
960776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy(), PetscContainerSetPointer(), PetscContainerGetPointer()
961e5c89e4eSSatish Balay @*/
9627087cfbeSBarry Smith PetscErrorCode  PetscContainerCreate(MPI_Comm comm,PetscContainer *container)
963e5c89e4eSSatish Balay {
964e5c89e4eSSatish Balay   PetscErrorCode ierr;
965776b82aeSLisandro Dalcin   PetscContainer contain;
966e5c89e4eSSatish Balay 
967e5c89e4eSSatish Balay   PetscFunctionBegin;
9683cfa8680SLisandro Dalcin   PetscValidPointer(container,2);
9693194b578SJed Brown   ierr = PetscHeaderCreate(contain,_p_PetscContainer,PetscInt,PETSC_CONTAINER_CLASSID,0,"PetscContainer","Container","Sys",comm,PetscContainerDestroy,0);CHKERRQ(ierr);
970e5c89e4eSSatish Balay   *container = contain;
971e5c89e4eSSatish Balay   PetscFunctionReturn(0);
972e5c89e4eSSatish Balay }
973e5c89e4eSSatish Balay 
974e5c89e4eSSatish Balay #undef __FUNCT__
975e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetFromOptions"
976e5c89e4eSSatish Balay /*@
977e5c89e4eSSatish Balay    PetscObjectSetFromOptions - Sets generic parameters from user options.
978e5c89e4eSSatish Balay 
979e5c89e4eSSatish Balay    Collective on obj
980e5c89e4eSSatish Balay 
981e5c89e4eSSatish Balay    Input Parameter:
982e5c89e4eSSatish Balay .  obj - the PetscObjcet
983e5c89e4eSSatish Balay 
984e5c89e4eSSatish Balay    Options Database Keys:
985e5c89e4eSSatish Balay 
986e5c89e4eSSatish Balay    Notes:
987e5c89e4eSSatish Balay    We have no generic options at present, so this does nothing
988e5c89e4eSSatish Balay 
989e5c89e4eSSatish Balay    Level: beginner
990e5c89e4eSSatish Balay 
991e5c89e4eSSatish Balay .keywords: set, options, database
992e5c89e4eSSatish Balay .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix()
993e5c89e4eSSatish Balay @*/
9947087cfbeSBarry Smith PetscErrorCode  PetscObjectSetFromOptions(PetscObject obj)
995e5c89e4eSSatish Balay {
996e5c89e4eSSatish Balay   PetscFunctionBegin;
9973cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
998e5c89e4eSSatish Balay   PetscFunctionReturn(0);
999e5c89e4eSSatish Balay }
1000e5c89e4eSSatish Balay 
1001e5c89e4eSSatish Balay #undef __FUNCT__
1002e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetUp"
1003e5c89e4eSSatish Balay /*@
1004e5c89e4eSSatish Balay    PetscObjectSetUp - Sets up the internal data structures for the later use.
1005e5c89e4eSSatish Balay 
1006e5c89e4eSSatish Balay    Collective on PetscObject
1007e5c89e4eSSatish Balay 
1008e5c89e4eSSatish Balay    Input Parameters:
1009e5c89e4eSSatish Balay .  obj - the PetscObject
1010e5c89e4eSSatish Balay 
1011e5c89e4eSSatish Balay    Notes:
1012e5c89e4eSSatish Balay    This does nothing at present.
1013e5c89e4eSSatish Balay 
1014e5c89e4eSSatish Balay    Level: advanced
1015e5c89e4eSSatish Balay 
1016e5c89e4eSSatish Balay .keywords: setup
1017e5c89e4eSSatish Balay .seealso: PetscObjectDestroy()
1018e5c89e4eSSatish Balay @*/
10197087cfbeSBarry Smith PetscErrorCode  PetscObjectSetUp(PetscObject obj)
1020e5c89e4eSSatish Balay {
1021e5c89e4eSSatish Balay   PetscFunctionBegin;
10223cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
1023e5c89e4eSSatish Balay   PetscFunctionReturn(0);
1024e5c89e4eSSatish Balay }
1025