(git:98357aa)
Loading...
Searching...
No Matches
qmmmx_force.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 Calculates QM/MM energy and forces with Force-Mixing
10!> \par History
11!> 2015 Factored out of force_env_methods.F
12!> \author Ole Schuett
13! **************************************************************************************************
15 USE cell_types, ONLY: cell_type
27 USE kinds, ONLY: default_string_length,&
28 dp
31 USE qmmm_types, ONLY: qmmm_env_get,&
36 USE qmmm_util, ONLY: apply_qmmm_unwrap,&
41#include "./base/base_uses.f90"
42
43 IMPLICIT NONE
44
45 PRIVATE
46
47 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qmmmx_force'
48
50
51CONTAINS
52
53! **************************************************************************************************
54!> \brief calculates the qm/mm energy and forces
55!> \param qmmmx_env ...
56!> \param calc_force if also the forces should be calculated
57!> \param consistent_energies ...
58!> \param linres ...
59!> \param require_consistent_energy_force ...
60!> \par History
61!> 05.2004 created [fawzi]
62!> \author Fawzi Mohamed
63! **************************************************************************************************
64 SUBROUTINE qmmmx_calc_energy_force(qmmmx_env, calc_force, consistent_energies, linres, &
65 require_consistent_energy_force)
66 TYPE(qmmmx_env_type), POINTER :: qmmmx_env
67 LOGICAL, INTENT(IN) :: calc_force, consistent_energies, linres
68 LOGICAL, INTENT(IN), OPTIONAL :: require_consistent_energy_force
69
70 INTEGER :: ip, mom_conserv_min_label, &
71 mom_conserv_n, mom_conserv_region, &
72 mom_conserv_type
73 INTEGER, POINTER :: cur_indices(:), cur_labels(:)
74 REAL(dp) :: delta_a(3), delta_f(3), &
75 mom_conserv_mass, total_f(3)
76 TYPE(cp_subsys_type), POINTER :: subsys_primary, subsys_qmmm_core, &
77 subsys_qmmm_extended
78 TYPE(particle_type), DIMENSION(:), POINTER :: particles_primary, particles_qmmm_core, &
79 particles_qmmm_extended
80 TYPE(section_vals_type), POINTER :: force_env_section
81
82 IF (PRESENT(require_consistent_energy_force)) THEN
83 IF (require_consistent_energy_force) THEN
84 CALL cp_abort(__location__, &
85 "qmmmx_energy_and_forces got require_consistent_energy_force but force mixing is active. ")
86 END IF
87 END IF
88
89 ! Possibly translate the system
90 CALL apply_qmmmx_translate(qmmmx_env)
91
92 ! actual energy force calculation
93 CALL qmmmx_calc_energy_force_low(qmmmx_env%ext, calc_force, consistent_energies, linres, "ext")
94 CALL qmmmx_calc_energy_force_low(qmmmx_env%core, calc_force, consistent_energies, linres, "core")
95
96 ! get forces from subsys of each sub force env
97 CALL qmmm_env_get(qmmmx_env%core, subsys=subsys_qmmm_core)
98 CALL qmmm_env_get(qmmmx_env%ext, subsys=subsys_qmmm_extended)
99
100 CALL get_qs_env(qmmmx_env%ext%qs_env, input=force_env_section)
101 CALL section_vals_val_get(force_env_section, "QMMM%FORCE_MIXING%RESTART_INFO%INDICES", i_vals=cur_indices)
102 CALL section_vals_val_get(force_env_section, "QMMM%FORCE_MIXING%RESTART_INFO%LABELS", i_vals=cur_labels)
103
104 particles_qmmm_extended => subsys_qmmm_extended%particles%els
105 particles_qmmm_core => subsys_qmmm_core%particles%els
106 DO ip = 1, SIZE(cur_indices)
107 IF (cur_labels(ip) >= force_mixing_label_qm_dynamics) THEN ! this is a QM atom
108 ! copy (QM) force from extended calculation
109 particles_qmmm_core(cur_indices(ip))%f = particles_qmmm_extended(cur_indices(ip))%f
110 END IF
111 END DO
112
113 ! zero momentum
114 CALL section_vals_val_get(force_env_section, "QMMM%FORCE_MIXING%MOMENTUM_CONSERVATION_TYPE", &
115 i_val=mom_conserv_type)
116 IF (mom_conserv_type /= do_fm_mom_conserv_none) THEN
117 CALL section_vals_val_get(force_env_section, "QMMM%FORCE_MIXING%MOMENTUM_CONSERVATION_REGION", &
118 i_val=mom_conserv_region)
119
120 IF (mom_conserv_region == do_fm_mom_conserv_core) THEN
121 mom_conserv_min_label = force_mixing_label_qm_core
122 ELSE IF (mom_conserv_region == do_fm_mom_conserv_qm) THEN
123 mom_conserv_min_label = force_mixing_label_qm_dynamics
124 ELSE IF (mom_conserv_region == do_fm_mom_conserv_buffer) THEN
125 mom_conserv_min_label = force_mixing_label_buffer
126 ELSE
127 cpabort("Got unknown MOMENTUM_CONSERVATION_REGION (not CORE, QM, or BUFFER) !")
128 END IF
129
130 total_f = 0.0_dp
131 DO ip = 1, SIZE(particles_qmmm_core)
132 total_f(1:3) = total_f(1:3) + particles_qmmm_core(ip)%f(1:3)
133 END DO
134 IF (mom_conserv_type == do_fm_mom_conserv_equal_f) THEN
135 mom_conserv_n = count(cur_labels >= mom_conserv_min_label)
136 delta_f = total_f/mom_conserv_n
137 DO ip = 1, SIZE(cur_indices)
138 IF (cur_labels(ip) >= mom_conserv_min_label) THEN
139 particles_qmmm_core(cur_indices(ip))%f = particles_qmmm_core(cur_indices(ip))%f - delta_f
140 END IF
141 END DO
142 ELSE IF (mom_conserv_type == do_fm_mom_conserv_equal_a) THEN
143 mom_conserv_mass = 0.0_dp
144 DO ip = 1, SIZE(cur_indices)
145 IF (cur_labels(ip) >= mom_conserv_min_label) THEN
146 mom_conserv_mass = mom_conserv_mass + particles_qmmm_core(cur_indices(ip))%atomic_kind%mass
147 END IF
148 END DO
149 delta_a = total_f/mom_conserv_mass
150 DO ip = 1, SIZE(cur_indices)
151 IF (cur_labels(ip) >= mom_conserv_min_label) THEN
152 particles_qmmm_core(cur_indices(ip))%f = particles_qmmm_core(cur_indices(ip))%f - &
153 particles_qmmm_core(cur_indices(ip))%atomic_kind%mass*delta_a
154 END IF
155 END DO
156 END IF
157 END IF
158
159 CALL qmmm_env_get(qmmmx_env%ext, subsys=subsys_primary)
160 particles_primary => subsys_primary%particles%els
161 DO ip = 1, SIZE(particles_qmmm_core)
162 particles_primary(ip)%f = particles_qmmm_core(ip)%f
163 END DO
164
165 END SUBROUTINE qmmmx_calc_energy_force
166
167! **************************************************************************************************
168!> \brief ...
169!> \param qmmm_env ...
170!> \param calc_force ...
171!> \param consistent_energies ...
172!> \param linres ...
173!> \param label ...
174! **************************************************************************************************
175 SUBROUTINE qmmmx_calc_energy_force_low(qmmm_env, calc_force, consistent_energies, linres, label)
176 TYPE(qmmm_env_type), POINTER :: qmmm_env
177 LOGICAL, INTENT(IN) :: calc_force, consistent_energies, linres
178 CHARACTER(*) :: label
179
180 CHARACTER(default_string_length) :: new_restart_fn, new_restart_hist_fn, &
181 old_restart_fn, old_restart_hist_fn
182 INTEGER, DIMENSION(:), POINTER :: qm_atom_index
183 LOGICAL :: saved_do_translate
184 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: saved_pos
185 TYPE(cell_type), POINTER :: mm_cell
186 TYPE(cp_subsys_type), POINTER :: subsys_mm, subsys_qm
187 TYPE(section_vals_type), POINTER :: force_env_section
188
189 NULLIFY (mm_cell, subsys_qm, subsys_mm, qm_atom_index)
190
191 CALL get_qs_env(qmmm_env%qs_env, input=force_env_section)
192
193 ! rewrite RESTART%FILENAME
194 CALL section_vals_val_get(force_env_section, "DFT%SCF%PRINT%RESTART%FILENAME", &
195 c_val=old_restart_fn)
196 new_restart_fn = trim(old_restart_fn)//"-"//trim(label)
197 CALL section_vals_val_set(force_env_section, "DFT%SCF%PRINT%RESTART%FILENAME", &
198 c_val=new_restart_fn)
199
200 ! rewrite RESTART_HISTORY%FILENAME
201 CALL section_vals_val_get(force_env_section, "DFT%SCF%PRINT%RESTART_HISTORY%FILENAME", &
202 c_val=old_restart_hist_fn)
203 new_restart_hist_fn = trim(old_restart_hist_fn)//"-"//trim(label)
204 CALL section_vals_val_set(force_env_section, "DFT%SCF%PRINT%RESTART_HISTORY%FILENAME", &
205 c_val=new_restart_hist_fn)
206
207 ! wrap positions before QM/MM calculation.
208 ! Required if diffusion causes atoms outside of periodic box get added to QM
209 CALL fist_env_get(qmmm_env%fist_env, cell=mm_cell, subsys=subsys_mm)
210 CALL get_qs_env(qmmm_env%qs_env, cp_subsys=subsys_qm)
211 qm_atom_index => qmmm_env%qm%qm_atom_index
212 CALL apply_qmmm_wrap(subsys_mm, mm_cell, subsys_qm, qm_atom_index, saved_pos)
213
214 ! Turn off box translation, it was already performed by apply_qmmmx_translate(),
215 ! the particles coordinates will still be copied from MM to QM.
216 saved_do_translate = qmmm_env%qm%do_translate
217 qmmm_env%qm%do_translate = .false.
218
219 ! actual energy force calculation
220 CALL qmmm_calc_energy_force(qmmm_env, calc_force, consistent_energies, linres)
221
222 ! restore do_translate
223 qmmm_env%qm%do_translate = saved_do_translate
224
225 ! restore unwrapped positions
226 CALL apply_qmmm_unwrap(subsys_mm, subsys_qm, qm_atom_index, saved_pos)
227
228 ! restore RESTART filenames
229 CALL section_vals_val_set(force_env_section, "DFT%SCF%PRINT%RESTART%FILENAME", &
230 c_val=old_restart_fn)
231 CALL section_vals_val_set(force_env_section, "DFT%SCF%PRINT%RESTART_HISTORY%FILENAME", &
232 c_val=old_restart_hist_fn)
233
234 END SUBROUTINE qmmmx_calc_energy_force_low
235
236END MODULE qmmmx_force
Handles all functions related to the CELL.
Definition cell_types.F:15
types that represent a subsys, i.e. a part of the system
subroutine, public fist_env_get(fist_env, atomic_kind_set, particle_set, ewald_pw, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, ewald_env, fist_nonbond_env, thermo, para_env, subsys, qmmm, qmmm_env, input, shell_model, shell_model_ad, shell_particle_set, core_particle_set, multipoles, results, exclusions, efield)
Purpose: Get the FIST environment.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_fm_mom_conserv_none
integer, parameter, public do_fm_mom_conserv_buffer
integer, parameter, public do_fm_mom_conserv_equal_f
integer, parameter, public do_fm_mom_conserv_qm
integer, parameter, public do_fm_mom_conserv_equal_a
integer, parameter, public do_fm_mom_conserv_core
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_val_set(section_vals, keyword_name, i_rep_section, i_rep_val, val, l_val, i_val, r_val, c_val, l_vals_ptr, i_vals_ptr, r_vals_ptr, c_vals_ptr)
sets the requested value
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Define the data structure for the particle information.
Calculates QM/MM energy and forces.
Definition qmmm_force.F:14
subroutine, public qmmm_calc_energy_force(qmmm_env, calc_force, consistent_energies, linres)
calculates the qm/mm energy and forces
Definition qmmm_force.F:76
integer, parameter, public force_mixing_label_qm_core
integer, parameter, public force_mixing_label_buffer
integer, parameter, public force_mixing_label_qm_dynamics
Basic container type for QM/MM.
Definition qmmm_types.F:12
subroutine, public qmmm_env_get(qmmm_env, subsys, potential_energy, kinetic_energy)
...
Definition qmmm_types.F:50
subroutine, public apply_qmmm_unwrap(subsys_mm, subsys_qm, qm_atom_index, saved_pos)
...
Definition qmmm_util.F:346
subroutine, public apply_qmmm_wrap(subsys_mm, mm_cell, subsys_qm, qm_atom_index, saved_pos)
wrap positions (with mm periodicity)
Definition qmmm_util.F:310
Calculates QM/MM energy and forces with Force-Mixing.
Definition qmmmx_force.F:14
subroutine, public qmmmx_calc_energy_force(qmmmx_env, calc_force, consistent_energies, linres, require_consistent_energy_force)
calculates the qm/mm energy and forces
Definition qmmmx_force.F:66
Basic container type for QM/MM with force mixing.
Definition qmmmx_types.F:12
Routines used for force-mixing QM/MM calculations.
Definition qmmmx_util.F:14
subroutine, public apply_qmmmx_translate(qmmmx_env)
Apply translation to the full system in order to center the QM system into the QM box.
Definition qmmmx_util.F:75
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represents a system: atoms, molecules, their pos,vel,...