LCOV - code coverage report
Current view: top level - src/motion - input_cp2k_vib.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:561f475) Lines: 100.0 % 119 119
Test Date: 2026-06-21 06:48:54 Functions: 100.0 % 4 4

            Line data    Source code
       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 builds the input structure for the VIBRATIONAL_ANALYSIS module
      10              : !> \par History
      11              : !>      01.2008 [tlaino] Teodoro Laino - University of Zurich
      12              : !>                       Creating an own module for vibrational analysis
      13              : !> \author [tlaino]
      14              : ! **************************************************************************************************
      15              : MODULE input_cp2k_vib
      16              :    USE cp_output_handling,              ONLY: add_last_numeric,&
      17              :                                               cp_print_key_section_create,&
      18              :                                               debug_print_level,&
      19              :                                               low_print_level,&
      20              :                                               medium_print_level,&
      21              :                                               silent_print_level
      22              :    USE cp_units,                        ONLY: cp_unit_to_cp2k
      23              :    USE input_constants,                 ONLY: do_rep_blocked,&
      24              :                                               do_rep_interleaved,&
      25              :                                               ms_guess_atomic,&
      26              :                                               ms_guess_bfgs,&
      27              :                                               ms_guess_molden,&
      28              :                                               ms_guess_restart,&
      29              :                                               ms_guess_restart_vec
      30              :    USE input_keyword_types,             ONLY: keyword_create,&
      31              :                                               keyword_release,&
      32              :                                               keyword_type
      33              :    USE input_section_types,             ONLY: section_add_keyword,&
      34              :                                               section_add_subsection,&
      35              :                                               section_create,&
      36              :                                               section_release,&
      37              :                                               section_type
      38              :    USE input_val_types,                 ONLY: integer_t,&
      39              :                                               real_t
      40              :    USE kinds,                           ONLY: dp
      41              :    USE string_utilities,                ONLY: s2a
      42              : #include "../base/base_uses.f90"
      43              : 
      44              :    IMPLICIT NONE
      45              :    PRIVATE
      46              : 
      47              :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      48              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'input_cp2k_vib'
      49              : 
      50              :    PUBLIC :: create_vib_section
      51              : CONTAINS
      52              : 
      53              : ! **************************************************************************************************
      54              : !> \brief Creates the exteranal restart section
      55              : !> \param section the section to create
      56              : !> \author tlaino
      57              : ! **************************************************************************************************
      58        10340 :    SUBROUTINE create_vib_section(section)
      59              :       TYPE(section_type), POINTER                        :: section
      60              : 
      61              :       TYPE(keyword_type), POINTER                        :: keyword
      62              :       TYPE(section_type), POINTER                        :: subsection
      63              : 
      64        10340 :       CPASSERT(.NOT. ASSOCIATED(section))
      65              :       CALL section_create( &
      66              :          section, __LOCATION__, name="VIBRATIONAL_ANALYSIS", &
      67              :          description="Section to setup parameters to perform a Normal Modes, vibrational, or phonon analysis. "// &
      68              :          "Vibrations are computed using finite differences, "// &
      69              :          "which implies a very tight (e.g. 1E-8) threshold is needed for EPS_SCF to get accurate low frequencies. "// &
      70              :          "The analysis assumes a stationary state (minimum or TS),"// &
      71              :          " i.e. tight geometry optimization (MAX_FORCE) is needed as well.", &
      72        10340 :          n_keywords=1, n_subsections=0, repeats=.FALSE.)
      73        10340 :       NULLIFY (keyword, subsection)
      74              : 
      75              :       CALL keyword_create(keyword, __LOCATION__, name="DX", &
      76              :                           description="Specify the increment to be used to construct the HESSIAN with "// &
      77              :                           "finite difference method", &
      78        10340 :                           default_r_val=1.0E-2_dp, unit_str="bohr")
      79        10340 :       CALL section_add_keyword(section, keyword)
      80        10340 :       CALL keyword_release(keyword)
      81              : 
      82              :       CALL keyword_create(keyword, __LOCATION__, name="NPROC_REP", &
      83              :                           description="Specify the number of processors to be used per replica "// &
      84              :                           "environment (for parallel runs). "// &
      85              :                           "In case of mode selective calculations more than one replica will start"// &
      86              :                           " a block Davidson algorithm to track more than only one frequency", &
      87        10340 :                           default_i_val=1)
      88        10340 :       CALL section_add_keyword(section, keyword)
      89        10340 :       CALL keyword_release(keyword)
      90              : 
      91              :       CALL keyword_create(keyword, __LOCATION__, name="PROC_DIST_TYPE", &
      92              :                           description="Specify the topology of the mapping of processors into replicas.", &
      93              :                           usage="PROC_DIST_TYPE (INTERLEAVED|BLOCKED)", &
      94              :                           enum_c_vals=s2a("INTERLEAVED", &
      95              :                                           "BLOCKED"), &
      96              :                           enum_desc=s2a("Interleaved distribution", &
      97              :                                         "Blocked distribution"), &
      98              :                           enum_i_vals=[do_rep_interleaved, do_rep_blocked], &
      99        10340 :                           default_i_val=do_rep_blocked)
     100        10340 :       CALL section_add_keyword(section, keyword)
     101        10340 :       CALL keyword_release(keyword)
     102              : 
     103              :       CALL keyword_create(keyword, __LOCATION__, name="FULLY_PERIODIC", &
     104              :                           description="Avoids to clean rotations from the Hessian matrix.", &
     105        10340 :                           default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
     106        10340 :       CALL section_add_keyword(section, keyword)
     107        10340 :       CALL keyword_release(keyword)
     108              : 
     109              :       CALL keyword_create(keyword, __LOCATION__, name="INTENSITIES", &
     110              :                           description="Calculation of the IR/Raman-Intensities. "// &
     111              :                           "Calculation of dipoles and/or polarizabilities have to be "// &
     112              :                           "specified explicitly in DFT/PRINT/MOMENTS and/or "// &
     113              :                           "PROPERTIES/LINRES/POLAR", &
     114        10340 :                           default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
     115        10340 :       CALL section_add_keyword(section, keyword)
     116        10340 :       CALL keyword_release(keyword)
     117              : 
     118              :       CALL keyword_create(keyword, __LOCATION__, name="THERMOCHEMISTRY", &
     119              :                           description="Calculation of the thermochemical data. Valid for molecules in "// &
     120              :                           "the gas phase, not supporting phonon frequencies at general **q**-points "// &
     121              :                           "beyond wave vector **q** at gamma point. Based on the rigid-rotor harmonic "// &
     122              :                           "oscillator (RRHO) model, which is known to break down if very low vibrational "// &
     123              :                           "frequencies are present in a flexible system.", &
     124        10340 :                           default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
     125        10340 :       CALL section_add_keyword(section, keyword)
     126        10340 :       CALL keyword_release(keyword)
     127              : 
     128              :       CALL keyword_create(keyword, __LOCATION__, name="TC_TEMPERATURE", &
     129              :                           description="Temperature for the calculation of the thermochemical data ", &
     130              :                           usage="tc_temperature 325.0", default_r_val=cp_unit_to_cp2k(value=273.150_dp, unit_str="K"), &
     131        10340 :                           unit_str="K")
     132        10340 :       CALL section_add_keyword(section, keyword)
     133        10340 :       CALL keyword_release(keyword)
     134              : 
     135              :       CALL keyword_create(keyword, __LOCATION__, name="TC_PRESSURE", &
     136              :                           description="Pressure for the calculation of the thermochemical data  ", &
     137        10340 :                           default_r_val=cp_unit_to_cp2k(value=101325.0_dp, unit_str="Pa"), unit_str="Pa")
     138        10340 :       CALL section_add_keyword(section, keyword)
     139        10340 :       CALL keyword_release(keyword)
     140              : 
     141        10340 :       CALL create_mode_selective_section(subsection)
     142        10340 :       CALL section_add_subsection(section, subsection)
     143        10340 :       CALL section_release(subsection)
     144              : 
     145        10340 :       CALL create_print_vib_section(subsection)
     146        10340 :       CALL section_add_subsection(section, subsection)
     147        10340 :       CALL section_release(subsection)
     148        10340 :    END SUBROUTINE create_vib_section
     149              : 
     150              : ! **************************************************************************************************
     151              : !> \brief Create the print section for VIB
     152              : !> \param section the section to create
     153              : !> \author Teodoro Laino [tlaino] - 10.2008
     154              : ! **************************************************************************************************
     155        10340 :    SUBROUTINE create_print_vib_section(section)
     156              :       TYPE(section_type), POINTER                        :: section
     157              : 
     158              :       TYPE(keyword_type), POINTER                        :: keyword
     159              :       TYPE(section_type), POINTER                        :: print_key
     160              : 
     161        10340 :       CPASSERT(.NOT. ASSOCIATED(section))
     162              :       CALL section_create(section, __LOCATION__, name="PRINT", &
     163              :                           description="Section controlling the print information during a vibrational "// &
     164        10340 :                           "analysis.", n_keywords=1, n_subsections=0, repeats=.FALSE.)
     165        10340 :       NULLIFY (keyword, print_key)
     166              : 
     167              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "BANNER", &
     168              :                                        description="Controls the printing of the vibrational analysis banner", &
     169              :                                        print_level=low_print_level, common_iter_levels=1, &
     170        10340 :                                        filename="__STD_OUT__")
     171        10340 :       CALL section_add_subsection(section, print_key)
     172        10340 :       CALL section_release(print_key)
     173              : 
     174              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "PROGRAM_RUN_INFO", &
     175              :                                        description="Controls the printing basic info about the vibrational method", &
     176        10340 :                                        print_level=medium_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     177        10340 :       CALL section_add_subsection(section, print_key)
     178        10340 :       CALL section_release(print_key)
     179              : 
     180              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "MOLDEN_VIB", &
     181              :                                        description="Controls the printing for visualization in molden format", &
     182        10340 :                                        print_level=low_print_level, add_last=add_last_numeric, filename="VIBRATIONS")
     183        10340 :       CALL section_add_subsection(section, print_key)
     184        10340 :       CALL section_release(print_key)
     185              : 
     186              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "ROTATIONAL_INFO", &
     187              :                                        description="Controls the printing basic info during the cleaning of the "// &
     188              :                                        "rotational degrees of freedom.", &
     189        10340 :                                        print_level=debug_print_level, add_last=add_last_numeric, filename="__STD_OUT__")
     190              :       ! Print_key keywords
     191              :       CALL keyword_create(keyword, __LOCATION__, name="COORDINATES", &
     192              :                           description="Prints atomic coordinates after rotation", &
     193        10340 :                           default_l_val=.FALSE., lone_keyword_l_val=.TRUE.)
     194        10340 :       CALL section_add_keyword(print_key, keyword)
     195        10340 :       CALL keyword_release(keyword)
     196        10340 :       CALL section_add_subsection(section, print_key)
     197        10340 :       CALL section_release(print_key)
     198              : 
     199              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "CARTESIAN_EIGS", &
     200              :                                        description="Controls the printing of Cartesian "// &
     201              :                                        "frequencies and eigenvectors of the Hessian used "// &
     202              :                                        "for initializing ensemble for MD calculations. "// &
     203              :                                        "This should always print to a file, and will not "// &
     204              :                                        "effect the same frequencies and eigenvectors printed "// &
     205              :                                        "in the main vibrational analysis output", &
     206              :                                        print_level=low_print_level, &
     207              :                                        add_last=add_last_numeric, &
     208        10340 :                                        filename="VIBRATIONS")
     209              :       CALL keyword_create(keyword, __LOCATION__, name="BACKUP_COPIES", &
     210              :                           description="Specifies the maximum number of backup copies.", &
     211              :                           usage="BACKUP_COPIES {int}", &
     212        10340 :                           default_i_val=1)
     213        10340 :       CALL section_add_keyword(print_key, keyword)
     214        10340 :       CALL keyword_release(keyword)
     215        10340 :       CALL section_add_subsection(section, print_key)
     216        10340 :       CALL section_release(print_key)
     217              : 
     218              :       CALL cp_print_key_section_create(print_key, __LOCATION__, name="NAMD_PRINT", &
     219              :                                        description="Adjust cartesian eigenvalues / vectors to NewtonX format.", &
     220              :                                        print_level=debug_print_level + 1, add_last=add_last_numeric, &
     221        10340 :                                        filename="FullNormalizedCartesian")
     222              :       CALL keyword_create(keyword, __LOCATION__, name="BACKUP_COPIES", &
     223              :                           description="Specifies the maximum number of backup copies.", &
     224              :                           usage="BACKUP_COPIES {int}", &
     225        10340 :                           default_i_val=1)
     226        10340 :       CALL section_add_keyword(print_key, keyword)
     227        10340 :       CALL keyword_release(keyword)
     228        10340 :       CALL section_add_subsection(section, print_key)
     229        10340 :       CALL section_release(print_key)
     230              : 
     231              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "HESSIAN", &
     232              :                                        description="Write the Hessian matrix from a vibrational analysis calculation "// &
     233              :                                        "into a binary file.", &
     234        10340 :                                        print_level=low_print_level, add_last=add_last_numeric, filename="Hessian")
     235        10340 :       CALL section_add_subsection(section, print_key)
     236        10340 :       CALL section_release(print_key)
     237              : 
     238        10340 :    END SUBROUTINE create_print_vib_section
     239              : 
     240              : ! **************************************************************************************************
     241              : !> \brief Create the input section for MODE selective
     242              : !> \param section the section to create
     243              : !> \author fschiff
     244              : ! **************************************************************************************************
     245        10340 :    SUBROUTINE create_mode_selective_section(section)
     246              :       TYPE(section_type), POINTER                        :: section
     247              : 
     248              :       TYPE(keyword_type), POINTER                        :: keyword
     249              :       TYPE(section_type), POINTER                        :: print_key, subsection
     250              : 
     251        10340 :       NULLIFY (keyword, subsection, print_key)
     252        10340 :       CPASSERT(.NOT. ASSOCIATED(section))
     253              :       CALL section_create(section, __LOCATION__, name="MODE_SELECTIVE", &
     254              :                           description="All parameters needed for to run a mode selective vibrational analysis. "// &
     255              :                           "The keywords FREQUENCY, RANGE, and the subsection INVOLVED_ATOMS are mutually exclusive.", &
     256        10340 :                           n_keywords=8, n_subsections=1, repeats=.FALSE.)
     257              : 
     258              :       CALL keyword_create(keyword, __LOCATION__, name="FREQUENCY", &
     259              :                           description="value close to the expected value of the frequency to look for. "// &
     260              :                           "If the block Davidson algorithm is applied, the nrep closest frequencies are tracked. ", &
     261        10340 :                           usage="FREQUENCY {REAL}", default_r_val=-1._dp)
     262        10340 :       CALL section_add_keyword(section, keyword)
     263        10340 :       CALL keyword_release(keyword)
     264              : 
     265              :       CALL keyword_create(keyword, __LOCATION__, name="RANGE", &
     266              :                           description="Track modes in a given range of frequencies. "// &
     267              :                           "No warranty that the set of frequencies is complete.", &
     268              :                           usage="RANGE {REAL} {REAL}", &
     269        10340 :                           n_var=-1, type_of_var=real_t)
     270        10340 :       CALL section_add_keyword(section, keyword)
     271        10340 :       CALL keyword_release(keyword)
     272              : 
     273              :       CALL keyword_create(keyword, __LOCATION__, name="LOWEST_FREQUENCY", &
     274              :                           description="Lowest frequency mode to include when writing output. "// &
     275              :                           "Use a negative value to print imaginary frequencies. "// &
     276              :                           "Useful for visualizing the imaginary frequency along a reaction path coordinate "// &
     277              :                           "Depending on accuracy settings, the output might include spurious low frequency "// &
     278              :                           "imaginary modes which should be visually checked (see MOLDEN_VIB).", &
     279        10340 :                           usage="LOWEST_FREQUENCY <REAL>", default_r_val=0.0_dp)
     280        10340 :       CALL section_add_keyword(section, keyword)
     281        10340 :       CALL keyword_release(keyword)
     282              : 
     283              :       CALL keyword_create(keyword, __LOCATION__, name="ATOMS", &
     284              :                           description="Specifies the list of atoms which should be displaced for the Initial guess", &
     285              :                           usage="ATOMS {integer} {integer} .. {integer}", &
     286        10340 :                           n_var=-1, type_of_var=integer_t)
     287        10340 :       CALL section_add_keyword(section, keyword)
     288        10340 :       CALL keyword_release(keyword)
     289              : 
     290              :       CALL keyword_create(keyword, __LOCATION__, name="EPS_MAX_VAL", &
     291              :                           description="Convergence criterion for the davidson algorithm. Specifies the maximal value in the "// &
     292              :                           "residuum vectors ", &
     293        10340 :                           usage="EPS_MAX_VAL {REAL}", default_r_val=5.0E-7_dp)
     294        10340 :       CALL section_add_keyword(section, keyword)
     295        10340 :       CALL keyword_release(keyword)
     296              : 
     297              :       CALL keyword_create( &
     298              :          keyword, __LOCATION__, name="EPS_NORM", &
     299              :          description="Convergence criterion for the davidson algorithm. Specifies the maximal value of the norm "// &
     300              :          "of the residuum vectors ", &
     301        10340 :          usage="EPS_NORM {REAL}", default_r_val=2.0E-6_dp)
     302        10340 :       CALL section_add_keyword(section, keyword)
     303        10340 :       CALL keyword_release(keyword)
     304              : 
     305              :       CALL keyword_create( &
     306              :          keyword, __LOCATION__, name="INITIAL_GUESS", &
     307              :          description="The type of initial guess for the normal modes", &
     308              :          usage="INITIAL_GUESS BFGS_HESS", &
     309              :          default_i_val=ms_guess_atomic, &
     310              :          enum_c_vals=s2a("BFGS_HESS", "ATOMIC", "RESTART", "RESTART_VEC", "MOLDEN_RESTART"), &
     311              :          enum_desc=s2a("get the first displacement vector out of the BFGS approximate Hessian", &
     312              :                        "use random displacements for a set of atoms specified", &
     313              :                        "use data from MS_RESTART as initial guess", &
     314              :                        "use a vector from MS_RESTART, useful if you want to increase accurcy by changing functionals or basis", &
     315              :                        "use the .mol file of a former run, to restart a vector"// &
     316              :                        " (similar to Restart_vec, but a different file FORMAT is used)"), &
     317        10340 :          enum_i_vals=[ms_guess_bfgs, ms_guess_atomic, ms_guess_restart, ms_guess_restart_vec, ms_guess_molden])
     318        10340 :       CALL section_add_keyword(section, keyword)
     319        10340 :       CALL keyword_release(keyword)
     320              : 
     321              :       CALL keyword_create(keyword, __LOCATION__, name="RESTART_FILE_NAME", &
     322              :                           description="Specifies the name of the file used to create the restarted vectors", &
     323              :                           usage="RESTART_FILE_NAME {filename}", &
     324        10340 :                           default_lc_val="")
     325        10340 :       CALL section_add_keyword(section, keyword)
     326        10340 :       CALL keyword_release(keyword)
     327              : 
     328        10340 :       CALL create_involved_atoms_section(subsection)
     329        10340 :       CALL section_add_subsection(section, subsection)
     330        10340 :       CALL section_release(subsection)
     331              : 
     332              :       CALL section_create(subsection, __LOCATION__, name="PRINT", &
     333              :                           description="Controls the printing mode selective vibrational analysis", &
     334        10340 :                           n_keywords=0, n_subsections=1, repeats=.TRUE.)
     335              : 
     336              :       CALL cp_print_key_section_create(print_key, __LOCATION__, "MS_RESTART", &
     337              :                                        description="Controls the printing of the Mode Selective Restart file.", &
     338              :                                        print_level=silent_print_level, common_iter_levels=1, &
     339        10340 :                                        add_last=add_last_numeric, filename="")
     340        10340 :       CALL section_add_subsection(subsection, print_key)
     341        10340 :       CALL section_release(print_key)
     342              : 
     343        10340 :       CALL section_add_subsection(section, subsection)
     344        10340 :       CALL section_release(subsection)
     345              : 
     346        10340 :    END SUBROUTINE create_mode_selective_section
     347              : 
     348              : ! **************************************************************************************************
     349              : !> \brief Create the input section for Ivolved_atoms keyword in mode selective
     350              : !> \param section the section to create
     351              : !> \author fschiff
     352              : ! **************************************************************************************************
     353        10340 :    SUBROUTINE create_involved_atoms_section(section)
     354              :       TYPE(section_type), POINTER                        :: section
     355              : 
     356              :       TYPE(keyword_type), POINTER                        :: keyword
     357              : 
     358        10340 :       NULLIFY (keyword)
     359        10340 :       CPASSERT(.NOT. ASSOCIATED(section))
     360              :       CALL section_create( &
     361              :          section, __LOCATION__, name="INVOLVED_ATOMS", &
     362              :          description="All parameters needed for the tracking of modes dominated by the motion of selected atoms. "// &
     363              :          "Warning, if many atoms are involved, only low frequency modes are detected, "// &
     364              :          "since they are more delocalized and match the tracked eigenvector.", &
     365        10340 :          n_keywords=2, n_subsections=0, repeats=.FALSE.)
     366              : 
     367              :       CALL keyword_create( &
     368              :          keyword, __LOCATION__, name="RANGE", &
     369              :          description=" Specifies the range of wavenumbers in which the modes related to the ATOMS have to be tracked."// &
     370              :          " If not specified frequencies >400cm-1 will be used to avoid tracking of translational or rotational modes", &
     371              :          usage="RANGE {REAL} {REAL}", &
     372        10340 :          n_var=-1, type_of_var=real_t)
     373        10340 :       CALL section_add_keyword(section, keyword)
     374        10340 :       CALL keyword_release(keyword)
     375              : 
     376              :       CALL keyword_create( &
     377              :          keyword, __LOCATION__, name="INVOLVED_ATOMS", &
     378              :          description="Specifies the list of atoms on which the tracked eigenvector should have the highest value "// &
     379              :          "similar to looking for the vibration of a set of atoms", &
     380              :          usage="INVOLVED_ATOMS {integer} {integer} .. {integer}", &
     381        10340 :          n_var=-1, type_of_var=integer_t)
     382        10340 :       CALL section_add_keyword(section, keyword)
     383        10340 :       CALL keyword_release(keyword)
     384              : 
     385        10340 :    END SUBROUTINE create_involved_atoms_section
     386              : 
     387              : END MODULE input_cp2k_vib
        

Generated by: LCOV version 2.0-1