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 21*21532e8aSBarry Smith Level: advanced 22*21532e8aSBarry 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 56*21532e8aSBarry 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 { 174e5c89e4eSSatish Balay PetscScalar *ar = obj->scalarcomposeddata, *new_ar; 175270bf2e7SJed Brown PetscObjectState *ir = obj->scalarcomposedstate, *new_ir; 176071fcb05SBarry Smith PetscInt n = obj->scalar_idmax, new_n; 177e5c89e4eSSatish Balay 178e5c89e4eSSatish Balay PetscFunctionBegin; 1798b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1809566063dSJacob Faibussowitsch PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir)); 1819566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar))); 1829566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState))); 1839566063dSJacob Faibussowitsch PetscCall(PetscFree2(ar, ir)); 184e5c89e4eSSatish Balay obj->scalar_idmax = new_n; 1859371c9d4SSatish Balay obj->scalarcomposeddata = new_ar; 1869371c9d4SSatish Balay obj->scalarcomposedstate = new_ir; 1873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 188e5c89e4eSSatish Balay } 189e5c89e4eSSatish Balay 190d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 191d71ae5a4SJacob Faibussowitsch { 192e5c89e4eSSatish Balay PetscScalar **ar = obj->scalarstarcomposeddata, **new_ar; 193270bf2e7SJed Brown PetscObjectState *ir = obj->scalarstarcomposedstate, *new_ir; 194071fcb05SBarry Smith PetscInt n = obj->scalarstar_idmax, new_n; 195e5c89e4eSSatish Balay 196e5c89e4eSSatish Balay PetscFunctionBegin; 1978b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 1989566063dSJacob Faibussowitsch PetscCall(PetscCalloc2(new_n, &new_ar, new_n, &new_ir)); 1999566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(new_ar, ar, n * sizeof(PetscScalar *))); 2009566063dSJacob Faibussowitsch PetscCall(PetscMemcpy(new_ir, ir, n * sizeof(PetscObjectState))); 2019566063dSJacob Faibussowitsch PetscCall(PetscFree2(ar, ir)); 202e5c89e4eSSatish Balay obj->scalarstar_idmax = new_n; 2039371c9d4SSatish Balay obj->scalarstarcomposeddata = new_ar; 2049371c9d4SSatish Balay obj->scalarstarcomposedstate = new_ir; 2053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 206e5c89e4eSSatish Balay } 207e5c89e4eSSatish Balay 208127c8a3bSJed Brown /*@ 209811af0c4SBarry Smith PetscObjectGetId - get a unique object ID for the `PetscObject` 210127c8a3bSJed Brown 211127c8a3bSJed Brown Not Collective 212127c8a3bSJed Brown 2134165533cSJose E. Roman Input Parameter: 214127c8a3bSJed Brown . obj - object 215127c8a3bSJed Brown 2164165533cSJose E. Roman Output Parameter: 217127c8a3bSJed Brown . id - integer ID 218127c8a3bSJed Brown 219127c8a3bSJed Brown Level: developer 220127c8a3bSJed Brown 221811af0c4SBarry Smith Note: 222127c8a3bSJed Brown The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 223127c8a3bSJed Brown 224db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectCompareId()` 225127c8a3bSJed Brown @*/ 226d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectGetId(PetscObject obj, PetscObjectId *id) 227d71ae5a4SJacob Faibussowitsch { 228127c8a3bSJed Brown PetscFunctionBegin; 2290e6b6b59SJacob Faibussowitsch PetscValidHeader(obj, 1); 2300e6b6b59SJacob Faibussowitsch PetscValidIntPointer(id, 2); 231127c8a3bSJed Brown *id = obj->id; 2323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 233127c8a3bSJed Brown } 234bdaf1daeSBarry Smith 235bdaf1daeSBarry Smith /*@ 236c94eee08SBarry Smith PetscObjectCompareId - compares the objects ID with a given id 237bdaf1daeSBarry Smith 238bdaf1daeSBarry Smith Not Collective 239bdaf1daeSBarry Smith 2404165533cSJose E. Roman Input Parameters: 241bdaf1daeSBarry Smith + obj - object 242bdaf1daeSBarry Smith - id - integer ID 243bdaf1daeSBarry Smith 2444165533cSJose E. Roman Output Parameter; 245bdaf1daeSBarry Smith . eq - the ids are equal 246bdaf1daeSBarry Smith 247bdaf1daeSBarry Smith Level: developer 248bdaf1daeSBarry Smith 249811af0c4SBarry Smith Note: 250bdaf1daeSBarry Smith The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 251bdaf1daeSBarry Smith 252db781477SPatrick Sanan .seealso: `PetscObjectStateGet()`, `PetscObjectGetId()` 253bdaf1daeSBarry Smith @*/ 254d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectCompareId(PetscObject obj, PetscObjectId id, PetscBool *eq) 255d71ae5a4SJacob Faibussowitsch { 2560e6b6b59SJacob Faibussowitsch PetscObjectId oid; 2570e6b6b59SJacob Faibussowitsch 258bdaf1daeSBarry Smith PetscFunctionBegin; 2590e6b6b59SJacob Faibussowitsch PetscValidHeader(obj, 1); 2600e6b6b59SJacob Faibussowitsch PetscValidBoolPointer(eq, 3); 2610e6b6b59SJacob Faibussowitsch PetscCall(PetscObjectGetId(obj, &oid)); 2620e6b6b59SJacob Faibussowitsch *eq = (id == oid) ? PETSC_TRUE : PETSC_FALSE; 2633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 264bdaf1daeSBarry Smith } 265