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