1e5c89e4eSSatish Balay #define PETSC_DLL 2e5c89e4eSSatish Balay /* 3e5c89e4eSSatish Balay Provides utility routines for manulating any type of PETSc object. 4e5c89e4eSSatish Balay */ 5d382aafbSBarry Smith #include "petscsys.h" /*I "petscsys.h" I*/ 6e5c89e4eSSatish Balay 7e5c89e4eSSatish Balay #undef __FUNCT__ 8e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectStateQuery" 9e5c89e4eSSatish Balay /*@C 10e5c89e4eSSatish Balay PetscObjectStateQuery - 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, 18e5c89e4eSSatish Balay PetscObjectStateQuery((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*f65bdb8fSBarry Smith seealso: PetscObjectStateIncrease(), PetscObjectSetState() 31e5c89e4eSSatish Balay 32e5c89e4eSSatish Balay Concepts: state 33e5c89e4eSSatish Balay 34e5c89e4eSSatish Balay @*/ 35e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectStateQuery(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__ 45e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetState" 46e5c89e4eSSatish Balay /*@C 47e5c89e4eSSatish Balay PetscObjectSetState - 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, 55e5c89e4eSSatish Balay PetscObjectSetState((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*f65bdb8fSBarry Smith seealso: PetscObjectStateQuery(),PetscObjectStateIncrease() 66e5c89e4eSSatish Balay 67e5c89e4eSSatish Balay Concepts: state 68e5c89e4eSSatish Balay 69e5c89e4eSSatish Balay @*/ 70e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectSetState(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 78e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT globalcurrentstate = 0; 79e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT globalmaxstate = 10; 8062755792SVictor Eijkhout /*@C 8162755792SVictor Eijkhout PetscObjectComposedDataRegister - Get an available id for 8262755792SVictor Eijkhout composed data 8362755792SVictor Eijkhout 8462755792SVictor Eijkhout Not Collective 8562755792SVictor Eijkhout 8662755792SVictor Eijkhout Output parameter: 8762755792SVictor Eijkhout . id - an identifier under which data can be stored 8862755792SVictor Eijkhout 8962755792SVictor Eijkhout Level: developer 9062755792SVictor Eijkhout 91*f65bdb8fSBarry Smith seealso: PetscObjectComposedDataSetInt() 9262755792SVictor Eijkhout 9362755792SVictor Eijkhout @*/ 94e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataRegister(PetscInt *id) 95e5c89e4eSSatish Balay { 96e5c89e4eSSatish Balay PetscFunctionBegin; 97e5c89e4eSSatish Balay *id = globalcurrentstate++; 98e5c89e4eSSatish Balay if (globalcurrentstate > globalmaxstate) globalmaxstate += 10; 99e5c89e4eSSatish Balay PetscFunctionReturn(0); 100e5c89e4eSSatish Balay } 101e5c89e4eSSatish Balay 102e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseInt(PetscObject obj) 103e5c89e4eSSatish Balay { 104e5c89e4eSSatish Balay PetscInt *ar = obj->intcomposeddata,*new_ar; 105e5c89e4eSSatish Balay PetscInt *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i; 106e5c89e4eSSatish Balay PetscErrorCode ierr; 107e5c89e4eSSatish Balay 108e5c89e4eSSatish Balay PetscFunctionBegin; 109e5c89e4eSSatish Balay new_n = globalmaxstate; 110e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr); 111e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr); 112e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 113e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 114e5c89e4eSSatish Balay if (n) { 115e5c89e4eSSatish Balay for (i=0; i<n; i++) { 116e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 117e5c89e4eSSatish Balay } 118e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 119e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 120e5c89e4eSSatish Balay } 121e5c89e4eSSatish Balay obj->int_idmax = new_n; 122e5c89e4eSSatish Balay obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 123e5c89e4eSSatish Balay PetscFunctionReturn(0); 124e5c89e4eSSatish Balay } 125e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 126e5c89e4eSSatish Balay { 127e5c89e4eSSatish Balay PetscInt **ar = obj->intstarcomposeddata,**new_ar; 128e5c89e4eSSatish Balay PetscInt *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i; 129e5c89e4eSSatish Balay PetscErrorCode ierr; 130e5c89e4eSSatish Balay 131e5c89e4eSSatish Balay PetscFunctionBegin; 132e5c89e4eSSatish Balay new_n = globalmaxstate; 133e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr); 134e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr); 135e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 136e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));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 149e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseReal(PetscObject obj) 150e5c89e4eSSatish Balay { 151e5c89e4eSSatish Balay PetscReal *ar = obj->realcomposeddata,*new_ar; 152e5c89e4eSSatish Balay PetscInt *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i; 153e5c89e4eSSatish Balay PetscErrorCode ierr; 154e5c89e4eSSatish Balay 155e5c89e4eSSatish Balay PetscFunctionBegin; 156e5c89e4eSSatish Balay new_n = globalmaxstate; 157e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr); 158e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr); 159e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 160e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 161e5c89e4eSSatish Balay if (n) { 162e5c89e4eSSatish Balay for (i=0; i<n; i++) { 163e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 164e5c89e4eSSatish Balay } 165e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 166e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 167e5c89e4eSSatish Balay } 168e5c89e4eSSatish Balay obj->real_idmax = new_n; 169e5c89e4eSSatish Balay obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 170e5c89e4eSSatish Balay PetscFunctionReturn(0); 171e5c89e4eSSatish Balay } 172e5c89e4eSSatish Balay 173e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 174e5c89e4eSSatish Balay { 175e5c89e4eSSatish Balay PetscReal **ar = obj->realstarcomposeddata,**new_ar; 176e5c89e4eSSatish Balay PetscInt *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i; 177e5c89e4eSSatish Balay PetscErrorCode ierr; 178e5c89e4eSSatish Balay 179e5c89e4eSSatish Balay PetscFunctionBegin; 180e5c89e4eSSatish Balay new_n = globalmaxstate; 181e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr); 182e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr); 183e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 184e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 185e5c89e4eSSatish Balay if (n) { 186e5c89e4eSSatish Balay for (i=0; i<n; i++) { 187e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 188e5c89e4eSSatish Balay } 189e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 190e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 191e5c89e4eSSatish Balay } 192e5c89e4eSSatish Balay obj->realstar_idmax = new_n; 193e5c89e4eSSatish Balay obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 194e5c89e4eSSatish Balay PetscFunctionReturn(0); 195e5c89e4eSSatish Balay } 196e5c89e4eSSatish Balay 197e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalar(PetscObject obj) 198e5c89e4eSSatish Balay { 199e5c89e4eSSatish Balay PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 200e5c89e4eSSatish Balay PetscInt *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i; 201e5c89e4eSSatish Balay PetscErrorCode ierr; 202e5c89e4eSSatish Balay 203e5c89e4eSSatish Balay PetscFunctionBegin; 204e5c89e4eSSatish Balay new_n = globalmaxstate; 205e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr); 206e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr); 207e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 208e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 209e5c89e4eSSatish Balay if (n) { 210e5c89e4eSSatish Balay for (i=0; i<n; i++) { 211e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 212e5c89e4eSSatish Balay } 213e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 214e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 215e5c89e4eSSatish Balay } 216e5c89e4eSSatish Balay obj->scalar_idmax = new_n; 217e5c89e4eSSatish Balay obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 218e5c89e4eSSatish Balay PetscFunctionReturn(0); 219e5c89e4eSSatish Balay } 220e5c89e4eSSatish Balay 221e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 222e5c89e4eSSatish Balay { 223e5c89e4eSSatish Balay PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 224e5c89e4eSSatish Balay PetscInt *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i; 225e5c89e4eSSatish Balay PetscErrorCode ierr; 226e5c89e4eSSatish Balay 227e5c89e4eSSatish Balay PetscFunctionBegin; 228e5c89e4eSSatish Balay new_n = globalmaxstate; 229e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr); 230e5c89e4eSSatish Balay ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr); 231e5c89e4eSSatish Balay ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 232e5c89e4eSSatish Balay ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 233e5c89e4eSSatish Balay if (n) { 234e5c89e4eSSatish Balay for (i=0; i<n; i++) { 235e5c89e4eSSatish Balay new_ar[i] = ar[i]; new_ir[i] = ir[i]; 236e5c89e4eSSatish Balay } 237e5c89e4eSSatish Balay ierr = PetscFree(ar);CHKERRQ(ierr); 238e5c89e4eSSatish Balay ierr = PetscFree(ir);CHKERRQ(ierr); 239e5c89e4eSSatish Balay } 240e5c89e4eSSatish Balay obj->scalarstar_idmax = new_n; 241e5c89e4eSSatish Balay obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 242e5c89e4eSSatish Balay PetscFunctionReturn(0); 243e5c89e4eSSatish Balay } 244e5c89e4eSSatish Balay 245