1 #define PETSC_DLL 2 /* 3 Provides utility routines for manulating any type of PETSc object. 4 */ 5 #include "petsc.h" /*I "petsc.h" I*/ 6 7 #undef __FUNCT__ 8 #define __FUNCT__ "PetscObjectStateQuery" 9 /*@C 10 PetscObjectStateQuery - Gets the state of any PetscObject, 11 regardless of the type. 12 13 Not Collective 14 15 Input Parameter: 16 . obj - any PETSc object, for example a Vec, Mat or KSP. This must be 17 cast with a (PetscObject), for example, 18 PetscObjectStateQuery((PetscObject)mat,&state); 19 20 Output Parameter: 21 . state - the object state 22 23 Notes: object state is an integer which gets increased every time 24 the object is changed. By saving and later querying the object state 25 one can determine whether information about the object is still current. 26 Currently, state is maintained for Vec and Mat objects. 27 28 Level: advanced 29 30 seealso: PetscObjectStateIncrease, PetscObjectSetState 31 32 Concepts: state 33 34 @*/ 35 PetscErrorCode PETSC_DLLEXPORT PetscObjectStateQuery(PetscObject obj,PetscInt *state) 36 { 37 PetscFunctionBegin; 38 if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT,"Null object"); 39 *state = obj->state; 40 PetscFunctionReturn(0); 41 } 42 43 #undef __FUNCT__ 44 #define __FUNCT__ "PetscObjectSetState" 45 /*@C 46 PetscObjectSetState - Sets the state of any PetscObject, 47 regardless of the type. 48 49 Not Collective 50 51 Input Parameter: 52 + obj - any PETSc object, for example a Vec, Mat or KSP. This must be 53 cast with a (PetscObject), for example, 54 PetscObjectSetState((PetscObject)mat,state); 55 - state - the object state 56 57 Notes: This function should be used with extreme caution. There is 58 essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), 59 which increases the state, but does not alter the data, then this 60 routine can be used to reset the state. 61 62 Level: advanced 63 64 seealso: PetscObjectStateQuery,PetscObjectStateIncrease 65 66 Concepts: state 67 68 @*/ 69 PetscErrorCode PETSC_DLLEXPORT PetscObjectSetState(PetscObject obj,PetscInt state) 70 { 71 PetscFunctionBegin; 72 if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT,"Null object"); 73 obj->state = state; 74 PetscFunctionReturn(0); 75 } 76 77 #undef __FUNCT__ 78 #define __FUNCT__ "PetscObjectStateIncrease" 79 /*@C 80 PetscObjectStateIncrease - Increases the state of any PetscObject, 81 regardless of the type. 82 83 Not Collective 84 85 Input Parameter: 86 . obj - any PETSc object, for example a Vec, Mat or KSP. This must be 87 cast with a (PetscObject), for example, 88 PetscObjectStateIncrease((PetscObject)mat); 89 90 Notes: object state is an integer which gets increased every time 91 the object is changed. By saving and later querying the object state 92 one can determine whether information about the object is still current. 93 Currently, state is maintained for Vec and Mat objects. 94 95 This routine is mostly for internal use by PETSc; a developer need only 96 call it after explicit access to an object's internals. Routines such 97 as VecSet or MatScale already call this routine. It is also called, as a 98 precaution, in VecRestoreArray, MatRestoreRow, MatRestoreArray. 99 100 Level: developer 101 102 seealso: PetscObjectStateQuery 103 104 Concepts: state 105 106 @*/ 107 PetscErrorCode PETSC_DLLEXPORT PetscObjectStateIncrease(PetscObject obj) 108 { 109 PetscFunctionBegin; 110 if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT,"Null object"); 111 obj->state++; 112 PetscFunctionReturn(0); 113 } 114 115 PetscInt PETSC_DLLEXPORT globalcurrentstate = 0; 116 PetscInt PETSC_DLLEXPORT globalmaxstate = 10; 117 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataRegister(PetscInt *id) 118 { 119 PetscFunctionBegin; 120 *id = globalcurrentstate++; 121 if (globalcurrentstate > globalmaxstate) globalmaxstate += 10; 122 PetscFunctionReturn(0); 123 } 124 125 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseInt(PetscObject obj) 126 { 127 PetscInt *ar = obj->intcomposeddata,*new_ar; 128 PetscInt *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i; 129 PetscErrorCode ierr; 130 131 PetscFunctionBegin; 132 new_n = globalmaxstate; 133 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr); 134 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr); 135 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 136 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 137 if (n) { 138 for (i=0; i<n; i++) { 139 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 140 } 141 ierr = PetscFree(ar);CHKERRQ(ierr); 142 ierr = PetscFree(ir);CHKERRQ(ierr); 143 } 144 obj->int_idmax = new_n; 145 obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 146 PetscFunctionReturn(0); 147 } 148 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 149 { 150 PetscInt **ar = obj->intstarcomposeddata,**new_ar; 151 PetscInt *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i; 152 PetscErrorCode ierr; 153 154 PetscFunctionBegin; 155 new_n = globalmaxstate; 156 ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr); 157 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr); 158 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 159 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 160 if (n) { 161 for (i=0; i<n; i++) { 162 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 163 } 164 ierr = PetscFree(ar);CHKERRQ(ierr); 165 ierr = PetscFree(ir);CHKERRQ(ierr); 166 } 167 obj->intstar_idmax = new_n; 168 obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 169 PetscFunctionReturn(0); 170 } 171 172 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseReal(PetscObject obj) 173 { 174 PetscReal *ar = obj->realcomposeddata,*new_ar; 175 PetscInt *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i; 176 PetscErrorCode ierr; 177 178 PetscFunctionBegin; 179 new_n = globalmaxstate; 180 ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr); 181 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr); 182 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 183 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 184 if (n) { 185 for (i=0; i<n; i++) { 186 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 187 } 188 ierr = PetscFree(ar);CHKERRQ(ierr); 189 ierr = PetscFree(ir);CHKERRQ(ierr); 190 } 191 obj->real_idmax = new_n; 192 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 193 PetscFunctionReturn(0); 194 } 195 196 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 197 { 198 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 199 PetscInt *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i; 200 PetscErrorCode ierr; 201 202 PetscFunctionBegin; 203 new_n = globalmaxstate; 204 ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr); 205 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr); 206 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 207 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 208 if (n) { 209 for (i=0; i<n; i++) { 210 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 211 } 212 ierr = PetscFree(ar);CHKERRQ(ierr); 213 ierr = PetscFree(ir);CHKERRQ(ierr); 214 } 215 obj->realstar_idmax = new_n; 216 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 217 PetscFunctionReturn(0); 218 } 219 220 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalar(PetscObject obj) 221 { 222 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 223 PetscInt *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i; 224 PetscErrorCode ierr; 225 226 PetscFunctionBegin; 227 new_n = globalmaxstate; 228 ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr); 229 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr); 230 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 231 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 232 if (n) { 233 for (i=0; i<n; i++) { 234 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 235 } 236 ierr = PetscFree(ar);CHKERRQ(ierr); 237 ierr = PetscFree(ir);CHKERRQ(ierr); 238 } 239 obj->scalar_idmax = new_n; 240 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 241 PetscFunctionReturn(0); 242 } 243 244 PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 245 { 246 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 247 PetscInt *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i; 248 PetscErrorCode ierr; 249 250 PetscFunctionBegin; 251 new_n = globalmaxstate; 252 ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr); 253 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr); 254 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 255 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 256 if (n) { 257 for (i=0; i<n; i++) { 258 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 259 } 260 ierr = PetscFree(ar);CHKERRQ(ierr); 261 ierr = PetscFree(ir);CHKERRQ(ierr); 262 } 263 obj->scalarstar_idmax = new_n; 264 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 265 PetscFunctionReturn(0); 266 } 267 268