xref: /petsc/src/sys/objects/state.c (revision 9cd7b5a2df946e93e6c311ef47bb251ab0c81a71)
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
8811af0c4SBarry 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:
14811af0c4SBarry Smith .  obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. This must be
15811af0c4SBarry Smith          cast with a (`PetscObject`), for example,
16811af0c4SBarry Smith          `PetscObjectStateGet`((`PetscObject`)mat,&state);
17e5c89e4eSSatish Balay 
18e5c89e4eSSatish Balay    Output Parameter:
19e5c89e4eSSatish Balay .  state - the object state
20e5c89e4eSSatish Balay 
2121532e8aSBarry Smith    Level: advanced
2221532e8aSBarry Smith 
23811af0c4SBarry Smith    Note:
24811af0c4SBarry Smith    Object state is an integer which gets increased every time
25e5c89e4eSSatish Balay    the object is changed. By saving and later querying the object state
26e5c89e4eSSatish Balay    one can determine whether information about the object is still current.
27811af0c4SBarry Smith    Currently, state is maintained for `Vec` and `Mat` objects.
28e5c89e4eSSatish Balay 
2987497f52SBarry Smith .seealso: `PetscObjectStateIncrease()`, `PetscObjectStateSet()`
30e5c89e4eSSatish Balay @*/
31d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectStateGet(PetscObject obj, PetscObjectState *state)
32d71ae5a4SJacob Faibussowitsch {
33e5c89e4eSSatish Balay   PetscFunctionBegin;
343cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
353cfa8680SLisandro Dalcin   PetscValidIntPointer(state, 2);
36e5c89e4eSSatish Balay   *state = obj->state;
373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
38e5c89e4eSSatish Balay }
39e5c89e4eSSatish Balay 
40e5c89e4eSSatish Balay /*@C
41811af0c4SBarry 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:
47811af0c4SBarry Smith +  obj - any PETSc object, for example a `Vec`, `Mat` or `KSP`. This must be
48811af0c4SBarry Smith          cast with a (`PetscObject`), for example,
49811af0c4SBarry Smith          `PetscObjectStateSet`((`PetscObject`)mat,state);
50e5c89e4eSSatish Balay -  state - the object state
51e5c89e4eSSatish Balay 
522fe279fdSBarry Smith    Level: advanced
532fe279fdSBarry Smith 
54811af0c4SBarry Smith    Note:
5595452b02SPatrick Sanan     This function should be used with extreme caution. There is
5621532e8aSBarry Smith    essentially only one use for it: if the user calls `Mat`(`Vec`)GetRow(Array),
57e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
58704cc5ceSJed Brown    routine can be used to reset the state.  Such a reset must be collective.
59e5c89e4eSSatish Balay 
6087497f52SBarry Smith .seealso: `PetscObjectStateGet()`, `PetscObjectStateIncrease()`
61e5c89e4eSSatish Balay @*/
62d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectStateSet(PetscObject obj, PetscObjectState state)
63d71ae5a4SJacob Faibussowitsch {
64e5c89e4eSSatish Balay   PetscFunctionBegin;
653cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
66e5c89e4eSSatish Balay   obj->state = state;
673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
68e5c89e4eSSatish Balay }
69e5c89e4eSSatish Balay 
708b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10;
7153c77d0aSJed Brown 
7262755792SVictor Eijkhout /*@C
73811af0c4SBarry Smith    PetscObjectComposedDataRegister - Get an available id for composing data with a `PetscObject`
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 @*/
92d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id)
93d71ae5a4SJacob Faibussowitsch {
94d44a1e48SBarry Smith   static PetscInt globalcurrentstate = 0;
95d44a1e48SBarry Smith 
96e5c89e4eSSatish Balay   PetscFunctionBegin;
97e5c89e4eSSatish Balay   *id = globalcurrentstate++;
988b5db460SBarry Smith   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
100e5c89e4eSSatish Balay }
101e5c89e4eSSatish Balay 
102d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj)
103d71ae5a4SJacob Faibussowitsch {
104071fcb05SBarry Smith   PetscInt         *ar = obj->intcomposeddata, *new_ar, n = obj->int_idmax, new_n;
105270bf2e7SJed Brown   PetscObjectState *ir = obj->intcomposedstate, *new_ir;
106e5c89e4eSSatish Balay 
107e5c89e4eSSatish Balay   PetscFunctionBegin;
1088b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1099566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1109566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscInt)));
1119566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1129566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
113e5c89e4eSSatish Balay   obj->int_idmax        = new_n;
1149371c9d4SSatish Balay   obj->intcomposeddata  = new_ar;
1159371c9d4SSatish Balay   obj->intcomposedstate = new_ir;
1163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
117e5c89e4eSSatish Balay }
11853c77d0aSJed Brown 
119d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
120d71ae5a4SJacob Faibussowitsch {
121071fcb05SBarry Smith   PetscInt        **ar = obj->intstarcomposeddata, **new_ar, n = obj->intstar_idmax, new_n;
122270bf2e7SJed Brown   PetscObjectState *ir = obj->intstarcomposedstate, *new_ir;
123e5c89e4eSSatish Balay 
124e5c89e4eSSatish Balay   PetscFunctionBegin;
1258b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1269566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1279566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscInt *)));
1289566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1299566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
130e5c89e4eSSatish Balay   obj->intstar_idmax        = new_n;
131071fcb05SBarry Smith   obj->intstarcomposeddata  = new_ar;
132071fcb05SBarry Smith   obj->intstarcomposedstate = new_ir;
1333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
134e5c89e4eSSatish Balay }
135e5c89e4eSSatish Balay 
136d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj)
137d71ae5a4SJacob Faibussowitsch {
138e5c89e4eSSatish Balay   PetscReal        *ar = obj->realcomposeddata, *new_ar;
139270bf2e7SJed Brown   PetscObjectState *ir = obj->realcomposedstate, *new_ir;
140071fcb05SBarry Smith   PetscInt          n  = obj->real_idmax, new_n;
141e5c89e4eSSatish Balay 
142e5c89e4eSSatish Balay   PetscFunctionBegin;
1438b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1449566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1459566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscReal)));
1469566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1479566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
148e5c89e4eSSatish Balay   obj->real_idmax        = new_n;
1499371c9d4SSatish Balay   obj->realcomposeddata  = new_ar;
1509371c9d4SSatish Balay   obj->realcomposedstate = new_ir;
1513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
152e5c89e4eSSatish Balay }
153e5c89e4eSSatish Balay 
154d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
155d71ae5a4SJacob Faibussowitsch {
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;
1679371c9d4SSatish Balay   obj->realstarcomposeddata  = new_ar;
1689371c9d4SSatish Balay   obj->realstarcomposedstate = new_ir;
1693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
170e5c89e4eSSatish Balay }
171e5c89e4eSSatish Balay 
172d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj)
173d71ae5a4SJacob Faibussowitsch {
174*9cd7b5a2SJacob Faibussowitsch #if PetscDefined(USE_COMPLEX)
175e5c89e4eSSatish Balay   PetscScalar      *ar = obj->scalarcomposeddata, *new_ar;
176270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarcomposedstate, *new_ir;
177071fcb05SBarry Smith   PetscInt          n  = obj->scalar_idmax, new_n;
178e5c89e4eSSatish Balay 
179e5c89e4eSSatish Balay   PetscFunctionBegin;
1808b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
1819566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
1829566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar)));
1839566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
1849566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
185e5c89e4eSSatish Balay   obj->scalar_idmax        = new_n;
1869371c9d4SSatish Balay   obj->scalarcomposeddata  = new_ar;
1879371c9d4SSatish Balay   obj->scalarcomposedstate = new_ir;
1883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
189*9cd7b5a2SJacob Faibussowitsch #else
190*9cd7b5a2SJacob Faibussowitsch   return PetscObjectComposedDataIncreaseReal(obj);
191*9cd7b5a2SJacob Faibussowitsch #endif
192e5c89e4eSSatish Balay }
193e5c89e4eSSatish Balay 
194d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
195d71ae5a4SJacob Faibussowitsch {
196*9cd7b5a2SJacob Faibussowitsch #if PetscDefined(USE_COMPLEX)
197e5c89e4eSSatish Balay   PetscScalar     **ar = obj->scalarstarcomposeddata, **new_ar;
198270bf2e7SJed Brown   PetscObjectState *ir = obj->scalarstarcomposedstate, *new_ir;
199071fcb05SBarry Smith   PetscInt          n  = obj->scalarstar_idmax, new_n;
200e5c89e4eSSatish Balay 
201e5c89e4eSSatish Balay   PetscFunctionBegin;
2028b5db460SBarry Smith   new_n = PetscObjectComposedDataMax;
2039566063dSJacob Faibussowitsch   PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir));
2049566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar *)));
2059566063dSJacob Faibussowitsch   PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState)));
2069566063dSJacob Faibussowitsch   PetscCall(PetscFree2(ar, ir));
207e5c89e4eSSatish Balay   obj->scalarstar_idmax        = new_n;
2089371c9d4SSatish Balay   obj->scalarstarcomposeddata  = new_ar;
2099371c9d4SSatish Balay   obj->scalarstarcomposedstate = new_ir;
2103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
211*9cd7b5a2SJacob Faibussowitsch #else
212*9cd7b5a2SJacob Faibussowitsch   return PetscObjectComposedDataIncreaseRealstar(obj);
213*9cd7b5a2SJacob Faibussowitsch #endif
214e5c89e4eSSatish Balay }
215e5c89e4eSSatish Balay 
216127c8a3bSJed Brown /*@
217811af0c4SBarry Smith    PetscObjectGetId - get a unique object ID for the `PetscObject`
218127c8a3bSJed Brown 
219127c8a3bSJed Brown    Not Collective
220127c8a3bSJed Brown 
2214165533cSJose E. Roman    Input Parameter:
222127c8a3bSJed Brown .  obj - object
223127c8a3bSJed Brown 
2244165533cSJose E. Roman    Output Parameter:
225127c8a3bSJed Brown .  id - integer ID
226127c8a3bSJed Brown 
227127c8a3bSJed Brown    Level: developer
228127c8a3bSJed Brown 
229811af0c4SBarry Smith    Note:
230127c8a3bSJed Brown    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
231127c8a3bSJed Brown 
232db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectCompareId()`
233127c8a3bSJed Brown @*/
234d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectGetId(PetscObject obj, PetscObjectId *id)
235d71ae5a4SJacob Faibussowitsch {
236127c8a3bSJed Brown   PetscFunctionBegin;
2370e6b6b59SJacob Faibussowitsch   PetscValidHeader(obj, 1);
2380e6b6b59SJacob Faibussowitsch   PetscValidIntPointer(id, 2);
239127c8a3bSJed Brown   *id = obj->id;
2403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
241127c8a3bSJed Brown }
242bdaf1daeSBarry Smith 
243bdaf1daeSBarry Smith /*@
244c94eee08SBarry Smith    PetscObjectCompareId - compares the objects ID with a given id
245bdaf1daeSBarry Smith 
246bdaf1daeSBarry Smith    Not Collective
247bdaf1daeSBarry Smith 
2484165533cSJose E. Roman    Input Parameters:
249bdaf1daeSBarry Smith +  obj - object
250bdaf1daeSBarry Smith -  id - integer ID
251bdaf1daeSBarry Smith 
2524165533cSJose E. Roman    Output Parameter;
253bdaf1daeSBarry Smith .  eq - the ids are equal
254bdaf1daeSBarry Smith 
255bdaf1daeSBarry Smith    Level: developer
256bdaf1daeSBarry Smith 
257811af0c4SBarry Smith    Note:
258bdaf1daeSBarry Smith    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
259bdaf1daeSBarry Smith 
260db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectGetId()`
261bdaf1daeSBarry Smith @*/
262d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectCompareId(PetscObject obj, PetscObjectId id, PetscBool *eq)
263d71ae5a4SJacob Faibussowitsch {
2640e6b6b59SJacob Faibussowitsch   PetscObjectId oid;
2650e6b6b59SJacob Faibussowitsch 
266bdaf1daeSBarry Smith   PetscFunctionBegin;
2670e6b6b59SJacob Faibussowitsch   PetscValidHeader(obj, 1);
2680e6b6b59SJacob Faibussowitsch   PetscValidBoolPointer(eq, 3);
2690e6b6b59SJacob Faibussowitsch   PetscCall(PetscObjectGetId(obj, &oid));
2700e6b6b59SJacob Faibussowitsch   *eq = (id == oid) ? PETSC_TRUE : PETSC_FALSE;
2713ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
272bdaf1daeSBarry Smith }
273