Actual source code: ex17f.F90

  1: #include <petsc/finclude/petscmat.h>
  2: program main
  3:   use petscmat

  5:   implicit none

  7:   Mat A
  8:   MatPartitioning part
  9:   IS is
 10:   PetscInt   ::     i, m, N
 11:   PetscInt   ::     rstart, rend
 12:   PetscInt, pointer, dimension(:) ::   emptyranks, bigranks, cols
 13:   PetscScalar, pointer, dimension(:) :: vals
 14:   PetscInt :: &
 15:     nbigranks = 10, &
 16:     nemptyranks = 10
 17:   PetscMPIInt   ::  rank, sizef
 18:   PetscErrorCode ierr
 19:   PetscBool set

 21:   PetscCallA(PetscInitialize(ierr))

 23:   PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
 24:   PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, sizef, ierr))

 26:   allocate (emptyranks(nemptyranks))
 27:   allocate (bigranks(nbigranks))

 29:   PetscCallA(PetscOptionsGetIntArray(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-emptyranks', emptyranks, nemptyranks, set, ierr))
 30:   PetscCallA(PetscOptionsGetIntArray(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-bigranks', bigranks, nbigranks, set, ierr))

 32:   m = 1
 33:   do i = 1, nemptyranks
 34:     if (rank == emptyranks(i)) m = 0
 35:   end do
 36:   do i = 1, nbigranks
 37:     if (rank == bigranks(i)) m = 5
 38:   end do

 40:   deallocate (emptyranks)
 41:   deallocate (bigranks)

 43:   PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
 44:   PetscCallA(MatSetsizes(A, m, m, PETSC_DECIDE, PETSC_DECIDE, ierr))
 45:   PetscCallA(MatSetFromOptions(A, ierr))
 46:   PetscCallA(MatSeqAIJSetPreallocation(A, 3_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
 47:   PetscCallA(MatMPIAIJSetPreallocation(A, 3_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, 2_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
 48:   PetscCallA(MatSeqBAIJSetPreallocation(A, 1_PETSC_INT_KIND, 3_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
 49:   PetscCallA(MatMPIBAIJSetPreallocation(A, 1_PETSC_INT_KIND, 3_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, 2_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
 50:   PetscCallA(MatSeqSBAIJSetPreallocation(A, 1_PETSC_INT_KIND, 2_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))
 51:   PetscCallA(MatMPISBAIJSetPreallocation(A, 1_PETSC_INT_KIND, 2_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, 1_PETSC_INT_KIND, PETSC_NULL_INTEGER_ARRAY, ierr))

 53:   PetscCallA(MatGetSize(A, PETSC_NULL_INTEGER, N, ierr))
 54:   PetscCallA(MatGetOwnershipRange(A, rstart, rend, ierr))

 56:   allocate (cols(1:3))
 57:   allocate (vals(1:3))
 58:   do i = rstart, rend - 1
 59:     cols = [mod(i + N - 1, N), i, mod(i + 1, N)]
 60:     vals = [1.0, 1.0, 1.0]
 61:     PetscCallA(MatSetValues(A, 1_PETSC_INT_KIND, [i], 3_PETSC_INT_KIND, cols, vals, INSERT_VALUES, ierr))
 62:   end do
 63:   deallocate (cols)
 64:   deallocate (vals)
 65:   PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
 66:   PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
 67:   PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr))

 69:   PetscCallA(MatPartitioningCreate(PETSC_COMM_WORLD, part, ierr))
 70:   PetscCallA(MatPartitioningSetAdjacency(part, A, ierr))
 71:   PetscCallA(MatPartitioningSetFromOptions(part, ierr))
 72:   PetscCallA(MatPartitioningApply(part, is, ierr))
 73:   PetscCallA(ISView(is, PETSC_VIEWER_STDOUT_WORLD, ierr))
 74:   PetscCallA(ISDestroy(is, ierr))
 75:   PetscCallA(MatPartitioningDestroy(part, ierr))
 76:   PetscCallA(MatDestroy(A, ierr))
 77:   PetscCallA(PetscFinalize(ierr))

 79: end program

 81: !/*TEST
 82: !
 83: !   test:
 84: !      nsize: 8
 85: !      args: -emptyranks 0,2,4 -bigranks 1,3,7 -mat_partitioning_type average
 86: !      output_file: output/ex17_1.out
 87: !      # cannot test with external package partitioners since they produce different results on different systems
 88: !
 89: !TEST*/