Actual source code: test7f.F90

      1: !
      2: !  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      3: !  SLEPc - Scalable Library for Eigenvalue Problem Computations
      4: !  Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
      5: !
      6: !  This file is part of SLEPc.
      7: !  SLEPc is distributed under a 2-clause BSD license (see LICENSE).
      8: !  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      9: !
     10: !  Program usage: mpiexec -n <np> ./test7f [-help] [-n <n>] [all SLEPc options]
     11: !
     12: !  Description: Simple example that solves an eigensystem with the EPS object.
     13: !  Same problem as ex1f but with simplified output.
     14: !
     15: !  The command line options are:
     16: !    -n <n>, where <n> = number of grid points = matrix size
     17: !
     18: ! ----------------------------------------------------------------------
     19: !
     20: #include <slepc/finclude/slepceps.h>
     21: program test7f
     22:   use slepceps
     23:   implicit none

     25: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     26: ! Declarations
     27: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     29:   Mat            :: A     ! operator matrix
     30:   EPS            :: eps   ! eigenproblem solver context
     31:   EPSType        :: tname
     32:   PetscInt       :: n, i, Istart, Iend
     33:   PetscInt       :: nev, nini
     34:   PetscInt       :: col(3)
     35:   PetscInt       :: i0, i1, i2, i3
     36:   PetscMPIInt    :: rank
     37:   PetscErrorCode :: ierr
     38:   PetscBool      :: flg
     39:   PetscScalar    :: val(3)
     40:   Vec            :: v
     41:   PetscScalar, parameter :: one = 1.0

     43: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     44: ! Beginning of program
     45: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     47:   PetscCallA(SlepcInitialize(PETSC_NULL_CHARACTER, ierr))
     48:   PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
     49:   n = 30
     50:   PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))

     52:   if (rank == 0) then
     53:     write (*, '(/a,i3,a)') '1-D Laplacian Eigenproblem, n =', n, ' (Fortran)'
     54:   end if

     56: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     57: ! Compute the operator matrix that defines the eigensystem, Ax=kx
     58: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

     60:   PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
     61:   PetscCallA(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n, ierr))
     62:   PetscCallA(MatSetFromOptions(A, ierr))

     64:   i0 = 0
     65:   i1 = 1
     66:   i2 = 2
     67:   i3 = 3
     68:   PetscCallA(MatGetOwnershipRange(A, Istart, Iend, ierr))
     69:   if (Istart == 0) then
     70:     i = 0
     71:     col(1) = 0
     72:     col(2) = 1
     73:     val(1) = 2.0
     74:     val(2) = -1.0
     75:     PetscCallA(MatSetValues(A, i1, [i], i2, col, val, INSERT_VALUES, ierr))
     76:     Istart = Istart + 1
     77:   end if
     78:   if (Iend == n) then
     79:     i = n - 1
     80:     col(1) = n - 2
     81:     col(2) = n - 1
     82:     val(1) = -1.0
     83:     val(2) = 2.0
     84:     PetscCallA(MatSetValues(A, i1, [i], i2, col, val, INSERT_VALUES, ierr))
     85:     Iend = Iend - 1
     86:   end if
     87:   val(1) = -1.0
     88:   val(2) = 2.0
     89:   val(3) = -1.0
     90:   do i = Istart, Iend - 1
     91:     col(1) = i - 1
     92:     col(2) = i
     93:     col(3) = i + 1
     94:     PetscCallA(MatSetValues(A, i1, [i], i3, col, val, INSERT_VALUES, ierr))
     95:   end do

     97:   PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
     98:   PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))

    100:   PetscCallA(MatCreateVecs(A, v, PETSC_NULL_VEC, ierr))
    101:   if (Istart == 0) then
    102:     PetscCallA(VecSetValue(v, i0, one, INSERT_VALUES, ierr))
    103:   end if
    104:   PetscCallA(VecAssemblyBegin(v, ierr))
    105:   PetscCallA(VecAssemblyEnd(v, ierr))

    107: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    108: ! Create the eigensolver and display info
    109: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    111: ! ** Create eigensolver context
    112:   PetscCallA(EPSCreate(PETSC_COMM_WORLD, eps, ierr))

    114: ! ** Set operators. In this case, it is a standard eigenvalue problem
    115:   PetscCallA(EPSSetOperators(eps, A, PETSC_NULL_MAT, ierr))
    116:   PetscCallA(EPSSetProblemType(eps, EPS_HEP, ierr))

    118: ! ** Set solver parameters at runtime
    119:   PetscCallA(EPSSetFromOptions(eps, ierr))

    121: ! ** Set initial vectors
    122:   nini = 1
    123:   PetscCallA(EPSSetInitialSpace(eps, nini, [v], ierr))

    125: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    126: !     Solve the eigensystem
    127: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    129:   PetscCallA(EPSSolve(eps, ierr))

    131: ! ** Optional: Get some information from the solver and display it
    132:   PetscCallA(EPSGetType(eps, tname, ierr))
    133:   if (rank == 0) then
    134:     write (*, '(a,a)') ' Solution method: ', tname
    135:   end if
    136:   PetscCallA(EPSGetDimensions(eps, nev, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, ierr))
    137:   if (rank == 0) then
    138:     write (*, '(a,i2)') ' Number of requested eigenvalues:', nev
    139:   end if

    141: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    142: ! Display solution and clean up
    143: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    145:   PetscCallA(EPSErrorView(eps, EPS_ERROR_RELATIVE, PETSC_NULL_VIEWER, ierr))
    146:   PetscCallA(EPSDestroy(eps, ierr))
    147:   PetscCallA(MatDestroy(A, ierr))
    148:   PetscCallA(VecDestroy(v, ierr))

    150:   PetscCallA(SlepcFinalize(ierr))
    151: end program test7f

    153: !/*TEST
    154: !
    155: !   test:
    156: !      suffix: 1
    157: !      args: -eps_nev 4 -eps_ncv 19
    158: !      filter: sed -e "s/83791/83792/"
    159: !
    160: !TEST*/