xref: /petsc/src/sys/objects/state.c (revision 7d0a6c19129e7069c8a40e210b34ed62989173db)
1*7d0a6c19SBarry Smith 
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5d382aafbSBarry Smith #include "petscsys.h"  /*I   "petscsys.h"    I*/
6e5c89e4eSSatish Balay 
7e5c89e4eSSatish Balay #undef __FUNCT__
8e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectStateQuery"
9e5c89e4eSSatish Balay /*@C
10e5c89e4eSSatish Balay    PetscObjectStateQuery - Gets the state of any PetscObject,
11e5c89e4eSSatish Balay    regardless of the type.
12e5c89e4eSSatish Balay 
13e5c89e4eSSatish Balay    Not Collective
14e5c89e4eSSatish Balay 
15e5c89e4eSSatish Balay    Input Parameter:
16e5c89e4eSSatish Balay .  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
17e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
18e5c89e4eSSatish Balay          PetscObjectStateQuery((PetscObject)mat,&state);
19e5c89e4eSSatish Balay 
20e5c89e4eSSatish Balay    Output Parameter:
21e5c89e4eSSatish Balay .  state - the object state
22e5c89e4eSSatish Balay 
23e5c89e4eSSatish Balay    Notes: object state is an integer which gets increased every time
24e5c89e4eSSatish Balay    the object is changed. By saving and later querying the object state
25e5c89e4eSSatish Balay    one can determine whether information about the object is still current.
26e5c89e4eSSatish Balay    Currently, state is maintained for Vec and Mat objects.
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay    Level: advanced
29e5c89e4eSSatish Balay 
30f65bdb8fSBarry Smith    seealso: PetscObjectStateIncrease(), PetscObjectSetState()
31e5c89e4eSSatish Balay 
32e5c89e4eSSatish Balay    Concepts: state
33e5c89e4eSSatish Balay 
34e5c89e4eSSatish Balay @*/
357087cfbeSBarry Smith PetscErrorCode  PetscObjectStateQuery(PetscObject obj,PetscInt *state)
36e5c89e4eSSatish Balay {
37e5c89e4eSSatish Balay   PetscFunctionBegin;
383cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
393cfa8680SLisandro Dalcin   PetscValidIntPointer(state,2);
40e5c89e4eSSatish Balay   *state = obj->state;
41e5c89e4eSSatish Balay   PetscFunctionReturn(0);
42e5c89e4eSSatish Balay }
43e5c89e4eSSatish Balay 
44e5c89e4eSSatish Balay #undef __FUNCT__
45e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetState"
46e5c89e4eSSatish Balay /*@C
47e5c89e4eSSatish Balay    PetscObjectSetState - Sets the state of any PetscObject,
48e5c89e4eSSatish Balay    regardless of the type.
49e5c89e4eSSatish Balay 
50e5c89e4eSSatish Balay    Not Collective
51e5c89e4eSSatish Balay 
52e5c89e4eSSatish Balay    Input Parameter:
53e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
54e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
55e5c89e4eSSatish Balay          PetscObjectSetState((PetscObject)mat,state);
56e5c89e4eSSatish Balay -  state - the object state
57e5c89e4eSSatish Balay 
58e5c89e4eSSatish Balay    Notes: This function should be used with extreme caution. There is
59e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
60e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
61e5c89e4eSSatish Balay    routine can be used to reset the state.
62e5c89e4eSSatish Balay 
63e5c89e4eSSatish Balay    Level: advanced
64e5c89e4eSSatish Balay 
65f65bdb8fSBarry Smith    seealso: PetscObjectStateQuery(),PetscObjectStateIncrease()
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay    Concepts: state
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay @*/
707087cfbeSBarry Smith PetscErrorCode  PetscObjectSetState(PetscObject obj,PetscInt state)
71e5c89e4eSSatish Balay {
72e5c89e4eSSatish Balay   PetscFunctionBegin;
733cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
74e5c89e4eSSatish Balay   obj->state = state;
75e5c89e4eSSatish Balay   PetscFunctionReturn(0);
76e5c89e4eSSatish Balay }
77e5c89e4eSSatish Balay 
787087cfbeSBarry Smith PetscInt  globalcurrentstate = 0;
797087cfbeSBarry Smith PetscInt  globalmaxstate = 10;
8053c77d0aSJed Brown 
8153c77d0aSJed Brown #undef __FUNCT__
8253c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataRegister"
8362755792SVictor Eijkhout /*@C
8462755792SVictor Eijkhout    PetscObjectComposedDataRegister - Get an available id for
8562755792SVictor Eijkhout    composed data
8662755792SVictor Eijkhout 
8762755792SVictor Eijkhout    Not Collective
8862755792SVictor Eijkhout 
8962755792SVictor Eijkhout    Output parameter:
9062755792SVictor Eijkhout .  id - an identifier under which data can be stored
9162755792SVictor Eijkhout 
9262755792SVictor Eijkhout    Level: developer
9362755792SVictor Eijkhout 
94f65bdb8fSBarry Smith    seealso: PetscObjectComposedDataSetInt()
9562755792SVictor Eijkhout 
9662755792SVictor Eijkhout @*/
977087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
98e5c89e4eSSatish Balay {
99e5c89e4eSSatish Balay   PetscFunctionBegin;
100e5c89e4eSSatish Balay   *id = globalcurrentstate++;
101e5c89e4eSSatish Balay   if (globalcurrentstate > globalmaxstate) globalmaxstate += 10;
102e5c89e4eSSatish Balay   PetscFunctionReturn(0);
103e5c89e4eSSatish Balay }
104e5c89e4eSSatish Balay 
10553c77d0aSJed Brown #undef __FUNCT__
10653c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseInt"
1077087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
108e5c89e4eSSatish Balay {
109e5c89e4eSSatish Balay   PetscInt       *ar = obj->intcomposeddata,*new_ar;
110e5c89e4eSSatish Balay   PetscInt       *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i;
111e5c89e4eSSatish Balay   PetscErrorCode ierr;
112e5c89e4eSSatish Balay 
113e5c89e4eSSatish Balay   PetscFunctionBegin;
114e5c89e4eSSatish Balay   new_n = globalmaxstate;
115e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
116e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
117e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
118e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
119e5c89e4eSSatish Balay   if (n) {
120e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
121e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
122e5c89e4eSSatish Balay     }
123e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
124e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
125e5c89e4eSSatish Balay   }
126e5c89e4eSSatish Balay   obj->int_idmax = new_n;
127e5c89e4eSSatish Balay   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
128e5c89e4eSSatish Balay   PetscFunctionReturn(0);
129e5c89e4eSSatish Balay }
13053c77d0aSJed Brown 
13153c77d0aSJed Brown #undef __FUNCT__
13253c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar"
1337087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
134e5c89e4eSSatish Balay {
135e5c89e4eSSatish Balay   PetscInt       **ar = obj->intstarcomposeddata,**new_ar;
136e5c89e4eSSatish Balay   PetscInt       *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i;
137e5c89e4eSSatish Balay   PetscErrorCode ierr;
138e5c89e4eSSatish Balay 
139e5c89e4eSSatish Balay   PetscFunctionBegin;
140e5c89e4eSSatish Balay   new_n = globalmaxstate;
141e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
142e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
143e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
144e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
145e5c89e4eSSatish Balay   if (n) {
146e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
147e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
148e5c89e4eSSatish Balay     }
149e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
150e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
151e5c89e4eSSatish Balay   }
152e5c89e4eSSatish Balay   obj->intstar_idmax = new_n;
153e5c89e4eSSatish Balay   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
154e5c89e4eSSatish Balay   PetscFunctionReturn(0);
155e5c89e4eSSatish Balay }
156e5c89e4eSSatish Balay 
15753c77d0aSJed Brown #undef __FUNCT__
15853c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
1597087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
160e5c89e4eSSatish Balay {
161e5c89e4eSSatish Balay   PetscReal      *ar = obj->realcomposeddata,*new_ar;
162e5c89e4eSSatish Balay   PetscInt       *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i;
163e5c89e4eSSatish Balay   PetscErrorCode ierr;
164e5c89e4eSSatish Balay 
165e5c89e4eSSatish Balay   PetscFunctionBegin;
166e5c89e4eSSatish Balay   new_n = globalmaxstate;
167e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
168e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
169e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
170e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
171e5c89e4eSSatish Balay   if (n) {
172e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
173e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
174e5c89e4eSSatish Balay     }
175e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
176e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
177e5c89e4eSSatish Balay   }
178e5c89e4eSSatish Balay   obj->real_idmax = new_n;
179e5c89e4eSSatish Balay   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
180e5c89e4eSSatish Balay   PetscFunctionReturn(0);
181e5c89e4eSSatish Balay }
182e5c89e4eSSatish Balay 
18353c77d0aSJed Brown #undef __FUNCT__
18453c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
1857087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
186e5c89e4eSSatish Balay {
187e5c89e4eSSatish Balay   PetscReal      **ar = obj->realstarcomposeddata,**new_ar;
188e5c89e4eSSatish Balay   PetscInt       *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i;
189e5c89e4eSSatish Balay   PetscErrorCode ierr;
190e5c89e4eSSatish Balay 
191e5c89e4eSSatish Balay   PetscFunctionBegin;
192e5c89e4eSSatish Balay   new_n = globalmaxstate;
193e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
194e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
195e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
196e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
197e5c89e4eSSatish Balay   if (n) {
198e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
199e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
200e5c89e4eSSatish Balay     }
201e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
202e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
203e5c89e4eSSatish Balay   }
204e5c89e4eSSatish Balay   obj->realstar_idmax = new_n;
205e5c89e4eSSatish Balay   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
206e5c89e4eSSatish Balay   PetscFunctionReturn(0);
207e5c89e4eSSatish Balay }
208e5c89e4eSSatish Balay 
20953c77d0aSJed Brown #undef __FUNCT__
21053c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
2117087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
212e5c89e4eSSatish Balay {
213e5c89e4eSSatish Balay   PetscScalar    *ar = obj->scalarcomposeddata,*new_ar;
214e5c89e4eSSatish Balay   PetscInt       *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i;
215e5c89e4eSSatish Balay   PetscErrorCode ierr;
216e5c89e4eSSatish Balay 
217e5c89e4eSSatish Balay   PetscFunctionBegin;
218e5c89e4eSSatish Balay   new_n = globalmaxstate;
219e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
220e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
221e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
222e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
223e5c89e4eSSatish Balay   if (n) {
224e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
225e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
226e5c89e4eSSatish Balay     }
227e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
228e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
229e5c89e4eSSatish Balay   }
230e5c89e4eSSatish Balay   obj->scalar_idmax = new_n;
231e5c89e4eSSatish Balay   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
232e5c89e4eSSatish Balay   PetscFunctionReturn(0);
233e5c89e4eSSatish Balay }
234e5c89e4eSSatish Balay 
23553c77d0aSJed Brown #undef __FUNCT__
23653c77d0aSJed Brown #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
2377087cfbeSBarry Smith PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
238e5c89e4eSSatish Balay {
239e5c89e4eSSatish Balay   PetscScalar    **ar = obj->scalarstarcomposeddata,**new_ar;
240e5c89e4eSSatish Balay   PetscInt       *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i;
241e5c89e4eSSatish Balay   PetscErrorCode ierr;
242e5c89e4eSSatish Balay 
243e5c89e4eSSatish Balay   PetscFunctionBegin;
244e5c89e4eSSatish Balay   new_n = globalmaxstate;
245e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
246e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
247e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
248e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
249e5c89e4eSSatish Balay   if (n) {
250e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
251e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
252e5c89e4eSSatish Balay     }
253e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
254e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
255e5c89e4eSSatish Balay   }
256e5c89e4eSSatish Balay   obj->scalarstar_idmax = new_n;
257e5c89e4eSSatish Balay   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
258e5c89e4eSSatish Balay   PetscFunctionReturn(0);
259e5c89e4eSSatish Balay }
260e5c89e4eSSatish Balay 
261