Actual source code: ex11f.F90
1: ! Test MatCreateMPIAdj() with NULL argument 'values'
3: program main
4: #include <petsc/finclude/petscmat.h>
5: use petscmat
6: implicit none
8: Mat :: mesh, dual
9: MatPartitioning :: part
10: IS :: is
11: PetscInt, parameter :: Nvertices = 6, ncells = 2, two = 2
12: PetscInt :: ii(3), jj(6)
13: PetscMPIInt :: sz, rnk
14: PetscErrorCode :: ierr
16: PetscCallA(PetscInitialize(ierr))
18: PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, sz, ierr))
19: PetscCheckA(sz == 2, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, 'This example is for exactly two processes')
20: PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rnk, ierr))
21: ii(1) = 0
22: ii(2) = 3
23: ii(3) = 6
24: if (rnk == 0) then
25: jj(1) = 0
26: jj(2) = 1
27: jj(3) = 2
28: jj(4) = 1
29: jj(5) = 2
30: jj(6) = 3
31: else
32: jj(1) = 1
33: jj(2) = 4
34: jj(3) = 5
35: jj(4) = 1
36: jj(5) = 3
37: jj(6) = 5
38: end if
40: PetscCallA(MatCreateMPIAdj(PETSC_COMM_WORLD, ncells, Nvertices, ii, jj, PETSC_NULL_INTEGER_ARRAY, mesh, ierr))
41: PetscCallA(MatMeshToCellGraph(mesh, two, dual, ierr))
42: PetscCallA(MatView(dual, PETSC_VIEWER_STDOUT_WORLD, ierr))
44: PetscCallA(MatPartitioningCreate(PETSC_COMM_WORLD, part, ierr))
45: PetscCallA(MatPartitioningSetAdjacency(part, dual, ierr))
46: PetscCallA(MatPartitioningSetFromOptions(part, ierr))
47: PetscCallA(MatPartitioningApply(part, is, ierr))
48: PetscCallA(ISView(is, PETSC_VIEWER_STDOUT_WORLD, ierr))
49: PetscCallA(ISDestroy(is, ierr))
50: PetscCallA(MatPartitioningDestroy(part, ierr))
52: PetscCallA(MatDestroy(mesh, ierr))
53: PetscCallA(MatDestroy(dual, ierr))
54: PetscCallA(PetscFinalize(ierr))
56: end program
58: !/*TEST
59: !
60: ! build:
61: ! requires: parmetis
62: !
63: ! test:
64: ! nsize: 2
65: !
66: !TEST*/