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 2959e4f3c8SBarry Smith seealso: PetscObjectStateIncrease(), PetscObjectStateSet() 30e5c89e4eSSatish Balay 31e5c89e4eSSatish Balay @*/ 32270bf2e7SJed Brown PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state) 33e5c89e4eSSatish Balay { 34e5c89e4eSSatish Balay PetscFunctionBegin; 353cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 363cfa8680SLisandro Dalcin PetscValidIntPointer(state,2); 37e5c89e4eSSatish Balay *state = obj->state; 38e5c89e4eSSatish Balay PetscFunctionReturn(0); 39e5c89e4eSSatish Balay } 40e5c89e4eSSatish Balay 41e5c89e4eSSatish Balay /*@C 4259e4f3c8SBarry Smith PetscObjectStateSet - Sets the state of any PetscObject, 43e5c89e4eSSatish Balay regardless of the type. 44e5c89e4eSSatish Balay 45704cc5ceSJed Brown Logically Collective 46e5c89e4eSSatish Balay 47d8d19677SJose E. Roman Input Parameters: 48e5c89e4eSSatish Balay + obj - any PETSc object, for example a Vec, Mat or KSP. This must be 49e5c89e4eSSatish Balay cast with a (PetscObject), for example, 5059e4f3c8SBarry Smith PetscObjectStateSet((PetscObject)mat,state); 51e5c89e4eSSatish Balay - state - the object state 52e5c89e4eSSatish Balay 5395452b02SPatrick Sanan Notes: 5495452b02SPatrick Sanan This function should be used with extreme caution. There is 55e5c89e4eSSatish Balay essentially only one use for it: if the user calls Mat(Vec)GetRow(Array), 56e5c89e4eSSatish Balay which increases the state, but does not alter the data, then this 57704cc5ceSJed Brown routine can be used to reset the state. Such a reset must be collective. 58e5c89e4eSSatish Balay 59e5c89e4eSSatish Balay Level: advanced 60e5c89e4eSSatish Balay 6159e4f3c8SBarry Smith seealso: PetscObjectStateGet(),PetscObjectStateIncrease() 62e5c89e4eSSatish Balay 63e5c89e4eSSatish Balay @*/ 64270bf2e7SJed Brown PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state) 65e5c89e4eSSatish Balay { 66e5c89e4eSSatish Balay PetscFunctionBegin; 673cfa8680SLisandro Dalcin PetscValidHeader(obj,1); 68e5c89e4eSSatish Balay obj->state = state; 69e5c89e4eSSatish Balay PetscFunctionReturn(0); 70e5c89e4eSSatish Balay } 71e5c89e4eSSatish Balay 728b5db460SBarry Smith PetscInt PetscObjectComposedDataMax = 10; 7353c77d0aSJed Brown 7462755792SVictor Eijkhout /*@C 751957e957SBarry Smith PetscObjectComposedDataRegister - Get an available id for composed data 7662755792SVictor Eijkhout 7762755792SVictor Eijkhout Not Collective 7862755792SVictor Eijkhout 7962755792SVictor Eijkhout Output parameter: 8062755792SVictor Eijkhout . id - an identifier under which data can be stored 8162755792SVictor Eijkhout 8262755792SVictor Eijkhout Level: developer 8362755792SVictor Eijkhout 8495452b02SPatrick Sanan Notes: 8595452b02SPatrick Sanan You must keep this value (for example in a global variable) in order to attach the data to an object or 861957e957SBarry Smith access in an object. 871957e957SBarry Smith 88f65bdb8fSBarry Smith seealso: PetscObjectComposedDataSetInt() 8962755792SVictor Eijkhout 9062755792SVictor Eijkhout @*/ 917087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataRegister(PetscInt *id) 92e5c89e4eSSatish Balay { 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 1017087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseInt(PetscObject obj) 102e5c89e4eSSatish Balay { 103071fcb05SBarry Smith PetscInt *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n; 104270bf2e7SJed Brown PetscObjectState *ir = obj->intcomposedstate,*new_ir; 105e5c89e4eSSatish Balay PetscErrorCode ierr; 106e5c89e4eSSatish Balay 107e5c89e4eSSatish Balay PetscFunctionBegin; 1088b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 109071fcb05SBarry Smith ierr = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr); 110071fcb05SBarry Smith ierr = PetscMemcpy(new_ar,ar,n*sizeof(PetscInt));CHKERRQ(ierr); 111071fcb05SBarry Smith ierr = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr); 112071fcb05SBarry Smith ierr = PetscFree2(ar,ir);CHKERRQ(ierr); 113e5c89e4eSSatish Balay obj->int_idmax = new_n; 114e5c89e4eSSatish Balay obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir; 115e5c89e4eSSatish Balay PetscFunctionReturn(0); 116e5c89e4eSSatish Balay } 11753c77d0aSJed Brown 1187087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseIntstar(PetscObject obj) 119e5c89e4eSSatish Balay { 120071fcb05SBarry Smith PetscInt **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n; 121270bf2e7SJed Brown PetscObjectState *ir = obj->intstarcomposedstate,*new_ir; 122e5c89e4eSSatish Balay PetscErrorCode ierr; 123e5c89e4eSSatish Balay 124e5c89e4eSSatish Balay PetscFunctionBegin; 1258b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 126071fcb05SBarry Smith ierr = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr); 127071fcb05SBarry Smith ierr = PetscMemcpy(new_ar,ar,n*sizeof(PetscInt*));CHKERRQ(ierr); 128071fcb05SBarry Smith ierr = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr); 129071fcb05SBarry Smith ierr = PetscFree2(ar,ir);CHKERRQ(ierr); 130e5c89e4eSSatish Balay obj->intstar_idmax = new_n; 131071fcb05SBarry Smith obj->intstarcomposeddata = new_ar; 132071fcb05SBarry Smith obj->intstarcomposedstate = new_ir; 133e5c89e4eSSatish Balay PetscFunctionReturn(0); 134e5c89e4eSSatish Balay } 135e5c89e4eSSatish Balay 1367087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseReal(PetscObject obj) 137e5c89e4eSSatish Balay { 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 PetscErrorCode ierr; 142e5c89e4eSSatish Balay 143e5c89e4eSSatish Balay PetscFunctionBegin; 1448b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 145071fcb05SBarry Smith ierr = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr); 146071fcb05SBarry Smith ierr = PetscMemcpy(new_ar,ar,n*sizeof(PetscReal));CHKERRQ(ierr); 147071fcb05SBarry Smith ierr = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr); 148071fcb05SBarry Smith ierr = PetscFree2(ar,ir);CHKERRQ(ierr); 149e5c89e4eSSatish Balay obj->real_idmax = new_n; 150e5c89e4eSSatish Balay obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir; 151e5c89e4eSSatish Balay PetscFunctionReturn(0); 152e5c89e4eSSatish Balay } 153e5c89e4eSSatish Balay 1547087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseRealstar(PetscObject obj) 155e5c89e4eSSatish Balay { 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 PetscErrorCode ierr; 160e5c89e4eSSatish Balay 161e5c89e4eSSatish Balay PetscFunctionBegin; 1628b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 163071fcb05SBarry Smith ierr = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr); 164071fcb05SBarry Smith ierr = PetscMemcpy(new_ar,ar,n*sizeof(PetscReal*));CHKERRQ(ierr); 165071fcb05SBarry Smith ierr = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr); 166071fcb05SBarry Smith ierr = PetscFree2(ar,ir);CHKERRQ(ierr); 167e5c89e4eSSatish Balay obj->realstar_idmax = new_n; 168e5c89e4eSSatish Balay obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir; 169e5c89e4eSSatish Balay PetscFunctionReturn(0); 170e5c89e4eSSatish Balay } 171e5c89e4eSSatish Balay 1727087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalar(PetscObject obj) 173e5c89e4eSSatish Balay { 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 PetscErrorCode ierr; 178e5c89e4eSSatish Balay 179e5c89e4eSSatish Balay PetscFunctionBegin; 1808b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 181071fcb05SBarry Smith ierr = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr); 182071fcb05SBarry Smith ierr = PetscMemcpy(new_ar,ar,n*sizeof(PetscScalar));CHKERRQ(ierr); 183071fcb05SBarry Smith ierr = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr); 184071fcb05SBarry Smith ierr = PetscFree2(ar,ir);CHKERRQ(ierr); 185e5c89e4eSSatish Balay obj->scalar_idmax = new_n; 186e5c89e4eSSatish Balay obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir; 187e5c89e4eSSatish Balay PetscFunctionReturn(0); 188e5c89e4eSSatish Balay } 189e5c89e4eSSatish Balay 1907087cfbeSBarry Smith PetscErrorCode PetscObjectComposedDataIncreaseScalarstar(PetscObject obj) 191e5c89e4eSSatish Balay { 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 PetscErrorCode ierr; 196e5c89e4eSSatish Balay 197e5c89e4eSSatish Balay PetscFunctionBegin; 1988b5db460SBarry Smith new_n = PetscObjectComposedDataMax; 199071fcb05SBarry Smith ierr = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr); 200071fcb05SBarry Smith ierr = PetscMemcpy(new_ar,ar,n*sizeof(PetscScalar*));CHKERRQ(ierr); 201071fcb05SBarry Smith ierr = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr); 202071fcb05SBarry Smith ierr = PetscFree2(ar,ir);CHKERRQ(ierr); 203e5c89e4eSSatish Balay obj->scalarstar_idmax = new_n; 204e5c89e4eSSatish Balay obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir; 205e5c89e4eSSatish Balay PetscFunctionReturn(0); 206e5c89e4eSSatish Balay } 207e5c89e4eSSatish Balay 208127c8a3bSJed Brown /*@ 209127c8a3bSJed Brown PetscObjectGetId - get unique object ID 210127c8a3bSJed Brown 211127c8a3bSJed Brown Not Collective 212127c8a3bSJed Brown 213*4165533cSJose E. Roman Input Parameter: 214127c8a3bSJed Brown . obj - object 215127c8a3bSJed Brown 216*4165533cSJose E. Roman Output Parameter: 217127c8a3bSJed Brown . id - integer ID 218127c8a3bSJed Brown 219127c8a3bSJed Brown Level: developer 220127c8a3bSJed Brown 221127c8a3bSJed Brown Notes: 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 224bdaf1daeSBarry Smith .seealso: PetscObjectStateGet(), PetscObjectCompareId() 225127c8a3bSJed Brown @*/ 226127c8a3bSJed Brown PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id) 227127c8a3bSJed Brown { 228127c8a3bSJed Brown PetscFunctionBegin; 229127c8a3bSJed Brown *id = obj->id; 230127c8a3bSJed Brown PetscFunctionReturn(0); 231127c8a3bSJed Brown } 232bdaf1daeSBarry Smith 233bdaf1daeSBarry Smith /*@ 234c94eee08SBarry Smith PetscObjectCompareId - compares the objects ID with a given id 235bdaf1daeSBarry Smith 236bdaf1daeSBarry Smith Not Collective 237bdaf1daeSBarry Smith 238*4165533cSJose E. Roman Input Parameters: 239bdaf1daeSBarry Smith + obj - object 240bdaf1daeSBarry Smith - id - integer ID 241bdaf1daeSBarry Smith 242*4165533cSJose E. Roman Output Parameter; 243bdaf1daeSBarry Smith . eq - the ids are equal 244bdaf1daeSBarry Smith 245bdaf1daeSBarry Smith Level: developer 246bdaf1daeSBarry Smith 247bdaf1daeSBarry Smith Notes: 248bdaf1daeSBarry Smith The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality. 249bdaf1daeSBarry Smith 250bdaf1daeSBarry Smith .seealso: PetscObjectStateGet(), PetscObjectGetId() 251bdaf1daeSBarry Smith @*/ 252bdaf1daeSBarry Smith PetscErrorCode PetscObjectCompareId(PetscObject obj,PetscObjectId id,PetscBool *eq) 253bdaf1daeSBarry Smith { 254bdaf1daeSBarry Smith PetscFunctionBegin; 255bdaf1daeSBarry Smith *eq = (id == obj->id) ? PETSC_TRUE : PETSC_FALSE; 256bdaf1daeSBarry Smith PetscFunctionReturn(0); 257bdaf1daeSBarry Smith } 258