xref: /petsc/src/sys/objects/state.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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
8*811af0c4SBarry 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:
14*811af0c4SBarry Smith .  obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. This must be
15*811af0c4SBarry Smith          cast with a (`PetscObject`), for example,
16*811af0c4SBarry Smith          `PetscObjectStateGet`((`PetscObject`)mat,&state);
17e5c89e4eSSatish Balay 
18e5c89e4eSSatish Balay    Output Parameter:
19e5c89e4eSSatish Balay .  state - the object state
20e5c89e4eSSatish Balay 
21*811af0c4SBarry Smith    Note:
22*811af0c4SBarry Smith    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.
25*811af0c4SBarry Smith    Currently, state is maintained for `Vec` and `Mat` objects.
26e5c89e4eSSatish Balay 
27e5c89e4eSSatish Balay    Level: advanced
28e5c89e4eSSatish Balay 
2987497f52SBarry Smith .seealso: `PetscObjectStateIncrease()`, `PetscObjectStateSet()`
30e5c89e4eSSatish Balay @*/
319371c9d4SSatish Balay PetscErrorCode PetscObjectStateGet(PetscObject obj, PetscObjectState *state) {
32e5c89e4eSSatish Balay   PetscFunctionBegin;
333cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
343cfa8680SLisandro Dalcin   PetscValidIntPointer(state, 2);
35e5c89e4eSSatish Balay   *state = obj->state;
36e5c89e4eSSatish Balay   PetscFunctionReturn(0);
37e5c89e4eSSatish Balay }
38e5c89e4eSSatish Balay 
39e5c89e4eSSatish Balay /*@C
40*811af0c4SBarry Smith    PetscObjectStateSet - Sets the state of any `PetscObject`,
41e5c89e4eSSatish Balay    regardless of the type.
42e5c89e4eSSatish Balay 
43704cc5ceSJed Brown    Logically Collective
44e5c89e4eSSatish Balay 
45d8d19677SJose E. Roman    Input Parameters:
46*811af0c4SBarry Smith +  obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. This must be
47*811af0c4SBarry Smith          cast with a (`PetscObject`), for example,
48*811af0c4SBarry Smith          `PetscObjectStateSet`((`PetscObject`)mat,state);
49e5c89e4eSSatish Balay -  state - the object state
50e5c89e4eSSatish Balay 
51*811af0c4SBarry Smith    Note:
5295452b02SPatrick Sanan     This function should be used with extreme caution. There is
53e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
54e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
55704cc5ceSJed Brown    routine can be used to reset the state.  Such a reset must be collective.
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay    Level: advanced
58e5c89e4eSSatish Balay 
5987497f52SBarry Smith .seealso: `PetscObjectStateGet()`, `PetscObjectStateIncrease()`
60e5c89e4eSSatish Balay @*/
619371c9d4SSatish Balay PetscErrorCode PetscObjectStateSet(PetscObject obj, PetscObjectState state) {
62e5c89e4eSSatish Balay   PetscFunctionBegin;
633cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
64e5c89e4eSSatish Balay   obj->state = state;
65e5c89e4eSSatish Balay   PetscFunctionReturn(0);
66e5c89e4eSSatish Balay }
67e5c89e4eSSatish Balay 
688b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10;
6953c77d0aSJed Brown 
7062755792SVictor Eijkhout /*@C
71*811af0c4SBarry Smith    PetscObjectComposedDataRegister - Get an available id for composing data with a `PetscObject`
7262755792SVictor Eijkhout 
7362755792SVictor Eijkhout    Not Collective
7462755792SVictor Eijkhout 
7562755792SVictor Eijkhout    Output parameter:
7662755792SVictor Eijkhout .  id - an identifier under which data can be stored
7762755792SVictor Eijkhout 
7862755792SVictor Eijkhout    Level: developer
7962755792SVictor Eijkhout 
8095452b02SPatrick Sanan    Notes:
8187497f52SBarry 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.
821957e957SBarry Smith 
8387497f52SBarry Smith    `PetscObjectCompose()` and  `PetscObjectQuery()` provide a way to attach any data to an object
8462755792SVictor Eijkhout 
8587497f52SBarry Smith .seealso: `PetscObjectComposedDataSetInt()`, `PetscObjectComposedDataSetReal()`, `PetscObjectComposedDataGetReal()`, `PetscObjectComposedDataSetIntstar()`,
8687497f52SBarry Smith           `PetscObjectComposedDataSetIntstar()`, `PetscObjectComposedDataGetInt()`, `PetscObject`,
8787497f52SBarry Smith           `PetscObjectCompose()`,  `PetscObjectQuery()`, `PetscObjectComposedDataSetRealstar()`, `PetscObjectComposedDataGetScalarstar()`,
8887497f52SBarry Smith           `PetscObjectComposedDataSetScalarstar()`, `PetscObjectComposedDataSetScalarstar()`
8962755792SVictor Eijkhout @*/
909371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) {
91d44a1e48SBarry Smith   static PetscInt globalcurrentstate = 0;
92d44a1e48SBarry Smith 
93e5c89e4eSSatish Balay   PetscFunctionBegin;
94e5c89e4eSSatish Balay   *id = globalcurrentstate++;
958b5db460SBarry Smith   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
96e5c89e4eSSatish Balay   PetscFunctionReturn(0);
97e5c89e4eSSatish Balay }
98e5c89e4eSSatish Balay 
999371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) {
100071fcb05SBarry Smith   PetscInt         *ar = obj->intcomposeddata, *new_ar, n = obj->int_idmax, new_n;
101270bf2e7SJed Brown   PetscObjectState *ir = obj->intcomposedstate, *new_ir;
102e5c89e4eSSatish Balay 
103e5c89e4eSSatish Balay   PetscFunctionBegin;
1048b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1059566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1069566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscInt)));
1079566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1089566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
109e5c89e4eSSatish Balay   obj->int_idmax        = new_n;
1109371c9d4SSatish Balay   obj->intcomposeddata  = new_ar;
1119371c9d4SSatish Balay   obj->intcomposedstate = new_ir;
112e5c89e4eSSatish Balay   PetscFunctionReturn(0);
113e5c89e4eSSatish Balay }
11453c77d0aSJed Brown 
1159371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) {
116071fcb05SBarry Smith   PetscInt        **ar = obj->intstarcomposeddata, **new_ar, n = obj->intstar_idmax, new_n;
117270bf2e7SJed Brown   PetscObjectState *ir = obj->intstarcomposedstate, *new_ir;
118e5c89e4eSSatish Balay 
119e5c89e4eSSatish Balay   PetscFunctionBegin;
1208b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1219566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1229566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscInt *)));
1239566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1249566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
125e5c89e4eSSatish Balay   obj->intstar_idmax        = new_n;
126071fcb05SBarry Smith   obj->intstarcomposeddata  = new_ar;
127071fcb05SBarry Smith   obj->intstarcomposedstate = new_ir;
128e5c89e4eSSatish Balay   PetscFunctionReturn(0);
129e5c89e4eSSatish Balay }
130e5c89e4eSSatish Balay 
1319371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) {
132e5c89e4eSSatish Balay   PetscReal        *ar = obj->realcomposeddata, *new_ar;
133270bf2e7SJed Brown   PetscObjectState *ir = obj->realcomposedstate, *new_ir;
134071fcb05SBarry Smith   PetscInt          n  = obj->real_idmax, new_n;
135e5c89e4eSSatish Balay 
136e5c89e4eSSatish Balay   PetscFunctionBegin;
1378b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1389566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1399566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscReal)));
1409566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1419566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
142e5c89e4eSSatish Balay   obj->real_idmax        = new_n;
1439371c9d4SSatish Balay   obj->realcomposeddata  = new_ar;
1449371c9d4SSatish Balay   obj->realcomposedstate = new_ir;
145e5c89e4eSSatish Balay   PetscFunctionReturn(0);
146e5c89e4eSSatish Balay }
147e5c89e4eSSatish Balay 
1489371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) {
149e5c89e4eSSatish Balay   PetscReal       **ar = obj->realstarcomposeddata, **new_ar;
150270bf2e7SJed Brown   PetscObjectState *ir = obj->realstarcomposedstate, *new_ir;
151071fcb05SBarry Smith   PetscInt          n  = obj->realstar_idmax, new_n;
152e5c89e4eSSatish Balay 
153e5c89e4eSSatish Balay   PetscFunctionBegin;
1548b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1559566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1569566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscReal *)));
1579566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1589566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
159e5c89e4eSSatish Balay   obj->realstar_idmax        = new_n;
1609371c9d4SSatish Balay   obj->realstarcomposeddata  = new_ar;
1619371c9d4SSatish Balay   obj->realstarcomposedstate = new_ir;
162e5c89e4eSSatish Balay   PetscFunctionReturn(0);
163e5c89e4eSSatish Balay }
164e5c89e4eSSatish Balay 
1659371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) {
166e5c89e4eSSatish Balay   PetscScalar      *ar = obj->scalarcomposeddata, *new_ar;
167270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarcomposedstate, *new_ir;
168071fcb05SBarry Smith   PetscInt          n  = obj->scalar_idmax, new_n;
169e5c89e4eSSatish Balay 
170e5c89e4eSSatish Balay   PetscFunctionBegin;
1718b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1729566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1739566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar)));
1749566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1759566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
176e5c89e4eSSatish Balay   obj->scalar_idmax        = new_n;
1779371c9d4SSatish Balay   obj->scalarcomposeddata  = new_ar;
1789371c9d4SSatish Balay   obj->scalarcomposedstate = new_ir;
179e5c89e4eSSatish Balay   PetscFunctionReturn(0);
180e5c89e4eSSatish Balay }
181e5c89e4eSSatish Balay 
1829371c9d4SSatish Balay PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) {
183e5c89e4eSSatish Balay   PetscScalar     **ar = obj->scalarstarcomposeddata, **new_ar;
184270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarstarcomposedstate, *new_ir;
185071fcb05SBarry Smith   PetscInt          n  = obj->scalarstar_idmax, new_n;
186e5c89e4eSSatish Balay 
187e5c89e4eSSatish Balay   PetscFunctionBegin;
1888b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1899566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1909566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar *)));
1919566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1929566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
193e5c89e4eSSatish Balay   obj->scalarstar_idmax        = new_n;
1949371c9d4SSatish Balay   obj->scalarstarcomposeddata  = new_ar;
1959371c9d4SSatish Balay   obj->scalarstarcomposedstate = new_ir;
196e5c89e4eSSatish Balay   PetscFunctionReturn(0);
197e5c89e4eSSatish Balay }
198e5c89e4eSSatish Balay 
199127c8a3bSJed Brown /*@
200*811af0c4SBarry Smith    PetscObjectGetId - get a unique object ID for the `PetscObject`
201127c8a3bSJed Brown 
202127c8a3bSJed Brown    Not Collective
203127c8a3bSJed Brown 
2044165533cSJose E. Roman    Input Parameter:
205127c8a3bSJed Brown .  obj - object
206127c8a3bSJed Brown 
2074165533cSJose E. Roman    Output Parameter:
208127c8a3bSJed Brown .  id - integer ID
209127c8a3bSJed Brown 
210127c8a3bSJed Brown    Level: developer
211127c8a3bSJed Brown 
212*811af0c4SBarry Smith    Note:
213127c8a3bSJed Brown    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
214127c8a3bSJed Brown 
215db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectCompareId()`
216127c8a3bSJed Brown @*/
2179371c9d4SSatish Balay PetscErrorCode PetscObjectGetId(PetscObject obj, PetscObjectId *id) {
218127c8a3bSJed Brown   PetscFunctionBegin;
219127c8a3bSJed Brown   *id = obj->id;
220127c8a3bSJed Brown   PetscFunctionReturn(0);
221127c8a3bSJed Brown }
222bdaf1daeSBarry Smith 
223bdaf1daeSBarry Smith /*@
224c94eee08SBarry Smith    PetscObjectCompareId - compares the objects ID with a given id
225bdaf1daeSBarry Smith 
226bdaf1daeSBarry Smith    Not Collective
227bdaf1daeSBarry Smith 
2284165533cSJose E. Roman    Input Parameters:
229bdaf1daeSBarry Smith +  obj - object
230bdaf1daeSBarry Smith -  id - integer ID
231bdaf1daeSBarry Smith 
2324165533cSJose E. Roman    Output Parameter;
233bdaf1daeSBarry Smith .  eq - the ids are equal
234bdaf1daeSBarry Smith 
235bdaf1daeSBarry Smith    Level: developer
236bdaf1daeSBarry Smith 
237*811af0c4SBarry Smith    Note:
238bdaf1daeSBarry Smith    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
239bdaf1daeSBarry Smith 
240db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectGetId()`
241bdaf1daeSBarry Smith @*/
2429371c9d4SSatish Balay PetscErrorCode PetscObjectCompareId(PetscObject obj, PetscObjectId id, PetscBool *eq) {
243bdaf1daeSBarry Smith   PetscFunctionBegin;
244bdaf1daeSBarry Smith   *eq = (id == obj->id) ? PETSC_TRUE : PETSC_FALSE;
245bdaf1daeSBarry Smith   PetscFunctionReturn(0);
246bdaf1daeSBarry Smith }
247