xref: /petsc/src/sys/objects/state.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
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 #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 PetscObjectComposedDataMax = 10;
79 
80 #undef __FUNCT__
81 #define __FUNCT__ "PetscObjectComposedDataRegister"
82 /*@C
83    PetscObjectComposedDataRegister - Get an available id for
84    composed data
85 
86    Not Collective
87 
88    Output parameter:
89 .  id - an identifier under which data can be stored
90 
91    Level: developer
92 
93    seealso: PetscObjectComposedDataSetInt()
94 
95 @*/
96 PetscErrorCode  PetscObjectComposedDataRegister(PetscInt *id)
97 {
98   static PetscInt globalcurrentstate = 0;
99 
100   PetscFunctionBegin;
101   *id = globalcurrentstate++;
102   if (globalcurrentstate > PetscObjectComposedDataMax) PetscObjectComposedDataMax += 10;
103   PetscFunctionReturn(0);
104 }
105 
106 #undef __FUNCT__
107 #define __FUNCT__ "PetscObjectComposedDataIncreaseInt"
108 PetscErrorCode  PetscObjectComposedDataIncreaseInt(PetscObject obj)
109 {
110   PetscInt       *ar = obj->intcomposeddata,*new_ar;
111   PetscInt       *ir = obj->intcomposedstate,*new_ir,n = obj->int_idmax,new_n,i;
112   PetscErrorCode ierr;
113 
114   PetscFunctionBegin;
115   new_n = PetscObjectComposedDataMax;
116   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ar);CHKERRQ(ierr);
117   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscInt));CHKERRQ(ierr);
118   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
119   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
120   if (n) {
121     for (i=0; i<n; i++) {
122       new_ar[i] = ar[i]; new_ir[i] = ir[i];
123     }
124     ierr = PetscFree(ar);CHKERRQ(ierr);
125     ierr = PetscFree(ir);CHKERRQ(ierr);
126   }
127   obj->int_idmax       = new_n;
128   obj->intcomposeddata = new_ar; obj->intcomposedstate = new_ir;
129   PetscFunctionReturn(0);
130 }
131 
132 #undef __FUNCT__
133 #define __FUNCT__ "PetscObjectComposedDataIncreaseIntstar"
134 PetscErrorCode  PetscObjectComposedDataIncreaseIntstar(PetscObject obj)
135 {
136   PetscInt       **ar = obj->intstarcomposeddata,**new_ar;
137   PetscInt       *ir  = obj->intstarcomposedstate,*new_ir,n = obj->intstar_idmax,new_n,i;
138   PetscErrorCode ierr;
139 
140   PetscFunctionBegin;
141   new_n = PetscObjectComposedDataMax;
142   ierr  = PetscMalloc(new_n*sizeof(PetscInt*),&new_ar);CHKERRQ(ierr);
143   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscInt*));CHKERRQ(ierr);
144   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
145   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
146   if (n) {
147     for (i=0; i<n; i++) {
148       new_ar[i] = ar[i]; new_ir[i] = ir[i];
149     }
150     ierr = PetscFree(ar);CHKERRQ(ierr);
151     ierr = PetscFree(ir);CHKERRQ(ierr);
152   }
153   obj->intstar_idmax       = new_n;
154   obj->intstarcomposeddata = new_ar; obj->intstarcomposedstate = new_ir;
155   PetscFunctionReturn(0);
156 }
157 
158 #undef __FUNCT__
159 #define __FUNCT__ "PetscObjectComposedDataIncreaseReal"
160 PetscErrorCode  PetscObjectComposedDataIncreaseReal(PetscObject obj)
161 {
162   PetscReal      *ar = obj->realcomposeddata,*new_ar;
163   PetscInt       *ir = obj->realcomposedstate,*new_ir,n = obj->real_idmax,new_n,i;
164   PetscErrorCode ierr;
165 
166   PetscFunctionBegin;
167   new_n = PetscObjectComposedDataMax;
168   ierr  = PetscMalloc(new_n*sizeof(PetscReal),&new_ar);CHKERRQ(ierr);
169   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscReal));CHKERRQ(ierr);
170   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
171   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
172   if (n) {
173     for (i=0; i<n; i++) {
174       new_ar[i] = ar[i]; new_ir[i] = ir[i];
175     }
176     ierr = PetscFree(ar);CHKERRQ(ierr);
177     ierr = PetscFree(ir);CHKERRQ(ierr);
178   }
179   obj->real_idmax       = new_n;
180   obj->realcomposeddata = new_ar; obj->realcomposedstate = new_ir;
181   PetscFunctionReturn(0);
182 }
183 
184 #undef __FUNCT__
185 #define __FUNCT__ "PetscObjectComposedDataIncreaseRealstar"
186 PetscErrorCode  PetscObjectComposedDataIncreaseRealstar(PetscObject obj)
187 {
188   PetscReal      **ar = obj->realstarcomposeddata,**new_ar;
189   PetscInt       *ir  = obj->realstarcomposedstate,*new_ir,n = obj->realstar_idmax,new_n,i;
190   PetscErrorCode ierr;
191 
192   PetscFunctionBegin;
193   new_n = PetscObjectComposedDataMax;
194   ierr  = PetscMalloc(new_n*sizeof(PetscReal*),&new_ar);CHKERRQ(ierr);
195   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscReal*));CHKERRQ(ierr);
196   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
197   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
198   if (n) {
199     for (i=0; i<n; i++) {
200       new_ar[i] = ar[i]; new_ir[i] = ir[i];
201     }
202     ierr = PetscFree(ar);CHKERRQ(ierr);
203     ierr = PetscFree(ir);CHKERRQ(ierr);
204   }
205   obj->realstar_idmax       = new_n;
206   obj->realstarcomposeddata = new_ar; obj->realstarcomposedstate = new_ir;
207   PetscFunctionReturn(0);
208 }
209 
210 #undef __FUNCT__
211 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalar"
212 PetscErrorCode  PetscObjectComposedDataIncreaseScalar(PetscObject obj)
213 {
214   PetscScalar    *ar = obj->scalarcomposeddata,*new_ar;
215   PetscInt       *ir = obj->scalarcomposedstate,*new_ir,n = obj->scalar_idmax,new_n,i;
216   PetscErrorCode ierr;
217 
218   PetscFunctionBegin;
219   new_n = PetscObjectComposedDataMax;
220   ierr  = PetscMalloc(new_n*sizeof(PetscScalar),&new_ar);CHKERRQ(ierr);
221   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscScalar));CHKERRQ(ierr);
222   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
223   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
224   if (n) {
225     for (i=0; i<n; i++) {
226       new_ar[i] = ar[i]; new_ir[i] = ir[i];
227     }
228     ierr = PetscFree(ar);CHKERRQ(ierr);
229     ierr = PetscFree(ir);CHKERRQ(ierr);
230   }
231   obj->scalar_idmax       = new_n;
232   obj->scalarcomposeddata = new_ar; obj->scalarcomposedstate = new_ir;
233   PetscFunctionReturn(0);
234 }
235 
236 #undef __FUNCT__
237 #define __FUNCT__ "PetscObjectComposedDataIncreaseScalarStar"
238 PetscErrorCode  PetscObjectComposedDataIncreaseScalarstar(PetscObject obj)
239 {
240   PetscScalar    **ar = obj->scalarstarcomposeddata,**new_ar;
241   PetscInt       *ir  = obj->scalarstarcomposedstate,*new_ir,n = obj->scalarstar_idmax,new_n,i;
242   PetscErrorCode ierr;
243 
244   PetscFunctionBegin;
245   new_n = PetscObjectComposedDataMax;
246   ierr  = PetscMalloc(new_n*sizeof(PetscScalar*),&new_ar);CHKERRQ(ierr);
247   ierr  = PetscMemzero(new_ar,new_n*sizeof(PetscScalar*));CHKERRQ(ierr);
248   ierr  = PetscMalloc(new_n*sizeof(PetscInt),&new_ir);CHKERRQ(ierr);
249   ierr  = PetscMemzero(new_ir,new_n*sizeof(PetscInt));CHKERRQ(ierr);
250   if (n) {
251     for (i=0; i<n; i++) {
252       new_ar[i] = ar[i]; new_ir[i] = ir[i];
253     }
254     ierr = PetscFree(ar);CHKERRQ(ierr);
255     ierr = PetscFree(ir);CHKERRQ(ierr);
256   }
257   obj->scalarstar_idmax       = new_n;
258   obj->scalarstarcomposeddata = new_ar; obj->scalarstarcomposedstate = new_ir;
259   PetscFunctionReturn(0);
260 }
261 
262