xref: /petsc/src/sys/objects/state.c (revision 84df9cb40eca90ea9b18a456fab7a4ecc7f6c1a4)
1 
2 /*
3      Provides utility routines for manulating any type of PETSc object.
4 */
5 #include <petscsys.h>  /*I   "petscsys.h"    I*/
6 
7 #undef __FUNCT__
8 #define __FUNCT__ "PetscObjectStateQuery"
9 /*@C
10    PetscObjectStateQuery - Gets the state of any PetscObject,
11    regardless of the type.
12 
13    Not Collective
14 
15    Input Parameter:
16 .  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
17          cast with a (PetscObject), for example,
18          PetscObjectStateQuery((PetscObject)mat,&state);
19 
20    Output Parameter:
21 .  state - the object state
22 
23    Notes: object state is an integer which gets increased every time
24    the object is changed. By saving and later querying the object state
25    one can determine whether information about the object is still current.
26    Currently, state is maintained for Vec and Mat objects.
27 
28    Level: advanced
29 
30    seealso: PetscObjectStateIncrease(), PetscObjectSetState()
31 
32    Concepts: state
33 
34 @*/
35 PetscErrorCode  PetscObjectStateQuery(PetscObject obj,PetscInt *state)
36 {
37   PetscFunctionBegin;
38   PetscValidHeader(obj,1);
39   PetscValidIntPointer(state,2);
40   *state = obj->state;
41   PetscFunctionReturn(0);
42 }
43 
44 #undef __FUNCT__
45 #define __FUNCT__ "PetscObjectSetState"
46 /*@C
47    PetscObjectSetState - Sets the state of any PetscObject,
48    regardless of the type.
49 
50    Not Collective
51 
52    Input Parameter:
53 +  obj - any PETSc object, for example a Vec, Mat or KSP. This must be
54          cast with a (PetscObject), for example,
55          PetscObjectSetState((PetscObject)mat,state);
56 -  state - the object state
57 
58    Notes: This function should be used with extreme caution. There is
59    essentially only one use for it: if the user calls Mat(Vec)GetRow(Array),
60    which increases the state, but does not alter the data, then this
61    routine can be used to reset the state.
62 
63    Level: advanced
64 
65    seealso: PetscObjectStateQuery(),PetscObjectStateIncrease()
66 
67    Concepts: state
68 
69 @*/
70 PetscErrorCode  PetscObjectSetState(PetscObject obj,PetscInt state)
71 {
72   PetscFunctionBegin;
73   PetscValidHeader(obj,1);
74   obj->state = state;
75   PetscFunctionReturn(0);
76 }
77 
78 PetscInt  globalcurrentstate = 0;
79 PetscInt  globalmaxstate = 10;
80 
81 #undef __FUNCT__
82 #define __FUNCT__ "PetscObjectComposedDataRegister"
83 /*@C
84    PetscObjectComposedDataRegister - Get an available id for
85    composed data
86 
87    Not Collective
88 
89    Output parameter:
90 .  id - an identifier under which data can be stored
91 
92    Level: developer
93 
94    seealso: PetscObjectComposedDataSetInt()
95 
96 @*/
97 PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
98 {
99   PetscFunctionBegin;
100   *id = globalcurrentstate++;
101   if (globalcurrentstate > globalmaxstate) globalmaxstate += 10;
102   PetscFunctionReturn(0);
103 }
104 
105 #undef __FUNCT__
106 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt"
107 PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
108 {
109   PetscInt       *ar = obj->intcomposeddata,*new_ar;
110   PetscInt       *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i;
111   PetscErrorCode ierr;
112 
113   PetscFunctionBegin;
114   new_n = globalmaxstate;
115   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
116   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
117   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
118   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
119   if (n) {
120     for (i=0; i<n; i++) {
121       new_ar[i] = ar[i]; new_ir[i] = ir[i];
122     }
123     ierr = PetscFree(ar);CHKERRQ(ierr);
124     ierr = PetscFree(ir);CHKERRQ(ierr);
125   }
126   obj->int_idmax = new_n;
127   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
128   PetscFunctionReturn(0);
129 }
130 
131 #undef __FUNCT__
132 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar"
133 PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
134 {
135   PetscInt       **ar = obj->intstarcomposeddata,**new_ar;
136   PetscInt       *ir = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i;
137   PetscErrorCode ierr;
138 
139   PetscFunctionBegin;
140   new_n = globalmaxstate;
141   ierr = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
142   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
143   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
144   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
145   if (n) {
146     for (i=0; i<n; i++) {
147       new_ar[i] = ar[i]; new_ir[i] = ir[i];
148     }
149     ierr = PetscFree(ar);CHKERRQ(ierr);
150     ierr = PetscFree(ir);CHKERRQ(ierr);
151   }
152   obj->intstar_idmax = new_n;
153   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
154   PetscFunctionReturn(0);
155 }
156 
157 #undef __FUNCT__
158 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
159 PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
160 {
161   PetscReal      *ar = obj->realcomposeddata,*new_ar;
162   PetscInt       *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i;
163   PetscErrorCode ierr;
164 
165   PetscFunctionBegin;
166   new_n = globalmaxstate;
167   ierr = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
168   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
169   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
170   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
171   if (n) {
172     for (i=0; i<n; i++) {
173       new_ar[i] = ar[i]; new_ir[i] = ir[i];
174     }
175     ierr = PetscFree(ar);CHKERRQ(ierr);
176     ierr = PetscFree(ir);CHKERRQ(ierr);
177   }
178   obj->real_idmax = new_n;
179   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
180   PetscFunctionReturn(0);
181 }
182 
183 #undef __FUNCT__
184 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
185 PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
186 {
187   PetscReal      **ar = obj->realstarcomposeddata,**new_ar;
188   PetscInt       *ir = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i;
189   PetscErrorCode ierr;
190 
191   PetscFunctionBegin;
192   new_n = globalmaxstate;
193   ierr = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
194   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
195   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
196   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
197   if (n) {
198     for (i=0; i<n; i++) {
199       new_ar[i] = ar[i]; new_ir[i] = ir[i];
200     }
201     ierr = PetscFree(ar);CHKERRQ(ierr);
202     ierr = PetscFree(ir);CHKERRQ(ierr);
203   }
204   obj->realstar_idmax = new_n;
205   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
206   PetscFunctionReturn(0);
207 }
208 
209 #undef __FUNCT__
210 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
211 PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
212 {
213   PetscScalar    *ar = obj->scalarcomposeddata,*new_ar;
214   PetscInt       *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i;
215   PetscErrorCode ierr;
216 
217   PetscFunctionBegin;
218   new_n = globalmaxstate;
219   ierr = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
220   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
221   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
222   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
223   if (n) {
224     for (i=0; i<n; i++) {
225       new_ar[i] = ar[i]; new_ir[i] = ir[i];
226     }
227     ierr = PetscFree(ar);CHKERRQ(ierr);
228     ierr = PetscFree(ir);CHKERRQ(ierr);
229   }
230   obj->scalar_idmax = new_n;
231   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
232   PetscFunctionReturn(0);
233 }
234 
235 #undef __FUNCT__
236 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
237 PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
238 {
239   PetscScalar    **ar = obj->scalarstarcomposeddata,**new_ar;
240   PetscInt       *ir = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i;
241   PetscErrorCode ierr;
242 
243   PetscFunctionBegin;
244   new_n = globalmaxstate;
245   ierr = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
246   ierr = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
247   ierr = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
248   ierr = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
249   if (n) {
250     for (i=0; i<n; i++) {
251       new_ar[i] = ar[i]; new_ir[i] = ir[i];
252     }
253     ierr = PetscFree(ar);CHKERRQ(ierr);
254     ierr = PetscFree(ir);CHKERRQ(ierr);
255   }
256   obj->scalarstar_idmax = new_n;
257   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
258   PetscFunctionReturn(0);
259 }
260 
261