Actual source code: ex12f.F
1: !
2: ! "$Id: ex12.F,v 1.37 2001/08/07 03:03:57 balay Exp $";
3: !
4: program main
5: implicit none
7: #include include/finclude/petsc.h
8: #include include/finclude/petscvec.h
9: #include include/finclude/petscmat.h
10: #include include/finclude/petscpc.h
11: #include include/finclude/petscksp.h
12: #include include/finclude/petscviewer.h
13: !
14: ! This example is the Fortran version of ex6.c. The program reads a PETSc matrix
15: ! and vector from a file and solves a linear system. Input arguments are:
16: ! -f <input_file> : file to load. For a 5X5 example of the 5-pt. stencil
17: ! use the file petsc/src/mat/examples/matbinary.ex
18: !
20: integer ierr,its,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: PetscLogDouble time1,time2
28: KSP ksp
30: none = -1.0
31: call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
33: ! Read in matrix and RHS
34: call PetscOptionsGetString(PETSC_NULL_CHARACTER,'-f',f,flg,ierr)
35: call PetscViewerBinaryOpen(PETSC_COMM_WORLD,f,PETSC_FILE_RDONLY, &
36: & fd,ierr)
38: call MatLoad(fd,MATSEQAIJ,A,ierr)
40: ! Get information about matrix
41: call MatGetInfo(A,MAT_GLOBAL_SUM,info,ierr)
42: write(6,100) info(MAT_INFO_ROWS_GLOBAL), &
43: & info(MAT_INFO_COLUMNS_GLOBAL), &
44: & info(MAT_INFO_ROWS_LOCAL),info(MAT_INFO_COLUMNS_LOCAL), &
45: & info(MAT_INFO_BLOCK_SIZE),info(MAT_INFO_NZ_ALLOCATED), &
46: & info(MAT_INFO_NZ_USED),info(MAT_INFO_NZ_UNNEEDED), &
47: & info(MAT_INFO_MEMORY),info(MAT_INFO_ASSEMBLIES), &
48: & info(MAT_INFO_MALLOCS)
50: 100 format(11(g7.1,1x))
51: call VecLoad(fd,PETSC_NULL_CHARACTER,b,ierr)
52: call PetscViewerDestroy(fd,ierr)
54: ! Set up solution
55: call VecDuplicate(b,x,ierr)
56: call VecDuplicate(b,u,ierr)
58: ! Solve system
59: call KSPCreate(PETSC_COMM_WORLD,ksp,ierr)
60: call KSPSetOperators(ksp,A,A,DIFFERENT_NONZERO_PATTERN,ierr)
61: call KSPSetFromOptions(ksp,ierr)
62: call PetscGetTime(time1,ierr)
63: call KSPSetRhs(ksp,b,ierr)
64: call KSPSetSolution(ksp,x,ierr)
65: call KSPSolve(ksp,ierr)
66: call PetscGetTime(time2,ierr)
68: ! Show result
69: call MatMult(A,x,u,ierr)
70: call VecAXPY(none,b,u,ierr)
71: call VecNorm(u,NORM_2,norm,ierr)
72: call KSPGetIterationNumber(ksp,its,ierr)
73: print*, 'Number of iterations = ',its
74: print*, 'Residual norm = ',norm
75: print*, 'Time for solve = ',time2-time1
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