xref: /petsc/src/sys/objects/state.c (revision 95452b02e12c0ee11232c7ff2b24b568a8e07e43)
17d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h>  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay /*@C
859e4f3c8SBarry Smith    PetscObjectStateGet - Gets the state of any PetscObject,
9e5c89e4eSSatish Balay    regardless of the type.
10e5c89e4eSSatish Balay 
11e5c89e4eSSatish Balay    Not Collective
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay    Input Parameter:
14e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
15e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
1659e4f3c8SBarry Smith          PetscObjectStateGet((PetscObject)mat,&state);
17e5c89e4eSSatish Balay 
18e5c89e4eSSatish Balay    Output Parameter:
19e5c89e4eSSatish Balay .  state - the object state
20e5c89e4eSSatish Balay 
21*95452b02SPatrick Sanan    Notes:
22*95452b02SPatrick Sanan     object state is an integer which gets increased every time
23e5c89e4eSSatish Balay    the object is changed. By saving and later querying the object state
24e5c89e4eSSatish Balay    one can determine whether information about the object is still current.
25e5c89e4eSSatish Balay    Currently, state is maintained for Vec and Mat objects.
26e5c89e4eSSatish Balay 
27e5c89e4eSSatish Balay    Level: advanced
28e5c89e4eSSatish Balay 
2959e4f3c8SBarry Smith    seealso: PetscObjectStateIncrease(), PetscObjectStateSet()
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay    Concepts: state
32e5c89e4eSSatish Balay 
33e5c89e4eSSatish Balay @*/
34270bf2e7SJed Brown PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state)
35e5c89e4eSSatish Balay {
36e5c89e4eSSatish Balay   PetscFunctionBegin;
373cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
383cfa8680SLisandro Dalcin   PetscValidIntPointer(state,2);
39e5c89e4eSSatish Balay   *state = obj->state;
40e5c89e4eSSatish Balay   PetscFunctionReturn(0);
41e5c89e4eSSatish Balay }
42e5c89e4eSSatish Balay 
43e5c89e4eSSatish Balay /*@C
4459e4f3c8SBarry Smith    PetscObjectStateSet - Sets the state of any PetscObject,
45e5c89e4eSSatish Balay    regardless of the type.
46e5c89e4eSSatish Balay 
47704cc5ceSJed Brown    Logically Collective
48e5c89e4eSSatish Balay 
49e5c89e4eSSatish Balay    Input Parameter:
50e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
51e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
5259e4f3c8SBarry Smith          PetscObjectStateSet((PetscObject)mat,state);
53e5c89e4eSSatish Balay -  state - the object state
54e5c89e4eSSatish Balay 
55*95452b02SPatrick Sanan    Notes:
56*95452b02SPatrick Sanan     This function should be used with extreme caution. There is
57e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
58e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
59704cc5ceSJed Brown    routine can be used to reset the state.  Such a reset must be collective.
60e5c89e4eSSatish Balay 
61e5c89e4eSSatish Balay    Level: advanced
62e5c89e4eSSatish Balay 
6359e4f3c8SBarry Smith    seealso: PetscObjectStateGet(),PetscObjectStateIncrease()
64e5c89e4eSSatish Balay 
65e5c89e4eSSatish Balay    Concepts: state
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay @*/
68270bf2e7SJed Brown PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state)
69e5c89e4eSSatish Balay {
70e5c89e4eSSatish Balay   PetscFunctionBegin;
713cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
72e5c89e4eSSatish Balay   obj->state = state;
73e5c89e4eSSatish Balay   PetscFunctionReturn(0);
74e5c89e4eSSatish Balay }
75e5c89e4eSSatish Balay 
768b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10;
7753c77d0aSJed Brown 
7862755792SVictor Eijkhout /*@C
791957e957SBarry Smith    PetscObjectComposedDataRegister - Get an available id for composed data
8062755792SVictor Eijkhout 
8162755792SVictor Eijkhout    Not Collective
8262755792SVictor Eijkhout 
8362755792SVictor Eijkhout    Output parameter:
8462755792SVictor Eijkhout .  id - an identifier under which data can be stored
8562755792SVictor Eijkhout 
8662755792SVictor Eijkhout    Level: developer
8762755792SVictor Eijkhout 
88*95452b02SPatrick Sanan    Notes:
89*95452b02SPatrick Sanan     You must keep this value (for example in a global variable) in order to attach the data to an object or
901957e957SBarry Smith           access in an object.
911957e957SBarry Smith 
92f65bdb8fSBarry Smith    seealso: PetscObjectComposedDataSetInt()
9362755792SVictor Eijkhout 
9462755792SVictor Eijkhout @*/
957087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
96e5c89e4eSSatish Balay {
97d44a1e48SBarry Smith   static PetscInt globalcurrentstate = 0;
98d44a1e48SBarry Smith 
99e5c89e4eSSatish Balay   PetscFunctionBegin;
100e5c89e4eSSatish Balay   *id = globalcurrentstate++;
1018b5db460SBarry Smith   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
102e5c89e4eSSatish Balay   PetscFunctionReturn(0);
103e5c89e4eSSatish Balay }
104e5c89e4eSSatish Balay 
1057087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
106e5c89e4eSSatish Balay {
107270bf2e7SJed Brown   PetscInt         *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i;
108270bf2e7SJed Brown   PetscObjectState *ir = obj->intcomposedstate,*new_ir;
109e5c89e4eSSatish Balay   PetscErrorCode   ierr;
110e5c89e4eSSatish Balay 
111e5c89e4eSSatish Balay   PetscFunctionBegin;
1128b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1131795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
1141795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
115e5c89e4eSSatish Balay   if (n) {
116e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
117e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
118e5c89e4eSSatish Balay     }
119e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
120e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
121e5c89e4eSSatish Balay   }
122e5c89e4eSSatish Balay   obj->int_idmax       = new_n;
123e5c89e4eSSatish Balay   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
124e5c89e4eSSatish Balay   PetscFunctionReturn(0);
125e5c89e4eSSatish Balay }
12653c77d0aSJed Brown 
1277087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
128e5c89e4eSSatish Balay {
129270bf2e7SJed Brown   PetscInt         **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i;
130270bf2e7SJed Brown   PetscObjectState *ir  = obj->intstarcomposedstate,*new_ir;
131e5c89e4eSSatish Balay   PetscErrorCode   ierr;
132e5c89e4eSSatish Balay 
133e5c89e4eSSatish Balay   PetscFunctionBegin;
1348b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1351795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
1361795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
137e5c89e4eSSatish Balay   if (n) {
138e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
139e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
140e5c89e4eSSatish Balay     }
141e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
142e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
143e5c89e4eSSatish Balay   }
144e5c89e4eSSatish Balay   obj->intstar_idmax       = new_n;
145e5c89e4eSSatish Balay   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
146e5c89e4eSSatish Balay   PetscFunctionReturn(0);
147e5c89e4eSSatish Balay }
148e5c89e4eSSatish Balay 
1497087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
150e5c89e4eSSatish Balay {
151e5c89e4eSSatish Balay   PetscReal        *ar = obj->realcomposeddata,*new_ar;
152270bf2e7SJed Brown   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
153270bf2e7SJed Brown   PetscInt         n   = obj->real_idmax,new_n,i;
154e5c89e4eSSatish Balay   PetscErrorCode   ierr;
155e5c89e4eSSatish Balay 
156e5c89e4eSSatish Balay   PetscFunctionBegin;
1578b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1581795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
1591795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
160e5c89e4eSSatish Balay   if (n) {
161e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
162e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
163e5c89e4eSSatish Balay     }
164e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
165e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
166e5c89e4eSSatish Balay   }
167e5c89e4eSSatish Balay   obj->real_idmax       = new_n;
168e5c89e4eSSatish Balay   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
169e5c89e4eSSatish Balay   PetscFunctionReturn(0);
170e5c89e4eSSatish Balay }
171e5c89e4eSSatish Balay 
1727087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
173e5c89e4eSSatish Balay {
174e5c89e4eSSatish Balay   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
175270bf2e7SJed Brown   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
176270bf2e7SJed Brown   PetscInt         n    = obj->realstar_idmax,new_n,i;
177e5c89e4eSSatish Balay   PetscErrorCode   ierr;
178e5c89e4eSSatish Balay 
179e5c89e4eSSatish Balay   PetscFunctionBegin;
1808b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1811795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
1821795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
183e5c89e4eSSatish Balay   if (n) {
184e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
185e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
186e5c89e4eSSatish Balay     }
187e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
188e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
189e5c89e4eSSatish Balay   }
190e5c89e4eSSatish Balay   obj->realstar_idmax       = new_n;
191e5c89e4eSSatish Balay   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
192e5c89e4eSSatish Balay   PetscFunctionReturn(0);
193e5c89e4eSSatish Balay }
194e5c89e4eSSatish Balay 
1957087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
196e5c89e4eSSatish Balay {
197e5c89e4eSSatish Balay   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
198270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
199270bf2e7SJed Brown   PetscInt         n   = obj->scalar_idmax,new_n,i;
200e5c89e4eSSatish Balay   PetscErrorCode   ierr;
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay   PetscFunctionBegin;
2038b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
2041795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
2051795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
206e5c89e4eSSatish Balay   if (n) {
207e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
208e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
209e5c89e4eSSatish Balay     }
210e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
211e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
212e5c89e4eSSatish Balay   }
213e5c89e4eSSatish Balay   obj->scalar_idmax       = new_n;
214e5c89e4eSSatish Balay   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
215e5c89e4eSSatish Balay   PetscFunctionReturn(0);
216e5c89e4eSSatish Balay }
217e5c89e4eSSatish Balay 
2187087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
219e5c89e4eSSatish Balay {
220e5c89e4eSSatish Balay   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
221270bf2e7SJed Brown   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
222270bf2e7SJed Brown   PetscInt         n    = obj->scalarstar_idmax,new_n,i;
223e5c89e4eSSatish Balay   PetscErrorCode   ierr;
224e5c89e4eSSatish Balay 
225e5c89e4eSSatish Balay   PetscFunctionBegin;
2268b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
2271795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
2281795a4d1SJed Brown   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
229e5c89e4eSSatish Balay   if (n) {
230e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
231e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
232e5c89e4eSSatish Balay     }
233e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
234e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
235e5c89e4eSSatish Balay   }
236e5c89e4eSSatish Balay   obj->scalarstar_idmax       = new_n;
237e5c89e4eSSatish Balay   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
238e5c89e4eSSatish Balay   PetscFunctionReturn(0);
239e5c89e4eSSatish Balay }
240e5c89e4eSSatish Balay 
241127c8a3bSJed Brown /*@
242127c8a3bSJed Brown    PetscObjectGetId - get unique object ID
243127c8a3bSJed Brown 
244127c8a3bSJed Brown    Not Collective
245127c8a3bSJed Brown 
246127c8a3bSJed Brown    Input Arguments:
247127c8a3bSJed Brown .  obj - object
248127c8a3bSJed Brown 
249127c8a3bSJed Brown    Output Arguments:
250127c8a3bSJed Brown .  id - integer ID
251127c8a3bSJed Brown 
252127c8a3bSJed Brown    Level: developer
253127c8a3bSJed Brown 
254127c8a3bSJed Brown    Notes:
255127c8a3bSJed Brown    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
256127c8a3bSJed Brown 
2578dcff661SJed Brown .seealso: PetscObjectStateGet()
258127c8a3bSJed Brown @*/
259127c8a3bSJed Brown PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
260127c8a3bSJed Brown {
261127c8a3bSJed Brown 
262127c8a3bSJed Brown   PetscFunctionBegin;
263127c8a3bSJed Brown   *id = obj->id;
264127c8a3bSJed Brown   PetscFunctionReturn(0);
265127c8a3bSJed Brown }
266