xref: /petsc/src/sys/objects/state.c (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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;
104   PetscObjectState *ir = obj->intcomposedstate,*new_ir;
105   PetscErrorCode   ierr;
106 
107   PetscFunctionBegin;
108   new_n = PetscObjectComposedDataMax;
109   ierr  = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr);
110   ierr  = PetscMemcpy(new_ar,ar,n*sizeof(PetscInt));CHKERRQ(ierr);
111   ierr  = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr);
112   ierr  = PetscFree2(ar,ir);CHKERRQ(ierr);
113   obj->int_idmax       = new_n;
114   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
115   PetscFunctionReturn(0);
116 }
117 
118 PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
119 {
120   PetscInt         **ar = obj->intstarcomposeddata,**new_ar,n = obj->intstar_idmax,new_n;
121   PetscObjectState *ir  = obj->intstarcomposedstate,*new_ir;
122   PetscErrorCode   ierr;
123 
124   PetscFunctionBegin;
125   new_n = PetscObjectComposedDataMax;
126   ierr  = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr);
127   ierr  = PetscMemcpy(new_ar,ar,n*sizeof(PetscInt*));CHKERRQ(ierr);
128   ierr  = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr);
129   ierr  = PetscFree2(ar,ir);CHKERRQ(ierr);
130   obj->intstar_idmax        = new_n;
131   obj->intstarcomposeddata  = new_ar;
132   obj->intstarcomposedstate = new_ir;
133   PetscFunctionReturn(0);
134 }
135 
136 PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
137 {
138   PetscReal        *ar = obj->realcomposeddata,*new_ar;
139   PetscObjectState *ir = obj->realcomposedstate,*new_ir;
140   PetscInt         n   = obj->real_idmax,new_n;
141   PetscErrorCode   ierr;
142 
143   PetscFunctionBegin;
144   new_n = PetscObjectComposedDataMax;
145   ierr  = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr);
146   ierr  = PetscMemcpy(new_ar,ar,n*sizeof(PetscReal));CHKERRQ(ierr);
147   ierr  = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr);
148   ierr  = PetscFree2(ar,ir);CHKERRQ(ierr);
149   obj->real_idmax       = new_n;
150   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
151   PetscFunctionReturn(0);
152 }
153 
154 PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
155 {
156   PetscReal        **ar = obj->realstarcomposeddata,**new_ar;
157   PetscObjectState *ir  = obj->realstarcomposedstate,*new_ir;
158   PetscInt         n    = obj->realstar_idmax,new_n;
159   PetscErrorCode   ierr;
160 
161   PetscFunctionBegin;
162   new_n = PetscObjectComposedDataMax;
163   ierr  = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr);
164   ierr  = PetscMemcpy(new_ar,ar,n*sizeof(PetscReal*));CHKERRQ(ierr);
165   ierr  = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr);
166   ierr  = PetscFree2(ar,ir);CHKERRQ(ierr);
167   obj->realstar_idmax       = new_n;
168   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
169   PetscFunctionReturn(0);
170 }
171 
172 PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
173 {
174   PetscScalar      *ar = obj->scalarcomposeddata,*new_ar;
175   PetscObjectState *ir = obj->scalarcomposedstate,*new_ir;
176   PetscInt         n   = obj->scalar_idmax,new_n;
177   PetscErrorCode   ierr;
178 
179   PetscFunctionBegin;
180   new_n = PetscObjectComposedDataMax;
181   ierr  = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr);
182   ierr  = PetscMemcpy(new_ar,ar,n*sizeof(PetscScalar));CHKERRQ(ierr);
183   ierr  = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr);
184   ierr  = PetscFree2(ar,ir);CHKERRQ(ierr);
185   obj->scalar_idmax       = new_n;
186   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
187   PetscFunctionReturn(0);
188 }
189 
190 PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
191 {
192   PetscScalar      **ar = obj->scalarstarcomposeddata,**new_ar;
193   PetscObjectState *ir  = obj->scalarstarcomposedstate,*new_ir;
194   PetscInt         n    = obj->scalarstar_idmax,new_n;
195   PetscErrorCode   ierr;
196 
197   PetscFunctionBegin;
198   new_n = PetscObjectComposedDataMax;
199   ierr  = PetscCalloc2(new_n,&new_ar,new_n,&new_ir);CHKERRQ(ierr);
200   ierr  = PetscMemcpy(new_ar,ar,n*sizeof(PetscScalar*));CHKERRQ(ierr);
201   ierr  = PetscMemcpy(new_ir,ir,n*sizeof(PetscObjectState));CHKERRQ(ierr);
202   ierr  = PetscFree2(ar,ir);CHKERRQ(ierr);
203   obj->scalarstar_idmax       = new_n;
204   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
205   PetscFunctionReturn(0);
206 }
207 
208 /*@
209    PetscObjectGetId - get unique object ID
210 
211    Not Collective
212 
213    Input Arguments:
214 .  obj - object
215 
216    Output Arguments:
217 .  id - integer ID
218 
219    Level: developer
220 
221    Notes:
222    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
223 
224 .seealso: PetscObjectStateGet(), PetscObjectCompareId()
225 @*/
226 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
227 {
228 
229   PetscFunctionBegin;
230   *id = obj->id;
231   PetscFunctionReturn(0);
232 }
233 
234 /*@
235    PetscObjectCompareId - compares the objects ID with a given id
236 
237    Not Collective
238 
239    Input Arguments:
240 +  obj - object
241 -  id - integer ID
242 
243    Output Argument;
244 .  eq - the ids are equal
245 
246    Level: developer
247 
248    Notes:
249    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
250 
251 .seealso: PetscObjectStateGet(), PetscObjectGetId()
252 @*/
253 PetscErrorCode PetscObjectCompareId(PetscObject obj,PetscObjectId id,PetscBool *eq)
254 {
255 
256   PetscFunctionBegin;
257   *eq = (id == obj->id) ? PETSC_TRUE : PETSC_FALSE;
258   PetscFunctionReturn(0);
259 }
260