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