Actual source code: ex63f.F90

  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

 13:       PetscErrorCode ierr
 14:       PetscInt row,col,ten
 15:       PetscMPIInt rank
 16:       PetscScalar  v
 17:       Mat     A
 18:       PetscViewer  view

 20:       PetscCallA(PetscInitialize(ierr))

 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,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

 37:          PetscCallA(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY,ierr))
 38:          PetscCallA(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY,ierr))

 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

 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))

 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

 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))

 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))

 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

 81: !/*TEST
 82: !
 83: !   test:
 84: !      nsize: 2
 85: !      output_file: output/ex63_1.out
 86: !
 87: !TEST*/