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 @*/
PetscObjectStateGet(PetscObject obj,PetscObjectState * state)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 @*/
PetscObjectStateSet(PetscObject obj,PetscObjectState state)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 @*/
PetscObjectComposedDataRegister(PetscInt * id)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 
PetscObjectComposedDataIncreaseInt(PetscObject obj)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 
PetscObjectComposedDataIncreaseIntstar(PetscObject obj)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 
PetscObjectComposedDataIncreaseReal(PetscObject obj)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 
PetscObjectComposedDataIncreaseRealstar(PetscObject obj)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 
PetscObjectComposedDataIncreaseScalar(PetscObject obj)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 
PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)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 @*/
PetscObjectGetId(PetscObject obj,PetscObjectId * id)226 PetscErrorCode PetscObjectGetId(PetscObject obj,PetscObjectId *id)
227 {
228   PetscFunctionBegin;
229   *id = obj->id;
230   PetscFunctionReturn(0);
231 }
232 
233 /*@
234    PetscObjectCompareId - compares the objects ID with a given id
235 
236    Not Collective
237 
238    Input Arguments:
239 +  obj - object
240 -  id - integer ID
241 
242    Output Argument;
243 .  eq - the ids are equal
244 
245    Level: developer
246 
247    Notes:
248    The object ID may be different on different processes, but object IDs are never reused so local equality implies global equality.
249 
250 .seealso: PetscObjectStateGet(), PetscObjectGetId()
251 @*/
PetscObjectCompareId(PetscObject obj,PetscObjectId id,PetscBool * eq)252 PetscErrorCode PetscObjectCompareId(PetscObject obj,PetscObjectId id,PetscBool *eq)
253 {
254   PetscFunctionBegin;
255   *eq = (id == obj->id) ? PETSC_TRUE : PETSC_FALSE;
256   PetscFunctionReturn(0);
257 }
258