17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay /*@C 859e4f3c8SBarry Smith PetscObjectStateGet - Gets the state of any PetscObject, 9e5c89e4eSSatish Balay regardless of the type. 10e5c89e4eSSatish Balay 11e5c89e4eSSatish Balay Not Collective 12e5c89e4eSSatish Balay 13e5c89e4eSSatish Balay Input Parameter: 14e5c89e4eSSatish Balay . obj - any PETSc object, for example a Vec, Mat or KSP. This must be 15e5c89e4eSSatish Balay cast with a (PetscObject), for example, 1659e4f3c8SBarry Smith PetscObjectStateGet((PetscObject)mat,&state); 17e5c89e4eSSatish Balay 18e5c89e4eSSatish Balay Output Parameter: 19e5c89e4eSSatish Balay . state - the object state 20e5c89e4eSSatish Balay 21*95452b02SPatrick Sanan Notes: 22*95452b02SPatrick Sanan object state is an integer which gets increased every time 23e5c89e4eSSatish Balay the object is changed. By saving and later querying the object state 24e5c89e4eSSatish Balay one can determine whether information about the object is still current. 25e5c89e4eSSatish Balay Currently, state is maintained for Vec and Mat objects. 26e5c89e4eSSatish Balay 27e5c89e4eSSatish Balay Level: advanced 28e5c89e4eSSatish Balay 2959e4f3c8SBarry Smith seealso: PetscObjectStateIncrease(), PetscObjectStateSet() 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay Concepts: state 32e5c89e4eSSatish Balay 33e5c89e4eSSatish Balay @*/ 34270bf2e7SJed Brown PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state) 35e5c89e4eSSatish Balay { 36e5c89e4eSSatish Balay PetscFunctionBegin; 373cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 383cfa8680SLisandro Dalcin PetscValidIntPointer(state,2); 39e5c89e4eSSatish Balay *state = obj->state; 40e5c89e4eSSatish Balay PetscFunctionReturn(0); 41e5c89e4eSSatish Balay } 42e5c89e4eSSatish Balay 43e5c89e4eSSatish Balay /*@C 4459e4f3c8SBarry Smith PetscObjectStateSet - Sets the state of any PetscObject, 45e5c89e4eSSatish Balay regardless of the type. 46e5c89e4eSSatish Balay 47704cc5ceSJed Brown Logically Collective 48e5c89e4eSSatish Balay 49e5c89e4eSSatish Balay Input Parameter: 50e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. This must be 51e5c89e4eSSatish Balay cast with a (PetscObject), for example, 5259e4f3c8SBarry Smith PetscObjectStateSet((PetscObject)mat,state); 53e5c89e4eSSatish Balay - state - the object state 54e5c89e4eSSatish Balay 55*95452b02SPatrick Sanan Notes: 56*95452b02SPatrick Sanan This function should be used with extreme caution. There is 57e5c89e4eSSatish Balay essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), 58e5c89e4eSSatish Balay which increases the state, but does not alter the data, then this 59704cc5ceSJed Brown routine can be used to reset the state. Such a reset must be collective. 60e5c89e4eSSatish Balay 61e5c89e4eSSatish Balay Level: advanced 62e5c89e4eSSatish Balay 6359e4f3c8SBarry Smith seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 64e5c89e4eSSatish Balay 65e5c89e4eSSatish Balay Concepts: state 66e5c89e4eSSatish Balay 67e5c89e4eSSatish Balay @*/ 68270bf2e7SJed Brown PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state) 69e5c89e4eSSatish Balay { 70e5c89e4eSSatish Balay PetscFunctionBegin; 713cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 72e5c89e4eSSatish Balay obj->state = state; 73e5c89e4eSSatish Balay PetscFunctionReturn(0); 74e5c89e4eSSatish Balay } 75e5c89e4eSSatish Balay 768b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10; 7753c77d0aSJed Brown 7862755792SVictor Eijkhout /*@C 791957e957SBarry Smith PetscObjectComposedDataRegister - Get an available id for composed data 8062755792SVictor Eijkhout 8162755792SVictor Eijkhout Not Collective 8262755792SVictor Eijkhout 8362755792SVictor Eijkhout Output parameter: 8462755792SVictor Eijkhout . id - an identifier under which data can be stored 8562755792SVictor Eijkhout 8662755792SVictor Eijkhout Level: developer 8762755792SVictor Eijkhout 88*95452b02SPatrick Sanan Notes: 89*95452b02SPatrick Sanan You must keep this value (for example in a global variable) in order to attach the data to an object or 901957e957SBarry Smith access in an object. 911957e957SBarry Smith 92f65bdb8fSBarry Smith seealso: PetscObjectComposedDataSetInt() 9362755792SVictor Eijkhout 9462755792SVictor Eijkhout @*/ 957087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 96e5c89e4eSSatish Balay { 97d44a1e48SBarry Smith static PetscInt globalcurrentstate = 0; 98d44a1e48SBarry Smith 99e5c89e4eSSatish Balay PetscFunctionBegin; 100e5c89e4eSSatish Balay *id = globalcurrentstate++; 1018b5db460SBarry Smith if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10; 102e5c89e4eSSatish Balay PetscFunctionReturn(0); 103e5c89e4eSSatish Balay } 104e5c89e4eSSatish Balay 1057087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 106e5c89e4eSSatish Balay { 107270bf2e7SJed Brown PetscInt *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i; 108270bf2e7SJed Brown PetscObjectState *ir = obj->intcomposedstate,*new_ir; 109e5c89e4eSSatish Balay PetscErrorCode ierr; 110e5c89e4eSSatish Balay 111e5c89e4eSSatish Balay PetscFunctionBegin; 1128b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1131795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1141795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 115e5c89e4eSSatish Balay if (n) { 116e5c89e4eSSatish Balay for (i=0; i<n; i++) { 117e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 118e5c89e4eSSatish Balay } 119e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 120e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 121e5c89e4eSSatish Balay } 122e5c89e4eSSatish Balay obj->int_idmax = new_n; 123e5c89e4eSSatish Balay obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 124e5c89e4eSSatish Balay PetscFunctionReturn(0); 125e5c89e4eSSatish Balay } 12653c77d0aSJed Brown 1277087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 128e5c89e4eSSatish Balay { 129270bf2e7SJed Brown PetscInt **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i; 130270bf2e7SJed Brown PetscObjectState *ir = obj->intstarcomposedstate,*new_ir; 131e5c89e4eSSatish Balay PetscErrorCode ierr; 132e5c89e4eSSatish Balay 133e5c89e4eSSatish Balay PetscFunctionBegin; 1348b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1351795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1361795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 137e5c89e4eSSatish Balay if (n) { 138e5c89e4eSSatish Balay for (i=0; i<n; i++) { 139e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 140e5c89e4eSSatish Balay } 141e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 142e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 143e5c89e4eSSatish Balay } 144e5c89e4eSSatish Balay obj->intstar_idmax = new_n; 145e5c89e4eSSatish Balay obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 146e5c89e4eSSatish Balay PetscFunctionReturn(0); 147e5c89e4eSSatish Balay } 148e5c89e4eSSatish Balay 1497087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 150e5c89e4eSSatish Balay { 151e5c89e4eSSatish Balay PetscReal *ar = obj->realcomposeddata,*new_ar; 152270bf2e7SJed Brown PetscObjectState *ir = obj->realcomposedstate,*new_ir; 153270bf2e7SJed Brown PetscInt n = obj->real_idmax,new_n,i; 154e5c89e4eSSatish Balay PetscErrorCode ierr; 155e5c89e4eSSatish Balay 156e5c89e4eSSatish Balay PetscFunctionBegin; 1578b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1581795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1591795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 160e5c89e4eSSatish Balay if (n) { 161e5c89e4eSSatish Balay for (i=0; i<n; i++) { 162e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 163e5c89e4eSSatish Balay } 164e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 165e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 166e5c89e4eSSatish Balay } 167e5c89e4eSSatish Balay obj->real_idmax = new_n; 168e5c89e4eSSatish Balay obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 169e5c89e4eSSatish Balay PetscFunctionReturn(0); 170e5c89e4eSSatish Balay } 171e5c89e4eSSatish Balay 1727087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 173e5c89e4eSSatish Balay { 174e5c89e4eSSatish Balay PetscReal **ar = obj->realstarcomposeddata,**new_ar; 175270bf2e7SJed Brown PetscObjectState *ir = obj->realstarcomposedstate,*new_ir; 176270bf2e7SJed Brown PetscInt n = obj->realstar_idmax,new_n,i; 177e5c89e4eSSatish Balay PetscErrorCode ierr; 178e5c89e4eSSatish Balay 179e5c89e4eSSatish Balay PetscFunctionBegin; 1808b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1811795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 1821795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 183e5c89e4eSSatish Balay if (n) { 184e5c89e4eSSatish Balay for (i=0; i<n; i++) { 185e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 186e5c89e4eSSatish Balay } 187e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 188e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 189e5c89e4eSSatish Balay } 190e5c89e4eSSatish Balay obj->realstar_idmax = new_n; 191e5c89e4eSSatish Balay obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 192e5c89e4eSSatish Balay PetscFunctionReturn(0); 193e5c89e4eSSatish Balay } 194e5c89e4eSSatish Balay 1957087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 196e5c89e4eSSatish Balay { 197e5c89e4eSSatish Balay PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 198270bf2e7SJed Brown PetscObjectState *ir = obj->scalarcomposedstate,*new_ir; 199270bf2e7SJed Brown PetscInt n = obj->scalar_idmax,new_n,i; 200e5c89e4eSSatish Balay PetscErrorCode ierr; 201e5c89e4eSSatish Balay 202e5c89e4eSSatish Balay PetscFunctionBegin; 2038b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 2041795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 2051795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 206e5c89e4eSSatish Balay if (n) { 207e5c89e4eSSatish Balay for (i=0; i<n; i++) { 208e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 209e5c89e4eSSatish Balay } 210e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 211e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 212e5c89e4eSSatish Balay } 213e5c89e4eSSatish Balay obj->scalar_idmax = new_n; 214e5c89e4eSSatish Balay obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 215e5c89e4eSSatish Balay PetscFunctionReturn(0); 216e5c89e4eSSatish Balay } 217e5c89e4eSSatish Balay 2187087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 219e5c89e4eSSatish Balay { 220e5c89e4eSSatish Balay PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 221270bf2e7SJed Brown PetscObjectState *ir = obj->scalarstarcomposedstate,*new_ir; 222270bf2e7SJed Brown PetscInt n = obj->scalarstar_idmax,new_n,i; 223e5c89e4eSSatish Balay PetscErrorCode ierr; 224e5c89e4eSSatish Balay 225e5c89e4eSSatish Balay PetscFunctionBegin; 2268b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 2271795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 2281795a4d1SJed Brown ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 229e5c89e4eSSatish Balay if (n) { 230e5c89e4eSSatish Balay for (i=0; i<n; i++) { 231e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 232e5c89e4eSSatish Balay } 233e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 234e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 235e5c89e4eSSatish Balay } 236e5c89e4eSSatish Balay obj->scalarstar_idmax = new_n; 237e5c89e4eSSatish Balay obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 238e5c89e4eSSatish Balay PetscFunctionReturn(0); 239e5c89e4eSSatish Balay } 240e5c89e4eSSatish Balay 241127c8a3bSJed Brown /*@ 242127c8a3bSJed Brown PetscObjectGetId - get unique object ID 243127c8a3bSJed Brown 244127c8a3bSJed Brown Not Collective 245127c8a3bSJed Brown 246127c8a3bSJed Brown Input Arguments: 247127c8a3bSJed Brown . obj - object 248127c8a3bSJed Brown 249127c8a3bSJed Brown Output Arguments: 250127c8a3bSJed Brown . id - integer ID 251127c8a3bSJed Brown 252127c8a3bSJed Brown Level: developer 253127c8a3bSJed Brown 254127c8a3bSJed Brown Notes: 255127c8a3bSJed Brown The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 256127c8a3bSJed Brown 2578dcff661SJed Brown .seealso: PetscObjectStateGet() 258127c8a3bSJed Brown @*/ 259127c8a3bSJed Brown PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 260127c8a3bSJed Brown { 261127c8a3bSJed Brown 262127c8a3bSJed Brown PetscFunctionBegin; 263127c8a3bSJed Brown *id = obj->id; 264127c8a3bSJed Brown PetscFunctionReturn(0); 265127c8a3bSJed Brown } 266