(git:e68414f)
Loading...
Searching...
No Matches
molecule_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Define the data structure for the molecule information.
10!> \par History
11!> JGH (22.05.2004) add last_atom information
12!> Teodoro Laino [tlaino] 12.2008 - Preparing for VIRTUAL SITE constraints
13!> (patch by Marcel Baer)
14!> \author Matthias Krack (29.08.2003)
15! **************************************************************************************************
17
18 USE colvar_types, ONLY: colvar_counters,&
21 USE kinds, ONLY: dp
29#include "../base/base_uses.f90"
30
31 IMPLICIT NONE
32
33 PRIVATE
34
35 ! Global parameters (in this module)
36
37 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'molecule_types'
38
39 ! Molecular constraint types
41 TYPE(colvar_type), POINTER :: colvar => null(), &
42 colvar_old => null()
43 REAL(kind=dp) :: lambda = 0.0_dp, &
44 sigma = 0.0_dp
45 LOGICAL :: init = .false.
47
49 LOGICAL :: init = .false.
50 REAL(kind=dp) :: scale = 0.0_dp, &
51 imass1 = 0.0_dp, &
52 imass2 = 0.0_dp, &
53 imass3 = 0.0_dp, &
54 scale_old = 0.0_dp
55 REAL(kind=dp), DIMENSION(3) :: fa = 0.0_dp, &
56 fb = 0.0_dp, &
57 fc = 0.0_dp, &
58 f_roll1 = 0.0_dp, &
59 f_roll2 = 0.0_dp, &
60 f_roll3 = 0.0_dp, &
61 ra_old = 0.0_dp, &
62 rb_old = 0.0_dp, &
63 rc_old = 0.0_dp, &
64 r0_12 = 0.0_dp, &
65 r0_13 = 0.0_dp, &
66 r0_23 = 0.0_dp, &
67 va = 0.0_dp, &
68 vb = 0.0_dp, &
69 vc = 0.0_dp, &
70 del_lambda = 0.0_dp, &
71 lambda = 0.0_dp, &
72 lambda_old = 0.0_dp
73 REAL(kind=dp), DIMENSION(3, 3) :: amat = 0.0_dp
75
77 LOGICAL :: init = .false.
78 REAL(kind=dp) :: scale = 0.0_dp, &
79 scale_old = 0.0_dp, &
80 imass1 = 0.0_dp, &
81 imass2 = 0.0_dp, &
82 imass3 = 0.0_dp, &
83 imass4 = 0.0_dp
84 REAL(kind=dp), DIMENSION(3) :: fa = 0.0_dp, &
85 fb = 0.0_dp, &
86 fc = 0.0_dp, &
87 fd = 0.0_dp, &
88 fe = 0.0_dp, &
89 ff = 0.0_dp, &
90 f_roll1 = 0.0_dp, &
91 f_roll2 = 0.0_dp, &
92 f_roll3 = 0.0_dp, &
93 f_roll4 = 0.0_dp, &
94 f_roll5 = 0.0_dp, &
95 f_roll6 = 0.0_dp, &
96 ra_old = 0.0_dp, &
97 rb_old = 0.0_dp, &
98 rc_old = 0.0_dp, &
99 rd_old = 0.0_dp, &
100 re_old = 0.0_dp, &
101 rf_old = 0.0_dp, &
102 va = 0.0_dp, &
103 vb = 0.0_dp, &
104 vc = 0.0_dp, &
105 vd = 0.0_dp, &
106 ve = 0.0_dp, &
107 vf = 0.0_dp, &
108 r0_12 = 0.0_dp, &
109 r0_13 = 0.0_dp, &
110 r0_14 = 0.0_dp, &
111 r0_23 = 0.0_dp, &
112 r0_24 = 0.0_dp, &
113 r0_34 = 0.0_dp
114 REAL(kind=dp), DIMENSION(6) :: del_lambda = 0.0_dp, &
115 lambda = 0.0_dp, &
116 lambda_old = 0.0_dp
117 REAL(kind=dp), DIMENSION(6, 6) :: amat = 0.0_dp
119
121 INTEGER :: nstates = 0 ! Kohn-Sham states for molecule
122 INTEGER, DIMENSION(:), POINTER :: states => null() ! indices of Kohn-Sham states for molecule
123 END TYPE local_states_type
124
127 DIMENSION(:), POINTER :: lcolv => null()
128 TYPE(local_g3x3_constraint_type), DIMENSION(:), &
129 POINTER :: lg3x3 => null()
130 TYPE(local_g4x6_constraint_type), DIMENSION(:), &
131 POINTER :: lg4x6 => null()
132 END TYPE local_constraint_type
133
136 INTEGER :: ntot = 0, &
137 nrestraint = 0, &
138 ng3x3 = 0, &
139 ng3x3_restraint = 0, &
140 ng4x6 = 0, &
141 ng4x6_restraint = 0, &
142 nvsite = 0, &
143 nvsite_restraint = 0
144 TYPE(fixd_constraint_type), DIMENSION(:), POINTER :: fixd_list => null()
145 TYPE(colvar_constraint_type), DIMENSION(:), &
146 POINTER :: colv_list => null()
147 TYPE(g3x3_constraint_type), DIMENSION(:), POINTER :: g3x3_list => null()
148 TYPE(g4x6_constraint_type), DIMENSION(:), POINTER :: g4x6_list => null()
149 TYPE(vsite_constraint_type), DIMENSION(:), POINTER :: vsite_list => null()
151 DIMENSION(:), POINTER :: lcolv => null()
152 TYPE(local_g3x3_constraint_type), DIMENSION(:), &
153 POINTER :: lg3x3 => null()
154 TYPE(local_g4x6_constraint_type), DIMENSION(:), &
155 POINTER :: lg4x6 => null()
157
158 ! Molecule type
160 TYPE(molecule_kind_type), POINTER :: molecule_kind => null() ! pointer to molecule kind information
161 TYPE(local_states_type), DIMENSION(:), POINTER :: lmi => null() ! local (spin)-states information
162 TYPE(local_constraint_type), POINTER :: lci => null() ! local molecule constraint info
163 INTEGER :: first_atom = 0 ! global index of first atom in molecule
164 INTEGER :: last_atom = 0 ! global index of last atom in molecule
165 INTEGER :: first_shell = 0 ! global index of first shell atom in molecule
166 INTEGER :: last_shell = 0 ! global index of last shell atom in molecule
167 END TYPE molecule_type
168
169 ! Public data types
170
178
179 ! Public subroutines
180
184 get_molecule, &
185 set_molecule, &
189
190CONTAINS
191
192! **************************************************************************************************
193!> \brief Deallocate a global constraint.
194!> \param gci ...
195!> \par History
196!> 07.2003 created [fawzi]
197!> 01.2014 moved from cp_subsys_release() into separate routine.
198!> \author Ole Schuett
199! **************************************************************************************************
201 TYPE(global_constraint_type), POINTER :: gci
202
203 INTEGER :: i
204
205 IF (ASSOCIATED(gci)) THEN
206 ! List of constraints
207 IF (ASSOCIATED(gci%colv_list)) THEN
208 DO i = 1, SIZE(gci%colv_list)
209 DEALLOCATE (gci%colv_list(i)%i_atoms)
210 END DO
211 DEALLOCATE (gci%colv_list)
212 END IF
213
214 IF (ASSOCIATED(gci%g3x3_list)) &
215 DEALLOCATE (gci%g3x3_list)
216
217 IF (ASSOCIATED(gci%g4x6_list)) &
218 DEALLOCATE (gci%g4x6_list)
219
220 ! Local information
221 IF (ASSOCIATED(gci%lcolv)) THEN
222 DO i = 1, SIZE(gci%lcolv)
223 CALL colvar_release(gci%lcolv(i)%colvar)
224 CALL colvar_release(gci%lcolv(i)%colvar_old)
225 END DO
226 DEALLOCATE (gci%lcolv)
227 END IF
228
229 IF (ASSOCIATED(gci%lg3x3)) &
230 DEALLOCATE (gci%lg3x3)
231
232 IF (ASSOCIATED(gci%lg4x6)) &
233 DEALLOCATE (gci%lg4x6)
234
235 IF (ASSOCIATED(gci%fixd_list)) &
236 DEALLOCATE (gci%fixd_list)
237
238 DEALLOCATE (gci)
239 END IF
240 END SUBROUTINE deallocate_global_constraint
241
242! **************************************************************************************************
243!> \brief Allocate a molecule set.
244!> \param molecule_set ...
245!> \param nmolecule ...
246!> \date 29.08.2003
247!> \author Matthias Krack
248!> \version 1.0
249! **************************************************************************************************
250 SUBROUTINE allocate_molecule_set(molecule_set, nmolecule)
251 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
252 INTEGER, INTENT(IN) :: nmolecule
253
254 IF (ASSOCIATED(molecule_set)) CALL deallocate_molecule_set(molecule_set)
255
256 ALLOCATE (molecule_set(nmolecule))
257
258 END SUBROUTINE allocate_molecule_set
259
260! **************************************************************************************************
261!> \brief Deallocate a molecule set.
262!> \param molecule_set ...
263!> \date 29.08.2003
264!> \author Matthias Krack
265!> \version 1.0
266! **************************************************************************************************
267 SUBROUTINE deallocate_molecule_set(molecule_set)
268 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
269
270 INTEGER :: imolecule, j
271
272 IF (ASSOCIATED(molecule_set)) THEN
273
274 DO imolecule = 1, SIZE(molecule_set)
275 IF (ASSOCIATED(molecule_set(imolecule)%lmi)) THEN
276 DO j = 1, SIZE(molecule_set(imolecule)%lmi)
277 IF (ASSOCIATED(molecule_set(imolecule)%lmi(j)%states)) THEN
278 DEALLOCATE (molecule_set(imolecule)%lmi(j)%states)
279 END IF
280 END DO
281 DEALLOCATE (molecule_set(imolecule)%lmi)
282 END IF
283 IF (ASSOCIATED(molecule_set(imolecule)%lci)) THEN
284 IF (ASSOCIATED(molecule_set(imolecule)%lci%lcolv)) THEN
285 DO j = 1, SIZE(molecule_set(imolecule)%lci%lcolv)
286 CALL colvar_release(molecule_set(imolecule)%lci%lcolv(j)%colvar)
287 CALL colvar_release(molecule_set(imolecule)%lci%lcolv(j)%colvar_old)
288 END DO
289 DEALLOCATE (molecule_set(imolecule)%lci%lcolv)
290 END IF
291 IF (ASSOCIATED(molecule_set(imolecule)%lci%lg3x3)) THEN
292 DEALLOCATE (molecule_set(imolecule)%lci%lg3x3)
293 END IF
294 IF (ASSOCIATED(molecule_set(imolecule)%lci%lg4x6)) THEN
295 DEALLOCATE (molecule_set(imolecule)%lci%lg4x6)
296 END IF
297 DEALLOCATE (molecule_set(imolecule)%lci)
298 END IF
299 END DO
300 DEALLOCATE (molecule_set)
301
302 END IF
303 NULLIFY (molecule_set)
304
305 END SUBROUTINE deallocate_molecule_set
306
307! **************************************************************************************************
308!> \brief Get components from a molecule data set.
309!> \param molecule ...
310!> \param molecule_kind ...
311!> \param lmi ...
312!> \param lci ...
313!> \param lg3x3 ...
314!> \param lg4x6 ...
315!> \param lcolv ...
316!> \param first_atom ...
317!> \param last_atom ...
318!> \param first_shell ...
319!> \param last_shell ...
320!> \date 29.08.2003
321!> \author Matthias Krack
322!> \version 1.0
323! **************************************************************************************************
324 SUBROUTINE get_molecule(molecule, molecule_kind, lmi, lci, lg3x3, lg4x6, lcolv, &
325 first_atom, last_atom, first_shell, last_shell)
326
327 TYPE(molecule_type), INTENT(IN) :: molecule
328 TYPE(molecule_kind_type), OPTIONAL, POINTER :: molecule_kind
329 TYPE(local_states_type), DIMENSION(:), OPTIONAL, &
330 POINTER :: lmi
331 TYPE(local_constraint_type), OPTIONAL, POINTER :: lci
332 TYPE(local_g3x3_constraint_type), OPTIONAL, &
333 POINTER :: lg3x3(:)
334 TYPE(local_g4x6_constraint_type), OPTIONAL, &
335 POINTER :: lg4x6(:)
336 TYPE(local_colvar_constraint_type), DIMENSION(:), &
337 OPTIONAL, POINTER :: lcolv
338 INTEGER, OPTIONAL :: first_atom, last_atom, first_shell, &
339 last_shell
340
341 IF (PRESENT(first_atom)) first_atom = molecule%first_atom
342 IF (PRESENT(last_atom)) last_atom = molecule%last_atom
343 IF (PRESENT(first_shell)) first_shell = molecule%first_shell
344 IF (PRESENT(last_shell)) last_shell = molecule%last_shell
345 IF (PRESENT(molecule_kind)) molecule_kind => molecule%molecule_kind
346 IF (PRESENT(lmi)) lmi => molecule%lmi
347 IF (PRESENT(lci)) lci => molecule%lci
348 IF (PRESENT(lcolv)) THEN
349 IF (ASSOCIATED(molecule%lci)) THEN
350 lcolv => molecule%lci%lcolv
351 ELSE
352 cpabort("The pointer lci is not associated")
353 END IF
354 END IF
355 IF (PRESENT(lg3x3)) THEN
356 IF (ASSOCIATED(molecule%lci)) THEN
357 lg3x3 => molecule%lci%lg3x3
358 ELSE
359 cpabort("The pointer lci is not associated")
360 END IF
361 END IF
362 IF (PRESENT(lg4x6)) THEN
363 IF (ASSOCIATED(molecule%lci)) THEN
364 lg4x6 => molecule%lci%lg4x6
365 ELSE
366 cpabort("The pointer lci is not associated")
367 END IF
368 END IF
369
370 END SUBROUTINE get_molecule
371
372! **************************************************************************************************
373!> \brief Set a molecule data set.
374!> \param molecule ...
375!> \param molecule_kind ...
376!> \param lmi ...
377!> \param lci ...
378!> \param lcolv ...
379!> \param lg3x3 ...
380!> \param lg4x6 ...
381!> \date 29.08.2003
382!> \author Matthias Krack
383!> \version 1.0
384! **************************************************************************************************
385 SUBROUTINE set_molecule(molecule, molecule_kind, lmi, lci, lcolv, lg3x3, lg4x6)
386 TYPE(molecule_type), INTENT(INOUT) :: molecule
387 TYPE(molecule_kind_type), OPTIONAL, POINTER :: molecule_kind
388 TYPE(local_states_type), DIMENSION(:), OPTIONAL, &
389 POINTER :: lmi
390 TYPE(local_constraint_type), OPTIONAL, POINTER :: lci
391 TYPE(local_colvar_constraint_type), DIMENSION(:), &
392 OPTIONAL, POINTER :: lcolv
393 TYPE(local_g3x3_constraint_type), OPTIONAL, &
394 POINTER :: lg3x3(:)
395 TYPE(local_g4x6_constraint_type), OPTIONAL, &
396 POINTER :: lg4x6(:)
397
398 IF (PRESENT(molecule_kind)) molecule%molecule_kind => molecule_kind
399 IF (PRESENT(lmi)) molecule%lmi => lmi
400 IF (PRESENT(lci)) molecule%lci => lci
401 IF (PRESENT(lcolv)) THEN
402 IF (ASSOCIATED(molecule%lci)) THEN
403 molecule%lci%lcolv => lcolv
404 ELSE
405 cpabort("The pointer lci is not associated")
406 END IF
407 END IF
408 IF (PRESENT(lg3x3)) THEN
409 IF (ASSOCIATED(molecule%lci)) THEN
410 molecule%lci%lg3x3 => lg3x3
411 ELSE
412 cpabort("The pointer lci is not associated")
413 END IF
414 END IF
415 IF (PRESENT(lg4x6)) THEN
416 IF (ASSOCIATED(molecule%lci)) THEN
417 molecule%lci%lg4x6 => lg4x6
418 ELSE
419 cpabort("The pointer lci is not associated")
420 END IF
421 END IF
422
423 END SUBROUTINE set_molecule
424
425! **************************************************************************************************
426!> \brief Set a molecule data set.
427!> \param molecule_set ...
428!> \param first_atom ...
429!> \param last_atom ...
430!> \date 29.08.2003
431!> \author Matthias Krack
432!> \version 1.0
433! **************************************************************************************************
434 SUBROUTINE set_molecule_set(molecule_set, first_atom, last_atom)
435 TYPE(molecule_type), DIMENSION(:), INTENT(INOUT) :: molecule_set
436 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: first_atom, last_atom
437
438 INTEGER :: imolecule
439
440 IF (PRESENT(first_atom)) THEN
441 IF (SIZE(first_atom) /= SIZE(molecule_set)) THEN
442 CALL cp_abort(__location__, &
443 "The sizes of first_atom and molecule_set "// &
444 "are different")
445 END IF
446
447 DO imolecule = 1, SIZE(molecule_set)
448 molecule_set(imolecule)%first_atom = first_atom(imolecule)
449 END DO
450 END IF
451
452 IF (PRESENT(last_atom)) THEN
453 IF (SIZE(last_atom) /= SIZE(molecule_set)) THEN
454 CALL cp_abort(__location__, &
455 "The sizes of last_atom and molecule_set "// &
456 "are different")
457 END IF
458
459 DO imolecule = 1, SIZE(molecule_set)
460 molecule_set(imolecule)%last_atom = last_atom(imolecule)
461 END DO
462 END IF
463
464 END SUBROUTINE set_molecule_set
465
466! **************************************************************************************************
467!> \brief finds for each atom the molecule it belongs to
468!> \param molecule_set ...
469!> \param atom_to_mol ...
470! **************************************************************************************************
471 SUBROUTINE molecule_of_atom(molecule_set, atom_to_mol)
472 TYPE(molecule_type), DIMENSION(:), INTENT(IN) :: molecule_set
473 INTEGER, DIMENSION(:), INTENT(OUT) :: atom_to_mol
474
475 INTEGER :: first_atom, iatom, imol, last_atom
476
477 DO imol = 1, SIZE(molecule_set)
478 CALL get_molecule(molecule=molecule_set(imol), first_atom=first_atom, last_atom=last_atom)
479 DO iatom = first_atom, last_atom
480 atom_to_mol(iatom) = imol
481 END DO ! iatom
482 END DO ! imol
483
484 END SUBROUTINE molecule_of_atom
485
486! **************************************************************************************************
487!> \brief returns information about molecules in the set.
488!> \param molecule_set ...
489!> \param atom_to_mol ...
490!> \param mol_to_first_atom ...
491!> \param mol_to_last_atom ...
492!> \param mol_to_nelectrons ...
493!> \param mol_to_nbasis ...
494!> \param mol_to_charge ...
495!> \param mol_to_multiplicity ...
496!> \par History
497!> 2011.06 created [Rustam Z Khaliullin]
498!> \author Rustam Z Khaliullin
499! **************************************************************************************************
500 SUBROUTINE get_molecule_set_info(molecule_set, atom_to_mol, mol_to_first_atom, &
501 mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, &
502 mol_to_multiplicity)
503
504 TYPE(molecule_type), DIMENSION(:), INTENT(IN) :: molecule_set
505 INTEGER, DIMENSION(:), INTENT(OUT), OPTIONAL :: atom_to_mol, mol_to_first_atom, &
506 mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity
507
508 INTEGER :: first_atom, iatom, imol, last_atom, &
509 nbasis, nelec
510 REAL(kind=dp) :: charge
511 TYPE(molecule_kind_type), POINTER :: imol_kind
512
513 DO imol = 1, SIZE(molecule_set)
514
515 CALL get_molecule(molecule=molecule_set(imol), molecule_kind=imol_kind, &
516 first_atom=first_atom, last_atom=last_atom)
517
518 IF (PRESENT(mol_to_nelectrons)) THEN
519 CALL get_molecule_kind(imol_kind, nelectron=nelec)
520 mol_to_nelectrons(imol) = nelec
521 END IF
522
523 IF (PRESENT(mol_to_multiplicity)) THEN
524 ! RZK-warning: At the moment we can only get the total number
525 ! of electrons (alpha+beta) and we do not have a way to get the multiplicity of mols.
526 ! Therefore, the best we can do is to assume the singlet state for even number of electrons
527 ! and doublet state for odd number of electrons (assume ne_alpha > ne_beta).
528 ! The best way to implement a correct multiplicity subroutine in the future is to get
529 ! the number of alpha and beta e- for each atom from init_atom_electronic_state. This way (as opposed to
530 ! reading the multiplicities from file) the number of occupied and virtual orbitals
531 ! will be consistent with atomic guess. A guess with broken symmetry will be easy to
532 ! implement as well.
533 CALL get_molecule_kind(imol_kind, nelectron=nelec)
534 IF (mod(nelec, 2) .EQ. 0) THEN
535 mol_to_multiplicity(imol) = 1
536 ELSE
537 mol_to_multiplicity(imol) = 2
538 END IF
539 END IF
540
541 IF (PRESENT(mol_to_charge)) THEN
542 CALL get_molecule_kind(imol_kind, charge=charge)
543 mol_to_charge(imol) = nint(charge)
544 END IF
545
546 IF (PRESENT(mol_to_nbasis)) THEN
547 CALL get_molecule_kind(imol_kind, nsgf=nbasis)
548 mol_to_nbasis(imol) = nbasis
549 END IF
550
551 IF (PRESENT(mol_to_first_atom)) THEN
552 mol_to_first_atom(imol) = first_atom
553 END IF
554
555 IF (PRESENT(mol_to_last_atom)) THEN
556 mol_to_last_atom(imol) = last_atom
557 END IF
558
559 IF (PRESENT(atom_to_mol)) THEN
560 DO iatom = first_atom, last_atom
561 atom_to_mol(iatom) = imol
562 END DO ! iatom
563 END IF
564
565 END DO ! imol
566
567 END SUBROUTINE get_molecule_set_info
568
569END MODULE molecule_types
Initialize the collective variables types.
recursive subroutine, public colvar_release(colvar)
releases the memory that might have been allocated by the colvar
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
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.
Define the data structure for the molecule information.
subroutine, public deallocate_molecule_set(molecule_set)
Deallocate a molecule set.
subroutine, public deallocate_global_constraint(gci)
Deallocate a global constraint.
subroutine, public get_molecule(molecule, molecule_kind, lmi, lci, lg3x3, lg4x6, lcolv, first_atom, last_atom, first_shell, last_shell)
Get components from a molecule data set.
subroutine, public allocate_molecule_set(molecule_set, nmolecule)
Allocate a molecule set.
subroutine, public molecule_of_atom(molecule_set, atom_to_mol)
finds for each atom the molecule it belongs to
subroutine, public set_molecule_set(molecule_set, first_atom, last_atom)
Set a molecule data set.
subroutine, public set_molecule(molecule, molecule_kind, lmi, lci, lcolv, lg3x3, lg4x6)
Set a molecule data set.
subroutine, public get_molecule_set_info(molecule_set, atom_to_mol, mol_to_first_atom, mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity)
returns information about molecules in the set.
parameters for a collective variable