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