Date: 2025-03-29T05:58:39+00:00

Actual source code: ex15f.F90

      1: program main

      3: #include <petsc/finclude/petscvec.h>
      4: #include <petsc/finclude/petscmat.h>

      6:   use petscvec
      7:   use petscmat

      9:   implicit none

     11:   Mat             :: A
     12:   MatPartitioning :: part
     13:   IS              :: is
     14:   PetscInt        :: r,myStart,myEnd
     15:   PetscInt        :: N = 10
     16:   PetscErrorCode  :: ierr
     17:   PetscScalar,pointer,dimension(:) :: vals
     18:   PetscInt,pointer,dimension(:) :: cols
     19:   PetscBool :: flg
     20:   PetscInt,parameter :: one = 1, two = 2, three = 3

     22:   PetscCallA(PetscInitialize(ierr))

     24:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-N',N,flg,ierr))
     25:   PetscCallA(MatCreate(PETSC_COMM_WORLD, A,ierr))
     26:   PetscCallA(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, N, N,ierr))
     27:   PetscCallA(MatSetFromOptions(A,ierr))
     28:   PetscCallA(MatSeqAIJSetPreallocation(A, three, PETSC_NULL_INTEGER_ARRAY,ierr))
     29:   PetscCallA(MatMPIAIJSetPreallocation(A, three, PETSC_NULL_INTEGER_ARRAY, two, PETSC_NULL_INTEGER_ARRAY,ierr))

     31:   !/* Create a linear mesh */
     32:   PetscCallA(MatGetOwnershipRange(A, myStart, myEnd,ierr))

     34:   do r=myStart,myEnd-1
     35:     if (r == 0) then
     36:      allocate(vals(2))
     37:      vals = 1.0
     38:      allocate(cols(2),source=[r,r+1])
     39:      PetscCallA(MatSetValues(A, one, [r], two, cols, vals, INSERT_VALUES,ierr))
     40:      deallocate(cols)
     41:      deallocate(vals)
     42:     else if (r == N-1) then
     43:      allocate(vals(2))
     44:      vals = 1.0
     45:      allocate(cols(2),source=[r-1,r])
     46:      PetscCallA(MatSetValues(A, one, [r], two, cols, vals, INSERT_VALUES,ierr))
     47:      deallocate(cols)
     48:      deallocate(vals)
     49:     else
     50:      allocate(vals(3))
     51:      vals = 1.0
     52:      allocate(cols(3),source=[r-1,r,r+1])
     53:      PetscCallA(MatSetValues(A, one, [r], three, cols, vals, INSERT_VALUES,ierr))
     54:      deallocate(cols)
     55:      deallocate(vals)
     56:     end if
     57:   end do
     58:   PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY,ierr))
     59:   PetscCallA(MatAssemblyend(A, MAT_FINAL_ASSEMBLY,ierr))
     60:   PetscCallA(MatPartitioningCreate(PETSC_COMM_WORLD, part,ierr))
     61:   PetscCallA(MatPartitioningSetAdjacency(part, A,ierr))
     62:   PetscCallA(MatPartitioningSetFromOptions(part,ierr))
     63:   PetscCallA(MatPartitioningApply(part, is,ierr))
     64:   PetscCallA(ISView(is, PETSC_VIEWER_STDOUT_WORLD,ierr))
     65:   PetscCallA(ISDestroy(is,ierr))
     66:   PetscCallA(MatPartitioningDestroy(part,ierr))
     67:   PetscCallA(MatDestroy(A,ierr))
     68:   PetscCallA(PetscFinalize(ierr))

     70: end program

     72: !/*TEST
     73: !
     74: !   test:
     75: !      nsize: 3
     76: !      requires: parmetis
     77: !      args: -mat_partitioning_type parmetis
     78: !      output_file: output/ex15_1.out
     79: !
     80: !   test:
     81: !      suffix: 2
     82: !      nsize: 3
     83: !      requires: ptscotch
     84: !      args: -mat_partitioning_type ptscotch
     85: !      output_file: output/ex15_2.out
     86: !
     87: !   test:
     88: !      suffix: 3
     89: !      nsize: 4
     90: !      requires: party
     91: !      args: -mat_partitioning_type party
     92: !      output_file: output/ex15_3.out
     93: !
     94: !   test:
     95: !      suffix: 4
     96: !      nsize: 3
     97: !      requires: chaco
     98: !      args: -mat_partitioning_type chaco
     99: !      output_file: output/ex15_4.out
    100: !
    101: !   test:
    102: !      suffix: 5
    103: !      nsize: 3
    104: !      requires: parmetis
    105: !      args: -mat_partitioning_type hierarch -mat_partitioning_hierarchical_nfineparts 3 -mat_partitioning_nparts 10 -N 100
    106: !      output_file: output/ex15_5.out
    107: !
    108: !TEST*/