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