[petsc-users] How to apply boundary conditions when using TS?

zhfreewill zhfreewill at gmail.com
Mon Nov 15 20:51:56 CST 2021


Hi,
I'm new to PETSc. I have been confused about how to apply boundary
conditions (BCs) (e.g., the Dirichlet and the Neumann type) when using the
time-stepping (TS) object of PETSc.

I have read the example codes (
https://petsc.org/release/src/ts/tutorials/index.html) and vaguely found
that BCs seems to be set  as follows:

1. when evaluating a matrix of the right hand side function g(x) (e.g.,
using a function like RHSMatrixHeat)
2. when evaluating a matrix of the Jacobian matrix of g'(x) (e.g., using a
function like FormJacobian)

For instance, in the ex1.4 (
https://petsc.org/release/src/ts/tutorials/ex4.c.html), with comments at
the beginning states

 17: /*
------------------------------------------------------------------------
 19:    This program solves the one-dimensional heat equation (also called
the
 20:    diffusion equation),
 21:        u_t = u_xx,
 22:    on the domain 0 <= x <= 1, with the boundary conditions
 23:        u(t,0) = 0, u(t,1) = 0,
 24:    and the initial condition
 25:        u(0,x) = sin(6*pi*x) + 3*sin(2*pi*x).
 26:    This is a linear, second-order, parabolic equation.

 28:    We discretize the right-hand side using finite differences with
 29:    uniform grid spacing h:
 30:        u_xx = (u_{i+1} - 2u_{i} + u_{i-1})/(h^2)
...
 47:
------------------------------------------------------------------------- */

 and Dirichlet BCs, u(t,0) = 0 and u(t,1) = 0, are to set on the both side
of the discretized domain, the corresponding codes can be found on the
following lines in a function RHSMatrixHeat:

/*
------------------------------------------------------------------------- */
463: RHSMatrixHeat - User-provided routine to compute the right-hand-side
matrix for the heat equation. */
491: PetscErrorCode RHSMatrixHeat(TS ts,PetscReal t,Vec X,Mat AA,Mat
BB,void *ctx)
492: {
...
505:   /* Set matrix rows corresponding to boundary data */
509:   if (mstart == 0) {  /* first processor only */
510:     v[0] = 1.0;
511:     MatSetValues(A,1,&mstart,1,&mstart,v,INSERT_VALUES);
512:     mstart++;
513:   }
515:   if (mend == appctx->m) { /* last processor only */
516:     mend--;
517:     v[0] = 1.0;
518:     MatSetValues(A,1,&mend,1,&mend,v,INSERT_VALUES);
519:   }

521:   /* Set matrix rows corresponding to interior data.  We construct the
matrix one row at a time. */
525:   v[0] = sone; v[1] = stwo; v[2] = sone;
526:   for (i=mstart; i<mend; i++) {
527:     idx[0] = i-1; idx[1] = i; idx[2] = i+1;
528:     MatSetValues(A,1,&i,3,idx,v,INSERT_VALUES);
529:   }
...
550: }
/*
------------------------------------------------------------------------- */


My questions are:

1. How do these lines of code embody the Dirichlet BCs u(t,0) = 0 and
u(t,1) = 0.

2. Similarly, if I want to apply a Neumann type BCs in these lines, How can
I do?

Any suggestions or documents?

Best,
Qw
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20211116/7314bfa3/attachment.html>


More information about the petsc-users mailing list