Actual source code: ex12f.F
petsc-3.12.1 2019-10-22
1: !
2: program main
3: #include <petsc/finclude/petscksp.h>
4: use petscksp
5: implicit none
7: !
8: ! This example is the Fortran version of ex6.c. The program reads a PETSc matrix
9: ! and vector from a file and solves a linear system. Input arguments are:
10: ! -f <input_file> : file to load. For example see $PETSC_DIR/share/petsc/datafiles/matrices
11: !
13: PetscErrorCode ierr
14: PetscInt its,m,n,mlocal,nlocal
15: PetscBool flg
16: PetscScalar none
17: PetscReal norm
18: Vec x,b,u
19: Mat A
20: character*(128) f
21: PetscViewer fd
22: MatInfo info(MAT_INFO_SIZE)
23: KSP ksp
25: none = -1.0
26: call PetscInitialize(PETSC_NULL_CHARACTER,ierr)
27: if (ierr .ne. 0) then
28: print*,'Unable to initialize PETSc'
29: stop
30: endif
32: ! Read in matrix and RHS
33: call PetscOptionsGetString(PETSC_NULL_OPTIONS, &
34: & PETSC_NULL_CHARACTER,'-f',f,flg,ierr)
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(g8.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,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 ',e11.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
87: !/*TEST
88: !
89: ! test:
90: ! args: -f ${DATAFILESPATH}/matrices/arco1 -options_left no
91: ! requires: datafilespath double !complex !define(PETSC_USE_64BIT_INDICES)
92: !
93: !TEST*/