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 /*@C 8 PetscObjectStateGet - Gets the state of any PetscObject, 9 regardless of the type. 10 11 Not Collective 12 13 Input Parameter: 14 . obj - any PETSc object, for example a Vec, Mat or KSP. This must be 15 cast with a (PetscObject), for example, 16 PetscObjectStateGet((PetscObject)mat,&state); 17 18 Output Parameter: 19 . state - the object state 20 21 Notes: 22 object state is an integer which gets increased every time 23 the object is changed. By saving and later querying the object state 24 one can determine whether information about the object is still current. 25 Currently, state is maintained for Vec and Mat objects. 26 27 Level: advanced 28 29 seealso: PetscObjectStateIncrease(), PetscObjectStateSet() 30 31 Concepts: state 32 33 @*/ 34 PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state) 35 { 36 PetscFunctionBegin; 37 PetscValidHeader(obj,1); 38 PetscValidIntPointer(state,2); 39 *state = obj->state; 40 PetscFunctionReturn(0); 41 } 42 43 /*@C 44 PetscObjectStateSet - Sets the state of any PetscObject, 45 regardless of the type. 46 47 Logically Collective 48 49 Input Parameter: 50 + obj - any PETSc object, for example a Vec, Mat or KSP. This must be 51 cast with a (PetscObject), for example, 52 PetscObjectStateSet((PetscObject)mat,state); 53 - state - the object state 54 55 Notes: 56 This function should be used with extreme caution. There is 57 essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), 58 which increases the state, but does not alter the data, then this 59 routine can be used to reset the state. Such a reset must be collective. 60 61 Level: advanced 62 63 seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 64 65 Concepts: state 66 67 @*/ 68 PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state) 69 { 70 PetscFunctionBegin; 71 PetscValidHeader(obj,1); 72 obj->state = state; 73 PetscFunctionReturn(0); 74 } 75 76 PetscInt PetscObjectComposedDataMax = 10; 77 78 /*@C 79 PetscObjectComposedDataRegister - Get an available id for composed data 80 81 Not Collective 82 83 Output parameter: 84 . id - an identifier under which data can be stored 85 86 Level: developer 87 88 Notes: 89 You must keep this value (for example in a global variable) in order to attach the data to an object or 90 access in an object. 91 92 seealso: PetscObjectComposedDataSetInt() 93 94 @*/ 95 PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 96 { 97 static PetscInt globalcurrentstate = 0; 98 99 PetscFunctionBegin; 100 *id = globalcurrentstate++; 101 if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10; 102 PetscFunctionReturn(0); 103 } 104 105 PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 106 { 107 PetscInt *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i; 108 PetscObjectState *ir = obj->intcomposedstate,*new_ir; 109 PetscErrorCode ierr; 110 111 PetscFunctionBegin; 112 new_n = PetscObjectComposedDataMax; 113 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 114 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 115 if (n) { 116 for (i=0; i<n; i++) { 117 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 118 } 119 ierr = PetscFree(ar);CHKERRQ(ierr); 120 ierr = PetscFree(ir);CHKERRQ(ierr); 121 } 122 obj->int_idmax = new_n; 123 obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 124 PetscFunctionReturn(0); 125 } 126 127 PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 128 { 129 PetscInt **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i; 130 PetscObjectState *ir = obj->intstarcomposedstate,*new_ir; 131 PetscErrorCode ierr; 132 133 PetscFunctionBegin; 134 new_n = PetscObjectComposedDataMax; 135 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 136 ierr = PetscCalloc1(new_n,&new_ir);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->intstar_idmax = new_n; 145 obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 146 PetscFunctionReturn(0); 147 } 148 149 PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 150 { 151 PetscReal *ar = obj->realcomposeddata,*new_ar; 152 PetscObjectState *ir = obj->realcomposedstate,*new_ir; 153 PetscInt n = obj->real_idmax,new_n,i; 154 PetscErrorCode ierr; 155 156 PetscFunctionBegin; 157 new_n = PetscObjectComposedDataMax; 158 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 159 ierr = PetscCalloc1(new_n,&new_ir);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->real_idmax = new_n; 168 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 169 PetscFunctionReturn(0); 170 } 171 172 PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 173 { 174 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 175 PetscObjectState *ir = obj->realstarcomposedstate,*new_ir; 176 PetscInt n = obj->realstar_idmax,new_n,i; 177 PetscErrorCode ierr; 178 179 PetscFunctionBegin; 180 new_n = PetscObjectComposedDataMax; 181 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 182 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 183 if (n) { 184 for (i=0; i<n; i++) { 185 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 186 } 187 ierr = PetscFree(ar);CHKERRQ(ierr); 188 ierr = PetscFree(ir);CHKERRQ(ierr); 189 } 190 obj->realstar_idmax = new_n; 191 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 192 PetscFunctionReturn(0); 193 } 194 195 PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 196 { 197 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 198 PetscObjectState *ir = obj->scalarcomposedstate,*new_ir; 199 PetscInt n = obj->scalar_idmax,new_n,i; 200 PetscErrorCode ierr; 201 202 PetscFunctionBegin; 203 new_n = PetscObjectComposedDataMax; 204 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 205 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 206 if (n) { 207 for (i=0; i<n; i++) { 208 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 209 } 210 ierr = PetscFree(ar);CHKERRQ(ierr); 211 ierr = PetscFree(ir);CHKERRQ(ierr); 212 } 213 obj->scalar_idmax = new_n; 214 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 215 PetscFunctionReturn(0); 216 } 217 218 PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 219 { 220 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 221 PetscObjectState *ir = obj->scalarstarcomposedstate,*new_ir; 222 PetscInt n = obj->scalarstar_idmax,new_n,i; 223 PetscErrorCode ierr; 224 225 PetscFunctionBegin; 226 new_n = PetscObjectComposedDataMax; 227 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 228 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 229 if (n) { 230 for (i=0; i<n; i++) { 231 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 232 } 233 ierr = PetscFree(ar);CHKERRQ(ierr); 234 ierr = PetscFree(ir);CHKERRQ(ierr); 235 } 236 obj->scalarstar_idmax = new_n; 237 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 238 PetscFunctionReturn(0); 239 } 240 241 /*@ 242 PetscObjectGetId - get unique object ID 243 244 Not Collective 245 246 Input Arguments: 247 . obj - object 248 249 Output Arguments: 250 . id - integer ID 251 252 Level: developer 253 254 Notes: 255 The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 256 257 .seealso: PetscObjectStateGet() 258 @*/ 259 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 260 { 261 262 PetscFunctionBegin; 263 *id = obj->id; 264 PetscFunctionReturn(0); 265 } 266