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 == 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:       end do
 35:     end do

 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:   end if

 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*/