xref: /petsc/src/sys/objects/inherit.c (revision c457296d466dd3de681344323ebedaf97eb226ba)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manipulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5d382aafbSBarry Smith #include "petscsys.h"  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectGetComm_Petsc(PetscObject,MPI_Comm *);
8e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectCompose_Petsc(PetscObject,const char[],PetscObject);
9e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectQuery_Petsc(PetscObject,const char[],PetscObject *);
10e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject,const char[],const char[],void (*)(void));
11e5c89e4eSSatish Balay EXTERN PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject,const char[],void (**)(void));
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay #undef __FUNCT__
14e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderCreate_Private"
15e5c89e4eSSatish Balay /*
16e5c89e4eSSatish Balay    PetscHeaderCreate_Private - Creates a base PETSc object header and fills
17e5c89e4eSSatish Balay    in the default values.  Called by the macro PetscHeaderCreate().
18e5c89e4eSSatish Balay */
198738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscHeaderCreate_Private(PetscObject h,PetscClassId classid,PetscInt type,const char class_name[],MPI_Comm comm,
20e5c89e4eSSatish Balay                                          PetscErrorCode (*des)(PetscObject),PetscErrorCode (*vie)(PetscObject,PetscViewer))
21e5c89e4eSSatish Balay {
22e5c89e4eSSatish Balay   static PetscInt idcnt = 1;
23e5c89e4eSSatish Balay   PetscErrorCode  ierr;
24e5c89e4eSSatish Balay 
25e5c89e4eSSatish Balay   PetscFunctionBegin;
260700a824SBarry Smith   h->classid                = classid;
27e5c89e4eSSatish Balay   h->type                   = type;
28e5c89e4eSSatish Balay   h->class_name             = (char*)class_name;
29e5c89e4eSSatish Balay   h->prefix                 = 0;
30e5c89e4eSSatish Balay   h->refct                  = 1;
31e5c89e4eSSatish Balay   h->amem                   = -1;
32e5c89e4eSSatish Balay   h->id                     = idcnt++;
33e5c89e4eSSatish Balay   h->parentid               = 0;
34e5c89e4eSSatish Balay   h->qlist                  = 0;
35e5c89e4eSSatish Balay   h->olist                  = 0;
36e5c89e4eSSatish Balay   h->bops->destroy          = des;
37e5c89e4eSSatish Balay   h->bops->view             = vie;
38e5c89e4eSSatish Balay   h->bops->getcomm          = PetscObjectGetComm_Petsc;
39e5c89e4eSSatish Balay   h->bops->compose          = PetscObjectCompose_Petsc;
40e5c89e4eSSatish Balay   h->bops->query            = PetscObjectQuery_Petsc;
41e5c89e4eSSatish Balay   h->bops->composefunction  = PetscObjectComposeFunction_Petsc;
42e5c89e4eSSatish Balay   h->bops->queryfunction    = PetscObjectQueryFunction_Petsc;
43e5c89e4eSSatish Balay   ierr = PetscCommDuplicate(comm,&h->comm,&h->tag);CHKERRQ(ierr);
4469590be7SBarry Smith #if defined(PETSC_HAVE_AMS)
4569590be7SBarry Smith   if (PetscAMSPublishAll && classid != PETSC_VIEWER_CLASSID) {
46*c457296dSBarry Smith     ierr = PetscObjectPublish((PetscObject)h);CHKERRQ(ierr);
4769590be7SBarry Smith   }
4869590be7SBarry Smith #endif
4969590be7SBarry Smith 
50e5c89e4eSSatish Balay   PetscFunctionReturn(0);
51e5c89e4eSSatish Balay }
52e5c89e4eSSatish Balay 
53e5c89e4eSSatish Balay extern PetscTruth     PetscMemoryCollectMaximumUsage;
54e5c89e4eSSatish Balay extern PetscLogDouble PetscMemoryMaximumUsage;
55e5c89e4eSSatish Balay 
56e5c89e4eSSatish Balay #undef __FUNCT__
57e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderDestroy_Private"
58e5c89e4eSSatish Balay /*
59e5c89e4eSSatish Balay     PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by
60e5c89e4eSSatish Balay     the macro PetscHeaderDestroy().
61e5c89e4eSSatish Balay */
628738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscHeaderDestroy_Private(PetscObject h)
63e5c89e4eSSatish Balay {
64e5c89e4eSSatish Balay   PetscErrorCode ierr;
65e5c89e4eSSatish Balay 
66e5c89e4eSSatish Balay   PetscFunctionBegin;
6792e62aa6SBarry Smith #if defined(PETSC_HAVE_AMS)
6869590be7SBarry Smith   if (PetscAMSPublishAll && h->classid != PETSC_VIEWER_CLASSID) {
69*c457296dSBarry Smith     ierr = PetscObjectUnPublish((PetscObject)h);CHKERRQ(ierr);
7069590be7SBarry Smith   }
7192e62aa6SBarry Smith #endif
72e5c89e4eSSatish Balay   if (PetscMemoryCollectMaximumUsage) {
73e5c89e4eSSatish Balay     PetscLogDouble usage;
74e5c89e4eSSatish Balay     ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr);
75e5c89e4eSSatish Balay     if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage;
76e5c89e4eSSatish Balay   }
7708a557f7SLisandro Dalcin   /* first destroy things that could execute arbitrary code */
7808a557f7SLisandro Dalcin   if (h->python_destroy) {
7908a557f7SLisandro Dalcin     void           *python_context          = h->python_context;
8008a557f7SLisandro Dalcin     PetscErrorCode (*python_destroy)(void*) = h->python_destroy;
8108a557f7SLisandro Dalcin     h->python_context = 0;
8208a557f7SLisandro Dalcin     h->python_destroy = 0;
8308a557f7SLisandro Dalcin     ierr = (*python_destroy)(python_context);CHKERRQ(ierr);
8408a557f7SLisandro Dalcin   }
859c666560SBarry Smith   ierr = PetscOListDestroy(h->olist);CHKERRQ(ierr);
8608a557f7SLisandro Dalcin   ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr);
8708a557f7SLisandro Dalcin   /* next destroy other things */
880700a824SBarry Smith   h->classid = PETSCFREEDHEADER;
8908a557f7SLisandro Dalcin   ierr = PetscFree(h->bops);CHKERRQ(ierr);
901441b1d3SBarry Smith   ierr = PetscFListDestroy(&h->qlist);CHKERRQ(ierr);
91503cfb0cSBarry Smith   ierr = PetscFree(h->type_name);CHKERRQ(ierr);
92503cfb0cSBarry Smith   ierr = PetscFree(h->name);CHKERRQ(ierr);
93503cfb0cSBarry Smith   ierr = PetscFree(h->prefix);CHKERRQ(ierr);
94e5c89e4eSSatish Balay   ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr);
95e5c89e4eSSatish Balay   ierr = PetscFree(h->intcomposeddata);CHKERRQ(ierr);
96e5c89e4eSSatish Balay   ierr = PetscFree(h->intcomposedstate);CHKERRQ(ierr);
97e5c89e4eSSatish Balay   ierr = PetscFree(h->realcomposeddata);CHKERRQ(ierr);
98e5c89e4eSSatish Balay   ierr = PetscFree(h->realcomposedstate);CHKERRQ(ierr);
99e5c89e4eSSatish Balay   ierr = PetscFree(h->scalarcomposeddata);CHKERRQ(ierr);
100e5c89e4eSSatish Balay   ierr = PetscFree(h->scalarcomposedstate);CHKERRQ(ierr);
101e5c89e4eSSatish Balay   PetscFunctionReturn(0);
102e5c89e4eSSatish Balay }
103e5c89e4eSSatish Balay 
104e5c89e4eSSatish Balay #undef __FUNCT__
105af272810SBarry Smith #define __FUNCT__ "PetscObjectAddOptionsHandler"
106af272810SBarry Smith /*@C
107af272810SBarry Smith     PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called.
108af272810SBarry Smith 
109af272810SBarry Smith     Not Collective
110af272810SBarry Smith 
111af272810SBarry Smith     Input Parameter:
112af272810SBarry Smith +   obj - the PETSc object
113af272810SBarry Smith .   handle - function that checks for options
114af272810SBarry Smith .   destroy - function to destroy context if provided
115af272810SBarry Smith -   ctx - optional context for check function
116af272810SBarry Smith 
117af272810SBarry Smith     Level: developer
118af272810SBarry Smith 
119af272810SBarry Smith 
120af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers()
121af272810SBarry Smith 
122af272810SBarry Smith @*/
1238738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx)
124af272810SBarry Smith {
125af272810SBarry Smith   PetscFunctionBegin;
126af272810SBarry Smith   if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added");
127af272810SBarry Smith   obj->optionhandler[obj->noptionhandler]   = handle;
128af272810SBarry Smith   obj->optiondestroy[obj->noptionhandler]   = destroy;
129af272810SBarry Smith   obj->optionctx[obj->noptionhandler++]     = ctx;
130af272810SBarry Smith   PetscFunctionReturn(0);
131af272810SBarry Smith }
132af272810SBarry Smith 
133af272810SBarry Smith #undef __FUNCT__
134af272810SBarry Smith #define __FUNCT__ "PetscObjectProcessOptionsHandlers"
135af272810SBarry Smith /*@C
136af272810SBarry Smith     PetscObjectProcessOptionsHandlers - Calls all the options handler attached to an object
137af272810SBarry Smith 
138af272810SBarry Smith     Not Collective
139af272810SBarry Smith 
140af272810SBarry Smith     Input Parameter:
141af272810SBarry Smith .   obj - the PETSc object
142af272810SBarry Smith 
143af272810SBarry Smith     Level: developer
144af272810SBarry Smith 
145af272810SBarry Smith 
146af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectDestroyOptionsHandlers()
147af272810SBarry Smith 
148af272810SBarry Smith @*/
1498738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectProcessOptionsHandlers(PetscObject obj)
150af272810SBarry Smith {
151af272810SBarry Smith   PetscInt       i;
152af272810SBarry Smith   PetscErrorCode ierr;
153af272810SBarry Smith 
154af272810SBarry Smith   PetscFunctionBegin;
155af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
156af272810SBarry Smith     ierr = (*obj->optionhandler[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
157af272810SBarry Smith   }
158af272810SBarry Smith   PetscFunctionReturn(0);
159af272810SBarry Smith }
160af272810SBarry Smith 
161af272810SBarry Smith #undef __FUNCT__
162af272810SBarry Smith #define __FUNCT__ "PetscObjectDestroyOptionsHandlers"
163af272810SBarry Smith /*@C
164af272810SBarry Smith     PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an objeft
165af272810SBarry Smith 
166af272810SBarry Smith     Not Collective
167af272810SBarry Smith 
168af272810SBarry Smith     Input Parameter:
169af272810SBarry Smith .   obj - the PETSc object
170af272810SBarry Smith 
171af272810SBarry Smith     Level: developer
172af272810SBarry Smith 
173af272810SBarry Smith 
174af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectProcessOptionsHandlers()
175af272810SBarry Smith 
176af272810SBarry Smith @*/
1778738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectDestroyOptionsHandlers(PetscObject obj)
178af272810SBarry Smith {
179af272810SBarry Smith   PetscInt       i;
180af272810SBarry Smith   PetscErrorCode ierr;
181af272810SBarry Smith 
182af272810SBarry Smith   PetscFunctionBegin;
183af272810SBarry Smith   for (i=0; i<obj->noptionhandler; i++) {
184af272810SBarry Smith     ierr = (*obj->optiondestroy[i])(obj,obj->optionctx[i]);CHKERRQ(ierr);
185af272810SBarry Smith   }
186af272810SBarry Smith   obj->noptionhandler = 0;
187af272810SBarry Smith   PetscFunctionReturn(0);
188af272810SBarry Smith }
189af272810SBarry Smith 
190af272810SBarry Smith 
191af272810SBarry Smith #undef __FUNCT__
192e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectReference"
193ee978a2eSBarry Smith /*@
194e5c89e4eSSatish Balay    PetscObjectReference - Indicates to any PetscObject that it is being
195e5c89e4eSSatish Balay    referenced by another PetscObject. This increases the reference
196e5c89e4eSSatish Balay    count for that object by one.
197e5c89e4eSSatish Balay 
1983f9fe445SBarry Smith    Logically Collective on PetscObject
199e5c89e4eSSatish Balay 
200e5c89e4eSSatish Balay    Input Parameter:
201e5c89e4eSSatish Balay .  obj - the PETSc object. This must be cast with (PetscObject), for example,
202e5c89e4eSSatish Balay          PetscObjectReference((PetscObject)mat);
203e5c89e4eSSatish Balay 
204e5c89e4eSSatish Balay    Level: advanced
205e5c89e4eSSatish Balay 
206e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference()
207e5c89e4eSSatish Balay @*/
2088738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectReference(PetscObject obj)
209e5c89e4eSSatish Balay {
210e5c89e4eSSatish Balay   PetscFunctionBegin;
211e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
212e5c89e4eSSatish Balay   obj->refct++;
213e5c89e4eSSatish Balay   PetscFunctionReturn(0);
214e5c89e4eSSatish Balay }
215e5c89e4eSSatish Balay 
216e5c89e4eSSatish Balay #undef __FUNCT__
217e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetReference"
218ee978a2eSBarry Smith /*@
219e5c89e4eSSatish Balay    PetscObjectGetReference - Gets the current reference count for
220e5c89e4eSSatish Balay    any PETSc object.
221e5c89e4eSSatish Balay 
222e5c89e4eSSatish Balay    Not Collective
223e5c89e4eSSatish Balay 
224e5c89e4eSSatish Balay    Input Parameter:
225e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
226e5c89e4eSSatish Balay          PetscObjectGetReference((PetscObject)mat,&cnt);
227e5c89e4eSSatish Balay 
228e5c89e4eSSatish Balay    Output Parameter:
229e5c89e4eSSatish Balay .  cnt - the reference count
230e5c89e4eSSatish Balay 
231e5c89e4eSSatish Balay    Level: advanced
232e5c89e4eSSatish Balay 
233e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference()
234e5c89e4eSSatish Balay @*/
2358738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectGetReference(PetscObject obj,PetscInt *cnt)
236e5c89e4eSSatish Balay {
237e5c89e4eSSatish Balay   PetscFunctionBegin;
238e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
239e5c89e4eSSatish Balay   PetscValidIntPointer(cnt,2);
240e5c89e4eSSatish Balay   *cnt = obj->refct;
241e5c89e4eSSatish Balay   PetscFunctionReturn(0);
242e5c89e4eSSatish Balay }
243e5c89e4eSSatish Balay 
244e5c89e4eSSatish Balay #undef __FUNCT__
245e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDereference"
246e5c89e4eSSatish Balay /*@
247e5c89e4eSSatish Balay    PetscObjectDereference - Indicates to any PetscObject that it is being
248e5c89e4eSSatish Balay    referenced by one less PetscObject. This decreases the reference
249e5c89e4eSSatish Balay    count for that object by one.
250e5c89e4eSSatish Balay 
2513f9fe445SBarry Smith    Collective on PetscObject if reference reaches 0 otherwise Logically Collective
252e5c89e4eSSatish Balay 
253e5c89e4eSSatish Balay    Input Parameter:
254e5c89e4eSSatish Balay .  obj - the PETSc object; this must be cast with (PetscObject), for example,
255e5c89e4eSSatish Balay          PetscObjectDereference((PetscObject)mat);
256e5c89e4eSSatish Balay 
257e5c89e4eSSatish Balay    Level: advanced
258e5c89e4eSSatish Balay 
259e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectReference()
260e5c89e4eSSatish Balay @*/
2618738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectDereference(PetscObject obj)
262e5c89e4eSSatish Balay {
263e5c89e4eSSatish Balay   PetscErrorCode ierr;
264e5c89e4eSSatish Balay 
265e5c89e4eSSatish Balay   PetscFunctionBegin;
266e5c89e4eSSatish Balay   PetscValidHeader(obj,1);
267e5c89e4eSSatish Balay   if (obj->bops->destroy) {
268e5c89e4eSSatish Balay     ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr);
269e5c89e4eSSatish Balay   } else if (!--obj->refct) {
270e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine");
271e5c89e4eSSatish Balay   }
272e5c89e4eSSatish Balay   PetscFunctionReturn(0);
273e5c89e4eSSatish Balay }
274e5c89e4eSSatish Balay 
275e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */
276e5c89e4eSSatish Balay /*
277e5c89e4eSSatish Balay      The following routines are the versions private to the PETSc object
278e5c89e4eSSatish Balay      data structures.
279e5c89e4eSSatish Balay */
280e5c89e4eSSatish Balay #undef __FUNCT__
281e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetComm_Petsc"
282e5c89e4eSSatish Balay PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm)
283e5c89e4eSSatish Balay {
284e5c89e4eSSatish Balay   PetscFunctionBegin;
285e5c89e4eSSatish Balay   *comm = obj->comm;
286e5c89e4eSSatish Balay   PetscFunctionReturn(0);
287e5c89e4eSSatish Balay }
288e5c89e4eSSatish Balay 
289e5c89e4eSSatish Balay #undef __FUNCT__
290e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose_Petsc"
291e5c89e4eSSatish Balay PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr)
292e5c89e4eSSatish Balay {
293e5c89e4eSSatish Balay   PetscErrorCode ierr;
294e5c89e4eSSatish Balay   char           *tname;
295e5c89e4eSSatish Balay 
296e5c89e4eSSatish Balay   PetscFunctionBegin;
297e5c89e4eSSatish Balay   if (ptr) {
298e5c89e4eSSatish Balay     ierr = PetscOListReverseFind(ptr->olist,obj,&tname);CHKERRQ(ierr);
29917186662SBarry Smith     if (tname) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_INCOMP,"An object cannot be composed with an object that was compose with it");
300e5c89e4eSSatish Balay   }
301e5c89e4eSSatish Balay   ierr = PetscOListAdd(&obj->olist,name,ptr);CHKERRQ(ierr);
302e5c89e4eSSatish Balay   PetscFunctionReturn(0);
303e5c89e4eSSatish Balay }
304e5c89e4eSSatish Balay 
305e5c89e4eSSatish Balay #undef __FUNCT__
306e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery_Petsc"
307e5c89e4eSSatish Balay PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr)
308e5c89e4eSSatish Balay {
309e5c89e4eSSatish Balay   PetscErrorCode ierr;
310e5c89e4eSSatish Balay 
311e5c89e4eSSatish Balay   PetscFunctionBegin;
312e5c89e4eSSatish Balay   ierr = PetscOListFind(obj->olist,name,ptr);CHKERRQ(ierr);
313e5c89e4eSSatish Balay   PetscFunctionReturn(0);
314e5c89e4eSSatish Balay }
315e5c89e4eSSatish Balay 
316e5c89e4eSSatish Balay #undef __FUNCT__
317e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction_Petsc"
318e5c89e4eSSatish Balay PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
319e5c89e4eSSatish Balay {
320e5c89e4eSSatish Balay   PetscErrorCode ierr;
321e5c89e4eSSatish Balay 
322e5c89e4eSSatish Balay   PetscFunctionBegin;
323e5c89e4eSSatish Balay   ierr = PetscFListAdd(&obj->qlist,name,fname,ptr);CHKERRQ(ierr);
324e5c89e4eSSatish Balay   PetscFunctionReturn(0);
325e5c89e4eSSatish Balay }
326e5c89e4eSSatish Balay 
327e5c89e4eSSatish Balay #undef __FUNCT__
328e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction_Petsc"
329e5c89e4eSSatish Balay PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void))
330e5c89e4eSSatish Balay {
331e5c89e4eSSatish Balay   PetscErrorCode ierr;
332e5c89e4eSSatish Balay 
333e5c89e4eSSatish Balay   PetscFunctionBegin;
3341d280d73SBarry Smith   ierr = PetscFListFind(obj->qlist,obj->comm,name,ptr);CHKERRQ(ierr);
335e5c89e4eSSatish Balay   PetscFunctionReturn(0);
336e5c89e4eSSatish Balay }
337e5c89e4eSSatish Balay 
338e5c89e4eSSatish Balay /*
339e5c89e4eSSatish Balay         These are the versions that are usable to any CCA compliant objects
340e5c89e4eSSatish Balay */
341e5c89e4eSSatish Balay #undef __FUNCT__
342e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose"
343e5c89e4eSSatish Balay /*@C
344e5c89e4eSSatish Balay    PetscObjectCompose - Associates another PETSc object with a given PETSc object.
345e5c89e4eSSatish Balay 
346e5c89e4eSSatish Balay    Not Collective
347e5c89e4eSSatish Balay 
348e5c89e4eSSatish Balay    Input Parameters:
349e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
350e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
351e5c89e4eSSatish Balay .  name - name associated with the child object
352e5c89e4eSSatish Balay -  ptr - the other PETSc object to associate with the PETSc object; this must also be
353e5c89e4eSSatish Balay          cast with (PetscObject)
354e5c89e4eSSatish Balay 
355e5c89e4eSSatish Balay    Level: advanced
356e5c89e4eSSatish Balay 
357e5c89e4eSSatish Balay    Notes:
358e5c89e4eSSatish Balay    The second objects reference count is automatically increased by one when it is
359e5c89e4eSSatish Balay    composed.
360e5c89e4eSSatish Balay 
361e5c89e4eSSatish Balay    Replaces any previous object that had the same name.
362e5c89e4eSSatish Balay 
363e5c89e4eSSatish Balay    If ptr is null and name has previously been composed using an object, then that
364e5c89e4eSSatish Balay    entry is removed from the obj.
365e5c89e4eSSatish Balay 
366e5c89e4eSSatish Balay    PetscObjectCompose() can be used with any PETSc object (such as
367e5c89e4eSSatish Balay    Mat, Vec, KSP, SNES, etc.) or any user-provided object.  See
368776b82aeSLisandro Dalcin    PetscContainerCreate() for info on how to create an object from a
369e5c89e4eSSatish Balay    user-provided pointer that may then be composed with PETSc objects.
370e5c89e4eSSatish Balay 
371e5c89e4eSSatish Balay    Concepts: objects^composing
372e5c89e4eSSatish Balay    Concepts: composing objects
373e5c89e4eSSatish Balay 
374776b82aeSLisandro Dalcin .seealso: PetscObjectQuery(), PetscContainerCreate()
375e5c89e4eSSatish Balay @*/
3768738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr)
377e5c89e4eSSatish Balay {
378e5c89e4eSSatish Balay   PetscErrorCode ierr;
379e5c89e4eSSatish Balay 
380e5c89e4eSSatish Balay   PetscFunctionBegin;
3813cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
3823cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
3833cfa8680SLisandro Dalcin   if (ptr) PetscValidHeader(ptr,3);
384e5c89e4eSSatish Balay   ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr);
385e5c89e4eSSatish Balay   PetscFunctionReturn(0);
386e5c89e4eSSatish Balay }
387e5c89e4eSSatish Balay 
3889f8a2776SDmitry Karpeev 
3899f8a2776SDmitry Karpeev 
390e5c89e4eSSatish Balay #undef __FUNCT__
391e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery"
392e5c89e4eSSatish Balay /*@C
393e5c89e4eSSatish Balay    PetscObjectQuery  - Gets a PETSc object associated with a given object.
394e5c89e4eSSatish Balay 
395e5c89e4eSSatish Balay    Not Collective
396e5c89e4eSSatish Balay 
397e5c89e4eSSatish Balay    Input Parameters:
398e5c89e4eSSatish Balay +  obj - the PETSc object
399e5c89e4eSSatish Balay          Thus must be cast with a (PetscObject), for example,
400e5c89e4eSSatish Balay          PetscObjectCompose((PetscObject)mat,...);
401e5c89e4eSSatish Balay .  name - name associated with child object
402e5c89e4eSSatish Balay -  ptr - the other PETSc object associated with the PETSc object, this must also be
403e5c89e4eSSatish Balay          cast with (PetscObject)
404e5c89e4eSSatish Balay 
405e5c89e4eSSatish Balay    Level: advanced
406e5c89e4eSSatish Balay 
407e5c89e4eSSatish Balay    Concepts: objects^composing
408e5c89e4eSSatish Balay    Concepts: composing objects
409e5c89e4eSSatish Balay    Concepts: objects^querying
410e5c89e4eSSatish Balay    Concepts: querying objects
411e5c89e4eSSatish Balay 
412e5c89e4eSSatish Balay .seealso: PetscObjectQuery()
413e5c89e4eSSatish Balay @*/
4148738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr)
415e5c89e4eSSatish Balay {
416e5c89e4eSSatish Balay   PetscErrorCode ierr;
417e5c89e4eSSatish Balay 
418e5c89e4eSSatish Balay   PetscFunctionBegin;
4193cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
4203cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
4213cfa8680SLisandro Dalcin   PetscValidPointer(ptr,3);
422e5c89e4eSSatish Balay   ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr);
423e5c89e4eSSatish Balay   PetscFunctionReturn(0);
424e5c89e4eSSatish Balay }
425e5c89e4eSSatish Balay 
426e5c89e4eSSatish Balay #undef __FUNCT__
427e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction"
4288738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
429e5c89e4eSSatish Balay {
430e5c89e4eSSatish Balay   PetscErrorCode ierr;
431e5c89e4eSSatish Balay 
432e5c89e4eSSatish Balay   PetscFunctionBegin;
4333cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
4343cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
4353cfa8680SLisandro Dalcin   PetscValidCharPointer(fname,2);
436e5c89e4eSSatish Balay   ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr);
437e5c89e4eSSatish Balay   PetscFunctionReturn(0);
438e5c89e4eSSatish Balay }
439e5c89e4eSSatish Balay 
440e5c89e4eSSatish Balay #undef __FUNCT__
441e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction"
442e5c89e4eSSatish Balay /*@C
443e5c89e4eSSatish Balay    PetscObjectQueryFunction - Gets a function associated with a given object.
444e5c89e4eSSatish Balay 
4453f9fe445SBarry Smith    Logically Collective on PetscObject
446e5c89e4eSSatish Balay 
447e5c89e4eSSatish Balay    Input Parameters:
448e5c89e4eSSatish Balay +  obj - the PETSc object; this must be cast with (PetscObject), for example,
449e5c89e4eSSatish Balay          PetscObjectQueryFunction((PetscObject)ksp,...);
450e5c89e4eSSatish Balay -  name - name associated with the child function
451e5c89e4eSSatish Balay 
452e5c89e4eSSatish Balay    Output Parameter:
453e5c89e4eSSatish Balay .  ptr - function pointer
454e5c89e4eSSatish Balay 
455e5c89e4eSSatish Balay    Level: advanced
456e5c89e4eSSatish Balay 
457e5c89e4eSSatish Balay    Concepts: objects^composing functions
458e5c89e4eSSatish Balay    Concepts: composing functions
459e5c89e4eSSatish Balay    Concepts: functions^querying
460e5c89e4eSSatish Balay    Concepts: objects^querying
461e5c89e4eSSatish Balay    Concepts: querying objects
462e5c89e4eSSatish Balay 
463e5c89e4eSSatish Balay .seealso: PetscObjectComposeFunctionDynamic()
464e5c89e4eSSatish Balay @*/
4658738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void))
466e5c89e4eSSatish Balay {
467e5c89e4eSSatish Balay   PetscErrorCode ierr;
468e5c89e4eSSatish Balay 
469e5c89e4eSSatish Balay   PetscFunctionBegin;
4703cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
4713cfa8680SLisandro Dalcin   PetscValidCharPointer(name,2);
472e5c89e4eSSatish Balay   ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr);
473e5c89e4eSSatish Balay   PetscFunctionReturn(0);
474e5c89e4eSSatish Balay }
475e5c89e4eSSatish Balay 
476776b82aeSLisandro Dalcin struct _p_PetscContainer {
477e5c89e4eSSatish Balay   PETSCHEADER(int);
478e5c89e4eSSatish Balay   void   *ptr;
479e5c89e4eSSatish Balay   PetscErrorCode (*userdestroy)(void*);
480e5c89e4eSSatish Balay };
481e5c89e4eSSatish Balay 
482e5c89e4eSSatish Balay #undef __FUNCT__
483776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerGetPointer"
484e5c89e4eSSatish Balay /*@C
485776b82aeSLisandro Dalcin    PetscContainerGetPointer - Gets the pointer value contained in the container.
486e5c89e4eSSatish Balay 
4873f9fe445SBarry Smith    Not Collective
488e5c89e4eSSatish Balay 
489e5c89e4eSSatish Balay    Input Parameter:
490776b82aeSLisandro Dalcin .  obj - the object created with PetscContainerCreate()
491e5c89e4eSSatish Balay 
492e5c89e4eSSatish Balay    Output Parameter:
493e5c89e4eSSatish Balay .  ptr - the pointer value
494e5c89e4eSSatish Balay 
495e5c89e4eSSatish Balay    Level: advanced
496e5c89e4eSSatish Balay 
497776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
498776b82aeSLisandro Dalcin           PetscContainerSetPointer()
499e5c89e4eSSatish Balay @*/
5008738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerGetPointer(PetscContainer obj,void **ptr)
501e5c89e4eSSatish Balay {
502e5c89e4eSSatish Balay   PetscFunctionBegin;
5030700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
5043cfa8680SLisandro Dalcin   PetscValidPointer(ptr,2);
505e5c89e4eSSatish Balay   *ptr = obj->ptr;
506e5c89e4eSSatish Balay   PetscFunctionReturn(0);
507e5c89e4eSSatish Balay }
508e5c89e4eSSatish Balay 
509e5c89e4eSSatish Balay 
510e5c89e4eSSatish Balay #undef __FUNCT__
511776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetPointer"
512e5c89e4eSSatish Balay /*@C
513776b82aeSLisandro Dalcin    PetscContainerSetPointer - Sets the pointer value contained in the container.
514e5c89e4eSSatish Balay 
5153f9fe445SBarry Smith    Logically Collective on PetscContainer
516e5c89e4eSSatish Balay 
517e5c89e4eSSatish Balay    Input Parameters:
518776b82aeSLisandro Dalcin +  obj - the object created with PetscContainerCreate()
519e5c89e4eSSatish Balay -  ptr - the pointer value
520e5c89e4eSSatish Balay 
521e5c89e4eSSatish Balay    Level: advanced
522e5c89e4eSSatish Balay 
523776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(),
524776b82aeSLisandro Dalcin           PetscContainerGetPointer()
525e5c89e4eSSatish Balay @*/
5268738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerSetPointer(PetscContainer obj,void *ptr)
527e5c89e4eSSatish Balay {
528e5c89e4eSSatish Balay   PetscFunctionBegin;
5290700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
5303cfa8680SLisandro Dalcin   if (ptr) PetscValidPointer(ptr,2);
531e5c89e4eSSatish Balay   obj->ptr = ptr;
532e5c89e4eSSatish Balay   PetscFunctionReturn(0);
533e5c89e4eSSatish Balay }
534e5c89e4eSSatish Balay 
535e5c89e4eSSatish Balay #undef __FUNCT__
536776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerDestroy"
537e5c89e4eSSatish Balay /*@C
538776b82aeSLisandro Dalcin    PetscContainerDestroy - Destroys a PETSc container object.
539e5c89e4eSSatish Balay 
540776b82aeSLisandro Dalcin    Collective on PetscContainer
541e5c89e4eSSatish Balay 
542e5c89e4eSSatish Balay    Input Parameter:
543776b82aeSLisandro Dalcin .  obj - an object that was created with PetscContainerCreate()
544e5c89e4eSSatish Balay 
545e5c89e4eSSatish Balay    Level: advanced
546e5c89e4eSSatish Balay 
547776b82aeSLisandro Dalcin .seealso: PetscContainerCreate()
548e5c89e4eSSatish Balay @*/
5498738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerDestroy(PetscContainer obj)
550e5c89e4eSSatish Balay {
551e5c89e4eSSatish Balay   PetscErrorCode ierr;
552e5c89e4eSSatish Balay   PetscFunctionBegin;
5530700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
5547adad957SLisandro Dalcin   if (--((PetscObject)obj)->refct > 0) PetscFunctionReturn(0);
555e5c89e4eSSatish Balay   if (obj->userdestroy) (*obj->userdestroy)(obj->ptr);
556e5c89e4eSSatish Balay   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
557e5c89e4eSSatish Balay   PetscFunctionReturn(0);
558e5c89e4eSSatish Balay }
559e5c89e4eSSatish Balay 
560e5c89e4eSSatish Balay #undef __FUNCT__
561776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetUserDestroy"
562e5c89e4eSSatish Balay /*@C
563776b82aeSLisandro Dalcin    PetscContainerSetUserDestroy - Sets name of the user destroy function.
564e5c89e4eSSatish Balay 
5653f9fe445SBarry Smith    Logically Collective on PetscContainer
566e5c89e4eSSatish Balay 
567e5c89e4eSSatish Balay    Input Parameter:
568776b82aeSLisandro Dalcin +  obj - an object that was created with PetscContainerCreate()
569e5c89e4eSSatish Balay -  des - name of the user destroy function
570e5c89e4eSSatish Balay 
571e5c89e4eSSatish Balay    Level: advanced
572e5c89e4eSSatish Balay 
573776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy()
574e5c89e4eSSatish Balay @*/
5758738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void*))
576e5c89e4eSSatish Balay {
577e5c89e4eSSatish Balay   PetscFunctionBegin;
5780700a824SBarry Smith   PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1);
579e5c89e4eSSatish Balay   obj->userdestroy = des;
580e5c89e4eSSatish Balay   PetscFunctionReturn(0);
581e5c89e4eSSatish Balay }
582e5c89e4eSSatish Balay 
5838738c821SJed Brown PetscClassId PETSCSYS_DLLEXPORT PETSC_CONTAINER_CLASSID;
584e5c89e4eSSatish Balay 
585e5c89e4eSSatish Balay #undef __FUNCT__
586776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerCreate"
587e5c89e4eSSatish Balay /*@C
588776b82aeSLisandro Dalcin    PetscContainerCreate - Creates a PETSc object that has room to hold
589e5c89e4eSSatish Balay    a single pointer. This allows one to attach any type of data (accessible
590e5c89e4eSSatish Balay    through a pointer) with the PetscObjectCompose() function to a PetscObject.
591776b82aeSLisandro Dalcin    The data item itself is attached by a call to PetscContainerSetPointer.
592e5c89e4eSSatish Balay 
593e5c89e4eSSatish Balay    Collective on MPI_Comm
594e5c89e4eSSatish Balay 
595e5c89e4eSSatish Balay    Input Parameters:
596e5c89e4eSSatish Balay .  comm - MPI communicator that shares the object
597e5c89e4eSSatish Balay 
598e5c89e4eSSatish Balay    Output Parameters:
599e5c89e4eSSatish Balay .  container - the container created
600e5c89e4eSSatish Balay 
601e5c89e4eSSatish Balay    Level: advanced
602e5c89e4eSSatish Balay 
603776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy(), PetscContainerSetPointer(), PetscContainerGetPointer()
604e5c89e4eSSatish Balay @*/
6058738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscContainerCreate(MPI_Comm comm,PetscContainer *container)
606e5c89e4eSSatish Balay {
607e5c89e4eSSatish Balay   PetscErrorCode ierr;
608776b82aeSLisandro Dalcin   PetscContainer contain;
609e5c89e4eSSatish Balay 
610e5c89e4eSSatish Balay   PetscFunctionBegin;
6113cfa8680SLisandro Dalcin   PetscValidPointer(container,2);
6120700a824SBarry Smith   ierr = PetscHeaderCreate(contain,_p_PetscContainer,PetscInt,PETSC_CONTAINER_CLASSID,0,"PetscContainer",comm,PetscContainerDestroy,0);CHKERRQ(ierr);
613e5c89e4eSSatish Balay   *container = contain;
614e5c89e4eSSatish Balay   PetscFunctionReturn(0);
615e5c89e4eSSatish Balay }
616e5c89e4eSSatish Balay 
617e5c89e4eSSatish Balay #undef __FUNCT__
618e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetFromOptions"
619e5c89e4eSSatish Balay /*@
620e5c89e4eSSatish Balay    PetscObjectSetFromOptions - Sets generic parameters from user options.
621e5c89e4eSSatish Balay 
622e5c89e4eSSatish Balay    Collective on obj
623e5c89e4eSSatish Balay 
624e5c89e4eSSatish Balay    Input Parameter:
625e5c89e4eSSatish Balay .  obj - the PetscObjcet
626e5c89e4eSSatish Balay 
627e5c89e4eSSatish Balay    Options Database Keys:
628e5c89e4eSSatish Balay 
629e5c89e4eSSatish Balay    Notes:
630e5c89e4eSSatish Balay    We have no generic options at present, so this does nothing
631e5c89e4eSSatish Balay 
632e5c89e4eSSatish Balay    Level: beginner
633e5c89e4eSSatish Balay 
634e5c89e4eSSatish Balay .keywords: set, options, database
635e5c89e4eSSatish Balay .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix()
636e5c89e4eSSatish Balay @*/
6378738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectSetFromOptions(PetscObject obj)
638e5c89e4eSSatish Balay {
639e5c89e4eSSatish Balay   PetscFunctionBegin;
6403cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
641e5c89e4eSSatish Balay   PetscFunctionReturn(0);
642e5c89e4eSSatish Balay }
643e5c89e4eSSatish Balay 
644e5c89e4eSSatish Balay #undef __FUNCT__
645e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetUp"
646e5c89e4eSSatish Balay /*@
647e5c89e4eSSatish Balay    PetscObjectSetUp - Sets up the internal data structures for the later use.
648e5c89e4eSSatish Balay 
649e5c89e4eSSatish Balay    Collective on PetscObject
650e5c89e4eSSatish Balay 
651e5c89e4eSSatish Balay    Input Parameters:
652e5c89e4eSSatish Balay .  obj - the PetscObject
653e5c89e4eSSatish Balay 
654e5c89e4eSSatish Balay    Notes:
655e5c89e4eSSatish Balay    This does nothing at present.
656e5c89e4eSSatish Balay 
657e5c89e4eSSatish Balay    Level: advanced
658e5c89e4eSSatish Balay 
659e5c89e4eSSatish Balay .keywords: setup
660e5c89e4eSSatish Balay .seealso: PetscObjectDestroy()
661e5c89e4eSSatish Balay @*/
6628738c821SJed Brown PetscErrorCode PETSCSYS_DLLEXPORT PetscObjectSetUp(PetscObject obj)
663e5c89e4eSSatish Balay {
664e5c89e4eSSatish Balay   PetscFunctionBegin;
6653cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
666e5c89e4eSSatish Balay   PetscFunctionReturn(0);
667e5c89e4eSSatish Balay }
668