1 2 /* 3 Provides utility routines for manulating any type of PETSc object. 4 */ 5 #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 6 7 #undef __FUNCT__ 8 #define __FUNCT__ "PetscObjectStateGet" 9 /*@C 10 PetscObjectStateGet - 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 PetscObjectStateGet((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(), PetscObjectStateSet() 31 32 Concepts: state 33 34 @*/ 35 PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *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__ "PetscObjectStateSet" 46 /*@C 47 PetscObjectStateSet - Sets the state of any PetscObject, 48 regardless of the type. 49 50 Logically 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 PetscObjectStateSet((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. Such a reset must be collective. 62 63 Level: advanced 64 65 seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 66 67 Concepts: state 68 69 @*/ 70 PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state) 71 { 72 PetscFunctionBegin; 73 PetscValidHeader(obj,1); 74 obj->state = state; 75 PetscFunctionReturn(0); 76 } 77 78 PetscInt PetscObjectComposedDataMax = 10; 79 80 #undef __FUNCT__ 81 #define __FUNCT__ "PetscObjectComposedDataRegister" 82 /*@C 83 PetscObjectComposedDataRegister - Get an available id for 84 composed data 85 86 Not Collective 87 88 Output parameter: 89 . id - an identifier under which data can be stored 90 91 Level: developer 92 93 seealso: PetscObjectComposedDataSetInt() 94 95 @*/ 96 PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 97 { 98 static PetscInt globalcurrentstate = 0; 99 100 PetscFunctionBegin; 101 *id = globalcurrentstate++; 102 if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10; 103 PetscFunctionReturn(0); 104 } 105 106 #undef __FUNCT__ 107 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt" 108 PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 109 { 110 PetscInt *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i; 111 PetscObjectState *ir = obj->intcomposedstate,*new_ir; 112 PetscErrorCode ierr; 113 114 PetscFunctionBegin; 115 new_n = PetscObjectComposedDataMax; 116 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr); 117 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr); 118 ierr = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr); 119 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr); 120 if (n) { 121 for (i=0; i<n; i++) { 122 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 123 } 124 ierr = PetscFree(ar);CHKERRQ(ierr); 125 ierr = PetscFree(ir);CHKERRQ(ierr); 126 } 127 obj->int_idmax = new_n; 128 obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 129 PetscFunctionReturn(0); 130 } 131 132 #undef __FUNCT__ 133 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar" 134 PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 135 { 136 PetscInt **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i; 137 PetscObjectState *ir = obj->intstarcomposedstate,*new_ir; 138 PetscErrorCode ierr; 139 140 PetscFunctionBegin; 141 new_n = PetscObjectComposedDataMax; 142 ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr); 143 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr); 144 ierr = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr); 145 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr); 146 if (n) { 147 for (i=0; i<n; i++) { 148 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 149 } 150 ierr = PetscFree(ar);CHKERRQ(ierr); 151 ierr = PetscFree(ir);CHKERRQ(ierr); 152 } 153 obj->intstar_idmax = new_n; 154 obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 155 PetscFunctionReturn(0); 156 } 157 158 #undef __FUNCT__ 159 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal" 160 PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 161 { 162 PetscReal *ar = obj->realcomposeddata,*new_ar; 163 PetscObjectState *ir = obj->realcomposedstate,*new_ir; 164 PetscInt n = obj->real_idmax,new_n,i; 165 PetscErrorCode ierr; 166 167 PetscFunctionBegin; 168 new_n = PetscObjectComposedDataMax; 169 ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr); 170 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr); 171 ierr = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr); 172 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr); 173 if (n) { 174 for (i=0; i<n; i++) { 175 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 176 } 177 ierr = PetscFree(ar);CHKERRQ(ierr); 178 ierr = PetscFree(ir);CHKERRQ(ierr); 179 } 180 obj->real_idmax = new_n; 181 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 182 PetscFunctionReturn(0); 183 } 184 185 #undef __FUNCT__ 186 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 187 PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 188 { 189 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 190 PetscObjectState *ir = obj->realstarcomposedstate,*new_ir; 191 PetscInt n = obj->realstar_idmax,new_n,i; 192 PetscErrorCode ierr; 193 194 PetscFunctionBegin; 195 new_n = PetscObjectComposedDataMax; 196 ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr); 197 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr); 198 ierr = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr); 199 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr); 200 if (n) { 201 for (i=0; i<n; i++) { 202 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 203 } 204 ierr = PetscFree(ar);CHKERRQ(ierr); 205 ierr = PetscFree(ir);CHKERRQ(ierr); 206 } 207 obj->realstar_idmax = new_n; 208 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 209 PetscFunctionReturn(0); 210 } 211 212 #undef __FUNCT__ 213 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 214 PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 215 { 216 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 217 PetscObjectState *ir = obj->scalarcomposedstate,*new_ir; 218 PetscInt n = obj->scalar_idmax,new_n,i; 219 PetscErrorCode ierr; 220 221 PetscFunctionBegin; 222 new_n = PetscObjectComposedDataMax; 223 ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr); 224 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr); 225 ierr = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr); 226 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr); 227 if (n) { 228 for (i=0; i<n; i++) { 229 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 230 } 231 ierr = PetscFree(ar);CHKERRQ(ierr); 232 ierr = PetscFree(ir);CHKERRQ(ierr); 233 } 234 obj->scalar_idmax = new_n; 235 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 236 PetscFunctionReturn(0); 237 } 238 239 #undef __FUNCT__ 240 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 241 PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 242 { 243 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 244 PetscObjectState *ir = obj->scalarstarcomposedstate,*new_ir; 245 PetscInt n = obj->scalarstar_idmax,new_n,i; 246 PetscErrorCode ierr; 247 248 PetscFunctionBegin; 249 new_n = PetscObjectComposedDataMax; 250 ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr); 251 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr); 252 ierr = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr); 253 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr); 254 if (n) { 255 for (i=0; i<n; i++) { 256 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 257 } 258 ierr = PetscFree(ar);CHKERRQ(ierr); 259 ierr = PetscFree(ir);CHKERRQ(ierr); 260 } 261 obj->scalarstar_idmax = new_n; 262 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 263 PetscFunctionReturn(0); 264 } 265 266 #undef __FUNCT__ 267 #define __FUNCT__ "PetscObjectGetId" 268 /*@ 269 PetscObjectGetId - get unique object ID 270 271 Not Collective 272 273 Input Arguments: 274 . obj - object 275 276 Output Arguments: 277 . id - integer ID 278 279 Level: developer 280 281 Notes: 282 The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 283 284 .seealso: PetscObjectStateGet() 285 @*/ 286 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 287 { 288 289 PetscFunctionBegin; 290 *id = obj->id; 291 PetscFunctionReturn(0); 292 } 293