xref: /petsc/src/mat/tutorials/ex17f.F90 (revision ce78bad369055609e946c9d2c25ea67a45873e27)
1c4762a1bSJed Brownprogram main
2c4762a1bSJed Brown#include <petsc/finclude/petscvec.h>
3c4762a1bSJed Brown#include <petsc/finclude/petscmat.h>
4c4762a1bSJed Brown
5c4762a1bSJed Brownuse petscvec
6c4762a1bSJed Brownuse petscmat
7c4762a1bSJed Brown
8c4762a1bSJed Brownimplicit 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
60*ce78bad3SBarry Smith  allocate(cols(1:3))
61*ce78bad3SBarry 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