Actual source code: test1f.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> ./test1f [-help]
11: !
12: ! Description: Test rational function in Fortran.
13: !
14: ! ----------------------------------------------------------------------
15: !
16: #include <slepc/finclude/slepcfn.h>
17: program test1f
18: use slepcfn
19: implicit none
21: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
22: ! Declarations
23: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
25: FN :: fn
26: PetscInt :: i, n
27: PetscMPIInt :: rank
28: PetscErrorCode :: ierr
29: PetscScalar :: x, y, yp, p(10), q(10)
30: PetscScalar :: pp(10), qq(10), tau, eta
31: PetscScalar, parameter :: five = 5.0
33: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
34: ! Beginning of program
35: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
37: PetscCallA(SlepcInitialize(PETSC_NULL_CHARACTER, ierr))
38: PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
39: PetscCallA(FNCreate(PETSC_COMM_WORLD, fn, ierr))
41: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
42: ! Polynomial p(x)
43: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
44: p(1) = -3.1
45: p(2) = 1.1
46: p(3) = 1.0
47: p(4) = -2.0
48: p(5) = 3.5
49: PetscCallA(FNSetType(fn, FNRATIONAL, ierr))
50: PetscCallA(FNRationalSetNumerator(fn, 5_PETSC_INT_KIND, p, ierr))
51: PetscCallA(FNView(fn, PETSC_NULL_VIEWER, ierr))
52: x = 2.2
53: PetscCallA(FNEvaluateFunction(fn, x, y, ierr))
54: PetscCallA(FNEvaluateDerivative(fn, x, yp, ierr))
55: call PrintInfo(x, y, yp)
57: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
58: ! Inverse of polynomial 1/q(x)
59: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
60: q(1) = -3.1
61: q(2) = 1.1
62: q(3) = 1.0
63: PetscCallA(FNSetType(fn, FNRATIONAL, ierr))
64: PetscCallA(FNRationalSetNumerator(fn, 0_PETSC_INT_KIND, PETSC_NULL_SCALAR_ARRAY, ierr))
65: PetscCallA(FNRationalSetDenominator(fn, 3_PETSC_INT_KIND, q, ierr))
66: PetscCallA(FNView(fn, PETSC_NULL_VIEWER, ierr))
67: x = 2.2
68: PetscCallA(FNEvaluateFunction(fn, x, y, ierr))
69: PetscCallA(FNEvaluateDerivative(fn, x, yp, ierr))
70: call PrintInfo(x, y, yp)
72: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
73: ! Rational p(x)/q(x)
74: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
75: p(1) = 1.1
76: p(2) = 1.1
77: q(1) = 1.0
78: q(2) = -2.0
79: q(3) = 3.5
80: PetscCallA(FNSetType(fn, FNRATIONAL, ierr))
81: PetscCallA(FNRationalSetNumerator(fn, 2_PETSC_INT_KIND, p, ierr))
82: PetscCallA(FNRationalSetDenominator(fn, 3_PETSC_INT_KIND, q, ierr))
83: tau = 1.2
84: eta = 0.5
85: PetscCallA(FNSetScale(fn, tau, eta, ierr))
86: PetscCallA(FNView(fn, PETSC_NULL_VIEWER, ierr))
87: x = 2.2
88: PetscCallA(FNEvaluateFunction(fn, x, y, ierr))
89: PetscCallA(FNEvaluateDerivative(fn, x, yp, ierr))
90: call PrintInfo(x, y, yp)
92: PetscCallA(FNRationalGetNumerator(fn, n, pp, ierr))
93: if (rank == 0) then
94: write (*, '(a15,10f6.1)') 'Numerator', (PetscRealPart(pp(i)), i=1, n)
95: end if
96: PetscCallA(FNRationalGetDenominator(fn, n, qq, ierr))
97: if (rank == 0) then
98: write (*, '(a15,10f6.1)') 'Denominator', (PetscRealPart(qq(i)), i=1, n)
99: end if
101: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
102: ! Constant
103: ! - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
104: PetscCallA(FNSetType(fn, FNRATIONAL, ierr))
105: PetscCallA(FNRationalSetNumerator(fn, 1_PETSC_INT_KIND, [five], ierr))
106: PetscCallA(FNRationalSetDenominator(fn, 0_PETSC_INT_KIND, PETSC_NULL_SCALAR_ARRAY, ierr))
107: PetscCallA(FNView(fn, PETSC_NULL_VIEWER, ierr))
108: x = 2.2
109: PetscCallA(FNEvaluateFunction(fn, x, y, ierr))
110: PetscCallA(FNEvaluateDerivative(fn, x, yp, ierr))
111: call PrintInfo(x, y, yp)
113: ! *** Clean up
114: PetscCallA(FNDestroy(fn, ierr))
115: PetscCallA(SlepcFinalize(ierr))
117: contains
119: subroutine PrintInfo(x, y, yp)
120: use slepcfn
121: implicit none
122: PetscScalar :: x, y, yp
123: PetscReal :: re, im
124: PetscMPIInt :: rank
125: PetscErrorCode :: ierr
127: PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
128: if (rank == 0) then
129: re = PetscRealPart(y)
130: im = PetscImaginaryPart(y)
131: if (abs(im) < 1.d-10) then
132: write (*, '(a3,f3.1,a,f10.5)') 'f(', PetscRealPart(x), ') = ', re
133: else
134: write (*, '(a3,f3.1,a,f10.5,sp,f9.5,a)') 'f(', PetscRealPart(x), ') = ', re, im, 'i'
135: end if
136: re = PetscRealPart(yp)
137: im = PetscImaginaryPart(yp)
138: if (abs(im) < 1.d-10) then
139: write (*, '(a3,f3.1,a,f10.5)') 'f''(', PetscRealPart(x), ') = ', re
140: else
141: write (*, '(a3,f3.1,a,f10.5,sp,f9.5,a)') 'f''(', PetscRealPart(x), ') = ', re, im, 'i'
142: end if
143: end if
145: end subroutine
147: end program test1f
149: !/*TEST
150: !
151: ! test:
152: ! suffix: 1
153: ! nsize: 1
154: ! requires: !single
155: !
156: !TEST*/