xref: /petsc/src/sys/objects/state.c (revision 87497f523770ea28bdc907071c6e8146b51bca00)
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 
2195452b02SPatrick Sanan    Notes:
2295452b02SPatrick 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 
29*87497f52SBarry Smith .seealso: `PetscObjectStateIncrease()`, `PetscObjectStateSet()`
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay @*/
32270bf2e7SJed Brown PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state)
33e5c89e4eSSatish Balay {
34e5c89e4eSSatish Balay   PetscFunctionBegin;
353cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
363cfa8680SLisandro Dalcin   PetscValidIntPointer(state,2);
37e5c89e4eSSatish Balay   *state = obj->state;
38e5c89e4eSSatish Balay   PetscFunctionReturn(0);
39e5c89e4eSSatish Balay }
40e5c89e4eSSatish Balay 
41e5c89e4eSSatish Balay /*@C
4259e4f3c8SBarry Smith    PetscObjectStateSet - Sets the state of any PetscObject,
43e5c89e4eSSatish Balay    regardless of the type.
44e5c89e4eSSatish Balay 
45704cc5ceSJed Brown    Logically Collective
46e5c89e4eSSatish Balay 
47d8d19677SJose E. Roman    Input Parameters:
48e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
49e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
5059e4f3c8SBarry Smith          PetscObjectStateSet((PetscObject)mat,state);
51e5c89e4eSSatish Balay -  state - the object state
52e5c89e4eSSatish Balay 
5395452b02SPatrick Sanan    Notes:
5495452b02SPatrick Sanan     This function should be used with extreme caution. There is
55e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
56e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
57704cc5ceSJed Brown    routine can be used to reset the state.  Such a reset must be collective.
58e5c89e4eSSatish Balay 
59e5c89e4eSSatish Balay    Level: advanced
60e5c89e4eSSatish Balay 
61*87497f52SBarry Smith .seealso: `PetscObjectStateGet()`, `PetscObjectStateIncrease()`
62e5c89e4eSSatish Balay 
63e5c89e4eSSatish Balay @*/
64270bf2e7SJed Brown PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state)
65e5c89e4eSSatish Balay {
66e5c89e4eSSatish Balay   PetscFunctionBegin;
673cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
68e5c89e4eSSatish Balay   obj->state = state;
69e5c89e4eSSatish Balay   PetscFunctionReturn(0);
70e5c89e4eSSatish Balay }
71e5c89e4eSSatish Balay 
728b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10;
7353c77d0aSJed Brown 
7462755792SVictor Eijkhout /*@C
751957e957SBarry Smith    PetscObjectComposedDataRegister - Get an available id for composed data
7662755792SVictor Eijkhout 
7762755792SVictor Eijkhout    Not Collective
7862755792SVictor Eijkhout 
7962755792SVictor Eijkhout    Output parameter:
8062755792SVictor Eijkhout .  id - an identifier under which data can be stored
8162755792SVictor Eijkhout 
8262755792SVictor Eijkhout    Level: developer
8362755792SVictor Eijkhout 
8495452b02SPatrick Sanan    Notes:
85*87497f52SBarry Smith    You must keep this value (for example in a global variable) in order to attach the data to an object or access in an object.
861957e957SBarry Smith 
87*87497f52SBarry Smith    `PetscObjectCompose()` and  `PetscObjectQuery()` provide a way to attach any data to an object
8862755792SVictor Eijkhout 
89*87497f52SBarry Smith .seealso: `PetscObjectComposedDataSetInt()`, `PetscObjectComposedDataSetReal()`, `PetscObjectComposedDataGetReal()`, `PetscObjectComposedDataSetIntstar()`,
90*87497f52SBarry Smith           `PetscObjectComposedDataSetIntstar()`, `PetscObjectComposedDataGetInt()`, `PetscObject`,
91*87497f52SBarry Smith           `PetscObjectCompose()`,  `PetscObjectQuery()`, `PetscObjectComposedDataSetRealstar()`, `PetscObjectComposedDataGetScalarstar()`,
92*87497f52SBarry Smith           `PetscObjectComposedDataSetScalarstar()`, `PetscObjectComposedDataSetScalarstar()`
9362755792SVictor Eijkhout @*/
947087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id)
95e5c89e4eSSatish Balay {
96d44a1e48SBarry Smith   static PetscInt globalcurrentstate = 0;
97d44a1e48SBarry Smith 
98e5c89e4eSSatish Balay   PetscFunctionBegin;
99e5c89e4eSSatish Balay   *id = globalcurrentstate++;
1008b5db460SBarry Smith   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
101e5c89e4eSSatish Balay   PetscFunctionReturn(0);
102e5c89e4eSSatish Balay }
103e5c89e4eSSatish Balay 
1047087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj)
105e5c89e4eSSatish Balay {
106071fcb05SBarry Smith   PetscInt         *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n;
107270bf2e7SJed Brown   PetscObjectState *ir = obj->intcomposedstate,*new_ir;
108e5c89e4eSSatish Balay 
109e5c89e4eSSatish Balay   PetscFunctionBegin;
1108b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1119566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n,&new_ar,new_n,&new_ir));
1129566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar,ar,n*sizeof(PetscInt)));
1139566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState)));
1149566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar,ir));
115e5c89e4eSSatish Balay   obj->int_idmax       = new_n;
116e5c89e4eSSatish Balay   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
117e5c89e4eSSatish Balay   PetscFunctionReturn(0);
118e5c89e4eSSatish Balay }
11953c77d0aSJed Brown 
1207087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
121e5c89e4eSSatish Balay {
122071fcb05SBarry Smith   PetscInt         **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n;
123270bf2e7SJed Brown   PetscObjectState *ir  = obj->intstarcomposedstate,*new_ir;
124e5c89e4eSSatish Balay 
125e5c89e4eSSatish Balay   PetscFunctionBegin;
1268b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1279566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n,&new_ar,new_n,&new_ir));
1289566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar,ar,n*sizeof(PetscInt*)));
1299566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState)));
1309566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar,ir));
131e5c89e4eSSatish Balay   obj->intstar_idmax        = new_n;
132071fcb05SBarry Smith   obj->intstarcomposeddata  = new_ar;
133071fcb05SBarry Smith   obj->intstarcomposedstate = new_ir;
134e5c89e4eSSatish Balay   PetscFunctionReturn(0);
135e5c89e4eSSatish Balay }
136e5c89e4eSSatish Balay 
1377087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj)
138e5c89e4eSSatish Balay {
139e5c89e4eSSatish Balay   PetscReal        *ar = obj->realcomposeddata,*new_ar;
140270bf2e7SJed Brown   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
141071fcb05SBarry Smith   PetscInt         n   = obj->real_idmax,new_n;
142e5c89e4eSSatish Balay 
143e5c89e4eSSatish Balay   PetscFunctionBegin;
1448b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1459566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n,&new_ar,new_n,&new_ir));
1469566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar,ar,n*sizeof(PetscReal)));
1479566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState)));
1489566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar,ir));
149e5c89e4eSSatish Balay   obj->real_idmax       = new_n;
150e5c89e4eSSatish Balay   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
151e5c89e4eSSatish Balay   PetscFunctionReturn(0);
152e5c89e4eSSatish Balay }
153e5c89e4eSSatish Balay 
1547087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
155e5c89e4eSSatish Balay {
156e5c89e4eSSatish Balay   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
157270bf2e7SJed Brown   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
158071fcb05SBarry Smith   PetscInt         n    = obj->realstar_idmax,new_n;
159e5c89e4eSSatish Balay 
160e5c89e4eSSatish Balay   PetscFunctionBegin;
1618b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1629566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n,&new_ar,new_n,&new_ir));
1639566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar,ar,n*sizeof(PetscReal*)));
1649566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState)));
1659566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar,ir));
166e5c89e4eSSatish Balay   obj->realstar_idmax       = new_n;
167e5c89e4eSSatish Balay   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
168e5c89e4eSSatish Balay   PetscFunctionReturn(0);
169e5c89e4eSSatish Balay }
170e5c89e4eSSatish Balay 
1717087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj)
172e5c89e4eSSatish Balay {
173e5c89e4eSSatish Balay   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
174270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
175071fcb05SBarry Smith   PetscInt         n   = obj->scalar_idmax,new_n;
176e5c89e4eSSatish Balay 
177e5c89e4eSSatish Balay   PetscFunctionBegin;
1788b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1799566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n,&new_ar,new_n,&new_ir));
1809566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar,ar,n*sizeof(PetscScalar)));
1819566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState)));
1829566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar,ir));
183e5c89e4eSSatish Balay   obj->scalar_idmax       = new_n;
184e5c89e4eSSatish Balay   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
185e5c89e4eSSatish Balay   PetscFunctionReturn(0);
186e5c89e4eSSatish Balay }
187e5c89e4eSSatish Balay 
1887087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
189e5c89e4eSSatish Balay {
190e5c89e4eSSatish Balay   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
191270bf2e7SJed Brown   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
192071fcb05SBarry Smith   PetscInt         n    = obj->scalarstar_idmax,new_n;
193e5c89e4eSSatish Balay 
194e5c89e4eSSatish Balay   PetscFunctionBegin;
1958b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1969566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n,&new_ar,new_n,&new_ir));
1979566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar,ar,n*sizeof(PetscScalar*)));
1989566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState)));
1999566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar,ir));
200e5c89e4eSSatish Balay   obj->scalarstar_idmax       = new_n;
201e5c89e4eSSatish Balay   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
202e5c89e4eSSatish Balay   PetscFunctionReturn(0);
203e5c89e4eSSatish Balay }
204e5c89e4eSSatish Balay 
205127c8a3bSJed Brown /*@
206127c8a3bSJed Brown    PetscObjectGetId - get unique object ID
207127c8a3bSJed Brown 
208127c8a3bSJed Brown    Not Collective
209127c8a3bSJed Brown 
2104165533cSJose E. Roman    Input Parameter:
211127c8a3bSJed Brown .  obj - object
212127c8a3bSJed Brown 
2134165533cSJose E. Roman    Output Parameter:
214127c8a3bSJed Brown .  id - integer ID
215127c8a3bSJed Brown 
216127c8a3bSJed Brown    Level: developer
217127c8a3bSJed Brown 
218127c8a3bSJed Brown    Notes:
219127c8a3bSJed Brown    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
220127c8a3bSJed Brown 
221db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectCompareId()`
222127c8a3bSJed Brown @*/
223127c8a3bSJed Brown PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
224127c8a3bSJed Brown {
225127c8a3bSJed Brown   PetscFunctionBegin;
226127c8a3bSJed Brown   *id = obj->id;
227127c8a3bSJed Brown   PetscFunctionReturn(0);
228127c8a3bSJed Brown }
229bdaf1daeSBarry Smith 
230bdaf1daeSBarry Smith /*@
231c94eee08SBarry Smith    PetscObjectCompareId - compares the objects ID with a given id
232bdaf1daeSBarry Smith 
233bdaf1daeSBarry Smith    Not Collective
234bdaf1daeSBarry Smith 
2354165533cSJose E. Roman    Input Parameters:
236bdaf1daeSBarry Smith +  obj - object
237bdaf1daeSBarry Smith -  id - integer ID
238bdaf1daeSBarry Smith 
2394165533cSJose E. Roman    Output Parameter;
240bdaf1daeSBarry Smith .  eq - the ids are equal
241bdaf1daeSBarry Smith 
242bdaf1daeSBarry Smith    Level: developer
243bdaf1daeSBarry Smith 
244bdaf1daeSBarry Smith    Notes:
245bdaf1daeSBarry Smith    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
246bdaf1daeSBarry Smith 
247db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectGetId()`
248bdaf1daeSBarry Smith @*/
249bdaf1daeSBarry Smith PetscErrorCode PetscObjectCompareId(PetscObject obj,PetscObjectId id,PetscBool *eq)
250bdaf1daeSBarry Smith {
251bdaf1daeSBarry Smith   PetscFunctionBegin;
252bdaf1daeSBarry Smith   *eq = (id == obj->id) ? PETSC_TRUE : PETSC_FALSE;
253bdaf1daeSBarry Smith   PetscFunctionReturn(0);
254bdaf1daeSBarry Smith }
255