Actual source code: state.c

petsc-3.7.5 2017-01-01
Report Typos and Errors
  2: /*
  3:      Provides utility routines for manulating any type of PETSc object.
  4: */
  5: #include <petsc/private/petscimpl.h>  /*I   "petscsys.h"    I*/

  9: /*@C
 10:    PetscObjectStateGet - Gets the state of any PetscObject,
 11:    regardless of the type.

 13:    Not Collective

 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);

 20:    Output Parameter:
 21: .  state - the object state

 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.

 28:    Level: advanced

 30:    seealso: PetscObjectStateIncrease(), PetscObjectStateSet()

 32:    Concepts: state

 34: @*/
 35: PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state)
 36: {
 40:   *state = obj->state;
 41:   return(0);
 42: }

 46: /*@C
 47:    PetscObjectStateSet - Sets the state of any PetscObject,
 48:    regardless of the type.

 50:    Logically Collective

 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

 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.

 63:    Level: advanced

 65:    seealso: PetscObjectStateGet(),PetscObjectStateIncrease()

 67:    Concepts: state

 69: @*/
 70: PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state)
 71: {
 74:   obj->state = state;
 75:   return(0);
 76: }

 78: PetscInt PetscObjectComposedDataMax = 10;

 82: /*@C
 83:    PetscObjectComposedDataRegister - Get an available id for composed data

 85:    Not Collective

 87:    Output parameter:
 88: .  id - an identifier under which data can be stored

 90:    Level: developer

 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.

 95:    seealso: PetscObjectComposedDataSetInt()

 97: @*/
 98: PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
 99: {
100:   static PetscInt globalcurrentstate = 0;

103:   *id = globalcurrentstate++;
104:   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
105:   return(0);
106: }

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;

117:   new_n = PetscObjectComposedDataMax;
118:   PetscCalloc1(new_n,&new_ar);
119:   PetscCalloc1(new_n,&new_ir);
120:   if (n) {
121:     for (i=0; i<n; i++) {
122:       new_ar[i] = ar[i]; new_ir[i] = ir[i];
123:     }
124:     PetscFree(ar);
125:     PetscFree(ir);
126:   }
127:   obj->int_idmax       = new_n;
128:   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
129:   return(0);
130: }

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;

141:   new_n = PetscObjectComposedDataMax;
142:   PetscCalloc1(new_n,&new_ar);
143:   PetscCalloc1(new_n,&new_ir);
144:   if (n) {
145:     for (i=0; i<n; i++) {
146:       new_ar[i] = ar[i]; new_ir[i] = ir[i];
147:     }
148:     PetscFree(ar);
149:     PetscFree(ir);
150:   }
151:   obj->intstar_idmax       = new_n;
152:   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
153:   return(0);
154: }

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;

166:   new_n = PetscObjectComposedDataMax;
167:   PetscCalloc1(new_n,&new_ar);
168:   PetscCalloc1(new_n,&new_ir);
169:   if (n) {
170:     for (i=0; i<n; i++) {
171:       new_ar[i] = ar[i]; new_ir[i] = ir[i];
172:     }
173:     PetscFree(ar);
174:     PetscFree(ir);
175:   }
176:   obj->real_idmax       = new_n;
177:   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
178:   return(0);
179: }

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;

191:   new_n = PetscObjectComposedDataMax;
192:   PetscCalloc1(new_n,&new_ar);
193:   PetscCalloc1(new_n,&new_ir);
194:   if (n) {
195:     for (i=0; i<n; i++) {
196:       new_ar[i] = ar[i]; new_ir[i] = ir[i];
197:     }
198:     PetscFree(ar);
199:     PetscFree(ir);
200:   }
201:   obj->realstar_idmax       = new_n;
202:   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
203:   return(0);
204: }

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;

216:   new_n = PetscObjectComposedDataMax;
217:   PetscCalloc1(new_n,&new_ar);
218:   PetscCalloc1(new_n,&new_ir);
219:   if (n) {
220:     for (i=0; i<n; i++) {
221:       new_ar[i] = ar[i]; new_ir[i] = ir[i];
222:     }
223:     PetscFree(ar);
224:     PetscFree(ir);
225:   }
226:   obj->scalar_idmax       = new_n;
227:   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
228:   return(0);
229: }

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;

241:   new_n = PetscObjectComposedDataMax;
242:   PetscCalloc1(new_n,&new_ar);
243:   PetscCalloc1(new_n,&new_ir);
244:   if (n) {
245:     for (i=0; i<n; i++) {
246:       new_ar[i] = ar[i]; new_ir[i] = ir[i];
247:     }
248:     PetscFree(ar);
249:     PetscFree(ir);
250:   }
251:   obj->scalarstar_idmax       = new_n;
252:   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
253:   return(0);
254: }

258: /*@
259:    PetscObjectGetId - get unique object ID

261:    Not Collective

263:    Input Arguments:
264: .  obj - object

266:    Output Arguments:
267: .  id - integer ID

269:    Level: developer

271:    Notes:
272:    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.

274: .seealso: PetscObjectStateGet()
275: @*/
276: PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
277: {

280:   *id = obj->id;
281:   return(0);
282: }