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