<div><br></div><div><br><div class="gmail_quote"><div dir="ltr">On Thu, 18 Oct 2018 at 17:57, Florian Lindner <<a href="mailto:mailinglists@xgm.de">mailinglists@xgm.de</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I try to use the KSP solver package together with a shell matrix:<br>
<br>
<br>
  MyContext mycontext; // an empty struct, not sure it it's needed?<br>
  Mat s;<br>
  ierr = MatCreateShell(PETSC_COMM_WORLD, size, size, PETSC_DECIDE, PETSC_DECIDE, &mycontext, &s);<br>
  ierr = MatShellSetOperation(s, MATOP_MULT, (void(*)(void))usermult); CHKERRQ(ierr);<br>
<br>
To simulate a meaningfull usermult, I use MatMult on an actual existing matrix of same dimensions:<br>
<br>
extern PetscErrorCode usermult(Mat m ,Vec x, Vec y)<br>
{<br>
  PetscErrorCode ierr = 0;<br>
  ierr = MatMult(matrix, x, y);<br>
  printf("Call\n");<br>
  return ierr;<br>
}<br>
<br>
Btw, what is the significance of the Mat m argument here?</blockquote><div dir="auto"><br></div><div dir="auto">m is your shell matrix. You should be calling </div><div dir="auto"><br></div><div dir="auto">MatShellGetContext(m,(void**)&myctx);</div><div dir="auto"><br></div><div dir="auto"><div><a href="https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatShellGetContext.html">https://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatShellGetContext.html</a></div></div><div dir="auto"><br></div><div dir="auto">to get your user context inside usermult to retrieve any data you need for the mat-vec product. Where the hell is the variable "matrix"? Is it a global variable?? If yes - don't do that.</div><div dir="auto"><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
<br>
matrix is created like:<br>
<br>
  ierr = MatCreate(PETSC_COMM_WORLD, &matrix); CHKERRQ(ierr);<br>
  ierr = MatSetSizes(matrix, size, size, PETSC_DECIDE, PETSC_DECIDE); CHKERRQ(ierr);<br>
  ierr = MatSetFromOptions(matrix); CHKERRQ(ierr);<br>
  ierr = MatSetUp(matrix); CHKERRQ(ierr);<br>
<br>
<br>
  MatMult(s, b, x);<br>
<br>
works. The usermult function is called.<br>
<br>
But trying to use a KSP gives an error:<br>
<br>
  KSP solver;<br>
  KSPCreate(PETSC_COMM_WORLD, &solver);<br>
  KSPSetFromOptions(solver);<br>
  KSPSetOperators(solver, s, s);<br>
<br>
<br>
error:<br>
<br>
[0]PETSC ERROR: --------------------- Error Message --------------------------------------------------------------<br>
[0]PETSC ERROR: See <a href="http://www.mcs.anl.gov/petsc/documentation/linearsolvertable.html" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/documentation/linearsolvertable.html</a> for possible LU and Cholesky solvers<br>
[0]PETSC ERROR: Could not locate a solver package. Perhaps you must ./configure with --download-<package><br>
[0]PETSC ERROR: See <a href="http://www.mcs.anl.gov/petsc/documentation/faq.html" rel="noreferrer" target="_blank">http://www.mcs.anl.gov/petsc/documentation/faq.html</a> for trouble shooting.<br>
[0]PETSC ERROR: Petsc Release Version 3.9.3, unknown <br>
[0]PETSC ERROR: ./a.out on a arch-linux2-c-opt named asaru by lindnefn Thu Oct 18 17:39:52 2018<br>
[0]PETSC ERROR: Configure options --with-debugging=0 COPTFLAGS="-O3 -march=native -mtune=native" CXXOPTFLAGS="-O3 -march=native -mtune=native" FOPTFLAGS="-O3 -march=native -mtune=native" --download-petsc4py --download-mpi4py --with-mpi-dir=/opt/mpich<br>
[0]PETSC ERROR: #1 MatGetFactor() line 4328 in /home/lindnefn/software/petsc/src/mat/interface/matrix.c<br>
[0]PETSC ERROR: #2 PCSetUp_ILU() line 142 in /home/lindnefn/software/petsc/src/ksp/pc/impls/factor/ilu/ilu.c<br>
[0]PETSC ERROR: #3 PCSetUp() line 923 in /home/lindnefn/software/petsc/src/ksp/pc/interface/precon.c<br>
[0]PETSC ERROR: #4 KSPSetUp() line 381 in /home/lindnefn/software/petsc/src/ksp/ksp/interface/itfunc.c<br>
[0]PETSC ERROR: #5 KSPSolve() line 612 in /home/lindnefn/software/petsc/src/ksp/ksp/interface/itfunc.c<br>
<br>
Do I need to MatShellSetOperations additional operations? Like MATOP_ILUFACTOR? How can I know what operations to implement?<br>
<br>
Best Thanks,<br>
Florian<br>
<br>
<br>
</blockquote></div></div>