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