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 = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 117 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 118 if (n) { 119 for (i=0; i<n; i++) { 120 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 121 } 122 ierr = PetscFree(ar);CHKERRQ(ierr); 123 ierr = PetscFree(ir);CHKERRQ(ierr); 124 } 125 obj->int_idmax = new_n; 126 obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 127 PetscFunctionReturn(0); 128 } 129 130 #undef __FUNCT__ 131 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar" 132 PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 133 { 134 PetscInt **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i; 135 PetscObjectState *ir = obj->intstarcomposedstate,*new_ir; 136 PetscErrorCode ierr; 137 138 PetscFunctionBegin; 139 new_n = PetscObjectComposedDataMax; 140 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 141 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 142 if (n) { 143 for (i=0; i<n; i++) { 144 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 145 } 146 ierr = PetscFree(ar);CHKERRQ(ierr); 147 ierr = PetscFree(ir);CHKERRQ(ierr); 148 } 149 obj->intstar_idmax = new_n; 150 obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 151 PetscFunctionReturn(0); 152 } 153 154 #undef __FUNCT__ 155 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal" 156 PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 157 { 158 PetscReal *ar = obj->realcomposeddata,*new_ar; 159 PetscObjectState *ir = obj->realcomposedstate,*new_ir; 160 PetscInt n = obj->real_idmax,new_n,i; 161 PetscErrorCode ierr; 162 163 PetscFunctionBegin; 164 new_n = PetscObjectComposedDataMax; 165 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 166 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 167 if (n) { 168 for (i=0; i<n; i++) { 169 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 170 } 171 ierr = PetscFree(ar);CHKERRQ(ierr); 172 ierr = PetscFree(ir);CHKERRQ(ierr); 173 } 174 obj->real_idmax = new_n; 175 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 176 PetscFunctionReturn(0); 177 } 178 179 #undef __FUNCT__ 180 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 181 PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 182 { 183 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 184 PetscObjectState *ir = obj->realstarcomposedstate,*new_ir; 185 PetscInt n = obj->realstar_idmax,new_n,i; 186 PetscErrorCode ierr; 187 188 PetscFunctionBegin; 189 new_n = PetscObjectComposedDataMax; 190 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 191 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 192 if (n) { 193 for (i=0; i<n; i++) { 194 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 195 } 196 ierr = PetscFree(ar);CHKERRQ(ierr); 197 ierr = PetscFree(ir);CHKERRQ(ierr); 198 } 199 obj->realstar_idmax = new_n; 200 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 201 PetscFunctionReturn(0); 202 } 203 204 #undef __FUNCT__ 205 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 206 PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 207 { 208 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 209 PetscObjectState *ir = obj->scalarcomposedstate,*new_ir; 210 PetscInt n = obj->scalar_idmax,new_n,i; 211 PetscErrorCode ierr; 212 213 PetscFunctionBegin; 214 new_n = PetscObjectComposedDataMax; 215 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 216 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 217 if (n) { 218 for (i=0; i<n; i++) { 219 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 220 } 221 ierr = PetscFree(ar);CHKERRQ(ierr); 222 ierr = PetscFree(ir);CHKERRQ(ierr); 223 } 224 obj->scalar_idmax = new_n; 225 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 226 PetscFunctionReturn(0); 227 } 228 229 #undef __FUNCT__ 230 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 231 PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 232 { 233 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 234 PetscObjectState *ir = obj->scalarstarcomposedstate,*new_ir; 235 PetscInt n = obj->scalarstar_idmax,new_n,i; 236 PetscErrorCode ierr; 237 238 PetscFunctionBegin; 239 new_n = PetscObjectComposedDataMax; 240 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 241 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 242 if (n) { 243 for (i=0; i<n; i++) { 244 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 245 } 246 ierr = PetscFree(ar);CHKERRQ(ierr); 247 ierr = PetscFree(ir);CHKERRQ(ierr); 248 } 249 obj->scalarstar_idmax = new_n; 250 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 251 PetscFunctionReturn(0); 252 } 253 254 #undef __FUNCT__ 255 #define __FUNCT__ "PetscObjectGetId" 256 /*@ 257 PetscObjectGetId - get unique object ID 258 259 Not Collective 260 261 Input Arguments: 262 . obj - object 263 264 Output Arguments: 265 . id - integer ID 266 267 Level: developer 268 269 Notes: 270 The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 271 272 .seealso: PetscObjectStateGet() 273 @*/ 274 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 275 { 276 277 PetscFunctionBegin; 278 *id = obj->id; 279 PetscFunctionReturn(0); 280 } 281