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(), PetscObjectContainerGetPointer() 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