<div dir="ltr"><div class="gmail_default" style="font-family:simsun,serif">Hi, <br>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.</div><div class="gmail_default" style="font-family:simsun,serif"><br>I have read the example codes (<a href="https://petsc.org/release/src/ts/tutorials/index.html">https://petsc.org/release/src/ts/tutorials/index.html</a>) and vaguely found that BCs seems to be set  as follows:<br><br>1. when evaluating a matrix of the right hand side function g(x) (e.g., using a function like RHSMatrixHeat)<br>2. when evaluating a matrix of the Jacobian matrix of g'(x) (e.g., using a function like FormJacobian)<br></div><div class="gmail_default" style="font-family:simsun,serif"><br>For instance, in the ex1.4 (<a href="https://petsc.org/release/src/ts/tutorials/ex4.c.html">https://petsc.org/release/src/ts/tutorials/ex4.c.html</a>), with comments at the beginning states<br><br> 17: /* ------------------------------------------------------------------------<br> 19:    This program solves the one-dimensional heat equation (also called the<br> 20:    diffusion equation),<br> 21:        u_t = u_xx,<br> 22:    on the domain 0 <= x <= 1, with the boundary conditions<br> 23:        u(t,0) = 0, u(t,1) = 0,<br> 24:    and the initial condition<br> 25:        u(0,x) = sin(6*pi*x) + 3*sin(2*pi*x).<br> 26:    This is a linear, second-order, parabolic equation.<br><br> 28:    We discretize the right-hand side using finite differences with<br> 29:    uniform grid spacing h:<br> 30:        u_xx = (u_{i+1} - 2u_{i} + u_{i-1})/(h^2)<br>...<br> 47:   ------------------------------------------------------------------------- */<br><br> 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:<br> <br>/* ------------------------------------------------------------------------- */</div><div class="gmail_default" style="font-family:simsun,serif">463: RHSMatrixHeat - User-provided routine to compute the right-hand-side matrix for the heat equation. */<br>491: PetscErrorCode RHSMatrixHeat(TS ts,PetscReal t,Vec X,Mat AA,Mat BB,void *ctx)<br>492: {<br>...<br>505:   /* Set matrix rows corresponding to boundary data */<br>509:   if (mstart == 0) {  /* first processor only */<br>510:     v[0] = 1.0;<br>511:     MatSetValues(A,1,&mstart,1,&mstart,v,INSERT_VALUES);<br>512:     mstart++;<br>513:   }<br>515:   if (mend == appctx->m) { /* last processor only */<br>516:     mend--;<br>517:     v[0] = 1.0;<br>518:     MatSetValues(A,1,&mend,1,&mend,v,INSERT_VALUES);<br>519:   }<br><br>521:   /* Set matrix rows corresponding to interior data.  We construct the matrix one row at a time. */<br>525:   v[0] = sone; v[1] = stwo; v[2] = sone;<br>526:   for (i=mstart; i<mend; i++) {<br>527:     idx[0] = i-1; idx[1] = i; idx[2] = i+1;<br>528:     MatSetValues(A,1,&i,3,idx,v,INSERT_VALUES);<br>529:   }<br>...<br>550: }</div><div class="gmail_default" style="font-family:simsun,serif">/* ------------------------------------------------------------------------- */</div><div class="gmail_default" style="font-family:simsun,serif"><br><br>My questions are:<br><br>1. How do these lines of code embody the Dirichlet BCs u(t,0) = 0 and u(t,1) = 0.<br><br>2. Similarly, if I want to apply a Neumann type BCs in these lines, How can I do?<br><br>Any suggestions or documents?<br><br>Best,<br>Qw<br></div></div>