(git:1f285aa)
taper_types.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Definition of the semi empirical parameter types.
10 !> \author Teodoro Laino [tlaino] - 10.2008 University of Zurich
11 ! **************************************************************************************************
13 
14  USE kinds, ONLY: dp
15 #include "./base/base_uses.f90"
16 
17  IMPLICIT NONE
18 
19  PRIVATE
20 
21  ! *** Global parameters ***
22 
23  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'taper_types'
24 
25 ! **************************************************************************************************
26 !> \brief Taper type
27 ! **************************************************************************************************
28  TYPE taper_type
29  LOGICAL :: apply_taper
30  REAL(KIND=dp) :: r0, rscale
31  END TYPE taper_type
32 
33  PUBLIC :: taper_type, taper_create, taper_release, taper_eval, dtaper_eval
34 
35 CONTAINS
36 
37 ! **************************************************************************************************
38 !> \brief Creates taper type
39 !> \param taper ...
40 !> \param rc ...
41 !> \param range ...
42 ! **************************************************************************************************
43  SUBROUTINE taper_create(taper, rc, range)
44  TYPE(taper_type), POINTER :: taper
45  REAL(kind=dp), INTENT(IN) :: rc, range
46 
47  cpassert(.NOT. ASSOCIATED(taper))
48  ALLOCATE (taper)
49  IF (range > epsilon(0.0_dp)) THEN
50  taper%apply_taper = .true.
51  cpassert(range > 0.0_dp)
52  taper%r0 = 2.0_dp*rc - 20.0_dp*range
53  taper%rscale = 1.0_dp/range
54  ELSE
55  taper%apply_taper = .false.
56  END IF
57 
58  END SUBROUTINE taper_create
59 
60 ! **************************************************************************************************
61 !> \brief Releases taper type
62 !> \param taper ...
63 ! **************************************************************************************************
64  SUBROUTINE taper_release(taper)
65  TYPE(taper_type), POINTER :: taper
66 
67  IF (ASSOCIATED(taper)) THEN
68  DEALLOCATE (taper)
69  END IF
70  END SUBROUTINE taper_release
71 
72 ! **************************************************************************************************
73 !> \brief Taper functions
74 !> \param taper ...
75 !> \param rij ...
76 !> \return ...
77 ! **************************************************************************************************
78  FUNCTION taper_eval(taper, rij) RESULT(ft)
79  TYPE(taper_type), POINTER :: taper
80  REAL(kind=dp), INTENT(IN) :: rij
81  REAL(kind=dp) :: ft
82 
83  REAL(kind=dp) :: dr
84 
85  ft = 1._dp
86  IF (taper%apply_taper) THEN
87  dr = taper%rscale*(rij - taper%r0)
88  ft = 0.5_dp*(1.0_dp - tanh(dr))
89  END IF
90  END FUNCTION taper_eval
91 
92 ! **************************************************************************************************
93 !> \brief Analytical derivatives for taper function
94 !> \param taper ...
95 !> \param rij ...
96 !> \return ...
97 ! **************************************************************************************************
98  FUNCTION dtaper_eval(taper, rij) RESULT(dft)
99  TYPE(taper_type), POINTER :: taper
100  REAL(kind=dp), INTENT(IN) :: rij
101  REAL(kind=dp) :: dft
102 
103  REAL(kind=dp) :: dr
104 
105  dft = 0.0_dp
106  IF (taper%apply_taper) THEN
107  dr = taper%rscale*(rij - taper%r0)
108  dft = -0.5_dp*(1.0_dp - tanh(dr)**2)*taper%rscale
109  END IF
110  END FUNCTION dtaper_eval
111 
112 END MODULE taper_types
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Definition of the semi empirical parameter types.
Definition: taper_types.F:12
real(kind=dp) function, public dtaper_eval(taper, rij)
Analytical derivatives for taper function.
Definition: taper_types.F:99
subroutine, public taper_create(taper, rc, range)
Creates taper type.
Definition: taper_types.F:44
subroutine, public taper_release(taper)
Releases taper type.
Definition: taper_types.F:65
real(kind=dp) function, public taper_eval(taper, rij)
Taper functions.
Definition: taper_types.F:79