241 lines
6.9 KiB
Fortran
241 lines
6.9 KiB
Fortran
|
!
|
||
|
!---------------------------------------------------------------------
|
||
|
!
|
||
|
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
|