> On Jan 2, 2017, at 4:05 PM, Mark Adams <[email protected]> wrote:
> 
> 
> 
> On Sun, Jan 1, 2017 at 1:00 PM, Barry Smith <[email protected]> wrote:
> 
>    What are LandSNESFunction() and LandSNESJacobian()?
> 
> These are the same methods that I give to TS (IFunction and IJacobian),  
> except there is no mass matrix in IJacobian. What do I do here? I do not have 
> a shift.
> 
> But I see that IFunction is not correct. I am solving du/dt - C(u) = 0.

    Do you mean du/dt - c(u)* u = 0?

>  My IFunction applies C(u)*u, but LandSNESFunction should just return zero, 
> maybe?

    If you are solving du/dt - c(u)*u = with backward Euler then it can be 
written as 

u^{n+1}  - u^n 
 ------------------       - c(u^{n+1})u^{n+1}  = 0
      dt 

  or     (I - dt*c(u^{n+1})u^{n+1})u^{n+1}  = u^n

   Which is the standard form for PETSc's Picard iteration; so you would 
provide I - dt*c(u^{n+1})u^{n+1} as the compute matrix J() and u^n as the b() 
Note that the b() is a constant independent of the unknown u^{n+1}.    

    But I do not think it is possible to use TS to solve it this way, you need 
to use SNES and manage the time-step yourself. Trying to call SNESSetPicard() 
inside the TS won't work I think. Perhaps Jed or Emil have better thoughts but 
I think it would require some additional plumbing in TS.

  You can also discretize du/dt - c(u)*u with lazy person's backward Euler as 


u^{n+1}  - u^n 
 ------------------       - c(u^n)u^{n+1}  = 0
      dt 

thus giving the linear system (I - dt c(u^n)) u^{n+1} = u^n but then you need 
to be sure it is a stable scheme with some accuracy, which it may not be. Again 
this you can do with KPS but not directly with TS I think.


  If you really are solving du/dt - c(u) = 0 then backward Euler gives you 

u^{n+1}  - u^n 
 ------------------       - c(u^{n+1}) = 0 
      dt 


(n^{n+1} - dt c(u^{n+1}) - u^n  and the logical solver is Newton because the 
Jacobian of this is 

I - dt J(u^{n+1}) .   This you can give directly to TS, but using Picard 
doesn't make much sense since there is no natural A(u^{n+1}) u^{n+1} term.


But now I remember something Emil showed me.  If you can write c(x) = A(x) x  + 
f(x)  then you can do another lazy person's backward Euler with 

u^{n+1}  - u^n 
 ------------------       - A(u^{n+1})u^{n+1}  - f(u^n) = 0
      dt 

Resulting in

(I - dt A(u^{n+1}))u^{n+1} = u^n + f(u^n)   and use SNESSetPicard to solve 
(again without using TS).

Or if you only want to solve a linear system using


u^{n+1}  - u^n 
 ------------------       - A(u^n)u^{n+1}  - f(u^n) = 0
      dt 

and solve 

(I - dt A(u^n))u^{n+1} = u^n + f(u^n).

But for these to be reasonable approaches you need to know something about A() 
and f(). 

I am making all these suggestions not because I think doing any of these things 
is reasonable, I'm just trying to guess at what you are trying to accomplish.

  Barry




 




> 
> 
>  
> 
>    Note that Picard
> 
>        Solves the equation A(x) x = b(x) via the defect correction algorithm 
> A(x^{n}) (x^{n+1} - x^{n}) = b(x^{n}) - A(x^{n})x^{n}
> 
>    The functions you need to provide are (compute the vector) b(x)  and 
> (compute the matrix) A(x).   A() is most definitely not the Jacobian of b(). 
> To use Picard you have to rewrite the nonlinear equations that come out of 
> the definition of the time-step in the form A(x) x = b(x).  This may require 
> additions to TS, I don't know.
> 
>    Barry
> 
> 
> 
> > On Jan 1, 2017, at 8:56 AM, Mark Adams <[email protected]> wrote:
> >
> > I tried using Picard inside of TS, and SNES diverged. Is this supposed to 
> > be possible?  I tried to do do this by wrapping my operator in a SNES 
> > version and simply adding it like this.
> >
> > Mark
> >
> >   ierr = TSSetIFunction(ts,NULL,LandIFunction,ctx);CHKERRQ(ierr);
> >   ierr = TSSetIJacobian(ts,J,J,LandIJacobian,ctx);CHKERRQ(ierr);
> >     SNES snes;
> >     Vec vec;
> >     ierr = VecDuplicate(uu,&vec);CHKERRQ(ierr);
> >     ierr = TSGetSNES(ts,&snes);CHKERRQ(ierr);
> >     ierr = SNESSetPicard(snes, vec, LandSNESFunction, J, J, 
> > LandSNESJacobian, ctx);CHKERRQ(ierr);
> >
> 
> 

Reply via email to