LCOV - code coverage report
Current view: top level - src - force_fields_ext.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 99.0 % 488 483
Test Date: 2025-12-04 06:27:48 Functions: 100.0 % 4 4

            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              : !> \par History
      10              : !>      Subroutine input_torsions changed (DG) 05-Dec-2000
      11              : !>      Output formats changed (DG) 05-Dec-2000
      12              : !>      JGH (26-01-2002) : force field parameters stored in tables, not in
      13              : !>        matrices. Input changed to have parameters labeled by the position
      14              : !>        and not atom pairs (triples etc)
      15              : !>      Teo (11.2005) : Moved all information on force field  pair_potential to
      16              : !>                      a much lighter memory structure
      17              : !>      Teo 09.2006   : Split all routines force_field I/O in a separate file
      18              : !>      10.2008 Teodoro Laino [tlaino] :  splitted from force_fields_input in order
      19              : !>              to collect in a unique module only the functions to read external FF
      20              : !> \author CJM
      21              : ! **************************************************************************************************
      22              : MODULE force_fields_ext
      23              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      24              :                                               cp_logger_type
      25              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      26              :                                               cp_print_key_unit_nr
      27              :    USE cp_parser_methods,               ONLY: parser_get_next_line,&
      28              :                                               parser_get_object,&
      29              :                                               parser_search_string,&
      30              :                                               parser_test_next_token
      31              :    USE cp_parser_types,                 ONLY: cp_parser_type,&
      32              :                                               parser_create,&
      33              :                                               parser_release
      34              :    USE cp_units,                        ONLY: cp_unit_to_cp2k
      35              :    USE force_field_kind_types,          ONLY: do_ff_g96
      36              :    USE force_field_types,               ONLY: amber_info_type,&
      37              :                                               charmm_info_type,&
      38              :                                               force_field_type,&
      39              :                                               gromos_info_type
      40              :    USE input_section_types,             ONLY: section_vals_type
      41              :    USE kinds,                           ONLY: default_string_length,&
      42              :                                               dp
      43              :    USE memory_utilities,                ONLY: reallocate
      44              :    USE message_passing,                 ONLY: mp_para_env_type
      45              :    USE particle_types,                  ONLY: particle_type
      46              :    USE string_utilities,                ONLY: uppercase
      47              :    USE topology_amber,                  ONLY: rdparm_amber_8
      48              : #include "./base/base_uses.f90"
      49              : 
      50              :    IMPLICIT NONE
      51              : 
      52              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'force_fields_ext'
      53              : 
      54              :    PRIVATE
      55              :    PUBLIC :: read_force_field_charmm, &
      56              :              read_force_field_amber, &
      57              :              read_force_field_gromos
      58              : 
      59              : CONTAINS
      60              : 
      61              : ! **************************************************************************************************
      62              : !> \brief Reads the GROMOS force_field
      63              : !> \param ff_type ...
      64              : !> \param para_env ...
      65              : !> \param mm_section ...
      66              : !> \author ikuo
      67              : ! **************************************************************************************************
      68           72 :    SUBROUTINE read_force_field_gromos(ff_type, para_env, mm_section)
      69              : 
      70              :       TYPE(force_field_type), INTENT(INOUT)              :: ff_type
      71              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      72              :       TYPE(section_vals_type), POINTER                   :: mm_section
      73              : 
      74              :       CHARACTER(len=*), PARAMETER :: routineN = 'read_force_field_gromos'
      75              :       REAL(KIND=dp), PARAMETER                           :: ekt = 2.5_dp
      76              : 
      77              :       CHARACTER(LEN=default_string_length)               :: label
      78              :       CHARACTER(LEN=default_string_length), &
      79              :          DIMENSION(21)                                   :: avail_section
      80           12 :       CHARACTER(LEN=default_string_length), POINTER      :: namearray(:)
      81              :       INTEGER                                            :: handle, iatom, icon, itemp, itype, iw, &
      82              :                                                             jatom, ncon, ntype, offset
      83              :       LOGICAL                                            :: found
      84              :       REAL(KIND=dp)                                      :: cosphi0, cost2, csq, sdet
      85              :       TYPE(cp_logger_type), POINTER                      :: logger
      86              :       TYPE(cp_parser_type)                               :: parser
      87              :       TYPE(gromos_info_type), POINTER                    :: gro_info
      88              : 
      89           12 :       CALL timeset(routineN, handle)
      90           12 :       NULLIFY (logger)
      91           12 :       logger => cp_get_default_logger()
      92              :       iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%FF_INFO", &
      93           12 :                                 extension=".mmLog")
      94              : 
      95           12 :       avail_section(1) = "TITLE"
      96           12 :       avail_section(2) = "TOPPHYSCON"
      97           12 :       avail_section(3) = "TOPVERSION"
      98           12 :       avail_section(4) = "ATOMTYPENAME"
      99           12 :       avail_section(5) = "RESNAME"
     100           12 :       avail_section(6) = "SOLUTEATOM"
     101           12 :       avail_section(7) = "BONDTYPE"
     102           12 :       avail_section(8) = "BONDH"
     103           12 :       avail_section(9) = "BOND"
     104           12 :       avail_section(10) = "BONDANGLETYPE"
     105           12 :       avail_section(11) = "BONDANGLEH"
     106           12 :       avail_section(12) = "BONDANGLE"
     107           12 :       avail_section(13) = "IMPDIHEDRALTYPE"
     108           12 :       avail_section(14) = "IMPDIHEDRALH"
     109           12 :       avail_section(15) = "IMPDIHEDRAL"
     110           12 :       avail_section(16) = "DIHEDRALTYPE"
     111           12 :       avail_section(17) = "DIHEDRALH"
     112           12 :       avail_section(18) = "DIHEDRAL"
     113           12 :       avail_section(19) = "LJPARAMETERS"
     114           12 :       avail_section(20) = "SOLVENTATOM"
     115           12 :       avail_section(21) = "SOLVENTCONSTR"
     116              : 
     117           12 :       gro_info => ff_type%gro_info
     118           12 :       gro_info%ff_gromos_type = ff_type%ff_type
     119           12 :       NULLIFY (namearray)
     120              :       ! ATOMTYPENAME SECTION
     121           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GTOP_INFO| Parsing the ATOMTYPENAME section'
     122           12 :       CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     123           12 :       label = TRIM(avail_section(4))
     124           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     125           12 :       IF (found) THEN
     126           12 :          CALL parser_get_next_line(parser, 1)
     127           12 :          CALL parser_get_object(parser, ntype)
     128           12 :          CALL reallocate(namearray, 1, ntype)
     129           96 :          DO itype = 1, ntype
     130           84 :             CALL parser_get_next_line(parser, 1)
     131           84 :             CALL parser_get_object(parser, namearray(itype), lower_to_upper=.TRUE.)
     132           96 :             IF (iw > 0) WRITE (iw, *) "GTOP_INFO|  ", TRIM(namearray(itype))
     133              :          END DO
     134              :       END IF
     135           12 :       CALL parser_release(parser)
     136              : 
     137              :       ! SOLVENTCONSTR SECTION
     138           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GROMOS_FF| Parsing the SOLVENTATOM section'
     139           12 :       CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     140              : 
     141           12 :       label = TRIM(avail_section(21))
     142           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     143           12 :       IF (found) THEN
     144            8 :          CALL parser_get_next_line(parser, 1)
     145            8 :          CALL parser_get_object(parser, ncon)
     146            8 :          CALL reallocate(gro_info%solvent_k, 1, ncon)
     147            8 :          CALL reallocate(gro_info%solvent_r0, 1, ncon)
     148           32 :          DO icon = 1, ncon
     149           24 :             CALL parser_get_next_line(parser, 1)
     150           24 :             CALL parser_get_object(parser, itemp)
     151           24 :             CALL parser_get_object(parser, itemp)
     152           24 :             CALL parser_get_object(parser, gro_info%solvent_r0(icon))
     153           56 :             gro_info%solvent_k(icon) = 0.0_dp
     154              :          END DO
     155              :       END IF
     156           12 :       CALL parser_release(parser)
     157              : 
     158           12 :       CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     159              :       ! BONDTYPE SECTION
     160           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GROMOS_FF| Parsing the BONDTYPE section'
     161           12 :       label = TRIM(avail_section(7))
     162           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     163           12 :       IF (found) THEN
     164           12 :          CALL parser_get_next_line(parser, 1)
     165           12 :          CALL parser_get_object(parser, ntype)
     166           12 :          CALL reallocate(gro_info%bond_k, 1, ntype)
     167           12 :          CALL reallocate(gro_info%bond_r0, 1, ntype)
     168           80 :          DO itype = 1, ntype
     169           68 :             CALL parser_get_next_line(parser, 1)
     170           68 :             CALL parser_get_object(parser, gro_info%bond_k(itype))
     171           68 :             CALL parser_get_object(parser, gro_info%bond_r0(itype))
     172           68 :             IF (ff_type%ff_type == do_ff_g96) THEN
     173           36 :                gro_info%bond_k(itype) = cp_unit_to_cp2k(gro_info%bond_k(itype), "kjmol*nm^-4")
     174              :             ELSE ! Assume its G87
     175           32 :                gro_info%bond_k(itype) = (2.0_dp)*gro_info%bond_k(itype)*gro_info%bond_r0(itype)**2
     176           32 :                gro_info%bond_k(itype) = cp_unit_to_cp2k(gro_info%bond_k(itype), "kjmol*nm^-2")
     177              :             END IF
     178           68 :             gro_info%bond_r0(itype) = cp_unit_to_cp2k(gro_info%bond_r0(itype), "nm")
     179           80 :             IF (iw > 0) WRITE (iw, *) "GROMOS_FF| PUT BONDTYPE INFO HERE!"
     180              :          END DO
     181              :       END IF
     182              : 
     183              :       ! BONDANGLETYPE SECTION
     184           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GROMOS_FF| Parsing the BONDANGLETYPE section'
     185           12 :       label = TRIM(avail_section(10))
     186           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     187           12 :       IF (found) THEN
     188           12 :          CALL parser_get_next_line(parser, 1)
     189           12 :          CALL parser_get_object(parser, ntype)
     190           12 :          CALL reallocate(gro_info%bend_k, 1, ntype)
     191           12 :          CALL reallocate(gro_info%bend_theta0, 1, ntype)
     192          104 :          DO itype = 1, ntype
     193           92 :             CALL parser_get_next_line(parser, 1)
     194           92 :             CALL parser_get_object(parser, gro_info%bend_k(itype))
     195           92 :             CALL parser_get_object(parser, gro_info%bend_theta0(itype))
     196           92 :             gro_info%bend_theta0(itype) = cp_unit_to_cp2k(gro_info%bend_theta0(itype), "deg")
     197           92 :             IF (ff_type%ff_type == do_ff_g96) THEN
     198           48 :                gro_info%bend_theta0(itype) = COS(gro_info%bend_theta0(itype))
     199              :             ELSE ! Assume its G87
     200           44 :                cost2 = COS(gro_info%bend_theta0(itype))*COS(gro_info%bend_theta0(itype))
     201           44 :                sdet = cost2*cost2 - (2.0_dp*cost2 - 1.0_dp)*(1.0_dp - ekt/gro_info%bend_k(itype))
     202           44 :                csq = (cost2 - SQRT(sdet))/(2.0_dp*cost2 - 1.0_dp)
     203           44 :                gro_info%bend_k(itype) = ekt/ACOS(csq)**2
     204              :             END IF
     205           92 :             gro_info%bend_k(itype) = cp_unit_to_cp2k(gro_info%bend_k(itype), "kjmol")
     206          104 :             IF (iw > 0) WRITE (iw, *) "GROMOS_FF| PUT BONDANGLETYPE INFO HERE!"
     207              :          END DO
     208              :       END IF
     209              : 
     210              :       ! IMPDIHEDRALTYPE SECTION
     211           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GROMOS_FF| Parsing the IMPDIHEDRALTYPE section'
     212           12 :       label = TRIM(avail_section(13))
     213           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     214           12 :       IF (found) THEN
     215           12 :          CALL parser_get_next_line(parser, 1)
     216           12 :          CALL parser_get_object(parser, ntype)
     217           12 :          CALL reallocate(gro_info%impr_k, 1, ntype)
     218           12 :          CALL reallocate(gro_info%impr_phi0, 1, ntype)
     219           12 :          DO itype = 1, ntype
     220            0 :             CALL parser_get_next_line(parser, 1)
     221            0 :             CALL parser_get_object(parser, gro_info%impr_k(itype))
     222            0 :             CALL parser_get_object(parser, gro_info%impr_phi0(itype))
     223            0 :             gro_info%impr_phi0(itype) = cp_unit_to_cp2k(gro_info%impr_phi0(itype), "deg")
     224            0 :             gro_info%impr_k(itype) = cp_unit_to_cp2k(gro_info%impr_k(itype), "kjmol*deg^-2")
     225           12 :             IF (iw > 0) WRITE (iw, *) "GROMOS_FF| PUT IMPDIHEDRALTYPE INFO HERE!"
     226              :          END DO
     227              :       END IF
     228              : 
     229              :       ! DIHEDRALTYPE SECTION
     230           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GROMOS_FF| Parsing the DIHEDRALTYPE section'
     231           12 :       label = TRIM(avail_section(16))
     232           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     233           12 :       IF (found) THEN
     234           12 :          CALL parser_get_next_line(parser, 1)
     235           12 :          CALL parser_get_object(parser, ntype)
     236           12 :          CALL reallocate(gro_info%torsion_k, 1, ntype)
     237           12 :          CALL reallocate(gro_info%torsion_m, 1, ntype)
     238           12 :          CALL reallocate(gro_info%torsion_phi0, 1, ntype)
     239          164 :          DO itype = 1, ntype
     240          152 :             CALL parser_get_next_line(parser, 1)
     241          152 :             CALL parser_get_object(parser, gro_info%torsion_k(itype))
     242          152 :             CALL parser_get_object(parser, cosphi0)
     243          152 :             CALL parser_get_object(parser, gro_info%torsion_m(itype))
     244          152 :             gro_info%torsion_phi0(itype) = ACOS(cosphi0)
     245          152 :             gro_info%torsion_k(itype) = cp_unit_to_cp2k(gro_info%torsion_k(itype), "kjmol")
     246          316 :             IF (iw > 0) WRITE (iw, *) "GROMOS_FF| PUT DIHEDRALTYPE INFO HERE!"
     247              :          END DO
     248              :       END IF
     249              : 
     250           12 :       CALL parser_release(parser)
     251              : 
     252              :       ! LJPARAMETERS SECTION
     253           12 :       IF (iw > 0) WRITE (iw, '(T2,A)') 'GROMOS_FF| Parsing the LJPARAMETERS section'
     254           12 :       CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     255           12 :       label = TRIM(avail_section(19))
     256           12 :       CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     257           12 :       IF (found) THEN
     258           12 :          CALL parser_get_next_line(parser, 1)
     259           12 :          CALL parser_get_object(parser, ntype)
     260           12 :          offset = 0
     261           12 :          IF (ASSOCIATED(gro_info%nonbond_a)) offset = SIZE(gro_info%nonbond_a)
     262           12 :          ntype = SIZE(namearray)
     263           12 :          CALL reallocate(gro_info%nonbond_a, 1, ntype)
     264           12 :          CALL reallocate(gro_info%nonbond_a_14, 1, ntype)
     265           12 :          CALL reallocate(gro_info%nonbond_c6, 1, ntype, 1, ntype)
     266           12 :          CALL reallocate(gro_info%nonbond_c12, 1, ntype, 1, ntype)
     267           12 :          CALL reallocate(gro_info%nonbond_c6_14, 1, ntype, 1, ntype)
     268           12 :          CALL reallocate(gro_info%nonbond_c12_14, 1, ntype, 1, ntype)
     269              : 
     270          780 :          gro_info%nonbond_c12 = 0._dp
     271          780 :          gro_info%nonbond_c6 = 0._dp
     272          780 :          gro_info%nonbond_c12_14 = 0._dp
     273          780 :          gro_info%nonbond_c6_14 = 0._dp
     274              : 
     275          396 :          DO itype = 1, ntype*(ntype + 1)/2
     276          384 :             CALL parser_get_next_line(parser, 1)
     277          384 :             CALL parser_get_object(parser, iatom)
     278          384 :             CALL parser_get_object(parser, jatom)
     279          384 :             IF (iatom == jatom) THEN
     280           84 :                gro_info%nonbond_a(iatom) = namearray(iatom)
     281           84 :                gro_info%nonbond_a_14(iatom) = namearray(iatom)
     282              :             END IF
     283          384 :             CALL parser_get_object(parser, gro_info%nonbond_c12(iatom, jatom))
     284          384 :             CALL parser_get_object(parser, gro_info%nonbond_c6(iatom, jatom))
     285          384 :             CALL parser_get_object(parser, gro_info%nonbond_c12_14(iatom, jatom))
     286          384 :             CALL parser_get_object(parser, gro_info%nonbond_c6_14(iatom, jatom))
     287          384 :             gro_info%nonbond_c6(iatom, jatom) = cp_unit_to_cp2k(gro_info%nonbond_c6(iatom, jatom), "kjmol*nm^6")
     288          384 :             gro_info%nonbond_c12(iatom, jatom) = cp_unit_to_cp2k(gro_info%nonbond_c12(iatom, jatom), "kjmol*nm^12")
     289          384 :             gro_info%nonbond_c6_14(iatom, jatom) = cp_unit_to_cp2k(gro_info%nonbond_c6_14(iatom, jatom), "kjmol*nm^6")
     290          384 :             gro_info%nonbond_c12_14(iatom, jatom) = cp_unit_to_cp2k(gro_info%nonbond_c12_14(iatom, jatom), "kjmol*nm^12")
     291              : 
     292          384 :             gro_info%nonbond_c6_14(jatom, iatom) = gro_info%nonbond_c6_14(iatom, jatom)
     293          384 :             gro_info%nonbond_c12_14(jatom, iatom) = gro_info%nonbond_c12_14(iatom, jatom)
     294          384 :             gro_info%nonbond_c6(jatom, iatom) = gro_info%nonbond_c6(iatom, jatom)
     295          384 :             gro_info%nonbond_c12(jatom, iatom) = gro_info%nonbond_c12(iatom, jatom)
     296          780 :             IF (iw > 0) WRITE (iw, *) "GROMOS_FF| PUT LJPARAMETERS INFO HERE!"
     297              :          END DO
     298              :       END IF
     299           12 :       CALL parser_release(parser)
     300              : 
     301              :       CALL cp_print_key_finished_output(iw, logger, mm_section, &
     302           12 :                                         "PRINT%FF_INFO")
     303           12 :       CALL timestop(handle)
     304              : 
     305           12 :       DEALLOCATE (namearray)
     306           36 :    END SUBROUTINE read_force_field_gromos
     307              : 
     308              : ! **************************************************************************************************
     309              : !> \brief Reads the charmm force_field
     310              : !> \param ff_type ...
     311              : !> \param para_env ...
     312              : !> \param mm_section ...
     313              : !> \author ikuo
     314              : ! **************************************************************************************************
     315         1760 :    SUBROUTINE read_force_field_charmm(ff_type, para_env, mm_section)
     316              : 
     317              :       TYPE(force_field_type), INTENT(INOUT)              :: ff_type
     318              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     319              :       TYPE(section_vals_type), POINTER                   :: mm_section
     320              : 
     321              :       CHARACTER(len=*), PARAMETER :: routineN = 'read_force_field_charmm'
     322              : 
     323              :       CHARACTER(LEN=default_string_length)               :: label, string, string2, string3, string4
     324              :       CHARACTER(LEN=default_string_length), DIMENSION(1) :: bond_section
     325              :       CHARACTER(LEN=default_string_length), DIMENSION(2) :: angl_section, impr_section, &
     326              :                                                             nbon_section, thet_section
     327              :       CHARACTER(LEN=default_string_length), &
     328              :          DIMENSION(20)                                   :: avail_section
     329              :       INTEGER                                            :: dummy, handle, ilab, iw, nbend, nbond, &
     330              :                                                             nimpr, nnonbond, nonfo, ntorsion, nub
     331              :       LOGICAL                                            :: found
     332              :       TYPE(charmm_info_type), POINTER                    :: chm_info
     333              :       TYPE(cp_logger_type), POINTER                      :: logger
     334              :       TYPE(cp_parser_type)                               :: parser
     335              : 
     336          880 :       CALL timeset(routineN, handle)
     337          880 :       NULLIFY (logger)
     338          880 :       logger => cp_get_default_logger()
     339              :       iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%FF_INFO", &
     340          880 :                                 extension=".mmLog")
     341              : 
     342          880 :       avail_section(1) = "BOND"; bond_section(1) = avail_section(1)
     343          880 :       avail_section(11) = "BONDS"
     344          880 :       avail_section(2) = "ANGL"; angl_section(1) = avail_section(2)
     345          880 :       avail_section(3) = "THETA"; angl_section(2) = avail_section(3)
     346          880 :       avail_section(12) = "THETAS"
     347          880 :       avail_section(13) = "ANGLE"
     348          880 :       avail_section(14) = "ANGLES"
     349          880 :       avail_section(4) = "DIHEDRAL"; thet_section(1) = avail_section(4)
     350          880 :       avail_section(15) = "DIHEDRALS"
     351          880 :       avail_section(5) = "PHI"; thet_section(2) = avail_section(5)
     352          880 :       avail_section(6) = "IMPROPER"; impr_section(1) = avail_section(6)
     353          880 :       avail_section(20) = "IMPROPERS"
     354          880 :       avail_section(7) = "IMPH"; impr_section(2) = avail_section(7)
     355          880 :       avail_section(16) = "IMPHI"
     356          880 :       avail_section(8) = "NONBONDED"; nbon_section(1) = avail_section(8)
     357          880 :       avail_section(9) = "NBOND"; nbon_section(2) = avail_section(9)
     358          880 :       avail_section(10) = "HBOND"
     359          880 :       avail_section(17) = "NBFIX"
     360          880 :       avail_section(18) = "CMAP"
     361          880 :       avail_section(19) = "END"
     362              : 
     363          880 :       chm_info => ff_type%chm_info
     364              :       !-----------------------------------------------------------------------------
     365              :       !-----------------------------------------------------------------------------
     366              :       ! 1. Read in all the Bonds info from the param file here
     367              :       !      Vbond = Kb(b-b0)^2
     368              :       !      UNITS for Kb: [(kcal/mol)/(A^2)] to [Eh/(AU^2)]
     369              :       !-----------------------------------------------------------------------------
     370          880 :       nbond = 0
     371         1760 :       DO ilab = 1, SIZE(bond_section)
     372          880 :          CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     373          880 :          label = TRIM(bond_section(ilab))
     374              :          DO
     375         3250 :             CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     376         3250 :             IF (found) THEN
     377         2370 :                CALL parser_get_object(parser, string)
     378         2370 :                IF (INDEX(string, TRIM(label)) /= 1) CYCLE
     379          880 :                CALL charmm_get_next_line(parser, 1)
     380        19878 :                DO
     381        20758 :                   CALL parser_get_object(parser, string)
     382        20758 :                   CALL uppercase(string)
     383       429758 :                   IF (ANY(string == avail_section)) EXIT
     384        19878 :                   CALL parser_get_object(parser, string2)
     385        19878 :                   CALL uppercase(string2)
     386        19878 :                   nbond = nbond + 1
     387        19878 :                   CALL reallocate(chm_info%bond_a, 1, nbond)
     388        19878 :                   CALL reallocate(chm_info%bond_b, 1, nbond)
     389        19878 :                   CALL reallocate(chm_info%bond_k, 1, nbond)
     390        19878 :                   CALL reallocate(chm_info%bond_r0, 1, nbond)
     391        19878 :                   chm_info%bond_a(nbond) = string
     392        19878 :                   chm_info%bond_b(nbond) = string2
     393        19878 :                   CALL parser_get_object(parser, chm_info%bond_k(nbond))
     394        19878 :                   CALL parser_get_object(parser, chm_info%bond_r0(nbond))
     395        20909 :                   IF (iw > 0) WRITE (iw, *) "    CHM BOND ", nbond, &
     396         1031 :                      TRIM(chm_info%bond_a(nbond)), " ", &
     397         1031 :                      TRIM(chm_info%bond_b(nbond)), " ", &
     398         1031 :                      chm_info%bond_k(nbond), &
     399         2062 :                      chm_info%bond_r0(nbond)
     400              :                   ! Do some units conversion into internal atomic units
     401        19878 :                   chm_info%bond_r0(nbond) = cp_unit_to_cp2k(chm_info%bond_r0(nbond), "angstrom")
     402        19878 :                   chm_info%bond_k(nbond) = cp_unit_to_cp2k(chm_info%bond_k(nbond), "kcalmol*angstrom^-2")
     403        22248 :                   CALL charmm_get_next_line(parser, 1)
     404              :                END DO
     405              :             ELSE
     406              :                EXIT
     407              :             END IF
     408              :          END DO
     409         2640 :          CALL parser_release(parser)
     410              :       END DO
     411              :       !-----------------------------------------------------------------------------
     412              :       !-----------------------------------------------------------------------------
     413              :       ! 2. Read in all the Bends and UB info from the param file here
     414              :       !      Vangle = Ktheta(theta-theta0)^2
     415              :       !      UNITS for Ktheta: [(kcal/mol)/(rad^2)] to [Eh/(rad^2)]
     416              :       !      FACTOR of "2" rolled into Ktheta
     417              :       !      Vub = Kub(S-S0)^2
     418              :       !      UNITS for Kub: [(kcal/mol)/(A^2)] to [Eh/(AU^2)]
     419              :       !-----------------------------------------------------------------------------
     420          880 :       nbend = 0
     421          880 :       nub = 0
     422         2640 :       DO ilab = 1, SIZE(angl_section)
     423         1760 :          CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     424         1760 :          label = TRIM(angl_section(ilab))
     425              :          DO
     426         2650 :             CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     427         2650 :             IF (found) THEN
     428          890 :                CALL parser_get_object(parser, string)
     429          890 :                IF (INDEX(string, TRIM(label)) /= 1) CYCLE
     430          880 :                CALL charmm_get_next_line(parser, 1)
     431              :                DO
     432        45537 :                   CALL parser_get_object(parser, string)
     433        45537 :                   CALL uppercase(string)
     434       950897 :                   IF (ANY(string == avail_section)) EXIT
     435        44657 :                   CALL parser_get_object(parser, string2)
     436        44657 :                   CALL parser_get_object(parser, string3)
     437        44657 :                   CALL uppercase(string2)
     438        44657 :                   CALL uppercase(string3)
     439        44657 :                   nbend = nbend + 1
     440        44657 :                   CALL reallocate(chm_info%bend_a, 1, nbend)
     441        44657 :                   CALL reallocate(chm_info%bend_b, 1, nbend)
     442        44657 :                   CALL reallocate(chm_info%bend_c, 1, nbend)
     443        44657 :                   CALL reallocate(chm_info%bend_k, 1, nbend)
     444        44657 :                   CALL reallocate(chm_info%bend_theta0, 1, nbend)
     445        44657 :                   chm_info%bend_a(nbend) = string
     446        44657 :                   chm_info%bend_b(nbend) = string2
     447        44657 :                   chm_info%bend_c(nbend) = string3
     448        44657 :                   CALL parser_get_object(parser, chm_info%bend_k(nbend))
     449        44657 :                   CALL parser_get_object(parser, chm_info%bend_theta0(nbend))
     450        46632 :                   IF (iw > 0) WRITE (iw, *) "    CHM BEND ", nbend, &
     451         1975 :                      TRIM(chm_info%bend_a(nbend)), " ", &
     452         1975 :                      TRIM(chm_info%bend_b(nbend)), " ", &
     453         1975 :                      TRIM(chm_info%bend_c(nbend)), " ", &
     454         1975 :                      chm_info%bend_k(nbend), &
     455         3950 :                      chm_info%bend_theta0(nbend)
     456              :                   ! Do some units conversion into internal atomic units
     457        44657 :                   chm_info%bend_theta0(nbend) = cp_unit_to_cp2k(chm_info%bend_theta0(nbend), "deg")
     458        44657 :                   chm_info%bend_k(nbend) = cp_unit_to_cp2k(chm_info%bend_k(nbend), "kcalmol*rad^-2")
     459        44657 :                   IF (parser_test_next_token(parser) == "FLT") THEN
     460        13074 :                      nub = nub + 1
     461        13074 :                      CALL reallocate(chm_info%ub_a, 1, nub)
     462        13074 :                      CALL reallocate(chm_info%ub_b, 1, nub)
     463        13074 :                      CALL reallocate(chm_info%ub_c, 1, nub)
     464        13074 :                      CALL reallocate(chm_info%ub_k, 1, nub)
     465        13074 :                      CALL reallocate(chm_info%ub_r0, 1, nub)
     466        13074 :                      chm_info%ub_a(nub) = string
     467        13074 :                      chm_info%ub_b(nub) = string2
     468        13074 :                      chm_info%ub_c(nub) = string3
     469        13074 :                      CALL parser_get_object(parser, chm_info%ub_k(nub))
     470        13074 :                      CALL parser_get_object(parser, chm_info%ub_r0(nub))
     471        13390 :                      IF (iw > 0) WRITE (iw, *) "    CHM UB ", nub, &
     472          316 :                         TRIM(chm_info%ub_a(nub)), " ", &
     473          316 :                         TRIM(chm_info%ub_b(nub)), " ", &
     474          316 :                         TRIM(chm_info%ub_c(nub)), " ", &
     475          316 :                         chm_info%ub_k(nub), &
     476          632 :                         chm_info%ub_r0(nub)
     477              :                      ! Do some units conversion into internal atomic units
     478        13074 :                      chm_info%ub_r0(nub) = cp_unit_to_cp2k(chm_info%ub_r0(nub), "angstrom")
     479        57731 :                      chm_info%ub_k(nub) = cp_unit_to_cp2k(chm_info%ub_k(nub), "kcalmol*angstrom^-2")
     480              :                   END IF
     481        45547 :                   CALL charmm_get_next_line(parser, 1)
     482              :                END DO
     483              :             ELSE
     484              :                EXIT
     485              :             END IF
     486              :          END DO
     487         4400 :          CALL parser_release(parser)
     488              :       END DO
     489              :       !-----------------------------------------------------------------------------
     490              :       !-----------------------------------------------------------------------------
     491              :       ! 3. Read in all the Dihedrals info from the param file here
     492              :       !      Vtorsion = Kphi(1+COS(n(phi)-delta))
     493              :       !      UNITS for Kphi: [(kcal/mol)] to [Eh]
     494              :       !-----------------------------------------------------------------------------
     495          880 :       ntorsion = 0
     496         2640 :       DO ilab = 1, SIZE(thet_section)
     497         1760 :          CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     498         1760 :          label = TRIM(thet_section(ilab))
     499              :          DO
     500         2650 :             CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     501         2650 :             IF (found) THEN
     502          890 :                CALL parser_get_object(parser, string)
     503          890 :                IF (INDEX(string, TRIM(label)) /= 1) CYCLE
     504          880 :                CALL charmm_get_next_line(parser, 1)
     505        52528 :                DO
     506        53408 :                   CALL parser_get_object(parser, string)
     507        53408 :                   CALL uppercase(string)
     508      1108468 :                   IF (ANY(string == avail_section)) EXIT
     509        52528 :                   CALL parser_get_object(parser, string2)
     510        52528 :                   CALL parser_get_object(parser, string3)
     511        52528 :                   CALL parser_get_object(parser, string4)
     512        52528 :                   CALL uppercase(string2)
     513        52528 :                   CALL uppercase(string3)
     514        52528 :                   CALL uppercase(string4)
     515        52528 :                   ntorsion = ntorsion + 1
     516        52528 :                   CALL reallocate(chm_info%torsion_a, 1, ntorsion)
     517        52528 :                   CALL reallocate(chm_info%torsion_b, 1, ntorsion)
     518        52528 :                   CALL reallocate(chm_info%torsion_c, 1, ntorsion)
     519        52528 :                   CALL reallocate(chm_info%torsion_d, 1, ntorsion)
     520        52528 :                   CALL reallocate(chm_info%torsion_k, 1, ntorsion)
     521        52528 :                   CALL reallocate(chm_info%torsion_m, 1, ntorsion)
     522        52528 :                   CALL reallocate(chm_info%torsion_phi0, 1, ntorsion)
     523        52528 :                   chm_info%torsion_a(ntorsion) = string
     524        52528 :                   chm_info%torsion_b(ntorsion) = string2
     525        52528 :                   chm_info%torsion_c(ntorsion) = string3
     526        52528 :                   chm_info%torsion_d(ntorsion) = string4
     527        52528 :                   CALL parser_get_object(parser, chm_info%torsion_k(ntorsion))
     528        52528 :                   CALL parser_get_object(parser, chm_info%torsion_m(ntorsion))
     529        52528 :                   CALL parser_get_object(parser, chm_info%torsion_phi0(ntorsion))
     530        54922 :                   IF (iw > 0) WRITE (iw, *) "    CHM TORSION ", ntorsion, &
     531         2394 :                      TRIM(chm_info%torsion_a(ntorsion)), " ", &
     532         2394 :                      TRIM(chm_info%torsion_b(ntorsion)), " ", &
     533         2394 :                      TRIM(chm_info%torsion_c(ntorsion)), " ", &
     534         2394 :                      TRIM(chm_info%torsion_d(ntorsion)), " ", &
     535         2394 :                      chm_info%torsion_k(ntorsion), &
     536         2394 :                      chm_info%torsion_m(ntorsion), &
     537         4788 :                      chm_info%torsion_phi0(ntorsion)
     538              :                   ! Do some units conversion into internal atomic units
     539              :                   chm_info%torsion_phi0(ntorsion) = cp_unit_to_cp2k(chm_info%torsion_phi0(ntorsion), &
     540        52528 :                                                                     "deg")
     541        52528 :                   chm_info%torsion_k(ntorsion) = cp_unit_to_cp2k(chm_info%torsion_k(ntorsion), "kcalmol")
     542        53418 :                   CALL charmm_get_next_line(parser, 1)
     543              :                END DO
     544              :             ELSE
     545              :                EXIT
     546              :             END IF
     547              :          END DO
     548         4400 :          CALL parser_release(parser)
     549              :       END DO
     550              :       !-----------------------------------------------------------------------------
     551              :       !-----------------------------------------------------------------------------
     552              :       ! 4. Read in all the Improper info from the param file here
     553              :       !      Vimpr = Kpsi(psi-psi0)^2
     554              :       !      UNITS for Kpsi: [(kcal/mol)/(rad^2)] to [Eh/(rad^2)]
     555              :       !-----------------------------------------------------------------------------
     556          880 :       nimpr = 0
     557         2640 :       DO ilab = 1, SIZE(impr_section)
     558         1760 :          CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     559         1760 :          label = TRIM(impr_section(ilab))
     560              :          DO
     561         2640 :             CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     562         2640 :             IF (found) THEN
     563          880 :                CALL parser_get_object(parser, string)
     564          880 :                IF (INDEX(string, TRIM(label)) /= 1) CYCLE
     565          880 :                CALL charmm_get_next_line(parser, 1)
     566         4156 :                DO
     567         5036 :                   CALL parser_get_object(parser, string)
     568         5036 :                   CALL uppercase(string)
     569        94316 :                   IF (ANY(string == avail_section)) EXIT
     570         4156 :                   CALL parser_get_object(parser, string2)
     571         4156 :                   CALL parser_get_object(parser, string3)
     572         4156 :                   CALL parser_get_object(parser, string4)
     573         4156 :                   CALL uppercase(string2)
     574         4156 :                   CALL uppercase(string3)
     575         4156 :                   CALL uppercase(string4)
     576         4156 :                   nimpr = nimpr + 1
     577         4156 :                   CALL reallocate(chm_info%impr_a, 1, nimpr)
     578         4156 :                   CALL reallocate(chm_info%impr_b, 1, nimpr)
     579         4156 :                   CALL reallocate(chm_info%impr_c, 1, nimpr)
     580         4156 :                   CALL reallocate(chm_info%impr_d, 1, nimpr)
     581         4156 :                   CALL reallocate(chm_info%impr_k, 1, nimpr)
     582         4156 :                   CALL reallocate(chm_info%impr_phi0, 1, nimpr)
     583         4156 :                   chm_info%impr_a(nimpr) = string
     584         4156 :                   chm_info%impr_b(nimpr) = string2
     585         4156 :                   chm_info%impr_c(nimpr) = string3
     586         4156 :                   chm_info%impr_d(nimpr) = string4
     587         4156 :                   CALL parser_get_object(parser, chm_info%impr_k(nimpr))
     588         4156 :                   CALL parser_get_object(parser, dummy)
     589         4156 :                   CALL parser_get_object(parser, chm_info%impr_phi0(nimpr))
     590         4262 :                   IF (iw > 0) WRITE (iw, *) "    CHM IMPROPERS ", nimpr, &
     591          106 :                      TRIM(chm_info%impr_a(nimpr)), " ", &
     592          106 :                      TRIM(chm_info%impr_b(nimpr)), " ", &
     593          106 :                      TRIM(chm_info%impr_c(nimpr)), " ", &
     594          106 :                      TRIM(chm_info%impr_d(nimpr)), " ", &
     595          106 :                      chm_info%impr_k(nimpr), &
     596          212 :                      chm_info%impr_phi0(nimpr)
     597              :                   ! Do some units conversion into internal atomic units
     598         4156 :                   chm_info%impr_phi0(nimpr) = cp_unit_to_cp2k(chm_info%impr_phi0(nimpr), "deg")
     599         4156 :                   chm_info%impr_k(nimpr) = cp_unit_to_cp2k(chm_info%impr_k(nimpr), "kcalmol")
     600         5036 :                   CALL charmm_get_next_line(parser, 1)
     601              :                END DO
     602              :             ELSE
     603              :                EXIT
     604              :             END IF
     605              :          END DO
     606         4400 :          CALL parser_release(parser)
     607              :       END DO
     608              :       !-----------------------------------------------------------------------------
     609              :       !-----------------------------------------------------------------------------
     610              :       ! 5. Read in all the Nonbonded info from the param file here
     611              :       !-----------------------------------------------------------------------------
     612          880 :       nnonbond = 0
     613          880 :       nonfo = 0
     614         2640 :       DO ilab = 1, SIZE(nbon_section)
     615         1760 :          CALL parser_create(parser, ff_type%ff_file_name, para_env=para_env)
     616         1760 :          label = TRIM(nbon_section(ilab))
     617              :          DO
     618         3520 :             CALL parser_search_string(parser, label, .TRUE., found, begin_line=.TRUE.)
     619         3520 :             IF (found) THEN
     620         1760 :                CALL parser_get_object(parser, string)
     621         1760 :                IF (INDEX(string, TRIM(label)) /= 1) CYCLE
     622          880 :                CALL charmm_get_next_line(parser, 1)
     623              :                DO
     624        12720 :                   CALL parser_get_object(parser, string)
     625        12720 :                   CALL uppercase(string)
     626       260050 :                   IF (ANY(string == avail_section)) EXIT
     627        11840 :                   nnonbond = nnonbond + 1
     628        11840 :                   CALL reallocate(chm_info%nonbond_a, 1, nnonbond)
     629        11840 :                   CALL reallocate(chm_info%nonbond_eps, 1, nnonbond)
     630        11840 :                   CALL reallocate(chm_info%nonbond_rmin2, 1, nnonbond)
     631        11840 :                   chm_info%nonbond_a(nnonbond) = string
     632        11840 :                   CALL parser_get_object(parser, chm_info%nonbond_eps(nnonbond))
     633        11840 :                   CALL parser_get_object(parser, chm_info%nonbond_eps(nnonbond))
     634        11840 :                   CALL parser_get_object(parser, chm_info%nonbond_rmin2(nnonbond))
     635        12741 :                   IF (iw > 0) WRITE (iw, *) "    CHM NONBOND ", nnonbond, &
     636          901 :                      TRIM(chm_info%nonbond_a(nnonbond)), " ", &
     637          901 :                      chm_info%nonbond_eps(nnonbond), &
     638         1802 :                      chm_info%nonbond_rmin2(nnonbond)
     639              :                   chm_info%nonbond_rmin2(nnonbond) = cp_unit_to_cp2k(chm_info%nonbond_rmin2(nnonbond), &
     640        11840 :                                                                      "angstrom")
     641              :                   chm_info%nonbond_eps(nnonbond) = cp_unit_to_cp2k(chm_info%nonbond_eps(nnonbond), &
     642        11840 :                                                                    "kcalmol")
     643        11840 :                   IF (parser_test_next_token(parser) == "FLT") THEN
     644         2198 :                      nonfo = nonfo + 1
     645         2198 :                      CALL reallocate(chm_info%nonbond_a_14, 1, nonfo)
     646         2198 :                      CALL reallocate(chm_info%nonbond_eps_14, 1, nonfo)
     647         2198 :                      CALL reallocate(chm_info%nonbond_rmin2_14, 1, nonfo)
     648         2198 :                      chm_info%nonbond_a_14(nonfo) = chm_info%nonbond_a(nnonbond)
     649         2198 :                      CALL parser_get_object(parser, chm_info%nonbond_eps_14(nonfo))
     650         2198 :                      CALL parser_get_object(parser, chm_info%nonbond_eps_14(nonfo))
     651         2198 :                      CALL parser_get_object(parser, chm_info%nonbond_rmin2_14(nonfo))
     652         2242 :                      IF (iw > 0) WRITE (iw, *) "    CHM ONFO ", nonfo, &
     653           44 :                         TRIM(chm_info%nonbond_a_14(nonfo)), " ", &
     654           44 :                         chm_info%nonbond_eps_14(nonfo), &
     655           88 :                         chm_info%nonbond_rmin2_14(nonfo)
     656              :                      chm_info%nonbond_rmin2_14(nonfo) = cp_unit_to_cp2k(chm_info%nonbond_rmin2_14(nonfo), &
     657         2198 :                                                                         "angstrom")
     658              :                      chm_info%nonbond_eps_14(nonfo) = cp_unit_to_cp2k(chm_info%nonbond_eps_14(nonfo), &
     659        14038 :                                                                       "kcalmol")
     660              :                   END IF
     661        13600 :                   CALL charmm_get_next_line(parser, 1)
     662              :                END DO
     663              :             ELSE
     664              :                EXIT
     665              :             END IF
     666              :          END DO
     667         4400 :          CALL parser_release(parser)
     668              :       END DO
     669              :       CALL cp_print_key_finished_output(iw, logger, mm_section, &
     670          880 :                                         "PRINT%FF_INFO")
     671          880 :       CALL timestop(handle)
     672              : 
     673         2640 :    END SUBROUTINE read_force_field_charmm
     674              : 
     675              : ! **************************************************************************************************
     676              : !> \brief Reads the AMBER force_field
     677              : !> \param ff_type ...
     678              : !> \param para_env ...
     679              : !> \param mm_section ...
     680              : !> \param particle_set ...
     681              : !> \author Teodoro Laino [tlaino, teodoro.laino-AT-gmail.com] - 11.2008
     682              : ! **************************************************************************************************
     683           14 :    SUBROUTINE read_force_field_amber(ff_type, para_env, mm_section, particle_set)
     684              : 
     685              :       TYPE(force_field_type), INTENT(INOUT)              :: ff_type
     686              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     687              :       TYPE(section_vals_type), POINTER                   :: mm_section
     688              :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     689              : 
     690              :       CHARACTER(len=*), PARAMETER :: routineN = 'read_force_field_amber'
     691              : 
     692              :       INTEGER                                            :: handle, i, iw
     693              :       TYPE(amber_info_type), POINTER                     :: amb_info
     694              :       TYPE(cp_logger_type), POINTER                      :: logger
     695              : 
     696           14 :       CALL timeset(routineN, handle)
     697           14 :       NULLIFY (logger)
     698           14 :       logger => cp_get_default_logger()
     699              :       iw = cp_print_key_unit_nr(logger, mm_section, "PRINT%FF_INFO", &
     700           14 :                                 extension=".mmLog")
     701              : 
     702           14 :       amb_info => ff_type%amb_info
     703              : 
     704              :       ! Read the Amber topology file to gather the forcefield information
     705              :       CALL rdparm_amber_8(ff_type%ff_file_name, iw, para_env, do_connectivity=.FALSE., &
     706           14 :                           do_forcefield=.TRUE., particle_set=particle_set, amb_info=amb_info)
     707              : 
     708              :       !-----------------------------------------------------------------------------
     709              :       ! 1. Converts all the Bonds info from the param file here
     710              :       !      Vbond = Kb(b-b0)^2
     711              :       !      UNITS for Kb: [(kcal/mol)/(A^2)] to [Eh/(AU^2)]
     712              :       !-----------------------------------------------------------------------------
     713         1738 :       DO i = 1, SIZE(amb_info%bond_a)
     714         1737 :          IF (iw > 0) WRITE (iw, *) "    AMB BOND ", i, &
     715           13 :             TRIM(amb_info%bond_a(i)), " ", &
     716           13 :             TRIM(amb_info%bond_b(i)), " ", &
     717           13 :             amb_info%bond_k(i), &
     718           26 :             amb_info%bond_r0(i)
     719              : 
     720              :          ! Do some units conversion into internal atomic units
     721         1724 :          amb_info%bond_r0(i) = cp_unit_to_cp2k(amb_info%bond_r0(i), "angstrom")
     722         1738 :          amb_info%bond_k(i) = cp_unit_to_cp2k(amb_info%bond_k(i), "kcalmol*angstrom^-2")
     723              :       END DO
     724              : 
     725              :       !-----------------------------------------------------------------------------
     726              :       ! 2. Converts all the Bends info from the param file here
     727              :       !      Vangle = Ktheta(theta-theta0)^2
     728              :       !      UNITS for Ktheta: [(kcal/mol)/(rad^2)] to [Eh/(rad^2)]
     729              :       !      FACTOR of "2" rolled into Ktheta
     730              :       !      Vub = Kub(S-S0)^2
     731              :       !      UNITS for Kub: [(kcal/mol)/(A^2)] to [Eh/(AU^2)]
     732              :       !-----------------------------------------------------------------------------
     733         3650 :       DO i = 1, SIZE(amb_info%bend_a)
     734         3658 :          IF (iw > 0) WRITE (iw, *) "    AMB BEND ", i, &
     735           22 :             TRIM(amb_info%bend_a(i)), " ", &
     736           22 :             TRIM(amb_info%bend_b(i)), " ", &
     737           22 :             TRIM(amb_info%bend_c(i)), " ", &
     738           22 :             amb_info%bend_k(i), &
     739           44 :             amb_info%bend_theta0(i)
     740              : 
     741              :          ! Do some units conversion into internal atomic units
     742         3636 :          amb_info%bend_theta0(i) = cp_unit_to_cp2k(amb_info%bend_theta0(i), "rad")
     743         3650 :          amb_info%bend_k(i) = cp_unit_to_cp2k(amb_info%bend_k(i), "kcalmol*rad^-2")
     744              :       END DO
     745              : 
     746              :       !-----------------------------------------------------------------------------
     747              :       ! 3. Converts all the Dihedrals info from the param file here
     748              :       !      Vtorsion = Kphi(1+COS(n(phi)-delta))
     749              :       !      UNITS for Kphi: [(kcal/mol)] to [Eh]
     750              :       !-----------------------------------------------------------------------------
     751        10096 :       DO i = 1, SIZE(amb_info%torsion_a)
     752        10121 :          IF (iw > 0) WRITE (iw, *) "    AMB TORSION ", i, &
     753           39 :             TRIM(amb_info%torsion_a(i)), " ", &
     754           39 :             TRIM(amb_info%torsion_b(i)), " ", &
     755           39 :             TRIM(amb_info%torsion_c(i)), " ", &
     756           39 :             TRIM(amb_info%torsion_d(i)), " ", &
     757           39 :             amb_info%torsion_k(i), &
     758           39 :             amb_info%torsion_m(i), &
     759           78 :             amb_info%torsion_phi0(i)
     760              : 
     761              :          ! Do some units conversion into internal atomic units
     762        10082 :          amb_info%torsion_phi0(i) = cp_unit_to_cp2k(amb_info%torsion_phi0(i), "rad")
     763        10096 :          amb_info%torsion_k(i) = cp_unit_to_cp2k(amb_info%torsion_k(i), "kcalmol")
     764              :       END DO
     765              : 
     766              :       ! Do some units conversion into internal atomic units
     767           14 :       IF (ASSOCIATED(amb_info%raw_torsion_phi0)) THEN
     768          334 :          DO i = 1, SIZE(amb_info%raw_torsion_k)
     769          322 :             amb_info%raw_torsion_phi0(i) = cp_unit_to_cp2k(amb_info%raw_torsion_phi0(i), "rad")
     770          334 :             amb_info%raw_torsion_k(i) = cp_unit_to_cp2k(amb_info%raw_torsion_k(i), "kcalmol")
     771              :          END DO
     772              :       END IF
     773              : 
     774              :       !-----------------------------------------------------------------------------
     775              :       ! 4. Converts all the Nonbonded info from the param file here
     776              :       !-----------------------------------------------------------------------------
     777         1474 :       DO i = 1, SIZE(amb_info%nonbond_eps)
     778         1472 :          IF (iw > 0) WRITE (iw, *) "    AMB NONBOND ", i, &
     779           12 :             TRIM(amb_info%nonbond_a(i)), " ", &
     780           12 :             amb_info%nonbond_eps(i), &
     781           24 :             amb_info%nonbond_rmin2(i)
     782              : 
     783              :          ! Do some units conversion into internal atomic units
     784         1460 :          amb_info%nonbond_rmin2(i) = cp_unit_to_cp2k(amb_info%nonbond_rmin2(i), "angstrom")
     785         1474 :          amb_info%nonbond_eps(i) = cp_unit_to_cp2k(amb_info%nonbond_eps(i), "kcalmol")
     786              :       END DO
     787           14 :       CALL cp_print_key_finished_output(iw, logger, mm_section, "PRINT%FF_INFO")
     788           14 :       CALL timestop(handle)
     789           14 :    END SUBROUTINE read_force_field_amber
     790              : 
     791              : ! **************************************************************************************************
     792              : !> \brief This function is simply a wrap to the parser_get_next_line..
     793              : !>      Comments: This routine would not be necessary if the continuation
     794              : !>                char for CHARMM would not be the "-".. How can you choose this
     795              : !>                character in a file of numbers as a continuation char????
     796              : !>                This sounds simply crazy....
     797              : !> \param parser ...
     798              : !> \param nline ...
     799              : !> \author Teodoro Laino - Zurich University - 06.2007
     800              : ! **************************************************************************************************
     801       137459 :    SUBROUTINE charmm_get_next_line(parser, nline)
     802              :       TYPE(cp_parser_type), INTENT(INOUT)                :: parser
     803              :       INTEGER, INTENT(IN)                                :: nline
     804              : 
     805              :       CHARACTER(LEN=1), PARAMETER                        :: continuation_char = "-"
     806              : 
     807              :       INTEGER                                            :: i, len_line
     808              : 
     809       274918 :       DO i = 1, nline
     810       137459 :          len_line = LEN_TRIM(parser%input_line)
     811       137469 :          DO WHILE (parser%input_line(len_line:len_line) == continuation_char)
     812           10 :             CALL parser_get_next_line(parser, 1)
     813           10 :             len_line = LEN_TRIM(parser%input_line)
     814              :          END DO
     815       274918 :          CALL parser_get_next_line(parser, 1)
     816              :       END DO
     817              : 
     818       137459 :    END SUBROUTINE charmm_get_next_line
     819              : 
     820              : END MODULE force_fields_ext
        

Generated by: LCOV version 2.0-1