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