[petsc-dev] Note about CPR preconditioner in PCFIELDSPLIT man page?

Jed Brown jed at jedbrown.org
Sun Mar 3 22:21:03 CST 2019


"Mills, Richard Tran" <rtmills at anl.gov> writes:

> Alright, I see the source of my confusion: I've now seen three different that are all called a "Constrained Pressure Residual" preconditioner. What I have generally seen is exactly what Matt describes: R is just a restriction to a subset of DoFs (pressure, and sometimes saturation), and P is just R' (using Matlab notation here). A CPR preconditioner in which P differs from R' is not something I've seen until now.

Please read the code again.  P = R' for this case, but R is restriction to the sum of field components, not a subset of the variables.

> I'll see if I can think of a succinct change to the documentation for PCFIELDSPLIT to describe the two cases and submit a pull request.
>
> --Richard
>
> On 3/3/19 8:38 AM, Jed Brown wrote:
>
> Matthew Knepley <knepley at gmail.com><mailto:knepley at gmail.com> writes:
>
>
>
> On Sun, Mar 3, 2019 at 12:58 AM Jed Brown via petsc-dev <
> petsc-dev at mcs.anl.gov<mailto:petsc-dev at mcs.anl.gov>> wrote:
>
>
>
> My take is that someone looking for CPR is more likely to end up on the
> PCFIELDSPLIT manual page than the PCGALERKIN page.  The solver you have
> configured in your mail is not the CPR we have been asked about here.
> See Barry's message and example code below.
>
>
>
>
> Thanks for retrieving this Jed. I am sure Richard and I both have the same
> question. Perhaps I am being an idiot.
> I am supposing that R is just a restriction to some subset of dofs, so its
> just binary, so that R A P just selects that
> submatrix.
>
>
>
> Look at the source.  These are not subsets:
>
>  /*
>      Apply the restriction operator for the Galkerin problem
>  */
>  PetscErrorCode ApplyR(Mat A, Vec x,Vec y)
>  {
>    PetscErrorCode ierr;
>    PetscInt       b;
>    PetscFunctionBegin;
>    ierr = VecGetBlockSize(x,&b);CHKERRQ(ierr);
>    ierr = VecStrideGather(x,0,y,INSERT_VALUES);CHKERRQ(ierr);
>    for (PetscInt k=1;k<b;++k) {ierr = VecStrideGather(x,k,y,ADD_VALUES);CHKERRQ(ierr);}
>    PetscFunctionReturn(0);
>  }
>
>  /*
>      Apply the interpolation operator for the Galerkin problem
>  */
>  PetscErrorCode ApplyP(Mat A, Vec x,Vec y)
>  {
>    PetscErrorCode ierr;
>    PetscInt       offset = 1;
>    PetscFunctionBegin;
>    ierr = VecStrideScatter(x,offset,y,INSERT_VALUES);CHKERRQ(ierr);
>    PetscFunctionReturn(0);
>  }


More information about the petsc-dev mailing list