xref: /petsc/src/sys/objects/state.c (revision 6275579280c89a99c951cfeb6a7cf4d92a141991)
1e5c89e4eSSatish Balay #define PETSC_DLL
2e5c89e4eSSatish Balay /*
3e5c89e4eSSatish Balay      Provides utility routines for manulating any type of PETSc object.
4e5c89e4eSSatish Balay */
5e5c89e4eSSatish Balay #include "petsc.h"  /*I   "petsc.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 
30e5c89e4eSSatish Balay    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;
38e5c89e4eSSatish Balay   if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT,"Null object");
39e5c89e4eSSatish Balay   *state = obj->state;
40e5c89e4eSSatish Balay   PetscFunctionReturn(0);
41e5c89e4eSSatish Balay }
42e5c89e4eSSatish Balay 
43e5c89e4eSSatish Balay #undef __FUNCT__
44e5c89e4eSSatish Balay #define __FUNCT__ "PetscObjectSetState"
45e5c89e4eSSatish Balay /*@C
46e5c89e4eSSatish Balay    PetscObjectSetState - Sets the state of any PetscObject,
47e5c89e4eSSatish Balay    regardless of the type.
48e5c89e4eSSatish Balay 
49e5c89e4eSSatish Balay    Not Collective
50e5c89e4eSSatish Balay 
51e5c89e4eSSatish Balay    Input Parameter:
52e5c89e4eSSatish Balay +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
53e5c89e4eSSatish Balay          cast with a (PetscObject), for example,
54e5c89e4eSSatish Balay          PetscObjectSetState((PetscObject)mat,state);
55e5c89e4eSSatish Balay -  state - the object state
56e5c89e4eSSatish Balay 
57e5c89e4eSSatish Balay    Notes: This function should be used with extreme caution. There is
58e5c89e4eSSatish Balay    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
59e5c89e4eSSatish Balay    which increases the state, but does not alter the data, then this
60e5c89e4eSSatish Balay    routine can be used to reset the state.
61e5c89e4eSSatish Balay 
62e5c89e4eSSatish Balay    Level: advanced
63e5c89e4eSSatish Balay 
64e5c89e4eSSatish Balay    seealso: PetscObjectStateQuery,PetscObjectStateIncrease
65e5c89e4eSSatish Balay 
66e5c89e4eSSatish Balay    Concepts: state
67e5c89e4eSSatish Balay 
68e5c89e4eSSatish Balay @*/
69e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectSetState(PetscObject obj,PetscInt state)
70e5c89e4eSSatish Balay {
71e5c89e4eSSatish Balay   PetscFunctionBegin;
72e5c89e4eSSatish Balay   if (!obj) SETERRQ(PETSC_ERR_ARG_CORRUPT,"Null object");
73e5c89e4eSSatish Balay   obj->state = state;
74e5c89e4eSSatish Balay   PetscFunctionReturn(0);
75e5c89e4eSSatish Balay }
76e5c89e4eSSatish Balay 
77e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT globalcurrentstate = 0;
78e5c89e4eSSatish Balay PetscInt PETSC_DLLEXPORT globalmaxstate = 10;
79*62755792SVictor Eijkhout /*@C
80*62755792SVictor Eijkhout    PetscObjectComposedDataRegister - Get an available id for
81*62755792SVictor Eijkhout    composed data
82*62755792SVictor Eijkhout 
83*62755792SVictor Eijkhout    Not Collective
84*62755792SVictor Eijkhout 
85*62755792SVictor Eijkhout    Output parameter:
86*62755792SVictor Eijkhout .  id - an identifier under which data can be stored
87*62755792SVictor Eijkhout 
88*62755792SVictor Eijkhout    Level: developer
89*62755792SVictor Eijkhout 
90*62755792SVictor Eijkhout    seealso: PetscObjectComposedDataSetInt
91*62755792SVictor Eijkhout 
92*62755792SVictor Eijkhout @*/
93e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataRegister(PetscInt *id)
94e5c89e4eSSatish Balay {
95e5c89e4eSSatish Balay   PetscFunctionBegin;
96e5c89e4eSSatish Balay   *id = globalcurrentstate++;
97e5c89e4eSSatish Balay   if (globalcurrentstate > globalmaxstate) globalmaxstate += 10;
98e5c89e4eSSatish Balay   PetscFunctionReturn(0);
99e5c89e4eSSatish Balay }
100e5c89e4eSSatish Balay 
101e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseInt(PetscObject obj)
102e5c89e4eSSatish Balay {
103e5c89e4eSSatish Balay   PetscInt       *ar = obj->intcomposeddata,*new_ar;
104e5c89e4eSSatish Balay   PetscInt       *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i;
105e5c89e4eSSatish Balay   PetscErrorCode ierr;
106e5c89e4eSSatish Balay 
107e5c89e4eSSatish Balay   PetscFunctionBegin;
108e5c89e4eSSatish Balay   new_n = globalmaxstate;
109e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
110e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
111e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
112e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
113e5c89e4eSSatish Balay   if (n) {
114e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
115e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
116e5c89e4eSSatish Balay     }
117e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
118e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
119e5c89e4eSSatish Balay   }
120e5c89e4eSSatish Balay   obj->int_idmax = new_n;
121e5c89e4eSSatish Balay   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
122e5c89e4eSSatish Balay   PetscFunctionReturn(0);
123e5c89e4eSSatish Balay }
124e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
125e5c89e4eSSatish Balay {
126e5c89e4eSSatish Balay   PetscInt       **ar = obj->intstarcomposeddata,**new_ar;
127e5c89e4eSSatish Balay   PetscInt       *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i;
128e5c89e4eSSatish Balay   PetscErrorCode ierr;
129e5c89e4eSSatish Balay 
130e5c89e4eSSatish Balay   PetscFunctionBegin;
131e5c89e4eSSatish Balay   new_n = globalmaxstate;
132e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
133e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
134e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
135e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
136e5c89e4eSSatish Balay   if (n) {
137e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
138e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
139e5c89e4eSSatish Balay     }
140e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
141e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
142e5c89e4eSSatish Balay   }
143e5c89e4eSSatish Balay   obj->intstar_idmax = new_n;
144e5c89e4eSSatish Balay   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
145e5c89e4eSSatish Balay   PetscFunctionReturn(0);
146e5c89e4eSSatish Balay }
147e5c89e4eSSatish Balay 
148e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseReal(PetscObject obj)
149e5c89e4eSSatish Balay {
150e5c89e4eSSatish Balay   PetscReal      *ar = obj->realcomposeddata,*new_ar;
151e5c89e4eSSatish Balay   PetscInt       *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i;
152e5c89e4eSSatish Balay   PetscErrorCode ierr;
153e5c89e4eSSatish Balay 
154e5c89e4eSSatish Balay   PetscFunctionBegin;
155e5c89e4eSSatish Balay   new_n = globalmaxstate;
156e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
157e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
158e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
159e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
160e5c89e4eSSatish Balay   if (n) {
161e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
162e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
163e5c89e4eSSatish Balay     }
164e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
165e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
166e5c89e4eSSatish Balay   }
167e5c89e4eSSatish Balay   obj->real_idmax = new_n;
168e5c89e4eSSatish Balay   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
169e5c89e4eSSatish Balay   PetscFunctionReturn(0);
170e5c89e4eSSatish Balay }
171e5c89e4eSSatish Balay 
172e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
173e5c89e4eSSatish Balay {
174e5c89e4eSSatish Balay   PetscReal      **ar = obj->realstarcomposeddata,**new_ar;
175e5c89e4eSSatish Balay   PetscInt       *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i;
176e5c89e4eSSatish Balay   PetscErrorCode ierr;
177e5c89e4eSSatish Balay 
178e5c89e4eSSatish Balay   PetscFunctionBegin;
179e5c89e4eSSatish Balay   new_n = globalmaxstate;
180e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
181e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
182e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
183e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
184e5c89e4eSSatish Balay   if (n) {
185e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
186e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
187e5c89e4eSSatish Balay     }
188e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
189e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
190e5c89e4eSSatish Balay   }
191e5c89e4eSSatish Balay   obj->realstar_idmax = new_n;
192e5c89e4eSSatish Balay   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
193e5c89e4eSSatish Balay   PetscFunctionReturn(0);
194e5c89e4eSSatish Balay }
195e5c89e4eSSatish Balay 
196e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalar(PetscObject obj)
197e5c89e4eSSatish Balay {
198e5c89e4eSSatish Balay   PetscScalar    *ar = obj->scalarcomposeddata,*new_ar;
199e5c89e4eSSatish Balay   PetscInt       *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i;
200e5c89e4eSSatish Balay   PetscErrorCode ierr;
201e5c89e4eSSatish Balay 
202e5c89e4eSSatish Balay   PetscFunctionBegin;
203e5c89e4eSSatish Balay   new_n = globalmaxstate;
204e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
205e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
206e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
207e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
208e5c89e4eSSatish Balay   if (n) {
209e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
210e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
211e5c89e4eSSatish Balay     }
212e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
213e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
214e5c89e4eSSatish Balay   }
215e5c89e4eSSatish Balay   obj->scalar_idmax = new_n;
216e5c89e4eSSatish Balay   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
217e5c89e4eSSatish Balay   PetscFunctionReturn(0);
218e5c89e4eSSatish Balay }
219e5c89e4eSSatish Balay 
220e5c89e4eSSatish Balay PetscErrorCode PETSC_DLLEXPORT PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
221e5c89e4eSSatish Balay {
222e5c89e4eSSatish Balay   PetscScalar    **ar = obj->scalarstarcomposeddata,**new_ar;
223e5c89e4eSSatish Balay   PetscInt       *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i;
224e5c89e4eSSatish Balay   PetscErrorCode ierr;
225e5c89e4eSSatish Balay 
226e5c89e4eSSatish Balay   PetscFunctionBegin;
227e5c89e4eSSatish Balay   new_n = globalmaxstate;
228e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
229e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
230e5c89e4eSSatish Balay   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
231e5c89e4eSSatish Balay   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
232e5c89e4eSSatish Balay   if (n) {
233e5c89e4eSSatish Balay     for (i=0; i<n; i++) {
234e5c89e4eSSatish Balay       new_ar[i] = ar[i]; new_ir[i] = ir[i];
235e5c89e4eSSatish Balay     }
236e5c89e4eSSatish Balay     ierr = PetscFree(ar);CHKERRQ(ierr);
237e5c89e4eSSatish Balay     ierr = PetscFree(ir);CHKERRQ(ierr);
238e5c89e4eSSatish Balay   }
239e5c89e4eSSatish Balay   obj->scalarstar_idmax = new_n;
240e5c89e4eSSatish Balay   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
241e5c89e4eSSatish Balay   PetscFunctionReturn(0);
242e5c89e4eSSatish Balay }
243e5c89e4eSSatish Balay 
244