xref: /petsc/src/sys/objects/state.c (revision 704cc5ceb55831eb8d096063db1afc225d5b41c2)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5afcb2eb5SJed Brown #include <petsc-private/petscimpl.h>  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay #undef __FUNCT__
859e4f3c8SBarry Smith #define __FUNCT__ "PetscObjectStateGet"
9e5c89e4eSSatish Balay /*@C
1059e4f3c8SBarry Smith    PetscObjectStateGet - Gets the state of any PetscObject,
11e5c89e4eSSatish Balay    regardless of the type.
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay    Not Collective
14e5c89e4eSSatish Balay 
15e5c89e4eSSatish Balay    Input Parameter:
16e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
17e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
1859e4f3c8SBarry Smith          PetscObjectStateGet((PetscObject)mat,&state);
19e5c89e4eSSatish Balay 
20e5c89e4eSSatish Balay    Output Parameter:
21e5c89e4eSSatish Balay .  state - the object state
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Notes: object state is an integer which gets increased every time
24e5c89e4eSSatish Balay    the object is changed. By saving and later querying the object state
25e5c89e4eSSatish Balay    one can determine whether information about the object is still current.
26e5c89e4eSSatish Balay    Currently, state is maintained for Vec and Mat objects.
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay    Level: advanced
29e5c89e4eSSatish Balay 
3059e4f3c8SBarry Smith    seealso: PetscObjectStateIncrease(), PetscObjectStateSet()
31e5c89e4eSSatish Balay 
32e5c89e4eSSatish Balay    Concepts: state
33e5c89e4eSSatish Balay 
34e5c89e4eSSatish Balay @*/
35270bf2e7SJed Brown PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state)
36e5c89e4eSSatish Balay {
37e5c89e4eSSatish Balay   PetscFunctionBegin;
383cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
393cfa8680SLisandro Dalcin   PetscValidIntPointer(state,2);
40e5c89e4eSSatish Balay   *state = obj->state;
41e5c89e4eSSatish Balay   PetscFunctionReturn(0);
42e5c89e4eSSatish Balay }
43e5c89e4eSSatish Balay 
44e5c89e4eSSatish Balay #undef __FUNCT__
4559e4f3c8SBarry Smith #define __FUNCT__ "PetscObjectStateSet"
46e5c89e4eSSatish Balay /*@C
4759e4f3c8SBarry Smith    PetscObjectStateSet - Sets the state of any PetscObject,
48e5c89e4eSSatish Balay    regardless of the type.
49e5c89e4eSSatish Balay 
50*704cc5ceSJed Brown    Logically Collective
51e5c89e4eSSatish Balay 
52e5c89e4eSSatish Balay    Input Parameter:
53e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
54e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
5559e4f3c8SBarry Smith          PetscObjectStateSet((PetscObject)mat,state);
56e5c89e4eSSatish Balay -  state - the object state
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay    Notes: This function should be used with extreme caution. There is
59e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
60e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
61*704cc5ceSJed Brown    routine can be used to reset the state.  Such a reset must be collective.
62e5c89e4eSSatish Balay 
63e5c89e4eSSatish Balay    Level: advanced
64e5c89e4eSSatish Balay 
6559e4f3c8SBarry Smith    seealso: PetscObjectStateGet(),PetscObjectStateIncrease()
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay    Concepts: state
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay @*/
70270bf2e7SJed Brown PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state)
71e5c89e4eSSatish Balay {
72e5c89e4eSSatish Balay   PetscFunctionBegin;
733cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
74e5c89e4eSSatish Balay   obj->state = state;
75e5c89e4eSSatish Balay   PetscFunctionReturn(0);
76e5c89e4eSSatish Balay }
77e5c89e4eSSatish Balay 
788b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10;
7953c77d0aSJed Brown 
8053c77d0aSJed Brown #undef __FUNCT__
8153c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataRegister"
8262755792SVictor Eijkhout /*@C
8362755792SVictor Eijkhout    PetscObjectComposedDataRegister - Get an available id for
8462755792SVictor Eijkhout    composed data
8562755792SVictor Eijkhout 
8662755792SVictor Eijkhout    Not Collective
8762755792SVictor Eijkhout 
8862755792SVictor Eijkhout    Output parameter:
8962755792SVictor Eijkhout .  id - an identifier under which data can be stored
9062755792SVictor Eijkhout 
9162755792SVictor Eijkhout    Level: developer
9262755792SVictor Eijkhout 
93f65bdb8fSBarry Smith    seealso: PetscObjectComposedDataSetInt()
9462755792SVictor Eijkhout 
9562755792SVictor Eijkhout @*/
967087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
97e5c89e4eSSatish Balay {
98d44a1e48SBarry Smith   static PetscInt globalcurrentstate = 0;
99d44a1e48SBarry Smith 
100e5c89e4eSSatish Balay   PetscFunctionBegin;
101e5c89e4eSSatish Balay   *id = globalcurrentstate++;
1028b5db460SBarry Smith   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
103e5c89e4eSSatish Balay   PetscFunctionReturn(0);
104e5c89e4eSSatish Balay }
105e5c89e4eSSatish Balay 
10653c77d0aSJed Brown #undef __FUNCT__
10753c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseInt"
1087087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
109e5c89e4eSSatish Balay {
110270bf2e7SJed Brown   PetscInt         *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i;
111270bf2e7SJed Brown   PetscObjectState *ir = obj->intcomposedstate,*new_ir;
112e5c89e4eSSatish Balay   PetscErrorCode   ierr;
113e5c89e4eSSatish Balay 
114e5c89e4eSSatish Balay   PetscFunctionBegin;
1158b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
116e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
117e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
118e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
119e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
120e5c89e4eSSatish Balay   if (n) {
121e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
122e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
123e5c89e4eSSatish Balay     }
124e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
125e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
126e5c89e4eSSatish Balay   }
127e5c89e4eSSatish Balay   obj->int_idmax       = new_n;
128e5c89e4eSSatish Balay   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
129e5c89e4eSSatish Balay   PetscFunctionReturn(0);
130e5c89e4eSSatish Balay }
13153c77d0aSJed Brown 
13253c77d0aSJed Brown #undef __FUNCT__
13353c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar"
1347087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
135e5c89e4eSSatish Balay {
136270bf2e7SJed Brown   PetscInt         **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i;
137270bf2e7SJed Brown   PetscObjectState *ir  = obj->intstarcomposedstate,*new_ir;
138e5c89e4eSSatish Balay   PetscErrorCode   ierr;
139e5c89e4eSSatish Balay 
140e5c89e4eSSatish Balay   PetscFunctionBegin;
1418b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
142e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
143e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
144e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
145e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
146e5c89e4eSSatish Balay   if (n) {
147e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
148e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
149e5c89e4eSSatish Balay     }
150e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
151e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
152e5c89e4eSSatish Balay   }
153e5c89e4eSSatish Balay   obj->intstar_idmax       = new_n;
154e5c89e4eSSatish Balay   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
155e5c89e4eSSatish Balay   PetscFunctionReturn(0);
156e5c89e4eSSatish Balay }
157e5c89e4eSSatish Balay 
15853c77d0aSJed Brown #undef __FUNCT__
15953c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
1607087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
161e5c89e4eSSatish Balay {
162e5c89e4eSSatish Balay   PetscReal        *ar = obj->realcomposeddata,*new_ar;
163270bf2e7SJed Brown   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
164270bf2e7SJed Brown   PetscInt         n   = obj->real_idmax,new_n,i;
165e5c89e4eSSatish Balay   PetscErrorCode   ierr;
166e5c89e4eSSatish Balay 
167e5c89e4eSSatish Balay   PetscFunctionBegin;
1688b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
169e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
170e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
171e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
172e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
173e5c89e4eSSatish Balay   if (n) {
174e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
175e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
176e5c89e4eSSatish Balay     }
177e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
178e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
179e5c89e4eSSatish Balay   }
180e5c89e4eSSatish Balay   obj->real_idmax       = new_n;
181e5c89e4eSSatish Balay   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
182e5c89e4eSSatish Balay   PetscFunctionReturn(0);
183e5c89e4eSSatish Balay }
184e5c89e4eSSatish Balay 
18553c77d0aSJed Brown #undef __FUNCT__
18653c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
1877087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
188e5c89e4eSSatish Balay {
189e5c89e4eSSatish Balay   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
190270bf2e7SJed Brown   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
191270bf2e7SJed Brown   PetscInt         n    = obj->realstar_idmax,new_n,i;
192e5c89e4eSSatish Balay   PetscErrorCode   ierr;
193e5c89e4eSSatish Balay 
194e5c89e4eSSatish Balay   PetscFunctionBegin;
1958b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
196e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
197e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
198e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
199e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
200e5c89e4eSSatish Balay   if (n) {
201e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
202e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
203e5c89e4eSSatish Balay     }
204e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
205e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
206e5c89e4eSSatish Balay   }
207e5c89e4eSSatish Balay   obj->realstar_idmax       = new_n;
208e5c89e4eSSatish Balay   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
209e5c89e4eSSatish Balay   PetscFunctionReturn(0);
210e5c89e4eSSatish Balay }
211e5c89e4eSSatish Balay 
21253c77d0aSJed Brown #undef __FUNCT__
21353c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
2147087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
215e5c89e4eSSatish Balay {
216e5c89e4eSSatish Balay   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
217270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
218270bf2e7SJed Brown   PetscInt         n   = obj->scalar_idmax,new_n,i;
219e5c89e4eSSatish Balay   PetscErrorCode   ierr;
220e5c89e4eSSatish Balay 
221e5c89e4eSSatish Balay   PetscFunctionBegin;
2228b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
223e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
224e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
225e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
226e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
227e5c89e4eSSatish Balay   if (n) {
228e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
229e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
230e5c89e4eSSatish Balay     }
231e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
232e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
233e5c89e4eSSatish Balay   }
234e5c89e4eSSatish Balay   obj->scalar_idmax       = new_n;
235e5c89e4eSSatish Balay   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
236e5c89e4eSSatish Balay   PetscFunctionReturn(0);
237e5c89e4eSSatish Balay }
238e5c89e4eSSatish Balay 
23953c77d0aSJed Brown #undef __FUNCT__
24053c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
2417087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
242e5c89e4eSSatish Balay {
243e5c89e4eSSatish Balay   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
244270bf2e7SJed Brown   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
245270bf2e7SJed Brown   PetscInt         n    = obj->scalarstar_idmax,new_n,i;
246e5c89e4eSSatish Balay   PetscErrorCode   ierr;
247e5c89e4eSSatish Balay 
248e5c89e4eSSatish Balay   PetscFunctionBegin;
2498b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
250e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
251e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
252e5c89e4eSSatish Balay   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
253e5c89e4eSSatish Balay   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
254e5c89e4eSSatish Balay   if (n) {
255e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
256e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
257e5c89e4eSSatish Balay     }
258e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
259e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
260e5c89e4eSSatish Balay   }
261e5c89e4eSSatish Balay   obj->scalarstar_idmax       = new_n;
262e5c89e4eSSatish Balay   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
263e5c89e4eSSatish Balay   PetscFunctionReturn(0);
264e5c89e4eSSatish Balay }
265e5c89e4eSSatish Balay 
266127c8a3bSJed Brown #undef __FUNCT__
267127c8a3bSJed Brown #define __FUNCT__ "PetscObjectGetId"
268127c8a3bSJed Brown /*@
269127c8a3bSJed Brown    PetscObjectGetId - get unique object ID
270127c8a3bSJed Brown 
271127c8a3bSJed Brown    Not Collective
272127c8a3bSJed Brown 
273127c8a3bSJed Brown    Input Arguments:
274127c8a3bSJed Brown .  obj - object
275127c8a3bSJed Brown 
276127c8a3bSJed Brown    Output Arguments:
277127c8a3bSJed Brown .  id - integer ID
278127c8a3bSJed Brown 
279127c8a3bSJed Brown    Level: developer
280127c8a3bSJed Brown 
281127c8a3bSJed Brown    Notes:
282127c8a3bSJed Brown    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
283127c8a3bSJed Brown 
284127c8a3bSJed Brown .seealso: PetscObjectStateQuery()
285127c8a3bSJed Brown @*/
286127c8a3bSJed Brown PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
287127c8a3bSJed Brown {
288127c8a3bSJed Brown 
289127c8a3bSJed Brown   PetscFunctionBegin;
290127c8a3bSJed Brown   *id = obj->id;
291127c8a3bSJed Brown   PetscFunctionReturn(0);
292127c8a3bSJed Brown }
293