Actual source code: ex12.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/petscsles.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:       SLES             sles
 25:       character*(128)  f
 26:       PetscViewer           fd
 27:       MatInfo          info(MAT_INFO_SIZE)
 28:       PetscLogDouble       time1,time2

 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_BINARY_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,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 SLESCreate(PETSC_COMM_WORLD,sles,ierr)
 60:       call SLESSetOperators(sles,A,A,DIFFERENT_NONZERO_PATTERN,         &
 61:      &                      ierr)
 62:       call SLESSetFromOptions(sles,ierr)
 63:       call PetscGetTime(time1,ierr)
 64:       call SLESSolve(sles,b,x,its,ierr)
 65:       call PetscGetTime(time2,ierr)

 67: ! Show result
 68:       call MatMult(A,x,u,ierr)
 69:       call VecAXPY(none,b,u,ierr)
 70:       call VecNorm(u,NORM_2,norm,ierr)
 71:       print*, 'Number of iterations = ',its
 72:       print*, 'Residual norm = ',norm
 73:       print*, 'Time for solve = ',time2-time1

 75: ! Cleanup
 76:       call SLESDestroy(sles,ierr)
 77:       call VecDestroy(b,ierr)
 78:       call VecDestroy(x,ierr)
 79:       call VecDestroy(u,ierr)
 80:       call MatDestroy(A,ierr)

 82:       call PetscFinalize(ierr)
 83:       end