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