xref: /petsc/src/sys/objects/state.c (revision f65bdb8f47273a38e92be74ee3024b527bd81dc9)
1e5c89e4eSSatish Balay #define PETSC_DLL
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 
30*f65bdb8fSBarry Smith    seealso: PetscObjectStateIncrease(), PetscObjectSetState()
31e5c89e4eSSatish Balay 
32e5c89e4eSSatish Balay    Concepts: state
33e5c89e4eSSatish Balay 
34e5c89e4eSSatish Balay @*/
35e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT 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 
65*f65bdb8fSBarry Smith    seealso: PetscObjectStateQuery(),PetscObjectStateIncrease()
66e5c89e4eSSatish Balay 
67e5c89e4eSSatish Balay    Concepts: state
68e5c89e4eSSatish Balay 
69e5c89e4eSSatish Balay @*/
70e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT 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 
78e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT globalcurrentstate = 0;
79e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT globalmaxstate = 10;
8062755792SVictor Eijkhout /*@C
8162755792SVictor Eijkhout    PetscObjectComposedDataRegister - Get an available id for
8262755792SVictor Eijkhout    composed data
8362755792SVictor Eijkhout 
8462755792SVictor Eijkhout    Not Collective
8562755792SVictor Eijkhout 
8662755792SVictor Eijkhout    Output parameter:
8762755792SVictor Eijkhout .  id - an identifier under which data can be stored
8862755792SVictor Eijkhout 
8962755792SVictor Eijkhout    Level: developer
9062755792SVictor Eijkhout 
91*f65bdb8fSBarry Smith    seealso: PetscObjectComposedDataSetInt()
9262755792SVictor Eijkhout 
9362755792SVictor Eijkhout @*/
94e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataRegister(PetscInt *id)
95e5c89e4eSSatish Balay {
96e5c89e4eSSatish Balay   PetscFunctionBegin;
97e5c89e4eSSatish Balay   *id = globalcurrentstate++;
98e5c89e4eSSatish Balay   if (globalcurrentstate > globalmaxstate) globalmaxstate += 10;
99e5c89e4eSSatish Balay   PetscFunctionReturn(0);
100e5c89e4eSSatish Balay }
101e5c89e4eSSatish Balay 
102e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseInt(PetscObject obj)
103e5c89e4eSSatish Balay {
104e5c89e4eSSatish Balay   PetscInt       *ar = obj->intcomposeddata,*new_ar;
105e5c89e4eSSatish Balay   PetscInt       *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i;
106e5c89e4eSSatish Balay   PetscErrorCode ierr;
107e5c89e4eSSatish Balay 
108e5c89e4eSSatish Balay   PetscFunctionBegin;
109e5c89e4eSSatish Balay   new_n = globalmaxstate;
110e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
111e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
112e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
113e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
114e5c89e4eSSatish Balay   if (n) {
115e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
116e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
117e5c89e4eSSatish Balay     }
118e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
119e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
120e5c89e4eSSatish Balay   }
121e5c89e4eSSatish Balay   obj->int_idmax = new_n;
122e5c89e4eSSatish Balay   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
123e5c89e4eSSatish Balay   PetscFunctionReturn(0);
124e5c89e4eSSatish Balay }
125e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
126e5c89e4eSSatish Balay {
127e5c89e4eSSatish Balay   PetscInt       **ar = obj->intstarcomposeddata,**new_ar;
128e5c89e4eSSatish Balay   PetscInt       *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i;
129e5c89e4eSSatish Balay   PetscErrorCode ierr;
130e5c89e4eSSatish Balay 
131e5c89e4eSSatish Balay   PetscFunctionBegin;
132e5c89e4eSSatish Balay   new_n = globalmaxstate;
133e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
134e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
135e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
136e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
137e5c89e4eSSatish Balay   if (n) {
138e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
139e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
140e5c89e4eSSatish Balay     }
141e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
142e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
143e5c89e4eSSatish Balay   }
144e5c89e4eSSatish Balay   obj->intstar_idmax = new_n;
145e5c89e4eSSatish Balay   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
146e5c89e4eSSatish Balay   PetscFunctionReturn(0);
147e5c89e4eSSatish Balay }
148e5c89e4eSSatish Balay 
149e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseReal(PetscObject obj)
150e5c89e4eSSatish Balay {
151e5c89e4eSSatish Balay   PetscReal      *ar = obj->realcomposeddata,*new_ar;
152e5c89e4eSSatish Balay   PetscInt       *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i;
153e5c89e4eSSatish Balay   PetscErrorCode ierr;
154e5c89e4eSSatish Balay 
155e5c89e4eSSatish Balay   PetscFunctionBegin;
156e5c89e4eSSatish Balay   new_n = globalmaxstate;
157e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
158e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
159e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
160e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
161e5c89e4eSSatish Balay   if (n) {
162e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
163e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
164e5c89e4eSSatish Balay     }
165e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
166e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
167e5c89e4eSSatish Balay   }
168e5c89e4eSSatish Balay   obj->real_idmax = new_n;
169e5c89e4eSSatish Balay   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
170e5c89e4eSSatish Balay   PetscFunctionReturn(0);
171e5c89e4eSSatish Balay }
172e5c89e4eSSatish Balay 
173e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
174e5c89e4eSSatish Balay {
175e5c89e4eSSatish Balay   PetscReal      **ar = obj->realstarcomposeddata,**new_ar;
176e5c89e4eSSatish Balay   PetscInt       *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i;
177e5c89e4eSSatish Balay   PetscErrorCode ierr;
178e5c89e4eSSatish Balay 
179e5c89e4eSSatish Balay   PetscFunctionBegin;
180e5c89e4eSSatish Balay   new_n = globalmaxstate;
181e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
182e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
183e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
184e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
185e5c89e4eSSatish Balay   if (n) {
186e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
187e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
188e5c89e4eSSatish Balay     }
189e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
190e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
191e5c89e4eSSatish Balay   }
192e5c89e4eSSatish Balay   obj->realstar_idmax = new_n;
193e5c89e4eSSatish Balay   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
194e5c89e4eSSatish Balay   PetscFunctionReturn(0);
195e5c89e4eSSatish Balay }
196e5c89e4eSSatish Balay 
197e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalar(PetscObject obj)
198e5c89e4eSSatish Balay {
199e5c89e4eSSatish Balay   PetscScalar    *ar = obj->scalarcomposeddata,*new_ar;
200e5c89e4eSSatish Balay   PetscInt       *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i;
201e5c89e4eSSatish Balay   PetscErrorCode ierr;
202e5c89e4eSSatish Balay 
203e5c89e4eSSatish Balay   PetscFunctionBegin;
204e5c89e4eSSatish Balay   new_n = globalmaxstate;
205e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
206e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
207e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
208e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
209e5c89e4eSSatish Balay   if (n) {
210e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
211e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
212e5c89e4eSSatish Balay     }
213e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
214e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
215e5c89e4eSSatish Balay   }
216e5c89e4eSSatish Balay   obj->scalar_idmax = new_n;
217e5c89e4eSSatish Balay   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
218e5c89e4eSSatish Balay   PetscFunctionReturn(0);
219e5c89e4eSSatish Balay }
220e5c89e4eSSatish Balay 
221e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
222e5c89e4eSSatish Balay {
223e5c89e4eSSatish Balay   PetscScalar    **ar = obj->scalarstarcomposeddata,**new_ar;
224e5c89e4eSSatish Balay   PetscInt       *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i;
225e5c89e4eSSatish Balay   PetscErrorCode ierr;
226e5c89e4eSSatish Balay 
227e5c89e4eSSatish Balay   PetscFunctionBegin;
228e5c89e4eSSatish Balay   new_n = globalmaxstate;
229e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
230e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
231e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
232e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
233e5c89e4eSSatish Balay   if (n) {
234e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
235e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
236e5c89e4eSSatish Balay     }
237e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
238e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
239e5c89e4eSSatish Balay   }
240e5c89e4eSSatish Balay   obj->scalarstar_idmax = new_n;
241e5c89e4eSSatish Balay   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
242e5c89e4eSSatish Balay   PetscFunctionReturn(0);
243e5c89e4eSSatish Balay }
244e5c89e4eSSatish Balay 
245