xref: /petsc/src/sys/objects/state.c (revision fe998a80077c9ee0917a39496df43fc256e1b478)
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 composed data
84 
85    Not Collective
86 
87    Output parameter:
88 .  id - an identifier under which data can be stored
89 
90    Level: developer
91 
92    Notes: You must keep this value (for example in a global variable) in order to attach the data to an object or
93           access in an object.
94 
95    seealso: PetscObjectComposedDataSetInt()
96 
97 @*/
98 PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
99 {
100   static PetscInt globalcurrentstate = 0;
101 
102   PetscFunctionBegin;
103   *id = globalcurrentstate++;
104   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
105   PetscFunctionReturn(0);
106 }
107 
108 #undef __FUNCT__
109 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt"
110 PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
111 {
112   PetscInt         *ar = obj->intcomposeddata,*new_ar,n = obj->int_idmax,new_n,i;
113   PetscObjectState *ir = obj->intcomposedstate,*new_ir;
114   PetscErrorCode   ierr;
115 
116   PetscFunctionBegin;
117   new_n = PetscObjectComposedDataMax;
118   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
119   ierr  = PetscCalloc1(new_n,&new_ir);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  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
143   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
144   if (n) {
145     for (i=0; i<n; i++) {
146       new_ar[i] = ar[i]; new_ir[i] = ir[i];
147     }
148     ierr = PetscFree(ar);CHKERRQ(ierr);
149     ierr = PetscFree(ir);CHKERRQ(ierr);
150   }
151   obj->intstar_idmax       = new_n;
152   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
153   PetscFunctionReturn(0);
154 }
155 
156 #undef __FUNCT__
157 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
158 PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
159 {
160   PetscReal        *ar = obj->realcomposeddata,*new_ar;
161   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
162   PetscInt         n   = obj->real_idmax,new_n,i;
163   PetscErrorCode   ierr;
164 
165   PetscFunctionBegin;
166   new_n = PetscObjectComposedDataMax;
167   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
168   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
169   if (n) {
170     for (i=0; i<n; i++) {
171       new_ar[i] = ar[i]; new_ir[i] = ir[i];
172     }
173     ierr = PetscFree(ar);CHKERRQ(ierr);
174     ierr = PetscFree(ir);CHKERRQ(ierr);
175   }
176   obj->real_idmax       = new_n;
177   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
178   PetscFunctionReturn(0);
179 }
180 
181 #undef __FUNCT__
182 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
183 PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
184 {
185   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
186   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
187   PetscInt         n    = obj->realstar_idmax,new_n,i;
188   PetscErrorCode   ierr;
189 
190   PetscFunctionBegin;
191   new_n = PetscObjectComposedDataMax;
192   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
193   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
194   if (n) {
195     for (i=0; i<n; i++) {
196       new_ar[i] = ar[i]; new_ir[i] = ir[i];
197     }
198     ierr = PetscFree(ar);CHKERRQ(ierr);
199     ierr = PetscFree(ir);CHKERRQ(ierr);
200   }
201   obj->realstar_idmax       = new_n;
202   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
203   PetscFunctionReturn(0);
204 }
205 
206 #undef __FUNCT__
207 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
208 PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
209 {
210   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
211   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
212   PetscInt         n   = obj->scalar_idmax,new_n,i;
213   PetscErrorCode   ierr;
214 
215   PetscFunctionBegin;
216   new_n = PetscObjectComposedDataMax;
217   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
218   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
219   if (n) {
220     for (i=0; i<n; i++) {
221       new_ar[i] = ar[i]; new_ir[i] = ir[i];
222     }
223     ierr = PetscFree(ar);CHKERRQ(ierr);
224     ierr = PetscFree(ir);CHKERRQ(ierr);
225   }
226   obj->scalar_idmax       = new_n;
227   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
228   PetscFunctionReturn(0);
229 }
230 
231 #undef __FUNCT__
232 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
233 PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
234 {
235   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
236   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
237   PetscInt         n    = obj->scalarstar_idmax,new_n,i;
238   PetscErrorCode   ierr;
239 
240   PetscFunctionBegin;
241   new_n = PetscObjectComposedDataMax;
242   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
243   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
244   if (n) {
245     for (i=0; i<n; i++) {
246       new_ar[i] = ar[i]; new_ir[i] = ir[i];
247     }
248     ierr = PetscFree(ar);CHKERRQ(ierr);
249     ierr = PetscFree(ir);CHKERRQ(ierr);
250   }
251   obj->scalarstar_idmax       = new_n;
252   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
253   PetscFunctionReturn(0);
254 }
255 
256 #undef __FUNCT__
257 #define __FUNCT__ "PetscObjectGetId"
258 /*@
259    PetscObjectGetId - get unique object ID
260 
261    Not Collective
262 
263    Input Arguments:
264 .  obj - object
265 
266    Output Arguments:
267 .  id - integer ID
268 
269    Level: developer
270 
271    Notes:
272    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
273 
274 .seealso: PetscObjectStateGet()
275 @*/
276 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
277 {
278 
279   PetscFunctionBegin;
280   *id = obj->id;
281   PetscFunctionReturn(0);
282 }
283