[petsc-users] TimeStepper norm problems.

Matthew Knepley knepley at gmail.com
Fri Mar 20 16:26:06 CDT 2015


On Fri, Mar 20, 2015 at 3:09 PM, Andrew Spott <ansp6066 at colorado.edu> wrote:

>  So, it doesn’t seem that zeroing the given vector in the function passed
> to TSSetRHSJacobian is the problem.  When I do that, it just zeros out the
> solution.
>

I would think you would zero the residual vector (if you add to it to
construct the residual, as in FEM methods), not the solution.


> The function that is passed to TSSetRHSJacobian has only one
> responsibility — to create the jacobian — correct?  In my case this is
> A(t).  The solution vector is given for when you are solving nonlinear
> problems (A(t) also depends on U(t)).  In my case, I don’t even look at the
> solution vector (because my A(t) doesn’t depend on it).
>

Are you initializing the Jacobian to 0 first?

  Thanks,

     Matt


> Is this the case? or is there some other responsibility of said function?
>
> -Andrew
>
> >Ah ha!
> >
> >The function passed to TSSetRHSJacobian needs to zero the solution vector?
> >
> >As a point, this isn’t mentioned in any documentation that I can find.
> >
> >-Andrew
>
> On Friday, Mar 20, 2015 at 2:17 PM, Matthew Knepley <knepley at gmail.com>,
> wrote:
>
>> This sounds like a problem in your calculation function where a Vec or
>> Mat does not get reset to 0, but it does in your by hand code.
>>
>>    Matt
>> On Mar 20, 2015 2:52 PM, "Andrew Spott" <ansp6066 at colorado.edu> wrote:
>>
>>>  I have a fairly simple problem that I’m trying to timestep:
>>>
>>> u’ = A(t) u
>>>
>>> I’m using the crank-nicholson method, which I understand (for this
>>> problem) to be:
>>>
>>> u(t + h) = u(t) + h/2[A(t+h)*u(t+h) + A(t)*u(t)]
>>> or
>>> [1 - h/2 * A(t+1)] u(t+1) = [1 + h/2 * A(t)] u(t)
>>>
>>> When I attempt to timestep using PETSc, the norm of `u` blows up.  When
>>> I do it directly (using the above), the norm of `u` doesn’t blow up.
>>>
>>> It is important to note that the solution generated after the first step
>>> is identical for both, but the second step for Petsc has a norm of ~2,
>>> while for the directly calculated version it is ~1.  The third step for
>>> petsc has a norm of ~4, while the directly calculated version it is still
>>> ~1.
>>>
>>> I’m not sure what I’m doing wrong.
>>>
>>> PETSc code is taken out of the manual and is pretty simple:
>>>
>>>          TSCreate( comm, &ts );
>>>         TSSetProblemType( ts, TS_LINEAR);
>>>         TSSetType( ts, TSCN );
>>>         TSSetInitialTimeStep( ts, 0, 0.01 );
>>>         TSSetDuration( ts, 5, 0.03 );
>>>         TSSetFromOptions( ts );
>>>         TSSetRHSFunction( ts, NULL, TSComputeRHSFunctionLinear, NULL );
>>>         TSSetRHSJacobian( ts, A, A, func, &cntx );
>>>         TSSolve( ts, psi0 );
>>>
>>> `func` just constructs A(t) at the time given.  The same code for
>>> calculating A(t) is used in both calculations, along with the same initial
>>> vector psi0, and the same time steps.
>>>
>>> Let me know what other information is needed.  I’m not sure what could
>>> be the problem.  `func` doesn’t touch U at all (should it?).
>>>
>>> -Andrew
>>>
>>>


-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20150320/21d8f391/attachment.html>


More information about the petsc-users mailing list