Actual source code: ex12f.F

petsc-3.7.2 2016-06-05
Report Typos and Errors
  1: !
  2:       program main
  3:        implicit none

  5: #include <petsc/finclude/petscsys.h>
  6: #include <petsc/finclude/petscvec.h>
  7: #include <petsc/finclude/petscmat.h>
  8: #include <petsc/finclude/petscpc.h>
  9: #include <petsc/finclude/petscksp.h>
 10: #include <petsc/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 example see $PETSC_DIR/share/petsc/datafiles/matrices
 15: !

 17:       PetscErrorCode  ierr
 18:       PetscInt its,m,n,mlocal,nlocal
 19:       PetscBool  flg
 20:       PetscScalar      norm,none
 21:       Vec              x,b,u
 22:       Mat              A
 23:       character*(128)  f
 24:       PetscViewer      fd
 25:       MatInfo          info(MAT_INFO_SIZE)
 26:       KSP              ksp

 28:       none = -1.0
 29:       call PetscInitialize(PETSC_NULL_CHARACTER,ierr)

 31: ! Read in matrix and RHS
 32:       call PetscOptionsGetString(PETSC_NULL_OBJECT,PETSC_NULL_CHARACTER,&
 33:      &                           '-f',f,flg,ierr)
 34:       call PetscViewerBinaryOpen(PETSC_COMM_WORLD,f,FILE_MODE_READ,     &
 35:      &     fd,ierr)

 37:       call MatCreate(PETSC_COMM_WORLD,A,ierr)
 38:       call MatSetType(A, MATSEQAIJ,ierr)
 39:       call MatLoad(A,fd,ierr)

 41: ! Get information about matrix
 42:       call MatGetSize(A,m,n,ierr)
 43:       call MatGetLocalSize(A,mlocal,nlocal,ierr)
 44:       call MatGetInfo(A,MAT_GLOBAL_SUM,info,ierr)
 45:       write(*,100) m,                                                   &
 46:      &  n,                                                              &
 47:      &  mlocal,nlocal,                                                  &
 48:      &  info(MAT_INFO_BLOCK_SIZE),info(MAT_INFO_NZ_ALLOCATED),          &
 49:      &  info(MAT_INFO_NZ_USED),info(MAT_INFO_NZ_UNNEEDED),              &
 50:      &  info(MAT_INFO_MEMORY),info(MAT_INFO_ASSEMBLIES),                &
 51:      &  info(MAT_INFO_MALLOCS)

 53:  100  format(4(i4,1x),7(g7.1,1x))
 54:       call VecCreate(PETSC_COMM_WORLD,b,ierr)
 55:       call VecLoad(b,fd,ierr)
 56:       call PetscViewerDestroy(fd,ierr)

 58: ! Set up solution
 59:       call VecDuplicate(b,x,ierr)
 60:       call VecDuplicate(b,u,ierr)

 62: ! Solve system
 63:       call KSPCreate(PETSC_COMM_WORLD,ksp,ierr)
 64:       call KSPSetOperators(ksp,A,A,ierr)
 65:       call KSPSetFromOptions(ksp,ierr)
 66:       call KSPSolve(ksp,b,x,ierr)

 68: ! Show result
 69:       call MatMult(A,x,u,ierr)
 70:       call VecAXPY(u,none,b,ierr)
 71:       call VecNorm(u,NORM_2,norm,ierr)
 72:       call KSPGetIterationNumber(ksp,its,ierr)
 73:       write(6,101) norm,its
 74:  101  format('Residual norm ',e10.4,' iterations ',i5)

 76: ! Cleanup
 77:       call KSPDestroy(ksp,ierr)
 78:       call VecDestroy(b,ierr)
 79:       call VecDestroy(x,ierr)
 80:       call VecDestroy(u,ierr)
 81:       call MatDestroy(A,ierr)

 83:       call PetscFinalize(ierr)
 84:       end