<div dir="ltr"><div><div><div>Hi!<br><br></div>I'm having some problems getting PCMG to work when manually populating the interpolation matrix, i.e. using MatSetValue to set its values, instead of the use of DMCreateInterpolation, as I have seen in an example. I have to use MatSetValue to populate my PETSc matrices, because I'm obtaining them in a different format from a FEM library.<br>
<br></div>I have reduced my program to a minimal test case (without involving the FEM library), where the system matrix is simply an identity matrix, with two multigrid levels of 8 and 4 degrees of freedom, and a very simple interpolation matrix that can be seen by looking at the code I'm attaching. I'm not including KSPSolve because the problem occurs prior to that, on line 56, which corresponds to where I'm calling KSPSetUp().<br>
<br></div><div>I'm actually not certain how to create the matrix that will be passed to PCMGSetInterpolation(). At the moment I'm only running sequentially, but how should this non-square matrix be distributed across the MPI nodes when running in parallel, i.e. what values should I pass to MatSetSizes() for that matrix?<br>
</div><div><br>In any case, the error message I'm getting (running it with no command line options) is:<br><br>[0]PETSC ERROR: --------------------- Error Message ------------------------------------<br>[0]PETSC ERROR: Object is in wrong state!<br>
[0]PETSC ERROR: Mat object's type is not set: Argument # 1!<br>[0]PETSC ERROR: ------------------------------------------------------------------------<br>[0]PETSC ERROR: Petsc Release Version 3.4.3, Oct, 15, 2013 <br>
[0]PETSC ERROR: See docs/changes/index.html for recent updates.<br>[0]PETSC ERROR: See docs/faq.html for hints about trouble shooting.<br>[0]PETSC ERROR: See docs/index.html for manual pages.<br>[0]PETSC ERROR: ------------------------------------------------------------------------<br>
[0]PETSC ERROR: ./multigrid2.elf on a arch-linux2-cxx-debug named <a href="http://enlil.uio.no">enlil.uio.no</a> by tmac Tue Nov 12 19:57:59 2013<br>[0]PETSC ERROR: Libraries linked from /mn/anatu/cma-u3/tmac/usr/stow/petsc_complex_dbg/lib<br>
[0]PETSC ERROR: Configure run at Tue Nov 12 16:27:32 2013<br>[0]PETSC ERROR: Configure options CPPFLAGS=-I/mn/anatu/cma-u3/tmac/usr/include LDFLAGS=-L/mn/anatu/cma-u3/tmac/usr/lib -L/mn/anatu/cma-u3/tmac/usr/lib64 --prefix=/mn/anatu/cma-u3/tmac/usr/stow/petsc_complex_dbg --with-clanguage=C++ --with-scalar-type=complex --with-shared-libraries=1 --with-debugging=1 --with-superlu=1 --with-superlu-lib=/mn/anatu/cma-u3/tmac/usr/lib/libsuperlu.so --with-superlu-include=/mn/anatu/cma-u3/tmac/usr/include/superlu/<br>
[0]PETSC ERROR: ------------------------------------------------------------------------<br>[0]PETSC ERROR: MatGetVecs() line 8131 in /tmp/petsc-3.4.3/src/mat/interface/matrix.c<br>[0]PETSC ERROR: KSPGetVecs() line 929 in /tmp/petsc-3.4.3/src/ksp/ksp/interface/iterativ.c<br>
[0]PETSC ERROR: PCSetUp_MG() line 691 in /tmp/petsc-3.4.3/src/ksp/pc/impls/mg/mg.c<br>[0]PETSC ERROR: PCSetUp() line 890 in /tmp/petsc-3.4.3/src/ksp/pc/interface/precon.c<br>[0]PETSC ERROR: KSPSetUp() line 278 in /tmp/petsc-3.4.3/src/ksp/ksp/interface/itfunc.c<br>
[0]PETSC ERROR: main() line 56 in "unknowndirectory/"/mn/anatu/cma-u3/tmac/programming/fem/getfem/source/multigrid2.cpp<br>--------------------------------------------------------------------------<br>MPI_ABORT was invoked on rank 0 in communicator MPI_COMM_WORLD <br>
with errorcode 73.<br><br>NOTE: invoking MPI_ABORT causes Open MPI to kill all MPI processes.<br>You may or may not see output from other processes, depending on<br>exactly when Open MPI kills them.<br>--------------------------------------------------------------------------<br>
<br></div>The full code is:<br><div><br>#include "petscksp.h"<br><br>int main(int argc, char ** argv)<br>{<br>    PetscErrorCode ierr = PetscInitialize(&argc, &argv, 0, 0); CHKERRQ(ierr);<br><br>    Vec x;<br>
    Mat A;<br>    PetscInt rstart, rend, nlocal;<br><br>    PetscInt const n = 8;<br><br>    ierr = VecCreate(PETSC_COMM_WORLD, &x); CHKERRQ(ierr);<br>    ierr = VecSetSizes(x, PETSC_DECIDE, n); CHKERRQ(ierr);<br>    ierr = VecSetFromOptions(x); CHKERRQ(ierr);<br>
    ierr = VecGetOwnershipRange(x, &rstart, &rend); CHKERRQ(ierr);<br>    ierr = VecGetLocalSize(x, &nlocal); CHKERRQ(ierr);<br><br>    ierr = MatCreate(PETSC_COMM_WORLD, &A); CHKERRQ(ierr);<br>    ierr = MatSetSizes(A, nlocal, nlocal, n, n); CHKERRQ(ierr);<br>
    ierr = MatSetFromOptions(A); CHKERRQ(ierr);<br>    ierr = MatSetUp(A); CHKERRQ(ierr);<br>    for(PetscInt i = rstart; i < rend; ++i) {<br>        ierr = MatSetValue(A, i, i, 1.0, INSERT_VALUES); CHKERRQ(ierr);<br>    }<br>
    ierr = MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);<br>    ierr = MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);<br><br>    KSP ksp;<br>    ierr = KSPCreate(PETSC_COMM_WORLD, &ksp); CHKERRQ(ierr);<br>
    ierr = KSPSetOperators(ksp, A, A, SAME_NONZERO_PATTERN); CHKERRQ(ierr);<br>    ierr = KSPSetType(ksp, KSPFGMRES); CHKERRQ(ierr);<br><br>    PC pc;<br>    ierr = KSPGetPC(ksp, &pc); CHKERRQ(ierr);<br>    ierr = PCSetType(pc, PCMG); CHKERRQ(ierr);<br>
    ierr = PCMGSetLevels(pc, 2, 0); CHKERRQ(ierr);<br><br>    Mat interp;<br>    ierr = MatCreate(PETSC_COMM_WORLD, &interp); CHKERRQ(ierr);<br>    ierr = MatSetSizes(interp, PETSC_DECIDE, PETSC_DECIDE, n, n/2); CHKERRQ(ierr);<br>
    ierr = MatSetFromOptions(interp); CHKERRQ(ierr);<br>    ierr = MatSetUp(interp); CHKERRQ(ierr);<br>    ierr = MatGetOwnershipRange(interp, &rstart, &rend); CHKERRQ(ierr);<br>    for(PetscInt i = rstart; i < rend; ++i) {<br>
        ierr = MatSetValue(interp, i, i/2, 1.0, INSERT_VALUES); CHKERRQ(ierr);<br>    }<br>    ierr = MatAssemblyBegin(interp, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);<br>    ierr = MatAssemblyEnd(interp, MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);<br>
<br>    ierr = PCMGSetInterpolation(pc, 1, interp); CHKERRQ(ierr);<br>    ierr = MatDestroy(&interp); CHKERRQ(ierr);<br><br>    ierr = KSPSetFromOptions(ksp); CHKERRQ(ierr);<br>    ierr = KSPSetUp(ksp); CHKERRQ(ierr);<br>
<br>    ierr = VecDestroy(&x); CHKERRQ(ierr);<br>    ierr = MatDestroy(&A); CHKERRQ(ierr);<br>    ierr = KSPDestroy(&ksp); CHKERRQ(ierr);<br>    ierr = PetscFinalize(); CHKERRQ(ierr);<br><br>    return 0;<br>}<br>
</div></div>