1 2 /* 3 Provides utility routines for manulating any type of PETSc object. 4 */ 5 #include <petscsys.h> /*I "petscsys.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 PetscObjectStateQuery(PetscObject obj,PetscInt *state) 36 { 37 PetscFunctionBegin; 38 PetscValidHeader(obj,1); 39 PetscValidIntPointer(state,2); 40 *state = obj->state; 41 PetscFunctionReturn(0); 42 } 43 44 #undef __FUNCT__ 45 #define __FUNCT__ "PetscObjectSetState" 46 /*@C 47 PetscObjectSetState - Sets the state of any PetscObject, 48 regardless of the type. 49 50 Not Collective 51 52 Input Parameter: 53 + obj - any PETSc object, for example a Vec, Mat or KSP. This must be 54 cast with a (PetscObject), for example, 55 PetscObjectSetState((PetscObject)mat,state); 56 - state - the object state 57 58 Notes: This function should be used with extreme caution. There is 59 essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), 60 which increases the state, but does not alter the data, then this 61 routine can be used to reset the state. 62 63 Level: advanced 64 65 seealso: PetscObjectStateQuery(),PetscObjectStateIncrease() 66 67 Concepts: state 68 69 @*/ 70 PetscErrorCode PetscObjectSetState(PetscObject obj,PetscInt state) 71 { 72 PetscFunctionBegin; 73 PetscValidHeader(obj,1); 74 obj->state = state; 75 PetscFunctionReturn(0); 76 } 77 78 PetscInt globalcurrentstate = 0; 79 PetscInt globalmaxstate = 10; 80 81 #undef __FUNCT__ 82 #define __FUNCT__ "PetscObjectComposedDataRegister" 83 /*@C 84 PetscObjectComposedDataRegister - Get an available id for 85 composed data 86 87 Not Collective 88 89 Output parameter: 90 . id - an identifier under which data can be stored 91 92 Level: developer 93 94 seealso: PetscObjectComposedDataSetInt() 95 96 @*/ 97 PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 98 { 99 PetscFunctionBegin; 100 *id = globalcurrentstate++; 101 if (globalcurrentstate > globalmaxstate) globalmaxstate += 10; 102 PetscFunctionReturn(0); 103 } 104 105 #undef __FUNCT__ 106 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt" 107 PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 108 { 109 PetscInt *ar = obj->intcomposeddata,*new_ar; 110 PetscInt *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i; 111 PetscErrorCode ierr; 112 113 PetscFunctionBegin; 114 new_n = globalmaxstate; 115 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr); 116 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr); 117 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 118 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 119 if (n) { 120 for (i=0; i<n; i++) { 121 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 122 } 123 ierr = PetscFree(ar);CHKERRQ(ierr); 124 ierr = PetscFree(ir);CHKERRQ(ierr); 125 } 126 obj->int_idmax = new_n; 127 obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 128 PetscFunctionReturn(0); 129 } 130 131 #undef __FUNCT__ 132 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar" 133 PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 134 { 135 PetscInt **ar = obj->intstarcomposeddata,**new_ar; 136 PetscInt *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i; 137 PetscErrorCode ierr; 138 139 PetscFunctionBegin; 140 new_n = globalmaxstate; 141 ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr); 142 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr); 143 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 144 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 145 if (n) { 146 for (i=0; i<n; i++) { 147 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 148 } 149 ierr = PetscFree(ar);CHKERRQ(ierr); 150 ierr = PetscFree(ir);CHKERRQ(ierr); 151 } 152 obj->intstar_idmax = new_n; 153 obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 154 PetscFunctionReturn(0); 155 } 156 157 #undef __FUNCT__ 158 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal" 159 PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 160 { 161 PetscReal *ar = obj->realcomposeddata,*new_ar; 162 PetscInt *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i; 163 PetscErrorCode ierr; 164 165 PetscFunctionBegin; 166 new_n = globalmaxstate; 167 ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr); 168 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr); 169 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 170 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 171 if (n) { 172 for (i=0; i<n; i++) { 173 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 174 } 175 ierr = PetscFree(ar);CHKERRQ(ierr); 176 ierr = PetscFree(ir);CHKERRQ(ierr); 177 } 178 obj->real_idmax = new_n; 179 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 180 PetscFunctionReturn(0); 181 } 182 183 #undef __FUNCT__ 184 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 185 PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 186 { 187 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 188 PetscInt *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i; 189 PetscErrorCode ierr; 190 191 PetscFunctionBegin; 192 new_n = globalmaxstate; 193 ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr); 194 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr); 195 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 196 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 197 if (n) { 198 for (i=0; i<n; i++) { 199 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 200 } 201 ierr = PetscFree(ar);CHKERRQ(ierr); 202 ierr = PetscFree(ir);CHKERRQ(ierr); 203 } 204 obj->realstar_idmax = new_n; 205 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 206 PetscFunctionReturn(0); 207 } 208 209 #undef __FUNCT__ 210 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 211 PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 212 { 213 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 214 PetscInt *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i; 215 PetscErrorCode ierr; 216 217 PetscFunctionBegin; 218 new_n = globalmaxstate; 219 ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr); 220 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr); 221 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 222 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 223 if (n) { 224 for (i=0; i<n; i++) { 225 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 226 } 227 ierr = PetscFree(ar);CHKERRQ(ierr); 228 ierr = PetscFree(ir);CHKERRQ(ierr); 229 } 230 obj->scalar_idmax = new_n; 231 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 232 PetscFunctionReturn(0); 233 } 234 235 #undef __FUNCT__ 236 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 237 PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 238 { 239 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 240 PetscInt *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i; 241 PetscErrorCode ierr; 242 243 PetscFunctionBegin; 244 new_n = globalmaxstate; 245 ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr); 246 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr); 247 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 248 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 249 if (n) { 250 for (i=0; i<n; i++) { 251 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 252 } 253 ierr = PetscFree(ar);CHKERRQ(ierr); 254 ierr = PetscFree(ir);CHKERRQ(ierr); 255 } 256 obj->scalarstar_idmax = new_n; 257 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 258 PetscFunctionReturn(0); 259 } 260 261