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