Hello. I am having a hard time understanding the index sets to feed
PCGASMSetSubdomains, and I am working in Fortran (as a PETSc novice). To
get more intuition on how the IS objects behave I tried the following
minimal (non) working example, which should tile a 16x16 matrix into 16
square, non-overlapping submatrices:

#include <petsc/finclude/petscmat.h>
#include <petsc/finclude/petscksp.h>
#include <petsc/finclude/petscpc.h>
      USE petscmat
      USE petscksp
      USE petscpc

      Mat   :: A
      PetscInt :: M, NSubx, dof, overlap, NSub
      INTEGER :: I,J
      PetscErrorCode      :: ierr
      PetscScalar :: v
      KSP            :: ksp
      PC             :: pc
      IS :: subdomains_IS, inflated_IS

      call PetscInitialize(PETSC_NULL_CHARACTER , ierr)

!-----Create a dummy matrix
      M = 16
      call MatCreateAIJ(MPI_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE,
     & M, M,
     & PETSC_DEFAULT_INTEGER, PETSC_NULL_INTEGER,
     & PETSC_DEFAULT_INTEGER, PETSC_NULL_INTEGER,
     & A, ierr)

      DO I=1,M
         DO J=1,M
            v = I*J
            CALL MatSetValue (A,I-1,J-1,v,
     &                     INSERT_VALUES , ierr)
         END DO
      END DO

      call MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY , ierr)
      call MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY , ierr)

!-----Create KSP and PC
      call KSPCreate(PETSC_COMM_WORLD,ksp, ierr)
      call KSPSetOperators(ksp,A,A, ierr)
      call KSPSetType(ksp,"bcgs",ierr)
      call KSPGetPC(ksp,pc,ierr)
      call KSPSetUp(ksp, ierr)
      call PCSetType(pc,PCGASM, ierr)
      call PCSetUp(pc , ierr)

!-----GASM setup
      NSubx = 4
      dof = 1
      overlap = 0

      call PCGASMCreateSubdomains2D(pc,
     &      M, M,
     &      NSubx, NSubx,
     &      dof, overlap,
     &      NSub, subdomains_IS, inflated_IS, ierr)

      call ISView(subdomains_IS, PETSC_VIEWER_STDOUT_WORLD, ierr)

      call KSPDestroy(ksp, ierr)
      call PetscFinalize(ierr)

Running this on one processor, I get NSub = 4.
If PCASM and PCASMCreateSubdomains2D are used instead, I get NSub = 16 as
expected.
Moreover, I get in the end "forrtl: severe (157): Program Exception -
access violation". So:
1) why do I get two different results with ASM, and GASM?
2) why do I get access violation and how can I solve this?
In fact, in C, subdomains_IS, inflated_IS should pointers to IS objects. As
I see on the Fortran interface, the arguments to PCGASMCreateSubdomains2D
are IS objects:

       subroutine PCGASMCreateSubdomains2D(a,b,c,d,e,f,g,h,i,j,z)
       import tPC,tIS
       PC a ! PC
       PetscInt b ! PetscInt
       PetscInt c ! PetscInt
       PetscInt d ! PetscInt
       PetscInt e ! PetscInt
       PetscInt f ! PetscInt
       PetscInt g ! PetscInt
       PetscInt h ! PetscInt
       IS i ! IS
       IS j ! IS
       PetscErrorCode z
       end subroutine PCGASMCreateSubdomains2D
Thus:
3) what should be inside e.g., subdomains_IS? I expect it to contain, for
every created subdomain, the list of rows and columns defining the subblock
in the matrix, am I right?

Context: I have a block-tridiagonal system arising from space-time finite
elements, and I want to solve it with GMRES+PCGASM preconditioner, where
each overlapping submatrix is on the diagonal and of size 3x3 blocks (and
spanning multiple processes). This is PETSc 3.17.1 on Windows.

Thanks in advance,
Leonardo

Reply via email to