xref: /petsc/src/sys/objects/state.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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 
2987497f52SBarry Smith .seealso: `PetscObjectStateIncrease()`, `PetscObjectStateSet()`
30e5c89e4eSSatish Balay 
31e5c89e4eSSatish Balay @*/
32*9371c9d4SSatish Balay PetscErrorCode PetscObjectStateGet(PetscObject obj, PetscObjectState *state) {
33e5c89e4eSSatish Balay   PetscFunctionBegin;
343cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
353cfa8680SLisandro Dalcin   PetscValidIntPointer(state, 2);
36e5c89e4eSSatish Balay   *state = obj->state;
37e5c89e4eSSatish Balay   PetscFunctionReturn(0);
38e5c89e4eSSatish Balay }
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay /*@C
4159e4f3c8SBarry Smith    PetscObjectStateSet - Sets the state of any PetscObject,
42e5c89e4eSSatish Balay    regardless of the type.
43e5c89e4eSSatish Balay 
44704cc5ceSJed Brown    Logically Collective
45e5c89e4eSSatish Balay 
46d8d19677SJose E. Roman    Input Parameters:
47e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
48e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
4959e4f3c8SBarry Smith          PetscObjectStateSet((PetscObject)mat,state);
50e5c89e4eSSatish Balay -  state - the object state
51e5c89e4eSSatish Balay 
5295452b02SPatrick Sanan    Notes:
5395452b02SPatrick Sanan     This function should be used with extreme caution. There is
54e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
55e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
56704cc5ceSJed Brown    routine can be used to reset the state.  Such a reset must be collective.
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay    Level: advanced
59e5c89e4eSSatish Balay 
6087497f52SBarry Smith .seealso: `PetscObjectStateGet()`, `PetscObjectStateIncrease()`
61e5c89e4eSSatish Balay 
62e5c89e4eSSatish Balay @*/
63*9371c9d4SSatish Balay PetscErrorCode PetscObjectStateSet(PetscObject obj, PetscObjectState state) {
64e5c89e4eSSatish Balay   PetscFunctionBegin;
653cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
66e5c89e4eSSatish Balay   obj->state = state;
67e5c89e4eSSatish Balay   PetscFunctionReturn(0);
68e5c89e4eSSatish Balay }
69e5c89e4eSSatish Balay 
708b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10;
7153c77d0aSJed Brown 
7262755792SVictor Eijkhout /*@C
731957e957SBarry Smith    PetscObjectComposedDataRegister - Get an available id for composed data
7462755792SVictor Eijkhout 
7562755792SVictor Eijkhout    Not Collective
7662755792SVictor Eijkhout 
7762755792SVictor Eijkhout    Output parameter:
7862755792SVictor Eijkhout .  id - an identifier under which data can be stored
7962755792SVictor Eijkhout 
8062755792SVictor Eijkhout    Level: developer
8162755792SVictor Eijkhout 
8295452b02SPatrick Sanan    Notes:
8387497f52SBarry 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.
841957e957SBarry Smith 
8587497f52SBarry Smith    `PetscObjectCompose()` and  `PetscObjectQuery()` provide a way to attach any data to an object
8662755792SVictor Eijkhout 
8787497f52SBarry Smith .seealso: `PetscObjectComposedDataSetInt()`, `PetscObjectComposedDataSetReal()`, `PetscObjectComposedDataGetReal()`, `PetscObjectComposedDataSetIntstar()`,
8887497f52SBarry Smith           `PetscObjectComposedDataSetIntstar()`, `PetscObjectComposedDataGetInt()`, `PetscObject`,
8987497f52SBarry Smith           `PetscObjectCompose()`,  `PetscObjectQuery()`, `PetscObjectComposedDataSetRealstar()`, `PetscObjectComposedDataGetScalarstar()`,
9087497f52SBarry Smith           `PetscObjectComposedDataSetScalarstar()`, `PetscObjectComposedDataSetScalarstar()`
9162755792SVictor Eijkhout @*/
92*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) {
93d44a1e48SBarry Smith   static PetscInt globalcurrentstate = 0;
94d44a1e48SBarry Smith 
95e5c89e4eSSatish Balay   PetscFunctionBegin;
96e5c89e4eSSatish Balay   *id = globalcurrentstate++;
978b5db460SBarry Smith   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
98e5c89e4eSSatish Balay   PetscFunctionReturn(0);
99e5c89e4eSSatish Balay }
100e5c89e4eSSatish Balay 
101*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) {
102071fcb05SBarry Smith   PetscInt         *ar = obj->intcomposeddata, *new_ar, n = obj->int_idmax, new_n;
103270bf2e7SJed Brown   PetscObjectState *ir = obj->intcomposedstate, *new_ir;
104e5c89e4eSSatish Balay 
105e5c89e4eSSatish Balay   PetscFunctionBegin;
1068b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1079566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1089566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscInt)));
1099566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1109566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
111e5c89e4eSSatish Balay   obj->int_idmax        = new_n;
112*9371c9d4SSatish Balay   obj->intcomposeddata  = new_ar;
113*9371c9d4SSatish Balay   obj->intcomposedstate = new_ir;
114e5c89e4eSSatish Balay   PetscFunctionReturn(0);
115e5c89e4eSSatish Balay }
11653c77d0aSJed Brown 
117*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) {
118071fcb05SBarry Smith   PetscInt        **ar = obj->intstarcomposeddata, **new_ar, n = obj->intstar_idmax, new_n;
119270bf2e7SJed Brown   PetscObjectState *ir = obj->intstarcomposedstate, *new_ir;
120e5c89e4eSSatish Balay 
121e5c89e4eSSatish Balay   PetscFunctionBegin;
1228b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1239566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1249566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscInt *)));
1259566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1269566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
127e5c89e4eSSatish Balay   obj->intstar_idmax        = new_n;
128071fcb05SBarry Smith   obj->intstarcomposeddata  = new_ar;
129071fcb05SBarry Smith   obj->intstarcomposedstate = new_ir;
130e5c89e4eSSatish Balay   PetscFunctionReturn(0);
131e5c89e4eSSatish Balay }
132e5c89e4eSSatish Balay 
133*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) {
134e5c89e4eSSatish Balay   PetscReal        *ar = obj->realcomposeddata, *new_ar;
135270bf2e7SJed Brown   PetscObjectState *ir = obj->realcomposedstate, *new_ir;
136071fcb05SBarry Smith   PetscInt          n  = obj->real_idmax, new_n;
137e5c89e4eSSatish Balay 
138e5c89e4eSSatish Balay   PetscFunctionBegin;
1398b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1409566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1419566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscReal)));
1429566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1439566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
144e5c89e4eSSatish Balay   obj->real_idmax        = new_n;
145*9371c9d4SSatish Balay   obj->realcomposeddata  = new_ar;
146*9371c9d4SSatish Balay   obj->realcomposedstate = new_ir;
147e5c89e4eSSatish Balay   PetscFunctionReturn(0);
148e5c89e4eSSatish Balay }
149e5c89e4eSSatish Balay 
150*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) {
151e5c89e4eSSatish Balay   PetscReal       **ar = obj->realstarcomposeddata, **new_ar;
152270bf2e7SJed Brown   PetscObjectState *ir = obj->realstarcomposedstate, *new_ir;
153071fcb05SBarry Smith   PetscInt          n  = obj->realstar_idmax, new_n;
154e5c89e4eSSatish Balay 
155e5c89e4eSSatish Balay   PetscFunctionBegin;
1568b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1579566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1589566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscReal *)));
1599566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1609566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
161e5c89e4eSSatish Balay   obj->realstar_idmax        = new_n;
162*9371c9d4SSatish Balay   obj->realstarcomposeddata  = new_ar;
163*9371c9d4SSatish Balay   obj->realstarcomposedstate = new_ir;
164e5c89e4eSSatish Balay   PetscFunctionReturn(0);
165e5c89e4eSSatish Balay }
166e5c89e4eSSatish Balay 
167*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) {
168e5c89e4eSSatish Balay   PetscScalar      *ar = obj->scalarcomposeddata, *new_ar;
169270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarcomposedstate, *new_ir;
170071fcb05SBarry Smith   PetscInt          n  = obj->scalar_idmax, new_n;
171e5c89e4eSSatish Balay 
172e5c89e4eSSatish Balay   PetscFunctionBegin;
1738b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1749566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1759566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar)));
1769566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1779566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
178e5c89e4eSSatish Balay   obj->scalar_idmax        = new_n;
179*9371c9d4SSatish Balay   obj->scalarcomposeddata  = new_ar;
180*9371c9d4SSatish Balay   obj->scalarcomposedstate = new_ir;
181e5c89e4eSSatish Balay   PetscFunctionReturn(0);
182e5c89e4eSSatish Balay }
183e5c89e4eSSatish Balay 
184*9371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) {
185e5c89e4eSSatish Balay   PetscScalar     **ar = obj->scalarstarcomposeddata, **new_ar;
186270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarstarcomposedstate, *new_ir;
187071fcb05SBarry Smith   PetscInt          n  = obj->scalarstar_idmax, new_n;
188e5c89e4eSSatish Balay 
189e5c89e4eSSatish Balay   PetscFunctionBegin;
1908b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1919566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1929566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar *)));
1939566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1949566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
195e5c89e4eSSatish Balay   obj->scalarstar_idmax        = new_n;
196*9371c9d4SSatish Balay   obj->scalarstarcomposeddata  = new_ar;
197*9371c9d4SSatish Balay   obj->scalarstarcomposedstate = new_ir;
198e5c89e4eSSatish Balay   PetscFunctionReturn(0);
199e5c89e4eSSatish Balay }
200e5c89e4eSSatish Balay 
201127c8a3bSJed Brown /*@
202127c8a3bSJed Brown    PetscObjectGetId - get unique object ID
203127c8a3bSJed Brown 
204127c8a3bSJed Brown    Not Collective
205127c8a3bSJed Brown 
2064165533cSJose E. Roman    Input Parameter:
207127c8a3bSJed Brown .  obj - object
208127c8a3bSJed Brown 
2094165533cSJose E. Roman    Output Parameter:
210127c8a3bSJed Brown .  id - integer ID
211127c8a3bSJed Brown 
212127c8a3bSJed Brown    Level: developer
213127c8a3bSJed Brown 
214127c8a3bSJed Brown    Notes:
215127c8a3bSJed Brown    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
216127c8a3bSJed Brown 
217db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectCompareId()`
218127c8a3bSJed Brown @*/
219*9371c9d4SSatish Balay PetscErrorCode PetscObjectGetId(PetscObject obj, PetscObjectId *id) {
220127c8a3bSJed Brown   PetscFunctionBegin;
221127c8a3bSJed Brown   *id = obj->id;
222127c8a3bSJed Brown   PetscFunctionReturn(0);
223127c8a3bSJed Brown }
224bdaf1daeSBarry Smith 
225bdaf1daeSBarry Smith /*@
226c94eee08SBarry Smith    PetscObjectCompareId - compares the objects ID with a given id
227bdaf1daeSBarry Smith 
228bdaf1daeSBarry Smith    Not Collective
229bdaf1daeSBarry Smith 
2304165533cSJose E. Roman    Input Parameters:
231bdaf1daeSBarry Smith +  obj - object
232bdaf1daeSBarry Smith -  id - integer ID
233bdaf1daeSBarry Smith 
2344165533cSJose E. Roman    Output Parameter;
235bdaf1daeSBarry Smith .  eq - the ids are equal
236bdaf1daeSBarry Smith 
237bdaf1daeSBarry Smith    Level: developer
238bdaf1daeSBarry Smith 
239bdaf1daeSBarry Smith    Notes:
240bdaf1daeSBarry Smith    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
241bdaf1daeSBarry Smith 
242db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectGetId()`
243bdaf1daeSBarry Smith @*/
244*9371c9d4SSatish Balay PetscErrorCode PetscObjectCompareId(PetscObject obj, PetscObjectId id, PetscBool *eq) {
245bdaf1daeSBarry Smith   PetscFunctionBegin;
246bdaf1daeSBarry Smith   *eq = (id == obj->id) ? PETSC_TRUE : PETSC_FALSE;
247bdaf1daeSBarry Smith   PetscFunctionReturn(0);
248bdaf1daeSBarry Smith }
249