xref: /petsc/src/sys/objects/inherit.c (revision a8d2bbe5e2ec4f82cea34690032c2899b2c07c1b)
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;
43c47d93e8SBarry Smith   h->precision              = (PetscPrecision) sizeof(PetscScalar);
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);
1192e82e6d1SBarry Smith 
1202e82e6d1SBarry Smith   /* Record object removal from list of all objects */
1212e82e6d1SBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
1222e82e6d1SBarry Smith     if (PetscObjects[i] == h) {
1232e82e6d1SBarry Smith       PetscObjects[i] = 0;
1242e82e6d1SBarry Smith       PetscObjectsCounts--;
1252e82e6d1SBarry Smith       break;
1262e82e6d1SBarry Smith     }
1272e82e6d1SBarry Smith   }
1282eff7a51SBarry Smith   if (!PetscObjectsCounts) {
1292e82e6d1SBarry Smith     ierr = PetscFree(PetscObjects);CHKERRQ(ierr);
1302e82e6d1SBarry Smith     PetscObjectsMaxCounts = 0;
1312e82e6d1SBarry Smith   }
132e5c89e4eSSatish Balay   PetscFunctionReturn(0);
133e5c89e4eSSatish Balay }
134e5c89e4eSSatish Balay 
135e5c89e4eSSatish Balay #undef __FUNCT__
1368cd211a4SJed Brown #define __FUNCT__ "PetscObjectCopyFortranFunctionPointers"
1378cd211a4SJed Brown /*@C
1388cd211a4SJed Brown    PetscObjectCopyFortranFunctionPointers - Copy function pointers to another object
1398cd211a4SJed Brown 
1408cd211a4SJed Brown    Logically Collective on PetscObject
1418cd211a4SJed Brown 
1428cd211a4SJed Brown    Input Parameter:
1438cd211a4SJed Brown +  src - source object
1448cd211a4SJed Brown -  dest - destination object
1458cd211a4SJed Brown 
1468cd211a4SJed Brown    Level: developer
1478cd211a4SJed Brown 
1488cd211a4SJed Brown    Note:
1498cd211a4SJed Brown    Both objects must have the same class.
1508cd211a4SJed Brown @*/
1518cd211a4SJed Brown PetscErrorCode PetscObjectCopyFortranFunctionPointers(PetscObject src,PetscObject dest)
1528cd211a4SJed Brown {
1538cd211a4SJed Brown   PetscErrorCode ierr;
1548cd211a4SJed Brown 
1558cd211a4SJed Brown   PetscFunctionBegin;
1568cd211a4SJed Brown   PetscValidHeader(src,1);
1578cd211a4SJed Brown   PetscValidHeader(dest,2);
1588cd211a4SJed Brown   if (src->classid != dest->classid) SETERRQ(src->comm,PETSC_ERR_ARG_INCOMP,"Objects must be of the same class");
1598cd211a4SJed Brown 
1608cd211a4SJed Brown   ierr = PetscFree(dest->fortran_func_pointers);CHKERRQ(ierr);
1618cd211a4SJed Brown   ierr = PetscMalloc(src->num_fortran_func_pointers*sizeof(void(*)(void)),&dest->fortran_func_pointers);CHKERRQ(ierr);
1628cd211a4SJed Brown   ierr = PetscMemcpy(dest->fortran_func_pointers,src->fortran_func_pointers,src->num_fortran_func_pointers*sizeof(void(*)(void)));CHKERRQ(ierr);
1638cd211a4SJed Brown   dest->num_fortran_func_pointers = src->num_fortran_func_pointers;
1648cd211a4SJed Brown   PetscFunctionReturn(0);
1658cd211a4SJed Brown }
1668cd211a4SJed Brown 
1678cd211a4SJed Brown #undef __FUNCT__
168a64a8e02SBarry Smith #define __FUNCT__ "PetscObjectsDump"
169a64a8e02SBarry Smith /*@C
170a64a8e02SBarry Smith    PetscObjectsDump - Prints the currently existing objects.
171a64a8e02SBarry Smith 
172a64a8e02SBarry Smith    Logically Collective on PetscViewer
173a64a8e02SBarry Smith 
174a64a8e02SBarry Smith    Input Parameter:
175a64a8e02SBarry Smith .  viewer - must be an PETSCVIEWERASCII viewer
176a64a8e02SBarry Smith 
177a64a8e02SBarry Smith    Level: advanced
178a64a8e02SBarry Smith 
179a64a8e02SBarry Smith    Concepts: options database^printing
180a64a8e02SBarry Smith 
181a64a8e02SBarry Smith @*/
182a64a8e02SBarry Smith PetscErrorCode  PetscObjectsDump(FILE *fd)
183a64a8e02SBarry Smith {
184a64a8e02SBarry Smith   PetscErrorCode ierr;
1852c9581d2SBarry Smith   PetscInt       i,j;
186a64a8e02SBarry Smith   PetscObject    h;
187a64a8e02SBarry Smith 
188a64a8e02SBarry Smith   PetscFunctionBegin;
189a64a8e02SBarry Smith   if (PetscObjectsCounts) {
1902c9581d2SBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"The following objects were never freed\n");
1912c9581d2SBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-----------------------------------------\n");
192a64a8e02SBarry Smith     for (i=0; i<PetscObjectsMaxCounts; i++) {
193a64a8e02SBarry Smith       if ((h = PetscObjects[i])) {
194a64a8e02SBarry Smith         ierr = PetscObjectName(h);CHKERRQ(ierr);
1952c9581d2SBarry Smith         {
196a64a8e02SBarry Smith #if defined(PETSC_USE_DEBUG)
197a64a8e02SBarry Smith         PetscStack *stack;
1982c9581d2SBarry Smith         char        *create,*class;
199*a8d2bbe5SBarry Smith 
200*a8d2bbe5SBarry Smith         /* if the PETSc function the user calls is not a create then this object was NOT directly created by them */
201a64a8e02SBarry Smith         ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr);
202*a8d2bbe5SBarry Smith         j = 0;
203*a8d2bbe5SBarry Smith         while (!stack->petscroutine[j]) j++;
204*a8d2bbe5SBarry Smith         ierr = PetscStrstr(stack->function[j],"Create",&create);CHKERRQ(ierr);
205*a8d2bbe5SBarry Smith         ierr = PetscStrstr(stack->function[j],h->class_name,&class);CHKERRQ(ierr);
2062c9581d2SBarry Smith 
2072c9581d2SBarry Smith         if (!create) continue;
2082c9581d2SBarry Smith         if (!class) continue;
209a64a8e02SBarry Smith #endif
2102c9581d2SBarry Smith 
2112c9581d2SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"[%d] %s %s %s\n",PetscGlobalRank,h->class_name,h->type_name,h->name);CHKERRQ(ierr);
2122c9581d2SBarry Smith 
2132c9581d2SBarry Smith #if defined(PETSC_USE_DEBUG)
2142c9581d2SBarry Smith         ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr);
2152c9581d2SBarry Smith         for (j=stack->currentsize-2; j>=0; j--) {
2162c9581d2SBarry Smith           fprintf(fd,"      [%d]  %s() in %s%s\n",PetscGlobalRank,stack->function[j],stack->directory[j],stack->file[j]);
2172c9581d2SBarry Smith         }
2182c9581d2SBarry Smith #endif
2192c9581d2SBarry Smith         }
220a64a8e02SBarry Smith       }
221a64a8e02SBarry Smith     }
222a64a8e02SBarry Smith   }
223a64a8e02SBarry Smith   PetscFunctionReturn(0);
224a64a8e02SBarry Smith }
225a64a8e02SBarry Smith 
226a64a8e02SBarry Smith 
227a64a8e02SBarry Smith #undef __FUNCT__
228c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsView"
229c139c21fSBarry Smith /*@C
230c139c21fSBarry Smith    PetscObjectsView - Prints the currently existing objects.
231c139c21fSBarry Smith 
232c139c21fSBarry Smith    Logically Collective on PetscViewer
233c139c21fSBarry Smith 
234c139c21fSBarry Smith    Input Parameter:
235c139c21fSBarry Smith .  viewer - must be an PETSCVIEWERASCII viewer
236c139c21fSBarry Smith 
237c139c21fSBarry Smith    Level: advanced
238c139c21fSBarry Smith 
239c139c21fSBarry Smith    Concepts: options database^printing
240c139c21fSBarry Smith 
241c139c21fSBarry Smith @*/
242c139c21fSBarry Smith PetscErrorCode  PetscObjectsView(PetscViewer viewer)
243c139c21fSBarry Smith {
244c139c21fSBarry Smith   PetscErrorCode ierr;
245c139c21fSBarry Smith   PetscBool      isascii;
246a64a8e02SBarry Smith   FILE           *fd;
247c139c21fSBarry Smith 
248c139c21fSBarry Smith   PetscFunctionBegin;
249c139c21fSBarry Smith   if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD;
250251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
251c139c21fSBarry Smith   if (!isascii) SETERRQ(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Only supports ASCII viewer");
252a64a8e02SBarry Smith   ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr);
253a64a8e02SBarry Smith   ierr = PetscObjectsDump(fd);CHKERRQ(ierr);
254c139c21fSBarry Smith   PetscFunctionReturn(0);
255c139c21fSBarry Smith }
256c139c21fSBarry Smith 
257c139c21fSBarry Smith #undef __FUNCT__
258c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObject"
259c139c21fSBarry Smith /*@C
260c139c21fSBarry Smith    PetscObjectsGetObject - Get a pointer to a named object
261c139c21fSBarry Smith 
262c139c21fSBarry Smith    Not collective
263c139c21fSBarry Smith 
264c139c21fSBarry Smith    Input Parameter:
265c139c21fSBarry Smith .  name - the name of an object
266c139c21fSBarry Smith 
267c139c21fSBarry Smith    Output Parameter:
268c139c21fSBarry Smith .   obj - the object or null if there is no object
269c139c21fSBarry Smith 
270c139c21fSBarry Smith    Level: advanced
271c139c21fSBarry Smith 
272c139c21fSBarry Smith    Concepts: options database^printing
273c139c21fSBarry Smith 
274c139c21fSBarry Smith @*/
275c139c21fSBarry Smith PetscErrorCode  PetscObjectsGetObject(const char* name,PetscObject *obj,char **classname)
276c139c21fSBarry Smith {
277c139c21fSBarry Smith   PetscErrorCode ierr;
278c139c21fSBarry Smith   PetscInt       i;
279c139c21fSBarry Smith   PetscObject    h;
280c139c21fSBarry Smith   PetscBool      flg;
281c139c21fSBarry Smith 
282c139c21fSBarry Smith   PetscFunctionBegin;
283c139c21fSBarry Smith   *obj = PETSC_NULL;
284c139c21fSBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
285c139c21fSBarry Smith     if ((h = PetscObjects[i])) {
286c139c21fSBarry Smith       ierr = PetscObjectName(h);CHKERRQ(ierr);
287c139c21fSBarry Smith       ierr = PetscStrcmp(h->name,name,&flg);CHKERRQ(ierr);
288c139c21fSBarry Smith       if (flg) {
289c139c21fSBarry Smith         *obj = h;
290c139c21fSBarry Smith         if (classname) *classname = h->class_name;
291c139c21fSBarry Smith         PetscFunctionReturn(0);
292c139c21fSBarry Smith       }
293c139c21fSBarry Smith     }
294c139c21fSBarry Smith   }
295c139c21fSBarry Smith   PetscFunctionReturn(0);
296c139c21fSBarry Smith }
297c139c21fSBarry Smith 
298c139c21fSBarry Smith #undef __FUNCT__
299c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObjectMatlab"
300c139c21fSBarry Smith char* PetscObjectsGetObjectMatlab(const char* name,PetscObject *obj)
301c139c21fSBarry Smith {
302c139c21fSBarry Smith   PetscErrorCode ierr;
303c139c21fSBarry Smith   PetscInt       i;
304c139c21fSBarry Smith   PetscObject    h;
305c139c21fSBarry Smith   PetscBool      flg;
306c139c21fSBarry Smith 
307c139c21fSBarry Smith   PetscFunctionBegin;
308c139c21fSBarry Smith   *obj = PETSC_NULL;
309c139c21fSBarry Smith   for (i=0; i<PetscObjectsMaxCounts; i++) {
310c139c21fSBarry Smith     if ((h = PetscObjects[i])) {
311c139c21fSBarry Smith       ierr = PetscObjectName(h);if (ierr) PetscFunctionReturn(0);
312c139c21fSBarry Smith       ierr = PetscStrcmp(h->name,name,&flg);if (ierr) PetscFunctionReturn(0);
313c139c21fSBarry Smith       if (flg) {
314c139c21fSBarry Smith         *obj = h;
315c139c21fSBarry Smith         PetscFunctionReturn(h->class_name);
316c139c21fSBarry Smith       }
317c139c21fSBarry Smith     }
318c139c21fSBarry Smith   }
319c139c21fSBarry Smith   PetscFunctionReturn(0);
320c139c21fSBarry Smith }
321c139c21fSBarry Smith 
322c139c21fSBarry Smith #undef __FUNCT__
323af272810SBarry Smith #define __FUNCT__ "PetscObjectAddOptionsHandler"
324af272810SBarry Smith /*@C
325af272810SBarry Smith     PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called.
326af272810SBarry Smith 
327af272810SBarry Smith     Not Collective
328af272810SBarry Smith 
329af272810SBarry Smith     Input Parameter:
330af272810SBarry Smith +   obj - the PETSc object
331af272810SBarry Smith .   handle - function that checks for options
332af272810SBarry Smith .   destroy - function to destroy context if provided
333af272810SBarry Smith -   ctx - optional context for check function
334af272810SBarry Smith 
335af272810SBarry Smith     Level: developer
336af272810SBarry Smith 
337af272810SBarry Smith 
338af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers()
339af272810SBarry Smith 
340af272810SBarry Smith @*/
3417087cfbeSBarry Smith PetscErrorCode  PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx)
342af272810SBarry Smith {
343af272810SBarry Smith   PetscFunctionBegin;
3440defdb15SJed Brown   PetscValidHeader(obj,1);
345af272810SBarry Smith   if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added");
346af272810SBarry Smith   obj->optionhandler[obj->noptionhandler]   = handle;
347af272810SBarry Smith   obj->optiondestroy[obj->noptionhandler]   = destroy;
348af272810SBarry Smith   obj->optionctx[obj->noptionhandler++]     = ctx;
349af272810SBarry Smith   PetscFunctionReturn(0);
350af272810SBarry Smith }
351af272810SBarry Smith 
352af272810SBarry Smith #undef __FUNCT__
353af272810SBarry Smith #define __FUNCT__ "PetscObjectProcessOptionsHandlers"
354af272810SBarry Smith /*@C
355af272810SBarry Smith     PetscObjectProcessOptionsHandlers - Calls all the options handler attached to an object
356af272810SBarry Smith 
357af272810SBarry Smith     Not Collective
358af272810SBarry Smith 
359af272810SBarry Smith     Input Parameter:
360af272810SBarry Smith .   obj - the PETSc object
361af272810SBarry Smith 
362af272810SBarry Smith     Level: developer
363af272810SBarry Smith 
364af272810SBarry Smith 
365af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectDestroyOptionsHandlers()
366af272810SBarry Smith 
367af272810SBarry Smith @*/
3687087cfbeSBarry Smith PetscErrorCode  PetscObjectProcessOptionsHandlers(PetscObject obj)
369af272810SBarry Smith {
370af272810SBarry Smith   PetscInt       i;
371af272810SBarry Smith   PetscErrorCode ierr;
372af272810SBarry Smith 
373af272810SBarry Smith   PetscFunctionBegin;
3740defdb15SJed Brown   PetscValidHeader(obj,1);
375af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
376af272810SBarry Smith     ierr = (*obj->optionhandler[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
377af272810SBarry Smith   }
378af272810SBarry Smith   PetscFunctionReturn(0);
379af272810SBarry Smith }
380af272810SBarry Smith 
381af272810SBarry Smith #undef __FUNCT__
382af272810SBarry Smith #define __FUNCT__ "PetscObjectDestroyOptionsHandlers"
383af272810SBarry Smith /*@C
384af272810SBarry Smith     PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an objeft
385af272810SBarry Smith 
386af272810SBarry Smith     Not Collective
387af272810SBarry Smith 
388af272810SBarry Smith     Input Parameter:
389af272810SBarry Smith .   obj - the PETSc object
390af272810SBarry Smith 
391af272810SBarry Smith     Level: developer
392af272810SBarry Smith 
393af272810SBarry Smith 
394af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectProcessOptionsHandlers()
395af272810SBarry Smith 
396af272810SBarry Smith @*/
3977087cfbeSBarry Smith PetscErrorCode  PetscObjectDestroyOptionsHandlers(PetscObject obj)
398af272810SBarry Smith {
399af272810SBarry Smith   PetscInt       i;
400af272810SBarry Smith   PetscErrorCode ierr;
401af272810SBarry Smith 
402af272810SBarry Smith   PetscFunctionBegin;
4030defdb15SJed Brown   PetscValidHeader(obj,1);
404af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
405af272810SBarry Smith     ierr = (*obj->optiondestroy[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
406af272810SBarry Smith   }
407af272810SBarry Smith   obj->noptionhandler = 0;
408af272810SBarry Smith   PetscFunctionReturn(0);
409af272810SBarry Smith }
410af272810SBarry Smith 
411af272810SBarry Smith 
412af272810SBarry Smith #undef __FUNCT__
413e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectReference"
414ee978a2eSBarry Smith /*@
415e5c89e4eSSatish Balay    PetscObjectReference - Indicates to any PetscObject that it is being
416e5c89e4eSSatish Balay    referenced by another PetscObject. This increases the reference
417e5c89e4eSSatish Balay    count for that object by one.
418e5c89e4eSSatish Balay 
4193f9fe445SBarry Smith    Logically Collective on PetscObject
420e5c89e4eSSatish Balay 
421e5c89e4eSSatish Balay    Input Parameter:
422e5c89e4eSSatish Balay .  obj - the PETSc object. This must be cast with (PetscObject), for example,
423e5c89e4eSSatish Balay          PetscObjectReference((PetscObject)mat);
424e5c89e4eSSatish Balay 
425e5c89e4eSSatish Balay    Level: advanced
426e5c89e4eSSatish Balay 
427e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference()
428e5c89e4eSSatish Balay @*/
4297087cfbeSBarry Smith PetscErrorCode  PetscObjectReference(PetscObject obj)
430e5c89e4eSSatish Balay {
431e5c89e4eSSatish Balay   PetscFunctionBegin;
43252536dc3SBarry Smith   if (!obj) PetscFunctionReturn(0);
433e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
434e5c89e4eSSatish Balay   obj->refct++;
435e5c89e4eSSatish Balay   PetscFunctionReturn(0);
436e5c89e4eSSatish Balay }
437e5c89e4eSSatish Balay 
438e5c89e4eSSatish Balay #undef __FUNCT__
439e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetReference"
440ee978a2eSBarry Smith /*@
441e5c89e4eSSatish Balay    PetscObjectGetReference - Gets the current reference count for
442e5c89e4eSSatish Balay    any PETSc object.
443e5c89e4eSSatish Balay 
444e5c89e4eSSatish Balay    Not Collective
445e5c89e4eSSatish Balay 
446e5c89e4eSSatish Balay    Input Parameter:
447e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
448e5c89e4eSSatish Balay          PetscObjectGetReference((PetscObject)mat,&cnt);
449e5c89e4eSSatish Balay 
450e5c89e4eSSatish Balay    Output Parameter:
451e5c89e4eSSatish Balay .  cnt - the reference count
452e5c89e4eSSatish Balay 
453e5c89e4eSSatish Balay    Level: advanced
454e5c89e4eSSatish Balay 
455e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference()
456e5c89e4eSSatish Balay @*/
4577087cfbeSBarry Smith PetscErrorCode  PetscObjectGetReference(PetscObject obj,PetscInt *cnt)
458e5c89e4eSSatish Balay {
459e5c89e4eSSatish Balay   PetscFunctionBegin;
460e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
461e5c89e4eSSatish Balay   PetscValidIntPointer(cnt,2);
462e5c89e4eSSatish Balay   *cnt = obj->refct;
463e5c89e4eSSatish Balay   PetscFunctionReturn(0);
464e5c89e4eSSatish Balay }
465e5c89e4eSSatish Balay 
466e5c89e4eSSatish Balay #undef __FUNCT__
467e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDereference"
468e5c89e4eSSatish Balay /*@
469e5c89e4eSSatish Balay    PetscObjectDereference - Indicates to any PetscObject that it is being
470e5c89e4eSSatish Balay    referenced by one less PetscObject. This decreases the reference
471e5c89e4eSSatish Balay    count for that object by one.
472e5c89e4eSSatish Balay 
4733f9fe445SBarry Smith    Collective on PetscObject if reference reaches 0 otherwise Logically Collective
474e5c89e4eSSatish Balay 
475e5c89e4eSSatish Balay    Input Parameter:
476e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
477e5c89e4eSSatish Balay          PetscObjectDereference((PetscObject)mat);
478e5c89e4eSSatish Balay 
4796bf464f9SBarry Smith    Notes: PetscObjectDestroy(PetscObject *obj)  sets the obj pointer to null after the call, this routine does not.
4806bf464f9SBarry Smith 
481e5c89e4eSSatish Balay    Level: advanced
482e5c89e4eSSatish Balay 
483e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectReference()
484e5c89e4eSSatish Balay @*/
4857087cfbeSBarry Smith PetscErrorCode  PetscObjectDereference(PetscObject obj)
486e5c89e4eSSatish Balay {
487e5c89e4eSSatish Balay   PetscErrorCode ierr;
488e5c89e4eSSatish Balay 
489e5c89e4eSSatish Balay   PetscFunctionBegin;
490e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
491e5c89e4eSSatish Balay   if (obj->bops->destroy) {
4926bf464f9SBarry Smith     ierr = (*obj->bops->destroy)(&obj);CHKERRQ(ierr);
493f7923d8aSBarry Smith   } else if (!--obj->refct) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine");
494e5c89e4eSSatish Balay   PetscFunctionReturn(0);
495e5c89e4eSSatish Balay }
496e5c89e4eSSatish Balay 
497e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */
498e5c89e4eSSatish Balay /*
499e5c89e4eSSatish Balay      The following routines are the versions private to the PETSc object
500e5c89e4eSSatish Balay      data structures.
501e5c89e4eSSatish Balay */
502e5c89e4eSSatish Balay #undef __FUNCT__
503e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetComm_Petsc"
504e5c89e4eSSatish Balay PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm)
505e5c89e4eSSatish Balay {
506e5c89e4eSSatish Balay   PetscFunctionBegin;
5070defdb15SJed Brown   PetscValidHeader(obj,1);
508e5c89e4eSSatish Balay   *comm = obj->comm;
509e5c89e4eSSatish Balay   PetscFunctionReturn(0);
510e5c89e4eSSatish Balay }
511e5c89e4eSSatish Balay 
512e5c89e4eSSatish Balay #undef __FUNCT__
5136ba4bc90SBarry Smith #define __FUNCT__ "PetscObjectRemoveReference"
5146ba4bc90SBarry Smith PetscErrorCode PetscObjectRemoveReference(PetscObject obj,const char name[])
5156ba4bc90SBarry Smith {
5166ba4bc90SBarry Smith   PetscErrorCode ierr;
5176ba4bc90SBarry Smith 
5186ba4bc90SBarry Smith   PetscFunctionBegin;
5190defdb15SJed Brown   PetscValidHeader(obj,1);
5206ba4bc90SBarry Smith   ierr = PetscOListRemoveReference(&obj->olist,name);CHKERRQ(ierr);
5216ba4bc90SBarry Smith   PetscFunctionReturn(0);
5226ba4bc90SBarry Smith }
5236ba4bc90SBarry Smith 
5246ba4bc90SBarry Smith #undef __FUNCT__
525e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose_Petsc"
526e5c89e4eSSatish Balay PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr)
527e5c89e4eSSatish Balay {
528e5c89e4eSSatish Balay   PetscErrorCode ierr;
529e5c89e4eSSatish Balay   char           *tname;
530bfec8eecSBarry Smith   PetscBool      skipreference;
531e5c89e4eSSatish Balay 
532e5c89e4eSSatish Balay   PetscFunctionBegin;
533e5c89e4eSSatish Balay   if (ptr) {
534bfec8eecSBarry Smith     ierr = PetscOListReverseFind(ptr->olist,obj,&tname,&skipreference);CHKERRQ(ierr);
535f851cb64SDmitry 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");
536e5c89e4eSSatish Balay   }
537e5c89e4eSSatish Balay   ierr = PetscOListAdd(&obj->olist,name,ptr);CHKERRQ(ierr);
538e5c89e4eSSatish Balay   PetscFunctionReturn(0);
539e5c89e4eSSatish Balay }
540e5c89e4eSSatish Balay 
541e5c89e4eSSatish Balay #undef __FUNCT__
542e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery_Petsc"
543e5c89e4eSSatish Balay PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr)
544e5c89e4eSSatish Balay {
545e5c89e4eSSatish Balay   PetscErrorCode ierr;
546e5c89e4eSSatish Balay 
547e5c89e4eSSatish Balay   PetscFunctionBegin;
5480defdb15SJed Brown   PetscValidHeader(obj,1);
549e5c89e4eSSatish Balay   ierr = PetscOListFind(obj->olist,name,ptr);CHKERRQ(ierr);
550e5c89e4eSSatish Balay   PetscFunctionReturn(0);
551e5c89e4eSSatish Balay }
552e5c89e4eSSatish Balay 
553e5c89e4eSSatish Balay #undef __FUNCT__
554e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction_Petsc"
555e5c89e4eSSatish Balay PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
556e5c89e4eSSatish Balay {
557e5c89e4eSSatish Balay   PetscErrorCode ierr;
558e5c89e4eSSatish Balay 
559e5c89e4eSSatish Balay   PetscFunctionBegin;
5600defdb15SJed Brown   PetscValidHeader(obj,1);
561e5c89e4eSSatish Balay   ierr = PetscFListAdd(&obj->qlist,name,fname,ptr);CHKERRQ(ierr);
562e5c89e4eSSatish Balay   PetscFunctionReturn(0);
563e5c89e4eSSatish Balay }
564e5c89e4eSSatish Balay 
565e5c89e4eSSatish Balay #undef __FUNCT__
566e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction_Petsc"
567e5c89e4eSSatish Balay PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void))
568e5c89e4eSSatish Balay {
569e5c89e4eSSatish Balay   PetscErrorCode ierr;
570e5c89e4eSSatish Balay 
571e5c89e4eSSatish Balay   PetscFunctionBegin;
5720defdb15SJed Brown   PetscValidHeader(obj,1);
5734b91b6eaSBarry Smith   ierr = PetscFListFind(obj->qlist,obj->comm,name,PETSC_FALSE,ptr);CHKERRQ(ierr);
574e5c89e4eSSatish Balay   PetscFunctionReturn(0);
575e5c89e4eSSatish Balay }
576e5c89e4eSSatish Balay 
577e5c89e4eSSatish Balay #undef __FUNCT__
578e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose"
579e5c89e4eSSatish Balay /*@C
580e5c89e4eSSatish Balay    PetscObjectCompose - Associates another PETSc object with a given PETSc object.
581e5c89e4eSSatish Balay 
582e5c89e4eSSatish Balay    Not Collective
583e5c89e4eSSatish Balay 
584e5c89e4eSSatish Balay    Input Parameters:
585e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
586e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
587e5c89e4eSSatish Balay .  name - name associated with the child object
588e5c89e4eSSatish Balay -  ptr - the other PETSc object to associate with the PETSc object; this must also be
589e5c89e4eSSatish Balay          cast with (PetscObject)
590e5c89e4eSSatish Balay 
591e5c89e4eSSatish Balay    Level: advanced
592e5c89e4eSSatish Balay 
593e5c89e4eSSatish Balay    Notes:
594e5c89e4eSSatish Balay    The second objects reference count is automatically increased by one when it is
595e5c89e4eSSatish Balay    composed.
596e5c89e4eSSatish Balay 
597e5c89e4eSSatish Balay    Replaces any previous object that had the same name.
598e5c89e4eSSatish Balay 
599e5c89e4eSSatish Balay    If ptr is null and name has previously been composed using an object, then that
600e5c89e4eSSatish Balay    entry is removed from the obj.
601e5c89e4eSSatish Balay 
602e5c89e4eSSatish Balay    PetscObjectCompose() can be used with any PETSc object (such as
603e5c89e4eSSatish Balay    Mat, Vec, KSP, SNES, etc.) or any user-provided object.  See
604776b82aeSLisandro Dalcin    PetscContainerCreate() for info on how to create an object from a
605e5c89e4eSSatish Balay    user-provided pointer that may then be composed with PETSc objects.
606e5c89e4eSSatish Balay 
607e5c89e4eSSatish Balay    Concepts: objects^composing
608e5c89e4eSSatish Balay    Concepts: composing objects
609e5c89e4eSSatish Balay 
610776b82aeSLisandro Dalcin .seealso: PetscObjectQuery(), PetscContainerCreate()
611e5c89e4eSSatish Balay @*/
6127087cfbeSBarry Smith PetscErrorCode  PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr)
613e5c89e4eSSatish Balay {
614e5c89e4eSSatish Balay   PetscErrorCode ierr;
615e5c89e4eSSatish Balay 
616e5c89e4eSSatish Balay   PetscFunctionBegin;
6173cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
6183cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
6193cfa8680SLisandro Dalcin   if (ptr) PetscValidHeader(ptr,3);
620e5c89e4eSSatish Balay   ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr);
621e5c89e4eSSatish Balay   PetscFunctionReturn(0);
622e5c89e4eSSatish Balay }
623e5c89e4eSSatish Balay 
62458b60935SBarry Smith #undef __FUNCT__
62558b60935SBarry Smith #define __FUNCT__ "PetscObjectSetPrecision"
62658b60935SBarry Smith /*@C
62758b60935SBarry Smith    PetscObjectSetPrecision - sets the precision used within a given object.
6289f8a2776SDmitry Karpeev 
62958b60935SBarry Smith    Collective on the PetscObject
63058b60935SBarry Smith 
63158b60935SBarry Smith    Input Parameters:
63258b60935SBarry Smith +  obj - the PETSc object; this must be cast with (PetscObject), for example,
63358b60935SBarry Smith          PetscObjectCompose((PetscObject)mat,...);
63458b60935SBarry Smith -  precision - the precision
63558b60935SBarry Smith 
63658b60935SBarry Smith    Level: advanced
63758b60935SBarry Smith 
63858b60935SBarry Smith .seealso: PetscObjectQuery(), PetscContainerCreate()
63958b60935SBarry Smith @*/
6407087cfbeSBarry Smith PetscErrorCode  PetscObjectSetPrecision(PetscObject obj,PetscPrecision precision)
64158b60935SBarry Smith {
64258b60935SBarry Smith   PetscFunctionBegin;
64358b60935SBarry Smith   PetscValidHeader(obj,1);
64458b60935SBarry Smith   obj->precision = precision;
64558b60935SBarry Smith   PetscFunctionReturn(0);
64658b60935SBarry Smith }
6479f8a2776SDmitry Karpeev 
648e5c89e4eSSatish Balay #undef __FUNCT__
649e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery"
650e5c89e4eSSatish Balay /*@C
651e5c89e4eSSatish Balay    PetscObjectQuery  - Gets a PETSc object associated with a given object.
652e5c89e4eSSatish Balay 
653e5c89e4eSSatish Balay    Not Collective
654e5c89e4eSSatish Balay 
655e5c89e4eSSatish Balay    Input Parameters:
656e5c89e4eSSatish Balay +  obj - the PETSc object
657e5c89e4eSSatish Balay          Thus must be cast with a (PetscObject), for example,
658e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
659e5c89e4eSSatish Balay .  name - name associated with child object
6603c0c59f3SBarry Smith -  ptr - the other PETSc object associated with the PETSc object, this must be
6613c0c59f3SBarry Smith          cast with (PetscObject *)
662e5c89e4eSSatish Balay 
663e5c89e4eSSatish Balay    Level: advanced
664e5c89e4eSSatish Balay 
6653c0c59f3SBarry Smith    The reference count of neither object is increased in this call
6663c0c59f3SBarry Smith 
667e5c89e4eSSatish Balay    Concepts: objects^composing
668e5c89e4eSSatish Balay    Concepts: composing objects
669e5c89e4eSSatish Balay    Concepts: objects^querying
670e5c89e4eSSatish Balay    Concepts: querying objects
671e5c89e4eSSatish Balay 
67288674abaSJed Brown .seealso: PetscObjectCompose()
673e5c89e4eSSatish Balay @*/
6747087cfbeSBarry Smith PetscErrorCode  PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr)
675e5c89e4eSSatish Balay {
676e5c89e4eSSatish Balay   PetscErrorCode ierr;
677e5c89e4eSSatish Balay 
678e5c89e4eSSatish Balay   PetscFunctionBegin;
6793cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
6803cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
6813cfa8680SLisandro Dalcin   PetscValidPointer(ptr,3);
682e5c89e4eSSatish Balay   ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr);
683e5c89e4eSSatish Balay   PetscFunctionReturn(0);
684e5c89e4eSSatish Balay }
685e5c89e4eSSatish Balay 
686e5c89e4eSSatish Balay #undef __FUNCT__
687e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction"
6887087cfbeSBarry Smith PetscErrorCode  PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
689e5c89e4eSSatish Balay {
690e5c89e4eSSatish Balay   PetscErrorCode ierr;
691e5c89e4eSSatish Balay 
692e5c89e4eSSatish Balay   PetscFunctionBegin;
6933cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
6943cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
695e5c89e4eSSatish Balay   ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr);
696e5c89e4eSSatish Balay   PetscFunctionReturn(0);
697e5c89e4eSSatish Balay }
698e5c89e4eSSatish Balay 
699e5c89e4eSSatish Balay #undef __FUNCT__
700e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction"
701e5c89e4eSSatish Balay /*@C
702e5c89e4eSSatish Balay    PetscObjectQueryFunction - Gets a function associated with a given object.
703e5c89e4eSSatish Balay 
7043f9fe445SBarry Smith    Logically Collective on PetscObject
705e5c89e4eSSatish Balay 
706e5c89e4eSSatish Balay    Input Parameters:
707e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
708e5c89e4eSSatish Balay          PetscObjectQueryFunction((PetscObject)ksp,...);
709e5c89e4eSSatish Balay -  name - name associated with the child function
710e5c89e4eSSatish Balay 
711e5c89e4eSSatish Balay    Output Parameter:
712e5c89e4eSSatish Balay .  ptr - function pointer
713e5c89e4eSSatish Balay 
714e5c89e4eSSatish Balay    Level: advanced
715e5c89e4eSSatish Balay 
716e5c89e4eSSatish Balay    Concepts: objects^composing functions
717e5c89e4eSSatish Balay    Concepts: composing functions
718e5c89e4eSSatish Balay    Concepts: functions^querying
719e5c89e4eSSatish Balay    Concepts: objects^querying
720e5c89e4eSSatish Balay    Concepts: querying objects
721e5c89e4eSSatish Balay 
722e5c89e4eSSatish Balay .seealso: PetscObjectComposeFunctionDynamic()
723e5c89e4eSSatish Balay @*/
7247087cfbeSBarry Smith PetscErrorCode  PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void))
725e5c89e4eSSatish Balay {
726e5c89e4eSSatish Balay   PetscErrorCode ierr;
727e5c89e4eSSatish Balay 
728e5c89e4eSSatish Balay   PetscFunctionBegin;
7293cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
7303cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
731e5c89e4eSSatish Balay   ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr);
732e5c89e4eSSatish Balay   PetscFunctionReturn(0);
733e5c89e4eSSatish Balay }
734e5c89e4eSSatish Balay 
735776b82aeSLisandro Dalcin struct _p_PetscContainer {
736e5c89e4eSSatish Balay   PETSCHEADER(int);
737e5c89e4eSSatish Balay   void   *ptr;
738e5c89e4eSSatish Balay   PetscErrorCode (*userdestroy)(void*);
739e5c89e4eSSatish Balay };
740e5c89e4eSSatish Balay 
741e5c89e4eSSatish Balay #undef __FUNCT__
742776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerGetPointer"
743e5c89e4eSSatish Balay /*@C
744776b82aeSLisandro Dalcin    PetscContainerGetPointer - Gets the pointer value contained in the container.
745e5c89e4eSSatish Balay 
7463f9fe445SBarry Smith    Not Collective
747e5c89e4eSSatish Balay 
748e5c89e4eSSatish Balay    Input Parameter:
749776b82aeSLisandro Dalcin .  obj - the object created with PetscContainerCreate()
750e5c89e4eSSatish Balay 
751e5c89e4eSSatish Balay    Output Parameter:
752e5c89e4eSSatish Balay .  ptr - the pointer value
753e5c89e4eSSatish Balay 
754e5c89e4eSSatish Balay    Level: advanced
755e5c89e4eSSatish Balay 
756776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
757776b82aeSLisandro Dalcin           PetscContainerSetPointer()
758e5c89e4eSSatish Balay @*/
7597087cfbeSBarry Smith PetscErrorCode  PetscContainerGetPointer(PetscContainer obj,void **ptr)
760e5c89e4eSSatish Balay {
761e5c89e4eSSatish Balay   PetscFunctionBegin;
7620700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
7633cfa8680SLisandro Dalcin   PetscValidPointer(ptr,2);
764e5c89e4eSSatish Balay   *ptr = obj->ptr;
765e5c89e4eSSatish Balay   PetscFunctionReturn(0);
766e5c89e4eSSatish Balay }
767e5c89e4eSSatish Balay 
768e5c89e4eSSatish Balay 
769e5c89e4eSSatish Balay #undef __FUNCT__
770776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetPointer"
771e5c89e4eSSatish Balay /*@C
772776b82aeSLisandro Dalcin    PetscContainerSetPointer - Sets the pointer value contained in the container.
773e5c89e4eSSatish Balay 
7743f9fe445SBarry Smith    Logically Collective on PetscContainer
775e5c89e4eSSatish Balay 
776e5c89e4eSSatish Balay    Input Parameters:
777776b82aeSLisandro Dalcin +  obj - the object created with PetscContainerCreate()
778e5c89e4eSSatish Balay -  ptr - the pointer value
779e5c89e4eSSatish Balay 
780e5c89e4eSSatish Balay    Level: advanced
781e5c89e4eSSatish Balay 
782776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
783776b82aeSLisandro Dalcin           PetscContainerGetPointer()
784e5c89e4eSSatish Balay @*/
7857087cfbeSBarry Smith PetscErrorCode  PetscContainerSetPointer(PetscContainer obj,void *ptr)
786e5c89e4eSSatish Balay {
787e5c89e4eSSatish Balay   PetscFunctionBegin;
7880700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
7893cfa8680SLisandro Dalcin   if (ptr) PetscValidPointer(ptr,2);
790e5c89e4eSSatish Balay   obj->ptr = ptr;
791e5c89e4eSSatish Balay   PetscFunctionReturn(0);
792e5c89e4eSSatish Balay }
793e5c89e4eSSatish Balay 
794e5c89e4eSSatish Balay #undef __FUNCT__
795776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerDestroy"
796e5c89e4eSSatish Balay /*@C
797776b82aeSLisandro Dalcin    PetscContainerDestroy - Destroys a PETSc container object.
798e5c89e4eSSatish Balay 
799776b82aeSLisandro Dalcin    Collective on PetscContainer
800e5c89e4eSSatish Balay 
801e5c89e4eSSatish Balay    Input Parameter:
802776b82aeSLisandro Dalcin .  obj - an object that was created with PetscContainerCreate()
803e5c89e4eSSatish Balay 
804e5c89e4eSSatish Balay    Level: advanced
805e5c89e4eSSatish Balay 
80677012dfaSBarry Smith .seealso: PetscContainerCreate(), PetscContainerSetUserDestroy()
807e5c89e4eSSatish Balay @*/
8086bf464f9SBarry Smith PetscErrorCode  PetscContainerDestroy(PetscContainer *obj)
809e5c89e4eSSatish Balay {
810e5c89e4eSSatish Balay   PetscErrorCode ierr;
811e5c89e4eSSatish Balay   PetscFunctionBegin;
8126bf464f9SBarry Smith   if (!*obj) PetscFunctionReturn(0);
8136bf464f9SBarry Smith   PetscValidHeaderSpecific(*obj,PETSC_CONTAINER_CLASSID,1);
814835d1d25SJed Brown   if (--((PetscObject)(*obj))->refct > 0) {*obj = 0; PetscFunctionReturn(0);}
8156bf464f9SBarry Smith   if ((*obj)->userdestroy) (*(*obj)->userdestroy)((*obj)->ptr);
816e5c89e4eSSatish Balay   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
817e5c89e4eSSatish Balay   PetscFunctionReturn(0);
818e5c89e4eSSatish Balay }
819e5c89e4eSSatish Balay 
820e5c89e4eSSatish Balay #undef __FUNCT__
821776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetUserDestroy"
822e5c89e4eSSatish Balay /*@C
823776b82aeSLisandro Dalcin    PetscContainerSetUserDestroy - Sets name of the user destroy function.
824e5c89e4eSSatish Balay 
8253f9fe445SBarry Smith    Logically Collective on PetscContainer
826e5c89e4eSSatish Balay 
827e5c89e4eSSatish Balay    Input Parameter:
828776b82aeSLisandro Dalcin +  obj - an object that was created with PetscContainerCreate()
829e5c89e4eSSatish Balay -  des - name of the user destroy function
830e5c89e4eSSatish Balay 
831e5c89e4eSSatish Balay    Level: advanced
832e5c89e4eSSatish Balay 
833776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy()
834e5c89e4eSSatish Balay @*/
8357087cfbeSBarry Smith PetscErrorCode  PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void*))
836e5c89e4eSSatish Balay {
837e5c89e4eSSatish Balay   PetscFunctionBegin;
8380700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
839e5c89e4eSSatish Balay   obj->userdestroy = des;
840e5c89e4eSSatish Balay   PetscFunctionReturn(0);
841e5c89e4eSSatish Balay }
842e5c89e4eSSatish Balay 
8437087cfbeSBarry Smith PetscClassId  PETSC_CONTAINER_CLASSID;
844e5c89e4eSSatish Balay 
845e5c89e4eSSatish Balay #undef __FUNCT__
846776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerCreate"
847e5c89e4eSSatish Balay /*@C
848776b82aeSLisandro Dalcin    PetscContainerCreate - Creates a PETSc object that has room to hold
849e5c89e4eSSatish Balay    a single pointer. This allows one to attach any type of data (accessible
850e5c89e4eSSatish Balay    through a pointer) with the PetscObjectCompose() function to a PetscObject.
8513c0c59f3SBarry Smith    The data item itself is attached by a call to PetscContainerSetPointer().
852e5c89e4eSSatish Balay 
853e5c89e4eSSatish Balay    Collective on MPI_Comm
854e5c89e4eSSatish Balay 
855e5c89e4eSSatish Balay    Input Parameters:
856e5c89e4eSSatish Balay .  comm - MPI communicator that shares the object
857e5c89e4eSSatish Balay 
858e5c89e4eSSatish Balay    Output Parameters:
859e5c89e4eSSatish Balay .  container - the container created
860e5c89e4eSSatish Balay 
861e5c89e4eSSatish Balay    Level: advanced
862e5c89e4eSSatish Balay 
863776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy(), PetscContainerSetPointer(), PetscContainerGetPointer()
864e5c89e4eSSatish Balay @*/
8657087cfbeSBarry Smith PetscErrorCode  PetscContainerCreate(MPI_Comm comm,PetscContainer *container)
866e5c89e4eSSatish Balay {
867e5c89e4eSSatish Balay   PetscErrorCode ierr;
868776b82aeSLisandro Dalcin   PetscContainer contain;
869e5c89e4eSSatish Balay 
870e5c89e4eSSatish Balay   PetscFunctionBegin;
8713cfa8680SLisandro Dalcin   PetscValidPointer(container,2);
8723194b578SJed Brown   ierr = PetscHeaderCreate(contain,_p_PetscContainer,PetscInt,PETSC_CONTAINER_CLASSID,0,"PetscContainer","Container","Sys",comm,PetscContainerDestroy,0);CHKERRQ(ierr);
873e5c89e4eSSatish Balay   *container = contain;
874e5c89e4eSSatish Balay   PetscFunctionReturn(0);
875e5c89e4eSSatish Balay }
876e5c89e4eSSatish Balay 
877e5c89e4eSSatish Balay #undef __FUNCT__
878e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetFromOptions"
879e5c89e4eSSatish Balay /*@
880e5c89e4eSSatish Balay    PetscObjectSetFromOptions - Sets generic parameters from user options.
881e5c89e4eSSatish Balay 
882e5c89e4eSSatish Balay    Collective on obj
883e5c89e4eSSatish Balay 
884e5c89e4eSSatish Balay    Input Parameter:
885e5c89e4eSSatish Balay .  obj - the PetscObjcet
886e5c89e4eSSatish Balay 
887e5c89e4eSSatish Balay    Options Database Keys:
888e5c89e4eSSatish Balay 
889e5c89e4eSSatish Balay    Notes:
890e5c89e4eSSatish Balay    We have no generic options at present, so this does nothing
891e5c89e4eSSatish Balay 
892e5c89e4eSSatish Balay    Level: beginner
893e5c89e4eSSatish Balay 
894e5c89e4eSSatish Balay .keywords: set, options, database
895e5c89e4eSSatish Balay .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix()
896e5c89e4eSSatish Balay @*/
8977087cfbeSBarry Smith PetscErrorCode  PetscObjectSetFromOptions(PetscObject obj)
898e5c89e4eSSatish Balay {
899e5c89e4eSSatish Balay   PetscFunctionBegin;
9003cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
901e5c89e4eSSatish Balay   PetscFunctionReturn(0);
902e5c89e4eSSatish Balay }
903e5c89e4eSSatish Balay 
904e5c89e4eSSatish Balay #undef __FUNCT__
905e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetUp"
906e5c89e4eSSatish Balay /*@
907e5c89e4eSSatish Balay    PetscObjectSetUp - Sets up the internal data structures for the later use.
908e5c89e4eSSatish Balay 
909e5c89e4eSSatish Balay    Collective on PetscObject
910e5c89e4eSSatish Balay 
911e5c89e4eSSatish Balay    Input Parameters:
912e5c89e4eSSatish Balay .  obj - the PetscObject
913e5c89e4eSSatish Balay 
914e5c89e4eSSatish Balay    Notes:
915e5c89e4eSSatish Balay    This does nothing at present.
916e5c89e4eSSatish Balay 
917e5c89e4eSSatish Balay    Level: advanced
918e5c89e4eSSatish Balay 
919e5c89e4eSSatish Balay .keywords: setup
920e5c89e4eSSatish Balay .seealso: PetscObjectDestroy()
921e5c89e4eSSatish Balay @*/
9227087cfbeSBarry Smith PetscErrorCode  PetscObjectSetUp(PetscObject obj)
923e5c89e4eSSatish Balay {
924e5c89e4eSSatish Balay   PetscFunctionBegin;
9253cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
926e5c89e4eSSatish Balay   PetscFunctionReturn(0);
927e5c89e4eSSatish Balay }
928