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 composed data 84 85 Not Collective 86 87 Output parameter: 88 . id - an identifier under which data can be stored 89 90 Level: developer 91 92 Notes: You must keep this value (for example in a global variable) in order to attach the data to an object or 93 access in an object. 94 95 seealso: PetscObjectComposedDataSetInt() 96 97 @*/ 98 PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 99 { 100 static PetscInt globalcurrentstate = 0; 101 102 PetscFunctionBegin; 103 *id = globalcurrentstate++; 104 if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10; 105 PetscFunctionReturn(0); 106 } 107 108 #undef __FUNCT__ 109 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt" 110 PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 111 { 112 PetscInt *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i; 113 PetscObjectState *ir = obj->intcomposedstate,*new_ir; 114 PetscErrorCode ierr; 115 116 PetscFunctionBegin; 117 new_n = PetscObjectComposedDataMax; 118 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 119 ierr = PetscCalloc1(new_n,&new_ir);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 = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 143 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 144 if (n) { 145 for (i=0; i<n; i++) { 146 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 147 } 148 ierr = PetscFree(ar);CHKERRQ(ierr); 149 ierr = PetscFree(ir);CHKERRQ(ierr); 150 } 151 obj->intstar_idmax = new_n; 152 obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir; 153 PetscFunctionReturn(0); 154 } 155 156 #undef __FUNCT__ 157 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal" 158 PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 159 { 160 PetscReal *ar = obj->realcomposeddata,*new_ar; 161 PetscObjectState *ir = obj->realcomposedstate,*new_ir; 162 PetscInt n = obj->real_idmax,new_n,i; 163 PetscErrorCode ierr; 164 165 PetscFunctionBegin; 166 new_n = PetscObjectComposedDataMax; 167 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 168 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 169 if (n) { 170 for (i=0; i<n; i++) { 171 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 172 } 173 ierr = PetscFree(ar);CHKERRQ(ierr); 174 ierr = PetscFree(ir);CHKERRQ(ierr); 175 } 176 obj->real_idmax = new_n; 177 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 178 PetscFunctionReturn(0); 179 } 180 181 #undef __FUNCT__ 182 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 183 PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 184 { 185 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 186 PetscObjectState *ir = obj->realstarcomposedstate,*new_ir; 187 PetscInt n = obj->realstar_idmax,new_n,i; 188 PetscErrorCode ierr; 189 190 PetscFunctionBegin; 191 new_n = PetscObjectComposedDataMax; 192 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 193 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 194 if (n) { 195 for (i=0; i<n; i++) { 196 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 197 } 198 ierr = PetscFree(ar);CHKERRQ(ierr); 199 ierr = PetscFree(ir);CHKERRQ(ierr); 200 } 201 obj->realstar_idmax = new_n; 202 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 203 PetscFunctionReturn(0); 204 } 205 206 #undef __FUNCT__ 207 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 208 PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 209 { 210 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 211 PetscObjectState *ir = obj->scalarcomposedstate,*new_ir; 212 PetscInt n = obj->scalar_idmax,new_n,i; 213 PetscErrorCode ierr; 214 215 PetscFunctionBegin; 216 new_n = PetscObjectComposedDataMax; 217 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 218 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 219 if (n) { 220 for (i=0; i<n; i++) { 221 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 222 } 223 ierr = PetscFree(ar);CHKERRQ(ierr); 224 ierr = PetscFree(ir);CHKERRQ(ierr); 225 } 226 obj->scalar_idmax = new_n; 227 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 228 PetscFunctionReturn(0); 229 } 230 231 #undef __FUNCT__ 232 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 233 PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 234 { 235 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 236 PetscObjectState *ir = obj->scalarstarcomposedstate,*new_ir; 237 PetscInt n = obj->scalarstar_idmax,new_n,i; 238 PetscErrorCode ierr; 239 240 PetscFunctionBegin; 241 new_n = PetscObjectComposedDataMax; 242 ierr = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr); 243 ierr = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr); 244 if (n) { 245 for (i=0; i<n; i++) { 246 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 247 } 248 ierr = PetscFree(ar);CHKERRQ(ierr); 249 ierr = PetscFree(ir);CHKERRQ(ierr); 250 } 251 obj->scalarstar_idmax = new_n; 252 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 253 PetscFunctionReturn(0); 254 } 255 256 #undef __FUNCT__ 257 #define __FUNCT__ "PetscObjectGetId" 258 /*@ 259 PetscObjectGetId - get unique object ID 260 261 Not Collective 262 263 Input Arguments: 264 . obj - object 265 266 Output Arguments: 267 . id - integer ID 268 269 Level: developer 270 271 Notes: 272 The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 273 274 .seealso: PetscObjectStateGet() 275 @*/ 276 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 277 { 278 279 PetscFunctionBegin; 280 *id = obj->id; 281 PetscFunctionReturn(0); 282 } 283