xref: /petsc/src/mat/tutorials/ex17f.F90 (revision c5e229c2f66f66995aed5443a26600af2aec4a3f)
1c4762a1bSJed Brown#include <petsc/finclude/petscvec.h>
2c4762a1bSJed Brown#include <petsc/finclude/petscmat.h>
3*c5e229c2SMartin Diehlprogram main
4c4762a1bSJed Brown
5c4762a1bSJed Brown  use petscvec
6c4762a1bSJed Brown  use petscmat
7c4762a1bSJed Brown
8c4762a1bSJed Brown  implicit none
9c4762a1bSJed Brown
10c4762a1bSJed Brown  Mat A
11c4762a1bSJed Brown  MatPartitioning part
12c4762a1bSJed Brown  IS is
13c4762a1bSJed Brown  PetscInt   ::     i, m, N
14c4762a1bSJed Brown  PetscInt   ::     rstart, rend
15c4762a1bSJed Brown  PetscInt, pointer, dimension(:) ::   emptyranks, bigranks, cols
16c4762a1bSJed Brown  PetscScalar, pointer, dimension(:) :: vals
17c4762a1bSJed Brown  PetscInt :: &
18c4762a1bSJed Brown    nbigranks = 10, &
19c4762a1bSJed Brown    nemptyranks = 10
20c4762a1bSJed Brown  PetscMPIInt   ::  rank, sizef
21c4762a1bSJed Brown  PetscErrorCode ierr
22c4762a1bSJed Brown  PetscBool set
23c4762a1bSJed Brown  PetscInt, parameter :: zero = 0, one = 1, two = 2, three = 3
24c4762a1bSJed Brown
25d8606c27SBarry Smith  PetscCallA(PetscInitialize(ierr))
26c4762a1bSJed Brown
27d8606c27SBarry Smith  PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
28d8606c27SBarry Smith  PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, sizef, ierr))
29c4762a1bSJed Brown
30c4762a1bSJed Brown  allocate (emptyranks(nemptyranks))
31c4762a1bSJed Brown  allocate (bigranks(nbigranks))
32c4762a1bSJed Brown
33dcb3e689SBarry Smith  PetscCallA(PetscOptionsGetIntArray(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-emptyranks', emptyranks, nemptyranks, set, ierr))
34dcb3e689SBarry Smith  PetscCallA(PetscOptionsGetIntArray(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-bigranks', bigranks, nbigranks, set, ierr))
35c4762a1bSJed Brown
36c4762a1bSJed Brown  m = 1
37c4762a1bSJed Brown  do i = 1, nemptyranks
38c4762a1bSJed Brown    if (rank == emptyranks(i)) m = 0
39c4762a1bSJed Brown  end do
40c4762a1bSJed Brown  do i = 1, nbigranks
41c4762a1bSJed Brown    if (rank == bigranks(i)) m = 5
42c4762a1bSJed Brown  end do
43c4762a1bSJed Brown
44c4762a1bSJed Brown  deallocate (emptyranks)
45c4762a1bSJed Brown  deallocate (bigranks)
46c4762a1bSJed Brown
47d8606c27SBarry Smith  PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
48d8606c27SBarry Smith  PetscCallA(MatSetsizes(A, m, m, PETSC_DECIDE, PETSC_DECIDE, ierr))
49d8606c27SBarry Smith  PetscCallA(MatSetFromOptions(A, ierr))
505d83a8b1SBarry Smith  PetscCallA(MatSeqAIJSetPreallocation(A, three, PETSC_NULL_INTEGER_ARRAY, ierr))
515d83a8b1SBarry Smith  PetscCallA(MatMPIAIJSetPreallocation(A, three, PETSC_NULL_INTEGER_ARRAY, two, PETSC_NULL_INTEGER_ARRAY, ierr))
525d83a8b1SBarry Smith  PetscCallA(MatSeqBAIJSetPreallocation(A, one, three, PETSC_NULL_INTEGER_ARRAY, ierr))
535d83a8b1SBarry Smith  PetscCallA(MatMPIBAIJSetPreallocation(A, one, three, PETSC_NULL_INTEGER_ARRAY, two, PETSC_NULL_INTEGER_ARRAY, ierr))
545d83a8b1SBarry Smith  PetscCallA(MatSeqSBAIJSetPreallocation(A, one, two, PETSC_NULL_INTEGER_ARRAY, ierr))
555d83a8b1SBarry Smith  PetscCallA(MatMPISBAIJSetPreallocation(A, one, two, PETSC_NULL_INTEGER_ARRAY, one, PETSC_NULL_INTEGER_ARRAY, ierr))
56c4762a1bSJed Brown
57d8606c27SBarry Smith  PetscCallA(MatGetSize(A, PETSC_NULL_INTEGER, N, ierr))
58d8606c27SBarry Smith  PetscCallA(MatGetOwnershipRange(A, rstart, rend, ierr))
59c4762a1bSJed Brown
60ce78bad3SBarry Smith  allocate (cols(1:3))
61ce78bad3SBarry Smith  allocate (vals(1:3))
62c4762a1bSJed Brown  do i = rstart, rend - 1
63c4762a1bSJed Brown
64c4762a1bSJed Brown    cols = (/mod((i + N - 1), N), i, mod((i + 1), N)/)
65c4762a1bSJed Brown    vals = [1.0, 1.0, 1.0]
665d83a8b1SBarry Smith    PetscCallA(MatSetValues(A, one, [i], three, cols, vals, INSERT_VALUES, ierr))
67c4762a1bSJed Brown  end do
68c4762a1bSJed Brown  deallocate (cols)
69c4762a1bSJed Brown  deallocate (vals)
70d8606c27SBarry Smith  PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
71d8606c27SBarry Smith  PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
72d8606c27SBarry Smith  PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr))
73c4762a1bSJed Brown
74d8606c27SBarry Smith  PetscCallA(MatPartitioningCreate(PETSC_COMM_WORLD, part, ierr))
75d8606c27SBarry Smith  PetscCallA(MatPartitioningSetAdjacency(part, A, ierr))
76d8606c27SBarry Smith  PetscCallA(MatPartitioningSetFromOptions(part, ierr))
77d8606c27SBarry Smith  PetscCallA(MatPartitioningApply(part, is, ierr))
78d8606c27SBarry Smith  PetscCallA(ISView(is, PETSC_VIEWER_STDOUT_WORLD, ierr))
79d8606c27SBarry Smith  PetscCallA(ISDestroy(is, ierr))
80d8606c27SBarry Smith  PetscCallA(MatPartitioningDestroy(part, ierr))
81d8606c27SBarry Smith  PetscCallA(MatDestroy(A, ierr))
82d8606c27SBarry Smith  PetscCallA(PetscFinalize(ierr))
83c4762a1bSJed Brown
84c4762a1bSJed Brownend program
85c4762a1bSJed Brown
86c4762a1bSJed Brown!/*TEST
87c4762a1bSJed Brown!
88c4762a1bSJed Brown!   test:
89c4762a1bSJed Brown!      nsize: 8
90c4762a1bSJed Brown!      args: -emptyranks 0,2,4 -bigranks 1,3,7 -mat_partitioning_type average
91c4762a1bSJed Brown!      output_file: output/ex17_1.out
92c4762a1bSJed Brown!      # cannot test with external package partitioners since they produce different results on different systems
93c4762a1bSJed Brown!
94c4762a1bSJed Brown!TEST*/
95