The PETSc manual pages do not mention whether or not the user is
responsible for setting the entries in the function vector to zero in
the user-defined ifunction and rhsfunction.
In looking at the code it is clear TSComputeIFunction() does not set the
function vector entries to zero. For the function to be computed
correctly with the current code, the user must zero the function Vec
passed in to both the ifunction and rhsfunction. This seems like a bug
to me, because TSComputeIFunction() could potentially use a single
global Vec in computing the function from the ifunction and rhsfunction,
so a user zeroing the entries would result in incorrect values.
It seems to be the code should behave like:
TSComputeIFunction calls VecSet(residual, 0.0) BEFOERE calling ifunction
and rhsfunction.
User ifunction calls scatter with ADD_VALUES
User rhsfunction calls scatter with ADD_VALUES
This way the user code is agnostic as to whether TSComputeIFunction()
passes in separate vecs to ifunction and rhsfunction or the same vec
with the proper -1 scaling done in between.
Whether or not TSComputeIFunction() is changed to zero out the function
Vec, I think the manual page should be updated to indicate to the user
whether the user function or PETSc function is responsible for zeroing
the function Vec.
Thanks,
Brad