[petsc-users] Updating TS solution outside PETSc

Jed Brown jed at jedbrown.org
Thu Dec 5 13:47:03 CST 2019

"Smith, Barry F." <bsmith at mcs.anl.gov> writes:

>    Let's look at the 1d case with vertex centered differencing 
>                               |                  |     
>       u-1*                u0             u1    ...
>   u-1* is the ghost value, u0 the edge value etc. 
>        Say you are solving        u_n on boundary is g(t),   u inside satisfies    u_t =  U_xx   
>    Then if you provide a function of TSSetRHSFunction() it would be something like 
>               DMGetLocalVector(DM,&ulocal);
>               DMGlobalToLocal(dm, U, ulocal) ;
>               DMDAGetArray(ulocal,&u)
>               DMDAGetArray(fglobal,&f)
>               for (i=0,....
>                  f[i]  =  (u[i+1] - 2*u[i] + u[i-1])/h 
>               f[0] += g(t)
>                Note that f[0] =  (u[i+1] - 2*u[i] + u[i-1])/h^2 = (u[1] - u[0])/h + g(t)

Better to reflect with bias, e.g.,

  u[-1] = u[1] + 2*h*g(t)

and apply the standard differencing rule.  Note that f[0] means

  u_t[0] = f[0]

so you can't drop factors of h, etc.,

>                So you are satisfying the PDE inside the domain and on the boundary you are using one-sided differencing to approximate the Neumann boundary conditions.

Only by accident in a sense is a one-sided differencing.  Yes, it
reduces to some one-sided formula once you eliminate the ghost points,
but the interpretation is less clear when using higher order methods,
non-uniform spacing, or upwinding in the volumetric discretization.

More information about the petsc-users mailing list