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: PetscTruth 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 MatLoad(fd,MATSEQAIJ,A,ierr)
40: ! Get information about matrix
41: call MatGetSize(A,m,n,ierr)
42: call MatGetLocalSize(A,mlocal,nlocal,ierr)
43: call MatGetInfo(A,MAT_GLOBAL_SUM,info,ierr)
44: write(*,100) m, &
45: & n, &
46: & mlocal,nlocal, &
47: & info(MAT_INFO_BLOCK_SIZE),info(MAT_INFO_NZ_ALLOCATED), &
48: & info(MAT_INFO_NZ_USED),info(MAT_INFO_NZ_UNNEEDED), &
49: & info(MAT_INFO_MEMORY),info(MAT_INFO_ASSEMBLIES), &
50: & info(MAT_INFO_MALLOCS)
52: 100 format(4(i4,1x),7(g7.1,1x))
53: call VecLoad(fd,PETSC_NULL_CHARACTER,b,ierr)
54: call PetscViewerDestroy(fd,ierr)
56: ! Set up solution
57: call VecDuplicate(b,x,ierr)
58: call VecDuplicate(b,u,ierr)
60: ! Solve system
61: call KSPCreate(PETSC_COMM_WORLD,ksp,ierr)
62: call KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN,ierr)
63: call KSPSetFromOptions(ksp,ierr)
64: call KSPSolve(ksp,b,x,ierr)
66: ! Show result
67: call MatMult(A,x,u,ierr)
68: call VecAXPY(u,none,b,ierr)
69: call VecNorm(u,NORM_2,norm,ierr)
70: call KSPGetIterationNumber(ksp,its,ierr)
71: write(6,101) norm,its
72: 101 format('Residual norm ',e10.4,' iterations ',i5)
74: ! Cleanup
75: call KSPDestroy(ksp,ierr)
76: call VecDestroy(b,ierr)
77: call VecDestroy(x,ierr)
78: call VecDestroy(u,ierr)
79: call MatDestroy(A,ierr)
81: call PetscFinalize(ierr)
82: end