17d0a6c19SBarry Smith 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5afcb2eb5SJed Brown #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay #undef __FUNCT__ 8*59e4f3c8SBarry Smith #define __FUNCT__ "PetscObjectStateGet" 9e5c89e4eSSatish Balay /*@C 10*59e4f3c8SBarry 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, 18*59e4f3c8SBarry 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 30*59e4f3c8SBarry Smith seealso: PetscObjectStateIncrease(), PetscObjectStateSet() 31e5c89e4eSSatish Balay 32e5c89e4eSSatish Balay Concepts: state 33e5c89e4eSSatish Balay 34e5c89e4eSSatish Balay @*/ 35*59e4f3c8SBarry Smith PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscInt *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__ 45*59e4f3c8SBarry Smith #define __FUNCT__ "PetscObjectStateSet" 46e5c89e4eSSatish Balay /*@C 47*59e4f3c8SBarry Smith PetscObjectStateSet - Sets the state of any PetscObject, 48e5c89e4eSSatish Balay regardless of the type. 49e5c89e4eSSatish Balay 50e5c89e4eSSatish Balay Not 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, 55*59e4f3c8SBarry 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 61e5c89e4eSSatish Balay routine can be used to reset the state. 62e5c89e4eSSatish Balay 63e5c89e4eSSatish Balay Level: advanced 64e5c89e4eSSatish Balay 65*59e4f3c8SBarry Smith seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 66e5c89e4eSSatish Balay 67e5c89e4eSSatish Balay Concepts: state 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay @*/ 70*59e4f3c8SBarry Smith PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscInt 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 8362755792SVictor Eijkhout PetscObjectComposedDataRegister - Get an available id for 8462755792SVictor Eijkhout composed data 8562755792SVictor Eijkhout 8662755792SVictor Eijkhout Not Collective 8762755792SVictor Eijkhout 8862755792SVictor Eijkhout Output parameter: 8962755792SVictor Eijkhout . id - an identifier under which data can be stored 9062755792SVictor Eijkhout 9162755792SVictor Eijkhout Level: developer 9262755792SVictor Eijkhout 93f65bdb8fSBarry Smith seealso: PetscObjectComposedDataSetInt() 9462755792SVictor Eijkhout 9562755792SVictor Eijkhout @*/ 967087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 97e5c89e4eSSatish Balay { 98d44a1e48SBarry Smith static PetscInt globalcurrentstate = 0; 99d44a1e48SBarry Smith 100e5c89e4eSSatish Balay PetscFunctionBegin; 101e5c89e4eSSatish Balay *id = globalcurrentstate++; 1028b5db460SBarry Smith if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10; 103e5c89e4eSSatish Balay PetscFunctionReturn(0); 104e5c89e4eSSatish Balay } 105e5c89e4eSSatish Balay 10653c77d0aSJed Brown #undef __FUNCT__ 10753c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseInt" 1087087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 109e5c89e4eSSatish Balay { 110e5c89e4eSSatish Balay PetscInt *ar = obj->intcomposeddata,*new_ar; 111e5c89e4eSSatish Balay PetscInt *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i; 112e5c89e4eSSatish Balay PetscErrorCode ierr; 113e5c89e4eSSatish Balay 114e5c89e4eSSatish Balay PetscFunctionBegin; 1158b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 116e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr); 117e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr); 118e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 119e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));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 { 136e5c89e4eSSatish Balay PetscInt **ar = obj->intstarcomposeddata,**new_ar; 137e5c89e4eSSatish Balay PetscInt *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i; 138e5c89e4eSSatish Balay PetscErrorCode ierr; 139e5c89e4eSSatish Balay 140e5c89e4eSSatish Balay PetscFunctionBegin; 1418b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 142e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr); 143e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr); 144e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 145e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 146e5c89e4eSSatish Balay if (n) { 147e5c89e4eSSatish Balay for (i=0; i<n; i++) { 148e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 149e5c89e4eSSatish Balay } 150e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 151e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 152e5c89e4eSSatish Balay } 153e5c89e4eSSatish Balay obj->intstar_idmax = new_n; 154e5c89e4eSSatish Balay obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 155e5c89e4eSSatish Balay PetscFunctionReturn(0); 156e5c89e4eSSatish Balay } 157e5c89e4eSSatish Balay 15853c77d0aSJed Brown #undef __FUNCT__ 15953c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseReal" 1607087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 161e5c89e4eSSatish Balay { 162e5c89e4eSSatish Balay PetscReal *ar = obj->realcomposeddata,*new_ar; 163e5c89e4eSSatish Balay PetscInt *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i; 164e5c89e4eSSatish Balay PetscErrorCode ierr; 165e5c89e4eSSatish Balay 166e5c89e4eSSatish Balay PetscFunctionBegin; 1678b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 168e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr); 169e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr); 170e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 171e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 172e5c89e4eSSatish Balay if (n) { 173e5c89e4eSSatish Balay for (i=0; i<n; i++) { 174e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 175e5c89e4eSSatish Balay } 176e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 177e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 178e5c89e4eSSatish Balay } 179e5c89e4eSSatish Balay obj->real_idmax = new_n; 180e5c89e4eSSatish Balay obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 181e5c89e4eSSatish Balay PetscFunctionReturn(0); 182e5c89e4eSSatish Balay } 183e5c89e4eSSatish Balay 18453c77d0aSJed Brown #undef __FUNCT__ 18553c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 1867087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 187e5c89e4eSSatish Balay { 188e5c89e4eSSatish Balay PetscReal **ar = obj->realstarcomposeddata,**new_ar; 189e5c89e4eSSatish Balay PetscInt *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i; 190e5c89e4eSSatish Balay PetscErrorCode ierr; 191e5c89e4eSSatish Balay 192e5c89e4eSSatish Balay PetscFunctionBegin; 1938b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 194e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr); 195e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr); 196e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 197e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 198e5c89e4eSSatish Balay if (n) { 199e5c89e4eSSatish Balay for (i=0; i<n; i++) { 200e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 201e5c89e4eSSatish Balay } 202e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 203e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 204e5c89e4eSSatish Balay } 205e5c89e4eSSatish Balay obj->realstar_idmax = new_n; 206e5c89e4eSSatish Balay obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 207e5c89e4eSSatish Balay PetscFunctionReturn(0); 208e5c89e4eSSatish Balay } 209e5c89e4eSSatish Balay 21053c77d0aSJed Brown #undef __FUNCT__ 21153c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 2127087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 213e5c89e4eSSatish Balay { 214e5c89e4eSSatish Balay PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 215e5c89e4eSSatish Balay PetscInt *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i; 216e5c89e4eSSatish Balay PetscErrorCode ierr; 217e5c89e4eSSatish Balay 218e5c89e4eSSatish Balay PetscFunctionBegin; 2198b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 220e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr); 221e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr); 222e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 223e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 224e5c89e4eSSatish Balay if (n) { 225e5c89e4eSSatish Balay for (i=0; i<n; i++) { 226e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 227e5c89e4eSSatish Balay } 228e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 229e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 230e5c89e4eSSatish Balay } 231e5c89e4eSSatish Balay obj->scalar_idmax = new_n; 232e5c89e4eSSatish Balay obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 233e5c89e4eSSatish Balay PetscFunctionReturn(0); 234e5c89e4eSSatish Balay } 235e5c89e4eSSatish Balay 23653c77d0aSJed Brown #undef __FUNCT__ 23753c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 2387087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 239e5c89e4eSSatish Balay { 240e5c89e4eSSatish Balay PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 241e5c89e4eSSatish Balay PetscInt *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i; 242e5c89e4eSSatish Balay PetscErrorCode ierr; 243e5c89e4eSSatish Balay 244e5c89e4eSSatish Balay PetscFunctionBegin; 2458b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 246e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr); 247e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr); 248e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 249e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 250e5c89e4eSSatish Balay if (n) { 251e5c89e4eSSatish Balay for (i=0; i<n; i++) { 252e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 253e5c89e4eSSatish Balay } 254e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 255e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 256e5c89e4eSSatish Balay } 257e5c89e4eSSatish Balay obj->scalarstar_idmax = new_n; 258e5c89e4eSSatish Balay obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 259e5c89e4eSSatish Balay PetscFunctionReturn(0); 260e5c89e4eSSatish Balay } 261e5c89e4eSSatish Balay 262