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