xref: /petsc/src/sys/objects/inherit.c (revision db090513750e512db36c746fd2b7b9368f9e7cc5)
1 #define PETSC_DLL
2 /*
3      Provides utility routines for manipulating any type of PETSc object.
4 */
5 #include "petsc.h"  /*I   "petsc.h"    I*/
6 #include "petscsys.h"
7 
8 EXTERN PetscErrorCode PetscObjectGetComm_Petsc(PetscObject,MPI_Comm *);
9 EXTERN PetscErrorCode PetscObjectCompose_Petsc(PetscObject,const char[],PetscObject);
10 EXTERN PetscErrorCode PetscObjectQuery_Petsc(PetscObject,const char[],PetscObject *);
11 EXTERN PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject,const char[],const char[],void (*)(void));
12 EXTERN PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject,const char[],void (**)(void));
13 EXTERN PetscErrorCode PetscObjectComposeLanguage_Petsc(PetscObject,PetscLanguage,void *);
14 EXTERN PetscErrorCode PetscObjectQueryLanguage_Petsc(PetscObject,PetscLanguage,void **);
15 
16 #undef __FUNCT__
17 #define __FUNCT__ "PetscHeaderCreate_Private"
18 /*
19    PetscHeaderCreate_Private - Creates a base PETSc object header and fills
20    in the default values.  Called by the macro PetscHeaderCreate().
21 */
22 PetscErrorCode PETSC_DLLEXPORT PetscHeaderCreate_Private(PetscObject h,PetscCookie cookie,PetscInt type,const char class_name[],MPI_Comm comm,
23                                          PetscErrorCode (*des)(PetscObject),PetscErrorCode (*vie)(PetscObject,PetscViewer))
24 {
25   static PetscInt idcnt = 1;
26   PetscErrorCode  ierr;
27 
28   PetscFunctionBegin;
29   h->cookie                 = cookie;
30   h->type                   = type;
31   h->class_name             = (char*)class_name;
32   h->prefix                 = 0;
33   h->refct                  = 1;
34   h->amem                   = -1;
35   h->id                     = idcnt++;
36   h->parentid               = 0;
37   h->qlist                  = 0;
38   h->olist                  = 0;
39   h->bops->destroy          = des;
40   h->bops->view             = vie;
41   h->bops->getcomm          = PetscObjectGetComm_Petsc;
42   h->bops->compose          = PetscObjectCompose_Petsc;
43   h->bops->query            = PetscObjectQuery_Petsc;
44   h->bops->composefunction  = PetscObjectComposeFunction_Petsc;
45   h->bops->queryfunction    = PetscObjectQueryFunction_Petsc;
46   h->bops->querylanguage    = PetscObjectQueryLanguage_Petsc;
47   h->bops->composelanguage  = PetscObjectComposeLanguage_Petsc;
48   ierr = PetscCommDuplicate(comm,&h->comm,&h->tag);CHKERRQ(ierr);
49   PetscFunctionReturn(0);
50 }
51 
52 extern PetscTruth     PetscMemoryCollectMaximumUsage;
53 extern PetscLogDouble PetscMemoryMaximumUsage;
54 
55 #undef __FUNCT__
56 #define __FUNCT__ "PetscHeaderDestroy_Private"
57 /*
58     PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by
59     the macro PetscHeaderDestroy().
60 */
61 PetscErrorCode PETSC_DLLEXPORT PetscHeaderDestroy_Private(PetscObject h)
62 {
63   PetscErrorCode ierr;
64 
65   PetscFunctionBegin;
66   if (PetscMemoryCollectMaximumUsage) {
67     PetscLogDouble usage;
68     ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr);
69     if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage;
70   }
71   ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr);
72   ierr = PetscFree(h->bops);CHKERRQ(ierr);
73   ierr = PetscFree(h->ops);CHKERRQ(ierr);
74   ierr = PetscOListDestroy(&h->olist);CHKERRQ(ierr);
75   ierr = PetscFListDestroy(&h->qlist);CHKERRQ(ierr);
76   ierr = PetscStrfree(h->type_name);CHKERRQ(ierr);
77   ierr = PetscStrfree(h->name);CHKERRQ(ierr);
78   h->cookie = PETSCFREEDHEADER;
79   ierr = PetscStrfree(h->prefix);CHKERRQ(ierr);
80   if (h->fortran_func_pointers) {
81     ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr);
82   }
83   if (h->intcomposeddata) {
84     ierr = PetscFree(h->intcomposeddata);CHKERRQ(ierr);
85   }
86   if (h->intcomposedstate) {
87     ierr = PetscFree(h->intcomposedstate);CHKERRQ(ierr);
88   }
89   if (h->realcomposeddata) {
90     ierr = PetscFree(h->realcomposeddata);CHKERRQ(ierr);
91   }
92   if (h->realcomposedstate) {
93     ierr = PetscFree(h->realcomposedstate);CHKERRQ(ierr);
94   }
95   if (h->scalarcomposeddata) {
96     ierr = PetscFree(h->scalarcomposeddata);CHKERRQ(ierr);
97   }
98   if (h->scalarcomposedstate) {
99     ierr = PetscFree(h->scalarcomposedstate);CHKERRQ(ierr);
100   }
101   PetscFunctionReturn(0);
102 }
103 
104 #undef __FUNCT__
105 #define __FUNCT__ "PetscObjectReference"
106 /*@C
107    PetscObjectReference - Indicates to any PetscObject that it is being
108    referenced by another PetscObject. This increases the reference
109    count for that object by one.
110 
111    Collective on PetscObject
112 
113    Input Parameter:
114 .  obj - the PETSc object. This must be cast with (PetscObject), for example,
115          PetscObjectReference((PetscObject)mat);
116 
117    Level: advanced
118 
119 .seealso: PetscObjectCompose(), PetscObjectDereference()
120 @*/
121 PetscErrorCode PETSC_DLLEXPORT PetscObjectReference(PetscObject obj)
122 {
123   PetscFunctionBegin;
124   PetscValidHeader(obj,1);
125   obj->refct++;
126   PetscFunctionReturn(0);
127 }
128 
129 #undef __FUNCT__
130 #define __FUNCT__ "PetscObjectGetReference"
131 /*@C
132    PetscObjectGetReference - Gets the current reference count for
133    any PETSc object.
134 
135    Not Collective
136 
137    Input Parameter:
138 .  obj - the PETSc object; this must be cast with (PetscObject), for example,
139          PetscObjectGetReference((PetscObject)mat,&cnt);
140 
141    Output Parameter:
142 .  cnt - the reference count
143 
144    Level: advanced
145 
146 .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference()
147 @*/
148 PetscErrorCode PETSC_DLLEXPORT PetscObjectGetReference(PetscObject obj,PetscInt *cnt)
149 {
150   PetscFunctionBegin;
151   PetscValidHeader(obj,1);
152   PetscValidIntPointer(cnt,2);
153   *cnt = obj->refct;
154   PetscFunctionReturn(0);
155 }
156 
157 #undef __FUNCT__
158 #define __FUNCT__ "PetscObjectDereference"
159 /*@
160    PetscObjectDereference - Indicates to any PetscObject that it is being
161    referenced by one less PetscObject. This decreases the reference
162    count for that object by one.
163 
164    Collective on PetscObject
165 
166    Input Parameter:
167 .  obj - the PETSc object; this must be cast with (PetscObject), for example,
168          PetscObjectDereference((PetscObject)mat);
169 
170    Level: advanced
171 
172 .seealso: PetscObjectCompose(), PetscObjectReference()
173 @*/
174 PetscErrorCode PETSC_DLLEXPORT PetscObjectDereference(PetscObject obj)
175 {
176   PetscErrorCode ierr;
177 
178   PetscFunctionBegin;
179   PetscValidHeader(obj,1);
180   if (obj->bops->destroy) {
181     ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr);
182   } else if (!--obj->refct) {
183     SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine");
184   }
185   PetscFunctionReturn(0);
186 }
187 
188 /* ----------------------------------------------------------------------- */
189 /*
190      The following routines are the versions private to the PETSc object
191      data structures.
192 */
193 #undef __FUNCT__
194 #define __FUNCT__ "PetscObjectGetComm_Petsc"
195 PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm)
196 {
197   PetscFunctionBegin;
198   *comm = obj->comm;
199   PetscFunctionReturn(0);
200 }
201 
202 #undef __FUNCT__
203 #define __FUNCT__ "PetscObjectCompose_Petsc"
204 PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr)
205 {
206   PetscErrorCode ierr;
207   char *tname;
208 
209   PetscFunctionBegin;
210   if (ptr) {
211     ierr = PetscOListReverseFind(ptr->olist,obj,&tname);CHKERRQ(ierr);
212     if (tname){
213       SETERRQ(PETSC_ERR_ARG_INCOMP,"An object cannot be composed with an object that was compose with it");
214     }
215   }
216   ierr = PetscOListAdd(&obj->olist,name,ptr);CHKERRQ(ierr);
217   PetscFunctionReturn(0);
218 }
219 
220 #undef __FUNCT__
221 #define __FUNCT__ "PetscObjectQuery_Petsc"
222 PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr)
223 {
224   PetscErrorCode ierr;
225 
226   PetscFunctionBegin;
227   ierr = PetscOListFind(obj->olist,name,ptr);CHKERRQ(ierr);
228   PetscFunctionReturn(0);
229 }
230 
231 #undef __FUNCT__
232 #define __FUNCT__ "PetscObjectComposeLanguage_Petsc"
233 PetscErrorCode PetscObjectComposeLanguage_Petsc(PetscObject obj,PetscLanguage lang,void *vob)
234 {
235   PetscFunctionBegin;
236   if (lang == PETSC_LANGUAGE_CXX) {
237     obj->cpp = vob;
238   } else {
239     SETERRQ(PETSC_ERR_SUP,"No support for this language yet");
240   }
241   PetscFunctionReturn(0);
242 }
243 
244 #undef __FUNCT__
245 #define __FUNCT__ "PetscObjectQueryLanguage_Petsc"
246 PetscErrorCode PetscObjectQueryLanguage_Petsc(PetscObject obj,PetscLanguage lang,void **vob)
247 {
248   PetscFunctionBegin;
249   if (lang == PETSC_LANGUAGE_C) {
250     *vob = (void*)obj;
251   } else if (lang == PETSC_LANGUAGE_CXX) {
252     if (obj->cpp) {
253       *vob = obj->cpp;
254     } else {
255       SETERRQ(PETSC_ERR_SUP,"No C++ wrapper generated");
256     }
257   } else {
258     SETERRQ(PETSC_ERR_SUP,"No support for this language yet");
259   }
260   PetscFunctionReturn(0);
261 }
262 
263 #undef __FUNCT__
264 #define __FUNCT__ "PetscObjectComposeFunction_Petsc"
265 PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
266 {
267   PetscErrorCode ierr;
268 
269   PetscFunctionBegin;
270   ierr = PetscFListAdd(&obj->qlist,name,fname,ptr);CHKERRQ(ierr);
271   PetscFunctionReturn(0);
272 }
273 
274 #undef __FUNCT__
275 #define __FUNCT__ "PetscObjectQueryFunction_Petsc"
276 PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void))
277 {
278   PetscErrorCode ierr;
279 
280   PetscFunctionBegin;
281   ierr = PetscFListFind(obj->comm,obj->qlist,name,ptr);CHKERRQ(ierr);
282   PetscFunctionReturn(0);
283 }
284 
285 /*
286         These are the versions that are usable to any CCA compliant objects
287 */
288 #undef __FUNCT__
289 #define __FUNCT__ "PetscObjectCompose"
290 /*@C
291    PetscObjectCompose - Associates another PETSc object with a given PETSc object.
292 
293    Not Collective
294 
295    Input Parameters:
296 +  obj - the PETSc object; this must be cast with (PetscObject), for example,
297          PetscObjectCompose((PetscObject)mat,...);
298 .  name - name associated with the child object
299 -  ptr - the other PETSc object to associate with the PETSc object; this must also be
300          cast with (PetscObject)
301 
302    Level: advanced
303 
304    Notes:
305    The second objects reference count is automatically increased by one when it is
306    composed.
307 
308    Replaces any previous object that had the same name.
309 
310    If ptr is null and name has previously been composed using an object, then that
311    entry is removed from the obj.
312 
313    PetscObjectCompose() can be used with any PETSc object (such as
314    Mat, Vec, KSP, SNES, etc.) or any user-provided object.  See
315    PetscObjectContainerCreate() for info on how to create an object from a
316    user-provided pointer that may then be composed with PETSc objects.
317 
318    Concepts: objects^composing
319    Concepts: composing objects
320 
321 .seealso: PetscObjectQuery(), PetscObjectContainerCreate()
322 @*/
323 PetscErrorCode PETSC_DLLEXPORT PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr)
324 {
325   PetscErrorCode ierr;
326 
327   PetscFunctionBegin;
328   ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr);
329   PetscFunctionReturn(0);
330 }
331 
332 #undef __FUNCT__
333 #define __FUNCT__ "PetscObjectQuery"
334 /*@C
335    PetscObjectQuery  - Gets a PETSc object associated with a given object.
336 
337    Not Collective
338 
339    Input Parameters:
340 +  obj - the PETSc object
341          Thus must be cast with a (PetscObject), for example,
342          PetscObjectCompose((PetscObject)mat,...);
343 .  name - name associated with child object
344 -  ptr - the other PETSc object associated with the PETSc object, this must also be
345          cast with (PetscObject)
346 
347    Level: advanced
348 
349    Concepts: objects^composing
350    Concepts: composing objects
351    Concepts: objects^querying
352    Concepts: querying objects
353 
354 .seealso: PetscObjectQuery()
355 @*/
356 PetscErrorCode PETSC_DLLEXPORT PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr)
357 {
358   PetscErrorCode ierr;
359 
360   PetscFunctionBegin;
361   ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr);
362   PetscFunctionReturn(0);
363 }
364 
365 #undef __FUNCT__
366 #define __FUNCT__ "PetscObjectQueryLanguage"
367 /*@C
368    PetscObjectQueryLanguage - Returns a language specific interface to the given object
369 
370    Not Collective
371 
372    Input Parameters:
373 +  obj - the PETSc object
374          Thus must be cast with a (PetscObject), for example,
375          PetscObjectCompose((PetscObject)mat,...);
376 -  lang - one of PETSC_LANGUAGE_C, PETSC_LANGUAGE_F77, PETSC_LANGUAGE_CXX
377 
378    Output Parameter:
379 .  ptr - the language specific interface
380 
381    Level: developer
382 
383 .seealso: PetscObjectQuery()
384 @*/
385 PetscErrorCode PETSC_DLLEXPORT PetscObjectQueryLanguage(PetscObject obj,PetscLanguage lang,void **ptr)
386 {
387   PetscErrorCode ierr;
388 
389   PetscFunctionBegin;
390   ierr = (*obj->bops->querylanguage)(obj,lang,ptr);CHKERRQ(ierr);
391   PetscFunctionReturn(0);
392 }
393 
394 #undef __FUNCT__
395 #define __FUNCT__ "PetscObjectComposeLanguage"
396 /*@C
397    PetscObjectComposeLanguage - Sets a language specific interface to the given object
398 
399    Not Collective
400 
401    Input Parameters:
402 +  obj - the PETSc object
403          Thus must be cast with a (PetscObject), for example,
404          PetscObjectCompose((PetscObject)mat,...);
405 .  lang - one of PETSC_LANGUAGE_C, PETSC_LANGUAGE_F77, PETSC_LANGUAGE_CXX
406 -  ptr - the language specific interface
407 
408    Level: developer
409 
410 .seealso: PetscObjectQuery()
411 @*/
412 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposeLanguage(PetscObject obj,PetscLanguage lang,void *ptr)
413 {
414   PetscErrorCode ierr;
415 
416   PetscFunctionBegin;
417   ierr = (*obj->bops->composelanguage)(obj,lang,ptr);CHKERRQ(ierr);
418   PetscFunctionReturn(0);
419 }
420 
421 
422 #undef __FUNCT__
423 #define __FUNCT__ "PetscObjectComposeFunction"
424 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void))
425 {
426   PetscErrorCode ierr;
427 
428   PetscFunctionBegin;
429   ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr);
430   PetscFunctionReturn(0);
431 }
432 
433 #undef __FUNCT__
434 #define __FUNCT__ "PetscObjectQueryFunction"
435 /*@C
436    PetscObjectQueryFunction - Gets a function associated with a given object.
437 
438    Collective on PetscObject
439 
440    Input Parameters:
441 +  obj - the PETSc object; this must be cast with (PetscObject), for example,
442          PetscObjectQueryFunction((PetscObject)ksp,...);
443 -  name - name associated with the child function
444 
445    Output Parameter:
446 .  ptr - function pointer
447 
448    Level: advanced
449 
450    Concepts: objects^composing functions
451    Concepts: composing functions
452    Concepts: functions^querying
453    Concepts: objects^querying
454    Concepts: querying objects
455 
456 .seealso: PetscObjectComposeFunctionDynamic()
457 @*/
458 PetscErrorCode PETSC_DLLEXPORT PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void))
459 {
460   PetscErrorCode ierr;
461 
462   PetscFunctionBegin;
463   ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr);
464   PetscFunctionReturn(0);
465 }
466 
467 struct _p_PetscObjectContainer {
468   PETSCHEADER(int);
469   void   *ptr;
470   PetscErrorCode (*userdestroy)(void*);
471 };
472 
473 #undef __FUNCT__
474 #define __FUNCT__ "PetscObjectContainerGetPointer"
475 /*@C
476    PetscObjectContainerGetPointer - Gets the pointer value contained in the container.
477 
478    Collective on PetscObjectContainer
479 
480    Input Parameter:
481 .  obj - the object created with PetscObjectContainerCreate()
482 
483    Output Parameter:
484 .  ptr - the pointer value
485 
486    Level: advanced
487 
488 .seealso: PetscObjectContainerCreate(), PetscObjectContainerDestroy(),
489           PetscObjectContainerSetPointer()
490 @*/
491 PetscErrorCode PETSC_DLLEXPORT PetscObjectContainerGetPointer(PetscObjectContainer obj,void **ptr)
492 {
493   PetscFunctionBegin;
494   *ptr = obj->ptr;
495   PetscFunctionReturn(0);
496 }
497 
498 
499 #undef __FUNCT__
500 #define __FUNCT__ "PetscObjectContainerSetPointer"
501 /*@C
502    PetscObjectContainerSetPointer - Sets the pointer value contained in the container.
503 
504    Collective on PetscObjectContainer
505 
506    Input Parameters:
507 +  obj - the object created with PetscObjectContainerCreate()
508 -  ptr - the pointer value
509 
510    Level: advanced
511 
512 .seealso: PetscObjectContainerCreate(), PetscObjectContainerDestroy(),
513           PetscObjectContainerGetPointer()
514 @*/
515 PetscErrorCode PETSC_DLLEXPORT PetscObjectContainerSetPointer(PetscObjectContainer obj,void *ptr)
516 {
517   PetscFunctionBegin;
518   obj->ptr = ptr;
519   PetscFunctionReturn(0);
520 }
521 
522 #undef __FUNCT__
523 #define __FUNCT__ "PetscObjectContainerDestroy"
524 /*@C
525    PetscObjectContainerDestroy - Destroys a PETSc container object.
526 
527    Collective on PetscObjectContainer
528 
529    Input Parameter:
530 .  obj - an object that was created with PetscObjectContainerCreate()
531 
532    Level: advanced
533 
534 .seealso: PetscObjectContainerCreate()
535 @*/
536 PetscErrorCode PETSC_DLLEXPORT PetscObjectContainerDestroy(PetscObjectContainer obj)
537 {
538   PetscErrorCode ierr;
539   PetscFunctionBegin;
540   if (--obj->refct > 0) PetscFunctionReturn(0);
541   if (obj->userdestroy) (*obj->userdestroy)(obj->ptr);
542   ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr);
543   PetscFunctionReturn(0);
544 }
545 
546 #undef __FUNCT__
547 #define __FUNCT__ "PetscObjectContainerSetUserDestroy"
548 /*@C
549    PetscObjectContainerSetUserDestroy - Sets name of the user destroy function.
550 
551    Collective on PetscObjectContainer
552 
553    Input Parameter:
554 +  obj - an object that was created with PetscObjectContainerCreate()
555 -  des - name of the user destroy function
556 
557    Level: advanced
558 
559 .seealso: PetscObjectContainerDestroy()
560 @*/
561 PetscErrorCode PETSC_DLLEXPORT PetscObjectContainerSetUserDestroy(PetscObjectContainer obj, PetscErrorCode (*des)(void*))
562 {
563   PetscFunctionBegin;
564   obj->userdestroy = des;
565   PetscFunctionReturn(0);
566 }
567 
568 PetscCookie PETSC_DLLEXPORT CONTAINER_COOKIE = 0;
569 
570 #undef __FUNCT__
571 #define __FUNCT__ "PetscObjectContainerCreate"
572 /*@C
573    PetscObjectContainerCreate - Creates a PETSc object that has room to hold
574    a single pointer. This allows one to attach any type of data (accessible
575    through a pointer) with the PetscObjectCompose() function to a PetscObject.
576    The data item itself is attached by a call to PetscObjectContainerSetPointer.
577 
578    Collective on MPI_Comm
579 
580    Input Parameters:
581 .  comm - MPI communicator that shares the object
582 
583    Output Parameters:
584 .  container - the container created
585 
586    Level: advanced
587 
588 .seealso: PetscObjectContainerDestroy(), PetscObjectContainerSetPointer(), PetscObjectContainerSetPointer()
589 @*/
590 PetscErrorCode PETSC_DLLEXPORT PetscObjectContainerCreate(MPI_Comm comm,PetscObjectContainer *container)
591 {
592   PetscErrorCode       ierr;
593   PetscObjectContainer contain;
594 
595   PetscFunctionBegin;
596   if (!CONTAINER_COOKIE) {
597     ierr = PetscLogClassRegister(&CONTAINER_COOKIE,          "Container");CHKERRQ(ierr);
598   }
599   ierr = PetscHeaderCreate(contain,_p_PetscObjectContainer,PetscInt,CONTAINER_COOKIE,0,"container",comm,PetscObjectContainerDestroy,0);CHKERRQ(ierr);
600   *container = contain;
601   PetscFunctionReturn(0);
602 }
603 
604 #undef __FUNCT__
605 #define __FUNCT__ "PetscObjectSetFromOptions"
606 /*@
607    PetscObjectSetFromOptions - Sets generic parameters from user options.
608 
609    Collective on obj
610 
611    Input Parameter:
612 .  obj - the PetscObjcet
613 
614    Options Database Keys:
615 
616    Notes:
617    We have no generic options at present, so this does nothing
618 
619    Level: beginner
620 
621 .keywords: set, options, database
622 .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix()
623 @*/
624 PetscErrorCode PETSC_DLLEXPORT PetscObjectSetFromOptions(PetscObject obj)
625 {
626   PetscFunctionBegin;
627   if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT, "Null object");
628   PetscFunctionReturn(0);
629 }
630 
631 #undef __FUNCT__
632 #define __FUNCT__ "PetscObjectSetUp"
633 /*@
634    PetscObjectSetUp - Sets up the internal data structures for the later use.
635 
636    Collective on PetscObject
637 
638    Input Parameters:
639 .  obj - the PetscObject
640 
641    Notes:
642    This does nothing at present.
643 
644    Level: advanced
645 
646 .keywords: setup
647 .seealso: PetscObjectDestroy()
648 @*/
649 PetscErrorCode PETSC_DLLEXPORT PetscObjectSetUp(PetscObject obj)
650 {
651   PetscFunctionBegin;
652   if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT, "Null object");
653   PetscFunctionReturn(0);
654 }
655