(git:495eafe)
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
66 USE md_run, ONLY: qs_mol_dyn
67 USE kinds, ONLY: dp, &
72 USE virial_types, ONLY: virial_type
80
81#include "../base/base_uses.f90"
82 IMPLICIT NONE
83 TYPE(gopt_f_type), POINTER :: gopt_env
84 REAL(KIND=dp), DIMENSION(:), POINTER :: x
85 REAL(KIND=dp), INTENT(OUT), OPTIONAL :: f
86 REAL(KIND=dp), DIMENSION(:), OPTIONAL, &
87 POINTER :: gradient
88 INTEGER, INTENT(IN) :: master
89 LOGICAL, INTENT(IN), OPTIONAL :: final_evaluation
90 TYPE(mp_para_env_type), POINTER :: para_env
91
92 CHARACTER(len=*), PARAMETER :: routineN = 'cp_eval_at'
93
94 INTEGER :: ensemble, handle, idg, idir, ip, &
95 nparticle, nsize, shell_index
96 LOGICAL :: explicit, my_final_evaluation
97 REAL(KIND=dp) :: f_ts, potential_energy
98 REAL(KIND=dp), DIMENSION(3, 3) :: av_ptens
99 REAL(KIND=dp), DIMENSION(:), POINTER :: cell_gradient, gradient_ts
100 TYPE(cell_type), POINTER :: cell
101 TYPE(cp_subsys_type), POINTER :: subsys
102 TYPE(particle_list_type), POINTER :: core_particles, particles, &
103 shell_particles
104 TYPE(virial_type), POINTER :: virial
105 TYPE(cp_logger_type), POINTER :: new_logger
106 CHARACTER(LEN=default_string_length) :: project_name
107 TYPE(average_quantities_type), POINTER :: averages
108 TYPE(section_vals_type), POINTER :: work, avgs_section
109 TYPE(spgr_type), POINTER :: spgr
110
111 NULLIFY (averages)
112 NULLIFY (cell)
113 NULLIFY (core_particles)
114 NULLIFY (gradient_ts)
115 NULLIFY (particles)
116 NULLIFY (shell_particles)
117 NULLIFY (subsys)
118 NULLIFY (virial)
119 NULLIFY (new_logger)
120 NULLIFY (spgr)
121
122 CALL timeset(routinen, handle)
123
124 CALL force_env_get(gopt_env%force_env, subsys=subsys, cell=cell)
125 CALL cp_subsys_get(subsys, &
126 core_particles=core_particles, &
127 particles=particles, &
128 shell_particles=shell_particles, &
129 virial=virial)
130
131 spgr => gopt_env%spgr
132
133 my_final_evaluation = .false.
134 IF (PRESENT(final_evaluation)) my_final_evaluation = final_evaluation
135
136 SELECT CASE (gopt_env%type_id)
138 CALL unpack_subsys_particles(subsys=subsys, r=x)
139 CALL write_structure_data(particles%els, cell, gopt_env%motion_section)
140 SELECT CASE (gopt_env%type_id)
142 ! Geometry Minimization
143 CALL force_env_calc_energy_force(gopt_env%force_env, &
144 calc_force=PRESENT(gradient), &
145 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
146 ! Possibly take the potential energy
147 IF (PRESENT(f)) THEN
148 CALL force_env_get(gopt_env%force_env, potential_energy=f)
149 END IF
150 ! Possibly take the gradients
151 IF (PRESENT(gradient)) THEN
152 IF (master == para_env%mepos) THEN ! we are on the master
153 CALL pack_subsys_particles(subsys=subsys, f=gradient, fscale=-1.0_dp)
154 IF (spgr%keep_space_group) THEN
155 CALL spgr_apply_rotations_force(spgr, gradient)
156 CALL unpack_subsys_particles(subsys=subsys, f=gradient, fscale=-1.0_dp)
157 END IF
158 END IF
159 END IF
161 ! Transition State Optimization
162 ALLOCATE (gradient_ts(particles%n_els*3))
163 ! Real calculation of energy and forces for transition state optimization:
164 ! When doing dimer methods forces have to be always computed since the function
165 ! to minimize is not the energy but the effective force
166 CALL cp_eval_at_ts(gopt_env, x, f_ts, gradient_ts, calc_force=.true.)
167 CALL cite_reference(henkelman1999)
168 ! Possibly take the potential energy
169 IF (PRESENT(f)) f = f_ts
170 ! Possibly take the gradients
171 IF (PRESENT(gradient)) THEN
172 IF (master == para_env%mepos) THEN ! we are on the master
173 cpassert(ASSOCIATED(gradient))
174 gradient = gradient_ts
175 END IF
176 END IF
177 DEALLOCATE (gradient_ts)
178 END SELECT
179 ! This call is necessary for QM/MM if a Translation is applied
180 ! this makes the geometry optimizer consistent
181 CALL unpack_subsys_particles(subsys=subsys, r=x)
183 ! Check for VIRIAL
184 IF (.NOT. virial%pv_availability) &
185 CALL cp_abort(__location__, &
186 "For a cell optimization task with CELL_OPT/TYPE "// &
187 "DIRECT_CELL_OPT, the FORCE_EVAL/STRESS_TENSOR "// &
188 "keyword MUST be defined in the input file for the "// &
189 "evaluation of the stress tensor, but none is found!")
190 IF (gopt_env%cell_env%keep_volume) THEN
191 nparticle = force_env_get_nparticle(gopt_env%force_env)
192 SELECT CASE (gopt_env%cell_method_id)
194 idg = 3*nparticle
196 idg = 0
197 END SELECT
198 CALL rescale_new_cell_volume(cell%deth, x, idg)
199 END IF
200 SELECT CASE (gopt_env%cell_method_id)
202 CALL apply_cell_change(gopt_env, cell, x, update_forces=.false.)
203 ! Possibly output the new cell used for the next calculation
204 CALL write_cell(cell, gopt_env%geo_section)
205 ! Compute the pressure tensor
206 block
207 TYPE(virial_type) :: virial_avg
208 CALL force_env_calc_energy_force(gopt_env%force_env, &
209 calc_force=PRESENT(gradient), &
210 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
211 ! Possibly take the potential energy
212 CALL force_env_get(gopt_env%force_env, potential_energy=potential_energy)
213 virial_avg = virial
214 CALL virial_update(virial_avg, subsys, para_env)
215 IF (PRESENT(f)) THEN
216 CALL force_env_get(gopt_env%force_env, potential_energy=f)
217 END IF
218 ! Possibly take the gradients
219 IF (PRESENT(gradient)) THEN
220 cpassert(any(virial_avg%pv_total /= 0))
221 ! Convert the average ptens
222 av_ptens(:, :) = virial_avg%pv_total(:, :)/cell%deth
223 IF (master == para_env%mepos) THEN ! we are on the master
224 cpassert(ASSOCIATED(gradient))
225 nparticle = force_env_get_nparticle(gopt_env%force_env)
226 nsize = 3*nparticle
227 cpassert((SIZE(gradient) == nsize + 6))
228 CALL pack_subsys_particles(subsys=subsys, f=gradient(1:nsize), fscale=-1.0_dp)
229 CALL apply_cell_change(gopt_env, cell, gradient, update_forces=.true.)
230 IF (spgr%keep_space_group) THEN
231 CALL spgr_apply_rotations_force(spgr, gradient)
232 CALL spgr_apply_rotations_stress(spgr, cell, av_ptens)
233 CALL spgr_write_stress_tensor(av_ptens, spgr)
234 END IF
235 cell_gradient => gradient(nsize + 1:nsize + 6)
236 cell_gradient = 0.0_dp
237 CALL get_dg_dh(cell_gradient, av_ptens, gopt_env%cell_env%pres_ext, cell, gopt_env%cell_env%mtrx, &
238 keep_angles=gopt_env%cell_env%keep_angles, &
239 keep_symmetry=gopt_env%cell_env%keep_symmetry, &
240 pres_int=gopt_env%cell_env%pres_int, &
241 pres_constr=gopt_env%cell_env%pres_constr, &
242 constraint_id=gopt_env%cell_env%constraint_id)
243 END IF
244 ! some callers expect pres_int to be available on all ranks. Also, here master is not necessarily a single rank.
245 ! Assume at least master==0
246 CALL para_env%bcast(gopt_env%cell_env%pres_int, 0)
247 IF (gopt_env%cell_env%constraint_id /= fix_none) &
248 CALL para_env%bcast(gopt_env%cell_env%pres_constr, 0)
249 END IF
250 END block
251 CASE (default_cell_geo_opt_id, default_cell_md_id)
252 CALL apply_cell_change(gopt_env, cell, x, update_forces=.false.)
253 ! Possibly output the new cell used for the next calculation
254 CALL write_cell(cell, gopt_env%geo_section)
255 ! Compute the pressure tensor
256 block
257 TYPE(virial_type) :: virial_avg
258 IF (my_final_evaluation) THEN
259 CALL force_env_calc_energy_force(gopt_env%force_env, &
260 calc_force=PRESENT(gradient), &
261 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
262 IF (PRESENT(f)) THEN
263 CALL force_env_get(gopt_env%force_env, potential_energy=f)
264 END IF
265 ELSE
266 SELECT CASE (gopt_env%cell_method_id)
267 CASE (default_cell_geo_opt_id)
268 work => section_vals_get_subs_vals(gopt_env%motion_section, "GEO_OPT")
269 CALL section_vals_get(work, explicit=explicit)
270 IF (.NOT. explicit) &
271 CALL cp_abort(__location__, &
272 "For a cell optimization task with CELL_OPT/TYPE "// &
273 "GEO_OPT, besides the MOTION/CELL_OPT section, the "// &
274 "MOTION/GEO_OPT section MUST also be provided in "// &
275 "the input file for the evaluation of the stress "// &
276 "tensor, but none is found!")
277 ! Perform a geometry optimization
278 CALL gopt_new_logger_create(new_logger, gopt_env%force_env%root_section, para_env, &
279 project_name, id_run=geo_opt_run)
280 CALL cp_add_default_logger(new_logger)
281 CALL cp_geo_opt(gopt_env%force_env, gopt_env%globenv, eval_opt_geo=.false.)
282 CALL force_env_get(gopt_env%force_env, potential_energy=potential_energy)
283 virial_avg = virial
284 CASE (default_cell_md_id)
285 work => section_vals_get_subs_vals(gopt_env%motion_section, "MD")
286 avgs_section => section_vals_get_subs_vals(work, "AVERAGES")
287 CALL section_vals_get(work, explicit=explicit)
288 IF (.NOT. explicit) &
289 CALL cp_abort(__location__, &
290 "For a cell optimization task with CELL_OPT/TYPE MD, "// &
291 "besides the MOTION/CELL_OPT section, the MOTION/MD "// &
292 "section MUST also be provided in the input file for "// &
293 "the evaluation of the stress tensor, but none is found!")
294 ! Only NVT ensemble is allowed..
295 CALL section_vals_val_get(gopt_env%motion_section, "MD%ENSEMBLE", i_val=ensemble)
296 IF (ensemble /= nvt_ensemble) &
297 CALL cp_abort(__location__, &
298 "For a cell optimization task with CELL_OPT/TYPE MD, "// &
299 "the MOTION/MD/ENSEMBLE keyword MUST be set to NVT "// &
300 "and any other choice of ensemble is not supported!")
301 ! Perform a molecular dynamics
302 CALL gopt_new_logger_create(new_logger, gopt_env%force_env%root_section, para_env, &
303 project_name, id_run=mol_dyn_run)
304 CALL cp_add_default_logger(new_logger)
305 CALL create_averages(averages, avgs_section, virial_avg=.true., force_env=gopt_env%force_env)
306 CALL qs_mol_dyn(gopt_env%force_env, gopt_env%globenv, averages, rm_restart_info=.false.)
307 ! Retrieve the average of the stress tensor and the average of the potential energy
308 potential_energy = averages%avepot
309 virial_avg = averages%virial
310 CALL release_averages(averages)
311 CASE DEFAULT
312 ! Should never reach this point
313 cpabort("Invalid or not yet implemented type of cell optimization")
314 END SELECT
315 CALL cp_rm_default_logger()
316 CALL gopt_new_logger_release(new_logger, gopt_env%force_env%root_section, para_env, project_name, &
317 cell_opt_run)
318 ! Update the virial
319 CALL virial_update(virial_avg, subsys, para_env)
320 ! Possibly take give back the potential energy
321 IF (PRESENT(f)) THEN
322 f = potential_energy
323 END IF
324 END IF
325 ! Possibly give back the gradients
326 IF (PRESENT(gradient)) THEN
327 cpassert(any(virial_avg%pv_total /= 0))
328 ! Convert the average ptens
329 av_ptens(:, :) = virial_avg%pv_total(:, :)/cell%deth
330 IF (master == para_env%mepos) THEN ! we are on the master
331 cpassert(ASSOCIATED(gradient))
332 IF (spgr%keep_space_group) THEN
333 CALL spgr_apply_rotations_stress(spgr, cell, av_ptens)
334 CALL spgr_write_stress_tensor(av_ptens, spgr)
335 END IF
336 ! Compute the gradients on the cell
337 CALL get_dg_dh(gradient, av_ptens, gopt_env%cell_env%pres_ext, cell, gopt_env%cell_env%mtrx, &
338 keep_angles=gopt_env%cell_env%keep_angles, &
339 keep_symmetry=gopt_env%cell_env%keep_symmetry, &
340 pres_int=gopt_env%cell_env%pres_int, &
341 pres_constr=gopt_env%cell_env%pres_constr, &
342 constraint_id=gopt_env%cell_env%constraint_id)
343 END IF
344 ! some callers expect pres_int to be available on all ranks. Also, here master is not necessarily a single rank.
345 ! Assume at least master==0
346 CALL para_env%bcast(gopt_env%cell_env%pres_int, 0)
347 IF (gopt_env%cell_env%constraint_id /= fix_none) &
348 CALL para_env%bcast(gopt_env%cell_env%pres_constr, 0)
349 END IF
350 END block
351 CASE DEFAULT
352 cpabort("Invalid or not yet implemented type of cell optimization")
353 END SELECT
354 CASE (default_shellcore_method_id)
355 idg = 0
356 DO ip = 1, particles%n_els
357 shell_index = particles%els(ip)%shell_index
358 IF (shell_index /= 0) THEN
359 DO idir = 1, 3
360 idg = 3*(shell_index - 1) + idir
361 shell_particles%els(shell_index)%r(idir) = core_particles%els(ip)%r(idir) - x(idg)
362 END DO
363 END IF
364 END DO
365 CALL write_structure_data(particles%els, cell, gopt_env%motion_section)
366
367 ! Shell-core optimization
368 CALL force_env_calc_energy_force(gopt_env%force_env, &
369 calc_force=PRESENT(gradient), &
370 require_consistent_energy_force=gopt_env%require_consistent_energy_force)
371
372 ! Possibly take the potential energy
373 IF (PRESENT(f)) THEN
374 CALL force_env_get(gopt_env%force_env, potential_energy=f)
375 END IF
376
377 ! Possibly take the gradients
378 IF (PRESENT(gradient)) THEN
379 IF (master == para_env%mepos) THEN ! we are on the master
380 cpassert(ASSOCIATED(gradient))
381 idg = 0
382 DO ip = 1, shell_particles%n_els
383 DO idir = 1, 3
384 idg = idg + 1
385 gradient(idg) = -(core_particles%els(ip)%f(idir) - shell_particles%els(ip)%f(idir))
386 END DO
387 END DO
388 END IF
389 END IF
390 CASE DEFAULT
391 cpabort("Invalid or not yet implemented type of optimization")
392 END SELECT
393
394 CALL timestop(handle)
395
396END 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:58
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_cell_geo_opt_id
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
integer, parameter, public default_cell_md_id
integer, parameter, public default_cell_direct_id
integer, parameter, public mol_dyn_run
integer, parameter, public cell_opt_run
integer, parameter, public nvt_ensemble
integer, parameter, public geo_opt_run
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
integer, parameter, public default_string_length
Definition kinds.F:57
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:122
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