1! 2! 3! Tests MatDenseGetArray() 4! 5 6program main 7#include <petsc/finclude/petscmat.h> 8 use petscmat 9 implicit none 10 11 Mat A 12 PetscErrorCode ierr 13 PetscInt i, j, m, n, iar(1), jar(1) 14 PetscInt one 15 PetscScalar v(1) 16 PetscScalar, pointer :: array(:, :) 17 PetscMPIInt rank 18 integer :: ashape(2) 19 character(len=80) :: string 20 21 PetscCallA(PetscInitialize(ierr)) 22 m = 3 23 n = 2 24 one = 1 25! 26! Create a parallel dense matrix shared by all processors 27! 28 PetscCallA(MatCreateDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, m, n, PETSC_NULL_SCALAR_ARRAY, A, ierr)) 29 30! 31! Set values into the matrix. All processors set all values. 32! 33 do 10, i = 0, m - 1 34 iar(1) = i 35 do 20, j = 0, n - 1 36 jar(1) = j 37 v(1) = 9.0/real(i + j + 1) 38 PetscCallA(MatSetValues(A, one, iar, one, jar, v, INSERT_VALUES, ierr)) 3920 continue 4010 continue 41 42 PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr)) 43 PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr)) 44 45! 46! Print the matrix to the screen 47! 48 PetscCallA(MatView(A, PETSC_VIEWER_STDOUT_WORLD, ierr)) 49 50! 51! Print the local matrix shape to the screen for each rank 52! 53 PetscCallA(MatDenseGetArray(A, array, ierr)) 54 PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr)) 55 ashape = shape(array) 56 write (string, '("[", i0, "]", " shape (", i0, ",", i0, ")", a1)') rank, ashape(1), ashape(2), new_line('a') 57 PetscCallA(PetscSynchronizedPrintf(PETSC_COMM_WORLD, string, ierr)) 58 PetscCallA(PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT, ierr)) 59 PetscCallA(MatDenseRestoreArray(A, array, ierr)) 60! 61! Free the space used by the matrix 62! 63 PetscCallA(MatDestroy(A, ierr)) 64 PetscCallA(PetscFinalize(ierr)) 65 end 66 67!/*TEST 68! 69! test: 70! nsize: 2 71! filter: sort -b 72! filter_output: sort -b 73! 74!TEST*/ 75