<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jun 16, 2014 at 12:40 AM, Sun, Hui <span dir="ltr"><<a href="mailto:hus003@ucsd.edu" target="_blank">hus003@ucsd.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Thank you Barry and Jed for answering my question. Here is another question: If I have a nonlinear PDE, for example, Poisson Boltzmann with an inhomogeneous dielectric constant epsilon. I want to solve for psi, but not epsilon. But to form the SetFunctionLocal, one needs to provide psi as well as epsilon.<br>

<br>
The user defined function which is passed to DMDASNESSetFunctionLocal should be of the format<br>
PetscErrorCode (*func)(DMDALocalInfo*,void*,void*,void*),<br>
where the first void* corresponds to x, the dimensional pointer to state at which to evaluate residual; and the second void* corresponds to f, the dimensional pointer to residual, write the residual here; and the third void* is the optional context passed above.<br>

<br>
The scalar field epsilon is not part of x, neither is it part of f, it seems that the only choice is to pass it in the third void*. However, if I have some other parameters, should I set up a struct, which includes those other parameters, and a distributed Vec for epsilon, and pass it in the third void*?<br>
</blockquote><div><br></div><div>Yes, that is the idea. For example,</div><div><br></div><div>  <a href="http://www.mcs.anl.gov/petsc/petsc-current/src/snes/examples/tutorials/ex5.c.html">http://www.mcs.anl.gov/petsc/petsc-current/src/snes/examples/tutorials/ex5.c.html</a></div>
<div><br></div><div>defines a struct with problem parameters (so does ex19)</div><div><br></div><div>  Thanks,</div><div><br></div><div>     Matt</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

Best,<br>
Hui<br>
<br>
________________________________________<br>
From: Barry Smith [<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>]<br>
Sent: Saturday, June 14, 2014 3:43 PM<br>
To: Sun, Hui<br>
Cc: <a href="mailto:petsc-users@mcs.anl.gov">petsc-users@mcs.anl.gov</a><br>
Subject: Re: [petsc-users] Using operators in KSP<br>
<br>
   MatCreateShell() is what I think you need.  You provide a “matrix-free” linear operator with MatShellSetOperation(mat,MATOP_MULT,yourfunction) and yourfunction applies the linear operator any way it likes.<br>
<br>
   You then provide this matrix as the first Mat argument to KSPSetOperators().<br>
<br>
<br>
   Barry<br>
<br>
<br>
<br>
On Jun 14, 2014, at 5:18 PM, Sun, Hui <<a href="mailto:hus003@ucsd.edu">hus003@ucsd.edu</a>> wrote:<br>
<br>
> I try to program 2D Stokes equation solver, so it is a linear PDE, and there are u, v, p on every grid point. One way on my mind is to form a matrix-free block matrix. In that way, if the discretization is n by n, then the matrix is 3n by 3n. However, I'm also thinking if it is possible to define the PDE operator as what DMDASNESSetFunctionLocal does in SNES example ex19? In that example, the unknowns (u, v, omega, T) are defined as a struct of four PestsScalar on every grid point, and then the interface converts PestcScalar** to Vec, and an operator instead of a matrix is formed.<br>

><br>
> Is there a function in KSP similar to DMDASNESSetFunctionLocal in SNES?<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.<br>
-- Norbert Wiener
</div></div>