1! 2! 3! This program tests storage of PETSc Dense matrix. 4! It Creates a Dense matrix, and stores it into a file, 5! and then reads it back in as a SeqDense and MPIDense 6! matrix, and prints out the contents. 7! 8 program main 9#include <petsc/finclude/petscmat.h> 10 use petscmat 11 implicit none 12 13 PetscErrorCode ierr 14 PetscInt row,col,ten 15 PetscMPIInt rank 16 PetscScalar v 17 Mat A 18 PetscViewer view 19 20 PetscCallA(PetscInitialize(ierr)) 21 22 PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD,rank,ierr)) 23! 24! Proc-0 Create a seq-dense matrix and write it to a file 25! 26 if (rank .eq. 0) then 27 ten = 10 28 PetscCallA(MatCreateSeqDense(PETSC_COMM_SELF,ten,ten,PETSC_NULL_SCALAR_ARRAY,A,ierr)) 29 v = 1.0 30 do row=0,9 31 do col=0,9 32 PetscCallA(MatSetValue(A,row,col,v,INSERT_VALUES,ierr)) 33 v = v + 1.0 34 enddo 35 enddo 36 37 PetscCallA(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr)) 38 PetscCallA(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr)) 39 40 PetscCallA(PetscObjectSetName(A,'Original Matrix',ierr)) 41 PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_SELF,ierr)) 42! 43! Now Write this matrix to a binary file 44! 45 PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_SELF,'dense.mat',FILE_MODE_WRITE,view,ierr)) 46 PetscCallA(MatView(A,view,ierr)) 47 PetscCallA(PetscViewerDestroy(view,ierr)) 48 PetscCallA(MatDestroy(A,ierr)) 49! 50! Read this matrix into a SeqDense matrix 51 52 PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_SELF,'dense.mat',FILE_MODE_READ,view,ierr)) 53 PetscCallA(MatCreate(PETSC_COMM_SELF,A,ierr)) 54 PetscCallA(MatSetType(A, MATSEQDENSE,ierr)) 55 PetscCallA(MatLoad(A,view,ierr)) 56 57 PetscCallA(PetscObjectSetName(A,'SeqDense Matrix read in from file',ierr)) 58 PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_SELF,ierr)) 59 PetscCallA(MatDestroy(A,ierr)) 60 PetscCallA(PetscViewerDestroy(view,ierr)) 61 endif 62 63! 64! Use a barrier, so that the procs do not try opening the file before 65! it is created. 66! 67 PetscCallMPIA(MPI_Barrier(PETSC_COMM_WORLD,ierr)) 68 69 PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD,'dense.mat',FILE_MODE_READ,view,ierr)) 70 PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr)) 71 PetscCallA(MatSetType(A, MATMPIDENSE,ierr)) 72 PetscCallA(MatLoad(A,view,ierr)) 73 74 PetscCallA(PetscObjectSetName(A, 'MPIDense Matrix read in from file',ierr)) 75 PetscCallA(MatView(A,PETSC_VIEWER_STDOUT_WORLD,ierr)) 76 PetscCallA(MatDestroy(A,ierr)) 77 PetscCallA(PetscViewerDestroy(view,ierr)) 78 PetscCallA(PetscFinalize(ierr)) 79 end 80 81!/*TEST 82! 83! test: 84! nsize: 2 85! output_file: output/ex63_1.out 86! 87!TEST*/ 88