From a71cf683b756e87bd8bcc2778fe45cc68d8c92e6 Mon Sep 17 00:00:00 2001 From: Wojtek Kosior Date: Fri, 21 Jun 2019 17:25:27 +0200 Subject: analytically compute integrals of test functions --- src/functions.f90 | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/functions.f90 b/src/functions.f90 index 788de6b..b028c02 100644 --- a/src/functions.f90 +++ b/src/functions.f90 @@ -1,5 +1,8 @@ MODULE functions + real(kind=8), private, parameter :: poly_coeffs(11) = & + [-11.0, 15.6, -4.6, 22.5, 8.1, 5.1, -0.3, -8.0, 0.0, -9.9, 2.2] + CONTAINS FUNCTION my_exp(x) result(y) @@ -7,7 +10,7 @@ CONTAINS real(kind=8) :: y y = exp(x) END FUNCTION my_exp - + FUNCTION my_sin(x) result(y) real(kind=8), intent(in) :: x real(kind=8) :: y @@ -17,9 +20,34 @@ CONTAINS FUNCTION my_poly(x) result(y) real(kind=8), intent(in) :: x real(kind=8) :: y - !! for the task some polynomial of order 10 should be tested... - !! so to have a simple equation I chose Chebyshev polynomial - y = cos(10 * acos(x)) + integer(kind=4) :: i + y = sum(poly_coeffs(:) * [1.0_8, (x ** [(i, i = 1, 10)])]) END FUNCTION my_poly + FUNCTION my_exp_int(ibeg, iend) result(y) + real(kind=8), intent(in) :: ibeg, iend + real(kind=8) :: y + y = exp(iend) - exp(ibeg) + END FUNCTION my_exp_int + + FUNCTION my_sin_int(ibeg, iend) result(y) + real(kind=8), intent(in) :: ibeg, iend + real(kind=8) :: y + y = -cos(iend) + cos(ibeg) + END FUNCTION my_sin_int + + FUNCTION my_poly_int_indefinite(x) result(y) + real(kind=8), intent(in) :: x + real(kind=8) :: y + integer(kind=4) :: i, j + y = sum(poly_coeffs(:) * (1 / real([(j, j = 1, 11)])) * & + (x ** [(i, i = 1, 11)])) + END FUNCTION my_poly_int_indefinite + + FUNCTION my_poly_int(ibeg, iend) result(y) + real(kind=8), intent(in) :: ibeg, iend + real(kind=8) :: y + y = my_poly_int_indefinite(iend) - my_poly_int_indefinite(ibeg) + END FUNCTION my_poly_int + END MODULE functions -- cgit v1.2.3