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