MsSpec-DFM/New_libraries/DFM_library/VARIOUS_FUNCTIONS_LIBRARY/basic_functions.f90

241 lines
6.9 KiB
Fortran
Raw Normal View History

2022-02-02 16:19:10 +01:00
!
!---------------------------------------------------------------------
!
MODULE BASIC_FUNCTIONS
!
! This module contains basic functions of general use:
!
! * Lorentzian
! * Gaussian
! * Numerical Dirac Delta
! * Slater-type and Gaussian-type orbitals
!
! Modules used: ACCURACY_REAL
! PI_ETC
! SQUARE_ROOTS
! REAL_NUMBERS
! FACTORIALS
!
USE ACCURACY_REAL
USE PI_ETC
USE SQUARE_ROOTS
USE REAL_NUMBERS
USE FACTORIALS
!
CONTAINS
!
!---------------------------------------------------------------------
!
FUNCTION LORENTZIAN(X,X0,GAMMA)
!
! This function computes the Lorentzian function L(x) normalized to unity:
!
! L(x) = 1/pi * gamma / ([x - x0]^2 + gamma^2)
!
! Input parameters:
!
! X : value at which the function is computed
! X0 : center paramameter
! GAMMA : half width at half maximum
!
! Output parameter:
!
! LORENTZIAN : value of the function at X
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Aug 2020
!
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,X0,GAMMA
REAL (WP) :: LORENTZIAN
!
LORENTZIAN = PI_INV * GAMMA / ( (X-X0)*(X-X0) + GAMMA*GAMMA )!
!
END FUNCTION LORENTZIAN
!
!---------------------------------------------------------------------
!
FUNCTION GAUSSIAN(X,X0,SIGMA)
!
! This function computes the Gaussian function G(x) normalized to unity:
!
! G(x) = (1/sigma sqrt(2 pi)) * exp[ -1/2 * (x-x0)^2 / sigma^2 ]
!
!
! Input parameters:
!
! X : value at which the function is computed
! X0 : expected value
! SIGMA : variance
!
! Output parameter:
!
! GAUSSIAN : value of the function at X
!
! Note: the half width at half maximum is given by sigma * sqrt[2 Ln(2)]
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Aug 2020
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X,X0,SIGMA
REAL (WP) :: GAUSSIAN
!
REAL (WP) :: EXP
!
GAUSSIAN = PI_INV * EXP(-HALF * (X - X0) * (X - X0) / & !
(SIGMA * SIGMA) ) / (SIGMA * SQR2) !
!
END FUNCTION GAUSSIAN
!
!---------------------------------------------------------------------
!
FUNCTION DELTA(X,I_D,EPSI)
!
! This function computes the numerical Dirac Delta function
!
!
! Input parameters:
!
! X : value at which the function is computed
! I_D : type of numerical approximation used
!
! = 1 : lim [ eps -> 0 ] 1/pi eps/(x^2 + eps^2)
! = 2 : lim [ eps -> 0 ] 1/(pi*x) sin(x/eps)
! = 3 : lim [ eps -> 0 ] 1/2 eps |x|^{eps-1}
! = 4 : lim [ eps -> 0 ] 1/(2*sqrt(pi eps}) e^{- x^2/(4 eps)}
! = 5 : lim [ eps -> 0 ] 1/(2 eps) e^{- |x|/eps)
! = 6 : lim [ eps -> 0 ] 1/eps Ai(x/eps)
! = 7 : lim [ eps -> 0 ] 1/eps J_{1/eps}([x+1]/eps)
! = 8 : lim [ eps -> 0 ] | 1/eps e^{- x^2/eps} Ln(2x/eps)
! EPSI : small eps value
!
! Output parameter:
!
! DELTA : value of the function at X
!
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Aug 2020
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: X
REAL (WP) :: DELTA
REAL (WP) :: EPSI
!
REAL (WP) :: SIN,ABS,EXP,SQRT
!
INTEGER, INTENT(IN) :: I_D
!
IF(I_D == 1) THEN !
DELTA = PI_INV * EPSI / ( X * X + EPSI * EPSI) !
ELSE IF(I_D == 2) THEN !
DELTA = PI_INV * SIN( X / EPSI) / X !
ELSE IF(I_D == 3) THEN !
DELTA = HALF * EPSI * ABS(X)**(EPSI-1) !
ELSE IF(I_D == 4) THEN !
DELTA = HALF * EXP( - FOURTH * X * X / EPSI) / & !
(SQR_PI * SQRT(EPSI)) !
ELSE IF(I_D == 5) THEN !
DELTA = HALF * EXP(- ABS(X) / EPSI) /EPSI !
END IF
!
END FUNCTION DELTA
!
!---------------------------------------------------------------------
!
FUNCTION STO(N,ALPHA,R)
!
! This function computes Slater-type orbitals normalized to unity::
!
! STO = A * r^{n-1} * e^{- zeta r}
!
!
! Input parameters:
!
! N : principal quantum number
! ALPHA : function parameter
! R : value at which the function is computed
!
! Output parameter:
!
! STO : value of the function at R
!
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Aug 2020
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: ALPHA,R
REAL (WP) :: STO
REAL (WP) :: A,TWOZ
!
REAL (WP) :: SQRT,EXP
!
INTEGER, INTENT(IN) :: N
!
TWOZ = TWO * ALPHA !
A = TWOZ**N * SQRT(TWOZ / FAC(2*N)) !
STO = A * R**(N-1) * EXP(-ALPHA * R) ! normalisation constant
!
END FUNCTION STO
!
!---------------------------------------------------------------------
!
FUNCTION GTO(N,ALPHA,R)
!
! This function computes Gaussian-type orbitals normalized to unity::
!
! GTO = A * r^{n-1} * e^{- zeta r^2}
!
!
! Input parameters:
!
! N : principal quantum number
! ALPHA : function parameter
! R : value at which the function is computed
!
! Output parameter:
!
! GTO : value of the function at R
!
!
!
! Author : D. Sébilleau
!
! Last modified : 5 Aug 2020
!
IMPLICIT NONE
!
REAL (WP), INTENT(IN) :: ALPHA,R
REAL (WP) :: GTO
REAL (WP) :: A,TWOZ,NN
REAL (WP) :: GAMMA
!
REAL (WP) :: SQRT,EXP
!
INTEGER, INTENT(IN) :: N
!
TWOZ = TWO * ALPHA !
NN = N + HALF !
GAMMA = SQR_PI * FAC(2*N) / (FOUR**N * FAC(N)) !
A = SQRT(TWO * TWOZ**NN / GAMMA) ! normalisation constant
GTO = A * R**(N-1) * EXP(-ALPHA * R * R) !
!
END FUNCTION GTO
!
END MODULE BASIC_FUNCTIONS