(git:d1312bc)
Loading...
Searching...
No Matches
gopt_f77_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 evaluete the potential energy and its gradients using an array
10!> with same dimension as the particle_set
11!> \param gopt_env the geometry optimization environment
12!> \param x the position where the function should be evaluated
13!> \param f the function value
14!> \param gradient the value of its gradient
15!> \param master ...
16!> \param final_evaluation ...
17!> \param para_env ...
18!> \par History
19!> CELL OPTIMIZATION: Teodoro Laino [tlaino] - University of Zurich - 03.2008
20!> 07.2020 Pierre Cazade [pcazade] Space Group Symmetry
21!> \author Teodoro Laino [tlaino] - University of Zurich - 01.2008
22! **************************************************************************************************
23SUBROUTINE cp_eval_at(gopt_env, x, f, gradient, master, &
24 final_evaluation, para_env)
25
30 USE bibliography, ONLY: henkelman1999, &
31 cite_reference
32 USE cell_opt_utils, ONLY: get_dg_dh, &
36 USE cell_types, ONLY: cell_type
37 USE cell_methods, ONLY: write_cell
39 USE cp_subsys_types, ONLY: cp_subsys_get, &
45 USE force_env_types, ONLY: force_env_get, &
47 USE geo_opt, ONLY: cp_geo_opt
48 USE gopt_f_types, ONLY: gopt_f_type
59 USE md_run, ONLY: qs_mol_dyn
60 USE kinds, ONLY: dp
64 USE virial_types, ONLY: virial_type
72
73#include "../base/base_uses.f90"
74 IMPLICIT NONE
75 TYPE(gopt_f_type), POINTER :: gopt_env
76 REAL(KIND=dp), DIMENSION(:), POINTER :: x
77 REAL(KIND=dp), INTENT(OUT), OPTIONAL :: f
78 REAL(KIND=dp), DIMENSION(:), OPTIONAL, &
79 POINTER :: gradient
80 INTEGER, INTENT(IN) :: master
81 LOGICAL, INTENT(IN), OPTIONAL :: final_evaluation
82 TYPE(mp_para_env_type), POINTER :: para_env
83
84 CHARACTER(len=*), PARAMETER :: routineN = 'cp_eval_at'
85
86 INTEGER :: handle, idg, idir, ip, &
87 nparticle, nsize, shell_index
88 LOGICAL :: my_final_evaluation
89 REAL(KIND=dp) :: f_ts, potential_energy
90 REAL(KIND=dp), DIMENSION(3, 3) :: av_ptens
91 REAL(KIND=dp), DIMENSION(:), POINTER :: cell_gradient, gradient_ts
92 TYPE(cell_type), POINTER :: cell
93 TYPE(cp_subsys_type), POINTER :: subsys
94 TYPE(particle_list_type), POINTER :: core_particles, particles, &
95 shell_particles
96 TYPE(virial_type), POINTER :: virial
97 TYPE(cp_logger_type), POINTER :: new_logger
98 TYPE(average_quantities_type), POINTER :: averages
99 TYPE(spgr_type), POINTER :: spgr
100
101 NULLIFY (averages)
102 NULLIFY (cell)
103 NULLIFY (core_particles)
104 NULLIFY (gradient_ts)
105 NULLIFY (particles)
106 NULLIFY (shell_particles)
107 NULLIFY (subsys)
108 NULLIFY (virial)
109 NULLIFY (new_logger)
110 NULLIFY (spgr)
111
112 CALL timeset(routinen, handle)
113
114 CALL force_env_get(gopt_env%force_env, subsys=subsys, cell=cell)
115 CALL cp_subsys_get(subsys, &
116 core_particles=core_particles, &
117 particles=particles, &
118 shell_particles=shell_particles, &
119 virial=virial)
120
121 spgr => gopt_env%spgr
122
123 my_final_evaluation = .false.
124 IF (PRESENT(final_evaluation)) my_final_evaluation = final_evaluation
125
126 SELECT CASE (gopt_env%type_id)
128 CALL unpack_subsys_particles(subsys=subsys, r=x)
129 CALL write_structure_data(particles%els, cell, gopt_env%motion_section)
130 SELECT CASE (gopt_env%type_id)
132 ! Geometry Minimization
133 CALL force_env_calc_energy_force(gopt_env%force_env, &
134 calc_force=PRESENT(gradient), &
135 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
136 ! Possibly take the potential energy
137 IF (PRESENT(f)) THEN
138 CALL force_env_get(gopt_env%force_env, potential_energy=f)
139 END IF
140 ! Possibly take the gradients
141 IF (PRESENT(gradient)) THEN
142 IF (master == para_env%mepos) THEN ! we are on the master
143 CALL pack_subsys_particles(subsys=subsys, f=gradient, fscale=-1.0_dp)
144 IF (spgr%keep_space_group) THEN
145 CALL spgr_apply_rotations_force(spgr, gradient)
146 CALL unpack_subsys_particles(subsys=subsys, f=gradient, fscale=-1.0_dp)
147 END IF
148 END IF
149 END IF
151 ! Transition State Optimization
152 ALLOCATE (gradient_ts(particles%n_els*3))
153 ! Real calculation of energy and forces for transition state optimization:
154 ! When doing dimer methods forces have to be always computed since the function
155 ! to minimize is not the energy but the effective force
156 CALL cp_eval_at_ts(gopt_env, x, f_ts, gradient_ts, calc_force=.true.)
157 CALL cite_reference(henkelman1999)
158 ! Possibly take the potential energy
159 IF (PRESENT(f)) f = f_ts
160 ! Possibly take the gradients
161 IF (PRESENT(gradient)) THEN
162 IF (master == para_env%mepos) THEN ! we are on the master
163 cpassert(ASSOCIATED(gradient))
164 gradient = gradient_ts
165 END IF
166 END IF
167 DEALLOCATE (gradient_ts)
168 END SELECT
169 ! This call is necessary for QM/MM if a Translation is applied
170 ! this makes the geometry optimizer consistent
171 CALL unpack_subsys_particles(subsys=subsys, r=x)
173 ! Check for VIRIAL
174 IF (.NOT. virial%pv_availability) THEN
175 CALL cp_abort(__location__, &
176 "For a cell optimization task with CELL_OPT/TYPE "// &
177 "DIRECT_CELL_OPT, the FORCE_EVAL/STRESS_TENSOR "// &
178 "keyword MUST be defined in the input file for the "// &
179 "evaluation of the stress tensor, but none is found!")
180 END IF
181 IF (gopt_env%cell_env%keep_volume) THEN
182 nparticle = force_env_get_nparticle(gopt_env%force_env)
183 idg = 3*nparticle
184 CALL rescale_new_cell_volume(cell%deth, x, idg)
185 END IF
186
187 CALL apply_cell_change(gopt_env, cell, x, update_forces=.false.)
188 ! Possibly output the new cell used for the next calculation
189 CALL write_cell(cell, gopt_env%geo_section)
190 ! Compute the pressure tensor
191 block
192 TYPE(virial_type) :: virial_avg
193 CALL force_env_calc_energy_force(gopt_env%force_env, &
194 calc_force=PRESENT(gradient), &
195 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
196 ! Possibly take the potential energy
197 CALL force_env_get(gopt_env%force_env, potential_energy=potential_energy)
198 virial_avg = virial
199 CALL virial_update(virial_avg, subsys, para_env)
200 IF (PRESENT(f)) THEN
201 CALL force_env_get(gopt_env%force_env, potential_energy=f)
202 END IF
203 ! Possibly take the gradients
204 IF (PRESENT(gradient)) THEN
205 cpassert(any(virial_avg%pv_total /= 0))
206 ! Convert the average ptens
207 av_ptens(:, :) = virial_avg%pv_total(:, :)/cell%deth
208 IF (master == para_env%mepos) THEN ! we are on the master
209 cpassert(ASSOCIATED(gradient))
210 nparticle = force_env_get_nparticle(gopt_env%force_env)
211 nsize = 3*nparticle
212 cpassert((SIZE(gradient) == nsize + 6))
213 CALL pack_subsys_particles(subsys=subsys, f=gradient(1:nsize), fscale=-1.0_dp)
214 CALL apply_cell_change(gopt_env, cell, gradient, update_forces=.true.)
215 IF (spgr%keep_space_group) THEN
216 CALL spgr_apply_rotations_force(spgr, gradient)
217 CALL spgr_apply_rotations_stress(spgr, cell, av_ptens)
218 CALL spgr_write_stress_tensor(av_ptens, spgr)
219 END IF
220 cell_gradient => gradient(nsize + 1:nsize + 6)
221 cell_gradient = 0.0_dp
222 CALL get_dg_dh(cell_gradient, av_ptens, gopt_env%cell_env%pres_ext, cell, gopt_env%cell_env%mtrx, &
223 keep_angles=gopt_env%cell_env%keep_angles, &
224 keep_symmetry=gopt_env%cell_env%keep_symmetry, &
225 pres_int=gopt_env%cell_env%pres_int, &
226 pres_constr=gopt_env%cell_env%pres_constr, &
227 constraint_id=gopt_env%cell_env%constraint_id)
228 END IF
229 ! some callers expect pres_int to be available on all ranks. Also, here master is not necessarily a single rank.
230 ! Assume at least master==0
231 CALL para_env%bcast(gopt_env%cell_env%pres_int, 0)
232 IF (gopt_env%cell_env%constraint_id /= fix_none) THEN
233 CALL para_env%bcast(gopt_env%cell_env%pres_constr, 0)
234 END IF
235 END IF
236 END block
237 CASE (default_shellcore_method_id)
238 idg = 0
239 DO ip = 1, particles%n_els
240 shell_index = particles%els(ip)%shell_index
241 IF (shell_index /= 0) THEN
242 DO idir = 1, 3
243 idg = 3*(shell_index - 1) + idir
244 shell_particles%els(shell_index)%r(idir) = core_particles%els(ip)%r(idir) - x(idg)
245 END DO
246 END IF
247 END DO
248 CALL write_structure_data(particles%els, cell, gopt_env%motion_section)
249
250 ! Shell-core optimization
251 CALL force_env_calc_energy_force(gopt_env%force_env, &
252 calc_force=PRESENT(gradient), &
253 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
254
255 ! Possibly take the potential energy
256 IF (PRESENT(f)) THEN
257 CALL force_env_get(gopt_env%force_env, potential_energy=f)
258 END IF
259
260 ! Possibly take the gradients
261 IF (PRESENT(gradient)) THEN
262 IF (master == para_env%mepos) THEN ! we are on the master
263 cpassert(ASSOCIATED(gradient))
264 idg = 0
265 DO ip = 1, shell_particles%n_els
266 DO idir = 1, 3
267 idg = idg + 1
268 gradient(idg) = -(core_particles%els(ip)%f(idir) - shell_particles%els(ip)%f(idir))
269 END DO
270 END DO
271 END IF
272 END IF
273 CASE DEFAULT
274 cpabort("Invalid or not yet implemented type of optimization")
275 END SELECT
276
277 CALL timestop(handle)
278
279END SUBROUTINE cp_eval_at
subroutine cp_eval_at(gopt_env, x, f, gradient, master, final_evaluation, para_env)
evaluete the potential energy and its gradients using an array with same dimension as the particle_se...
Handles the type to compute averages during an MD.
subroutine, public create_averages(averages, averages_section, virial_avg, force_env)
Creates averages environment.
subroutine, public release_averages(averages)
releases the given averages env
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public henkelman1999
Handles all functions related to the CELL.
subroutine, public write_cell(cell, subsys_section, tag)
Write the cell parameters to the output unit.
contains a functional that calculates the energy and its derivatives for the geometry optimizer
subroutine, public rescale_new_cell_volume(vol, x, idg)
Rescale x(idg+1:idg+6) according to vol.
subroutine, public get_dg_dh(gradient, av_ptens, pres_ext, cell, mtrx, keep_angles, keep_symmetry, pres_int, pres_constr, constraint_id)
Computes the derivatives for the cell.
subroutine, public gopt_new_logger_release(new_logger, root_section, para_env, project_name, id_run)
releases a new logger used for cell optimization algorithm
subroutine, public gopt_new_logger_create(new_logger, root_section, para_env, project_name, id_run)
creates a new logger used for cell optimization algorithm
Handles all functions related to the CELL.
Definition cell_types.F:15
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
types that represent a subsys, i.e. a part of the system
subroutine, public unpack_subsys_particles(subsys, f, r, s, v, fscale, cell)
Unpack components of a subsystem particle sets into a single vector.
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell)
returns information about various attributes of the given subsys
subroutine, public pack_subsys_particles(subsys, f, r, s, v, fscale, cell)
Pack components of a subsystem particle sets into a single vector.
Contains types used for a Dimer Method calculations.
recursive subroutine, public cp_eval_at_ts(gopt_env, x, f, gradient, calc_force)
Computes the dimer energy/gradients (including the rotation of the dimer)
Interface for the force calculations.
recursive subroutine, public force_env_calc_energy_force(force_env, calc_force, consistent_energies, skip_external_control, eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor)
Interface routine for force and energy calculations.
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
integer function, public force_env_get_nparticle(force_env)
returns the number of particles in a force environment
performs geometry optimization
Definition geo_opt.F:13
subroutine, public cp_geo_opt(force_env, globenv, eval_opt_geo, rm_restart_info)
Main driver to perform geometry optimization.
Definition geo_opt.F:59
contains a functional that calculates the energy and its derivatives for the geometry optimizer
subroutine, public apply_cell_change(gopt_env, cell, x, update_forces)
Apply coordinate transformations after cell (shape) change.
contains a functional that calculates the energy and its derivatives for the geometry optimizer
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public default_shellcore_method_id
integer, parameter, public default_cell_method_id
integer, parameter, public default_minimization_method_id
integer, parameter, public default_ts_method_id
integer, parameter, public fix_none
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
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
Perform a molecular dynamics (MD) run using QUICKSTEP.
Definition md_run.F:14
subroutine, public qs_mol_dyn(force_env, globenv, averages, rm_restart_info, hmc_e_initial, hmc_e_final, mdctrl)
Main driver module for Molecular Dynamics.
Definition md_run.F:125
Interface to the message passing library MPI.
represent a simple array based list of the given type
Define methods related to particle_type.
subroutine, public write_structure_data(particle_set, cell, input_section)
Write structure data requested by a separate structure data input section to the output unit....
Space Group Symmetry Type Module (version 1.0, Ferbruary 12, 2021)
Space Group Symmetry Module (version 1.0, January 16, 2020)
subroutine, public spgr_apply_rotations_stress(spgr, cell, stress)
routine applies the rotation matrices to the stress tensor.
subroutine, public spgr_apply_rotations_coord(spgr, coord)
routine applies the rotation matrices to the coordinates.
subroutine, public spgr_apply_rotations_force(spgr, force)
routine applies the rotation matrices to the forces.
subroutine, public spgr_write_stress_tensor(stress, spgr)
Variable precision output of the symmetrized stress tensor.
subroutine, public virial_update(virial, subsys, para_env)
Updates the virial given the virial and subsys.
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represents a system: atoms, molecules, their pos,vel,...
calculates the potential energy of a system, and its derivatives
stores all the informations relevant to an mpi environment