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