(git:98357aa)
Loading...
Searching...
No Matches
qmmm_links_methods.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief A collection of methods to treat the QM/MM links
10!> \par History
11!> 12.2004 created [tlaino]
12!> \author Teodoro Laino
13! **************************************************************************************************
15
17 USE kinds, ONLY: dp
19 USE qmmm_types_low, ONLY: add_set_type,&
23#include "./base/base_uses.f90"
24
25 IMPLICIT NONE
26 PRIVATE
27
28 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
29 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qmmm_links_methods'
30 PUBLIC :: qmmm_link_imomm_coord, &
34
35CONTAINS
36
37! **************************************************************************************************
38!> \brief correct the position for qm/mm IMOMM link type
39!> \param qmmm_links ...
40!> \param particles ...
41!> \param qm_atom_index ...
42!> \par History
43!> 12.2004 created [tlaino]
44!> \author Teodoro Laino
45! **************************************************************************************************
46 SUBROUTINE qmmm_link_imomm_coord(qmmm_links, particles, qm_atom_index)
47 TYPE(qmmm_links_type), POINTER :: qmmm_links
48 TYPE(particle_type), DIMENSION(:), POINTER :: particles
49 INTEGER, DIMENSION(:), POINTER :: qm_atom_index
50
51 INTEGER :: ilink, ip, ip_mm, ip_qm, mm_index, &
52 n_imomm, qm_index
53 REAL(kind=dp) :: alpha
54 TYPE(qmmm_imomm_link_type), POINTER :: my_link
55
56 n_imomm = SIZE(qmmm_links%imomm)
57 cpassert(n_imomm /= 0)
58 DO ilink = 1, n_imomm
59 my_link => qmmm_links%imomm(ilink)%link
60 qm_index = my_link%qm_index
61 mm_index = my_link%mm_index
62 alpha = 1.0_dp/my_link%alpha
63 DO ip = 1, SIZE(qm_atom_index)
64 IF (qm_atom_index(ip) == qm_index) EXIT
65 END DO
66 IF (ip == SIZE(qm_atom_index) + 1) THEN
67 CALL cp_abort(__location__, &
68 "QM atom index ("//cp_to_string(qm_index)//") specified in the LINK section nr.("// &
69 cp_to_string(ilink)//") is not defined as a QM atom! Please inspect your QM_KIND sections. ")
70 END IF
71 ip_qm = ip
72 DO ip = 1, SIZE(qm_atom_index)
73 IF (qm_atom_index(ip) == mm_index) EXIT
74 END DO
75 IF (ip == SIZE(qm_atom_index) + 1) THEN
76 CALL cp_abort(__location__, &
77 "Error in setting up the MM atom index ("//cp_to_string(mm_index)// &
78 ") specified in the LINK section nr.("//cp_to_string(ilink)//"). Please report this bug! ")
79 END IF
80 ip_mm = ip
81 particles(ip_mm)%r = alpha*particles(ip_mm)%r + (1.0_dp - alpha)*particles(ip_qm)%r
82 END DO
83
84 END SUBROUTINE qmmm_link_imomm_coord
85
86! **************************************************************************************************
87!> \brief correct the forces for qm/mm IMOMM link type
88!> \param qmmm_links ...
89!> \param particles_qm ...
90!> \param qm_atom_index ...
91!> \par History
92!> 12.2004 created [tlaino]
93!> \author Teodoro Laino
94! **************************************************************************************************
95 SUBROUTINE qmmm_link_imomm_forces(qmmm_links, particles_qm, qm_atom_index)
96 TYPE(qmmm_links_type), POINTER :: qmmm_links
97 TYPE(particle_type), DIMENSION(:), POINTER :: particles_qm
98 INTEGER, DIMENSION(:), POINTER :: qm_atom_index
99
100 INTEGER :: ilink, ip, ip_mm, ip_qm, mm_index, &
101 n_imomm, qm_index
102 REAL(kind=dp) :: alpha
103 TYPE(qmmm_imomm_link_type), POINTER :: my_link
104
105 n_imomm = SIZE(qmmm_links%imomm)
106 cpassert(n_imomm /= 0)
107 DO ilink = 1, n_imomm
108 my_link => qmmm_links%imomm(ilink)%link
109 qm_index = my_link%qm_index
110 mm_index = my_link%mm_index
111 alpha = 1.0_dp/my_link%alpha
112 DO ip = 1, SIZE(qm_atom_index)
113 IF (qm_atom_index(ip) == qm_index) EXIT
114 END DO
115 IF (ip == SIZE(qm_atom_index) + 1) THEN
116 CALL cp_abort(__location__, &
117 "QM atom index ("//cp_to_string(qm_index)//") specified in the LINK section nr.("// &
118 cp_to_string(ilink)//") is not defined as a QM atom! Please inspect your QM_KIND sections. ")
119 END IF
120 ip_qm = ip
121 DO ip = 1, SIZE(qm_atom_index)
122 IF (qm_atom_index(ip) == mm_index) EXIT
123 END DO
124 IF (ip == SIZE(qm_atom_index) + 1) THEN
125 CALL cp_abort(__location__, &
126 "Error in setting up the MM atom index ("//cp_to_string(mm_index)// &
127 ") specified in the LINK section nr.("//cp_to_string(ilink)//"). Please report this bug! ")
128 END IF
129 ip_mm = ip
130 particles_qm(ip_qm)%f = particles_qm(ip_qm)%f + particles_qm(ip_mm)%f*(1.0_dp - alpha)
131 particles_qm(ip_mm)%f = particles_qm(ip_mm)%f*alpha
132 END DO
133
134 END SUBROUTINE qmmm_link_imomm_forces
135
136! **************************************************************************************************
137!> \brief correct the position for added charges in qm/mm link scheme
138!> \param qmmm_env ...
139!> \param particles ...
140!> \par History
141!> 01.2005 created [tlaino]
142!> \author Teodoro Laino
143! **************************************************************************************************
144 SUBROUTINE qmmm_added_chrg_coord(qmmm_env, particles)
145 TYPE(qmmm_env_qm_type), POINTER :: qmmm_env
146 TYPE(particle_type), DIMENSION(:), POINTER :: particles
147
148 INTEGER :: i, index1, index2
149 REAL(kind=dp) :: alpha
150 TYPE(add_set_type), POINTER :: added_charges
151
152 added_charges => qmmm_env%added_charges
153
154 DO i = 1, added_charges%num_mm_atoms
155 index1 = added_charges%add_env(i)%Index1
156 index2 = added_charges%add_env(i)%Index2
157 alpha = added_charges%add_env(i)%alpha
158 added_charges%added_particles(i)%r = alpha*particles(index1)%r + (1.0_dp - alpha)*particles(index2)%r
159 END DO
160
161 END SUBROUTINE qmmm_added_chrg_coord
162
163! **************************************************************************************************
164!> \brief correct the forces due to the added charges in qm/mm link scheme
165!> \param qmmm_env ...
166!> \param particles ...
167!> \par History
168!> 01.2005 created [tlaino]
169!> \author Teodoro Laino
170! **************************************************************************************************
171 SUBROUTINE qmmm_added_chrg_forces(qmmm_env, particles)
172 TYPE(qmmm_env_qm_type), POINTER :: qmmm_env
173 TYPE(particle_type), DIMENSION(:), POINTER :: particles
174
175 INTEGER :: i, index1, index2
176 REAL(kind=dp) :: alpha
177 TYPE(add_set_type), POINTER :: added_charges
178
179 added_charges => qmmm_env%added_charges
180
181 DO i = 1, added_charges%num_mm_atoms
182 index1 = added_charges%add_env(i)%Index1
183 index2 = added_charges%add_env(i)%Index2
184 alpha = added_charges%add_env(i)%alpha
185 particles(index1)%f = particles(index1)%f + alpha*added_charges%added_particles(i)%f
186 particles(index2)%f = particles(index2)%f + (1.0_dp - alpha)*added_charges%added_particles(i)%f
187 END DO
188
189 END SUBROUTINE qmmm_added_chrg_forces
190
191END MODULE qmmm_links_methods
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Define the data structure for the particle information.