(git:0761fd1)
Loading...
Searching...
No Matches
molecule_kind_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Define the molecule kind structure types and the corresponding
10!> functionality
11!> \par History
12!> Teodoro Laino [tlaino] 12.2008 - Preparing for VIRTUAL SITE constraints
13!> (patch by Marcel Baer)
14!> \author Matthias Krack (22.08.2003)
15! **************************************************************************************************
27 USE colvar_types, ONLY: &
41 USE force_field_kind_types, ONLY: &
46 USE kinds, ONLY: default_string_length,&
47 dp
49#include "../base/base_uses.f90"
50
51 IMPLICIT NONE
52
53 PRIVATE
54
55 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'molecule_kind_types'
56
57 ! Define the derived structure types
58
60 TYPE(atomic_kind_type), POINTER :: atomic_kind => null()
61 INTEGER :: id_name = 0
62 END TYPE atom_type
63
65 INTEGER :: a = 0
66 CHARACTER(LEN=default_string_length) :: name = ""
67 TYPE(shell_kind_type), POINTER :: shell_kind => null()
68 END TYPE shell_type
69
71 INTEGER :: a = 0, b = 0
72 INTEGER :: id_type = do_ff_undef, itype = 0
73 TYPE(bond_kind_type), POINTER :: bond_kind => null()
74 END TYPE bond_type
75
77 INTEGER :: a = 0, b = 0, c = 0
78 INTEGER :: id_type = do_ff_undef, itype = 0
79 TYPE(bend_kind_type), POINTER :: bend_kind => null()
80 END TYPE bend_type
81
83 INTEGER :: a = 0, b = 0, c = 0
84 INTEGER :: id_type = do_ff_undef, itype = 0
85 TYPE(ub_kind_type), POINTER :: ub_kind => null()
86 END TYPE ub_type
87
89 INTEGER :: a = 0, b = 0, c = 0, d = 0
90 INTEGER :: id_type = do_ff_undef, itype = 0
91 TYPE(torsion_kind_type), POINTER :: torsion_kind => null()
92 END TYPE torsion_type
93
95 INTEGER :: a = 0, b = 0, c = 0, d = 0
96 INTEGER :: id_type = do_ff_undef, itype = 0
97 TYPE(impr_kind_type), POINTER :: impr_kind => null()
98 END TYPE impr_type
99
101 INTEGER :: a = 0, b = 0, c = 0, d = 0
102 INTEGER :: id_type = do_ff_undef, itype = 0
103 TYPE(opbend_kind_type), POINTER :: opbend_kind => null()
104 END TYPE opbend_type
105
106 TYPE restraint_type
107 LOGICAL :: active = .false.
108 REAL(kind=dp) :: k0 = 0.0_dp
109 END TYPE restraint_type
110
111 ! Constraint types
113 INTEGER :: type_id = no_colvar_id
114 INTEGER :: inp_seq_num = 0
115 LOGICAL :: use_points = .false.
116 REAL(kind=dp) :: expected_value = 0.0_dp
117 REAL(kind=dp) :: expected_value_growth_speed = 0.0_dp
118 REAL(kind=dp) :: target_velocity = 0.0_dp
119 INTEGER, POINTER, DIMENSION(:) :: i_atoms => null()
120 TYPE(restraint_type) :: restraint = restraint_type()
122
124 INTEGER :: a = 0, b = 0, c = 0
125 REAL(kind=dp) :: dab = 0.0_dp, dac = 0.0_dp, dbc = 0.0_dp
126 TYPE(restraint_type) :: restraint = restraint_type()
127 END TYPE g3x3_constraint_type
128
130 INTEGER :: a = 0, b = 0, c = 0, d = 0
131 REAL(kind=dp) :: dab = 0.0_dp, dac = 0.0_dp, dbc = 0.0_dp, &
132 dad = 0.0_dp, dbd = 0.0_dp, dcd = 0.0_dp
133 TYPE(restraint_type) :: restraint = restraint_type()
134 END TYPE g4x6_constraint_type
135
137 INTEGER :: a = 0, b = 0, c = 0, d = 0
138 REAL(kind=dp) :: wbc = 0.0_dp, wdc = 0.0_dp
139 TYPE(restraint_type) :: restraint = restraint_type()
140 END TYPE vsite_constraint_type
141
143 TYPE(restraint_type) :: restraint = restraint_type()
144 INTEGER :: fixd = 0, itype = 0
145 REAL(kind=dp), DIMENSION(3) :: coord = 0.0_dp
146 END TYPE fixd_constraint_type
147
149 INTEGER :: ifixd_index = 0, ikind = 0
151
152 ! Molecule kind type
154 TYPE(atom_type), DIMENSION(:), POINTER :: atom_list => null()
155 TYPE(bond_kind_type), DIMENSION(:), POINTER :: bond_kind_set => null()
156 TYPE(bond_type), DIMENSION(:), POINTER :: bond_list => null()
157 TYPE(bend_kind_type), DIMENSION(:), POINTER :: bend_kind_set => null()
158 TYPE(bend_type), DIMENSION(:), POINTER :: bend_list => null()
159 TYPE(ub_kind_type), DIMENSION(:), POINTER :: ub_kind_set => null()
160 TYPE(ub_type), DIMENSION(:), POINTER :: ub_list => null()
161 TYPE(torsion_kind_type), DIMENSION(:), POINTER :: torsion_kind_set => null()
162 TYPE(torsion_type), DIMENSION(:), POINTER :: torsion_list => null()
163 TYPE(impr_kind_type), DIMENSION(:), POINTER :: impr_kind_set => null()
164 TYPE(impr_type), DIMENSION(:), POINTER :: impr_list => null()
165 TYPE(opbend_kind_type), DIMENSION(:), POINTER :: opbend_kind_set => null()
166 TYPE(opbend_type), DIMENSION(:), POINTER :: opbend_list => null()
167 TYPE(colvar_constraint_type), DIMENSION(:), &
168 POINTER :: colv_list => null()
169 TYPE(g3x3_constraint_type), DIMENSION(:), POINTER :: g3x3_list => null()
170 TYPE(g4x6_constraint_type), DIMENSION(:), POINTER :: g4x6_list => null()
171 TYPE(vsite_constraint_type), DIMENSION(:), POINTER :: vsite_list => null()
172 TYPE(fixd_constraint_type), DIMENSION(:), POINTER :: fixd_list => null()
173 TYPE(shell_type), DIMENSION(:), POINTER :: shell_list => null()
174 CHARACTER(LEN=default_string_length) :: name = ""
175 REAL(kind=dp) :: charge = 0.0_dp, &
176 mass = 0.0_dp
177 INTEGER :: kind_number = 0, &
178 natom = 0, &
179 nbond = 0, &
180 nbend = 0, &
181 nimpr = 0, &
182 nopbend = 0, &
183 ntorsion = 0, &
184 nub = 0, &
185 ng3x3 = 0, &
186 ng3x3_restraint = 0, &
187 ng4x6 = 0, &
188 ng4x6_restraint = 0, &
189 nvsite = 0, &
190 nvsite_restraint = 0, &
191 nfixd = 0, &
192 nfixd_restraint = 0, &
193 nmolecule = 0, &
194 nshell = 0
196 INTEGER :: nsgf = 0, &
197 nelectron = 0, &
198 nelectron_alpha = 0, &
199 nelectron_beta = 0
200 INTEGER, DIMENSION(:), POINTER :: molecule_list => null()
201 LOGICAL :: molname_generated = .false.
202 END TYPE molecule_kind_type
203
204 ! Public subroutines
205 PUBLIC :: allocate_molecule_kind_set, &
217
218 ! Public data types
219 PUBLIC :: atom_type, &
220 bend_type, &
221 bond_type, &
222 ub_type, &
223 torsion_type, &
224 impr_type, &
225 opbend_type, &
234
235CONTAINS
236
237! **************************************************************************************************
238!> \brief ...
239!> \param colv_list ...
240!> \param ncolv ...
241! **************************************************************************************************
242 SUBROUTINE setup_colvar_counters(colv_list, ncolv)
243 TYPE(colvar_constraint_type), DIMENSION(:), &
244 POINTER :: colv_list
245 TYPE(colvar_counters), INTENT(OUT) :: ncolv
246
247 INTEGER :: k
248
249 IF (ASSOCIATED(colv_list)) THEN
250 DO k = 1, SIZE(colv_list)
251 IF (colv_list(k)%restraint%active) ncolv%nrestraint = ncolv%nrestraint + 1
252 SELECT CASE (colv_list(k)%type_id)
253 CASE (angle_colvar_id)
254 ncolv%nangle = ncolv%nangle + 1
255 CASE (coord_colvar_id)
256 ncolv%ncoord = ncolv%ncoord + 1
258 ncolv%npopulation = ncolv%npopulation + 1
259 CASE (gyration_colvar_id)
260 ncolv%ngyration = ncolv%ngyration + 1
261 CASE (rotation_colvar_id)
262 ncolv%nrot = ncolv%nrot + 1
263 CASE (dist_colvar_id)
264 ncolv%ndist = ncolv%ndist + 1
265 CASE (dfunct_colvar_id)
266 ncolv%ndfunct = ncolv%ndfunct + 1
268 ncolv%nplane_dist = ncolv%nplane_dist + 1
270 ncolv%nplane_angle = ncolv%nplane_angle + 1
271 CASE (torsion_colvar_id)
272 ncolv%ntorsion = ncolv%ntorsion + 1
273 CASE (qparm_colvar_id)
274 ncolv%nqparm = ncolv%nqparm + 1
275 CASE (xyz_diag_colvar_id)
276 ncolv%nxyz_diag = ncolv%nxyz_diag + 1
278 ncolv%nxyz_outerdiag = ncolv%nxyz_outerdiag + 1
280 ncolv%nhydronium_shell = ncolv%nhydronium_shell + 1
282 ncolv%nhydronium_dist = ncolv%nhydronium_dist + 1
284 ncolv%nacid_hyd_dist = ncolv%nacid_hyd_dist + 1
286 ncolv%nacid_hyd_shell = ncolv%nacid_hyd_shell + 1
288 ncolv%nreactionpath = ncolv%nreactionpath + 1
289 CASE (combine_colvar_id)
290 ncolv%ncombinecvs = ncolv%ncombinecvs + 1
292 ncolv%nvoronoiipz = ncolv%nvoronoiipz + 1
293 CASE DEFAULT
294 cpabort("Unknown colvar type")
295 END SELECT
296 END DO
297 END IF
298 ncolv%ntot = ncolv%ndist + &
299 ncolv%nangle + &
300 ncolv%ntorsion + &
301 ncolv%ncoord + &
302 ncolv%nplane_dist + &
303 ncolv%nplane_angle + &
304 ncolv%ndfunct + &
305 ncolv%nrot + &
306 ncolv%nqparm + &
307 ncolv%nxyz_diag + &
308 ncolv%nxyz_outerdiag + &
309 ncolv%nhydronium_shell + &
310 ncolv%nhydronium_dist + &
311 ncolv%nacid_hyd_dist + &
312 ncolv%nacid_hyd_shell + &
313 ncolv%nreactionpath + &
314 ncolv%ncombinecvs + &
315 ncolv%npopulation + &
316 ncolv%ngyration + &
317 ncolv%nvoronoiipz
318
319 END SUBROUTINE setup_colvar_counters
320
321! **************************************************************************************************
322!> \brief Allocate and initialize a molecule kind set.
323!> \param molecule_kind_set ...
324!> \param nmolecule_kind ...
325!> \date 22.08.2003
326!> \author Matthias Krack
327!> \version 1.0
328! **************************************************************************************************
329 SUBROUTINE allocate_molecule_kind_set(molecule_kind_set, nmolecule_kind)
330 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
331 INTEGER, INTENT(IN) :: nmolecule_kind
332
333 INTEGER :: imolecule_kind
334
335 IF (ASSOCIATED(molecule_kind_set)) THEN
336 CALL deallocate_molecule_kind_set(molecule_kind_set)
337 END IF
338
339 ALLOCATE (molecule_kind_set(nmolecule_kind))
340
341 DO imolecule_kind = 1, nmolecule_kind
342 molecule_kind_set(imolecule_kind)%kind_number = imolecule_kind
343 CALL setup_colvar_counters(molecule_kind_set(imolecule_kind)%colv_list, &
344 molecule_kind_set(imolecule_kind)%ncolv)
345 END DO
346
347 END SUBROUTINE allocate_molecule_kind_set
348
349! **************************************************************************************************
350!> \brief Deallocate a molecule kind set.
351!> \param molecule_kind_set ...
352!> \date 22.08.2003
353!> \author Matthias Krack
354!> \version 1.0
355! **************************************************************************************************
356 SUBROUTINE deallocate_molecule_kind_set(molecule_kind_set)
357
358 TYPE(molecule_kind_type), DIMENSION(:), POINTER :: molecule_kind_set
359
360 INTEGER :: i, imolecule_kind, j, nmolecule_kind
361
362 IF (ASSOCIATED(molecule_kind_set)) THEN
363
364 nmolecule_kind = SIZE(molecule_kind_set)
365
366 DO imolecule_kind = 1, nmolecule_kind
367
368 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%atom_list)) THEN
369 DEALLOCATE (molecule_kind_set(imolecule_kind)%atom_list)
370 END IF
371 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%bend_kind_set)) THEN
372 DO i = 1, SIZE(molecule_kind_set(imolecule_kind)%bend_kind_set)
373 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%bend_kind_set(i)%legendre%coeffs)) THEN
374 DEALLOCATE (molecule_kind_set(imolecule_kind)%bend_kind_set(i)%legendre%coeffs)
375 END IF
376 END DO
377 DEALLOCATE (molecule_kind_set(imolecule_kind)%bend_kind_set)
378 END IF
379 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%bend_list)) THEN
380 DEALLOCATE (molecule_kind_set(imolecule_kind)%bend_list)
381 END IF
382 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%ub_list)) THEN
383 DEALLOCATE (molecule_kind_set(imolecule_kind)%ub_list)
384 END IF
385 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%ub_kind_set)) THEN
386 CALL ub_kind_dealloc_ref(molecule_kind_set(imolecule_kind)%ub_kind_set)
387 END IF
388 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%impr_list)) THEN
389 DEALLOCATE (molecule_kind_set(imolecule_kind)%impr_list)
390 END IF
391 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%impr_kind_set)) THEN
392 DO i = 1, SIZE(molecule_kind_set(imolecule_kind)%impr_kind_set)
393 CALL impr_kind_dealloc_ref() !This Subroutine doesn't deallocate anything, maybe needs to be implemented
394 END DO
395 DEALLOCATE (molecule_kind_set(imolecule_kind)%impr_kind_set)
396 END IF
397 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%opbend_list)) THEN
398 DEALLOCATE (molecule_kind_set(imolecule_kind)%opbend_list)
399 END IF
400 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%opbend_kind_set)) THEN
401 DEALLOCATE (molecule_kind_set(imolecule_kind)%opbend_kind_set)
402 END IF
403 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%bond_kind_set)) THEN
404 DEALLOCATE (molecule_kind_set(imolecule_kind)%bond_kind_set)
405 END IF
406 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%bond_list)) THEN
407 DEALLOCATE (molecule_kind_set(imolecule_kind)%bond_list)
408 END IF
409 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%colv_list)) THEN
410 DO j = 1, SIZE(molecule_kind_set(imolecule_kind)%colv_list)
411 DEALLOCATE (molecule_kind_set(imolecule_kind)%colv_list(j)%i_atoms)
412 END DO
413 DEALLOCATE (molecule_kind_set(imolecule_kind)%colv_list)
414 END IF
415 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%g3x3_list)) THEN
416 DEALLOCATE (molecule_kind_set(imolecule_kind)%g3x3_list)
417 END IF
418 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%g4x6_list)) THEN
419 DEALLOCATE (molecule_kind_set(imolecule_kind)%g4x6_list)
420 END IF
421 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%vsite_list)) THEN
422 DEALLOCATE (molecule_kind_set(imolecule_kind)%vsite_list)
423 END IF
424 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%fixd_list)) THEN
425 DEALLOCATE (molecule_kind_set(imolecule_kind)%fixd_list)
426 END IF
427 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%torsion_kind_set)) THEN
428 DO i = 1, SIZE(molecule_kind_set(imolecule_kind)%torsion_kind_set)
429 CALL torsion_kind_dealloc_ref(molecule_kind_set(imolecule_kind)%torsion_kind_set(i))
430 END DO
431 DEALLOCATE (molecule_kind_set(imolecule_kind)%torsion_kind_set)
432 END IF
433 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%shell_list)) THEN
434 DEALLOCATE (molecule_kind_set(imolecule_kind)%shell_list)
435 END IF
436 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%torsion_list)) THEN
437 DEALLOCATE (molecule_kind_set(imolecule_kind)%torsion_list)
438 END IF
439 IF (ASSOCIATED(molecule_kind_set(imolecule_kind)%molecule_list)) THEN
440 DEALLOCATE (molecule_kind_set(imolecule_kind)%molecule_list)
441 END IF
442 END DO
443
444 DEALLOCATE (molecule_kind_set)
445 END IF
446 NULLIFY (molecule_kind_set)
447
448 END SUBROUTINE deallocate_molecule_kind_set
449
450! **************************************************************************************************
451!> \brief Get informations about a molecule kind.
452!> \param molecule_kind ...
453!> \param atom_list ...
454!> \param bond_list ...
455!> \param bend_list ...
456!> \param ub_list ...
457!> \param impr_list ...
458!> \param opbend_list ...
459!> \param colv_list ...
460!> \param fixd_list ...
461!> \param g3x3_list ...
462!> \param g4x6_list ...
463!> \param vsite_list ...
464!> \param torsion_list ...
465!> \param shell_list ...
466!> \param name ...
467!> \param mass ...
468!> \param charge ...
469!> \param kind_number ...
470!> \param natom ...
471!> \param nbend ...
472!> \param nbond ...
473!> \param nub ...
474!> \param nimpr ...
475!> \param nopbend ...
476!> \param nconstraint ...
477!> \param nconstraint_fixd ...
478!> \param nfixd ...
479!> \param ncolv ...
480!> \param ng3x3 ...
481!> \param ng4x6 ...
482!> \param nvsite ...
483!> \param nfixd_restraint ...
484!> \param ng3x3_restraint ...
485!> \param ng4x6_restraint ...
486!> \param nvsite_restraint ...
487!> \param nrestraints ...
488!> \param nmolecule ...
489!> \param nsgf ...
490!> \param nshell ...
491!> \param ntorsion ...
492!> \param molecule_list ...
493!> \param nelectron ...
494!> \param nelectron_alpha ...
495!> \param nelectron_beta ...
496!> \param bond_kind_set ...
497!> \param bend_kind_set ...
498!> \param ub_kind_set ...
499!> \param impr_kind_set ...
500!> \param opbend_kind_set ...
501!> \param torsion_kind_set ...
502!> \param molname_generated ...
503!> \date 27.08.2003
504!> \author Matthias Krack
505!> \version 1.0
506! **************************************************************************************************
507 SUBROUTINE get_molecule_kind(molecule_kind, atom_list, bond_list, bend_list, &
508 ub_list, impr_list, opbend_list, colv_list, fixd_list, &
509 g3x3_list, g4x6_list, vsite_list, torsion_list, shell_list, &
510 name, mass, charge, kind_number, natom, nbend, nbond, nub, &
511 nimpr, nopbend, nconstraint, nconstraint_fixd, nfixd, ncolv, ng3x3, ng4x6, &
512 nvsite, nfixd_restraint, ng3x3_restraint, ng4x6_restraint, &
513 nvsite_restraint, nrestraints, nmolecule, nsgf, nshell, ntorsion, &
514 molecule_list, nelectron, nelectron_alpha, nelectron_beta, &
515 bond_kind_set, bend_kind_set, &
516 ub_kind_set, impr_kind_set, opbend_kind_set, torsion_kind_set, &
517 molname_generated)
518
519 TYPE(molecule_kind_type), INTENT(IN) :: molecule_kind
520 TYPE(atom_type), DIMENSION(:), OPTIONAL, POINTER :: atom_list
521 TYPE(bond_type), DIMENSION(:), OPTIONAL, POINTER :: bond_list
522 TYPE(bend_type), DIMENSION(:), OPTIONAL, POINTER :: bend_list
523 TYPE(ub_type), DIMENSION(:), OPTIONAL, POINTER :: ub_list
524 TYPE(impr_type), DIMENSION(:), OPTIONAL, POINTER :: impr_list
525 TYPE(opbend_type), DIMENSION(:), OPTIONAL, POINTER :: opbend_list
526 TYPE(colvar_constraint_type), DIMENSION(:), &
527 OPTIONAL, POINTER :: colv_list
528 TYPE(fixd_constraint_type), DIMENSION(:), &
529 OPTIONAL, POINTER :: fixd_list
530 TYPE(g3x3_constraint_type), DIMENSION(:), &
531 OPTIONAL, POINTER :: g3x3_list
532 TYPE(g4x6_constraint_type), DIMENSION(:), &
533 OPTIONAL, POINTER :: g4x6_list
534 TYPE(vsite_constraint_type), DIMENSION(:), &
535 OPTIONAL, POINTER :: vsite_list
536 TYPE(torsion_type), DIMENSION(:), OPTIONAL, &
537 POINTER :: torsion_list
538 TYPE(shell_type), DIMENSION(:), OPTIONAL, POINTER :: shell_list
539 CHARACTER(LEN=default_string_length), &
540 INTENT(OUT), OPTIONAL :: name
541 REAL(kind=dp), OPTIONAL :: mass, charge
542 INTEGER, INTENT(OUT), OPTIONAL :: kind_number, natom, nbend, nbond, nub, &
543 nimpr, nopbend, nconstraint, &
544 nconstraint_fixd, nfixd
545 TYPE(colvar_counters), INTENT(out), OPTIONAL :: ncolv
546 INTEGER, INTENT(OUT), OPTIONAL :: ng3x3, ng4x6, nvsite, nfixd_restraint, ng3x3_restraint, &
547 ng4x6_restraint, nvsite_restraint, nrestraints, nmolecule, nsgf, nshell, ntorsion
548 INTEGER, DIMENSION(:), OPTIONAL, POINTER :: molecule_list
549 INTEGER, INTENT(OUT), OPTIONAL :: nelectron, nelectron_alpha, &
550 nelectron_beta
551 TYPE(bond_kind_type), DIMENSION(:), OPTIONAL, &
552 POINTER :: bond_kind_set
553 TYPE(bend_kind_type), DIMENSION(:), OPTIONAL, &
554 POINTER :: bend_kind_set
555 TYPE(ub_kind_type), DIMENSION(:), OPTIONAL, &
556 POINTER :: ub_kind_set
557 TYPE(impr_kind_type), DIMENSION(:), OPTIONAL, &
558 POINTER :: impr_kind_set
559 TYPE(opbend_kind_type), DIMENSION(:), OPTIONAL, &
560 POINTER :: opbend_kind_set
561 TYPE(torsion_kind_type), DIMENSION(:), OPTIONAL, &
562 POINTER :: torsion_kind_set
563 LOGICAL, INTENT(OUT), OPTIONAL :: molname_generated
564
565 INTEGER :: i
566
567 IF (PRESENT(atom_list)) atom_list => molecule_kind%atom_list
568 IF (PRESENT(bend_list)) bend_list => molecule_kind%bend_list
569 IF (PRESENT(bond_list)) bond_list => molecule_kind%bond_list
570 IF (PRESENT(impr_list)) impr_list => molecule_kind%impr_list
571 IF (PRESENT(opbend_list)) opbend_list => molecule_kind%opbend_list
572 IF (PRESENT(ub_list)) ub_list => molecule_kind%ub_list
573 IF (PRESENT(bond_kind_set)) bond_kind_set => molecule_kind%bond_kind_set
574 IF (PRESENT(bend_kind_set)) bend_kind_set => molecule_kind%bend_kind_set
575 IF (PRESENT(ub_kind_set)) ub_kind_set => molecule_kind%ub_kind_set
576 IF (PRESENT(impr_kind_set)) impr_kind_set => molecule_kind%impr_kind_set
577 IF (PRESENT(opbend_kind_set)) opbend_kind_set => molecule_kind%opbend_kind_set
578 IF (PRESENT(torsion_kind_set)) torsion_kind_set => molecule_kind%torsion_kind_set
579 IF (PRESENT(colv_list)) colv_list => molecule_kind%colv_list
580 IF (PRESENT(g3x3_list)) g3x3_list => molecule_kind%g3x3_list
581 IF (PRESENT(g4x6_list)) g4x6_list => molecule_kind%g4x6_list
582 IF (PRESENT(vsite_list)) vsite_list => molecule_kind%vsite_list
583 IF (PRESENT(fixd_list)) fixd_list => molecule_kind%fixd_list
584 IF (PRESENT(torsion_list)) torsion_list => molecule_kind%torsion_list
585 IF (PRESENT(shell_list)) shell_list => molecule_kind%shell_list
586 IF (PRESENT(name)) name = molecule_kind%name
587 IF (PRESENT(molname_generated)) molname_generated = molecule_kind%molname_generated
588 IF (PRESENT(mass)) mass = molecule_kind%mass
589 IF (PRESENT(charge)) charge = molecule_kind%charge
590 IF (PRESENT(kind_number)) kind_number = molecule_kind%kind_number
591 IF (PRESENT(natom)) natom = molecule_kind%natom
592 IF (PRESENT(nbend)) nbend = molecule_kind%nbend
593 IF (PRESENT(nbond)) nbond = molecule_kind%nbond
594 IF (PRESENT(nub)) nub = molecule_kind%nub
595 IF (PRESENT(nimpr)) nimpr = molecule_kind%nimpr
596 IF (PRESENT(nopbend)) nopbend = molecule_kind%nopbend
597 IF (PRESENT(nconstraint)) nconstraint = (molecule_kind%ncolv%ntot - molecule_kind%ncolv%nrestraint) + &
598 3*(molecule_kind%ng3x3 - molecule_kind%ng3x3_restraint) + &
599 6*(molecule_kind%ng4x6 - molecule_kind%ng4x6_restraint) + &
600 3*(molecule_kind%nvsite - molecule_kind%nvsite_restraint)
601 IF (PRESENT(ncolv)) ncolv = molecule_kind%ncolv
602 IF (PRESENT(ng3x3)) ng3x3 = molecule_kind%ng3x3
603 IF (PRESENT(ng4x6)) ng4x6 = molecule_kind%ng4x6
604 IF (PRESENT(nvsite)) nvsite = molecule_kind%nvsite
605 ! Number of atoms that have one or more components fixed
606 IF (PRESENT(nfixd)) nfixd = molecule_kind%nfixd
607 ! Number of degrees of freedom fixed
608 IF (PRESENT(nconstraint_fixd)) THEN
609 nconstraint_fixd = 0
610 IF (molecule_kind%nfixd /= 0) THEN
611 DO i = 1, SIZE(molecule_kind%fixd_list)
612 IF (molecule_kind%fixd_list(i)%restraint%active) cycle
613 SELECT CASE (molecule_kind%fixd_list(i)%itype)
615 nconstraint_fixd = nconstraint_fixd + 1
617 nconstraint_fixd = nconstraint_fixd + 2
618 CASE (use_perd_xyz)
619 nconstraint_fixd = nconstraint_fixd + 3
620 END SELECT
621 END DO
622 END IF
623 END IF
624 IF (PRESENT(ng3x3_restraint)) ng3x3_restraint = molecule_kind%ng3x3_restraint
625 IF (PRESENT(ng4x6_restraint)) ng4x6_restraint = molecule_kind%ng4x6_restraint
626 IF (PRESENT(nvsite_restraint)) nvsite_restraint = molecule_kind%nvsite_restraint
627 IF (PRESENT(nfixd_restraint)) nfixd_restraint = molecule_kind%nfixd_restraint
628 IF (PRESENT(nrestraints)) nrestraints = molecule_kind%ncolv%nrestraint + &
629 molecule_kind%ng3x3_restraint + &
630 molecule_kind%ng4x6_restraint + &
631 molecule_kind%nvsite_restraint
632 IF (PRESENT(nmolecule)) nmolecule = molecule_kind%nmolecule
633 IF (PRESENT(nshell)) nshell = molecule_kind%nshell
634 IF (PRESENT(ntorsion)) ntorsion = molecule_kind%ntorsion
635 IF (PRESENT(nsgf)) nsgf = molecule_kind%nsgf
636 IF (PRESENT(nelectron)) nelectron = molecule_kind%nelectron
637 IF (PRESENT(nelectron_alpha)) nelectron_alpha = molecule_kind%nelectron_beta
638 IF (PRESENT(nelectron_beta)) nelectron_beta = molecule_kind%nelectron_alpha
639 IF (PRESENT(molecule_list)) molecule_list => molecule_kind%molecule_list
640
641 END SUBROUTINE get_molecule_kind
642
643! **************************************************************************************************
644!> \brief Get informations about a molecule kind set.
645!> \param molecule_kind_set ...
646!> \param maxatom ...
647!> \param natom ...
648!> \param nbond ...
649!> \param nbend ...
650!> \param nub ...
651!> \param ntorsion ...
652!> \param nimpr ...
653!> \param nopbend ...
654!> \param nconstraint ...
655!> \param nconstraint_fixd ...
656!> \param nmolecule ...
657!> \param nrestraints ...
658!> \date 27.08.2003
659!> \author Matthias Krack
660!> \version 1.0
661! **************************************************************************************************
662 SUBROUTINE get_molecule_kind_set(molecule_kind_set, maxatom, natom, &
663 nbond, nbend, nub, ntorsion, nimpr, nopbend, &
664 nconstraint, nconstraint_fixd, nmolecule, &
665 nrestraints)
666
667 TYPE(molecule_kind_type), DIMENSION(:), INTENT(IN) :: molecule_kind_set
668 INTEGER, INTENT(OUT), OPTIONAL :: maxatom, natom, nbond, nbend, nub, &
669 ntorsion, nimpr, nopbend, nconstraint, &
670 nconstraint_fixd, nmolecule, &
671 nrestraints
672
673 INTEGER :: ibend, ibond, iimpr, imolecule_kind, iopbend, itorsion, iub, na, nc, nc_fixd, &
674 nfixd_restraint, nm, nmolecule_kind, nrestraints_tot
675
676 IF (PRESENT(maxatom)) maxatom = 0
677 IF (PRESENT(natom)) natom = 0
678 IF (PRESENT(nbond)) nbond = 0
679 IF (PRESENT(nbend)) nbend = 0
680 IF (PRESENT(nub)) nub = 0
681 IF (PRESENT(ntorsion)) ntorsion = 0
682 IF (PRESENT(nimpr)) nimpr = 0
683 IF (PRESENT(nopbend)) nopbend = 0
684 IF (PRESENT(nconstraint)) nconstraint = 0
685 IF (PRESENT(nconstraint_fixd)) nconstraint_fixd = 0
686 IF (PRESENT(nrestraints)) nrestraints = 0
687 IF (PRESENT(nmolecule)) nmolecule = 0
688
689 nmolecule_kind = SIZE(molecule_kind_set)
690
691 DO imolecule_kind = 1, nmolecule_kind
692 associate(molecule_kind => molecule_kind_set(imolecule_kind))
693
694 CALL get_molecule_kind(molecule_kind=molecule_kind, &
695 natom=na, &
696 nbond=ibond, &
697 nbend=ibend, &
698 nub=iub, &
699 ntorsion=itorsion, &
700 nimpr=iimpr, &
701 nopbend=iopbend, &
702 nconstraint=nc, &
703 nconstraint_fixd=nc_fixd, &
704 nfixd_restraint=nfixd_restraint, &
705 nrestraints=nrestraints_tot, &
706 nmolecule=nm)
707 IF (PRESENT(maxatom)) maxatom = max(maxatom, na)
708 IF (PRESENT(natom)) natom = natom + na*nm
709 IF (PRESENT(nbond)) nbond = nbond + ibond*nm
710 IF (PRESENT(nbend)) nbend = nbend + ibend*nm
711 IF (PRESENT(nub)) nub = nub + iub*nm
712 IF (PRESENT(ntorsion)) ntorsion = ntorsion + itorsion*nm
713 IF (PRESENT(nimpr)) nimpr = nimpr + iimpr*nm
714 IF (PRESENT(nopbend)) nopbend = nopbend + iopbend*nm
715 IF (PRESENT(nconstraint)) nconstraint = nconstraint + nc*nm + nc_fixd
716 IF (PRESENT(nconstraint_fixd)) nconstraint_fixd = nconstraint_fixd + nc_fixd
717 IF (PRESENT(nmolecule)) nmolecule = nmolecule + nm
718 IF (PRESENT(nrestraints)) nrestraints = nrestraints + nm*nrestraints_tot + nfixd_restraint
719
720 END associate
721 END DO
722
723 END SUBROUTINE get_molecule_kind_set
724
725! **************************************************************************************************
726!> \brief Set the components of a molecule kind.
727!> \param molecule_kind ...
728!> \param name ...
729!> \param mass ...
730!> \param charge ...
731!> \param kind_number ...
732!> \param molecule_list ...
733!> \param atom_list ...
734!> \param nbond ...
735!> \param bond_list ...
736!> \param nbend ...
737!> \param bend_list ...
738!> \param nub ...
739!> \param ub_list ...
740!> \param nimpr ...
741!> \param impr_list ...
742!> \param nopbend ...
743!> \param opbend_list ...
744!> \param ntorsion ...
745!> \param torsion_list ...
746!> \param fixd_list ...
747!> \param ncolv ...
748!> \param colv_list ...
749!> \param ng3x3 ...
750!> \param g3x3_list ...
751!> \param ng4x6 ...
752!> \param nfixd ...
753!> \param g4x6_list ...
754!> \param nvsite ...
755!> \param vsite_list ...
756!> \param ng3x3_restraint ...
757!> \param ng4x6_restraint ...
758!> \param nfixd_restraint ...
759!> \param nshell ...
760!> \param shell_list ...
761!> \param nvsite_restraint ...
762!> \param bond_kind_set ...
763!> \param bend_kind_set ...
764!> \param ub_kind_set ...
765!> \param torsion_kind_set ...
766!> \param impr_kind_set ...
767!> \param opbend_kind_set ...
768!> \param nelectron ...
769!> \param nsgf ...
770!> \param molname_generated ...
771!> \date 27.08.2003
772!> \author Matthias Krack
773!> \version 1.0
774! **************************************************************************************************
775 SUBROUTINE set_molecule_kind(molecule_kind, name, mass, charge, kind_number, &
776 molecule_list, atom_list, nbond, bond_list, &
777 nbend, bend_list, nub, ub_list, nimpr, impr_list, &
778 nopbend, opbend_list, ntorsion, &
779 torsion_list, fixd_list, ncolv, colv_list, ng3x3, &
780 g3x3_list, ng4x6, nfixd, g4x6_list, nvsite, &
781 vsite_list, ng3x3_restraint, ng4x6_restraint, &
782 nfixd_restraint, nshell, shell_list, &
783 nvsite_restraint, bond_kind_set, bend_kind_set, &
784 ub_kind_set, torsion_kind_set, impr_kind_set, &
785 opbend_kind_set, nelectron, nsgf, &
786 molname_generated)
787
788 TYPE(molecule_kind_type), INTENT(INOUT) :: molecule_kind
789 CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: name
790 REAL(kind=dp), OPTIONAL :: mass, charge
791 INTEGER, INTENT(IN), OPTIONAL :: kind_number
792 INTEGER, DIMENSION(:), OPTIONAL, POINTER :: molecule_list
793 TYPE(atom_type), DIMENSION(:), OPTIONAL, POINTER :: atom_list
794 INTEGER, INTENT(IN), OPTIONAL :: nbond
795 TYPE(bond_type), DIMENSION(:), OPTIONAL, POINTER :: bond_list
796 INTEGER, INTENT(IN), OPTIONAL :: nbend
797 TYPE(bend_type), DIMENSION(:), OPTIONAL, POINTER :: bend_list
798 INTEGER, INTENT(IN), OPTIONAL :: nub
799 TYPE(ub_type), DIMENSION(:), OPTIONAL, POINTER :: ub_list
800 INTEGER, INTENT(IN), OPTIONAL :: nimpr
801 TYPE(impr_type), DIMENSION(:), OPTIONAL, POINTER :: impr_list
802 INTEGER, INTENT(IN), OPTIONAL :: nopbend
803 TYPE(opbend_type), DIMENSION(:), OPTIONAL, POINTER :: opbend_list
804 INTEGER, INTENT(IN), OPTIONAL :: ntorsion
805 TYPE(torsion_type), DIMENSION(:), OPTIONAL, &
806 POINTER :: torsion_list
807 TYPE(fixd_constraint_type), DIMENSION(:), &
808 OPTIONAL, POINTER :: fixd_list
809 TYPE(colvar_counters), INTENT(IN), OPTIONAL :: ncolv
810 TYPE(colvar_constraint_type), DIMENSION(:), &
811 OPTIONAL, POINTER :: colv_list
812 INTEGER, INTENT(IN), OPTIONAL :: ng3x3
813 TYPE(g3x3_constraint_type), DIMENSION(:), &
814 OPTIONAL, POINTER :: g3x3_list
815 INTEGER, INTENT(IN), OPTIONAL :: ng4x6, nfixd
816 TYPE(g4x6_constraint_type), DIMENSION(:), &
817 OPTIONAL, POINTER :: g4x6_list
818 INTEGER, INTENT(IN), OPTIONAL :: nvsite
819 TYPE(vsite_constraint_type), DIMENSION(:), &
820 OPTIONAL, POINTER :: vsite_list
821 INTEGER, INTENT(IN), OPTIONAL :: ng3x3_restraint, ng4x6_restraint, &
822 nfixd_restraint, nshell
823 TYPE(shell_type), DIMENSION(:), OPTIONAL, POINTER :: shell_list
824 INTEGER, INTENT(IN), OPTIONAL :: nvsite_restraint
825 TYPE(bond_kind_type), DIMENSION(:), OPTIONAL, &
826 POINTER :: bond_kind_set
827 TYPE(bend_kind_type), DIMENSION(:), OPTIONAL, &
828 POINTER :: bend_kind_set
829 TYPE(ub_kind_type), DIMENSION(:), OPTIONAL, &
830 POINTER :: ub_kind_set
831 TYPE(torsion_kind_type), DIMENSION(:), OPTIONAL, &
832 POINTER :: torsion_kind_set
833 TYPE(impr_kind_type), DIMENSION(:), OPTIONAL, &
834 POINTER :: impr_kind_set
835 TYPE(opbend_kind_type), DIMENSION(:), OPTIONAL, &
836 POINTER :: opbend_kind_set
837 INTEGER, INTENT(IN), OPTIONAL :: nelectron, nsgf
838 LOGICAL, INTENT(IN), OPTIONAL :: molname_generated
839
840 INTEGER :: n
841
842 IF (PRESENT(atom_list)) THEN
843 n = SIZE(atom_list)
844 molecule_kind%natom = n
845 molecule_kind%atom_list => atom_list
846 END IF
847 IF (PRESENT(molname_generated)) molecule_kind%molname_generated = molname_generated
848 IF (PRESENT(name)) molecule_kind%name = name
849 IF (PRESENT(mass)) molecule_kind%mass = mass
850 IF (PRESENT(charge)) molecule_kind%charge = charge
851 IF (PRESENT(kind_number)) molecule_kind%kind_number = kind_number
852 IF (PRESENT(nbond)) molecule_kind%nbond = nbond
853 IF (PRESENT(bond_list)) molecule_kind%bond_list => bond_list
854 IF (PRESENT(nbend)) molecule_kind%nbend = nbend
855 IF (PRESENT(nelectron)) molecule_kind%nelectron = nelectron
856 IF (PRESENT(nsgf)) molecule_kind%nsgf = nsgf
857 IF (PRESENT(bend_list)) molecule_kind%bend_list => bend_list
858 IF (PRESENT(nub)) molecule_kind%nub = nub
859 IF (PRESENT(ub_list)) molecule_kind%ub_list => ub_list
860 IF (PRESENT(ntorsion)) molecule_kind%ntorsion = ntorsion
861 IF (PRESENT(torsion_list)) molecule_kind%torsion_list => torsion_list
862 IF (PRESENT(nimpr)) molecule_kind%nimpr = nimpr
863 IF (PRESENT(impr_list)) molecule_kind%impr_list => impr_list
864 IF (PRESENT(nopbend)) molecule_kind%nopbend = nopbend
865 IF (PRESENT(opbend_list)) molecule_kind%opbend_list => opbend_list
866 IF (PRESENT(ncolv)) molecule_kind%ncolv = ncolv
867 IF (PRESENT(colv_list)) molecule_kind%colv_list => colv_list
868 IF (PRESENT(ng3x3)) molecule_kind%ng3x3 = ng3x3
869 IF (PRESENT(g3x3_list)) molecule_kind%g3x3_list => g3x3_list
870 IF (PRESENT(ng4x6)) molecule_kind%ng4x6 = ng4x6
871 IF (PRESENT(nvsite)) molecule_kind%nvsite = nvsite
872 IF (PRESENT(nfixd)) molecule_kind%nfixd = nfixd
873 IF (PRESENT(nfixd_restraint)) molecule_kind%nfixd_restraint = nfixd_restraint
874 IF (PRESENT(ng3x3_restraint)) molecule_kind%ng3x3_restraint = ng3x3_restraint
875 IF (PRESENT(ng4x6_restraint)) molecule_kind%ng4x6_restraint = ng4x6_restraint
876 IF (PRESENT(nvsite_restraint)) molecule_kind%nvsite_restraint = nvsite_restraint
877 IF (PRESENT(g4x6_list)) molecule_kind%g4x6_list => g4x6_list
878 IF (PRESENT(vsite_list)) molecule_kind%vsite_list => vsite_list
879 IF (PRESENT(fixd_list)) molecule_kind%fixd_list => fixd_list
880 IF (PRESENT(bond_kind_set)) molecule_kind%bond_kind_set => bond_kind_set
881 IF (PRESENT(bend_kind_set)) molecule_kind%bend_kind_set => bend_kind_set
882 IF (PRESENT(ub_kind_set)) molecule_kind%ub_kind_set => ub_kind_set
883 IF (PRESENT(torsion_kind_set)) molecule_kind%torsion_kind_set => torsion_kind_set
884 IF (PRESENT(impr_kind_set)) molecule_kind%impr_kind_set => impr_kind_set
885 IF (PRESENT(opbend_kind_set)) molecule_kind%opbend_kind_set => opbend_kind_set
886 IF (PRESENT(nshell)) molecule_kind%nshell = nshell
887 IF (PRESENT(shell_list)) molecule_kind%shell_list => shell_list
888 IF (PRESENT(molecule_list)) THEN
889 n = SIZE(molecule_list)
890 molecule_kind%nmolecule = n
891 molecule_kind%molecule_list => molecule_list
892 END IF
893 END SUBROUTINE set_molecule_kind
894
895! **************************************************************************************************
896!> \brief Write a molecule kind data set to the output unit.
897!> \param molecule_kind ...
898!> \param output_unit ...
899!> \date 24.09.2003
900!> \author Matthias Krack
901!> \version 1.0
902! **************************************************************************************************
903 SUBROUTINE write_molecule_kind(molecule_kind, output_unit)
904 TYPE(molecule_kind_type), INTENT(IN) :: molecule_kind
905 INTEGER, INTENT(in) :: output_unit
906
907 CHARACTER(LEN=default_string_length) :: name
908 INTEGER :: iatom, imolecule, natom, nmolecule
909 TYPE(atomic_kind_type), POINTER :: atomic_kind
910
911 IF (output_unit > 0) THEN
912 natom = SIZE(molecule_kind%atom_list)
913 nmolecule = SIZE(molecule_kind%molecule_list)
914
915 IF (natom == 1) THEN
916 atomic_kind => molecule_kind%atom_list(1)%atomic_kind
917 CALL get_atomic_kind(atomic_kind=atomic_kind, name=name)
918 WRITE (unit=output_unit, fmt="(/,T2,I5,A,T36,A,A,T64,A)") &
919 molecule_kind%kind_number, &
920 ". Molecule kind: "//trim(molecule_kind%name), &
921 "Atomic kind name: ", trim(name)
922 WRITE (unit=output_unit, fmt="(T9,A,L1,T55,A,T75,I6)") &
923 "Automatic name: ", molecule_kind%molname_generated, &
924 "Number of molecules:", nmolecule
925 ELSE
926 WRITE (unit=output_unit, fmt="(/,T2,I5,A,T50,A,T75,I6,/,T22,A)") &
927 molecule_kind%kind_number, &
928 ". Molecule kind: "//trim(molecule_kind%name), &
929 "Number of atoms: ", natom, &
930 "Atom Atomic kind name"
931 DO iatom = 1, natom
932 atomic_kind => molecule_kind%atom_list(iatom)%atomic_kind
933 CALL get_atomic_kind(atomic_kind=atomic_kind, name=name)
934 WRITE (unit=output_unit, fmt="(T20,I6,(7X,A18))") &
935 iatom, trim(name)
936 END DO
937 WRITE (unit=output_unit, fmt="(/,T9,A,L1)") &
938 "The name was automatically generated: ", &
939 molecule_kind%molname_generated
940 WRITE (unit=output_unit, fmt="(T9,A,I6,/,T9,A,(T30,5I10))") &
941 "Number of molecules: ", nmolecule, "Molecule list:", &
942 (molecule_kind%molecule_list(imolecule), imolecule=1, nmolecule)
943 IF (molecule_kind%nbond > 0) THEN
944 WRITE (unit=output_unit, fmt="(1X,A30,I6)") &
945 "Number of bonds: ", molecule_kind%nbond
946 END IF
947 IF (molecule_kind%nbend > 0) THEN
948 WRITE (unit=output_unit, fmt="(1X,A30,I6)") &
949 "Number of bends: ", molecule_kind%nbend
950 END IF
951 IF (molecule_kind%nub > 0) THEN
952 WRITE (unit=output_unit, fmt="(1X,A30,I6)") &
953 "Number of Urey-Bradley:", molecule_kind%nub
954 END IF
955 IF (molecule_kind%ntorsion > 0) THEN
956 WRITE (unit=output_unit, fmt="(1X,A30,I6)") &
957 "Number of torsions: ", molecule_kind%ntorsion
958 END IF
959 IF (molecule_kind%nimpr > 0) THEN
960 WRITE (unit=output_unit, fmt="(1X,A30,I6)") &
961 "Number of improper: ", molecule_kind%nimpr
962 END IF
963 IF (molecule_kind%nopbend > 0) THEN
964 WRITE (unit=output_unit, fmt="(1X,A30,I6)") &
965 "Number of out opbends: ", molecule_kind%nopbend
966 END IF
967 END IF
968 END IF
969 END SUBROUTINE write_molecule_kind
970
971! **************************************************************************************************
972!> \brief Write a moleculeatomic kind set data set to the output unit.
973!> \param molecule_kind_set ...
974!> \param subsys_section ...
975!> \date 24.09.2003
976!> \author Matthias Krack
977!> \version 1.0
978! **************************************************************************************************
979 SUBROUTINE write_molecule_kind_set(molecule_kind_set, subsys_section)
980 TYPE(molecule_kind_type), DIMENSION(:), INTENT(IN) :: molecule_kind_set
981 TYPE(section_vals_type), INTENT(IN) :: subsys_section
982
983 CHARACTER(len=*), PARAMETER :: routinen = 'write_molecule_kind_set'
984
985 INTEGER :: handle, imolecule_kind, natom, nbend, &
986 nbond, nimpr, nmolecule, &
987 nmolecule_kind, nopbend, ntors, &
988 ntotal, nub, output_unit
989 LOGICAL :: all_single_atoms
990 TYPE(cp_logger_type), POINTER :: logger
991
992 CALL timeset(routinen, handle)
993
994 NULLIFY (logger)
995 logger => cp_get_default_logger()
996 output_unit = cp_print_key_unit_nr(logger, subsys_section, &
997 "PRINT%MOLECULES", extension=".Log")
998 IF (output_unit > 0) THEN
999 WRITE (unit=output_unit, fmt="(/,/,T2,A)") "MOLECULE KIND INFORMATION"
1000
1001 nmolecule_kind = SIZE(molecule_kind_set)
1002
1003 all_single_atoms = .true.
1004 DO imolecule_kind = 1, nmolecule_kind
1005 natom = SIZE(molecule_kind_set(imolecule_kind)%atom_list)
1006 nmolecule = SIZE(molecule_kind_set(imolecule_kind)%molecule_list)
1007 IF (natom*nmolecule > 1) all_single_atoms = .false.
1008 END DO
1009
1010 IF (all_single_atoms) THEN
1011 WRITE (unit=output_unit, fmt="(/,/,T2,A)") &
1012 "All atoms are their own molecule, skipping detailed information"
1013 ELSE
1014 DO imolecule_kind = 1, nmolecule_kind
1015 CALL write_molecule_kind(molecule_kind_set(imolecule_kind), output_unit)
1016 END DO
1017 END IF
1018
1019 CALL get_molecule_kind_set(molecule_kind_set=molecule_kind_set, &
1020 nbond=nbond, &
1021 nbend=nbend, &
1022 nub=nub, &
1023 ntorsion=ntors, &
1024 nimpr=nimpr, &
1025 nopbend=nopbend)
1026 ntotal = nbond + nbend + nub + ntors + nimpr + nopbend
1027 IF (ntotal > 0) THEN
1028 WRITE (unit=output_unit, fmt="(/,/,T2,A,T45,A30,I6)") &
1029 "MOLECULE KIND SET INFORMATION", &
1030 "Total Number of bonds: ", nbond
1031 WRITE (unit=output_unit, fmt="(T45,A30,I6)") &
1032 "Total Number of bends: ", nbend
1033 WRITE (unit=output_unit, fmt="(T45,A30,I6)") &
1034 "Total Number of Urey-Bradley:", nub
1035 WRITE (unit=output_unit, fmt="(T45,A30,I6)") &
1036 "Total Number of torsions: ", ntors
1037 WRITE (unit=output_unit, fmt="(T45,A30,I6)") &
1038 "Total Number of improper: ", nimpr
1039 WRITE (unit=output_unit, fmt="(T45,A30,I6)") &
1040 "Total Number of opbends: ", nopbend
1041 END IF
1042 END IF
1043 CALL cp_print_key_finished_output(output_unit, logger, subsys_section, &
1044 "PRINT%MOLECULES")
1045
1046 CALL timestop(handle)
1047
1048 END SUBROUTINE write_molecule_kind_set
1049
1050! **************************************************************************************************
1051!> \brief Write collective variable constraint information to output unit
1052!> \param colvar_constraint Data set of the collective variable constraint
1053!> \param icolv Collective variable number (index)
1054!> \param iw Logical unit number of the output unit
1055!> \author Matthias Krack (25.11.2025)
1056! **************************************************************************************************
1057 SUBROUTINE write_colvar_constraint(colvar_constraint, icolv, iw)
1058
1059 TYPE(colvar_constraint_type), INTENT(IN), POINTER :: colvar_constraint
1060 INTEGER, INTENT(IN) :: icolv, iw
1061
1062 CHARACTER(LEN=30) :: type_string
1063
1064 IF (iw > 0) THEN
1065 cpassert(ASSOCIATED(colvar_constraint))
1066 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1067 "COLVAR| Number", icolv
1068 SELECT CASE (colvar_constraint%type_id)
1069 CASE (no_colvar_id)
1070 type_string = "Undefined"
1071 CASE (dist_colvar_id)
1072 type_string = "Distance"
1073 CASE (coord_colvar_id)
1074 type_string = "Coordination number"
1075 CASE (torsion_colvar_id)
1076 type_string = "Torsion"
1077 CASE (angle_colvar_id)
1078 type_string = "Angle"
1079 CASE (plane_distance_colvar_id)
1080 type_string = "Plane distance"
1081 CASE (rotation_colvar_id)
1082 type_string = "Rotation"
1083 CASE (dfunct_colvar_id)
1084 type_string = "Distance function"
1085 CASE (qparm_colvar_id)
1086 type_string = "Q parameter"
1087 CASE (hydronium_shell_colvar_id)
1088 type_string = "Hydronium shell"
1089 CASE (reaction_path_colvar_id)
1090 type_string = "Reaction path"
1091 CASE (combine_colvar_id)
1092 type_string = "Combine"
1093 CASE (population_colvar_id)
1094 type_string = "Population"
1095 CASE (plane_plane_angle_colvar_id)
1096 type_string = "Angle plane-plane"
1097 CASE (gyration_colvar_id)
1098 type_string = "Gyration radius"
1099 CASE (rmsd_colvar_id)
1100 type_string = "RMSD"
1101 CASE (distance_from_path_colvar_id)
1102 type_string = "Distance from path"
1103 CASE (xyz_diag_colvar_id)
1104 type_string = "XYZ diag"
1105 CASE (xyz_outerdiag_colvar_id)
1106 type_string = "XYZ outerdiag"
1107 CASE (u_colvar_id)
1108 type_string = "U"
1109 CASE (wc_colvar_id)
1110 type_string = "WC"
1111 CASE (hbp_colvar_id)
1112 type_string = "HBP"
1113 CASE (ring_puckering_colvar_id)
1114 type_string = "Ring puckering"
1115 CASE (mindist_colvar_id)
1116 type_string = "Distance point-plane"
1117 CASE (acid_hyd_dist_colvar_id)
1118 type_string = "Acid hydronium distance"
1119 CASE (acid_hyd_shell_colvar_id)
1120 type_string = "Acid hydronium shell"
1121 CASE (hydronium_dist_colvar_id)
1122 type_string = "Hydronium distance"
1123 CASE (voronoiipz_colvar_id)
1124 type_string = "Voronoi ion position"
1125 CASE DEFAULT
1126 cpabort("Invalid collective variable ID specified. Check the code!")
1127 END SELECT
1128 IF (colvar_constraint%restraint%active) THEN
1129 WRITE (unit=iw, fmt="(T2,A,T51,A30)") &
1130 "COLVAR| Restraint type", adjustr(trim(type_string))
1131 WRITE (unit=iw, fmt="(T2,A,T66,ES15.6)") &
1132 "COLVAR| Restraint constant k [a.u.]", colvar_constraint%restraint%k0
1133 ELSE
1134 WRITE (unit=iw, fmt="(T2,A,T51,A30)") &
1135 "COLVAR| Constraint type", adjustr(trim(type_string))
1136 END IF
1137 WRITE (unit=iw, fmt="(T2,A,T66,ES15.6)") &
1138 "COLVAR| Target value", colvar_constraint%expected_value, &
1139 "COLVAR| Target value growth speed", colvar_constraint%expected_value_growth_speed
1140 IF (colvar_constraint%use_points) THEN
1141 WRITE (unit=iw, fmt="(T2,A,T78,A3)") "COLVAR| Use points", "Yes"
1142 ELSE
1143 WRITE (unit=iw, fmt="(T2,A,T79,A2)") "COLVAR| Use points", "No"
1144 END IF
1145 END IF
1146
1147 END SUBROUTINE write_colvar_constraint
1148
1149! **************************************************************************************************
1150!> \brief Write fix atom constraint information to output unit
1151!> \param fixd_constraint Data set of the fix atom constraint
1152!> \param ifixd Fix atom constraint/restraint number (index)
1153!> \param iw Logical unit number of the output unit
1154!> \author Matthias Krack (26.11.2025)
1155! **************************************************************************************************
1156 SUBROUTINE write_fixd_constraint(fixd_constraint, ifixd, iw)
1157
1158 TYPE(fixd_constraint_type), INTENT(IN), POINTER :: fixd_constraint
1159 INTEGER, INTENT(IN) :: ifixd, iw
1160
1161 IF (iw > 0) THEN
1162 cpassert(ASSOCIATED(fixd_constraint))
1163 IF (fixd_constraint%restraint%active) THEN
1164 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1165 "FIX_ATOM| Number (restraint)", ifixd
1166 WRITE (unit=iw, fmt="(T2,A,T66,ES15.6)") &
1167 "FIX_ATOM| Restraint constant k [a.u.]", fixd_constraint%restraint%k0
1168 ELSE
1169 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1170 "FIX_ATOM| Number (constraint)", ifixd
1171 END IF
1172 WRITE (unit=iw, fmt="(T2,A,T71,I10)") &
1173 "FIX_ATOM| Atom index", fixd_constraint%fixd
1174 WRITE (unit=iw, fmt="(T2,A,T78,A3)") &
1175 "FIX_ATOM| Fixed Cartesian components", periodicity_string(fixd_constraint%itype)
1176 IF (index(periodicity_string(fixd_constraint%itype), "X") > 0) THEN
1177 WRITE (unit=iw, fmt="(T2,A,T66,F15.8)") &
1178 "FIX_ATOM| X coordinate [Angstrom]", cp_unit_from_cp2k(fixd_constraint%coord(1), "Angstrom")
1179 END IF
1180 IF (index(periodicity_string(fixd_constraint%itype), "Y") > 0) THEN
1181 WRITE (unit=iw, fmt="(T2,A,T66,F15.8)") &
1182 "FIX_ATOM| Y coordinate [Angstrom]", cp_unit_from_cp2k(fixd_constraint%coord(2), "Angstrom")
1183 END IF
1184 IF (index(periodicity_string(fixd_constraint%itype), "Z") > 0) THEN
1185 WRITE (unit=iw, fmt="(T2,A,T66,F15.8)") &
1186 "FIX_ATOM| Z coordinate [Angstrom]", cp_unit_from_cp2k(fixd_constraint%coord(3), "Angstrom")
1187 END IF
1188 END IF
1189
1190 END SUBROUTINE write_fixd_constraint
1191
1192! **************************************************************************************************
1193!> \brief Write G3x3 constraint information to output unit
1194!> \param g3x3_constraint Data set of the g3x3 constraint
1195!> \param ig3x3 G3x3 constraint/restraint number (index)
1196!> \param iw Logical unit number of the output unit
1197!> \author Matthias Krack (26.11.2025)
1198! **************************************************************************************************
1199 SUBROUTINE write_g3x3_constraint(g3x3_constraint, ig3x3, iw)
1200
1201 TYPE(g3x3_constraint_type), INTENT(IN), POINTER :: g3x3_constraint
1202 INTEGER, INTENT(IN) :: ig3x3, iw
1203
1204 IF (iw > 0) THEN
1205 cpassert(ASSOCIATED(g3x3_constraint))
1206 IF (g3x3_constraint%restraint%active) THEN
1207 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1208 "G3X3| Number (restraint)", ig3x3
1209 WRITE (unit=iw, fmt="(T2,A,T66,ES15.6)") &
1210 "G3X3| Restraint constant k [a.u.]", g3x3_constraint%restraint%k0
1211 ELSE
1212 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1213 "G3X3| Number (constraint)", ig3x3
1214 END IF
1215 WRITE (unit=iw, fmt="(T2,A,T71,I10)") &
1216 "G3X3| Atom index a", g3x3_constraint%a, &
1217 "G3X3| Atom index b", g3x3_constraint%b, &
1218 "G3X3| Atom index c", g3x3_constraint%c
1219 WRITE (unit=iw, fmt="(T2,A,T66,F15.8)") &
1220 "G3X3| Distance (a,b) [Angstrom]", cp_unit_from_cp2k(g3x3_constraint%dab, "Angstrom"), &
1221 "G3X3| Distance (a,c) [Angstrom]", cp_unit_from_cp2k(g3x3_constraint%dac, "Angstrom"), &
1222 "G3X3| Distance (b,c) [Angstrom]", cp_unit_from_cp2k(g3x3_constraint%dbc, "Angstrom")
1223 END IF
1224
1225 END SUBROUTINE write_g3x3_constraint
1226
1227! **************************************************************************************************
1228!> \brief Write G4x6 constraint information to output unit
1229!> \param g4x6_constraint Data set of the g4x6 constraint
1230!> \param ig4x6 G4x6 constraint/restraint number (index)
1231!> \param iw Logical unit number of the output unit
1232!> \author Matthias Krack (26.11.2025)
1233! **************************************************************************************************
1234 SUBROUTINE write_g4x6_constraint(g4x6_constraint, ig4x6, iw)
1235
1236 TYPE(g4x6_constraint_type), INTENT(IN), POINTER :: g4x6_constraint
1237 INTEGER, INTENT(IN) :: ig4x6, iw
1238
1239 IF (iw > 0) THEN
1240 cpassert(ASSOCIATED(g4x6_constraint))
1241 IF (g4x6_constraint%restraint%active) THEN
1242 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1243 "G4X6| Number (restraint)", ig4x6
1244 WRITE (unit=iw, fmt="(T2,A,T66,ES15.6)") &
1245 "G4X6| Restraint constant k [a.u.]", g4x6_constraint%restraint%k0
1246 ELSE
1247 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1248 "G4X6| Number (constraint)", ig4x6
1249 END IF
1250 WRITE (unit=iw, fmt="(T2,A,T71,I10)") &
1251 "G4X6| Atom index a", g4x6_constraint%a, &
1252 "G4X6| Atom index b", g4x6_constraint%b, &
1253 "G4X6| Atom index c", g4x6_constraint%c, &
1254 "G4X6| Atom index d", g4x6_constraint%d
1255 WRITE (unit=iw, fmt="(T2,A,T66,F15.8)") &
1256 "G4X6| Distance (a,b) [Angstrom]", cp_unit_from_cp2k(g4x6_constraint%dab, "Angstrom"), &
1257 "G4X6| Distance (a,c) [Angstrom]", cp_unit_from_cp2k(g4x6_constraint%dac, "Angstrom"), &
1258 "G4X6| Distance (a,d) [Angstrom]", cp_unit_from_cp2k(g4x6_constraint%dad, "Angstrom"), &
1259 "G4X6| Distance (b,c) [Angstrom]", cp_unit_from_cp2k(g4x6_constraint%dbc, "Angstrom"), &
1260 "G4X6| Distance (b,d) [Angstrom]", cp_unit_from_cp2k(g4x6_constraint%dbd, "Angstrom"), &
1261 "G4X6| Distance (c,d) [Angstrom]", cp_unit_from_cp2k(g4x6_constraint%dcd, "Angstrom")
1262 END IF
1263
1264 END SUBROUTINE write_g4x6_constraint
1265
1266! **************************************************************************************************
1267!> \brief Write virtual site constraint information to output unit
1268!> \param vsite_constraint Data set of the vsite constraint
1269!> \param ivsite Virtual site constraint/restraint number (index)
1270!> \param iw Logical unit number of the output unit
1271!> \author Matthias Krack (01.12.2025)
1272! **************************************************************************************************
1273 SUBROUTINE write_vsite_constraint(vsite_constraint, ivsite, iw)
1274
1275 TYPE(vsite_constraint_type), INTENT(IN), POINTER :: vsite_constraint
1276 INTEGER, INTENT(IN) :: ivsite, iw
1277
1278 IF (iw > 0) THEN
1279 cpassert(ASSOCIATED(vsite_constraint))
1280 IF (vsite_constraint%restraint%active) THEN
1281 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1282 "VSITE| Number (restraint)", ivsite
1283 WRITE (unit=iw, fmt="(T2,A,T66,ES15.6)") &
1284 "VSITE| Restraint constant k [a.u.]", vsite_constraint%restraint%k0
1285 ELSE
1286 WRITE (unit=iw, fmt="(/,T2,A,T71,I10)") &
1287 "VSITE| Number (constraint)", ivsite
1288 END IF
1289 WRITE (unit=iw, fmt="(T2,A,T71,I10)") &
1290 "VSITE| Atom index of virtual site", vsite_constraint%a, &
1291 "VSITE| Atom index b", vsite_constraint%b, &
1292 "VSITE| Atom index c", vsite_constraint%c, &
1293 "VSITE| Atom index d", vsite_constraint%d
1294 WRITE (unit=iw, fmt="(T2,A,T66,F15.8)") &
1295 "VSITE| Distance (b,c) [Angstrom]", cp_unit_from_cp2k(vsite_constraint%wbc, "Angstrom"), &
1296 "VSITE| Distance (d,c) [Angstrom]", cp_unit_from_cp2k(vsite_constraint%wdc, "Angstrom")
1297 END IF
1298
1299 END SUBROUTINE write_vsite_constraint
1300
1301END MODULE molecule_kind_types
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Handles all functions related to the CELL.
Definition cell_types.F:15
integer, parameter, public use_perd_xyz
Definition cell_types.F:42
integer, parameter, public use_perd_y
Definition cell_types.F:42
integer, parameter, public use_perd_xz
Definition cell_types.F:42
integer, parameter, public use_perd_x
Definition cell_types.F:42
integer, parameter, public use_perd_z
Definition cell_types.F:42
integer, parameter, public use_perd_yz
Definition cell_types.F:42
character(len=3), dimension(7), parameter, public periodicity_string
Definition cell_types.F:51
integer, parameter, public use_perd_xy
Definition cell_types.F:42
Initialize the collective variables types.
integer, parameter, public ring_puckering_colvar_id
integer, parameter, public population_colvar_id
integer, parameter, public voronoiipz_colvar_id
integer, parameter, public distance_from_path_colvar_id
integer, parameter, public rmsd_colvar_id
integer, parameter, public mindist_colvar_id
integer, parameter, public wc_colvar_id
integer, parameter, public acid_hyd_dist_colvar_id
integer, parameter, public xyz_outerdiag_colvar_id
integer, parameter, public plane_plane_angle_colvar_id
integer, parameter, public plane_distance_colvar_id
integer, parameter, public combine_colvar_id
integer, parameter, public gyration_colvar_id
integer, parameter, public hbp_colvar_id
integer, parameter, public rotation_colvar_id
integer, parameter, public hydronium_dist_colvar_id
integer, parameter, public coord_colvar_id
integer, parameter, public dfunct_colvar_id
integer, parameter, public no_colvar_id
integer, parameter, public angle_colvar_id
integer, parameter, public qparm_colvar_id
integer, parameter, public dist_colvar_id
integer, parameter, public u_colvar_id
integer, parameter, public hydronium_shell_colvar_id
integer, parameter, public torsion_colvar_id
integer, parameter, public xyz_diag_colvar_id
integer, parameter, public reaction_path_colvar_id
integer, parameter, public acid_hyd_shell_colvar_id
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout, file_access)
...
unit conversion facility
Definition cp_units.F:30
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Definition cp_units.F:1311
Define all structure types related to force field kinds.
integer, parameter, public do_ff_undef
pure subroutine, public torsion_kind_dealloc_ref(torsion_kind)
Deallocate a torsion kind element.
pure subroutine, public ub_kind_dealloc_ref(ub_kind_set)
Deallocate a ub kind set.
pure subroutine, public impr_kind_dealloc_ref()
Deallocate a impr kind element.
objects that represent the structure of input sections and the data contained in an input section
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Define the molecule kind structure types and the corresponding functionality.
subroutine, public get_molecule_kind(molecule_kind, atom_list, bond_list, bend_list, ub_list, impr_list, opbend_list, colv_list, fixd_list, g3x3_list, g4x6_list, vsite_list, torsion_list, shell_list, name, mass, charge, kind_number, natom, nbend, nbond, nub, nimpr, nopbend, nconstraint, nconstraint_fixd, nfixd, ncolv, ng3x3, ng4x6, nvsite, nfixd_restraint, ng3x3_restraint, ng4x6_restraint, nvsite_restraint, nrestraints, nmolecule, nsgf, nshell, ntorsion, molecule_list, nelectron, nelectron_alpha, nelectron_beta, bond_kind_set, bend_kind_set, ub_kind_set, impr_kind_set, opbend_kind_set, torsion_kind_set, molname_generated)
Get informations about a molecule kind.
subroutine, public write_g4x6_constraint(g4x6_constraint, ig4x6, iw)
Write G4x6 constraint information to output unit.
subroutine, public setup_colvar_counters(colv_list, ncolv)
...
subroutine, public set_molecule_kind(molecule_kind, name, mass, charge, kind_number, molecule_list, atom_list, nbond, bond_list, nbend, bend_list, nub, ub_list, nimpr, impr_list, nopbend, opbend_list, ntorsion, torsion_list, fixd_list, ncolv, colv_list, ng3x3, g3x3_list, ng4x6, nfixd, g4x6_list, nvsite, vsite_list, ng3x3_restraint, ng4x6_restraint, nfixd_restraint, nshell, shell_list, nvsite_restraint, bond_kind_set, bend_kind_set, ub_kind_set, torsion_kind_set, impr_kind_set, opbend_kind_set, nelectron, nsgf, molname_generated)
Set the components of a molecule kind.
subroutine, public deallocate_molecule_kind_set(molecule_kind_set)
Deallocate a molecule kind set.
subroutine, public get_molecule_kind_set(molecule_kind_set, maxatom, natom, nbond, nbend, nub, ntorsion, nimpr, nopbend, nconstraint, nconstraint_fixd, nmolecule, nrestraints)
Get informations about a molecule kind set.
subroutine, public write_g3x3_constraint(g3x3_constraint, ig3x3, iw)
Write G3x3 constraint information to output unit.
subroutine, public write_molecule_kind_set(molecule_kind_set, subsys_section)
Write a moleculeatomic kind set data set to the output unit.
subroutine, public write_fixd_constraint(fixd_constraint, ifixd, iw)
Write fix atom constraint information to output unit.
subroutine, public write_colvar_constraint(colvar_constraint, icolv, iw)
Write collective variable constraint information to output unit.
subroutine, public allocate_molecule_kind_set(molecule_kind_set, nmolecule_kind)
Allocate and initialize a molecule kind set.
subroutine, public write_vsite_constraint(vsite_constraint, ivsite, iw)
Write virtual site constraint information to output unit.
Handles all possible kinds of restraints in CP2K.
Definition restraint.F:14
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...