I was thinking of something more outside of the usual C syntax. Something 
that the compiler ignores or does not see. For example

  Input Parameters:
+  const mat - the factored matrix
-  const b - the right-hand-side vector
.  x - the result vector
   
Which brings up a different point, what does Input Parameters and Output 
Parameters: mean, at times we are inconsistent for MatMult() we have

   Input Parameters:
+  mat - the factored matrix
-  b - the right-hand-side vector

   Output Parameter:
.  x - the result vector

this kind of means that mat and b are const and x is not, but usually the 
Output Paramater is reserved for when an object is created and passed out 
(which I like better).


   Barry

On Dec 2, 2010, at 2:23 PM, Jed Brown wrote:

> On Wed, Dec 1, 2010 at 20:27, Barry Smith <bsmith at mcs.anl.gov> wrote:
> A more difficult example is that the Jacobian matrix argument to SNES is 
> const (in some sense) but it is not to TS (since TS "adjusts" it before 
> passing to SNES).
> 
> This does not happen with TSComputeIJacobian, the user produces exactly what 
> SNES needs.
> 
>  Note that "const" here may not have the strict C meaning of not changing 
> anything in the object. For example VecNorm() is const on the vector elements 
> but caches the computed norm so does change the data inside the object.
> 
> This is easy to handle by casting internally.
> 
> 
> The trouble is, of course, that once you typedef something,
> 
> typedef struct _p_Vec *Vec;
> 
> then "const Vec" just means that the pointer is const, not the struct behind 
> it, thus the const keyword in
> 
> PetscErrorCode VecNorm(const Vec X,NormType,PetscReal*);
> 
> has exactly zero meaning as far as the interface is concerned.  Using
> 
> #define Vec struct _p_Vec*
> 
> instead of the typedef would cause the const to apply to the struct instead 
> of the pointer, but this is really ugly for lots of reasons including (note 
> that VecType already has this problem)
> 
>   Vec X,Y;   /* Y is a struct, yuck */
> 
> So the only way, within the C type system, to do what you want would be to
> 
> typedef const struct _p_Vec *const_Vec;
> 
> and then
> 
> PetscErrorCode VecNorm(const_Vec X,NormType,PetscReal*);
> 
> This works as you would expect, but it's an unconventional C style so I would 
> be apprehensive about recommending it.
> 
> Jed


Reply via email to