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
|