LCOV - code coverage report
Current view: top level - src/subsys - colvar_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:20fe009) Lines: 702 1018 69.0 %
Date: 2022-07-05 19:56:53 Functions: 13 44 29.5 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2022 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief Initialize the collective variables types
      10             : !> \par History
      11             : !>      5.2004 created [fawzi and alessandro]
      12             : !>      1.2009 Fabio Sterpone : added the population COLVAR
      13             : !> \author Teodoro Laino
      14             : ! **************************************************************************************************
      15             : MODULE colvar_types
      16             : 
      17             :    USE input_section_types,             ONLY: section_vals_type
      18             :    USE kinds,                           ONLY: default_path_length,&
      19             :                                               default_string_length,&
      20             :                                               dp
      21             :    USE particle_types,                  ONLY: particle_type
      22             : #include "../base/base_uses.f90"
      23             : 
      24             :    IMPLICIT NONE
      25             : 
      26             :    PRIVATE
      27             : 
      28             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'colvar_types'
      29             : 
      30             :    INTEGER, PARAMETER, PUBLIC               :: plane_def_atoms = 0, &
      31             :                                                plane_def_vec = 1
      32             : 
      33             :    INTEGER, PARAMETER, PUBLIC               :: do_clv_geo_center = 0, &
      34             :                                                do_clv_fix_point = 1, &
      35             :                                                do_clv_xyz = 0, &
      36             :                                                do_clv_x = 1, &
      37             :                                                do_clv_y = 2, &
      38             :                                                do_clv_z = 3, &
      39             :                                                do_clv_xy = 4, &
      40             :                                                do_clv_xz = 5, &
      41             :                                                do_clv_yz = 6
      42             :    PUBLIC :: colvar_type, &
      43             :              colvar_p_type, &
      44             :              colvar_p_reallocate, &
      45             :              colvar_p_release, &
      46             :              colvar_create, &
      47             :              colvar_clone, &
      48             :              colvar_setup, &
      49             :              colvar_release, &
      50             :              colvar_counters, &
      51             :              eval_point_der, &
      52             :              eval_point_pos, &
      53             :              eval_point_mass, &
      54             :              diff_colvar
      55             : 
      56             :    INTEGER, PARAMETER, PUBLIC :: no_colvar_id = -2, &
      57             :                                  dist_colvar_id = 1, &
      58             :                                  coord_colvar_id = 2, &
      59             :                                  torsion_colvar_id = 3, &
      60             :                                  angle_colvar_id = 4, &
      61             :                                  plane_distance_colvar_id = 5, &
      62             :                                  rotation_colvar_id = 6, &
      63             :                                  dfunct_colvar_id = 7, &
      64             :                                  qparm_colvar_id = 8, &
      65             :                                  hydronium_shell_colvar_id = 9, &
      66             :                                  reaction_path_colvar_id = 10, &
      67             :                                  combine_colvar_id = 11, &
      68             :                                  population_colvar_id = 12, &
      69             :                                  plane_plane_angle_colvar_id = 13, &
      70             :                                  gyration_colvar_id = 14, &
      71             :                                  rmsd_colvar_id = 15, &
      72             :                                  distance_from_path_colvar_id = 16, &
      73             :                                  xyz_diag_colvar_id = 17, &
      74             :                                  xyz_outerdiag_colvar_id = 18, &
      75             :                                  u_colvar_id = 19, &
      76             :                                  Wc_colvar_id = 20, &
      77             :                                  hbp_colvar_id = 21, &
      78             :                                  ring_puckering_colvar_id = 22, &
      79             :                                  mindist_colvar_id = 23, &
      80             :                                  acid_hyd_dist_colvar_id = 24, &
      81             :                                  acid_hyd_shell_colvar_id = 25, &
      82             :                                  hydronium_dist_colvar_id = 26
      83             : 
      84             : ! **************************************************************************************************
      85             : !> \brief parameters for the distance collective variable
      86             : !> \param i_at ,j_at: indexes of the two atoms between which you calculate
      87             : !>        the distance
      88             : !> \author alessandro laio and fawzi mohamed
      89             : ! **************************************************************************************************
      90             :    TYPE dist_colvar_type
      91             :       INTEGER       :: i_at, j_at, axis_id
      92             :    END TYPE dist_colvar_type
      93             : 
      94             : ! **************************************************************************************************
      95             :    TYPE coord_colvar_type
      96             :       LOGICAL                    :: do_chain, use_kinds_from, use_kinds_to, &
      97             :                                     use_kinds_to_b
      98             :       INTEGER                         :: n_atoms_to, &
      99             :                                          n_atoms_from, &
     100             :                                          nncrd, &
     101             :                                          ndcrd, &
     102             :                                          n_atoms_to_b, &
     103             :                                          nncrd_b, &
     104             :                                          ndcrd_b
     105             :       INTEGER, POINTER, DIMENSION(:) :: i_at_from, &
     106             :                                         i_at_to, &
     107             :                                         i_at_to_b
     108             :       CHARACTER(LEN=default_string_length), DIMENSION(:), POINTER :: c_kinds_from, &
     109             :                                                                      c_kinds_to, &
     110             :                                                                      c_kinds_to_b
     111             :       REAL(KIND=dp)                   :: r_0, r_0_b
     112             :    END TYPE coord_colvar_type
     113             : 
     114             : ! **************************************************************************************************
     115             :    TYPE population_colvar_type
     116             :       LOGICAL                         :: use_kinds_from, use_kinds_to
     117             :       INTEGER                         :: n_atoms_to, &
     118             :                                          n_atoms_from, &
     119             :                                          nncrd, &
     120             :                                          ndcrd, &
     121             :                                          n0
     122             :       INTEGER, POINTER, DIMENSION(:) :: i_at_from, &
     123             :                                         i_at_to
     124             :       CHARACTER(LEN=default_string_length), DIMENSION(:), POINTER :: c_kinds_from, &
     125             :                                                                      c_kinds_to
     126             :       REAL(KIND=dp)                   :: r_0, sigma
     127             :    END TYPE population_colvar_type
     128             : 
     129             : ! **************************************************************************************************
     130             :    TYPE gyration_colvar_type
     131             :       LOGICAL                         :: use_kinds
     132             :       INTEGER                         :: n_atoms
     133             :       INTEGER, POINTER, DIMENSION(:) :: i_at
     134             :       CHARACTER(LEN=default_string_length), DIMENSION(:), POINTER :: c_kinds
     135             :    END TYPE gyration_colvar_type
     136             : 
     137             : ! **************************************************************************************************
     138             :    TYPE torsion_colvar_type
     139             :       REAL(KIND=dp)                   :: o0
     140             :       INTEGER, DIMENSION(4)          :: i_at_tors
     141             :    END TYPE torsion_colvar_type
     142             : 
     143             : ! **************************************************************************************************
     144             :    TYPE plane_distance_colvar_type
     145             :       LOGICAL               :: use_pbc
     146             :       INTEGER, DIMENSION(3) :: plane
     147             :       INTEGER               :: point
     148             :    END TYPE plane_distance_colvar_type
     149             : 
     150             : ! **************************************************************************************************
     151             :    TYPE plane_def_type
     152             :       INTEGER                     :: type_of_def
     153             :       INTEGER, DIMENSION(3)       :: points
     154             :       REAL(KIND=dp), DIMENSION(3) :: normal_vec
     155             :    END TYPE plane_def_type
     156             : 
     157             :    TYPE plane_plane_angle_colvar_type
     158             :       TYPE(plane_def_type)        :: plane1, plane2
     159             :    END TYPE plane_plane_angle_colvar_type
     160             : 
     161             : ! **************************************************************************************************
     162             :    TYPE angle_colvar_type
     163             :       INTEGER, DIMENSION(3) :: i_at_angle
     164             :    END TYPE angle_colvar_type
     165             : 
     166             : ! **************************************************************************************************
     167             :    TYPE rotation_colvar_type
     168             :       INTEGER :: i_at1_bond1, &
     169             :                  i_at2_bond1, &
     170             :                  i_at1_bond2, &
     171             :                  i_at2_bond2
     172             :    END TYPE rotation_colvar_type
     173             : 
     174             : ! **************************************************************************************************
     175             :    TYPE dfunct_colvar_type
     176             :       INTEGER, DIMENSION(4)         :: i_at_dfunct
     177             :       LOGICAL                       :: use_pbc
     178             :       REAL(KIND=dp)                 :: coeff
     179             :    END TYPE dfunct_colvar_type
     180             : 
     181             : ! **************************************************************************************************
     182             :    TYPE qparm_colvar_type
     183             :       INTEGER                         :: l
     184             :       INTEGER                         :: n_atoms_to, &
     185             :                                          n_atoms_from
     186             :       INTEGER, POINTER, DIMENSION(:) :: i_at_from, &
     187             :                                         i_at_to
     188             :       REAL(KIND=dp)                   :: rcut, rstart
     189             :       LOGICAL                         :: include_images
     190             :    END TYPE qparm_colvar_type
     191             : 
     192             : ! **************************************************************************************************
     193             :    TYPE hydronium_shell_colvar_type
     194             :       INTEGER                         :: n_oxygens, &
     195             :                                          n_hydrogens, &
     196             :                                          poh, qoh, poo, qoo, &
     197             :                                          pm, qm
     198             :       INTEGER, POINTER, DIMENSION(:)  :: i_oxygens, &
     199             :                                          i_hydrogens
     200             :       REAL(KIND=dp)                   :: roo, roh, lambda, nh
     201             :    END TYPE hydronium_shell_colvar_type
     202             : 
     203             : ! **************************************************************************************************
     204             :    TYPE hydronium_dist_colvar_type
     205             :       INTEGER                         :: n_oxygens, &
     206             :                                          n_hydrogens, &
     207             :                                          poh, qoh, &
     208             :                                          pf, qf, pm, qm
     209             :       INTEGER, POINTER, DIMENSION(:)  :: i_oxygens, &
     210             :                                          i_hydrogens
     211             :       REAL(KIND=dp)                   :: roh, lambda, nh, nn
     212             :    END TYPE hydronium_dist_colvar_type
     213             : 
     214             : ! **************************************************************************************************
     215             :    TYPE acid_hyd_dist_colvar_type
     216             :       INTEGER                         :: n_oxygens_water, &
     217             :                                          n_oxygens_acid, &
     218             :                                          n_hydrogens, &
     219             :                                          pwoh, qwoh, paoh, qaoh, pcut, qcut
     220             :       INTEGER, POINTER, DIMENSION(:)  :: i_oxygens_water, i_oxygens_acid, &
     221             :                                          i_hydrogens
     222             :       REAL(KIND=dp)                   :: rwoh, raoh, lambda, nc
     223             :    END TYPE acid_hyd_dist_colvar_type
     224             : 
     225             : ! **************************************************************************************************
     226             :    TYPE acid_hyd_shell_colvar_type
     227             :       INTEGER                         :: n_oxygens_water, &
     228             :                                          n_oxygens_acid, &
     229             :                                          n_hydrogens, &
     230             :                                          pwoh, qwoh, paoh, qaoh, &
     231             :                                          poo, qoo, pcut, qcut, pm, qm
     232             :       INTEGER, POINTER, DIMENSION(:)  :: i_oxygens_water, i_oxygens_acid, &
     233             :                                          i_hydrogens
     234             :       REAL(KIND=dp)                   :: rwoh, raoh, roo, lambda, nc, nh
     235             :    END TYPE acid_hyd_shell_colvar_type
     236             : 
     237             : ! **************************************************************************************************
     238             :    TYPE reaction_path_colvar_type
     239             :       INTEGER                                  :: type_id
     240             :       INTEGER                                  :: n_components, nr_frames, subset
     241             :       INTEGER, DIMENSION(2)                     :: function_bounds
     242             :       INTEGER, POINTER, DIMENSION(:)          :: i_rmsd
     243             :       LOGICAL                                  :: align_frames, dist_rmsd, rmsd
     244             :       REAL(KIND=dp), DIMENSION(:, :), POINTER  :: f_vals
     245             :       REAL(KIND=dp), DIMENSION(:, :), POINTER   :: r_ref
     246             :       REAL(KIND=dp)                            :: lambda
     247             :       REAL(KIND=dp)                            :: step_size
     248             :       TYPE(colvar_p_type), POINTER, DIMENSION(:) :: colvar_p
     249             :    END TYPE reaction_path_colvar_type
     250             : 
     251             : ! **************************************************************************************************
     252             :    TYPE combine_colvar_type
     253             :       INTEGER                                  :: type_id
     254             :       TYPE(colvar_p_type), POINTER, DIMENSION(:) :: colvar_p
     255             :       REAL(KIND=dp)                            :: lerr, dx
     256             :       CHARACTER(LEN=default_path_length)       :: FUNCTION
     257             :       CHARACTER(LEN=default_string_length), &
     258             :          DIMENSION(:), POINTER               :: c_parameters, variables
     259             :       REAL(KIND=dp), DIMENSION(:), POINTER     :: v_parameters
     260             :    END TYPE combine_colvar_type
     261             : ! **************************************************************************************************
     262             :    TYPE rmsd_colvar_type
     263             :       INTEGER                                  :: n_atoms, nr_frames, subset
     264             :       INTEGER, POINTER, DIMENSION(:)          :: i_rmsd
     265             :       LOGICAL                                  :: align_frames
     266             :       REAL(KIND=dp), DIMENSION(:), POINTER     :: weights
     267             :       REAL(KIND=dp), DIMENSION(:, :), POINTER   :: r_ref
     268             :    END TYPE rmsd_colvar_type
     269             : 
     270             : ! **************************************************************************************************
     271             :    TYPE point_type
     272             :       INTEGER :: type_id
     273             :       INTEGER, DIMENSION(:), POINTER          :: atoms
     274             :       REAL(KIND=dp), DIMENSION(:), POINTER    :: weights
     275             :       REAL(KIND=dp), DIMENSION(3)              :: r
     276             :    END TYPE point_type
     277             : 
     278             : ! **************************************************************************************************
     279             :    TYPE xyz_diag_colvar_type
     280             :       LOGICAL                                  :: use_pbc
     281             :       LOGICAL                                  :: use_absolute_position
     282             :       INTEGER                                  :: i_atom
     283             :       INTEGER                                  :: component
     284             :       REAL(KIND=dp), DIMENSION(3)              :: r0
     285             :    END TYPE xyz_diag_colvar_type
     286             : 
     287             : ! **************************************************************************************************
     288             :    TYPE xyz_outerdiag_colvar_type
     289             :       LOGICAL                                  :: use_pbc
     290             :       INTEGER, DIMENSION(2)                    :: i_atoms
     291             :       INTEGER, DIMENSION(2)                    :: components
     292             :       REAL(KIND=dp), DIMENSION(3, 2)            :: r0
     293             :    END TYPE xyz_outerdiag_colvar_type
     294             : 
     295             : ! **************************************************************************************************
     296             :    TYPE u_colvar_type
     297             :       TYPE(section_vals_type), POINTER         :: mixed_energy_section
     298             :       INTEGER       :: natom
     299             :    END TYPE u_colvar_type
     300             : 
     301             : ! **************************************************************************************************
     302             :    TYPE Wc_colvar_type
     303             :       INTEGER                         :: ids(3) ! first is the Od, second the H, third the Oa
     304             :       REAL(KIND=dp)                   :: ewc
     305             :       REAL(KIND=dp)                   :: rcut
     306             :    END TYPE Wc_colvar_type
     307             : 
     308             : ! **************************************************************************************************
     309             :    TYPE HBP_colvar_type
     310             :       INTEGER                         :: nPoints ! number of the points in the path
     311             :       INTEGER, POINTER                :: ids(:, :) ! first is the Od, second the H,
     312             :       ! third the Oa and contains a row for each intermediate point in the path
     313             :       REAL(KIND=dp), POINTER           :: ewc(:) ! one for each point in the path
     314             :       REAL(KIND=dp)                   :: rcut
     315             :       REAL(KIND=dp)                   :: shift ! shift applied for each term in the collective variable
     316             :    END TYPE HBP_colvar_type
     317             : 
     318             : ! **************************************************************************************************
     319             :    TYPE ring_puckering_colvar_type
     320             :       INTEGER                         :: nring
     321             :       INTEGER, POINTER, DIMENSION(:) :: atoms
     322             :       INTEGER                         :: iq
     323             :    END TYPE ring_puckering_colvar_type
     324             : 
     325             : ! **************************************************************************************************
     326             :    TYPE mindist_colvar_type
     327             :       LOGICAL                    :: use_kinds_from, use_kinds_to
     328             :       INTEGER                         :: n_coord_to, &
     329             :                                          n_coord_from, &
     330             :                                          n_dist_from, &
     331             :                                          p_exp, &
     332             :                                          q_exp
     333             :       INTEGER, POINTER, DIMENSION(:) :: i_coord_from, &
     334             :                                         i_coord_to, &
     335             :                                         i_dist_from
     336             :       CHARACTER(LEN=default_string_length), DIMENSION(:), POINTER :: k_coord_from, &
     337             :                                                                      k_coord_to
     338             :       REAL(KIND=dp)                   :: lambda, r_cut
     339             :    END TYPE mindist_colvar_type
     340             : 
     341             : ! **************************************************************************************************
     342             : !> \brief parameters for a collective variable
     343             : !> \author alessandro laio and fawzi mohamed
     344             : ! **************************************************************************************************
     345             :    TYPE colvar_type
     346             :       INTEGER                                     :: type_id
     347             :       LOGICAL                                     :: use_points
     348             :       REAL(kind=dp)                               :: ss ! Value of the colvar
     349             :       REAL(kind=dp), DIMENSION(:, :), POINTER     :: dsdr ! Derivative of colvar (3,:)
     350             :       INTEGER, DIMENSION(:), POINTER              :: i_atom ! Mapping of dsdr
     351             :       INTEGER                                     :: n_atom_s
     352             :       ! Available COLVAR types
     353             :       TYPE(dist_colvar_type), POINTER              :: dist_param
     354             :       TYPE(coord_colvar_type), POINTER             :: coord_param
     355             :       TYPE(population_colvar_type), POINTER        :: population_param
     356             :       TYPE(gyration_colvar_type), POINTER          :: gyration_param
     357             :       TYPE(torsion_colvar_type), POINTER           :: torsion_param
     358             :       TYPE(angle_colvar_type), POINTER             :: angle_param
     359             :       TYPE(plane_distance_colvar_type), POINTER    :: plane_distance_param
     360             :       TYPE(plane_plane_angle_colvar_type), POINTER :: plane_plane_angle_param
     361             :       TYPE(rotation_colvar_type), POINTER          :: rotation_param
     362             :       TYPE(dfunct_colvar_type), POINTER            :: dfunct_param
     363             :       TYPE(qparm_colvar_type), POINTER             :: qparm_param
     364             :       TYPE(hydronium_shell_colvar_type), POINTER   :: hydronium_shell_param
     365             :       TYPE(hydronium_dist_colvar_type), POINTER    :: hydronium_dist_param
     366             :       TYPE(acid_hyd_dist_colvar_type), POINTER     :: acid_hyd_dist_param
     367             :       TYPE(acid_hyd_shell_colvar_type), POINTER    :: acid_hyd_shell_param
     368             :       TYPE(reaction_path_colvar_type), POINTER     :: reaction_path_param
     369             :       TYPE(combine_colvar_type), POINTER           :: combine_cvs_param
     370             :       TYPE(rmsd_colvar_type), POINTER              :: rmsd_param
     371             :       TYPE(xyz_diag_colvar_type), POINTER          :: xyz_diag_param
     372             :       TYPE(xyz_outerdiag_colvar_type), POINTER     :: xyz_outerdiag_param
     373             :       TYPE(u_colvar_type), POINTER                 :: u_param
     374             :       TYPE(point_type), DIMENSION(:), POINTER      :: points
     375             :       TYPE(Wc_colvar_type), POINTER                :: Wc
     376             :       TYPE(HBP_colvar_type), POINTER               :: HBP
     377             :       TYPE(ring_puckering_colvar_type), POINTER    :: ring_puckering_param
     378             :       TYPE(mindist_colvar_type), POINTER           :: mindist_param
     379             :    END TYPE colvar_type
     380             : 
     381             : ! **************************************************************************************************
     382             :    TYPE colvar_p_type
     383             :       TYPE(colvar_type), POINTER :: colvar
     384             :    END TYPE colvar_p_type
     385             : 
     386             : ! **************************************************************************************************
     387             :    TYPE colvar_counters
     388             :       INTEGER :: ndist
     389             :       INTEGER :: nangle
     390             :       INTEGER :: ntorsion
     391             :       INTEGER :: ncoord
     392             :       INTEGER :: nplane_dist
     393             :       INTEGER :: nplane_angle
     394             :       INTEGER :: nrot
     395             :       INTEGER :: ndfunct
     396             :       INTEGER :: nqparm
     397             :       INTEGER :: nhydronium_shell
     398             :       INTEGER :: nhydronium_dist
     399             :       INTEGER :: nacid_hyd_dist
     400             :       INTEGER :: nacid_hyd_shell
     401             :       INTEGER :: nreactionpath
     402             :       INTEGER :: ncombinecvs
     403             :       INTEGER :: nrestraint
     404             :       INTEGER :: npopulation
     405             :       INTEGER :: ngyration
     406             :       INTEGER :: nrmsd
     407             :       INTEGER :: nxyz_diag
     408             :       INTEGER :: nxyz_outerdiag
     409             :       INTEGER :: ntot
     410             :       INTEGER :: nWc
     411             :       INTEGER :: nHBP
     412             :       INTEGER :: nring_puckering
     413             :    END TYPE colvar_counters
     414             : 
     415             : CONTAINS
     416             : 
     417             : ! **************************************************************************************************
     418             : !> \brief initializes a colvar_param type
     419             : !> \param colvar the colvat to initialize
     420             : !> \param colvar_id ...
     421             : !> \author alessandro laio and fawzi mohamed
     422             : ! **************************************************************************************************
     423        5664 :    SUBROUTINE colvar_create(colvar, colvar_id)
     424             :       TYPE(colvar_type), POINTER                         :: colvar
     425             :       INTEGER, INTENT(in)                                :: colvar_id
     426             : 
     427        5664 :       CPASSERT(.NOT. ASSOCIATED(colvar))
     428        5664 :       ALLOCATE (colvar)
     429             :       ! Nullify all available COLVAR types
     430        5664 :       NULLIFY (colvar%dist_param)
     431        5664 :       NULLIFY (colvar%angle_param)
     432        5664 :       NULLIFY (colvar%torsion_param)
     433        5664 :       NULLIFY (colvar%plane_distance_param)
     434        5664 :       NULLIFY (colvar%plane_plane_angle_param)
     435        5664 :       NULLIFY (colvar%rotation_param)
     436        5664 :       NULLIFY (colvar%dfunct_param)
     437        5664 :       NULLIFY (colvar%coord_param)
     438        5664 :       NULLIFY (colvar%population_param)
     439        5664 :       NULLIFY (colvar%gyration_param)
     440        5664 :       NULLIFY (colvar%qparm_param)
     441        5664 :       NULLIFY (colvar%xyz_diag_param)
     442        5664 :       NULLIFY (colvar%xyz_outerdiag_param)
     443        5664 :       NULLIFY (colvar%u_param)
     444        5664 :       NULLIFY (colvar%hydronium_shell_param)
     445        5664 :       NULLIFY (colvar%hydronium_dist_param)
     446        5664 :       NULLIFY (colvar%acid_hyd_dist_param)
     447        5664 :       NULLIFY (colvar%acid_hyd_shell_param)
     448        5664 :       NULLIFY (colvar%reaction_path_param)
     449        5664 :       NULLIFY (colvar%combine_cvs_param)
     450        5664 :       NULLIFY (colvar%rmsd_param)
     451             :       ! More types to nullify
     452        5664 :       NULLIFY (colvar%points)
     453        5664 :       NULLIFY (colvar%dsdr)
     454        5664 :       NULLIFY (colvar%i_atom)
     455        5664 :       NULLIFY (colvar%Wc)
     456        5664 :       NULLIFY (colvar%ring_puckering_param)
     457        5664 :       NULLIFY (colvar%mindist_param)
     458        5664 :       colvar%type_id = colvar_id
     459        5664 :       colvar%use_points = .FALSE.
     460        4998 :       SELECT CASE (colvar_id)
     461             :       CASE (dist_colvar_id)
     462        4998 :          ALLOCATE (colvar%dist_param)
     463        4998 :          colvar%dist_param%axis_id = do_clv_xyz
     464             :       CASE (coord_colvar_id)
     465          58 :          ALLOCATE (colvar%coord_param)
     466             :       CASE (population_colvar_id)
     467           8 :          ALLOCATE (colvar%population_param)
     468             :       CASE (gyration_colvar_id)
     469           2 :          ALLOCATE (colvar%gyration_param)
     470             :       CASE (angle_colvar_id)
     471         220 :          ALLOCATE (colvar%angle_param)
     472             :       CASE (torsion_colvar_id)
     473         160 :          ALLOCATE (colvar%torsion_param)
     474             :       CASE (plane_distance_colvar_id)
     475          28 :          ALLOCATE (colvar%plane_distance_param)
     476             :       CASE (plane_plane_angle_colvar_id)
     477          16 :          ALLOCATE (colvar%plane_plane_angle_param)
     478             :       CASE (rotation_colvar_id)
     479           2 :          ALLOCATE (colvar%rotation_param)
     480             :       CASE (dfunct_colvar_id)
     481          18 :          ALLOCATE (colvar%dfunct_param)
     482             :       CASE (qparm_colvar_id)
     483           2 :          ALLOCATE (colvar%qparm_param)
     484             :       CASE (xyz_diag_colvar_id)
     485          30 :          ALLOCATE (colvar%xyz_diag_param)
     486             :          ! Initialize r0 with dummy..
     487         120 :          colvar%xyz_diag_param%r0 = HUGE(0.0_dp)
     488             :       CASE (xyz_outerdiag_colvar_id)
     489          30 :          ALLOCATE (colvar%xyz_outerdiag_param)
     490             :          ! Initialize r0 with dummy..
     491         270 :          colvar%xyz_outerdiag_param%r0 = HUGE(0.0_dp)
     492             :       CASE (u_colvar_id)
     493           6 :          ALLOCATE (colvar%u_param)
     494           6 :          NULLIFY (colvar%u_param%mixed_energy_section)
     495             :       CASE (hydronium_shell_colvar_id)
     496           2 :          ALLOCATE (colvar%hydronium_shell_param)
     497             :       CASE (hydronium_dist_colvar_id)
     498           2 :          ALLOCATE (colvar%hydronium_dist_param)
     499             :       CASE (acid_hyd_dist_colvar_id)
     500           2 :          ALLOCATE (colvar%acid_hyd_dist_param)
     501             :       CASE (acid_hyd_shell_colvar_id)
     502           2 :          ALLOCATE (colvar%acid_hyd_shell_param)
     503             :       CASE (reaction_path_colvar_id)
     504          16 :          ALLOCATE (colvar%reaction_path_param)
     505             :       CASE (distance_from_path_colvar_id)
     506           8 :          ALLOCATE (colvar%reaction_path_param)
     507             :       CASE (combine_colvar_id)
     508          16 :          ALLOCATE (colvar%combine_cvs_param)
     509             :       CASE (rmsd_colvar_id)
     510           4 :          ALLOCATE (colvar%rmsd_param)
     511             :       CASE (Wc_colvar_id)
     512           0 :          ALLOCATE (colvar%Wc)
     513             :       CASE (HBP_colvar_id)
     514           2 :          ALLOCATE (colvar%HBP)
     515             :       CASE (ring_puckering_colvar_id)
     516          32 :          ALLOCATE (colvar%ring_puckering_param)
     517             :       CASE (mindist_colvar_id)
     518           0 :          ALLOCATE (colvar%mindist_param)
     519             :       CASE (no_colvar_id)
     520             :          ! Do nothing
     521             :       CASE DEFAULT
     522        5664 :          CPABORT("")
     523             :       END SELECT
     524             : 
     525        5664 :    END SUBROUTINE colvar_create
     526             : 
     527             : ! **************************************************************************************************
     528             : !> \brief Finalize the setup of the collective variable
     529             : !> \param colvar the colvar to initialize
     530             : !> \author Teodoro Laino, [teo] 09.03.2006
     531             : ! **************************************************************************************************
     532        5680 :    SUBROUTINE colvar_setup(colvar)
     533             :       TYPE(colvar_type), INTENT(INOUT)                   :: colvar
     534             : 
     535             :       INTEGER                                            :: i, idum, iend, ii, istart, j, np, stat
     536        5680 :       INTEGER, DIMENSION(:), POINTER                     :: list
     537             : 
     538       10678 :       SELECT CASE (colvar%type_id)
     539             :       CASE (dist_colvar_id)
     540        4998 :          np = 2
     541        4998 :          i = colvar%dist_param%i_at
     542        4998 :          j = colvar%dist_param%j_at
     543             :          ! Number of real atoms involved in the colvar
     544             :          colvar%n_atom_s = COLV_SIZE(colvar, i) + &
     545        4998 :                            COLV_SIZE(colvar, j)
     546             :          ! Create a List of points...
     547        4998 :          ALLOCATE (list(np))
     548        4998 :          list(1) = colvar%dist_param%i_at
     549        4998 :          list(2) = colvar%dist_param%j_at
     550             :       CASE (coord_colvar_id)
     551             :          np = colvar%coord_param%n_atoms_from + colvar%coord_param%n_atoms_to &
     552          64 :               + colvar%coord_param%n_atoms_to_b
     553             :          ! Number of real atoms involved in the colvar
     554          64 :          colvar%n_atom_s = 0
     555         124 :          DO ii = 1, colvar%coord_param%n_atoms_from
     556          60 :             i = colvar%coord_param%i_at_from(ii)
     557         124 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     558             :          END DO
     559         158 :          DO ii = 1, colvar%coord_param%n_atoms_to
     560          94 :             i = colvar%coord_param%i_at_to(ii)
     561         158 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     562             :          END DO
     563          64 :          IF (colvar%coord_param%n_atoms_to_b /= 0) THEN
     564           8 :             DO ii = 1, colvar%coord_param%n_atoms_to_b
     565           4 :                i = colvar%coord_param%i_at_to_b(ii)
     566           8 :                colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     567             :             END DO
     568             :          END IF
     569             :          ! Create a List of points...
     570         186 :          ALLOCATE (list(np))
     571          64 :          idum = 0
     572         124 :          DO ii = 1, colvar%coord_param%n_atoms_from
     573          60 :             idum = idum + 1
     574          60 :             i = colvar%coord_param%i_at_from(ii)
     575         124 :             list(idum) = i
     576             :          END DO
     577         158 :          DO ii = 1, colvar%coord_param%n_atoms_to
     578          94 :             idum = idum + 1
     579          94 :             i = colvar%coord_param%i_at_to(ii)
     580         158 :             list(idum) = i
     581             :          END DO
     582          64 :          IF (colvar%coord_param%n_atoms_to_b /= 0) THEN
     583           8 :             DO ii = 1, colvar%coord_param%n_atoms_to_b
     584           4 :                idum = idum + 1
     585           4 :                i = colvar%coord_param%i_at_to_b(ii)
     586           8 :                list(idum) = i
     587             :             END DO
     588             :          END IF
     589          64 :          CPASSERT(idum == np)
     590             :       CASE (population_colvar_id)
     591          16 :          np = colvar%population_param%n_atoms_from + colvar%population_param%n_atoms_to
     592             :          ! Number of real atoms involved in the colvar
     593          16 :          colvar%n_atom_s = 0
     594          32 :          DO ii = 1, colvar%population_param%n_atoms_from
     595          16 :             i = colvar%population_param%i_at_from(ii)
     596          32 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     597             :          END DO
     598          32 :          DO ii = 1, colvar%population_param%n_atoms_to
     599          16 :             i = colvar%population_param%i_at_to(ii)
     600          32 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     601             :          END DO
     602             :          ! Create a List of points...
     603          48 :          ALLOCATE (list(np))
     604          16 :          idum = 0
     605          32 :          DO ii = 1, colvar%population_param%n_atoms_from
     606          16 :             idum = idum + 1
     607          16 :             i = colvar%population_param%i_at_from(ii)
     608          32 :             list(idum) = i
     609             :          END DO
     610          32 :          DO ii = 1, colvar%population_param%n_atoms_to
     611          16 :             idum = idum + 1
     612          16 :             i = colvar%population_param%i_at_to(ii)
     613          32 :             list(idum) = i
     614             :          END DO
     615          16 :          CPASSERT(idum == np)
     616             :       CASE (gyration_colvar_id)
     617           4 :          np = colvar%gyration_param%n_atoms
     618             :          ! Number of real atoms involved in the colvar
     619           4 :          colvar%n_atom_s = 0
     620          30 :          DO ii = 1, colvar%gyration_param%n_atoms
     621          26 :             i = colvar%gyration_param%i_at(ii)
     622          30 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     623             :          END DO
     624             :          ! Create a List of points...
     625          10 :          ALLOCATE (list(np))
     626           4 :          idum = 0
     627          30 :          DO ii = 1, colvar%gyration_param%n_atoms
     628          26 :             idum = idum + 1
     629          26 :             i = colvar%gyration_param%i_at(ii)
     630          30 :             list(idum) = i
     631             :          END DO
     632           4 :          CPASSERT(idum == np)
     633             :       CASE (angle_colvar_id)
     634         220 :          np = 3
     635             :          ! Number of real atoms involved in the colvar
     636         220 :          colvar%n_atom_s = 0
     637         880 :          DO ii = 1, 3
     638         660 :             i = colvar%angle_param%i_at_angle(ii)
     639         880 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     640             :          END DO
     641             :          ! Create a List of points...
     642         220 :          ALLOCATE (list(np))
     643         220 :          idum = 0
     644         880 :          DO ii = 1, 3
     645         660 :             idum = idum + 1
     646         660 :             i = colvar%angle_param%i_at_angle(ii)
     647         880 :             list(idum) = i
     648             :          END DO
     649         220 :          CPASSERT(idum == np)
     650             :       CASE (torsion_colvar_id)
     651         160 :          np = 4
     652             :          ! Number of real atoms involved in the colvar
     653         160 :          colvar%n_atom_s = 0
     654         800 :          DO ii = 1, 4
     655         640 :             i = colvar%torsion_param%i_at_tors(ii)
     656         800 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     657             :          END DO
     658             :          ! Create a List of points...
     659         160 :          ALLOCATE (list(np))
     660         160 :          idum = 0
     661         800 :          DO ii = 1, 4
     662         640 :             idum = idum + 1
     663         640 :             i = colvar%torsion_param%i_at_tors(ii)
     664         800 :             list(idum) = i
     665             :          END DO
     666         160 :          CPASSERT(idum == np)
     667             :       CASE (plane_distance_colvar_id)
     668          28 :          np = 4
     669             :          ! Number of real atoms involved in the colvar
     670          28 :          colvar%n_atom_s = 0
     671         112 :          DO ii = 1, 3
     672          84 :             i = colvar%plane_distance_param%plane(ii)
     673         112 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     674             :          END DO
     675          28 :          i = colvar%plane_distance_param%point
     676          28 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     677             :          ! Create a List of points...
     678          28 :          ALLOCATE (list(np))
     679          28 :          idum = 0
     680         112 :          DO ii = 1, 3
     681          84 :             idum = idum + 1
     682          84 :             i = colvar%plane_distance_param%plane(ii)
     683         112 :             list(idum) = i
     684             :          END DO
     685          28 :          i = colvar%plane_distance_param%point
     686          28 :          list(4) = i
     687          28 :          idum = idum + 1
     688          28 :          CPASSERT(idum == np)
     689             :       CASE (plane_plane_angle_colvar_id)
     690          16 :          np = 0
     691          16 :          IF (colvar%plane_plane_angle_param%plane1%type_of_def == plane_def_atoms) np = np + 3
     692          16 :          IF (colvar%plane_plane_angle_param%plane2%type_of_def == plane_def_atoms) np = np + 3
     693             :          ! if np is equal to zero this means that this is not a COLLECTIVE variable..
     694          16 :          IF (np == 0) &
     695             :             CALL cp_abort(__LOCATION__, &
     696             :                           "PLANE_PLANE_ANGLE Colvar defined using two normal vectors! This is "// &
     697             :                           "not a COLLECTIVE VARIABLE! One of the two planes must be defined "// &
     698           0 :                           "using atomic positions.")
     699             : 
     700             :          ! Number of real atoms involved in the colvar
     701          16 :          colvar%n_atom_s = 0
     702          16 :          IF (colvar%plane_plane_angle_param%plane1%type_of_def == plane_def_atoms) THEN
     703          64 :             DO ii = 1, 3
     704          48 :                i = colvar%plane_plane_angle_param%plane1%points(ii)
     705          64 :                colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     706             :             END DO
     707             :          END IF
     708          16 :          IF (colvar%plane_plane_angle_param%plane2%type_of_def == plane_def_atoms) THEN
     709          32 :             DO ii = 1, 3
     710          24 :                i = colvar%plane_plane_angle_param%plane2%points(ii)
     711          32 :                colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     712             :             END DO
     713             :          END IF
     714             : 
     715             :          ! Create a List of points...
     716          48 :          ALLOCATE (list(np))
     717          16 :          idum = 0
     718          16 :          IF (colvar%plane_plane_angle_param%plane1%type_of_def == plane_def_atoms) THEN
     719          64 :             DO ii = 1, 3
     720          48 :                idum = idum + 1
     721          48 :                i = colvar%plane_plane_angle_param%plane1%points(ii)
     722          64 :                list(idum) = i
     723             :             END DO
     724             :          END IF
     725          16 :          IF (colvar%plane_plane_angle_param%plane2%type_of_def == plane_def_atoms) THEN
     726          32 :             DO ii = 1, 3
     727          24 :                idum = idum + 1
     728          24 :                i = colvar%plane_plane_angle_param%plane2%points(ii)
     729          32 :                list(idum) = i
     730             :             END DO
     731             :          END IF
     732          16 :          CPASSERT(idum == np)
     733             :       CASE (dfunct_colvar_id)
     734          18 :          np = 4
     735             :          ! Number of real atoms involved in the colvar
     736          18 :          colvar%n_atom_s = 0
     737          90 :          DO ii = 1, 4
     738          72 :             i = colvar%dfunct_param%i_at_dfunct(ii)
     739          90 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     740             :          END DO
     741             :          ! Create a List of points...
     742          18 :          ALLOCATE (list(np))
     743          18 :          idum = 0
     744          90 :          DO ii = 1, 4
     745          72 :             idum = idum + 1
     746          72 :             i = colvar%dfunct_param%i_at_dfunct(ii)
     747          90 :             list(idum) = i
     748             :          END DO
     749          18 :          CPASSERT(idum == np)
     750             :       CASE (rotation_colvar_id)
     751           2 :          np = 4
     752             :          ! Number of real atoms involved in the colvar
     753           2 :          colvar%n_atom_s = 0
     754           2 :          i = colvar%rotation_param%i_at1_bond1
     755           2 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     756           2 :          i = colvar%rotation_param%i_at2_bond1
     757           2 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     758           2 :          i = colvar%rotation_param%i_at1_bond2
     759           2 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     760           2 :          i = colvar%rotation_param%i_at2_bond2
     761           2 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     762             :          ! Create a List of points...
     763           2 :          ALLOCATE (list(np))
     764           2 :          i = colvar%rotation_param%i_at1_bond1
     765           2 :          list(1) = i
     766           2 :          i = colvar%rotation_param%i_at2_bond1
     767           2 :          list(2) = i
     768           2 :          i = colvar%rotation_param%i_at1_bond2
     769           2 :          list(3) = i
     770           2 :          i = colvar%rotation_param%i_at2_bond2
     771           2 :          list(4) = i
     772             :       CASE (qparm_colvar_id)
     773           2 :          np = colvar%qparm_param%n_atoms_from + colvar%qparm_param%n_atoms_to
     774             :          ! Number of real atoms involved in the colvar
     775           2 :          colvar%n_atom_s = 0
     776         218 :          DO ii = 1, colvar%qparm_param%n_atoms_from
     777         216 :             i = colvar%qparm_param%i_at_from(ii)
     778         218 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     779             :          END DO
     780         218 :          DO ii = 1, colvar%qparm_param%n_atoms_to
     781         216 :             i = colvar%qparm_param%i_at_to(ii)
     782         218 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     783             :          END DO
     784             :          ! Create a List of points...
     785           6 :          ALLOCATE (list(np))
     786           2 :          idum = 0
     787         218 :          DO ii = 1, colvar%qparm_param%n_atoms_from
     788         216 :             idum = idum + 1
     789         216 :             i = colvar%qparm_param%i_at_from(ii)
     790         218 :             list(idum) = i
     791             :          END DO
     792         218 :          DO ii = 1, colvar%qparm_param%n_atoms_to
     793         216 :             idum = idum + 1
     794         216 :             i = colvar%qparm_param%i_at_to(ii)
     795         218 :             list(idum) = i
     796             :          END DO
     797           2 :          CPASSERT(idum == np)
     798             :       CASE (hydronium_shell_colvar_id)
     799           2 :          np = colvar%hydronium_shell_param%n_oxygens + colvar%hydronium_shell_param%n_hydrogens
     800           6 :          ALLOCATE (list(np))
     801           2 :          CALL setup_hydronium_colvars(colvar, hydronium_shell_colvar_id, list)
     802             :       CASE (hydronium_dist_colvar_id)
     803           2 :          np = colvar%hydronium_dist_param%n_oxygens + colvar%hydronium_dist_param%n_hydrogens
     804           6 :          ALLOCATE (list(np))
     805           2 :          CALL setup_hydronium_colvars(colvar, hydronium_dist_colvar_id, list)
     806             :       CASE (acid_hyd_dist_colvar_id)
     807             :          np = colvar%acid_hyd_dist_param%n_oxygens_water &
     808             :               + colvar%acid_hyd_dist_param%n_oxygens_acid &
     809           2 :               + colvar%acid_hyd_dist_param%n_hydrogens
     810           6 :          ALLOCATE (list(np))
     811           2 :          CALL setup_acid_hydronium_colvars(colvar, acid_hyd_dist_colvar_id, list)
     812             :       CASE (acid_hyd_shell_colvar_id)
     813             :          np = colvar%acid_hyd_shell_param%n_oxygens_water &
     814             :               + colvar%acid_hyd_shell_param%n_oxygens_acid &
     815           2 :               + colvar%acid_hyd_shell_param%n_hydrogens
     816           6 :          ALLOCATE (list(np))
     817           2 :          CALL setup_acid_hydronium_colvars(colvar, acid_hyd_shell_colvar_id, list)
     818             :       CASE (rmsd_colvar_id)
     819           4 :          np = colvar%rmsd_param%n_atoms
     820             :          ! Number of real atoms involved in the colvar
     821           4 :          colvar%n_atom_s = 0
     822          28 :          DO ii = 1, colvar%rmsd_param%n_atoms
     823          24 :             i = colvar%rmsd_param%i_rmsd(ii)
     824          28 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     825             :          END DO
     826             :          ! Create a List of points...
     827          12 :          ALLOCATE (list(np))
     828           4 :          idum = 0
     829          28 :          DO ii = 1, colvar%rmsd_param%n_atoms
     830          24 :             idum = idum + 1
     831          24 :             i = colvar%rmsd_param%i_rmsd(ii)
     832          28 :             list(idum) = i
     833             :          END DO
     834             :       CASE (reaction_path_colvar_id, distance_from_path_colvar_id)
     835          24 :          colvar%n_atom_s = 0
     836          24 :          IF (colvar%reaction_path_param%dist_rmsd .OR. colvar%reaction_path_param%rmsd) THEN
     837           8 :             colvar%n_atom_s = colvar%reaction_path_param%n_components
     838             :          ELSE
     839          48 :             DO ii = 1, SIZE(colvar%reaction_path_param%colvar_p)
     840          48 :                colvar%n_atom_s = colvar%n_atom_s + colvar%reaction_path_param%colvar_p(ii)%colvar%n_atom_s
     841             :             END DO
     842             :          END IF
     843          72 :          ALLOCATE (list(colvar%n_atom_s))
     844          24 :          idum = 0
     845          24 :          IF (colvar%reaction_path_param%dist_rmsd .OR. colvar%reaction_path_param%rmsd) THEN
     846          80 :             DO ii = 1, SIZE(colvar%reaction_path_param%i_rmsd)
     847          72 :                idum = idum + 1
     848          72 :                i = colvar%reaction_path_param%i_rmsd(ii)
     849          80 :                list(idum) = i
     850             :             END DO
     851             :          ELSE
     852          48 :             DO ii = 1, SIZE(colvar%reaction_path_param%colvar_p)
     853         112 :                DO j = 1, colvar%reaction_path_param%colvar_p(ii)%colvar%n_atom_s
     854          64 :                   idum = idum + 1
     855          96 :                   list(idum) = colvar%reaction_path_param%colvar_p(ii)%colvar%i_atom(j)
     856             :                END DO
     857             :             END DO
     858             :          END IF
     859             :       CASE (xyz_diag_colvar_id)
     860          30 :          np = 1
     861             :          ! Number of real atoms involved in the colvar
     862          30 :          colvar%n_atom_s = 0
     863          30 :          i = colvar%xyz_diag_param%i_atom
     864          30 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     865             :          ! Create a List of points...
     866          30 :          ALLOCATE (list(np))
     867          30 :          i = colvar%xyz_diag_param%i_atom
     868          30 :          list(1) = i
     869             :       CASE (xyz_outerdiag_colvar_id)
     870          30 :          np = 2
     871             :          ! Number of real atoms involved in the colvar
     872          30 :          colvar%n_atom_s = 0
     873          30 :          i = colvar%xyz_outerdiag_param%i_atoms(1)
     874          30 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     875          30 :          i = colvar%xyz_outerdiag_param%i_atoms(2)
     876          30 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     877             :          ! Create a List of points...
     878          30 :          ALLOCATE (list(np))
     879          30 :          i = colvar%xyz_outerdiag_param%i_atoms(1)
     880          30 :          list(1) = i
     881          30 :          i = colvar%xyz_outerdiag_param%i_atoms(2)
     882          30 :          list(2) = i
     883             :       CASE (u_colvar_id)
     884           6 :          np = 1; ALLOCATE (list(np), stat=stat)
     885           6 :          CPASSERT(stat == 0)
     886           6 :          colvar%n_atom_s = np; list(1) = 1
     887             :       CASE (Wc_colvar_id)
     888           0 :          np = 3
     889             :          ! Number of real atoms involved in the colvar
     890           0 :          colvar%n_atom_s = 0
     891           0 :          DO ii = 1, 3
     892           0 :             i = colvar%Wc%ids(ii)
     893           0 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     894             :          END DO
     895             :          ! Create a List of points...
     896           0 :          ALLOCATE (list(np))
     897           0 :          idum = 0
     898           0 :          DO ii = 1, 3
     899           0 :             idum = idum + 1
     900           0 :             i = colvar%Wc%ids(ii)
     901           0 :             list(idum) = i
     902             :          END DO
     903           0 :          CPASSERT(idum == np)
     904             :       CASE (HBP_colvar_id)
     905           2 :          np = 3*colvar%HBP%nPoints
     906             :          ! Number of real atoms involved in the colvar
     907           2 :          colvar%n_atom_s = 0
     908           4 :          DO j = 1, colvar%HBP%nPoints
     909          10 :             DO ii = 1, 3
     910           6 :                i = colvar%HBP%ids(j, ii)
     911           8 :                colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     912             :             END DO
     913             :          END DO
     914             :          ! Create a List of points...
     915           6 :          ALLOCATE (list(np))
     916           2 :          idum = 0
     917           4 :          DO j = 1, colvar%HBP%nPoints
     918          10 :             DO ii = 1, 3
     919           6 :                idum = idum + 1
     920           6 :                i = colvar%HBP%ids(j, ii)
     921           8 :                list(idum) = i
     922             :             END DO
     923             :          END DO
     924           2 :          CPASSERT(idum == np)
     925             :       CASE (ring_puckering_colvar_id)
     926          32 :          np = colvar%ring_puckering_param%nring
     927             :          ! Number of real atoms involved in the colvar
     928          32 :          colvar%n_atom_s = 0
     929         210 :          DO ii = 1, colvar%ring_puckering_param%nring
     930         178 :             i = colvar%ring_puckering_param%atoms(ii)
     931         210 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     932             :          END DO
     933             :          ! Create a List of points...
     934          96 :          ALLOCATE (list(np))
     935          32 :          idum = 0
     936         210 :          DO ii = 1, colvar%ring_puckering_param%nring
     937         178 :             idum = idum + 1
     938         178 :             i = colvar%ring_puckering_param%atoms(ii)
     939         210 :             list(idum) = i
     940             :          END DO
     941          32 :          CPASSERT(idum == np)
     942             :       CASE (mindist_colvar_id)
     943             :          np = colvar%mindist_param%n_dist_from + &
     944           0 :               colvar%mindist_param%n_coord_from + colvar%mindist_param%n_coord_to
     945             :          ! Number of real atoms involved in the colvar
     946           0 :          colvar%n_atom_s = 0
     947           0 :          DO ii = 1, colvar%mindist_param%n_dist_from
     948           0 :             i = colvar%mindist_param%i_dist_from(ii)
     949           0 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     950             :          END DO
     951           0 :          DO ii = 1, colvar%mindist_param%n_coord_from
     952           0 :             i = colvar%mindist_param%i_coord_from(ii)
     953           0 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     954             :          END DO
     955           0 :          DO ii = 1, colvar%mindist_param%n_coord_to
     956           0 :             i = colvar%mindist_param%i_coord_to(ii)
     957           0 :             colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
     958             :          END DO
     959             :          ! Create a List of points...
     960           0 :          ALLOCATE (list(np))
     961           0 :          idum = 0
     962           0 :          DO ii = 1, colvar%mindist_param%n_dist_from
     963           0 :             idum = idum + 1
     964           0 :             i = colvar%mindist_param%i_dist_from(ii)
     965           0 :             list(idum) = i
     966             :          END DO
     967           0 :          DO ii = 1, colvar%mindist_param%n_coord_from
     968           0 :             idum = idum + 1
     969           0 :             i = colvar%mindist_param%i_coord_from(ii)
     970           0 :             list(idum) = i
     971             :          END DO
     972           0 :          DO ii = 1, colvar%mindist_param%n_coord_to
     973           0 :             idum = idum + 1
     974           0 :             i = colvar%mindist_param%i_coord_to(ii)
     975           0 :             list(idum) = i
     976             :          END DO
     977           0 :          CPASSERT(idum == np)
     978             :       CASE (combine_colvar_id)
     979          16 :          colvar%n_atom_s = 0
     980          48 :          DO ii = 1, SIZE(colvar%combine_cvs_param%colvar_p)
     981          48 :             colvar%n_atom_s = colvar%n_atom_s + colvar%combine_cvs_param%colvar_p(ii)%colvar%n_atom_s
     982             :          END DO
     983          48 :          ALLOCATE (list(colvar%n_atom_s))
     984          16 :          idum = 0
     985          48 :          DO ii = 1, SIZE(colvar%combine_cvs_param%colvar_p)
     986         160 :             DO j = 1, colvar%combine_cvs_param%colvar_p(ii)%colvar%n_atom_s
     987         112 :                idum = idum + 1
     988         144 :                list(idum) = colvar%combine_cvs_param%colvar_p(ii)%colvar%i_atom(j)
     989             :             END DO
     990             :          END DO
     991             :       END SELECT
     992             : 
     993        5680 :       IF (ASSOCIATED(colvar%dsdr)) THEN
     994          16 :          DEALLOCATE (colvar%dsdr)
     995             :       END IF
     996        5680 :       IF (ASSOCIATED(colvar%i_atom)) THEN
     997          16 :          DEALLOCATE (colvar%i_atom)
     998             :       END IF
     999       17032 :       ALLOCATE (colvar%dsdr(3, colvar%n_atom_s))
    1000       17032 :       ALLOCATE (colvar%i_atom(colvar%n_atom_s))
    1001             :       ! And now map real atoms
    1002        5680 :       istart = 0
    1003        5680 :       iend = 0
    1004       18528 :       DO i = 1, SIZE(list)
    1005       18528 :          IF (.NOT. colvar%use_points) THEN
    1006             :             ! No point centers
    1007       12582 :             colvar%i_atom(i) = list(i)
    1008       12582 :             iend = iend + 1
    1009             :          ELSE
    1010         266 :             IF (ASSOCIATED(colvar%points(list(i))%atoms)) THEN
    1011         256 :                iend = istart + SIZE(colvar%points(list(i))%atoms)
    1012         616 :                colvar%i_atom(istart + 1:iend) = colvar%points(list(i))%atoms
    1013             :                istart = iend
    1014             :             END IF
    1015             :          END IF
    1016             :       END DO
    1017        5680 :       CPASSERT(iend == colvar%n_atom_s)
    1018        5680 :       DEALLOCATE (list)
    1019             : 
    1020        5680 :    END SUBROUTINE colvar_setup
    1021             : 
    1022             : ! **************************************************************************************************
    1023             : !> \brief Finalize the setup of the collective variable for the autoionization of water
    1024             : !> \param colvar the colvar to initialize
    1025             : !> \param colvar_id ...
    1026             : !> \param list ...
    1027             : !> \author Dorothea Golze
    1028             : ! **************************************************************************************************
    1029           4 :    SUBROUTINE setup_hydronium_colvars(colvar, colvar_id, list)
    1030             :       TYPE(colvar_type), INTENT(INOUT)                   :: colvar
    1031             :       INTEGER, INTENT(IN)                                :: colvar_id
    1032             :       INTEGER, DIMENSION(:), INTENT(INOUT)               :: list
    1033             : 
    1034             :       INTEGER                                            :: i, idum, ii, n_hydrogens, n_oxygens, np
    1035           4 :       INTEGER, DIMENSION(:), POINTER                     :: i_hydrogens, i_oxygens
    1036             : 
    1037           4 :       NULLIFY (i_oxygens, i_hydrogens)
    1038             : 
    1039           6 :       SELECT CASE (colvar_id)
    1040             :       CASE (hydronium_shell_colvar_id)
    1041           2 :          n_oxygens = colvar%hydronium_shell_param%n_oxygens
    1042           2 :          n_hydrogens = colvar%hydronium_shell_param%n_hydrogens
    1043           2 :          i_oxygens => colvar%hydronium_shell_param%i_oxygens
    1044           2 :          i_hydrogens => colvar%hydronium_shell_param%i_hydrogens
    1045             :       CASE (hydronium_dist_colvar_id)
    1046           2 :          n_oxygens = colvar%hydronium_dist_param%n_oxygens
    1047           2 :          n_hydrogens = colvar%hydronium_dist_param%n_hydrogens
    1048           2 :          i_oxygens => colvar%hydronium_dist_param%i_oxygens
    1049           2 :          i_hydrogens => colvar%hydronium_dist_param%i_hydrogens
    1050             :       END SELECT
    1051             : 
    1052           4 :       np = n_oxygens + n_hydrogens
    1053             :       ! Number of real atoms involved in the colvar
    1054           4 :       colvar%n_atom_s = 0
    1055          20 :       DO ii = 1, n_oxygens
    1056          16 :          i = i_oxygens(ii)
    1057          20 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
    1058             :       END DO
    1059          40 :       DO ii = 1, n_hydrogens
    1060          36 :          i = i_hydrogens(ii)
    1061          40 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
    1062             :       END DO
    1063             :       idum = 0
    1064          20 :       DO ii = 1, n_oxygens
    1065          16 :          idum = idum + 1
    1066          16 :          i = i_oxygens(ii)
    1067          16 :          list(idum) = i
    1068         160 :          IF (ANY(i_hydrogens == i)) &
    1069           4 :             CPABORT("COLVAR: atoms doubled in OXYGENS and HYDROGENS list")
    1070             :       END DO
    1071          40 :       DO ii = 1, n_hydrogens
    1072          36 :          idum = idum + 1
    1073          36 :          i = i_hydrogens(ii)
    1074          40 :          list(idum) = i
    1075             :       END DO
    1076           4 :       CPASSERT(idum == np)
    1077          56 :       DO i = 1, np
    1078         368 :          DO ii = i + 1, np
    1079         364 :             IF (list(i) == list(ii)) THEN
    1080           0 :                IF (i <= n_oxygens) &
    1081           0 :                   CPABORT("atoms doubled in OXYGENS list")
    1082           0 :                IF (i > n_oxygens) &
    1083           0 :                   CPABORT("atoms doubled in HYDROGENS list")
    1084             :             END IF
    1085             :          END DO
    1086             :       END DO
    1087             : 
    1088           4 :    END SUBROUTINE setup_hydronium_colvars
    1089             : 
    1090             : ! **************************************************************************************************
    1091             : !> \brief Finalize the setup of the collective variable for the dissociation
    1092             : !>        of a carboxylic acid in water
    1093             : !> \param colvar the colvar to initialize
    1094             : !> \param colvar_id ...
    1095             : !> \param list ...
    1096             : !> \author Dorothea Golze
    1097             : ! **************************************************************************************************
    1098           4 :    SUBROUTINE setup_acid_hydronium_colvars(colvar, colvar_id, list)
    1099             :       TYPE(colvar_type), INTENT(INOUT)                   :: colvar
    1100             :       INTEGER, INTENT(IN)                                :: colvar_id
    1101             :       INTEGER, DIMENSION(:), INTENT(INOUT)               :: list
    1102             : 
    1103             :       INTEGER                                            :: i, idum, ii, n_hydrogens, &
    1104             :                                                             n_oxygens_acid, n_oxygens_water, np
    1105           4 :       INTEGER, DIMENSION(:), POINTER                     :: i_hydrogens, i_oxygens_acid, &
    1106           4 :                                                             i_oxygens_water
    1107             : 
    1108           4 :       NULLIFY (i_oxygens_water, i_oxygens_acid, i_hydrogens)
    1109             : 
    1110           6 :       SELECT CASE (colvar_id)
    1111             :       CASE (acid_hyd_dist_colvar_id)
    1112           2 :          n_oxygens_water = colvar%acid_hyd_dist_param%n_oxygens_water
    1113           2 :          n_oxygens_acid = colvar%acid_hyd_dist_param%n_oxygens_acid
    1114           2 :          n_hydrogens = colvar%acid_hyd_dist_param%n_hydrogens
    1115           2 :          i_oxygens_water => colvar%acid_hyd_dist_param%i_oxygens_water
    1116           2 :          i_oxygens_acid => colvar%acid_hyd_dist_param%i_oxygens_acid
    1117           2 :          i_hydrogens => colvar%acid_hyd_dist_param%i_hydrogens
    1118             :       CASE (acid_hyd_shell_colvar_id)
    1119           2 :          n_oxygens_water = colvar%acid_hyd_shell_param%n_oxygens_water
    1120           2 :          n_oxygens_acid = colvar%acid_hyd_shell_param%n_oxygens_acid
    1121           2 :          n_hydrogens = colvar%acid_hyd_shell_param%n_hydrogens
    1122           2 :          i_oxygens_water => colvar%acid_hyd_shell_param%i_oxygens_water
    1123           2 :          i_oxygens_acid => colvar%acid_hyd_shell_param%i_oxygens_acid
    1124           2 :          i_hydrogens => colvar%acid_hyd_shell_param%i_hydrogens
    1125             :       END SELECT
    1126             : 
    1127           4 :       np = n_oxygens_water + n_oxygens_acid + n_hydrogens
    1128             :       ! Number of real atoms involved in the colvar
    1129           4 :       colvar%n_atom_s = 0
    1130          12 :       DO ii = 1, n_oxygens_water
    1131           8 :          i = i_oxygens_water(ii)
    1132          12 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
    1133             :       END DO
    1134          12 :       DO ii = 1, n_oxygens_acid
    1135           8 :          i = i_oxygens_acid(ii)
    1136          12 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
    1137             :       END DO
    1138          24 :       DO ii = 1, n_hydrogens
    1139          20 :          i = i_hydrogens(ii)
    1140          24 :          colvar%n_atom_s = colvar%n_atom_s + COLV_SIZE(colvar, i)
    1141             :       END DO
    1142             :       idum = 0
    1143          12 :       DO ii = 1, n_oxygens_water
    1144           8 :          idum = idum + 1
    1145           8 :          i = i_oxygens_water(ii)
    1146           8 :          list(idum) = i
    1147          48 :          IF (ANY(i_hydrogens == i)) &
    1148           0 :             CPABORT("COLVAR: atoms doubled in OXYGENS_WATER and HYDROGENS list")
    1149          24 :          IF (ANY(i_oxygens_acid == i)) &
    1150           4 :             CPABORT("COLVAR: atoms doubled in OXYGENS_WATER and OXYGENS_ACID list")
    1151             :       END DO
    1152          12 :       DO ii = 1, n_oxygens_acid
    1153           8 :          idum = idum + 1
    1154           8 :          i = i_oxygens_acid(ii)
    1155           8 :          list(idum) = i
    1156          48 :          IF (ANY(i_hydrogens == i)) &
    1157           4 :             CPABORT("COLVAR: atoms doubled in OXYGENS_ACID and HYDROGENS list")
    1158             :       END DO
    1159          24 :       DO ii = 1, n_hydrogens
    1160          20 :          idum = idum + 1
    1161          20 :          i = i_hydrogens(ii)
    1162          24 :          list(idum) = i
    1163             :       END DO
    1164           4 :       CPASSERT(idum == np)
    1165          40 :       DO i = 1, np
    1166         184 :          DO ii = i + 1, np
    1167         180 :             IF (list(i) == list(ii)) THEN
    1168           0 :                IF (i <= n_oxygens_water) &
    1169           0 :                   CPABORT("atoms doubled in OXYGENS_WATER list")
    1170           0 :                IF (i > n_oxygens_water .AND. i <= n_oxygens_water + n_oxygens_acid) &
    1171           0 :                   CPABORT("atoms doubled in OXYGENS_ACID list")
    1172           0 :                IF (i > n_oxygens_water + n_oxygens_acid) &
    1173           0 :                   CPABORT("atoms doubled in HYDROGENS list")
    1174             :             END IF
    1175             :          END DO
    1176             :       END DO
    1177             : 
    1178           4 :    END SUBROUTINE setup_acid_hydronium_colvars
    1179             : 
    1180             : ! **************************************************************************************************
    1181             : !> \brief Gives back the size of an array of integer. If not associated gives back 1
    1182             : !> \param colvar ...
    1183             : !> \param i ...
    1184             : !> \return ...
    1185             : !> \author Teodoro Laino - 03.2007
    1186             : ! **************************************************************************************************
    1187       12594 :    FUNCTION colv_size(colvar, i) RESULT(my_size)
    1188             :       TYPE(colvar_type), INTENT(IN)                      :: colvar
    1189             :       INTEGER                                            :: i, my_size
    1190             : 
    1191       12594 :       my_size = 1
    1192       12594 :       IF (ASSOCIATED(colvar%points)) THEN
    1193         266 :          IF (ASSOCIATED(colvar%points(i)%atoms)) THEN
    1194         256 :             my_size = SIZE(colvar%points(i)%atoms)
    1195             :          ELSE
    1196             :             my_size = 0
    1197             :          END IF
    1198             :       END IF
    1199       12594 :    END FUNCTION colv_size
    1200             : 
    1201             : ! **************************************************************************************************
    1202             : !> \brief releases the memory that might have been allocated by the colvar
    1203             : !> \param colvar the colvar to deallocate
    1204             : !> \author alessandro laio and fawzi mohamed
    1205             : ! **************************************************************************************************
    1206        5664 :    RECURSIVE SUBROUTINE colvar_release(colvar)
    1207             :       TYPE(colvar_type), POINTER                         :: colvar
    1208             : 
    1209             :       INTEGER                                            :: i
    1210             : 
    1211        5664 :       CPASSERT(ASSOCIATED(colvar))
    1212        5664 :       IF (ASSOCIATED(colvar%dsdr)) THEN
    1213        5664 :          DEALLOCATE (colvar%dsdr)
    1214             :       END IF
    1215        5664 :       IF (ASSOCIATED(colvar%i_atom)) THEN
    1216        5664 :          DEALLOCATE (colvar%i_atom)
    1217             :       END IF
    1218        5664 :       IF (ASSOCIATED(colvar%points)) THEN
    1219         366 :          DO i = 1, SIZE(colvar%points)
    1220         266 :             IF (ASSOCIATED(colvar%points(i)%atoms)) THEN
    1221         256 :                DEALLOCATE (colvar%points(i)%atoms)
    1222             :             END IF
    1223         366 :             IF (ASSOCIATED(colvar%points(i)%weights)) THEN
    1224         256 :                DEALLOCATE (colvar%points(i)%weights)
    1225             :             END IF
    1226             :          END DO
    1227         100 :          DEALLOCATE (colvar%points)
    1228             :       END IF
    1229       10662 :       SELECT CASE (colvar%type_id)
    1230             :       CASE (dist_colvar_id)
    1231        4998 :          DEALLOCATE (colvar%dist_param)
    1232             :       CASE (coord_colvar_id)
    1233          58 :          IF (ASSOCIATED(colvar%coord_param%i_at_from)) THEN
    1234          58 :             DEALLOCATE (colvar%coord_param%i_at_from)
    1235             :          END IF
    1236          58 :          IF (ASSOCIATED(colvar%coord_param%i_at_to)) THEN
    1237          58 :             DEALLOCATE (colvar%coord_param%i_at_to)
    1238             :          END IF
    1239          58 :          IF (ASSOCIATED(colvar%coord_param%c_kinds_from)) THEN
    1240           6 :             DEALLOCATE (colvar%coord_param%c_kinds_from)
    1241             :          END IF
    1242          58 :          IF (ASSOCIATED(colvar%coord_param%c_kinds_to)) THEN
    1243           6 :             DEALLOCATE (colvar%coord_param%c_kinds_to)
    1244             :          END IF
    1245          58 :          IF (ASSOCIATED(colvar%coord_param%i_at_to_b)) THEN
    1246           4 :             DEALLOCATE (colvar%coord_param%i_at_to_b)
    1247             :          END IF
    1248          58 :          IF (ASSOCIATED(colvar%coord_param%c_kinds_to_b)) THEN
    1249           2 :             DEALLOCATE (colvar%coord_param%c_kinds_to_b)
    1250             :          END IF
    1251          58 :          DEALLOCATE (colvar%coord_param)
    1252             :       CASE (population_colvar_id)
    1253           8 :          IF (ASSOCIATED(colvar%population_param%i_at_from)) THEN
    1254           8 :             DEALLOCATE (colvar%population_param%i_at_from)
    1255             :          END IF
    1256           8 :          IF (ASSOCIATED(colvar%population_param%i_at_to)) THEN
    1257           8 :             DEALLOCATE (colvar%population_param%i_at_to)
    1258             :          END IF
    1259           8 :          IF (ASSOCIATED(colvar%population_param%c_kinds_from)) THEN
    1260           0 :             DEALLOCATE (colvar%population_param%c_kinds_from)
    1261             :          END IF
    1262           8 :          IF (ASSOCIATED(colvar%population_param%c_kinds_to)) THEN
    1263           8 :             DEALLOCATE (colvar%population_param%c_kinds_to)
    1264             :          END IF
    1265           8 :          DEALLOCATE (colvar%population_param)
    1266             :       CASE (gyration_colvar_id)
    1267           2 :          IF (ASSOCIATED(colvar%gyration_param%i_at)) THEN
    1268           2 :             DEALLOCATE (colvar%gyration_param%i_at)
    1269             :          END IF
    1270           2 :          IF (ASSOCIATED(colvar%gyration_param%c_kinds)) THEN
    1271           2 :             DEALLOCATE (colvar%gyration_param%c_kinds)
    1272             :          END IF
    1273           2 :          DEALLOCATE (colvar%gyration_param)
    1274             :       CASE (angle_colvar_id)
    1275         220 :          DEALLOCATE (colvar%angle_param)
    1276             :       CASE (torsion_colvar_id)
    1277         160 :          DEALLOCATE (colvar%torsion_param)
    1278             :       CASE (plane_distance_colvar_id)
    1279          28 :          DEALLOCATE (colvar%plane_distance_param)
    1280             :       CASE (plane_plane_angle_colvar_id)
    1281          16 :          DEALLOCATE (colvar%plane_plane_angle_param)
    1282             :       CASE (dfunct_colvar_id)
    1283          18 :          DEALLOCATE (colvar%dfunct_param)
    1284             :       CASE (rotation_colvar_id)
    1285           2 :          DEALLOCATE (colvar%rotation_param)
    1286             :       CASE (qparm_colvar_id)
    1287           2 :          DEALLOCATE (colvar%qparm_param%i_at_from)
    1288           2 :          DEALLOCATE (colvar%qparm_param%i_at_to)
    1289           2 :          DEALLOCATE (colvar%qparm_param)
    1290             :       CASE (xyz_diag_colvar_id)
    1291          30 :          DEALLOCATE (colvar%xyz_diag_param)
    1292             :       CASE (xyz_outerdiag_colvar_id)
    1293          30 :          DEALLOCATE (colvar%xyz_outerdiag_param)
    1294             :       CASE (u_colvar_id)
    1295           6 :          NULLIFY (colvar%u_param%mixed_energy_section)
    1296           6 :          DEALLOCATE (colvar%u_param)
    1297             :       CASE (hydronium_shell_colvar_id)
    1298           2 :          DEALLOCATE (colvar%hydronium_shell_param%i_oxygens)
    1299           2 :          DEALLOCATE (colvar%hydronium_shell_param%i_hydrogens)
    1300           2 :          DEALLOCATE (colvar%hydronium_shell_param)
    1301             :       CASE (hydronium_dist_colvar_id)
    1302           2 :          DEALLOCATE (colvar%hydronium_dist_param%i_oxygens)
    1303           2 :          DEALLOCATE (colvar%hydronium_dist_param%i_hydrogens)
    1304           2 :          DEALLOCATE (colvar%hydronium_dist_param)
    1305             :       CASE (acid_hyd_dist_colvar_id)
    1306           2 :          DEALLOCATE (colvar%acid_hyd_dist_param%i_oxygens_water)
    1307           2 :          DEALLOCATE (colvar%acid_hyd_dist_param%i_oxygens_acid)
    1308           2 :          DEALLOCATE (colvar%acid_hyd_dist_param%i_hydrogens)
    1309           2 :          DEALLOCATE (colvar%acid_hyd_dist_param)
    1310             :       CASE (acid_hyd_shell_colvar_id)
    1311           2 :          DEALLOCATE (colvar%acid_hyd_shell_param%i_oxygens_water)
    1312           2 :          DEALLOCATE (colvar%acid_hyd_shell_param%i_oxygens_acid)
    1313           2 :          DEALLOCATE (colvar%acid_hyd_shell_param%i_hydrogens)
    1314           2 :          DEALLOCATE (colvar%acid_hyd_shell_param)
    1315             :       CASE (reaction_path_colvar_id, distance_from_path_colvar_id)
    1316          24 :          IF (colvar%reaction_path_param%dist_rmsd .OR. colvar%reaction_path_param%rmsd) THEN
    1317           8 :             DEALLOCATE (colvar%reaction_path_param%r_ref)
    1318           8 :             DEALLOCATE (colvar%reaction_path_param%i_rmsd)
    1319             :          ELSE
    1320          48 :             DO i = 1, SIZE(colvar%reaction_path_param%colvar_p)
    1321          48 :                CALL colvar_release(colvar%reaction_path_param%colvar_p(i)%colvar)
    1322             :             END DO
    1323          16 :             DEALLOCATE (colvar%reaction_path_param%colvar_p)
    1324          16 :             DEALLOCATE (colvar%reaction_path_param%f_vals)
    1325             :          END IF
    1326          24 :          DEALLOCATE (colvar%reaction_path_param)
    1327             :       CASE (combine_colvar_id)
    1328          48 :          DO i = 1, SIZE(colvar%combine_cvs_param%colvar_p)
    1329          48 :             CALL colvar_release(colvar%combine_cvs_param%colvar_p(i)%colvar)
    1330             :          END DO
    1331          16 :          DEALLOCATE (colvar%combine_cvs_param%colvar_p)
    1332          16 :          DEALLOCATE (colvar%combine_cvs_param%c_parameters)
    1333          16 :          DEALLOCATE (colvar%combine_cvs_param%v_parameters)
    1334          16 :          DEALLOCATE (colvar%combine_cvs_param%variables)
    1335          16 :          DEALLOCATE (colvar%combine_cvs_param)
    1336             :       CASE (rmsd_colvar_id)
    1337           4 :          DEALLOCATE (colvar%rmsd_param%weights)
    1338           4 :          DEALLOCATE (colvar%rmsd_param%r_ref)
    1339           4 :          DEALLOCATE (colvar%rmsd_param%i_rmsd)
    1340           4 :          DEALLOCATE (colvar%rmsd_param)
    1341             :       CASE (Wc_colvar_id)
    1342           0 :          DEALLOCATE (colvar%Wc)
    1343             :       CASE (HBP_colvar_id)
    1344           2 :          DEALLOCATE (colvar%HBP%ewc)
    1345           2 :          DEALLOCATE (colvar%HBP%ids)
    1346           2 :          DEALLOCATE (colvar%HBP)
    1347             :       CASE (ring_puckering_colvar_id)
    1348          32 :          DEALLOCATE (colvar%ring_puckering_param%atoms)
    1349          32 :          DEALLOCATE (colvar%ring_puckering_param)
    1350             :       CASE (mindist_colvar_id)
    1351           0 :          IF (ASSOCIATED(colvar%mindist_param%i_dist_from)) THEN
    1352           0 :             DEALLOCATE (colvar%mindist_param%i_dist_from)
    1353             :          END IF
    1354           0 :          IF (ASSOCIATED(colvar%mindist_param%i_coord_from)) THEN
    1355           0 :             DEALLOCATE (colvar%mindist_param%i_coord_from)
    1356             :          END IF
    1357           0 :          IF (ASSOCIATED(colvar%mindist_param%i_coord_to)) THEN
    1358           0 :             DEALLOCATE (colvar%mindist_param%i_coord_to)
    1359             :          END IF
    1360           0 :          IF (ASSOCIATED(colvar%mindist_param%k_coord_from)) THEN
    1361           0 :             DEALLOCATE (colvar%mindist_param%k_coord_from)
    1362             :          END IF
    1363           0 :          IF (ASSOCIATED(colvar%mindist_param%k_coord_to)) THEN
    1364           0 :             DEALLOCATE (colvar%mindist_param%k_coord_to)
    1365             :          END IF
    1366           0 :          DEALLOCATE (colvar%mindist_param)
    1367             :       CASE (no_colvar_id)
    1368             :          ! Do nothing
    1369             :       CASE default
    1370        5664 :          CPABORT("")
    1371             :       END SELECT
    1372        5664 :       DEALLOCATE (colvar)
    1373             : 
    1374        5664 :    END SUBROUTINE colvar_release
    1375             : 
    1376             : ! **************************************************************************************************
    1377             : !> \brief Clone a colvar type
    1378             : !> \param colvar_out ...
    1379             : !> \param colvar_in the colvar to deallocate
    1380             : !> \param i_atom_offset ...
    1381             : !> \author Teodoro Laino [tlaino] 04.2006
    1382             : ! **************************************************************************************************
    1383        4986 :    RECURSIVE SUBROUTINE colvar_clone(colvar_out, colvar_in, i_atom_offset)
    1384             :       TYPE(colvar_type), INTENT(INOUT), POINTER          :: colvar_out
    1385             :       TYPE(colvar_type), INTENT(IN)                      :: colvar_in
    1386             :       INTEGER, INTENT(IN), OPTIONAL                      :: i_atom_offset
    1387             : 
    1388             :       INTEGER                                            :: i, my_offset, ndim, ndim2, stat
    1389             : 
    1390        4986 :       my_offset = 0
    1391        4986 :       CPASSERT(.NOT. ASSOCIATED(colvar_out))
    1392        4986 :       IF (PRESENT(i_atom_offset)) my_offset = i_atom_offset
    1393        4986 :       CALL colvar_create(colvar_out, colvar_in%type_id)
    1394        4986 :       CALL colvar_clone_points(colvar_out, colvar_in, my_offset)
    1395        4986 :       IF (colvar_in%use_points) my_offset = 0
    1396        9598 :       SELECT CASE (colvar_out%type_id)
    1397             :       CASE (dist_colvar_id)
    1398        4612 :          colvar_out%dist_param%i_at = colvar_in%dist_param%i_at + my_offset
    1399        4612 :          colvar_out%dist_param%j_at = colvar_in%dist_param%j_at + my_offset
    1400        4612 :          colvar_out%dist_param%axis_id = colvar_in%dist_param%axis_id
    1401             :       CASE (coord_colvar_id)
    1402           6 :          colvar_out%coord_param%n_atoms_to = colvar_in%coord_param%n_atoms_to
    1403           6 :          colvar_out%coord_param%n_atoms_to_b = colvar_in%coord_param%n_atoms_to_b
    1404           6 :          colvar_out%coord_param%n_atoms_from = colvar_in%coord_param%n_atoms_from
    1405           6 :          colvar_out%coord_param%nncrd = colvar_in%coord_param%nncrd
    1406           6 :          colvar_out%coord_param%ndcrd = colvar_in%coord_param%ndcrd
    1407           6 :          colvar_out%coord_param%r_0 = colvar_in%coord_param%r_0
    1408           6 :          colvar_out%coord_param%nncrd_b = colvar_in%coord_param%nncrd_b
    1409           6 :          colvar_out%coord_param%ndcrd_b = colvar_in%coord_param%ndcrd_b
    1410           6 :          colvar_out%coord_param%r_0_b = colvar_in%coord_param%r_0_b
    1411           6 :          colvar_out%coord_param%use_kinds_from = colvar_in%coord_param%use_kinds_from
    1412           6 :          colvar_out%coord_param%use_kinds_to = colvar_in%coord_param%use_kinds_to
    1413           6 :          colvar_out%coord_param%use_kinds_to_b = colvar_in%coord_param%use_kinds_to_b
    1414           6 :          NULLIFY (colvar_out%coord_param%c_kinds_from, colvar_out%coord_param%i_at_from)
    1415           6 :          NULLIFY (colvar_out%coord_param%c_kinds_to, colvar_out%coord_param%i_at_to)
    1416           6 :          NULLIFY (colvar_out%coord_param%c_kinds_to_b, colvar_out%coord_param%i_at_to_b)
    1417           6 :          IF (colvar_in%coord_param%use_kinds_from) THEN
    1418             :             ! KINDS
    1419           0 :             ndim = SIZE(colvar_in%coord_param%c_kinds_from)
    1420           0 :             ALLOCATE (colvar_out%coord_param%c_kinds_from(ndim))
    1421           0 :             colvar_out%coord_param%c_kinds_from = colvar_in%coord_param%c_kinds_from
    1422             :          ELSE
    1423             :             ! INDEX
    1424           6 :             ndim = SIZE(colvar_in%coord_param%i_at_from)
    1425          18 :             ALLOCATE (colvar_out%coord_param%i_at_from(ndim))
    1426          12 :             colvar_out%coord_param%i_at_from = colvar_in%coord_param%i_at_from + my_offset
    1427             :          END IF
    1428           6 :          IF (colvar_in%coord_param%use_kinds_to) THEN
    1429             :             ! KINDS
    1430           0 :             ndim = SIZE(colvar_in%coord_param%c_kinds_to)
    1431           0 :             ALLOCATE (colvar_out%coord_param%c_kinds_to(ndim))
    1432           0 :             colvar_out%coord_param%c_kinds_to = colvar_in%coord_param%c_kinds_to
    1433             :          ELSE
    1434             :             ! INDEX
    1435           6 :             ndim = SIZE(colvar_in%coord_param%i_at_to)
    1436          18 :             ALLOCATE (colvar_out%coord_param%i_at_to(ndim))
    1437          18 :             colvar_out%coord_param%i_at_to = colvar_in%coord_param%i_at_to + my_offset
    1438             :          END IF
    1439           6 :          IF (colvar_in%coord_param%use_kinds_to_b) THEN
    1440             :             ! KINDS
    1441           0 :             ndim = SIZE(colvar_in%coord_param%c_kinds_to_b)
    1442           0 :             ALLOCATE (colvar_out%coord_param%c_kinds_to_b(ndim))
    1443           0 :             colvar_out%coord_param%c_kinds_to_b = colvar_in%coord_param%c_kinds_to_b
    1444           6 :          ELSEIF (ASSOCIATED(colvar_in%coord_param%i_at_to_b)) THEN
    1445             :             ! INDEX
    1446           0 :             ndim = SIZE(colvar_in%coord_param%i_at_to_b)
    1447           0 :             ALLOCATE (colvar_out%coord_param%i_at_to_b(ndim))
    1448           0 :             colvar_out%coord_param%i_at_to_b = colvar_in%coord_param%i_at_to_b + my_offset
    1449             :          END IF
    1450             : 
    1451             :       CASE (population_colvar_id)
    1452           0 :          colvar_out%population_param%n_atoms_to = colvar_in%population_param%n_atoms_to
    1453           0 :          colvar_out%population_param%n_atoms_from = colvar_in%population_param%n_atoms_from
    1454           0 :          colvar_out%population_param%nncrd = colvar_in%population_param%nncrd
    1455           0 :          colvar_out%population_param%ndcrd = colvar_in%population_param%ndcrd
    1456           0 :          colvar_out%population_param%r_0 = colvar_in%population_param%r_0
    1457           0 :          colvar_out%population_param%use_kinds_from = colvar_in%population_param%use_kinds_from
    1458           0 :          colvar_out%population_param%use_kinds_to = colvar_in%population_param%use_kinds_to
    1459           0 :          NULLIFY (colvar_out%population_param%c_kinds_from, colvar_out%population_param%i_at_from)
    1460           0 :          NULLIFY (colvar_out%population_param%c_kinds_to, colvar_out%population_param%i_at_to)
    1461           0 :          IF (colvar_in%population_param%use_kinds_from) THEN
    1462             :             ! KINDS
    1463           0 :             ndim = SIZE(colvar_in%population_param%c_kinds_from)
    1464           0 :             ALLOCATE (colvar_out%population_param%c_kinds_from(ndim))
    1465           0 :             colvar_out%population_param%c_kinds_from = colvar_in%population_param%c_kinds_from
    1466             :          ELSE
    1467             :             ! INDEX
    1468           0 :             ndim = SIZE(colvar_in%population_param%i_at_from)
    1469           0 :             ALLOCATE (colvar_out%population_param%i_at_from(ndim))
    1470           0 :             colvar_out%population_param%i_at_from = colvar_in%population_param%i_at_from + my_offset
    1471             :          END IF
    1472           0 :          IF (colvar_in%population_param%use_kinds_to) THEN
    1473             :             ! KINDS
    1474           0 :             ndim = SIZE(colvar_in%population_param%c_kinds_to)
    1475           0 :             ALLOCATE (colvar_out%population_param%c_kinds_to(ndim))
    1476           0 :             colvar_out%population_param%c_kinds_to = colvar_in%population_param%c_kinds_to
    1477             :          ELSE
    1478             :             ! INDEX
    1479           0 :             ndim = SIZE(colvar_in%population_param%i_at_to)
    1480           0 :             ALLOCATE (colvar_out%population_param%i_at_to(ndim))
    1481           0 :             colvar_out%population_param%i_at_to = colvar_in%population_param%i_at_to + my_offset
    1482             :          END IF
    1483             : 
    1484             :       CASE (gyration_colvar_id)
    1485           0 :          colvar_out%gyration_param%n_atoms = colvar_in%gyration_param%n_atoms
    1486           0 :          colvar_out%gyration_param%use_kinds = colvar_in%gyration_param%use_kinds
    1487           0 :          NULLIFY (colvar_out%gyration_param%c_kinds, colvar_out%gyration_param%i_at)
    1488           0 :          IF (colvar_in%gyration_param%use_kinds) THEN
    1489             :             ! KINDS
    1490           0 :             ndim = SIZE(colvar_in%gyration_param%c_kinds)
    1491           0 :             ALLOCATE (colvar_out%gyration_param%c_kinds(ndim))
    1492           0 :             colvar_out%gyration_param%c_kinds = colvar_in%gyration_param%c_kinds
    1493             :          ELSE
    1494             :             ! INDEX
    1495           0 :             ndim = SIZE(colvar_in%gyration_param%i_at)
    1496           0 :             ALLOCATE (colvar_out%gyration_param%i_at(ndim))
    1497           0 :             colvar_out%gyration_param%i_at = colvar_in%gyration_param%i_at + my_offset
    1498             :          END IF
    1499             :       CASE (angle_colvar_id)
    1500         672 :          colvar_out%angle_param%i_at_angle = colvar_in%angle_param%i_at_angle + my_offset
    1501             :       CASE (torsion_colvar_id)
    1502         570 :          colvar_out%torsion_param%i_at_tors = colvar_in%torsion_param%i_at_tors + my_offset
    1503         114 :          colvar_out%torsion_param%o0 = colvar_in%torsion_param%o0
    1504             :       CASE (plane_distance_colvar_id)
    1505           0 :          colvar_out%plane_distance_param%use_pbc = colvar_in%plane_distance_param%use_pbc
    1506           0 :          colvar_out%plane_distance_param%plane = colvar_in%plane_distance_param%plane + my_offset
    1507           0 :          colvar_out%plane_distance_param%point = colvar_in%plane_distance_param%point + my_offset
    1508             :       CASE (plane_plane_angle_colvar_id)
    1509          12 :          colvar_out%plane_plane_angle_param%plane1%type_of_def = colvar_in%plane_plane_angle_param%plane1%type_of_def
    1510          12 :          IF (colvar_out%plane_plane_angle_param%plane1%type_of_def == plane_def_vec) THEN
    1511           0 :             colvar_out%plane_plane_angle_param%plane1%normal_vec = colvar_in%plane_plane_angle_param%plane1%normal_vec
    1512             :          ELSE
    1513          48 :             colvar_out%plane_plane_angle_param%plane1%points = colvar_in%plane_plane_angle_param%plane1%points + my_offset
    1514             :          END IF
    1515             : 
    1516          12 :          colvar_out%plane_plane_angle_param%plane2%type_of_def = colvar_in%plane_plane_angle_param%plane2%type_of_def
    1517          12 :          IF (colvar_out%plane_plane_angle_param%plane2%type_of_def == plane_def_vec) THEN
    1518          24 :             colvar_out%plane_plane_angle_param%plane2%normal_vec = colvar_in%plane_plane_angle_param%plane2%normal_vec
    1519             :          ELSE
    1520          24 :             colvar_out%plane_plane_angle_param%plane2%points = colvar_in%plane_plane_angle_param%plane2%points + my_offset
    1521             :          END IF
    1522             :       CASE (rotation_colvar_id)
    1523           0 :          colvar_out%rotation_param%i_at1_bond1 = colvar_in%rotation_param%i_at1_bond1 + my_offset
    1524           0 :          colvar_out%rotation_param%i_at2_bond1 = colvar_in%rotation_param%i_at2_bond1 + my_offset
    1525           0 :          colvar_out%rotation_param%i_at1_bond2 = colvar_in%rotation_param%i_at1_bond2 + my_offset
    1526           0 :          colvar_out%rotation_param%i_at2_bond2 = colvar_in%rotation_param%i_at2_bond2 + my_offset
    1527             :       CASE (dfunct_colvar_id)
    1528          60 :          colvar_out%dfunct_param%i_at_dfunct = colvar_in%dfunct_param%i_at_dfunct + my_offset
    1529          12 :          colvar_out%dfunct_param%coeff = colvar_in%dfunct_param%coeff
    1530          12 :          colvar_out%dfunct_param%use_pbc = colvar_in%dfunct_param%use_pbc
    1531             :       CASE (qparm_colvar_id)
    1532           0 :          colvar_out%qparm_param%n_atoms_to = colvar_in%qparm_param%n_atoms_to
    1533           0 :          colvar_out%qparm_param%n_atoms_from = colvar_in%qparm_param%n_atoms_from
    1534           0 :          colvar_out%qparm_param%rcut = colvar_in%qparm_param%rcut
    1535           0 :          colvar_out%qparm_param%l = colvar_in%qparm_param%l
    1536           0 :          colvar_out%qparm_param%rstart = colvar_in%qparm_param%rstart
    1537           0 :          colvar_out%qparm_param%include_images = colvar_in%qparm_param%include_images
    1538           0 :          ndim = SIZE(colvar_in%qparm_param%i_at_from)
    1539           0 :          ALLOCATE (colvar_out%qparm_param%i_at_from(ndim))
    1540           0 :          ndim = SIZE(colvar_in%qparm_param%i_at_to)
    1541           0 :          ALLOCATE (colvar_out%qparm_param%i_at_to(ndim))
    1542           0 :          colvar_out%qparm_param%i_at_from = colvar_in%qparm_param%i_at_from + my_offset
    1543           0 :          colvar_out%qparm_param%i_at_to = colvar_in%qparm_param%i_at_from + my_offset
    1544             :       CASE (xyz_diag_colvar_id)
    1545          24 :          colvar_out%xyz_diag_param%i_atom = colvar_in%xyz_diag_param%i_atom + my_offset
    1546          24 :          colvar_out%xyz_diag_param%component = colvar_in%xyz_diag_param%component
    1547          96 :          colvar_out%xyz_diag_param%r0 = colvar_in%xyz_diag_param%r0
    1548          24 :          colvar_out%xyz_diag_param%use_pbc = colvar_in%xyz_diag_param%use_pbc
    1549          24 :          colvar_out%xyz_diag_param%use_absolute_position = colvar_in%xyz_diag_param%use_absolute_position
    1550             :       CASE (xyz_outerdiag_colvar_id)
    1551          72 :          colvar_out%xyz_outerdiag_param%i_atoms = colvar_in%xyz_outerdiag_param%i_atoms + my_offset
    1552          72 :          colvar_out%xyz_outerdiag_param%components = colvar_in%xyz_outerdiag_param%components
    1553         216 :          colvar_out%xyz_outerdiag_param%r0 = colvar_in%xyz_outerdiag_param%r0
    1554          24 :          colvar_out%xyz_outerdiag_param%use_pbc = colvar_in%xyz_outerdiag_param%use_pbc
    1555             :       CASE (u_colvar_id)
    1556           0 :          colvar_out%u_param%natom = colvar_in%u_param%natom
    1557             :       CASE (hydronium_shell_colvar_id)
    1558           0 :          colvar_out%hydronium_shell_param%n_hydrogens = colvar_in%hydronium_shell_param%n_hydrogens
    1559           0 :          colvar_out%hydronium_shell_param%n_oxygens = colvar_in%hydronium_shell_param%n_oxygens
    1560           0 :          colvar_out%hydronium_shell_param%nh = colvar_in%hydronium_shell_param%nh
    1561           0 :          colvar_out%hydronium_shell_param%poh = colvar_in%hydronium_shell_param%poh
    1562           0 :          colvar_out%hydronium_shell_param%poo = colvar_in%hydronium_shell_param%poo
    1563           0 :          colvar_out%hydronium_shell_param%qoh = colvar_in%hydronium_shell_param%qoh
    1564           0 :          colvar_out%hydronium_shell_param%qoo = colvar_in%hydronium_shell_param%qoo
    1565           0 :          colvar_out%hydronium_shell_param%pm = colvar_in%hydronium_shell_param%pm
    1566           0 :          colvar_out%hydronium_shell_param%qm = colvar_in%hydronium_shell_param%qm
    1567           0 :          colvar_out%hydronium_shell_param%roo = colvar_in%hydronium_shell_param%roo
    1568           0 :          colvar_out%hydronium_shell_param%roh = colvar_in%hydronium_shell_param%roh
    1569           0 :          colvar_out%hydronium_shell_param%lambda = colvar_in%hydronium_shell_param%lambda
    1570           0 :          ndim = SIZE(colvar_in%hydronium_shell_param%i_oxygens)
    1571           0 :          ALLOCATE (colvar_out%hydronium_shell_param%i_oxygens(ndim))
    1572           0 :          ndim = SIZE(colvar_in%hydronium_shell_param%i_hydrogens)
    1573           0 :          ALLOCATE (colvar_out%hydronium_shell_param%i_hydrogens(ndim))
    1574           0 :          colvar_out%hydronium_shell_param%i_oxygens = colvar_in%hydronium_shell_param%i_oxygens + my_offset
    1575           0 :          colvar_out%hydronium_shell_param%i_hydrogens = colvar_in%hydronium_shell_param%i_hydrogens + my_offset
    1576             :       CASE (hydronium_dist_colvar_id)
    1577           0 :          colvar_out%hydronium_dist_param%n_hydrogens = colvar_in%hydronium_dist_param%n_hydrogens
    1578           0 :          colvar_out%hydronium_dist_param%n_oxygens = colvar_in%hydronium_dist_param%n_oxygens
    1579           0 :          colvar_out%hydronium_dist_param%nh = colvar_in%hydronium_dist_param%nh
    1580           0 :          colvar_out%hydronium_dist_param%nn = colvar_in%hydronium_dist_param%nn
    1581           0 :          colvar_out%hydronium_dist_param%poh = colvar_in%hydronium_dist_param%poh
    1582           0 :          colvar_out%hydronium_dist_param%qoh = colvar_in%hydronium_dist_param%qoh
    1583           0 :          colvar_out%hydronium_dist_param%pf = colvar_in%hydronium_dist_param%pf
    1584           0 :          colvar_out%hydronium_dist_param%qf = colvar_in%hydronium_dist_param%qf
    1585           0 :          colvar_out%hydronium_dist_param%pm = colvar_in%hydronium_dist_param%pm
    1586           0 :          colvar_out%hydronium_dist_param%qm = colvar_in%hydronium_dist_param%qm
    1587           0 :          colvar_out%hydronium_dist_param%roh = colvar_in%hydronium_dist_param%roh
    1588           0 :          colvar_out%hydronium_dist_param%lambda = colvar_in%hydronium_dist_param%lambda
    1589           0 :          ndim = SIZE(colvar_in%hydronium_dist_param%i_oxygens)
    1590           0 :          ALLOCATE (colvar_out%hydronium_dist_param%i_oxygens(ndim))
    1591           0 :          ndim = SIZE(colvar_in%hydronium_dist_param%i_hydrogens)
    1592           0 :          ALLOCATE (colvar_out%hydronium_dist_param%i_hydrogens(ndim))
    1593           0 :          colvar_out%hydronium_dist_param%i_oxygens = colvar_in%hydronium_dist_param%i_oxygens + my_offset
    1594           0 :          colvar_out%hydronium_dist_param%i_hydrogens = colvar_in%hydronium_dist_param%i_hydrogens + my_offset
    1595             :       CASE (acid_hyd_dist_colvar_id)
    1596           0 :          colvar_out%acid_hyd_dist_param%n_hydrogens = colvar_in%acid_hyd_dist_param%n_hydrogens
    1597           0 :          colvar_out%acid_hyd_dist_param%n_oxygens_water = colvar_in%acid_hyd_dist_param%n_oxygens_water
    1598           0 :          colvar_out%acid_hyd_dist_param%n_oxygens_acid = colvar_in%acid_hyd_dist_param%n_oxygens_acid
    1599           0 :          colvar_out%acid_hyd_dist_param%nc = colvar_in%acid_hyd_dist_param%nc
    1600           0 :          colvar_out%acid_hyd_dist_param%pwoh = colvar_in%acid_hyd_dist_param%pwoh
    1601           0 :          colvar_out%acid_hyd_dist_param%qwoh = colvar_in%acid_hyd_dist_param%qwoh
    1602           0 :          colvar_out%acid_hyd_dist_param%paoh = colvar_in%acid_hyd_dist_param%paoh
    1603           0 :          colvar_out%acid_hyd_dist_param%qaoh = colvar_in%acid_hyd_dist_param%qaoh
    1604           0 :          colvar_out%acid_hyd_dist_param%pcut = colvar_in%acid_hyd_dist_param%pcut
    1605           0 :          colvar_out%acid_hyd_dist_param%qcut = colvar_in%acid_hyd_dist_param%qcut
    1606           0 :          colvar_out%acid_hyd_dist_param%rwoh = colvar_in%acid_hyd_dist_param%rwoh
    1607           0 :          colvar_out%acid_hyd_dist_param%raoh = colvar_in%acid_hyd_dist_param%raoh
    1608           0 :          colvar_out%acid_hyd_dist_param%lambda = colvar_in%acid_hyd_dist_param%lambda
    1609           0 :          ndim = SIZE(colvar_in%acid_hyd_dist_param%i_oxygens_water)
    1610           0 :          ALLOCATE (colvar_out%acid_hyd_dist_param%i_oxygens_water(ndim))
    1611           0 :          ndim = SIZE(colvar_in%acid_hyd_dist_param%i_oxygens_acid)
    1612           0 :          ALLOCATE (colvar_out%acid_hyd_dist_param%i_oxygens_acid(ndim))
    1613           0 :          ndim = SIZE(colvar_in%acid_hyd_dist_param%i_hydrogens)
    1614           0 :          ALLOCATE (colvar_out%acid_hyd_dist_param%i_hydrogens(ndim))
    1615           0 :          colvar_out%acid_hyd_dist_param%i_oxygens_water = colvar_in%acid_hyd_dist_param%i_oxygens_water + my_offset
    1616           0 :          colvar_out%acid_hyd_dist_param%i_oxygens_acid = colvar_in%acid_hyd_dist_param%i_oxygens_acid + my_offset
    1617           0 :          colvar_out%acid_hyd_dist_param%i_hydrogens = colvar_in%acid_hyd_dist_param%i_hydrogens + my_offset
    1618             :       CASE (acid_hyd_shell_colvar_id)
    1619           0 :          colvar_out%acid_hyd_shell_param%n_hydrogens = colvar_in%acid_hyd_shell_param%n_hydrogens
    1620           0 :          colvar_out%acid_hyd_shell_param%n_oxygens_water = colvar_in%acid_hyd_shell_param%n_oxygens_water
    1621           0 :          colvar_out%acid_hyd_shell_param%n_oxygens_acid = colvar_in%acid_hyd_shell_param%n_oxygens_acid
    1622           0 :          colvar_out%acid_hyd_shell_param%nc = colvar_in%acid_hyd_shell_param%nc
    1623           0 :          colvar_out%acid_hyd_shell_param%nh = colvar_in%acid_hyd_shell_param%nh
    1624           0 :          colvar_out%acid_hyd_shell_param%pwoh = colvar_in%acid_hyd_shell_param%pwoh
    1625           0 :          colvar_out%acid_hyd_shell_param%qwoh = colvar_in%acid_hyd_shell_param%qwoh
    1626           0 :          colvar_out%acid_hyd_shell_param%paoh = colvar_in%acid_hyd_shell_param%paoh
    1627           0 :          colvar_out%acid_hyd_shell_param%qaoh = colvar_in%acid_hyd_shell_param%qaoh
    1628           0 :          colvar_out%acid_hyd_shell_param%poo = colvar_in%acid_hyd_shell_param%poo
    1629           0 :          colvar_out%acid_hyd_shell_param%qoo = colvar_in%acid_hyd_shell_param%qoo
    1630           0 :          colvar_out%acid_hyd_shell_param%pm = colvar_in%acid_hyd_shell_param%pm
    1631           0 :          colvar_out%acid_hyd_shell_param%qm = colvar_in%acid_hyd_shell_param%qm
    1632           0 :          colvar_out%acid_hyd_shell_param%pcut = colvar_in%acid_hyd_shell_param%pcut
    1633           0 :          colvar_out%acid_hyd_shell_param%qcut = colvar_in%acid_hyd_shell_param%qcut
    1634           0 :          colvar_out%acid_hyd_shell_param%rwoh = colvar_in%acid_hyd_shell_param%rwoh
    1635           0 :          colvar_out%acid_hyd_shell_param%raoh = colvar_in%acid_hyd_shell_param%raoh
    1636           0 :          colvar_out%acid_hyd_shell_param%roo = colvar_in%acid_hyd_shell_param%roo
    1637           0 :          colvar_out%acid_hyd_shell_param%lambda = colvar_in%acid_hyd_shell_param%lambda
    1638           0 :          ndim = SIZE(colvar_in%acid_hyd_shell_param%i_oxygens_water)
    1639           0 :          ALLOCATE (colvar_out%acid_hyd_shell_param%i_oxygens_water(ndim))
    1640           0 :          ndim = SIZE(colvar_in%acid_hyd_shell_param%i_oxygens_acid)
    1641           0 :          ALLOCATE (colvar_out%acid_hyd_shell_param%i_oxygens_acid(ndim))
    1642           0 :          ndim = SIZE(colvar_in%acid_hyd_shell_param%i_hydrogens)
    1643           0 :          ALLOCATE (colvar_out%acid_hyd_shell_param%i_hydrogens(ndim))
    1644           0 :          colvar_out%acid_hyd_shell_param%i_oxygens_water = colvar_in%acid_hyd_shell_param%i_oxygens_water + my_offset
    1645           0 :          colvar_out%acid_hyd_shell_param%i_oxygens_acid = colvar_in%acid_hyd_shell_param%i_oxygens_acid + my_offset
    1646           0 :          colvar_out%acid_hyd_shell_param%i_hydrogens = colvar_in%acid_hyd_shell_param%i_hydrogens + my_offset
    1647             :       CASE (reaction_path_colvar_id, distance_from_path_colvar_id)
    1648           6 :          colvar_out%reaction_path_param%dist_rmsd = colvar_in%reaction_path_param%dist_rmsd
    1649           6 :          colvar_out%reaction_path_param%rmsd = colvar_in%reaction_path_param%rmsd
    1650           6 :          colvar_out%reaction_path_param%nr_frames = colvar_in%reaction_path_param%nr_frames
    1651           6 :          IF (colvar_in%reaction_path_param%dist_rmsd .OR. colvar_in%reaction_path_param%rmsd) THEN
    1652           0 :             colvar_out%reaction_path_param%align_frames = colvar_in%reaction_path_param%align_frames
    1653           0 :             colvar_out%reaction_path_param%subset = colvar_in%reaction_path_param%subset
    1654           0 :             NULLIFY (colvar_out%reaction_path_param%i_rmsd)
    1655           0 :             NULLIFY (colvar_out%reaction_path_param%r_ref)
    1656           0 :             ndim = SIZE(colvar_in%reaction_path_param%i_rmsd)
    1657           0 :             ALLOCATE (colvar_out%reaction_path_param%i_rmsd(ndim), stat=stat)
    1658           0 :             colvar_out%reaction_path_param%i_rmsd = colvar_in%reaction_path_param%i_rmsd
    1659           0 :             ndim = SIZE(colvar_in%reaction_path_param%r_ref, 1)
    1660           0 :             ndim2 = SIZE(colvar_in%reaction_path_param%r_ref, 2)
    1661           0 :             ALLOCATE (colvar_out%reaction_path_param%r_ref(ndim, ndim2), stat=stat)
    1662           0 :             colvar_out%reaction_path_param%r_ref = colvar_in%reaction_path_param%r_ref
    1663             :          ELSE
    1664           6 :             ndim = SIZE(colvar_in%reaction_path_param%colvar_p)
    1665          18 :             ALLOCATE (colvar_out%reaction_path_param%colvar_p(ndim))
    1666          18 :             DO i = 1, ndim
    1667          12 :                NULLIFY (colvar_out%reaction_path_param%colvar_p(i)%colvar)
    1668             :                CALL colvar_clone(colvar_out%reaction_path_param%colvar_p(i)%colvar, &
    1669             :                                  colvar_in%reaction_path_param%colvar_p(i)%colvar, &
    1670          18 :                                  my_offset)
    1671             :             END DO
    1672          18 :             colvar_out%reaction_path_param%function_bounds = colvar_in%reaction_path_param%function_bounds
    1673           6 :             NULLIFY (colvar_out%reaction_path_param%f_vals)
    1674           6 :             ndim = SIZE(colvar_in%reaction_path_param%f_vals, 1)
    1675           6 :             ndim2 = SIZE(colvar_in%reaction_path_param%f_vals, 2)
    1676          24 :             ALLOCATE (colvar_out%reaction_path_param%f_vals(ndim, ndim2))
    1677       70224 :             colvar_out%reaction_path_param%f_vals = colvar_in%reaction_path_param%f_vals
    1678             :          END IF
    1679           6 :          colvar_out%reaction_path_param%step_size = colvar_in%reaction_path_param%step_size
    1680           6 :          colvar_out%reaction_path_param%n_components = colvar_in%reaction_path_param%n_components
    1681           6 :          colvar_out%reaction_path_param%lambda = colvar_in%reaction_path_param%lambda
    1682             :       CASE (combine_colvar_id)
    1683           8 :          ndim = SIZE(colvar_in%combine_cvs_param%colvar_p)
    1684          24 :          ALLOCATE (colvar_out%combine_cvs_param%colvar_p(ndim))
    1685          24 :          DO i = 1, ndim
    1686          16 :             NULLIFY (colvar_out%combine_cvs_param%colvar_p(i)%colvar)
    1687             :             CALL colvar_clone(colvar_out%combine_cvs_param%colvar_p(i)%colvar, &
    1688             :                               colvar_in%combine_cvs_param%colvar_p(i)%colvar, &
    1689          24 :                               my_offset)
    1690             :          END DO
    1691           8 :          colvar_out%combine_cvs_param%lerr = colvar_in%combine_cvs_param%lerr
    1692           8 :          colvar_out%combine_cvs_param%dx = colvar_in%combine_cvs_param%dx
    1693           8 :          colvar_out%combine_cvs_param%function = colvar_in%combine_cvs_param%function
    1694             :          !
    1695           8 :          ndim = SIZE(colvar_in%combine_cvs_param%c_parameters)
    1696          24 :          ALLOCATE (colvar_out%combine_cvs_param%c_parameters(ndim))
    1697          16 :          colvar_out%combine_cvs_param%c_parameters = colvar_in%combine_cvs_param%c_parameters
    1698             :          !
    1699           8 :          ndim = SIZE(colvar_in%combine_cvs_param%v_parameters)
    1700          24 :          ALLOCATE (colvar_out%combine_cvs_param%v_parameters(ndim))
    1701          16 :          colvar_out%combine_cvs_param%v_parameters = colvar_in%combine_cvs_param%v_parameters
    1702             :          !
    1703           8 :          ndim = SIZE(colvar_in%combine_cvs_param%variables)
    1704          24 :          ALLOCATE (colvar_out%combine_cvs_param%variables(ndim))
    1705          24 :          colvar_out%combine_cvs_param%variables = colvar_in%combine_cvs_param%variables
    1706             :       CASE (rmsd_colvar_id)
    1707           0 :          colvar_out%rmsd_param%n_atoms = colvar_in%rmsd_param%n_atoms
    1708           0 :          colvar_out%rmsd_param%align_frames = colvar_in%rmsd_param%align_frames
    1709           0 :          colvar_out%rmsd_param%nr_frames = colvar_in%rmsd_param%nr_frames
    1710           0 :          colvar_out%rmsd_param%subset = colvar_in%rmsd_param%subset
    1711           0 :          NULLIFY (colvar_out%rmsd_param%i_rmsd)
    1712           0 :          NULLIFY (colvar_out%rmsd_param%weights)
    1713           0 :          NULLIFY (colvar_out%rmsd_param%r_ref)
    1714             :          ! INDEX
    1715           0 :          ndim = SIZE(colvar_in%rmsd_param%i_rmsd)
    1716           0 :          ALLOCATE (colvar_out%rmsd_param%i_rmsd(ndim))
    1717           0 :          colvar_out%rmsd_param%i_rmsd = colvar_in%rmsd_param%i_rmsd + my_offset
    1718             :          ! A and Bconfigurations and weights
    1719           0 :          ndim = SIZE(colvar_in%rmsd_param%weights)
    1720           0 :          ALLOCATE (colvar_out%rmsd_param%weights(ndim))
    1721           0 :          colvar_out%rmsd_param%weights = colvar_in%rmsd_param%weights
    1722           0 :          ndim = SIZE(colvar_in%rmsd_param%r_ref, 1)
    1723           0 :          ndim2 = SIZE(colvar_in%rmsd_param%r_ref, 2)
    1724           0 :          ALLOCATE (colvar_out%rmsd_param%r_ref(ndim, ndim2))
    1725           0 :          colvar_out%rmsd_param%r_ref = colvar_in%rmsd_param%r_ref
    1726             :       CASE (Wc_colvar_id)
    1727           0 :          colvar_out%Wc%ids = colvar_in%Wc%ids + my_offset
    1728           0 :          colvar_out%Wc%rcut = colvar_in%Wc%rcut
    1729             :       CASE (HBP_colvar_id)
    1730           0 :          ndim = colvar_out%HBP%nPoints
    1731           0 :          ALLOCATE (colvar_out%HBP%ids(ndim, 3))
    1732           0 :          ALLOCATE (colvar_out%HBP%ewc(ndim))
    1733           0 :          colvar_out%HBP%ids = colvar_in%HBP%ids + my_offset
    1734           0 :          colvar_out%HBP%ewc = colvar_in%HBP%ewc + my_offset
    1735           0 :          colvar_out%HBP%nPoints = colvar_in%HBP%nPoints
    1736           0 :          colvar_out%HBP%rcut = colvar_in%HBP%rcut
    1737           0 :          colvar_out%HBP%shift = colvar_in%HBP%shift
    1738             :       CASE (ring_puckering_colvar_id)
    1739           0 :          ndim = colvar_in%ring_puckering_param%nring
    1740           0 :          colvar_out%ring_puckering_param%nring = colvar_in%ring_puckering_param%nring
    1741           0 :          colvar_out%ring_puckering_param%iq = colvar_in%ring_puckering_param%iq
    1742           0 :          ALLOCATE (colvar_out%ring_puckering_param%atoms(ndim))
    1743           0 :          colvar_out%ring_puckering_param%atoms = colvar_in%ring_puckering_param%atoms + my_offset
    1744             :       CASE (mindist_colvar_id)
    1745           0 :          colvar_out%mindist_param%n_dist_from = colvar_in%mindist_param%n_dist_from
    1746           0 :          colvar_out%mindist_param%n_coord_to = colvar_in%mindist_param%n_coord_to
    1747           0 :          colvar_out%mindist_param%n_coord_from = colvar_in%mindist_param%n_coord_from
    1748           0 :          colvar_out%mindist_param%p_exp = colvar_in%mindist_param%p_exp
    1749           0 :          colvar_out%mindist_param%q_exp = colvar_in%mindist_param%q_exp
    1750           0 :          colvar_out%mindist_param%r_cut = colvar_in%mindist_param%r_cut
    1751           0 :          colvar_out%mindist_param%lambda = colvar_in%mindist_param%lambda
    1752           0 :          colvar_out%mindist_param%use_kinds_from = colvar_in%mindist_param%use_kinds_from
    1753           0 :          colvar_out%mindist_param%use_kinds_to = colvar_in%mindist_param%use_kinds_to
    1754           0 :          NULLIFY (colvar_out%mindist_param%k_coord_from, colvar_out%mindist_param%i_coord_from)
    1755           0 :          NULLIFY (colvar_out%mindist_param%k_coord_to, colvar_out%mindist_param%i_coord_to)
    1756           0 :          NULLIFY (colvar_out%mindist_param%i_dist_from)
    1757             :          ! INDEX
    1758           0 :          ndim = SIZE(colvar_in%mindist_param%i_dist_from)
    1759           0 :          ALLOCATE (colvar_out%mindist_param%i_dist_from(ndim))
    1760           0 :          colvar_out%mindist_param%i_dist_from = colvar_in%mindist_param%i_dist_from + my_offset
    1761           0 :          IF (colvar_in%mindist_param%use_kinds_from) THEN
    1762             :             ! KINDS
    1763           0 :             ndim = SIZE(colvar_in%mindist_param%k_coord_from)
    1764           0 :             ALLOCATE (colvar_out%mindist_param%k_coord_from(ndim))
    1765           0 :             colvar_out%mindist_param%k_coord_from = colvar_in%mindist_param%k_coord_from
    1766             :          ELSE
    1767             :             ! INDEX
    1768           0 :             ndim = SIZE(colvar_in%mindist_param%i_coord_from)
    1769           0 :             ALLOCATE (colvar_out%mindist_param%i_coord_from(ndim))
    1770           0 :             colvar_out%mindist_param%i_coord_from = colvar_in%mindist_param%i_coord_from + my_offset
    1771             :          END IF
    1772        4986 :          IF (colvar_in%mindist_param%use_kinds_to) THEN
    1773             :             ! KINDS
    1774           0 :             ndim = SIZE(colvar_in%mindist_param%k_coord_to)
    1775           0 :             ALLOCATE (colvar_out%mindist_param%k_coord_to(ndim))
    1776           0 :             colvar_out%mindist_param%k_coord_to = colvar_in%mindist_param%k_coord_to
    1777             :          ELSE
    1778             :             ! INDEX
    1779           0 :             ndim = SIZE(colvar_in%mindist_param%i_coord_to)
    1780           0 :             ALLOCATE (colvar_out%mindist_param%i_coord_to(ndim))
    1781           0 :             colvar_out%mindist_param%i_coord_to = colvar_in%mindist_param%i_coord_to + my_offset
    1782             :          END IF
    1783             : 
    1784             :       END SELECT
    1785        4986 :       CALL colvar_setup(colvar_out)
    1786        4986 :    END SUBROUTINE colvar_clone
    1787             : 
    1788             : ! **************************************************************************************************
    1789             : !> \brief Clone points type of a colvar type
    1790             : !> \param colvar_out ...
    1791             : !> \param colvar_in the colvar to deallocate
    1792             : !> \param offset ...
    1793             : !> \author Teodoro Laino [tlaino] 03.2007
    1794             : ! **************************************************************************************************
    1795        4986 :    SUBROUTINE colvar_clone_points(colvar_out, colvar_in, offset)
    1796             :       TYPE(colvar_type), INTENT(INOUT)                   :: colvar_out
    1797             :       TYPE(colvar_type), INTENT(IN)                      :: colvar_in
    1798             :       INTEGER, INTENT(IN)                                :: offset
    1799             : 
    1800             :       INTEGER                                            :: i, natoms, npoints
    1801             : 
    1802        4986 :       colvar_out%use_points = colvar_in%use_points
    1803        4986 :       IF (colvar_in%use_points) THEN
    1804          74 :          CPASSERT(ASSOCIATED(colvar_in%points))
    1805          74 :          npoints = SIZE(colvar_in%points)
    1806         222 :          ALLOCATE (colvar_out%points(npoints))
    1807         264 :          DO i = 1, npoints
    1808         190 :             IF (ASSOCIATED(colvar_in%points(i)%atoms)) THEN
    1809         182 :                natoms = SIZE(colvar_in%points(i)%atoms)
    1810         546 :                ALLOCATE (colvar_out%points(i)%atoms(natoms))
    1811         444 :                colvar_out%points(i)%atoms = colvar_in%points(i)%atoms + offset
    1812             :             ELSE
    1813           8 :                NULLIFY (colvar_out%points(i)%atoms)
    1814             :             END IF
    1815         190 :             IF (ASSOCIATED(colvar_in%points(i)%weights)) THEN
    1816         182 :                natoms = SIZE(colvar_in%points(i)%weights)
    1817         546 :                ALLOCATE (colvar_out%points(i)%weights(natoms))
    1818         444 :                colvar_out%points(i)%weights = colvar_in%points(i)%weights
    1819             :             ELSE
    1820           8 :                NULLIFY (colvar_out%points(i)%weights)
    1821             :             END IF
    1822         190 :             colvar_out%points(i)%type_id = colvar_in%points(i)%type_id
    1823         834 :             colvar_out%points(i)%r = colvar_in%points(i)%r
    1824             :          END DO
    1825             :       ELSE
    1826        4912 :          NULLIFY (colvar_out%points)
    1827             :       END IF
    1828             : 
    1829        4986 :    END SUBROUTINE colvar_clone_points
    1830             : 
    1831             : ! **************************************************************************************************
    1832             : !> \brief Change the dimension of a colvar_p_type
    1833             : !> \param colvar_set ...
    1834             : !> \param lb1_new ...
    1835             : !> \param ub1_new ...
    1836             : !> \author Teodoro Laino [tlaino] 04.2006
    1837             : ! **************************************************************************************************
    1838          16 :    SUBROUTINE colvar_p_reallocate(colvar_set, lb1_new, ub1_new)
    1839             :       TYPE(colvar_p_type), DIMENSION(:), POINTER         :: colvar_set
    1840             :       INTEGER, INTENT(IN)                                :: lb1_new, ub1_new
    1841             : 
    1842             :       INTEGER                                            :: j, lb1, lb1_old, ub1, ub1_old
    1843          16 :       TYPE(colvar_p_type), DIMENSION(:), POINTER         :: work
    1844             : 
    1845          16 :       NULLIFY (work)
    1846          16 :       IF (ASSOCIATED(colvar_set)) THEN
    1847           0 :          lb1_old = LBOUND(colvar_set, 1)
    1848           0 :          ub1_old = UBOUND(colvar_set, 1)
    1849           0 :          lb1 = MAX(lb1_new, lb1_old)
    1850           0 :          ub1 = MIN(ub1_new, ub1_old)
    1851           0 :          ALLOCATE (work(lb1:ub1))
    1852           0 :          DO j = lb1, ub1
    1853           0 :             NULLIFY (work(j)%colvar)
    1854           0 :             CALL colvar_clone(work(j)%colvar, colvar_set(j)%colvar)
    1855             :          END DO
    1856           0 :          DO j = lb1, ub1
    1857           0 :             CALL colvar_release(colvar_set(j)%colvar)
    1858           0 :             NULLIFY (colvar_set(j)%colvar)
    1859             :          END DO
    1860           0 :          DEALLOCATE (colvar_set)
    1861             :       END IF
    1862             : 
    1863          48 :       ALLOCATE (colvar_set(lb1_new:ub1_new))
    1864             : 
    1865         196 :       DO j = lb1_new, ub1_new
    1866         196 :          NULLIFY (colvar_set(j)%colvar)
    1867             :       END DO
    1868          16 :       IF (ASSOCIATED(work)) THEN
    1869           0 :          lb1 = MAX(lb1_new, lb1_old)
    1870           0 :          ub1 = MIN(ub1_new, ub1_old)
    1871           0 :          DO j = lb1, ub1
    1872           0 :             CALL colvar_clone(colvar_set(j)%colvar, work(j)%colvar)
    1873             :          END DO
    1874           0 :          DO j = lb1, ub1
    1875           0 :             CALL colvar_release(work(j)%colvar)
    1876           0 :             NULLIFY (work(j)%colvar)
    1877             :          END DO
    1878           0 :          DEALLOCATE (work)
    1879             :       END IF
    1880          16 :    END SUBROUTINE colvar_p_reallocate
    1881             : 
    1882             : ! **************************************************************************************************
    1883             : !> \brief Deallocate a set of colvar_p_type
    1884             : !> \param colvar_p ...
    1885             : !> \par History
    1886             : !>      07.2003 created [fawzi]
    1887             : !>      01.2014 moved from cp_subsys_release() into separate routine.
    1888             : !> \author Ole Schuett
    1889             : ! **************************************************************************************************
    1890        8586 :    SUBROUTINE colvar_p_release(colvar_p)
    1891             :       TYPE(colvar_p_type), DIMENSION(:), POINTER         :: colvar_p
    1892             : 
    1893             :       INTEGER                                            :: i
    1894             : 
    1895             : ! Colvar info
    1896             : 
    1897        8586 :       IF (ASSOCIATED(colvar_p)) THEN
    1898        8519 :          DO i = 1, SIZE(colvar_p)
    1899         462 :             IF (ASSOCIATED(colvar_p(i)%colvar)) &
    1900        8519 :                CALL colvar_release(colvar_p(i)%colvar)
    1901             :          END DO
    1902        8057 :          DEALLOCATE (colvar_p)
    1903             :       END IF
    1904        8586 :    END SUBROUTINE colvar_p_release
    1905             : 
    1906             : ! **************************************************************************************************
    1907             : !> \brief Evaluate the position of the geometrical point
    1908             : !> \param point ...
    1909             : !> \param particles ...
    1910             : !> \param r ...
    1911             : !> \author Teodoro Laino - 03.2007
    1912             : ! **************************************************************************************************
    1913        8644 :    SUBROUTINE eval_point_pos(point, particles, r)
    1914             :       TYPE(point_type), INTENT(IN)                       :: point
    1915             :       TYPE(particle_type), DIMENSION(:), INTENT(IN)      :: particles
    1916             :       REAL(KIND=dp), DIMENSION(3), INTENT(OUT)           :: r
    1917             : 
    1918             :       INTEGER                                            :: i
    1919             : 
    1920       17186 :       SELECT CASE (point%type_id)
    1921             :       CASE (do_clv_geo_center)
    1922        8542 :          r = 0.0_dp
    1923       18088 :          DO i = 1, SIZE(point%atoms)
    1924       46726 :             r = r + particles(point%atoms(i))%r*point%weights(i)
    1925             :          END DO
    1926             :       CASE (do_clv_fix_point)
    1927        9052 :          r = point%r
    1928             :       END SELECT
    1929             : 
    1930        8644 :    END SUBROUTINE eval_point_pos
    1931             : 
    1932             : ! **************************************************************************************************
    1933             : !> \brief ...
    1934             : !> \param point ...
    1935             : !> \param particles ...
    1936             : !> \param m ...
    1937             : ! **************************************************************************************************
    1938           0 :    SUBROUTINE eval_point_mass(point, particles, m)
    1939             :       TYPE(point_type), INTENT(IN)                       :: point
    1940             :       TYPE(particle_type), DIMENSION(:), INTENT(IN)      :: particles
    1941             :       REAL(KIND=dp), INTENT(OUT)                         :: m
    1942             : 
    1943             :       INTEGER                                            :: i
    1944             : 
    1945           0 :       SELECT CASE (point%type_id)
    1946             :       CASE (do_clv_geo_center)
    1947           0 :          m = 0.0_dp
    1948           0 :          DO i = 1, SIZE(point%atoms)
    1949           0 :             m = m + particles(point%atoms(i))%atomic_kind%mass*point%weights(i)
    1950             :          END DO
    1951             :       CASE (do_clv_fix_point)
    1952           0 :          m = 0.0_dp
    1953             :       END SELECT
    1954             : 
    1955           0 :    END SUBROUTINE eval_point_mass
    1956             : 
    1957             : ! **************************************************************************************************
    1958             : !> \brief Evaluate the position of the geometrical point
    1959             : !> \param points ...
    1960             : !> \param i ...
    1961             : !> \param dsdr ...
    1962             : !> \param f ...
    1963             : !> \author Teodoro Laino - 03.2007
    1964             : ! **************************************************************************************************
    1965        8664 :    SUBROUTINE eval_point_der(points, i, dsdr, f)
    1966             :       TYPE(point_type), DIMENSION(:), INTENT(IN)         :: points
    1967             :       INTEGER, INTENT(IN)                                :: i
    1968             :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: dsdr
    1969             :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: f
    1970             : 
    1971             :       INTEGER                                            :: ind, j
    1972             :       REAL(KIND=dp)                                      :: fac
    1973             : 
    1974        8664 :       SELECT CASE (points(i)%type_id)
    1975             :       CASE (do_clv_geo_center)
    1976             :          ind = 0
    1977       17054 :          DO j = 1, i - 1
    1978       17054 :             IF (ASSOCIATED(points(j)%atoms)) THEN
    1979        8492 :                ind = ind + SIZE(points(j)%atoms)
    1980             :             END IF
    1981             :          END DO
    1982       26792 :          DO j = 1, SIZE(points(i)%atoms)
    1983        9566 :             fac = points(i)%weights(j)
    1984       46826 :             dsdr(:, ind + j) = dsdr(:, ind + j) + f*fac
    1985             :          END DO
    1986             :       CASE (do_clv_fix_point)
    1987             :          ! Do nothing if it's a fixed point in space
    1988             :       END SELECT
    1989             : 
    1990        8664 :    END SUBROUTINE eval_point_der
    1991             : 
    1992             : ! **************************************************************************************************
    1993             : !> \brief subtract b from the ss value of a colvar: general function for handling
    1994             : !>        periodic/non-periodic colvar
    1995             : !> \param colvar ...
    1996             : !> \param b ...
    1997             : !> \return ...
    1998             : !> \author Teodoro Laino [tlaino] - University of Zurich 10.2008
    1999             : ! **************************************************************************************************
    2000      366739 :    FUNCTION diff_colvar(colvar, b) RESULT(diff)
    2001             :       TYPE(colvar_type), INTENT(IN)                      :: colvar
    2002             :       REAL(KIND=dp), INTENT(IN)                          :: b
    2003             :       REAL(KIND=dp)                                      :: diff
    2004             : 
    2005      366739 :       diff = colvar%ss - b
    2006      366739 :       IF (colvar%type_id == torsion_colvar_id) THEN
    2007             :          ! The difference of a periodic COLVAR is always within [-pi,pi]
    2008        1584 :          diff = SIGN(1.0_dp, ASIN(SIN(diff)))*ACOS(COS(diff))
    2009             :       END IF
    2010      366739 :    END FUNCTION diff_colvar
    2011             : 
    2012           0 : END MODULE colvar_types

Generated by: LCOV version 1.15