Actual source code: ex12f.F

petsc-3.12.1 2019-10-22
Report Typos and Errors
  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*/