Newer
Older
module obl_math
!< @brief general mathematics module
! --------------------------------------------------------------------------------
! TO DO:
! -- nearest neighbour interpolation/extrapolation (choice)
! -- periodic function support in interpolation
! modules used
! --------------------------------------------------------------------------------
private
! public interface
! --------------------------------------------------------------------------------
public :: limit_min_array, limit_max_array
public :: tma
! --------------------------------------------------------------------------------
! --------------------------------------------------------------------------------
subroutine c_interp_linear(F_res, x_0, F, x, n)
! ----------------------------------------------------------------------------
real, intent(out) :: F_res !< interpolated value
real, intent(in) :: x_0 !< interpolated coordinate
integer, intent(in) :: n !< number of steps
real, dimension(n), intent(in) :: F !< input values
real, dimension(n), intent(in) :: x !< input coorindates
! ----------------------------------------------------------------------------
if (n <= 0) then
F_res = 0.0
return
endif
do i=1, n-1
if (x_0 <= x(i+1)) then
F_res = F(i) + (F(i+1) - F(i)) / (x(i+1) - x(i)) * (x_0 - x(i))
return
endif
enddo
F_res = F(n)
end subroutine c_interp_linear
! --------------------------------------------------------------------------------
! ----------------------------------------------------------------------------
integer, intent(in) :: n !< number of steps
real, intent(inout), dimension(n) :: F !< value on current z-step
real, intent(in) :: F_min !< minimal value
! ----------------------------------------------------------------------------
endif
enddo
end subroutine limit_min_array
! --------------------------------------------------------------------------------
! ----------------------------------------------------------------------------
real, intent(inout), dimension(n) :: F !< value on current z-step
real, intent(in) :: F_max !< maximum value
! ----------------------------------------------------------------------------
endif
enddo
end subroutine limit_max_array
! --------------------------------------------------------------------------------
subroutine tma(X,a,b,c,f,n)
!< @brief solver for tridiagonal matrix (Thomas algorithm)
! ----------------------------------------------------------------------------
real, intent(out), dimension(n) :: X
real, intent(in), dimension(n) :: a, b, c, f
real, dimension(n) :: alpha, beta
integer :: k
! ----------------------------------------------------------------------------
alpha(1) = 0.0
beta(1) = 0.0
do k=1, n-1
alpha(k+1) = -c(k) / (a(k)*alpha(k) + b(k))
beta(k+1) = (f(k) -a (k)*beta(k)) / (a(k)*alpha(k) + b(k))
X(n) = (f(n) - a(n)*beta(n)) / (b(n) + a(n)*alpha(n))
do k = n, 2, -1
X(k-1) = alpha(k)*X(k) + beta(k)
end do
end subroutine tma
! --------------------------------------------------------------------------------
elemental function is_finite(value)
!> @brief check if value is finite
! ----------------------------------------------------------------------------
use ieee_arithmetic
implicit none
logical :: is_finite
real, intent(in) :: value
! ----------------------------------------------------------------------------
is_finite = ieee_is_finite(value)
end function is_finite
function is_finite_array(F, n)
!> @brief check if any value in array is finite
! ----------------------------------------------------------------------------
use ieee_arithmetic
implicit none
logical :: is_finite_array
integer :: k
! ----------------------------------------------------------------------------
is_finite_array = ieee_is_finite(F(k))
if (.not.is_finite_array) exit