Actual source code: ex12f.F
1: !
2: program main
3: implicit none
5: #include <finclude/petscsys.h>
6: #include <finclude/petscvec.h>
7: #include <finclude/petscmat.h>
8: #include <finclude/petscpc.h>
9: #include <finclude/petscksp.h>
10: #include <finclude/petscviewer.h>
11: !
12: ! This example is the Fortran version of ex6.c. The program reads a PETSc matrix
13: ! and vector from a file and solves a linear system. Input arguments are:
14: ! -f <input_file> : file to load. For a 5X5 example of the 5-pt. stencil
15: ! use the file petsc/src/mat/examples/matbinary.ex
16: !
18: PetscErrorCode ierr
19: PetscInt its,m,n,mlocal,nlocal
20: PetscBool flg
21: PetscScalar norm,none
22: Vec x,b,u
23: Mat A
24: character*(128) f
25: PetscViewer fd
26: MatInfo info(MAT_INFO_SIZE)
27: KSP ksp
29: none = -1.0
30: call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
32: ! Read in matrix and RHS
33: call PetscOptionsGetString(PETSC_NULL_CHARACTER,'-f',f,flg,ierr)
34: print *,f
35: call PetscViewerBinaryOpen(PETSC_COMM_WORLD,f,FILE_MODE_READ, &
36: & fd,ierr)
38: call MatCreate(PETSC_COMM_WORLD,A,ierr)
39: call MatSetType(A, MATSEQAIJ,ierr)
40: call MatLoad(A,fd,ierr)
42: ! Get information about matrix
43: call MatGetSize(A,m,n,ierr)
44: call MatGetLocalSize(A,mlocal,nlocal,ierr)
45: call MatGetInfo(A,MAT_GLOBAL_SUM,info,ierr)
46: write(*,100) m, &
47: & n, &
48: & mlocal,nlocal, &
49: & info(MAT_INFO_BLOCK_SIZE),info(MAT_INFO_NZ_ALLOCATED), &
50: & info(MAT_INFO_NZ_USED),info(MAT_INFO_NZ_UNNEEDED), &
51: & info(MAT_INFO_MEMORY),info(MAT_INFO_ASSEMBLIES), &
52: & info(MAT_INFO_MALLOCS)
54: 100 format(4(i4,1x),7(g7.1,1x))
55: call VecCreate(PETSC_COMM_WORLD,b,ierr)
56: call VecLoad(b,fd,ierr)
57: call PetscViewerDestroy(fd,ierr)
59: ! Set up solution
60: call VecDuplicate(b,x,ierr)
61: call VecDuplicate(b,u,ierr)
63: ! Solve system
64: call KSPCreate(PETSC_COMM_WORLD,ksp,ierr)
65: call KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN,ierr)
66: call KSPSetFromOptions(ksp,ierr)
67: call KSPSolve(ksp,b,x,ierr)
69: ! Show result
70: call MatMult(A,x,u,ierr)
71: call VecAXPY(u,none,b,ierr)
72: call VecNorm(u,NORM_2,norm,ierr)
73: call KSPGetIterationNumber(ksp,its,ierr)
74: write(6,101) norm,its
75: 101 format('Residual norm ',e10.4,' iterations ',i5)
77: ! Cleanup
78: call KSPDestroy(ksp,ierr)
79: call VecDestroy(b,ierr)
80: call VecDestroy(x,ierr)
81: call VecDestroy(u,ierr)
82: call MatDestroy(A,ierr)
84: call PetscFinalize(ierr)
85: end