(git:34ef472)
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 ! **************************************************************************************************
23 SUBROUTINE cp_eval_at(gopt_env, x, f, gradient, master, &
24  final_evaluation, para_env)
25 
26  USE cp_log_handling, ONLY: cp_logger_type
27  USE averages_types, ONLY: average_quantities_type, &
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
37  USE message_passing, ONLY: mp_para_env_type
38  USE cp_subsys_types, ONLY: cp_subsys_get, &
39  cp_subsys_type, &
42  USE dimer_methods, ONLY: cp_eval_at_ts
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
56  nvt_ensemble, &
57  mol_dyn_run, &
58  geo_opt_run, &
59  cell_opt_run, &
60  fix_none
63  section_vals_type, &
65  USE md_run, ONLY: qs_mol_dyn
66  USE kinds, ONLY: dp, &
68  USE particle_list_types, ONLY: particle_list_type
70  USE virial_methods, ONLY: virial_update
71  USE virial_types, ONLY: virial_type
74  USE space_groups_types, ONLY: spgr_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
159  CASE (default_ts_method_id)
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 
374 END 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...
Definition: bibliography.F:28
integer, save, public henkelman1999
Definition: bibliography.F:43
Handles all functions related to the CELL.
Definition: cell_methods.F:15
subroutine, public write_cell(cell, subsys_section, tag)
Write the cell parameters to the output unit.
Definition: cell_methods.F:731
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.
Definition: dimer_methods.F:15
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)
Definition: dimer_methods.F:65
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
Definition: gopt_f_types.F:15
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)
Definition: space_groups.F:14
subroutine, public spgr_apply_rotations_stress(spgr, cell, stress)
routine applies the rotation matrices to the stress tensor.
Definition: space_groups.F:774
subroutine, public spgr_apply_rotations_coord(spgr, coord)
routine applies the rotation matrices to the coordinates.
Definition: space_groups.F:618
subroutine, public spgr_apply_rotations_force(spgr, force)
routine applies the rotation matrices to the forces.
Definition: space_groups.F:679
subroutine, public spgr_write_stress_tensor(stress, spgr)
Variable precision output of the symmetrized stress tensor.
Definition: space_groups.F:902
subroutine, public virial_update(virial, subsys, para_env)
Updates the virial given the virial and subsys.