xref: /petsc/src/sys/objects/state.c (revision b00a91154f763f12aa55f3d53a3f2776f15f49e3)
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  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
117   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
118   if (n) {
119     for (i=0; i<n; i++) {
120       new_ar[i] = ar[i]; new_ir[i] = ir[i];
121     }
122     ierr = PetscFree(ar);CHKERRQ(ierr);
123     ierr = PetscFree(ir);CHKERRQ(ierr);
124   }
125   obj->int_idmax       = new_n;
126   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
127   PetscFunctionReturn(0);
128 }
129 
130 #undef __FUNCT__
131 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar"
132 PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
133 {
134   PetscInt         **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n,i;
135   PetscObjectState *ir  = obj->intstarcomposedstate,*new_ir;
136   PetscErrorCode   ierr;
137 
138   PetscFunctionBegin;
139   new_n = PetscObjectComposedDataMax;
140   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
141   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
142   if (n) {
143     for (i=0; i<n; i++) {
144       new_ar[i] = ar[i]; new_ir[i] = ir[i];
145     }
146     ierr = PetscFree(ar);CHKERRQ(ierr);
147     ierr = PetscFree(ir);CHKERRQ(ierr);
148   }
149   obj->intstar_idmax       = new_n;
150   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
151   PetscFunctionReturn(0);
152 }
153 
154 #undef __FUNCT__
155 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
156 PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
157 {
158   PetscReal        *ar = obj->realcomposeddata,*new_ar;
159   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
160   PetscInt         n   = obj->real_idmax,new_n,i;
161   PetscErrorCode   ierr;
162 
163   PetscFunctionBegin;
164   new_n = PetscObjectComposedDataMax;
165   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
166   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
167   if (n) {
168     for (i=0; i<n; i++) {
169       new_ar[i] = ar[i]; new_ir[i] = ir[i];
170     }
171     ierr = PetscFree(ar);CHKERRQ(ierr);
172     ierr = PetscFree(ir);CHKERRQ(ierr);
173   }
174   obj->real_idmax       = new_n;
175   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
176   PetscFunctionReturn(0);
177 }
178 
179 #undef __FUNCT__
180 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
181 PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
182 {
183   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
184   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
185   PetscInt         n    = obj->realstar_idmax,new_n,i;
186   PetscErrorCode   ierr;
187 
188   PetscFunctionBegin;
189   new_n = PetscObjectComposedDataMax;
190   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
191   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
192   if (n) {
193     for (i=0; i<n; i++) {
194       new_ar[i] = ar[i]; new_ir[i] = ir[i];
195     }
196     ierr = PetscFree(ar);CHKERRQ(ierr);
197     ierr = PetscFree(ir);CHKERRQ(ierr);
198   }
199   obj->realstar_idmax       = new_n;
200   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
201   PetscFunctionReturn(0);
202 }
203 
204 #undef __FUNCT__
205 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
206 PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
207 {
208   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
209   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
210   PetscInt         n   = obj->scalar_idmax,new_n,i;
211   PetscErrorCode   ierr;
212 
213   PetscFunctionBegin;
214   new_n = PetscObjectComposedDataMax;
215   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
216   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
217   if (n) {
218     for (i=0; i<n; i++) {
219       new_ar[i] = ar[i]; new_ir[i] = ir[i];
220     }
221     ierr = PetscFree(ar);CHKERRQ(ierr);
222     ierr = PetscFree(ir);CHKERRQ(ierr);
223   }
224   obj->scalar_idmax       = new_n;
225   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
226   PetscFunctionReturn(0);
227 }
228 
229 #undef __FUNCT__
230 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
231 PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
232 {
233   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
234   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
235   PetscInt         n    = obj->scalarstar_idmax,new_n,i;
236   PetscErrorCode   ierr;
237 
238   PetscFunctionBegin;
239   new_n = PetscObjectComposedDataMax;
240   ierr  = PetscCalloc1(new_n,&new_ar);CHKERRQ(ierr);
241   ierr  = PetscCalloc1(new_n,&new_ir);CHKERRQ(ierr);
242   if (n) {
243     for (i=0; i<n; i++) {
244       new_ar[i] = ar[i]; new_ir[i] = ir[i];
245     }
246     ierr = PetscFree(ar);CHKERRQ(ierr);
247     ierr = PetscFree(ir);CHKERRQ(ierr);
248   }
249   obj->scalarstar_idmax       = new_n;
250   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
251   PetscFunctionReturn(0);
252 }
253 
254 #undef __FUNCT__
255 #define __FUNCT__ "PetscObjectGetId"
256 /*@
257    PetscObjectGetId - get unique object ID
258 
259    Not Collective
260 
261    Input Arguments:
262 .  obj - object
263 
264    Output Arguments:
265 .  id - integer ID
266 
267    Level: developer
268 
269    Notes:
270    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
271 
272 .seealso: PetscObjectStateGet()
273 @*/
274 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
275 {
276 
277   PetscFunctionBegin;
278   *id = obj->id;
279   PetscFunctionReturn(0);
280 }
281