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*/