[petsc-users] KSPSolve with MPIAIJ with non-square 'diagonal parts'
Matthew Knepley
knepley at gmail.com
Mon Aug 30 16:31:02 CDT 2021
On Mon, Aug 30, 2021 at 4:42 PM Stefano Zampini <stefano.zampini at gmail.com>
wrote:
> What is the error you are getting from the KSP? Default solver in parallel
> in BlockJacobi+ILU which does not work for non-square matrices. You do not
> need to call PCSetFromOptions on the pc. Just call KSPSetFromOptions and
> run with -pc_type none
>
I have a more basic question. The idea of GMRES is the following:
We build a space, {r, A r, A^2 r, ...} for the solution
This means that r and Ar must have compatible layouts. It does not sound
like this is the case for you.
Thanks,
Matt
> > On Aug 30, 2021, at 9:17 PM, Olivier Jamond <olivier.jamond at cea.fr>
> wrote:
> >
> > Hello,
> >
> > I am sorry because I surely miss something, but I cannot manage to solve
> a problem with a MPIAIJ matrix which has non-square 'diagonal parts'.
> >
> > I copy/paste at the bottom of this message a very simple piece of code
> which causes me troubles. I this code I try to do 'x=KSP(A)*b' (with
> gmres/jacobi), but this fails whereas a matrix multiplication 'b=A*x' seems
> to work. Is ksp with such a matrix supposed to work (I can't find anything
> in the documentation about that, so I guess that it is...) ?
> >
> > Many thanks,
> > Olivier
> >
> > NB: this code should be launched with exactly 3 procs
> >
> > #include "petscsys.h" /* framework routines */
> > #include "petscvec.h" /* vectors */
> > #include "petscmat.h" /* matrices */
> > #include "petscksp.h"
> >
> > #include <vector>
> > #include <string>
> > #include <iostream>
> > #include <numeric>
> >
> > static char help[] = "Trying to solve a linear system on a sub-block of
> a matrix\n\n";
> > int main(int argc, char **argv)
> > {
> > MPI_Init(NULL, NULL);
> > PetscErrorCode ierr;
> > ierr = PetscInitialize(&argc, &argv, NULL, help);
> > CHKERRQ(ierr);
> >
> > // clang-format off
> > std::vector<std::vector<double>> AA = {
> > { 1, 2, 0, /**/ 0, 3, /**/ 0, 0, 4},
> > { 0, 5, 6, /**/ 7, 0, /**/ 0, 8, 0},
> > { 9, 0, 10, /**/11, 0, /**/ 0, 12, 0},
> > //---------------------------------------
> > {13, 0, 14, /**/15, 16, /**/17, 0, 0},
> > { 0, 18, 0, /**/19, 20, /**/21, 0, 0},
> > { 0, 0, 0, /**/22, 23, /**/ 1, 24, 0},
> > //--------------------------------------
> > {25, 26, 27, /**/ 0, 0, /**/28, 29, 0},
> > {30, 0, 0, /**/31, 32, /**/33, 0, 34},
> > };
> >
> >
> > std::vector<double> bb = {1.,
> > 1.,
> > 1.,
> > //
> > 1.,
> > 1.,
> > 1.,
> > //
> > 1.,
> > 1.};
> >
> >
> > std::vector<int> nDofsRow = {3, 3, 2};
> > std::vector<int> nDofsCol = {3, 2, 3};
> > // clang-format on
> >
> > int NDofs = std::accumulate(nDofsRow.begin(), nDofsRow.end(), 0);
> >
> > int pRank, nProc;
> > MPI_Comm_rank(PETSC_COMM_WORLD, &pRank);
> > MPI_Comm_size(PETSC_COMM_WORLD, &nProc);
> >
> > if (nProc != 3) {
> > std::cerr << "THIS TEST MUST BE LAUNCHED WITH EXACTLY 3 PROCS\n";
> > abort();
> > }
> >
> > Mat A;
> > MatCreate(PETSC_COMM_WORLD, &A);
> > MatSetType(A, MATMPIAIJ);
> > MatSetSizes(A, nDofsRow[pRank], nDofsCol[pRank], PETSC_DETERMINE,
> PETSC_DETERMINE);
> > MatMPIAIJSetPreallocation(A, NDofs, NULL, NDofs, NULL);
> >
> > Vec b;
> > VecCreate(PETSC_COMM_WORLD, &b);
> > VecSetType(b, VECMPI);
> > VecSetSizes(b, nDofsRow[pRank], PETSC_DECIDE);
> >
> > if (pRank == 0) {
> > for (int i = 0; i < NDofs; ++i) {
> > for (int j = 0; j < NDofs; ++j) {
> > if (AA[i][j] != 0.) {
> > MatSetValue(A, i, j, AA[i][j], ADD_VALUES);
> > }
> > }
> > VecSetValue(b, i, bb[i], ADD_VALUES);
> > }
> > }
> >
> > MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY);
> > MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY);
> > VecAssemblyBegin(b);
> > VecAssemblyEnd(b);
> >
> > PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,
> PETSC_VIEWER_ASCII_DENSE);
> > MatView(A, PETSC_VIEWER_STDOUT_WORLD);
> > VecView(b, PETSC_VIEWER_STDOUT_WORLD);
> >
> > KSP ksp;
> > KSPCreate(PETSC_COMM_WORLD, &ksp);
> > KSPSetOperators(ksp, A, A);
> > KSPSetFromOptions(ksp);
> >
> > PC pc;
> > KSPGetPC(ksp, &pc);
> > PCSetFromOptions(pc);
> >
> > Vec x;
> > MatCreateVecs(A, &x, NULL);
> > ierr = KSPSolve(ksp, b, x); // this fails
> > MatMult(A, x, b); // whereas the seems to be ok...
> >
> > VecView(x, PETSC_VIEWER_STDOUT_WORLD);
> >
> > MPI_Finalize();
> >
> > return 0;
> > }
> >
>
>
--
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
https://www.cse.buffalo.edu/~knepley/ <http://www.cse.buffalo.edu/~knepley/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210830/8b761e91/attachment.html>
More information about the petsc-users
mailing list