Actual source code: ex12f.F90

  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
 23:   KSP ksp

 25:   none = -1.0
 26:   PetscCallA(PetscInitialize(ierr))

 28: ! Read in matrix and RHS
 29:   PetscCallA(PetscOptionsGetString(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-f', f, flg, ierr))
 30:   PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, f, FILE_MODE_READ, fd, ierr))

 32:   PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
 33:   PetscCallA(MatSetType(A, MATSEQAIJ, ierr))
 34:   PetscCallA(MatLoad(A, fd, ierr))

 36: ! Get information about matrix
 37:   PetscCallA(MatGetSize(A, m, n, ierr))
 38:   PetscCallA(MatGetLocalSize(A, mlocal, nlocal, ierr))
 39:   PetscCallA(MatGetInfo(A, MAT_GLOBAL_SUM, info, ierr))
 40:   write (*, 100) m,                                                   &
 41:  &  n,                                                              &
 42:  &  mlocal, nlocal,                                                  &
 43:  &  info%BLOCK_SIZE, info%NZ_ALLOCATED,          &
 44:  &  info%NZ_USED, info%NZ_UNNEEDED,              &
 45:  &  info%MEMORY, info%ASSEMBLIES,                &
 46:  &  info%MALLOCS

 48: 100 format(4(i4, 1x), 7(1pe9.2, 1x))
 49:   PetscCallA(VecCreate(PETSC_COMM_WORLD, b, ierr))
 50:   PetscCallA(VecLoad(b, fd, ierr))
 51:   PetscCallA(PetscViewerDestroy(fd, ierr))

 53: ! Set up solution
 54:   PetscCallA(VecDuplicate(b, x, ierr))
 55:   PetscCallA(VecDuplicate(b, u, ierr))

 57: ! Solve system
 58:   PetscCallA(KSPCreate(PETSC_COMM_WORLD, ksp, ierr))
 59:   PetscCallA(KSPSetOperators(ksp, A, A, ierr))
 60:   PetscCallA(KSPSetFromOptions(ksp, ierr))
 61:   PetscCallA(KSPSolve(ksp, b, x, ierr))

 63: ! Show result
 64:   PetscCallA(MatMult(A, x, u, ierr))
 65:   PetscCallA(VecAXPY(u, none, b, ierr))
 66:   PetscCallA(VecNorm(u, NORM_2, norm, ierr))
 67:   PetscCallA(KSPGetIterationNumber(ksp, its, ierr))
 68:   write (6, 101) norm, its
 69: 101 format('Residual norm ', 1pe9.2, ' iterations ', i5)

 71: ! Cleanup
 72:   PetscCallA(KSPDestroy(ksp, ierr))
 73:   PetscCallA(VecDestroy(b, ierr))
 74:   PetscCallA(VecDestroy(x, ierr))
 75:   PetscCallA(VecDestroy(u, ierr))
 76:   PetscCallA(MatDestroy(A, ierr))

 78:   PetscCallA(PetscFinalize(ierr))
 79: end

 81: !/*TEST
 82: !
 83: !    test:
 84: !      args: -f ${DATAFILESPATH}/matrices/arco1 -options_left no
 85: !      requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
 86: !
 87: !TEST*/