xref: /petsc/src/sys/objects/state.c (revision 341eb7169d33e80a5a81ed315fe533155a103ae2)
1 
2 /*
3      Provides utility routines for manulating any type of PETSc object.
4 */
5 #include <petsc-private/petscimpl.h>  /*I   "petscsys.h"    I*/
6 
7 #undef __FUNCT__
8 #define __FUNCT__ "PetscObjectStateGet"
9 /*@C
10    PetscObjectStateGet - Gets the state of any PetscObject,
11    regardless of the type.
12 
13    Not Collective
14 
15    Input Parameter:
16 .  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
17          cast with a (PetscObject), for example,
18          PetscObjectStateGet((PetscObject)mat,&state);
19 
20    Output Parameter:
21 .  state - the object state
22 
23    Notes: object state is an integer which gets increased every time
24    the object is changed. By saving and later querying the object state
25    one can determine whether information about the object is still current.
26    Currently, state is maintained for Vec and Mat objects.
27 
28    Level: advanced
29 
30    seealso: PetscObjectStateIncrease(), PetscObjectStateSet()
31 
32    Concepts: state
33 
34 @*/
35 PetscErrorCode PetscObjectStateGet(PetscObject obj,PetscObjectState *state)
36 {
37   PetscFunctionBegin;
38   PetscValidHeader(obj,1);
39   PetscValidIntPointer(state,2);
40   *state = obj->state;
41   PetscFunctionReturn(0);
42 }
43 
44 #undef __FUNCT__
45 #define __FUNCT__ "PetscObjectStateSet"
46 /*@C
47    PetscObjectStateSet - Sets the state of any PetscObject,
48    regardless of the type.
49 
50    Logically Collective
51 
52    Input Parameter:
53 +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
54          cast with a (PetscObject), for example,
55          PetscObjectStateSet((PetscObject)mat,state);
56 -  state - the object state
57 
58    Notes: This function should be used with extreme caution. There is
59    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
60    which increases the state, but does not alter the data, then this
61    routine can be used to reset the state.  Such a reset must be collective.
62 
63    Level: advanced
64 
65    seealso: PetscObjectStateGet(),PetscObjectStateIncrease()
66 
67    Concepts: state
68 
69 @*/
70 PetscErrorCode PetscObjectStateSet(PetscObject obj,PetscObjectState state)
71 {
72   PetscFunctionBegin;
73   PetscValidHeader(obj,1);
74   obj->state = state;
75   PetscFunctionReturn(0);
76 }
77 
78 PetscInt PetscObjectComposedDataMax = 10;
79 
80 #undef __FUNCT__
81 #define __FUNCT__ "PetscObjectComposedDataRegister"
82 /*@C
83    PetscObjectComposedDataRegister - Get an available id for
84    composed data
85 
86    Not Collective
87 
88    Output parameter:
89 .  id - an identifier under which data can be stored
90 
91    Level: developer
92 
93    seealso: PetscObjectComposedDataSetInt()
94 
95 @*/
96 PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
97 {
98   static PetscInt globalcurrentstate = 0;
99 
100   PetscFunctionBegin;
101   *id = globalcurrentstate++;
102   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
103   PetscFunctionReturn(0);
104 }
105 
106 #undef __FUNCT__
107 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt"
108 PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
109 {
110   PetscInt         *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i;
111   PetscObjectState *ir = obj->intcomposedstate,*new_ir;
112   PetscErrorCode   ierr;
113 
114   PetscFunctionBegin;
115   new_n = PetscObjectComposedDataMax;
116   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
117   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
118   ierr  = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr);
119   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr);
120   if (n) {
121     for (i=0; i<n; i++) {
122       new_ar[i] = ar[i]; new_ir[i] = ir[i];
123     }
124     ierr = PetscFree(ar);CHKERRQ(ierr);
125     ierr = PetscFree(ir);CHKERRQ(ierr);
126   }
127   obj->int_idmax       = new_n;
128   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
129   PetscFunctionReturn(0);
130 }
131 
132 #undef __FUNCT__
133 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar"
134 PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
135 {
136   PetscInt         **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i;
137   PetscObjectState *ir  = obj->intstarcomposedstate,*new_ir;
138   PetscErrorCode   ierr;
139 
140   PetscFunctionBegin;
141   new_n = PetscObjectComposedDataMax;
142   ierr  = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
143   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
144   ierr  = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr);
145   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr);
146   if (n) {
147     for (i=0; i<n; i++) {
148       new_ar[i] = ar[i]; new_ir[i] = ir[i];
149     }
150     ierr = PetscFree(ar);CHKERRQ(ierr);
151     ierr = PetscFree(ir);CHKERRQ(ierr);
152   }
153   obj->intstar_idmax       = new_n;
154   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
155   PetscFunctionReturn(0);
156 }
157 
158 #undef __FUNCT__
159 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
160 PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
161 {
162   PetscReal        *ar = obj->realcomposeddata,*new_ar;
163   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
164   PetscInt         n   = obj->real_idmax,new_n,i;
165   PetscErrorCode   ierr;
166 
167   PetscFunctionBegin;
168   new_n = PetscObjectComposedDataMax;
169   ierr  = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
170   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
171   ierr  = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr);
172   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr);
173   if (n) {
174     for (i=0; i<n; i++) {
175       new_ar[i] = ar[i]; new_ir[i] = ir[i];
176     }
177     ierr = PetscFree(ar);CHKERRQ(ierr);
178     ierr = PetscFree(ir);CHKERRQ(ierr);
179   }
180   obj->real_idmax       = new_n;
181   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
182   PetscFunctionReturn(0);
183 }
184 
185 #undef __FUNCT__
186 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
187 PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
188 {
189   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
190   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
191   PetscInt         n    = obj->realstar_idmax,new_n,i;
192   PetscErrorCode   ierr;
193 
194   PetscFunctionBegin;
195   new_n = PetscObjectComposedDataMax;
196   ierr  = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
197   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
198   ierr  = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr);
199   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr);
200   if (n) {
201     for (i=0; i<n; i++) {
202       new_ar[i] = ar[i]; new_ir[i] = ir[i];
203     }
204     ierr = PetscFree(ar);CHKERRQ(ierr);
205     ierr = PetscFree(ir);CHKERRQ(ierr);
206   }
207   obj->realstar_idmax       = new_n;
208   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
209   PetscFunctionReturn(0);
210 }
211 
212 #undef __FUNCT__
213 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
214 PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
215 {
216   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
217   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
218   PetscInt         n   = obj->scalar_idmax,new_n,i;
219   PetscErrorCode   ierr;
220 
221   PetscFunctionBegin;
222   new_n = PetscObjectComposedDataMax;
223   ierr  = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
224   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
225   ierr  = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr);
226   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr);
227   if (n) {
228     for (i=0; i<n; i++) {
229       new_ar[i] = ar[i]; new_ir[i] = ir[i];
230     }
231     ierr = PetscFree(ar);CHKERRQ(ierr);
232     ierr = PetscFree(ir);CHKERRQ(ierr);
233   }
234   obj->scalar_idmax       = new_n;
235   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
236   PetscFunctionReturn(0);
237 }
238 
239 #undef __FUNCT__
240 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
241 PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
242 {
243   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
244   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
245   PetscInt         n    = obj->scalarstar_idmax,new_n,i;
246   PetscErrorCode   ierr;
247 
248   PetscFunctionBegin;
249   new_n = PetscObjectComposedDataMax;
250   ierr  = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
251   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
252   ierr  = PetscMalloc(new_n*sizeof(PetscObjectState),&new_ir);CHKERRQ(ierr);
253   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscObjectState));CHKERRQ(ierr);
254   if (n) {
255     for (i=0; i<n; i++) {
256       new_ar[i] = ar[i]; new_ir[i] = ir[i];
257     }
258     ierr = PetscFree(ar);CHKERRQ(ierr);
259     ierr = PetscFree(ir);CHKERRQ(ierr);
260   }
261   obj->scalarstar_idmax       = new_n;
262   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
263   PetscFunctionReturn(0);
264 }
265 
266 #undef __FUNCT__
267 #define __FUNCT__ "PetscObjectGetId"
268 /*@
269    PetscObjectGetId - get unique object ID
270 
271    Not Collective
272 
273    Input Arguments:
274 .  obj - object
275 
276    Output Arguments:
277 .  id - integer ID
278 
279    Level: developer
280 
281    Notes:
282    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
283 
284 .seealso: PetscObjectStateGet()
285 @*/
286 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
287 {
288 
289   PetscFunctionBegin;
290   *id = obj->id;
291   PetscFunctionReturn(0);
292 }
293