17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5*af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay #undef __FUNCT__ 859e4f3c8SBarry Smith #define __FUNCT__ "PetscObjectStateGet" 9e5c89e4eSSatish Balay /*@C 1059e4f3c8SBarry Smith PetscObjectStateGet - Gets the state of any PetscObject, 11e5c89e4eSSatish Balay regardless of the type. 12e5c89e4eSSatish Balay 13e5c89e4eSSatish Balay Not Collective 14e5c89e4eSSatish Balay 15e5c89e4eSSatish Balay Input Parameter: 16e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. This must be 17e5c89e4eSSatish Balay cast with a (PetscObject), for example, 1859e4f3c8SBarry Smith PetscObjectStateGet((PetscObject)mat,&state); 19e5c89e4eSSatish Balay 20e5c89e4eSSatish Balay Output Parameter: 21e5c89e4eSSatish Balay . state - the object state 22e5c89e4eSSatish Balay 23e5c89e4eSSatish Balay Notes: object state is an integer which gets increased every time 24e5c89e4eSSatish Balay the object is changed. By saving and later querying the object state 25e5c89e4eSSatish Balay one can determine whether information about the object is still current. 26e5c89e4eSSatish Balay Currently, state is maintained for Vec and Mat objects. 27e5c89e4eSSatish Balay 28e5c89e4eSSatish Balay Level: advanced 29e5c89e4eSSatish Balay 3059e4f3c8SBarry Smith seealso: PetscObjectStateIncrease(), PetscObjectStateSet() 31e5c89e4eSSatish Balay 32e5c89e4eSSatish Balay Concepts: state 33e5c89e4eSSatish Balay 34e5c89e4eSSatish Balay @*/ 35270bf2e7SJed Brown PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state) 36e5c89e4eSSatish Balay { 37e5c89e4eSSatish Balay PetscFunctionBegin; 383cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 393cfa8680SLisandro Dalcin PetscValidIntPointer(state,2); 40e5c89e4eSSatish Balay *state = obj->state; 41e5c89e4eSSatish Balay PetscFunctionReturn(0); 42e5c89e4eSSatish Balay } 43e5c89e4eSSatish Balay 44e5c89e4eSSatish Balay #undef __FUNCT__ 4559e4f3c8SBarry Smith #define __FUNCT__ "PetscObjectStateSet" 46e5c89e4eSSatish Balay /*@C 4759e4f3c8SBarry Smith PetscObjectStateSet - Sets the state of any PetscObject, 48e5c89e4eSSatish Balay regardless of the type. 49e5c89e4eSSatish Balay 50704cc5ceSJed Brown Logically Collective 51e5c89e4eSSatish Balay 52e5c89e4eSSatish Balay Input Parameter: 53e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. This must be 54e5c89e4eSSatish Balay cast with a (PetscObject), for example, 5559e4f3c8SBarry Smith PetscObjectStateSet((PetscObject)mat,state); 56e5c89e4eSSatish Balay - state - the object state 57e5c89e4eSSatish Balay 58e5c89e4eSSatish Balay Notes: This function should be used with extreme caution. There is 59e5c89e4eSSatish Balay essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), 60e5c89e4eSSatish Balay which increases the state, but does not alter the data, then this 61704cc5ceSJed Brown routine can be used to reset the state. Such a reset must be collective. 62e5c89e4eSSatish Balay 63e5c89e4eSSatish Balay Level: advanced 64e5c89e4eSSatish Balay 6559e4f3c8SBarry Smith seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 66e5c89e4eSSatish Balay 67e5c89e4eSSatish Balay Concepts: state 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay @*/ 70270bf2e7SJed Brown PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state) 71e5c89e4eSSatish Balay { 72e5c89e4eSSatish Balay PetscFunctionBegin; 733cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 74e5c89e4eSSatish Balay obj->state = state; 75e5c89e4eSSatish Balay PetscFunctionReturn(0); 76e5c89e4eSSatish Balay } 77e5c89e4eSSatish Balay 788b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10; 7953c77d0aSJed Brown 8053c77d0aSJed Brown #undef __FUNCT__ 8153c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataRegister" 8262755792SVictor Eijkhout /*@C 831957e957SBarry Smith PetscObjectComposedDataRegister - Get an available id for composed data 8462755792SVictor Eijkhout 8562755792SVictor Eijkhout Not Collective 8662755792SVictor Eijkhout 8762755792SVictor Eijkhout Output parameter: 8862755792SVictor Eijkhout . id - an identifier under which data can be stored 8962755792SVictor Eijkhout 9062755792SVictor Eijkhout Level: developer 9162755792SVictor Eijkhout 921957e957SBarry Smith Notes: You must keep this value (for example in a global variable) in order to attach the data to an object or 931957e957SBarry Smith access in an object. 941957e957SBarry Smith 95f65bdb8fSBarry Smith seealso: PetscObjectComposedDataSetInt() 9662755792SVictor Eijkhout 9762755792SVictor Eijkhout @*/ 987087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 99e5c89e4eSSatish Balay { 100d44a1e48SBarry Smith static PetscInt globalcurrentstate = 0; 101d44a1e48SBarry Smith 102e5c89e4eSSatish Balay PetscFunctionBegin; 103e5c89e4eSSatish Balay *id = globalcurrentstate++; 1048b5db460SBarry Smith if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10; 105e5c89e4eSSatish Balay PetscFunctionReturn(0); 106e5c89e4eSSatish Balay } 107e5c89e4eSSatish Balay 10853c77d0aSJed Brown #undef __FUNCT__ 10953c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseInt" 1107087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 111e5c89e4eSSatish Balay { 112270bf2e7SJed Brown PetscInt *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i; 113270bf2e7SJed Brown PetscObjectState *ir = obj->intcomposedstate,*new_ir; 114e5c89e4eSSatish Balay PetscErrorCode ierr; 115e5c89e4eSSatish Balay 116e5c89e4eSSatish Balay PetscFunctionBegin; 1178b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1181795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1191795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 120e5c89e4eSSatish Balay if (n) { 121e5c89e4eSSatish Balay for (i=0; i<n; i++) { 122e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 123e5c89e4eSSatish Balay } 124e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 125e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 126e5c89e4eSSatish Balay } 127e5c89e4eSSatish Balay obj->int_idmax = new_n; 128e5c89e4eSSatish Balay obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 129e5c89e4eSSatish Balay PetscFunctionReturn(0); 130e5c89e4eSSatish Balay } 13153c77d0aSJed Brown 13253c77d0aSJed Brown #undef __FUNCT__ 13353c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar" 1347087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 135e5c89e4eSSatish Balay { 136270bf2e7SJed Brown PetscInt **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i; 137270bf2e7SJed Brown PetscObjectState *ir = obj->intstarcomposedstate,*new_ir; 138e5c89e4eSSatish Balay PetscErrorCode ierr; 139e5c89e4eSSatish Balay 140e5c89e4eSSatish Balay PetscFunctionBegin; 1418b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1421795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1431795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 144e5c89e4eSSatish Balay if (n) { 145e5c89e4eSSatish Balay for (i=0; i<n; i++) { 146e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 147e5c89e4eSSatish Balay } 148e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 149e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 150e5c89e4eSSatish Balay } 151e5c89e4eSSatish Balay obj->intstar_idmax = new_n; 152e5c89e4eSSatish Balay obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 153e5c89e4eSSatish Balay PetscFunctionReturn(0); 154e5c89e4eSSatish Balay } 155e5c89e4eSSatish Balay 15653c77d0aSJed Brown #undef __FUNCT__ 15753c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseReal" 1587087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 159e5c89e4eSSatish Balay { 160e5c89e4eSSatish Balay PetscReal *ar = obj->realcomposeddata,*new_ar; 161270bf2e7SJed Brown PetscObjectState *ir = obj->realcomposedstate,*new_ir; 162270bf2e7SJed Brown PetscInt n = obj->real_idmax,new_n,i; 163e5c89e4eSSatish Balay PetscErrorCode ierr; 164e5c89e4eSSatish Balay 165e5c89e4eSSatish Balay PetscFunctionBegin; 1668b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1671795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1681795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 169e5c89e4eSSatish Balay if (n) { 170e5c89e4eSSatish Balay for (i=0; i<n; i++) { 171e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 172e5c89e4eSSatish Balay } 173e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 174e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 175e5c89e4eSSatish Balay } 176e5c89e4eSSatish Balay obj->real_idmax = new_n; 177e5c89e4eSSatish Balay obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 178e5c89e4eSSatish Balay PetscFunctionReturn(0); 179e5c89e4eSSatish Balay } 180e5c89e4eSSatish Balay 18153c77d0aSJed Brown #undef __FUNCT__ 18253c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 1837087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 184e5c89e4eSSatish Balay { 185e5c89e4eSSatish Balay PetscReal **ar = obj->realstarcomposeddata,**new_ar; 186270bf2e7SJed Brown PetscObjectState *ir = obj->realstarcomposedstate,*new_ir; 187270bf2e7SJed Brown PetscInt n = obj->realstar_idmax,new_n,i; 188e5c89e4eSSatish Balay PetscErrorCode ierr; 189e5c89e4eSSatish Balay 190e5c89e4eSSatish Balay PetscFunctionBegin; 1918b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1921795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1931795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 194e5c89e4eSSatish Balay if (n) { 195e5c89e4eSSatish Balay for (i=0; i<n; i++) { 196e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 197e5c89e4eSSatish Balay } 198e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 199e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 200e5c89e4eSSatish Balay } 201e5c89e4eSSatish Balay obj->realstar_idmax = new_n; 202e5c89e4eSSatish Balay obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 203e5c89e4eSSatish Balay PetscFunctionReturn(0); 204e5c89e4eSSatish Balay } 205e5c89e4eSSatish Balay 20653c77d0aSJed Brown #undef __FUNCT__ 20753c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 2087087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 209e5c89e4eSSatish Balay { 210e5c89e4eSSatish Balay PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 211270bf2e7SJed Brown PetscObjectState *ir = obj->scalarcomposedstate,*new_ir; 212270bf2e7SJed Brown PetscInt n = obj->scalar_idmax,new_n,i; 213e5c89e4eSSatish Balay PetscErrorCode ierr; 214e5c89e4eSSatish Balay 215e5c89e4eSSatish Balay PetscFunctionBegin; 2168b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 2171795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 2181795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 219e5c89e4eSSatish Balay if (n) { 220e5c89e4eSSatish Balay for (i=0; i<n; i++) { 221e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 222e5c89e4eSSatish Balay } 223e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 224e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 225e5c89e4eSSatish Balay } 226e5c89e4eSSatish Balay obj->scalar_idmax = new_n; 227e5c89e4eSSatish Balay obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 228e5c89e4eSSatish Balay PetscFunctionReturn(0); 229e5c89e4eSSatish Balay } 230e5c89e4eSSatish Balay 23153c77d0aSJed Brown #undef __FUNCT__ 23253c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 2337087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 234e5c89e4eSSatish Balay { 235e5c89e4eSSatish Balay PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 236270bf2e7SJed Brown PetscObjectState *ir = obj->scalarstarcomposedstate,*new_ir; 237270bf2e7SJed Brown PetscInt n = obj->scalarstar_idmax,new_n,i; 238e5c89e4eSSatish Balay PetscErrorCode ierr; 239e5c89e4eSSatish Balay 240e5c89e4eSSatish Balay PetscFunctionBegin; 2418b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 2421795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 2431795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 244e5c89e4eSSatish Balay if (n) { 245e5c89e4eSSatish Balay for (i=0; i<n; i++) { 246e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 247e5c89e4eSSatish Balay } 248e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 249e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 250e5c89e4eSSatish Balay } 251e5c89e4eSSatish Balay obj->scalarstar_idmax = new_n; 252e5c89e4eSSatish Balay obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 253e5c89e4eSSatish Balay PetscFunctionReturn(0); 254e5c89e4eSSatish Balay } 255e5c89e4eSSatish Balay 256127c8a3bSJed Brown #undef __FUNCT__ 257127c8a3bSJed Brown #define __FUNCT__ "PetscObjectGetId" 258127c8a3bSJed Brown /*@ 259127c8a3bSJed Brown PetscObjectGetId - get unique object ID 260127c8a3bSJed Brown 261127c8a3bSJed Brown Not Collective 262127c8a3bSJed Brown 263127c8a3bSJed Brown Input Arguments: 264127c8a3bSJed Brown . obj - object 265127c8a3bSJed Brown 266127c8a3bSJed Brown Output Arguments: 267127c8a3bSJed Brown . id - integer ID 268127c8a3bSJed Brown 269127c8a3bSJed Brown Level: developer 270127c8a3bSJed Brown 271127c8a3bSJed Brown Notes: 272127c8a3bSJed Brown The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 273127c8a3bSJed Brown 2748dcff661SJed Brown .seealso: PetscObjectStateGet() 275127c8a3bSJed Brown @*/ 276127c8a3bSJed Brown PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 277127c8a3bSJed Brown { 278127c8a3bSJed Brown 279127c8a3bSJed Brown PetscFunctionBegin; 280127c8a3bSJed Brown *id = obj->id; 281127c8a3bSJed Brown PetscFunctionReturn(0); 282127c8a3bSJed Brown } 283