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