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