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