Actual source code: ex71f.F90

  1: !     Contributed by leonardo.mutti01@universitadipavia.it
  2: #include <petsc/finclude/petscksp.h>
  3: program main
  4:   use petscksp
  5:   implicit none

  7:   Mat :: A
  8:   PetscInt :: M, M2, NSubx, dof, overlap, NSub, i1
  9:   PetscInt :: I, J
 10:   PetscMPIInt :: size
 11:   PetscErrorCode :: ierr
 12:   PetscScalar :: v
 13:   PC :: pc
 14:   IS, pointer :: subdomains_IS(:) => null(), inflated_IS(:) => null()
 15:   PetscViewer :: singleton

 17:   PetscCallA(PetscInitialize(PETSC_NULL_CHARACTER, ierr))
 18:   PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size, ierr))
 19:   M = 16
 20:   M2 = M*M
 21:   i1 = 1
 22:   PetscCallA(MatCreateFromOptions(PETSC_COMM_WORLD, PETSC_NULL_CHARACTER, i1, PETSC_DECIDE, PETSC_DECIDE, M2, M2, A, ierr))
 23:   do I = 1, M2
 24:     do J = 1, M2
 25:       v = I*J
 26:       PetscCallA(MatSetValue(A, I - 1, J - 1, v, INSERT_VALUES, ierr))
 27:     end do
 28:   end do

 30:   PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
 31:   PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
 32:   PetscCallA(PCCreate(PETSC_COMM_WORLD, pc, ierr))
 33:   PetscCallA(PCSetOperators(pc, A, A, ierr))
 34:   PetscCallA(PCSetType(pc, PCGASM, ierr))

 36:   NSubx = 4
 37:   dof = 1
 38:   overlap = 0

 40:   PetscCallA(PCGASMCreateSubdomains2D(pc, M, M, NSubx, NSubx, dof, overlap, NSub, subdomains_IS, inflated_IS, ierr))
 41:   PetscCallA(PCGASMSetSubdomains(pc, NSub, subdomains_IS, inflated_IS, ierr))
 42:   PetscCallA(PetscViewerGetSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, singleton, ierr))
 43:   PetscCallA(PetscViewerASCIIPrintf(singleton, 'GASM index sets from this MPI process\n', ierr))
 44:   do i = 1, Nsub
 45:     PetscCallA(ISView(subdomains_IS(i), singleton, ierr))
 46:   end do
 47:   PetscCallA(PetscViewerRestoreSubViewer(PETSC_VIEWER_STDOUT_WORLD, PETSC_COMM_SELF, singleton, ierr))
 48:   PetscCallA(PCGASMDestroySubdomains(NSub, subdomains_IS, inflated_IS, ierr))

 50:   if (size == 1) then
 51:     ! this routine only works on one rank
 52:     PetscCallA(PCASMCreateSubdomains2D(M, M, NSubx, NSubx, dof, overlap, NSub, subdomains_IS, inflated_IS, ierr))
 53:     do i = 1, Nsub
 54:       PetscCallA(ISView(subdomains_IS(i), PETSC_VIEWER_STDOUT_SELF, ierr))
 55:     end do
 56:     PetscCallA(PCASMDestroySubdomains(NSub, subdomains_IS, inflated_IS, ierr))
 57:   end if

 59:   PetscCallA(MatDestroy(A, ierr))
 60:   PetscCallA(PCDestroy(pc, ierr))
 61:   PetscCallA(PetscFinalize(ierr))
 62: end

 64: !/*TEST
 65: !
 66: !   test:
 67: !     suffix: 1
 68: !
 69: !   test:
 70: !     suffix: 2
 71: !     nsize: 2
 72: !
 73: !TEST*/