LCOV - code coverage report
Current view: top level - src/motion - gopt_f_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 98.6 % 72 71
Test Date: 2025-07-25 12:55:17 Functions: 60.0 % 5 3

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief contains a functional that calculates the energy and its derivatives
      10              : !>      for the geometry optimizer
      11              : !> \par History
      12              : !>      01.2008 - Luca Bellucci and Teodoro Laino - Generalizing for Dimer Method.
      13              : !>      03.2008 - Teodoro Laino [tlaino] - University of Zurich - Cell Optimization
      14              : ! **************************************************************************************************
      15              : MODULE gopt_f_types
      16              :    USE cell_opt_types,                  ONLY: cell_opt_env_create,&
      17              :                                               cell_opt_env_release,&
      18              :                                               cell_opt_env_type
      19              :    USE cp_subsys_types,                 ONLY: cp_subsys_get,&
      20              :                                               cp_subsys_type
      21              :    USE dimer_types,                     ONLY: dimer_env_create,&
      22              :                                               dimer_env_release,&
      23              :                                               dimer_env_retain,&
      24              :                                               dimer_env_type
      25              :    USE force_env_types,                 ONLY: force_env_get,&
      26              :                                               force_env_get_natom,&
      27              :                                               force_env_release,&
      28              :                                               force_env_retain,&
      29              :                                               force_env_type
      30              :    USE global_types,                    ONLY: global_environment_type
      31              :    USE gopt_param_types,                ONLY: gopt_param_read,&
      32              :                                               gopt_param_type
      33              :    USE input_constants,                 ONLY: default_cell_method_id,&
      34              :                                               default_dimer_method_id,&
      35              :                                               default_minimization_method_id,&
      36              :                                               default_shellcore_method_id,&
      37              :                                               default_ts_method_id
      38              :    USE input_section_types,             ONLY: section_vals_get_subs_vals,&
      39              :                                               section_vals_type
      40              :    USE kinds,                           ONLY: default_string_length,&
      41              :                                               dp
      42              :    USE particle_list_types,             ONLY: particle_list_type
      43              :    USE space_groups_types,              ONLY: release_spgr_type,&
      44              :                                               spgr_type
      45              : #include "../base/base_uses.f90"
      46              : 
      47              :    IMPLICIT NONE
      48              :    PRIVATE
      49              : 
      50              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      51              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'gopt_f_types'
      52              : 
      53              :    PUBLIC :: gopt_f_type, gopt_f_create, gopt_f_retain, gopt_f_release
      54              : 
      55              : ! **************************************************************************************************
      56              : !> \brief calculates the potential energy of a system, and its derivatives
      57              : !> \par History
      58              : !>      none
      59              : ! **************************************************************************************************
      60              :    TYPE gopt_f_type
      61              :       INTEGER                                  :: ref_count = 0
      62              :       INTEGER                                  :: nfree = 0
      63              :  INTEGER                                  :: type_id=default_cell_method_id, ts_method_id=0, cell_method_id=0, shellcore_method_id=0
      64              :       LOGICAL                                  :: dimer_rotation = .FALSE., do_line_search = .FALSE., eval_opt_geo = .FALSE.
      65              :       CHARACTER(LEN=default_string_length)     :: label = "", tag = ""
      66              :       TYPE(force_env_type), POINTER            :: force_env => NULL()
      67              :       TYPE(global_environment_type), POINTER   :: globenv => NULL()
      68              :       ! Motion section must be references only for IO of the MOTION%PRINT..
      69              :       TYPE(section_vals_type), POINTER         :: motion_section => NULL(), geo_section => NULL()
      70              :       TYPE(dimer_env_type), POINTER            :: dimer_env => NULL()
      71              :       TYPE(gopt_f_type), POINTER               :: gopt_dimer_env => NULL()
      72              :       TYPE(gopt_param_type), POINTER           :: gopt_dimer_param => NULL()
      73              :       TYPE(cell_opt_env_type), POINTER         :: cell_env => NULL()
      74              :       TYPE(spgr_type), POINTER                 :: spgr => NULL()
      75              :       REAL(KIND=dp), DIMENSION(3, 3)           :: h_ref = 0.0_dp
      76              :       LOGICAL                                  :: require_consistent_energy_force = .FALSE.
      77              :    END TYPE gopt_f_type
      78              : 
      79              : CONTAINS
      80              : 
      81              : ! **************************************************************************************************
      82              : !> \brief ...
      83              : !> \param gopt_env the geometry optimization environment to be created
      84              : !>      force_env:
      85              : !> \param gopt_param ...
      86              : !> \param force_env ...
      87              : !> \param globenv ...
      88              : !> \param geo_opt_section ...
      89              : !> \param eval_opt_geo ...
      90              : !> \par History
      91              : !>      none
      92              : ! **************************************************************************************************
      93         2011 :    RECURSIVE SUBROUTINE gopt_f_create(gopt_env, gopt_param, force_env, globenv, geo_opt_section, &
      94              :                                       eval_opt_geo)
      95              : 
      96              :       TYPE(gopt_f_type), POINTER                         :: gopt_env
      97              :       TYPE(gopt_param_type), POINTER                     :: gopt_param
      98              :       TYPE(force_env_type), POINTER                      :: force_env
      99              :       TYPE(global_environment_type), POINTER             :: globenv
     100              :       TYPE(section_vals_type), POINTER                   :: geo_opt_section
     101              :       LOGICAL, INTENT(IN), OPTIONAL                      :: eval_opt_geo
     102              : 
     103              :       INTEGER                                            :: natom, nshell
     104              :       TYPE(cp_subsys_type), POINTER                      :: subsys
     105              :       TYPE(particle_list_type), POINTER                  :: particles, shell_particles
     106              :       TYPE(section_vals_type), POINTER                   :: dimer_section, rot_opt_section
     107              : 
     108         2011 :       CPASSERT(.NOT. ASSOCIATED(gopt_env))
     109        26143 :       ALLOCATE (gopt_env)
     110         2011 :       nshell = 0
     111              : 
     112              :       NULLIFY (gopt_env%dimer_env, gopt_env%gopt_dimer_env, gopt_env%gopt_dimer_param, gopt_env%cell_env, gopt_env%spgr)
     113         2011 :       gopt_env%ref_count = 1
     114              :       gopt_env%dimer_rotation = .FALSE.
     115              :       gopt_env%do_line_search = .FALSE.
     116        10055 :       ALLOCATE (gopt_env%spgr)
     117         2011 :       CALL force_env_retain(force_env)
     118         2011 :       gopt_env%force_env => force_env
     119         2011 :       gopt_env%motion_section => section_vals_get_subs_vals(force_env%root_section, "MOTION")
     120         2011 :       gopt_env%geo_section => geo_opt_section
     121         2011 :       gopt_env%globenv => globenv
     122         2011 :       gopt_env%eval_opt_geo = .TRUE.
     123         2011 :       IF (PRESENT(eval_opt_geo)) gopt_env%eval_opt_geo = eval_opt_geo
     124         2011 :       gopt_env%require_consistent_energy_force = .TRUE.
     125              : 
     126         2011 :       CALL force_env_get(force_env, subsys=subsys)
     127         2011 :       gopt_env%type_id = gopt_param%type_id
     128         3784 :       SELECT CASE (gopt_env%type_id)
     129              :       CASE (default_ts_method_id, default_minimization_method_id)
     130              :          CALL cp_subsys_get(subsys, &
     131              :                             particles=particles, &
     132         1773 :                             shell_particles=shell_particles)
     133         1773 :          IF (ASSOCIATED(shell_particles)) nshell = shell_particles%n_els
     134              :          ! The same number of shell and core particles is assumed
     135         1773 :          gopt_env%nfree = particles%n_els + nshell
     136         1773 :          gopt_env%label = "GEO_OPT"
     137         1773 :          gopt_env%tag = "GEOMETRY"
     138         2035 :          SELECT CASE (gopt_param%type_id)
     139              :          CASE (default_ts_method_id)
     140           44 :             gopt_env%ts_method_id = gopt_param%ts_method_id
     141         1773 :             SELECT CASE (gopt_param%ts_method_id)
     142              :             CASE (default_dimer_method_id)
     143              :                ! For the Dimer method we use the same framework of geometry optimizers
     144              :                ! already defined for cp2k..
     145           22 :                natom = force_env_get_natom(force_env)
     146           22 :                dimer_section => section_vals_get_subs_vals(geo_opt_section, "TRANSITION_STATE%DIMER")
     147           22 :                CALL dimer_env_create(gopt_env%dimer_env, subsys, globenv, dimer_section)
     148              : 
     149              :                ! Setup the GEO_OPT environment for the rotation of the Dimer
     150           22 :                rot_opt_section => section_vals_get_subs_vals(dimer_section, "ROT_OPT")
     151           22 :                ALLOCATE (gopt_env%gopt_dimer_param)
     152              :                CALL gopt_param_read(gopt_env%gopt_dimer_param, rot_opt_section, &
     153           22 :                                     type_id=default_minimization_method_id)
     154           22 :                gopt_env%gopt_dimer_param%type_id = default_ts_method_id
     155              : 
     156              :                CALL gopt_f_create(gopt_env%gopt_dimer_env, gopt_env%gopt_dimer_param, force_env=force_env, &
     157           22 :                                   globenv=globenv, geo_opt_section=rot_opt_section, eval_opt_geo=eval_opt_geo)
     158           22 :                CALL dimer_env_retain(gopt_env%dimer_env)
     159           22 :                gopt_env%gopt_dimer_env%dimer_env => gopt_env%dimer_env
     160           22 :                gopt_env%gopt_dimer_env%label = "ROT_OPT"
     161           66 :                gopt_env%gopt_dimer_env%dimer_rotation = .TRUE.
     162              :             END SELECT
     163              :          END SELECT
     164              :       CASE (default_cell_method_id)
     165          218 :          gopt_env%nfree = 6
     166          218 :          gopt_env%label = "CELL_OPT"
     167          218 :          gopt_env%tag = "  CELL  "
     168          218 :          gopt_env%cell_method_id = gopt_param%cell_method_id
     169         5886 :          ALLOCATE (gopt_env%cell_env)
     170          218 :          CALL cell_opt_env_create(gopt_env%cell_env, force_env, gopt_env%geo_section)
     171              :       CASE (default_shellcore_method_id)
     172           20 :          gopt_env%nfree = subsys%shell_particles%n_els
     173           20 :          gopt_env%label = "SHELL_OPT"
     174           20 :          gopt_env%tag = "  SHELL-CORE  "
     175         2011 :          gopt_env%shellcore_method_id = gopt_param%shellcore_method_id
     176              :       END SELECT
     177         2011 :    END SUBROUTINE gopt_f_create
     178              : 
     179              : ! **************************************************************************************************
     180              : !> \brief ...
     181              : !> \param gopt_env the geometry optimization environment to retain
     182              : !> \par History
     183              : !>      none
     184              : ! **************************************************************************************************
     185          408 :    SUBROUTINE gopt_f_retain(gopt_env)
     186              :       TYPE(gopt_f_type), POINTER                         :: gopt_env
     187              : 
     188          408 :       CPASSERT(ASSOCIATED(gopt_env))
     189          408 :       CPASSERT(gopt_env%ref_count > 0)
     190          408 :       gopt_env%ref_count = gopt_env%ref_count + 1
     191          408 :    END SUBROUTINE gopt_f_retain
     192              : 
     193              : ! **************************************************************************************************
     194              : !> \brief ...
     195              : !> \param gopt_env the geometry optimization environment to release
     196              : !> \par History
     197              : !>      none
     198              : ! **************************************************************************************************
     199         4408 :    RECURSIVE SUBROUTINE gopt_f_release(gopt_env)
     200              :       TYPE(gopt_f_type), POINTER                         :: gopt_env
     201              : 
     202         4408 :       IF (ASSOCIATED(gopt_env)) THEN
     203         2419 :          CPASSERT(gopt_env%ref_count > 0)
     204         2419 :          gopt_env%ref_count = gopt_env%ref_count - 1
     205         2419 :          IF (gopt_env%ref_count == 0) THEN
     206         2011 :             CALL force_env_release(gopt_env%force_env)
     207              :             NULLIFY (gopt_env%force_env, &
     208         2011 :                      gopt_env%globenv, &
     209         2011 :                      gopt_env%motion_section, &
     210         2011 :                      gopt_env%geo_section)
     211         2011 :             IF (ASSOCIATED(gopt_env%cell_env)) THEN
     212          218 :                CALL cell_opt_env_release(gopt_env%cell_env)
     213          218 :                DEALLOCATE (gopt_env%cell_env)
     214              :             END IF
     215         2011 :             CALL dimer_env_release(gopt_env%dimer_env)
     216         2011 :             CALL gopt_f_release(gopt_env%gopt_dimer_env)
     217         2011 :             IF (ASSOCIATED(gopt_env%gopt_dimer_param)) DEALLOCATE (gopt_env%gopt_dimer_param)
     218         2011 :             CALL release_spgr_type(gopt_env%spgr)
     219         2011 :             DEALLOCATE (gopt_env)
     220              :          END IF
     221              :       END IF
     222         4408 :    END SUBROUTINE gopt_f_release
     223              : 
     224            0 : END MODULE gopt_f_types
        

Generated by: LCOV version 2.0-1