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; 43*d3229121SJed Brown h->precision = (PetscPrecision) sizeof(PetscReal); 44e5c89e4eSSatish Balay h->bops->destroy = des; 45e5c89e4eSSatish Balay h->bops->view = vie; 46e5c89e4eSSatish Balay h->bops->getcomm = PetscObjectGetComm_Petsc; 47e5c89e4eSSatish Balay h->bops->compose = PetscObjectCompose_Petsc; 48e5c89e4eSSatish Balay h->bops->query = PetscObjectQuery_Petsc; 49e5c89e4eSSatish Balay h->bops->composefunction = PetscObjectComposeFunction_Petsc; 50e5c89e4eSSatish Balay h->bops->queryfunction = PetscObjectQueryFunction_Petsc; 51e5c89e4eSSatish Balay ierr = PetscCommDuplicate(comm,&h->comm,&h->tag);CHKERRQ(ierr); 522e82e6d1SBarry Smith 532e82e6d1SBarry Smith /* Keep a record of object created */ 542e82e6d1SBarry Smith PetscObjectsCounts++; 552e82e6d1SBarry Smith for (i=0; i<PetscObjectsMaxCounts; i++) { 562e82e6d1SBarry Smith if (!PetscObjects[i]) { 572e82e6d1SBarry Smith PetscObjects[i] = h; 582e82e6d1SBarry Smith PetscFunctionReturn(0); 592e82e6d1SBarry Smith } 602e82e6d1SBarry Smith } 612e82e6d1SBarry Smith /* Need to increase the space for storing PETSc objects */ 622e82e6d1SBarry Smith if (!PetscObjectsMaxCounts) newPetscObjectsMaxCounts = 100; 632e82e6d1SBarry Smith else newPetscObjectsMaxCounts = 2*PetscObjectsMaxCounts; 642e82e6d1SBarry Smith ierr = PetscMalloc(newPetscObjectsMaxCounts*sizeof(PetscObject),&newPetscObjects);CHKERRQ(ierr); 652eff7a51SBarry Smith ierr = PetscMemcpy(newPetscObjects,PetscObjects,PetscObjectsMaxCounts*sizeof(PetscObject));CHKERRQ(ierr); 662e82e6d1SBarry Smith ierr = PetscMemzero(newPetscObjects+PetscObjectsMaxCounts,(newPetscObjectsMaxCounts - PetscObjectsMaxCounts)*sizeof(PetscObject));CHKERRQ(ierr); 672e82e6d1SBarry Smith ierr = PetscFree(PetscObjects);CHKERRQ(ierr); 682e82e6d1SBarry Smith PetscObjects = newPetscObjects; 692e82e6d1SBarry Smith PetscObjects[PetscObjectsMaxCounts] = h; 702e82e6d1SBarry Smith PetscObjectsMaxCounts = newPetscObjectsMaxCounts; 712e82e6d1SBarry Smith 72e5c89e4eSSatish Balay PetscFunctionReturn(0); 73e5c89e4eSSatish Balay } 74e5c89e4eSSatish Balay 75ace3abfcSBarry Smith extern PetscBool PetscMemoryCollectMaximumUsage; 76e5c89e4eSSatish Balay extern PetscLogDouble PetscMemoryMaximumUsage; 77e5c89e4eSSatish Balay 78e5c89e4eSSatish Balay #undef __FUNCT__ 79e5c89e4eSSatish Balay #define __FUNCT__ "PetscHeaderDestroy_Private" 80e5c89e4eSSatish Balay /* 81e5c89e4eSSatish Balay PetscHeaderDestroy_Private - Destroys a base PETSc object header. Called by 82e5c89e4eSSatish Balay the macro PetscHeaderDestroy(). 83e5c89e4eSSatish Balay */ 847087cfbeSBarry Smith PetscErrorCode PetscHeaderDestroy_Private(PetscObject h) 85e5c89e4eSSatish Balay { 86e5c89e4eSSatish Balay PetscErrorCode ierr; 872e82e6d1SBarry Smith PetscInt i; 88e5c89e4eSSatish Balay 89e5c89e4eSSatish Balay PetscFunctionBegin; 900defdb15SJed Brown PetscValidHeader(h,1); 9192e62aa6SBarry Smith #if defined(PETSC_HAVE_AMS) 929fb22e1aSBarry Smith if (PetscAMSPublishAll) { 93c457296dSBarry Smith ierr = PetscObjectUnPublish((PetscObject)h);CHKERRQ(ierr); 9469590be7SBarry Smith } 9592e62aa6SBarry Smith #endif 96e5c89e4eSSatish Balay if (PetscMemoryCollectMaximumUsage) { 97e5c89e4eSSatish Balay PetscLogDouble usage; 98e5c89e4eSSatish Balay ierr = PetscMemoryGetCurrentUsage(&usage);CHKERRQ(ierr); 99e5c89e4eSSatish Balay if (usage > PetscMemoryMaximumUsage) PetscMemoryMaximumUsage = usage; 100e5c89e4eSSatish Balay } 10108a557f7SLisandro Dalcin /* first destroy things that could execute arbitrary code */ 10208a557f7SLisandro Dalcin if (h->python_destroy) { 10308a557f7SLisandro Dalcin void *python_context = h->python_context; 10408a557f7SLisandro Dalcin PetscErrorCode (*python_destroy)(void*) = h->python_destroy; 10508a557f7SLisandro Dalcin h->python_context = 0; 10608a557f7SLisandro Dalcin h->python_destroy = 0; 10708a557f7SLisandro Dalcin ierr = (*python_destroy)(python_context);CHKERRQ(ierr); 10808a557f7SLisandro Dalcin } 1096bf464f9SBarry Smith ierr = PetscOListDestroy(&h->olist);CHKERRQ(ierr); 11008a557f7SLisandro Dalcin ierr = PetscCommDestroy(&h->comm);CHKERRQ(ierr); 11108a557f7SLisandro Dalcin /* next destroy other things */ 1120700a824SBarry Smith h->classid = PETSCFREEDHEADER; 11308a557f7SLisandro Dalcin ierr = PetscFree(h->bops);CHKERRQ(ierr); 1141441b1d3SBarry Smith ierr = PetscFListDestroy(&h->qlist);CHKERRQ(ierr); 115503cfb0cSBarry Smith ierr = PetscFree(h->type_name);CHKERRQ(ierr); 116503cfb0cSBarry Smith ierr = PetscFree(h->name);CHKERRQ(ierr); 117503cfb0cSBarry Smith ierr = PetscFree(h->prefix);CHKERRQ(ierr); 118e5c89e4eSSatish Balay ierr = PetscFree(h->fortran_func_pointers);CHKERRQ(ierr); 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: 1757eb1d149SBarry Smith + viewer - must be an PETSCVIEWERASCII viewer 1767eb1d149SBarry Smith - all - by default only tries to display objects created explicitly by the user, if all is PETSC_TRUE then lists all outstanding objects 177a64a8e02SBarry Smith 178a64a8e02SBarry Smith Level: advanced 179a64a8e02SBarry Smith 180a64a8e02SBarry Smith Concepts: options database^printing 181a64a8e02SBarry Smith 182a64a8e02SBarry Smith @*/ 1837eb1d149SBarry Smith PetscErrorCode PetscObjectsDump(FILE *fd,PetscBool all) 184a64a8e02SBarry Smith { 185a64a8e02SBarry Smith PetscErrorCode ierr; 186f5351476SHong Zhang PetscInt i; 187f5351476SHong Zhang #if defined(PETSC_USE_DEBUG) 188f5351476SHong Zhang PetscInt j,k; 189f5351476SHong Zhang #endif 190a64a8e02SBarry Smith PetscObject h; 191a64a8e02SBarry Smith 192a64a8e02SBarry Smith PetscFunctionBegin; 193a64a8e02SBarry Smith if (PetscObjectsCounts) { 194a2ea699eSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"The following objects were never freed\n");CHKERRQ(ierr); 195a2ea699eSBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"-----------------------------------------\n");CHKERRQ(ierr); 196a64a8e02SBarry Smith for (i=0; i<PetscObjectsMaxCounts; i++) { 197a64a8e02SBarry Smith if ((h = PetscObjects[i])) { 198a64a8e02SBarry Smith ierr = PetscObjectName(h);CHKERRQ(ierr); 1992c9581d2SBarry Smith { 200a64a8e02SBarry Smith #if defined(PETSC_USE_DEBUG) 201a64a8e02SBarry Smith PetscStack *stack; 202719d7bfeSBarry Smith char *create,*rclass; 203a8d2bbe5SBarry Smith 204a8d2bbe5SBarry Smith /* if the PETSc function the user calls is not a create then this object was NOT directly created by them */ 205a64a8e02SBarry Smith ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr); 20668f616c8SBarry Smith k = stack->currentsize-2; 2077eb1d149SBarry Smith if (!all) { 20868f616c8SBarry Smith k = 0; 20968f616c8SBarry Smith while (!stack->petscroutine[k]) k++; 21068f616c8SBarry Smith ierr = PetscStrstr(stack->function[k],"Create",&create);CHKERRQ(ierr); 21168f616c8SBarry Smith if (!create) { 21268f616c8SBarry Smith ierr = PetscStrstr(stack->function[k],"Get",&create);CHKERRQ(ierr); 21368f616c8SBarry Smith } 214719d7bfeSBarry Smith ierr = PetscStrstr(stack->function[k],h->class_name,&rclass);CHKERRQ(ierr); 2152c9581d2SBarry Smith 2162c9581d2SBarry Smith if (!create) continue; 217719d7bfeSBarry Smith if (!rclass) continue; 2187eb1d149SBarry Smith } 219a64a8e02SBarry Smith #endif 2202c9581d2SBarry Smith 2212c9581d2SBarry Smith ierr = PetscFPrintf(PETSC_COMM_WORLD,fd,"[%d] %s %s %s\n",PetscGlobalRank,h->class_name,h->type_name,h->name);CHKERRQ(ierr); 2222c9581d2SBarry Smith 2232c9581d2SBarry Smith #if defined(PETSC_USE_DEBUG) 2242c9581d2SBarry Smith ierr = PetscMallocGetStack(h,&stack);CHKERRQ(ierr); 22568f616c8SBarry Smith for (j=k; j>=0; j--) { 2262c9581d2SBarry Smith fprintf(fd," [%d] %s() in %s%s\n",PetscGlobalRank,stack->function[j],stack->directory[j],stack->file[j]); 2272c9581d2SBarry Smith } 2282c9581d2SBarry Smith #endif 2292c9581d2SBarry Smith } 230a64a8e02SBarry Smith } 231a64a8e02SBarry Smith } 232a64a8e02SBarry Smith } 233a64a8e02SBarry Smith PetscFunctionReturn(0); 234a64a8e02SBarry Smith } 235a64a8e02SBarry Smith 236a64a8e02SBarry Smith 237a64a8e02SBarry Smith #undef __FUNCT__ 238c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsView" 239c139c21fSBarry Smith /*@C 240c139c21fSBarry Smith PetscObjectsView - Prints the currently existing objects. 241c139c21fSBarry Smith 242c139c21fSBarry Smith Logically Collective on PetscViewer 243c139c21fSBarry Smith 244c139c21fSBarry Smith Input Parameter: 245c139c21fSBarry Smith . viewer - must be an PETSCVIEWERASCII viewer 246c139c21fSBarry Smith 247c139c21fSBarry Smith Level: advanced 248c139c21fSBarry Smith 249c139c21fSBarry Smith Concepts: options database^printing 250c139c21fSBarry Smith 251c139c21fSBarry Smith @*/ 252c139c21fSBarry Smith PetscErrorCode PetscObjectsView(PetscViewer viewer) 253c139c21fSBarry Smith { 254c139c21fSBarry Smith PetscErrorCode ierr; 255c139c21fSBarry Smith PetscBool isascii; 256a64a8e02SBarry Smith FILE *fd; 257c139c21fSBarry Smith 258c139c21fSBarry Smith PetscFunctionBegin; 259c139c21fSBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_WORLD; 260251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 261c139c21fSBarry Smith if (!isascii) SETERRQ(((PetscObject)viewer)->comm,PETSC_ERR_SUP,"Only supports ASCII viewer"); 262a64a8e02SBarry Smith ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr); 2637eb1d149SBarry Smith ierr = PetscObjectsDump(fd,PETSC_TRUE);CHKERRQ(ierr); 264c139c21fSBarry Smith PetscFunctionReturn(0); 265c139c21fSBarry Smith } 266c139c21fSBarry Smith 267c139c21fSBarry Smith #undef __FUNCT__ 268c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObject" 269c139c21fSBarry Smith /*@C 270c139c21fSBarry Smith PetscObjectsGetObject - Get a pointer to a named object 271c139c21fSBarry Smith 272c139c21fSBarry Smith Not collective 273c139c21fSBarry Smith 274c139c21fSBarry Smith Input Parameter: 275c139c21fSBarry Smith . name - the name of an object 276c139c21fSBarry Smith 277c139c21fSBarry Smith Output Parameter: 278c139c21fSBarry Smith . obj - the object or null if there is no object 279c139c21fSBarry Smith 280c139c21fSBarry Smith Level: advanced 281c139c21fSBarry Smith 282c139c21fSBarry Smith Concepts: options database^printing 283c139c21fSBarry Smith 284c139c21fSBarry Smith @*/ 285c139c21fSBarry Smith PetscErrorCode PetscObjectsGetObject(const char* name,PetscObject *obj,char **classname) 286c139c21fSBarry Smith { 287c139c21fSBarry Smith PetscErrorCode ierr; 288c139c21fSBarry Smith PetscInt i; 289c139c21fSBarry Smith PetscObject h; 290c139c21fSBarry Smith PetscBool flg; 291c139c21fSBarry Smith 292c139c21fSBarry Smith PetscFunctionBegin; 293c139c21fSBarry Smith *obj = PETSC_NULL; 294c139c21fSBarry Smith for (i=0; i<PetscObjectsMaxCounts; i++) { 295c139c21fSBarry Smith if ((h = PetscObjects[i])) { 296c139c21fSBarry Smith ierr = PetscObjectName(h);CHKERRQ(ierr); 297c139c21fSBarry Smith ierr = PetscStrcmp(h->name,name,&flg);CHKERRQ(ierr); 298c139c21fSBarry Smith if (flg) { 299c139c21fSBarry Smith *obj = h; 300c139c21fSBarry Smith if (classname) *classname = h->class_name; 301c139c21fSBarry Smith PetscFunctionReturn(0); 302c139c21fSBarry Smith } 303c139c21fSBarry Smith } 304c139c21fSBarry Smith } 305c139c21fSBarry Smith PetscFunctionReturn(0); 306c139c21fSBarry Smith } 307c139c21fSBarry Smith 308c139c21fSBarry Smith #undef __FUNCT__ 309c139c21fSBarry Smith #define __FUNCT__ "PetscObjectsGetObjectMatlab" 310c139c21fSBarry Smith char* PetscObjectsGetObjectMatlab(const char* name,PetscObject *obj) 311c139c21fSBarry Smith { 312c139c21fSBarry Smith PetscErrorCode ierr; 313c139c21fSBarry Smith PetscInt i; 314c139c21fSBarry Smith PetscObject h; 315c139c21fSBarry Smith PetscBool flg; 316c139c21fSBarry Smith 317c139c21fSBarry Smith PetscFunctionBegin; 318c139c21fSBarry Smith *obj = PETSC_NULL; 319c139c21fSBarry Smith for (i=0; i<PetscObjectsMaxCounts; i++) { 320c139c21fSBarry Smith if ((h = PetscObjects[i])) { 321c139c21fSBarry Smith ierr = PetscObjectName(h);if (ierr) PetscFunctionReturn(0); 322c139c21fSBarry Smith ierr = PetscStrcmp(h->name,name,&flg);if (ierr) PetscFunctionReturn(0); 323c139c21fSBarry Smith if (flg) { 324c139c21fSBarry Smith *obj = h; 325c139c21fSBarry Smith PetscFunctionReturn(h->class_name); 326c139c21fSBarry Smith } 327c139c21fSBarry Smith } 328c139c21fSBarry Smith } 329c139c21fSBarry Smith PetscFunctionReturn(0); 330c139c21fSBarry Smith } 331c139c21fSBarry Smith 332c139c21fSBarry Smith #undef __FUNCT__ 333af272810SBarry Smith #define __FUNCT__ "PetscObjectAddOptionsHandler" 334af272810SBarry Smith /*@C 335af272810SBarry Smith PetscObjectAddOptionsHandler - Adds an additional function to check for options when XXXSetFromOptions() is called. 336af272810SBarry Smith 337af272810SBarry Smith Not Collective 338af272810SBarry Smith 339af272810SBarry Smith Input Parameter: 340af272810SBarry Smith + obj - the PETSc object 341af272810SBarry Smith . handle - function that checks for options 342af272810SBarry Smith . destroy - function to destroy context if provided 343af272810SBarry Smith - ctx - optional context for check function 344af272810SBarry Smith 345af272810SBarry Smith Level: developer 346af272810SBarry Smith 347af272810SBarry Smith 348af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectProcessOptionsHandlers(), PetscObjectDestroyOptionsHandlers() 349af272810SBarry Smith 350af272810SBarry Smith @*/ 3517087cfbeSBarry Smith PetscErrorCode PetscObjectAddOptionsHandler(PetscObject obj,PetscErrorCode (*handle)(PetscObject,void*),PetscErrorCode (*destroy)(PetscObject,void*),void *ctx) 352af272810SBarry Smith { 353af272810SBarry Smith PetscFunctionBegin; 3540defdb15SJed Brown PetscValidHeader(obj,1); 355af272810SBarry Smith if (obj->noptionhandler >= PETSC_MAX_OPTIONS_HANDLER) SETERRQ(obj->comm,PETSC_ERR_ARG_OUTOFRANGE,"To many options handlers added"); 356af272810SBarry Smith obj->optionhandler[obj->noptionhandler] = handle; 357af272810SBarry Smith obj->optiondestroy[obj->noptionhandler] = destroy; 358af272810SBarry Smith obj->optionctx[obj->noptionhandler++] = ctx; 359af272810SBarry Smith PetscFunctionReturn(0); 360af272810SBarry Smith } 361af272810SBarry Smith 362af272810SBarry Smith #undef __FUNCT__ 363af272810SBarry Smith #define __FUNCT__ "PetscObjectProcessOptionsHandlers" 364af272810SBarry Smith /*@C 365db05f41bSBarry Smith PetscObjectProcessOptionsHandlers - Calls all the options handlers attached to an object 366af272810SBarry Smith 367af272810SBarry Smith Not Collective 368af272810SBarry Smith 369af272810SBarry Smith Input Parameter: 370af272810SBarry Smith . obj - the PETSc object 371af272810SBarry Smith 372af272810SBarry Smith Level: developer 373af272810SBarry Smith 374af272810SBarry Smith 375af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectDestroyOptionsHandlers() 376af272810SBarry Smith 377af272810SBarry Smith @*/ 3787087cfbeSBarry Smith PetscErrorCode PetscObjectProcessOptionsHandlers(PetscObject obj) 379af272810SBarry Smith { 380af272810SBarry Smith PetscInt i; 381af272810SBarry Smith PetscErrorCode ierr; 382af272810SBarry Smith 383af272810SBarry Smith PetscFunctionBegin; 3840defdb15SJed Brown PetscValidHeader(obj,1); 385af272810SBarry Smith for (i=0; i<obj->noptionhandler; i++) { 386af272810SBarry Smith ierr = (*obj->optionhandler[i])(obj,obj->optionctx[i]);CHKERRQ(ierr); 387af272810SBarry Smith } 388af272810SBarry Smith PetscFunctionReturn(0); 389af272810SBarry Smith } 390af272810SBarry Smith 391af272810SBarry Smith #undef __FUNCT__ 392af272810SBarry Smith #define __FUNCT__ "PetscObjectDestroyOptionsHandlers" 393af272810SBarry Smith /*@C 394af272810SBarry Smith PetscObjectDestroyOptionsHandlers - Destroys all the option handlers attached to an objeft 395af272810SBarry Smith 396af272810SBarry Smith Not Collective 397af272810SBarry Smith 398af272810SBarry Smith Input Parameter: 399af272810SBarry Smith . obj - the PETSc object 400af272810SBarry Smith 401af272810SBarry Smith Level: developer 402af272810SBarry Smith 403af272810SBarry Smith 404af272810SBarry Smith .seealso: KSPSetFromOptions(), PCSetFromOptions(), SNESSetFromOptions(), PetscObjectAddOptionsHandler(), PetscObjectProcessOptionsHandlers() 405af272810SBarry Smith 406af272810SBarry Smith @*/ 4077087cfbeSBarry Smith PetscErrorCode PetscObjectDestroyOptionsHandlers(PetscObject obj) 408af272810SBarry Smith { 409af272810SBarry Smith PetscInt i; 410af272810SBarry Smith PetscErrorCode ierr; 411af272810SBarry Smith 412af272810SBarry Smith PetscFunctionBegin; 4130defdb15SJed Brown PetscValidHeader(obj,1); 414af272810SBarry Smith for (i=0; i<obj->noptionhandler; i++) { 415af272810SBarry Smith ierr = (*obj->optiondestroy[i])(obj,obj->optionctx[i]);CHKERRQ(ierr); 416af272810SBarry Smith } 417af272810SBarry Smith obj->noptionhandler = 0; 418af272810SBarry Smith PetscFunctionReturn(0); 419af272810SBarry Smith } 420af272810SBarry Smith 421af272810SBarry Smith 422af272810SBarry Smith #undef __FUNCT__ 423e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectReference" 424ee978a2eSBarry Smith /*@ 425e5c89e4eSSatish Balay PetscObjectReference - Indicates to any PetscObject that it is being 426e5c89e4eSSatish Balay referenced by another PetscObject. This increases the reference 427e5c89e4eSSatish Balay count for that object by one. 428e5c89e4eSSatish Balay 4293f9fe445SBarry Smith Logically Collective on PetscObject 430e5c89e4eSSatish Balay 431e5c89e4eSSatish Balay Input Parameter: 432e5c89e4eSSatish Balay . obj - the PETSc object. This must be cast with (PetscObject), for example, 433e5c89e4eSSatish Balay PetscObjectReference((PetscObject)mat); 434e5c89e4eSSatish Balay 435e5c89e4eSSatish Balay Level: advanced 436e5c89e4eSSatish Balay 437e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference() 438e5c89e4eSSatish Balay @*/ 4397087cfbeSBarry Smith PetscErrorCode PetscObjectReference(PetscObject obj) 440e5c89e4eSSatish Balay { 441e5c89e4eSSatish Balay PetscFunctionBegin; 44252536dc3SBarry Smith if (!obj) PetscFunctionReturn(0); 443e5c89e4eSSatish Balay PetscValidHeader(obj,1); 444e5c89e4eSSatish Balay obj->refct++; 445e5c89e4eSSatish Balay PetscFunctionReturn(0); 446e5c89e4eSSatish Balay } 447e5c89e4eSSatish Balay 448e5c89e4eSSatish Balay #undef __FUNCT__ 449e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetReference" 450ee978a2eSBarry Smith /*@ 451e5c89e4eSSatish Balay PetscObjectGetReference - Gets the current reference count for 452e5c89e4eSSatish Balay any PETSc object. 453e5c89e4eSSatish Balay 454e5c89e4eSSatish Balay Not Collective 455e5c89e4eSSatish Balay 456e5c89e4eSSatish Balay Input Parameter: 457e5c89e4eSSatish Balay . obj - the PETSc object; this must be cast with (PetscObject), for example, 458e5c89e4eSSatish Balay PetscObjectGetReference((PetscObject)mat,&cnt); 459e5c89e4eSSatish Balay 460e5c89e4eSSatish Balay Output Parameter: 461e5c89e4eSSatish Balay . cnt - the reference count 462e5c89e4eSSatish Balay 463e5c89e4eSSatish Balay Level: advanced 464e5c89e4eSSatish Balay 465e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectDereference(), PetscObjectReference() 466e5c89e4eSSatish Balay @*/ 4677087cfbeSBarry Smith PetscErrorCode PetscObjectGetReference(PetscObject obj,PetscInt *cnt) 468e5c89e4eSSatish Balay { 469e5c89e4eSSatish Balay PetscFunctionBegin; 470e5c89e4eSSatish Balay PetscValidHeader(obj,1); 471e5c89e4eSSatish Balay PetscValidIntPointer(cnt,2); 472e5c89e4eSSatish Balay *cnt = obj->refct; 473e5c89e4eSSatish Balay PetscFunctionReturn(0); 474e5c89e4eSSatish Balay } 475e5c89e4eSSatish Balay 476e5c89e4eSSatish Balay #undef __FUNCT__ 477e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectDereference" 478e5c89e4eSSatish Balay /*@ 479e5c89e4eSSatish Balay PetscObjectDereference - Indicates to any PetscObject that it is being 480e5c89e4eSSatish Balay referenced by one less PetscObject. This decreases the reference 481e5c89e4eSSatish Balay count for that object by one. 482e5c89e4eSSatish Balay 4833f9fe445SBarry Smith Collective on PetscObject if reference reaches 0 otherwise Logically Collective 484e5c89e4eSSatish Balay 485e5c89e4eSSatish Balay Input Parameter: 486e5c89e4eSSatish Balay . obj - the PETSc object; this must be cast with (PetscObject), for example, 487e5c89e4eSSatish Balay PetscObjectDereference((PetscObject)mat); 488e5c89e4eSSatish Balay 4896bf464f9SBarry Smith Notes: PetscObjectDestroy(PetscObject *obj) sets the obj pointer to null after the call, this routine does not. 4906bf464f9SBarry Smith 491e5c89e4eSSatish Balay Level: advanced 492e5c89e4eSSatish Balay 493e5c89e4eSSatish Balay .seealso: PetscObjectCompose(), PetscObjectReference() 494e5c89e4eSSatish Balay @*/ 4957087cfbeSBarry Smith PetscErrorCode PetscObjectDereference(PetscObject obj) 496e5c89e4eSSatish Balay { 497e5c89e4eSSatish Balay PetscErrorCode ierr; 498e5c89e4eSSatish Balay 499e5c89e4eSSatish Balay PetscFunctionBegin; 500e5c89e4eSSatish Balay PetscValidHeader(obj,1); 501e5c89e4eSSatish Balay if (obj->bops->destroy) { 5026bf464f9SBarry Smith ierr = (*obj->bops->destroy)(&obj);CHKERRQ(ierr); 503f7923d8aSBarry Smith } else if (!--obj->refct) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"This PETSc object does not have a generic destroy routine"); 504e5c89e4eSSatish Balay PetscFunctionReturn(0); 505e5c89e4eSSatish Balay } 506e5c89e4eSSatish Balay 507e5c89e4eSSatish Balay /* ----------------------------------------------------------------------- */ 508e5c89e4eSSatish Balay /* 509e5c89e4eSSatish Balay The following routines are the versions private to the PETSc object 510e5c89e4eSSatish Balay data structures. 511e5c89e4eSSatish Balay */ 512e5c89e4eSSatish Balay #undef __FUNCT__ 513e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectGetComm_Petsc" 514e5c89e4eSSatish Balay PetscErrorCode PetscObjectGetComm_Petsc(PetscObject obj,MPI_Comm *comm) 515e5c89e4eSSatish Balay { 516e5c89e4eSSatish Balay PetscFunctionBegin; 5170defdb15SJed Brown PetscValidHeader(obj,1); 518e5c89e4eSSatish Balay *comm = obj->comm; 519e5c89e4eSSatish Balay PetscFunctionReturn(0); 520e5c89e4eSSatish Balay } 521e5c89e4eSSatish Balay 522e5c89e4eSSatish Balay #undef __FUNCT__ 5236ba4bc90SBarry Smith #define __FUNCT__ "PetscObjectRemoveReference" 5246ba4bc90SBarry Smith PetscErrorCode PetscObjectRemoveReference(PetscObject obj,const char name[]) 5256ba4bc90SBarry Smith { 5266ba4bc90SBarry Smith PetscErrorCode ierr; 5276ba4bc90SBarry Smith 5286ba4bc90SBarry Smith PetscFunctionBegin; 5290defdb15SJed Brown PetscValidHeader(obj,1); 5306ba4bc90SBarry Smith ierr = PetscOListRemoveReference(&obj->olist,name);CHKERRQ(ierr); 5316ba4bc90SBarry Smith PetscFunctionReturn(0); 5326ba4bc90SBarry Smith } 5336ba4bc90SBarry Smith 5346ba4bc90SBarry Smith #undef __FUNCT__ 535e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose_Petsc" 536e5c89e4eSSatish Balay PetscErrorCode PetscObjectCompose_Petsc(PetscObject obj,const char name[],PetscObject ptr) 537e5c89e4eSSatish Balay { 538e5c89e4eSSatish Balay PetscErrorCode ierr; 539e5c89e4eSSatish Balay char *tname; 540bfec8eecSBarry Smith PetscBool skipreference; 541e5c89e4eSSatish Balay 542e5c89e4eSSatish Balay PetscFunctionBegin; 543e5c89e4eSSatish Balay if (ptr) { 544bfec8eecSBarry Smith ierr = PetscOListReverseFind(ptr->olist,obj,&tname,&skipreference);CHKERRQ(ierr); 545f851cb64SDmitry 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"); 546e5c89e4eSSatish Balay } 547e5c89e4eSSatish Balay ierr = PetscOListAdd(&obj->olist,name,ptr);CHKERRQ(ierr); 548e5c89e4eSSatish Balay PetscFunctionReturn(0); 549e5c89e4eSSatish Balay } 550e5c89e4eSSatish Balay 551e5c89e4eSSatish Balay #undef __FUNCT__ 552e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery_Petsc" 553e5c89e4eSSatish Balay PetscErrorCode PetscObjectQuery_Petsc(PetscObject obj,const char name[],PetscObject *ptr) 554e5c89e4eSSatish Balay { 555e5c89e4eSSatish Balay PetscErrorCode ierr; 556e5c89e4eSSatish Balay 557e5c89e4eSSatish Balay PetscFunctionBegin; 5580defdb15SJed Brown PetscValidHeader(obj,1); 559e5c89e4eSSatish Balay ierr = PetscOListFind(obj->olist,name,ptr);CHKERRQ(ierr); 560e5c89e4eSSatish Balay PetscFunctionReturn(0); 561e5c89e4eSSatish Balay } 562e5c89e4eSSatish Balay 563e5c89e4eSSatish Balay #undef __FUNCT__ 564e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction_Petsc" 565e5c89e4eSSatish Balay PetscErrorCode PetscObjectComposeFunction_Petsc(PetscObject obj,const char name[],const char fname[],void (*ptr)(void)) 566e5c89e4eSSatish Balay { 567e5c89e4eSSatish Balay PetscErrorCode ierr; 568e5c89e4eSSatish Balay 569e5c89e4eSSatish Balay PetscFunctionBegin; 5700defdb15SJed Brown PetscValidHeader(obj,1); 571e5c89e4eSSatish Balay ierr = PetscFListAdd(&obj->qlist,name,fname,ptr);CHKERRQ(ierr); 572e5c89e4eSSatish Balay PetscFunctionReturn(0); 573e5c89e4eSSatish Balay } 574e5c89e4eSSatish Balay 575e5c89e4eSSatish Balay #undef __FUNCT__ 576e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction_Petsc" 577e5c89e4eSSatish Balay PetscErrorCode PetscObjectQueryFunction_Petsc(PetscObject obj,const char name[],void (**ptr)(void)) 578e5c89e4eSSatish Balay { 579e5c89e4eSSatish Balay PetscErrorCode ierr; 580e5c89e4eSSatish Balay 581e5c89e4eSSatish Balay PetscFunctionBegin; 5820defdb15SJed Brown PetscValidHeader(obj,1); 5834b91b6eaSBarry Smith ierr = PetscFListFind(obj->qlist,obj->comm,name,PETSC_FALSE,ptr);CHKERRQ(ierr); 584e5c89e4eSSatish Balay PetscFunctionReturn(0); 585e5c89e4eSSatish Balay } 586e5c89e4eSSatish Balay 587e5c89e4eSSatish Balay #undef __FUNCT__ 588e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectCompose" 589e5c89e4eSSatish Balay /*@C 590e5c89e4eSSatish Balay PetscObjectCompose - Associates another PETSc object with a given PETSc object. 591e5c89e4eSSatish Balay 592e5c89e4eSSatish Balay Not Collective 593e5c89e4eSSatish Balay 594e5c89e4eSSatish Balay Input Parameters: 595e5c89e4eSSatish Balay + obj - the PETSc object; this must be cast with (PetscObject), for example, 596e5c89e4eSSatish Balay PetscObjectCompose((PetscObject)mat,...); 597e5c89e4eSSatish Balay . name - name associated with the child object 598e5c89e4eSSatish Balay - ptr - the other PETSc object to associate with the PETSc object; this must also be 599e5c89e4eSSatish Balay cast with (PetscObject) 600e5c89e4eSSatish Balay 601e5c89e4eSSatish Balay Level: advanced 602e5c89e4eSSatish Balay 603e5c89e4eSSatish Balay Notes: 604e5c89e4eSSatish Balay The second objects reference count is automatically increased by one when it is 605e5c89e4eSSatish Balay composed. 606e5c89e4eSSatish Balay 607e5c89e4eSSatish Balay Replaces any previous object that had the same name. 608e5c89e4eSSatish Balay 609e5c89e4eSSatish Balay If ptr is null and name has previously been composed using an object, then that 610e5c89e4eSSatish Balay entry is removed from the obj. 611e5c89e4eSSatish Balay 612e5c89e4eSSatish Balay PetscObjectCompose() can be used with any PETSc object (such as 613e5c89e4eSSatish Balay Mat, Vec, KSP, SNES, etc.) or any user-provided object. See 614776b82aeSLisandro Dalcin PetscContainerCreate() for info on how to create an object from a 615e5c89e4eSSatish Balay user-provided pointer that may then be composed with PETSc objects. 616e5c89e4eSSatish Balay 617e5c89e4eSSatish Balay Concepts: objects^composing 618e5c89e4eSSatish Balay Concepts: composing objects 619e5c89e4eSSatish Balay 620776b82aeSLisandro Dalcin .seealso: PetscObjectQuery(), PetscContainerCreate() 621e5c89e4eSSatish Balay @*/ 6227087cfbeSBarry Smith PetscErrorCode PetscObjectCompose(PetscObject obj,const char name[],PetscObject ptr) 623e5c89e4eSSatish Balay { 624e5c89e4eSSatish Balay PetscErrorCode ierr; 625e5c89e4eSSatish Balay 626e5c89e4eSSatish Balay PetscFunctionBegin; 6273cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 6283cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 6293cfa8680SLisandro Dalcin if (ptr) PetscValidHeader(ptr,3); 630e5c89e4eSSatish Balay ierr = (*obj->bops->compose)(obj,name,ptr);CHKERRQ(ierr); 631e5c89e4eSSatish Balay PetscFunctionReturn(0); 632e5c89e4eSSatish Balay } 633e5c89e4eSSatish Balay 63458b60935SBarry Smith #undef __FUNCT__ 63558b60935SBarry Smith #define __FUNCT__ "PetscObjectSetPrecision" 63658b60935SBarry Smith /*@C 63758b60935SBarry Smith PetscObjectSetPrecision - sets the precision used within a given object. 6389f8a2776SDmitry Karpeev 63958b60935SBarry Smith Collective on the PetscObject 64058b60935SBarry Smith 64158b60935SBarry Smith Input Parameters: 64258b60935SBarry Smith + obj - the PETSc object; this must be cast with (PetscObject), for example, 64358b60935SBarry Smith PetscObjectCompose((PetscObject)mat,...); 64458b60935SBarry Smith - precision - the precision 64558b60935SBarry Smith 64658b60935SBarry Smith Level: advanced 64758b60935SBarry Smith 64858b60935SBarry Smith .seealso: PetscObjectQuery(), PetscContainerCreate() 64958b60935SBarry Smith @*/ 6507087cfbeSBarry Smith PetscErrorCode PetscObjectSetPrecision(PetscObject obj,PetscPrecision precision) 65158b60935SBarry Smith { 65258b60935SBarry Smith PetscFunctionBegin; 65358b60935SBarry Smith PetscValidHeader(obj,1); 65458b60935SBarry Smith obj->precision = precision; 65558b60935SBarry Smith PetscFunctionReturn(0); 65658b60935SBarry Smith } 6579f8a2776SDmitry Karpeev 658e5c89e4eSSatish Balay #undef __FUNCT__ 659e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQuery" 660e5c89e4eSSatish Balay /*@C 661e5c89e4eSSatish Balay PetscObjectQuery - Gets a PETSc object associated with a given object. 662e5c89e4eSSatish Balay 663e5c89e4eSSatish Balay Not Collective 664e5c89e4eSSatish Balay 665e5c89e4eSSatish Balay Input Parameters: 666e5c89e4eSSatish Balay + obj - the PETSc object 667e5c89e4eSSatish Balay Thus must be cast with a (PetscObject), for example, 668e5c89e4eSSatish Balay PetscObjectCompose((PetscObject)mat,...); 669e5c89e4eSSatish Balay . name - name associated with child object 6703c0c59f3SBarry Smith - ptr - the other PETSc object associated with the PETSc object, this must be 6713c0c59f3SBarry Smith cast with (PetscObject *) 672e5c89e4eSSatish Balay 673e5c89e4eSSatish Balay Level: advanced 674e5c89e4eSSatish Balay 6753c0c59f3SBarry Smith The reference count of neither object is increased in this call 6763c0c59f3SBarry Smith 677e5c89e4eSSatish Balay Concepts: objects^composing 678e5c89e4eSSatish Balay Concepts: composing objects 679e5c89e4eSSatish Balay Concepts: objects^querying 680e5c89e4eSSatish Balay Concepts: querying objects 681e5c89e4eSSatish Balay 68288674abaSJed Brown .seealso: PetscObjectCompose() 683e5c89e4eSSatish Balay @*/ 6847087cfbeSBarry Smith PetscErrorCode PetscObjectQuery(PetscObject obj,const char name[],PetscObject *ptr) 685e5c89e4eSSatish Balay { 686e5c89e4eSSatish Balay PetscErrorCode ierr; 687e5c89e4eSSatish Balay 688e5c89e4eSSatish Balay PetscFunctionBegin; 6893cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 6903cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 6913cfa8680SLisandro Dalcin PetscValidPointer(ptr,3); 692e5c89e4eSSatish Balay ierr = (*obj->bops->query)(obj,name,ptr);CHKERRQ(ierr); 693e5c89e4eSSatish Balay PetscFunctionReturn(0); 694e5c89e4eSSatish Balay } 695e5c89e4eSSatish Balay 696e5c89e4eSSatish Balay #undef __FUNCT__ 697e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectComposeFunction" 6987087cfbeSBarry Smith PetscErrorCode PetscObjectComposeFunction(PetscObject obj,const char name[],const char fname[],void (*ptr)(void)) 699e5c89e4eSSatish Balay { 700e5c89e4eSSatish Balay PetscErrorCode ierr; 701e5c89e4eSSatish Balay 702e5c89e4eSSatish Balay PetscFunctionBegin; 7033cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 7043cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 705e5c89e4eSSatish Balay ierr = (*obj->bops->composefunction)(obj,name,fname,ptr);CHKERRQ(ierr); 706e5c89e4eSSatish Balay PetscFunctionReturn(0); 707e5c89e4eSSatish Balay } 708e5c89e4eSSatish Balay 709e5c89e4eSSatish Balay #undef __FUNCT__ 710e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectQueryFunction" 711e5c89e4eSSatish Balay /*@C 712e5c89e4eSSatish Balay PetscObjectQueryFunction - Gets a function associated with a given object. 713e5c89e4eSSatish Balay 7143f9fe445SBarry Smith Logically Collective on PetscObject 715e5c89e4eSSatish Balay 716e5c89e4eSSatish Balay Input Parameters: 717e5c89e4eSSatish Balay + obj - the PETSc object; this must be cast with (PetscObject), for example, 718e5c89e4eSSatish Balay PetscObjectQueryFunction((PetscObject)ksp,...); 719e5c89e4eSSatish Balay - name - name associated with the child function 720e5c89e4eSSatish Balay 721e5c89e4eSSatish Balay Output Parameter: 722e5c89e4eSSatish Balay . ptr - function pointer 723e5c89e4eSSatish Balay 724e5c89e4eSSatish Balay Level: advanced 725e5c89e4eSSatish Balay 726e5c89e4eSSatish Balay Concepts: objects^composing functions 727e5c89e4eSSatish Balay Concepts: composing functions 728e5c89e4eSSatish Balay Concepts: functions^querying 729e5c89e4eSSatish Balay Concepts: objects^querying 730e5c89e4eSSatish Balay Concepts: querying objects 731e5c89e4eSSatish Balay 732e5c89e4eSSatish Balay .seealso: PetscObjectComposeFunctionDynamic() 733e5c89e4eSSatish Balay @*/ 7347087cfbeSBarry Smith PetscErrorCode PetscObjectQueryFunction(PetscObject obj,const char name[],void (**ptr)(void)) 735e5c89e4eSSatish Balay { 736e5c89e4eSSatish Balay PetscErrorCode ierr; 737e5c89e4eSSatish Balay 738e5c89e4eSSatish Balay PetscFunctionBegin; 7393cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 7403cfa8680SLisandro Dalcin PetscValidCharPointer(name,2); 741e5c89e4eSSatish Balay ierr = (*obj->bops->queryfunction)(obj,name,ptr);CHKERRQ(ierr); 742e5c89e4eSSatish Balay PetscFunctionReturn(0); 743e5c89e4eSSatish Balay } 744e5c89e4eSSatish Balay 745776b82aeSLisandro Dalcin struct _p_PetscContainer { 746e5c89e4eSSatish Balay PETSCHEADER(int); 747e5c89e4eSSatish Balay void *ptr; 748e5c89e4eSSatish Balay PetscErrorCode (*userdestroy)(void*); 749e5c89e4eSSatish Balay }; 750e5c89e4eSSatish Balay 751e5c89e4eSSatish Balay #undef __FUNCT__ 752776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerGetPointer" 753e5c89e4eSSatish Balay /*@C 754776b82aeSLisandro Dalcin PetscContainerGetPointer - Gets the pointer value contained in the container. 755e5c89e4eSSatish Balay 7563f9fe445SBarry Smith Not Collective 757e5c89e4eSSatish Balay 758e5c89e4eSSatish Balay Input Parameter: 759776b82aeSLisandro Dalcin . obj - the object created with PetscContainerCreate() 760e5c89e4eSSatish Balay 761e5c89e4eSSatish Balay Output Parameter: 762e5c89e4eSSatish Balay . ptr - the pointer value 763e5c89e4eSSatish Balay 764e5c89e4eSSatish Balay Level: advanced 765e5c89e4eSSatish Balay 766776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(), 767776b82aeSLisandro Dalcin PetscContainerSetPointer() 768e5c89e4eSSatish Balay @*/ 7697087cfbeSBarry Smith PetscErrorCode PetscContainerGetPointer(PetscContainer obj,void **ptr) 770e5c89e4eSSatish Balay { 771e5c89e4eSSatish Balay PetscFunctionBegin; 7720700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 7733cfa8680SLisandro Dalcin PetscValidPointer(ptr,2); 774e5c89e4eSSatish Balay *ptr = obj->ptr; 775e5c89e4eSSatish Balay PetscFunctionReturn(0); 776e5c89e4eSSatish Balay } 777e5c89e4eSSatish Balay 778e5c89e4eSSatish Balay 779e5c89e4eSSatish Balay #undef __FUNCT__ 780776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetPointer" 781e5c89e4eSSatish Balay /*@C 782776b82aeSLisandro Dalcin PetscContainerSetPointer - Sets the pointer value contained in the container. 783e5c89e4eSSatish Balay 7843f9fe445SBarry Smith Logically Collective on PetscContainer 785e5c89e4eSSatish Balay 786e5c89e4eSSatish Balay Input Parameters: 787776b82aeSLisandro Dalcin + obj - the object created with PetscContainerCreate() 788e5c89e4eSSatish Balay - ptr - the pointer value 789e5c89e4eSSatish Balay 790e5c89e4eSSatish Balay Level: advanced 791e5c89e4eSSatish Balay 792776b82aeSLisandro Dalcin .seealso: PetscContainerCreate(), PetscContainerDestroy(), 793776b82aeSLisandro Dalcin PetscContainerGetPointer() 794e5c89e4eSSatish Balay @*/ 7957087cfbeSBarry Smith PetscErrorCode PetscContainerSetPointer(PetscContainer obj,void *ptr) 796e5c89e4eSSatish Balay { 797e5c89e4eSSatish Balay PetscFunctionBegin; 7980700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 7993cfa8680SLisandro Dalcin if (ptr) PetscValidPointer(ptr,2); 800e5c89e4eSSatish Balay obj->ptr = ptr; 801e5c89e4eSSatish Balay PetscFunctionReturn(0); 802e5c89e4eSSatish Balay } 803e5c89e4eSSatish Balay 804e5c89e4eSSatish Balay #undef __FUNCT__ 805776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerDestroy" 806e5c89e4eSSatish Balay /*@C 807776b82aeSLisandro Dalcin PetscContainerDestroy - Destroys a PETSc container object. 808e5c89e4eSSatish Balay 809776b82aeSLisandro Dalcin Collective on PetscContainer 810e5c89e4eSSatish Balay 811e5c89e4eSSatish Balay Input Parameter: 812776b82aeSLisandro Dalcin . obj - an object that was created with PetscContainerCreate() 813e5c89e4eSSatish Balay 814e5c89e4eSSatish Balay Level: advanced 815e5c89e4eSSatish Balay 81677012dfaSBarry Smith .seealso: PetscContainerCreate(), PetscContainerSetUserDestroy() 817e5c89e4eSSatish Balay @*/ 8186bf464f9SBarry Smith PetscErrorCode PetscContainerDestroy(PetscContainer *obj) 819e5c89e4eSSatish Balay { 820e5c89e4eSSatish Balay PetscErrorCode ierr; 821e5c89e4eSSatish Balay PetscFunctionBegin; 8226bf464f9SBarry Smith if (!*obj) PetscFunctionReturn(0); 8236bf464f9SBarry Smith PetscValidHeaderSpecific(*obj,PETSC_CONTAINER_CLASSID,1); 824835d1d25SJed Brown if (--((PetscObject)(*obj))->refct > 0) {*obj = 0; PetscFunctionReturn(0);} 8256bf464f9SBarry Smith if ((*obj)->userdestroy) (*(*obj)->userdestroy)((*obj)->ptr); 826e5c89e4eSSatish Balay ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr); 827e5c89e4eSSatish Balay PetscFunctionReturn(0); 828e5c89e4eSSatish Balay } 829e5c89e4eSSatish Balay 830e5c89e4eSSatish Balay #undef __FUNCT__ 831776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerSetUserDestroy" 832e5c89e4eSSatish Balay /*@C 833776b82aeSLisandro Dalcin PetscContainerSetUserDestroy - Sets name of the user destroy function. 834e5c89e4eSSatish Balay 8353f9fe445SBarry Smith Logically Collective on PetscContainer 836e5c89e4eSSatish Balay 837e5c89e4eSSatish Balay Input Parameter: 838776b82aeSLisandro Dalcin + obj - an object that was created with PetscContainerCreate() 839e5c89e4eSSatish Balay - des - name of the user destroy function 840e5c89e4eSSatish Balay 841e5c89e4eSSatish Balay Level: advanced 842e5c89e4eSSatish Balay 843776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy() 844e5c89e4eSSatish Balay @*/ 8457087cfbeSBarry Smith PetscErrorCode PetscContainerSetUserDestroy(PetscContainer obj, PetscErrorCode (*des)(void*)) 846e5c89e4eSSatish Balay { 847e5c89e4eSSatish Balay PetscFunctionBegin; 8480700a824SBarry Smith PetscValidHeaderSpecific(obj,PETSC_CONTAINER_CLASSID,1); 849e5c89e4eSSatish Balay obj->userdestroy = des; 850e5c89e4eSSatish Balay PetscFunctionReturn(0); 851e5c89e4eSSatish Balay } 852e5c89e4eSSatish Balay 8537087cfbeSBarry Smith PetscClassId PETSC_CONTAINER_CLASSID; 854e5c89e4eSSatish Balay 855e5c89e4eSSatish Balay #undef __FUNCT__ 856776b82aeSLisandro Dalcin #define __FUNCT__ "PetscContainerCreate" 857e5c89e4eSSatish Balay /*@C 858776b82aeSLisandro Dalcin PetscContainerCreate - Creates a PETSc object that has room to hold 859e5c89e4eSSatish Balay a single pointer. This allows one to attach any type of data (accessible 860e5c89e4eSSatish Balay through a pointer) with the PetscObjectCompose() function to a PetscObject. 8613c0c59f3SBarry Smith The data item itself is attached by a call to PetscContainerSetPointer(). 862e5c89e4eSSatish Balay 863e5c89e4eSSatish Balay Collective on MPI_Comm 864e5c89e4eSSatish Balay 865e5c89e4eSSatish Balay Input Parameters: 866e5c89e4eSSatish Balay . comm - MPI communicator that shares the object 867e5c89e4eSSatish Balay 868e5c89e4eSSatish Balay Output Parameters: 869e5c89e4eSSatish Balay . container - the container created 870e5c89e4eSSatish Balay 871e5c89e4eSSatish Balay Level: advanced 872e5c89e4eSSatish Balay 873776b82aeSLisandro Dalcin .seealso: PetscContainerDestroy(), PetscContainerSetPointer(), PetscContainerGetPointer() 874e5c89e4eSSatish Balay @*/ 8757087cfbeSBarry Smith PetscErrorCode PetscContainerCreate(MPI_Comm comm,PetscContainer *container) 876e5c89e4eSSatish Balay { 877e5c89e4eSSatish Balay PetscErrorCode ierr; 878776b82aeSLisandro Dalcin PetscContainer contain; 879e5c89e4eSSatish Balay 880e5c89e4eSSatish Balay PetscFunctionBegin; 8813cfa8680SLisandro Dalcin PetscValidPointer(container,2); 8823194b578SJed Brown ierr = PetscHeaderCreate(contain,_p_PetscContainer,PetscInt,PETSC_CONTAINER_CLASSID,0,"PetscContainer","Container","Sys",comm,PetscContainerDestroy,0);CHKERRQ(ierr); 883e5c89e4eSSatish Balay *container = contain; 884e5c89e4eSSatish Balay PetscFunctionReturn(0); 885e5c89e4eSSatish Balay } 886e5c89e4eSSatish Balay 887e5c89e4eSSatish Balay #undef __FUNCT__ 888e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetFromOptions" 889e5c89e4eSSatish Balay /*@ 890e5c89e4eSSatish Balay PetscObjectSetFromOptions - Sets generic parameters from user options. 891e5c89e4eSSatish Balay 892e5c89e4eSSatish Balay Collective on obj 893e5c89e4eSSatish Balay 894e5c89e4eSSatish Balay Input Parameter: 895e5c89e4eSSatish Balay . obj - the PetscObjcet 896e5c89e4eSSatish Balay 897e5c89e4eSSatish Balay Options Database Keys: 898e5c89e4eSSatish Balay 899e5c89e4eSSatish Balay Notes: 900e5c89e4eSSatish Balay We have no generic options at present, so this does nothing 901e5c89e4eSSatish Balay 902e5c89e4eSSatish Balay Level: beginner 903e5c89e4eSSatish Balay 904e5c89e4eSSatish Balay .keywords: set, options, database 905e5c89e4eSSatish Balay .seealso: PetscObjectSetOptionsPrefix(), PetscObjectGetOptionsPrefix() 906e5c89e4eSSatish Balay @*/ 9077087cfbeSBarry Smith PetscErrorCode PetscObjectSetFromOptions(PetscObject obj) 908e5c89e4eSSatish Balay { 909e5c89e4eSSatish Balay PetscFunctionBegin; 9103cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 911e5c89e4eSSatish Balay PetscFunctionReturn(0); 912e5c89e4eSSatish Balay } 913e5c89e4eSSatish Balay 914e5c89e4eSSatish Balay #undef __FUNCT__ 915e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetUp" 916e5c89e4eSSatish Balay /*@ 917e5c89e4eSSatish Balay PetscObjectSetUp - Sets up the internal data structures for the later use. 918e5c89e4eSSatish Balay 919e5c89e4eSSatish Balay Collective on PetscObject 920e5c89e4eSSatish Balay 921e5c89e4eSSatish Balay Input Parameters: 922e5c89e4eSSatish Balay . obj - the PetscObject 923e5c89e4eSSatish Balay 924e5c89e4eSSatish Balay Notes: 925e5c89e4eSSatish Balay This does nothing at present. 926e5c89e4eSSatish Balay 927e5c89e4eSSatish Balay Level: advanced 928e5c89e4eSSatish Balay 929e5c89e4eSSatish Balay .keywords: setup 930e5c89e4eSSatish Balay .seealso: PetscObjectDestroy() 931e5c89e4eSSatish Balay @*/ 9327087cfbeSBarry Smith PetscErrorCode PetscObjectSetUp(PetscObject obj) 933e5c89e4eSSatish Balay { 934e5c89e4eSSatish Balay PetscFunctionBegin; 9353cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 936e5c89e4eSSatish Balay PetscFunctionReturn(0); 937e5c89e4eSSatish Balay } 938