Actual source code: ex1f.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> ./ex1f [-help] [-n <n>] [all SLEPc options]
11: !
12: ! Description: Simple example that solves an eigensystem with the EPS object.
13: ! The standard symmetric eigenvalue problem to be solved corresponds to the
14: ! Laplacian operator in 1 dimension.
15: !
16: ! The command line options are:
17: ! -n <n>, where <n> = number of grid points = matrix size
18: !
19: ! ----------------------------------------------------------------------
20: !
21: #include <slepc/finclude/slepceps.h>
22: program ex1f
23: use slepceps
24: implicit none
26: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
27: ! Declarations
28: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
29: !
30: Mat :: A ! operator matrix
31: EPS :: eps ! eigenproblem solver context
32: EPSType :: tname
33: PetscInt :: n, i, Istart, Iend
34: PetscInt :: nev
35: PetscInt :: row(1), col(3)
36: PetscMPIInt :: rank
37: PetscErrorCode :: ierr
38: PetscBool :: flg, terse
39: PetscScalar :: val(3)
41: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42: ! Beginning of program
43: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
45: PetscCallA(SlepcInitialize(PETSC_NULL_CHARACTER, "ex1f test"//c_new_line, ierr))
46: PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
47: n = 30
48: PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-n', n, flg, ierr))
50: if (rank == 0) then
51: write (*, '(/a,i4,a)') '1-D Laplacian Eigenproblem, n =', n, ' (Fortran)'
52: end if
54: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
55: ! Compute the operator matrix that defines the eigensystem, Ax=kx
56: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58: PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
59: PetscCallA(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n, ierr))
60: PetscCallA(MatSetFromOptions(A, ierr))
62: PetscCallA(MatGetOwnershipRange(A, Istart, Iend, ierr))
63: if (Istart == 0) then
64: row(1) = 0
65: col(1) = 0
66: col(2) = 1
67: val(1) = 2.0
68: val(2) = -1.0
69: PetscCallA(MatSetValues(A, 1_PETSC_INT_KIND, row, 2_PETSC_INT_KIND, col, val, INSERT_VALUES, ierr))
70: Istart = Istart + 1
71: end if
72: if (Iend == n) then
73: row(1) = n - 1
74: col(1) = n - 2
75: col(2) = n - 1
76: val(1) = -1.0
77: val(2) = 2.0
78: PetscCallA(MatSetValues(A, 1_PETSC_INT_KIND, row, 2_PETSC_INT_KIND, col, val, INSERT_VALUES, ierr))
79: Iend = Iend - 1
80: end if
81: val(1) = -1.0
82: val(2) = 2.0
83: val(3) = -1.0
84: do i = Istart, Iend - 1
85: row(1) = i
86: col(1) = i - 1
87: col(2) = i
88: col(3) = i + 1
89: PetscCallA(MatSetValues(A, 1_PETSC_INT_KIND, row, 3_PETSC_INT_KIND, col, val, INSERT_VALUES, ierr))
90: end do
92: PetscCallA(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY, ierr))
93: PetscCallA(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY, ierr))
95: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
96: ! Create the eigensolver and display info
97: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
99: ! ** Create eigensolver context
100: PetscCallA(EPSCreate(PETSC_COMM_WORLD, eps, ierr))
102: ! ** Set operators. In this case, it is a standard eigenvalue problem
103: PetscCallA(EPSSetOperators(eps, A, PETSC_NULL_MAT, ierr))
104: PetscCallA(EPSSetProblemType(eps, EPS_HEP, ierr))
106: ! ** Set solver parameters at runtime
107: PetscCallA(EPSSetFromOptions(eps, ierr))
109: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
110: ! Solve the eigensystem
111: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
113: PetscCallA(EPSSolve(eps, ierr))
115: ! ** Optional: Get some information from the solver and display it
116: PetscCallA(EPSGetType(eps, tname, ierr))
117: if (rank == 0) then
118: write (*, '(a,a)') ' Solution method: ', tname
119: end if
120: PetscCallA(EPSGetDimensions(eps, nev, PETSC_NULL_INTEGER, PETSC_NULL_INTEGER, ierr))
121: if (rank == 0) then
122: write (*, '(a,i4)') ' Number of requested eigenvalues:', nev
123: end if
125: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
126: ! Display solution and clean up
127: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
129: ! ** show detailed info unless -terse option is given by user
130: PetscCallA(PetscOptionsHasName(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-terse', terse, ierr))
131: if (terse) then
132: PetscCallA(EPSErrorView(eps, EPS_ERROR_RELATIVE, PETSC_NULL_VIEWER, ierr))
133: else
134: PetscCallA(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_INFO_DETAIL, ierr))
135: PetscCallA(EPSConvergedReasonView(eps, PETSC_VIEWER_STDOUT_WORLD, ierr))
136: PetscCallA(EPSErrorView(eps, EPS_ERROR_RELATIVE, PETSC_VIEWER_STDOUT_WORLD, ierr))
137: PetscCallA(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD, ierr))
138: end if
139: PetscCallA(EPSDestroy(eps, ierr))
140: PetscCallA(MatDestroy(A, ierr))
142: PetscCallA(SlepcFinalize(ierr))
143: end program ex1f
145: !/*TEST
146: !
147: ! test:
148: ! args: -eps_nev 4 -terse
149: ! filter: sed -e "s/3.83791/3.83792/"
150: !
151: !TEST*/