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,PetscInt *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 Not 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. 62 63 Level: advanced 64 65 seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 66 67 Concepts: state 68 69 @*/ 70 PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscInt 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; 111 PetscInt *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i; 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(PetscInt),&new_ir);CHKERRQ(ierr); 119 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));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; 137 PetscInt *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i; 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(PetscInt),&new_ir);CHKERRQ(ierr); 145 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));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 PetscInt *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i; 164 PetscErrorCode ierr; 165 166 PetscFunctionBegin; 167 new_n = PetscObjectComposedDataMax; 168 ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr); 169 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr); 170 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 171 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 172 if (n) { 173 for (i=0; i<n; i++) { 174 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 175 } 176 ierr = PetscFree(ar);CHKERRQ(ierr); 177 ierr = PetscFree(ir);CHKERRQ(ierr); 178 } 179 obj->real_idmax = new_n; 180 obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 181 PetscFunctionReturn(0); 182 } 183 184 #undef __FUNCT__ 185 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar" 186 PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 187 { 188 PetscReal **ar = obj->realstarcomposeddata,**new_ar; 189 PetscInt *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i; 190 PetscErrorCode ierr; 191 192 PetscFunctionBegin; 193 new_n = PetscObjectComposedDataMax; 194 ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr); 195 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr); 196 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 197 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 198 if (n) { 199 for (i=0; i<n; i++) { 200 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 201 } 202 ierr = PetscFree(ar);CHKERRQ(ierr); 203 ierr = PetscFree(ir);CHKERRQ(ierr); 204 } 205 obj->realstar_idmax = new_n; 206 obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 207 PetscFunctionReturn(0); 208 } 209 210 #undef __FUNCT__ 211 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar" 212 PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 213 { 214 PetscScalar *ar = obj->scalarcomposeddata,*new_ar; 215 PetscInt *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i; 216 PetscErrorCode ierr; 217 218 PetscFunctionBegin; 219 new_n = PetscObjectComposedDataMax; 220 ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr); 221 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr); 222 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 223 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 224 if (n) { 225 for (i=0; i<n; i++) { 226 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 227 } 228 ierr = PetscFree(ar);CHKERRQ(ierr); 229 ierr = PetscFree(ir);CHKERRQ(ierr); 230 } 231 obj->scalar_idmax = new_n; 232 obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 233 PetscFunctionReturn(0); 234 } 235 236 #undef __FUNCT__ 237 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar" 238 PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 239 { 240 PetscScalar **ar = obj->scalarstarcomposeddata,**new_ar; 241 PetscInt *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i; 242 PetscErrorCode ierr; 243 244 PetscFunctionBegin; 245 new_n = PetscObjectComposedDataMax; 246 ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr); 247 ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr); 248 ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr); 249 ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr); 250 if (n) { 251 for (i=0; i<n; i++) { 252 new_ar[i] = ar[i]; new_ir[i] = ir[i]; 253 } 254 ierr = PetscFree(ar);CHKERRQ(ierr); 255 ierr = PetscFree(ir);CHKERRQ(ierr); 256 } 257 obj->scalarstar_idmax = new_n; 258 obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 259 PetscFunctionReturn(0); 260 } 261 262