(git:9ca3469)
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-2026 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, &
190
191CONTAINS
192
193! **************************************************************************************************
194!> \brief Deallocate a global constraint.
195!> \param gci ...
196!> \par History
197!> 07.2003 created [fawzi]
198!> 01.2014 moved from cp_subsys_release() into separate routine.
199!> \author Ole Schuett
200! **************************************************************************************************
202 TYPE(global_constraint_type), POINTER :: gci
203
204 INTEGER :: i
205
206 IF (ASSOCIATED(gci)) THEN
207 ! List of constraints
208 IF (ASSOCIATED(gci%colv_list)) THEN
209 DO i = 1, SIZE(gci%colv_list)
210 DEALLOCATE (gci%colv_list(i)%i_atoms)
211 END DO
212 DEALLOCATE (gci%colv_list)
213 END IF
214
215 IF (ASSOCIATED(gci%g3x3_list)) &
216 DEALLOCATE (gci%g3x3_list)
217
218 IF (ASSOCIATED(gci%g4x6_list)) &
219 DEALLOCATE (gci%g4x6_list)
220
221 ! Local information
222 IF (ASSOCIATED(gci%lcolv)) THEN
223 DO i = 1, SIZE(gci%lcolv)
224 CALL colvar_release(gci%lcolv(i)%colvar)
225 CALL colvar_release(gci%lcolv(i)%colvar_old)
226 END DO
227 DEALLOCATE (gci%lcolv)
228 END IF
229
230 IF (ASSOCIATED(gci%lg3x3)) &
231 DEALLOCATE (gci%lg3x3)
232
233 IF (ASSOCIATED(gci%lg4x6)) &
234 DEALLOCATE (gci%lg4x6)
235
236 IF (ASSOCIATED(gci%fixd_list)) &
237 DEALLOCATE (gci%fixd_list)
238
239 DEALLOCATE (gci)
240 END IF
241 END SUBROUTINE deallocate_global_constraint
242
243! **************************************************************************************************
244!> \brief Allocate a molecule set.
245!> \param molecule_set ...
246!> \param nmolecule ...
247!> \date 29.08.2003
248!> \author Matthias Krack
249!> \version 1.0
250! **************************************************************************************************
251 SUBROUTINE allocate_molecule_set(molecule_set, nmolecule)
252 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
253 INTEGER, INTENT(IN) :: nmolecule
254
255 IF (ASSOCIATED(molecule_set)) CALL deallocate_molecule_set(molecule_set)
256
257 ALLOCATE (molecule_set(nmolecule))
258
259 END SUBROUTINE allocate_molecule_set
260
261! **************************************************************************************************
262!> \brief Deallocate a molecule set.
263!> \param molecule_set ...
264!> \date 29.08.2003
265!> \author Matthias Krack
266!> \version 1.0
267! **************************************************************************************************
268 SUBROUTINE deallocate_molecule_set(molecule_set)
269 TYPE(molecule_type), DIMENSION(:), POINTER :: molecule_set
270
271 INTEGER :: imolecule, j
272
273 IF (ASSOCIATED(molecule_set)) THEN
274
275 DO imolecule = 1, SIZE(molecule_set)
276 IF (ASSOCIATED(molecule_set(imolecule)%lmi)) THEN
277 DO j = 1, SIZE(molecule_set(imolecule)%lmi)
278 IF (ASSOCIATED(molecule_set(imolecule)%lmi(j)%states)) THEN
279 DEALLOCATE (molecule_set(imolecule)%lmi(j)%states)
280 END IF
281 END DO
282 DEALLOCATE (molecule_set(imolecule)%lmi)
283 END IF
284 IF (ASSOCIATED(molecule_set(imolecule)%lci)) THEN
285 IF (ASSOCIATED(molecule_set(imolecule)%lci%lcolv)) THEN
286 DO j = 1, SIZE(molecule_set(imolecule)%lci%lcolv)
287 CALL colvar_release(molecule_set(imolecule)%lci%lcolv(j)%colvar)
288 CALL colvar_release(molecule_set(imolecule)%lci%lcolv(j)%colvar_old)
289 END DO
290 DEALLOCATE (molecule_set(imolecule)%lci%lcolv)
291 END IF
292 IF (ASSOCIATED(molecule_set(imolecule)%lci%lg3x3)) THEN
293 DEALLOCATE (molecule_set(imolecule)%lci%lg3x3)
294 END IF
295 IF (ASSOCIATED(molecule_set(imolecule)%lci%lg4x6)) THEN
296 DEALLOCATE (molecule_set(imolecule)%lci%lg4x6)
297 END IF
298 DEALLOCATE (molecule_set(imolecule)%lci)
299 END IF
300 END DO
301 DEALLOCATE (molecule_set)
302
303 END IF
304 NULLIFY (molecule_set)
305
306 END SUBROUTINE deallocate_molecule_set
307
308! **************************************************************************************************
309!> \brief Get components from a molecule data set.
310!> \param molecule ...
311!> \param molecule_kind ...
312!> \param lmi ...
313!> \param lci ...
314!> \param lg3x3 ...
315!> \param lg4x6 ...
316!> \param lcolv ...
317!> \param first_atom ...
318!> \param last_atom ...
319!> \param first_shell ...
320!> \param last_shell ...
321!> \date 29.08.2003
322!> \author Matthias Krack
323!> \version 1.0
324! **************************************************************************************************
325 SUBROUTINE get_molecule(molecule, molecule_kind, lmi, lci, lg3x3, lg4x6, lcolv, &
326 first_atom, last_atom, first_shell, last_shell)
327
328 TYPE(molecule_type), INTENT(IN) :: molecule
329 TYPE(molecule_kind_type), OPTIONAL, POINTER :: molecule_kind
330 TYPE(local_states_type), DIMENSION(:), OPTIONAL, &
331 POINTER :: lmi
332 TYPE(local_constraint_type), OPTIONAL, POINTER :: lci
333 TYPE(local_g3x3_constraint_type), OPTIONAL, &
334 POINTER :: lg3x3(:)
335 TYPE(local_g4x6_constraint_type), OPTIONAL, &
336 POINTER :: lg4x6(:)
337 TYPE(local_colvar_constraint_type), DIMENSION(:), &
338 OPTIONAL, POINTER :: lcolv
339 INTEGER, OPTIONAL :: first_atom, last_atom, first_shell, &
340 last_shell
341
342 IF (PRESENT(first_atom)) first_atom = molecule%first_atom
343 IF (PRESENT(last_atom)) last_atom = molecule%last_atom
344 IF (PRESENT(first_shell)) first_shell = molecule%first_shell
345 IF (PRESENT(last_shell)) last_shell = molecule%last_shell
346 IF (PRESENT(molecule_kind)) molecule_kind => molecule%molecule_kind
347 IF (PRESENT(lmi)) lmi => molecule%lmi
348 IF (PRESENT(lci)) lci => molecule%lci
349 IF (PRESENT(lcolv)) THEN
350 IF (ASSOCIATED(molecule%lci)) THEN
351 lcolv => molecule%lci%lcolv
352 ELSE
353 cpabort("The pointer lci is not associated")
354 END IF
355 END IF
356 IF (PRESENT(lg3x3)) THEN
357 IF (ASSOCIATED(molecule%lci)) THEN
358 lg3x3 => molecule%lci%lg3x3
359 ELSE
360 cpabort("The pointer lci is not associated")
361 END IF
362 END IF
363 IF (PRESENT(lg4x6)) THEN
364 IF (ASSOCIATED(molecule%lci)) THEN
365 lg4x6 => molecule%lci%lg4x6
366 ELSE
367 cpabort("The pointer lci is not associated")
368 END IF
369 END IF
370
371 END SUBROUTINE get_molecule
372
373! **************************************************************************************************
374!> \brief Set a molecule data set.
375!> \param molecule ...
376!> \param molecule_kind ...
377!> \param lmi ...
378!> \param lci ...
379!> \param lcolv ...
380!> \param lg3x3 ...
381!> \param lg4x6 ...
382!> \date 29.08.2003
383!> \author Matthias Krack
384!> \version 1.0
385! **************************************************************************************************
386 SUBROUTINE set_molecule(molecule, molecule_kind, lmi, lci, lcolv, lg3x3, lg4x6)
387 TYPE(molecule_type), INTENT(INOUT) :: molecule
388 TYPE(molecule_kind_type), OPTIONAL, POINTER :: molecule_kind
389 TYPE(local_states_type), DIMENSION(:), OPTIONAL, &
390 POINTER :: lmi
391 TYPE(local_constraint_type), OPTIONAL, POINTER :: lci
392 TYPE(local_colvar_constraint_type), DIMENSION(:), &
393 OPTIONAL, POINTER :: lcolv
394 TYPE(local_g3x3_constraint_type), OPTIONAL, &
395 POINTER :: lg3x3(:)
396 TYPE(local_g4x6_constraint_type), OPTIONAL, &
397 POINTER :: lg4x6(:)
398
399 IF (PRESENT(molecule_kind)) molecule%molecule_kind => molecule_kind
400 IF (PRESENT(lmi)) molecule%lmi => lmi
401 IF (PRESENT(lci)) molecule%lci => lci
402 IF (PRESENT(lcolv)) THEN
403 IF (ASSOCIATED(molecule%lci)) THEN
404 molecule%lci%lcolv => lcolv
405 ELSE
406 cpabort("The pointer lci is not associated")
407 END IF
408 END IF
409 IF (PRESENT(lg3x3)) THEN
410 IF (ASSOCIATED(molecule%lci)) THEN
411 molecule%lci%lg3x3 => lg3x3
412 ELSE
413 cpabort("The pointer lci is not associated")
414 END IF
415 END IF
416 IF (PRESENT(lg4x6)) THEN
417 IF (ASSOCIATED(molecule%lci)) THEN
418 molecule%lci%lg4x6 => lg4x6
419 ELSE
420 cpabort("The pointer lci is not associated")
421 END IF
422 END IF
423
424 END SUBROUTINE set_molecule
425
426! **************************************************************************************************
427!> \brief Set a molecule data set.
428!> \param molecule_set ...
429!> \param first_atom ...
430!> \param last_atom ...
431!> \date 29.08.2003
432!> \author Matthias Krack
433!> \version 1.0
434! **************************************************************************************************
435 SUBROUTINE set_molecule_set(molecule_set, first_atom, last_atom)
436 TYPE(molecule_type), DIMENSION(:), INTENT(INOUT) :: molecule_set
437 INTEGER, DIMENSION(:), INTENT(IN), OPTIONAL :: first_atom, last_atom
438
439 INTEGER :: imolecule
440
441 IF (PRESENT(first_atom)) THEN
442 IF (SIZE(first_atom) /= SIZE(molecule_set)) THEN
443 CALL cp_abort(__location__, &
444 "The sizes of first_atom and molecule_set "// &
445 "are different")
446 END IF
447
448 DO imolecule = 1, SIZE(molecule_set)
449 molecule_set(imolecule)%first_atom = first_atom(imolecule)
450 END DO
451 END IF
452
453 IF (PRESENT(last_atom)) THEN
454 IF (SIZE(last_atom) /= SIZE(molecule_set)) THEN
455 CALL cp_abort(__location__, &
456 "The sizes of last_atom and molecule_set "// &
457 "are different")
458 END IF
459
460 DO imolecule = 1, SIZE(molecule_set)
461 molecule_set(imolecule)%last_atom = last_atom(imolecule)
462 END DO
463 END IF
464
465 END SUBROUTINE set_molecule_set
466
467! **************************************************************************************************
468!> \brief finds for each atom the molecule it belongs to
469!> \param molecule_set ...
470!> \param atom_to_mol ...
471! **************************************************************************************************
472 SUBROUTINE molecule_of_atom(molecule_set, atom_to_mol)
473 TYPE(molecule_type), DIMENSION(:), INTENT(IN) :: molecule_set
474 INTEGER, DIMENSION(:), INTENT(OUT) :: atom_to_mol
475
476 INTEGER :: first_atom, iatom, imol, last_atom
477
478 DO imol = 1, SIZE(molecule_set)
479 CALL get_molecule(molecule=molecule_set(imol), first_atom=first_atom, last_atom=last_atom)
480 DO iatom = first_atom, last_atom
481 atom_to_mol(iatom) = imol
482 END DO ! iatom
483 END DO ! imol
484
485 END SUBROUTINE molecule_of_atom
486
487! **************************************************************************************************
488!> \brief returns information about molecules in the set.
489!> \param molecule_set ...
490!> \param atom_to_mol ...
491!> \param mol_to_first_atom ...
492!> \param mol_to_last_atom ...
493!> \param mol_to_nelectrons ...
494!> \param mol_to_nbasis ...
495!> \param mol_to_charge ...
496!> \param mol_to_multiplicity ...
497!> \par History
498!> 2011.06 created [Rustam Z Khaliullin]
499!> \author Rustam Z Khaliullin
500! **************************************************************************************************
501 SUBROUTINE get_molecule_set_info(molecule_set, atom_to_mol, mol_to_first_atom, &
502 mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, &
503 mol_to_multiplicity)
504
505 TYPE(molecule_type), DIMENSION(:), INTENT(IN) :: molecule_set
506 INTEGER, DIMENSION(:), INTENT(OUT), OPTIONAL :: atom_to_mol, mol_to_first_atom, &
507 mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity
508
509 INTEGER :: first_atom, iatom, imol, last_atom, &
510 nbasis, nelec
511 REAL(kind=dp) :: charge
512 TYPE(molecule_kind_type), POINTER :: imol_kind
513
514 DO imol = 1, SIZE(molecule_set)
515
516 CALL get_molecule(molecule=molecule_set(imol), molecule_kind=imol_kind, &
517 first_atom=first_atom, last_atom=last_atom)
518
519 IF (PRESENT(mol_to_nelectrons)) THEN
520 CALL get_molecule_kind(imol_kind, nelectron=nelec)
521 mol_to_nelectrons(imol) = nelec
522 END IF
523
524 IF (PRESENT(mol_to_multiplicity)) THEN
525 ! RZK-warning: At the moment we can only get the total number
526 ! of electrons (alpha+beta) and we do not have a way to get the multiplicity of mols.
527 ! Therefore, the best we can do is to assume the singlet state for even number of electrons
528 ! and doublet state for odd number of electrons (assume ne_alpha > ne_beta).
529 ! The best way to implement a correct multiplicity subroutine in the future is to get
530 ! the number of alpha and beta e- for each atom from init_atom_electronic_state. This way (as opposed to
531 ! reading the multiplicities from file) the number of occupied and virtual orbitals
532 ! will be consistent with atomic guess. A guess with broken symmetry will be easy to
533 ! implement as well.
534 CALL get_molecule_kind(imol_kind, nelectron=nelec)
535 IF (mod(nelec, 2) == 0) THEN
536 mol_to_multiplicity(imol) = 1
537 ELSE
538 mol_to_multiplicity(imol) = 2
539 END IF
540 END IF
541
542 IF (PRESENT(mol_to_charge)) THEN
543 CALL get_molecule_kind(imol_kind, charge=charge)
544 mol_to_charge(imol) = nint(charge)
545 END IF
546
547 IF (PRESENT(mol_to_nbasis)) THEN
548 CALL get_molecule_kind(imol_kind, nsgf=nbasis)
549 mol_to_nbasis(imol) = nbasis
550 END IF
551
552 IF (PRESENT(mol_to_first_atom)) THEN
553 mol_to_first_atom(imol) = first_atom
554 END IF
555
556 IF (PRESENT(mol_to_last_atom)) THEN
557 mol_to_last_atom(imol) = last_atom
558 END IF
559
560 IF (PRESENT(atom_to_mol)) THEN
561 DO iatom = first_atom, last_atom
562 atom_to_mol(iatom) = imol
563 END DO ! iatom
564 END IF
565
566 END DO ! imol
567
568 END SUBROUTINE get_molecule_set_info
569
570! **************************************************************************************************
571!> \brief ...
572!> \param molecule_set ...
573!> \param atom_to_mol ...
574!> \param mol_to_first_atom ...
575!> \param mol_to_last_atom ...
576!> \param mol_to_nelectrons ...
577!> \param mol_to_nbasis ...
578!> \param mol_to_charge ...
579!> \param mol_to_multiplicity ...
580! **************************************************************************************************
581 SUBROUTINE get_domain_set_info(molecule_set, atom_to_mol, mol_to_first_atom, &
582 mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, &
583 mol_to_multiplicity)
584
585 TYPE(molecule_type), DIMENSION(:), INTENT(IN) :: molecule_set
586 INTEGER, DIMENSION(:), INTENT(OUT), OPTIONAL :: atom_to_mol, mol_to_first_atom, &
587 mol_to_last_atom, mol_to_nelectrons, mol_to_nbasis, mol_to_charge, mol_to_multiplicity
588
589 INTEGER :: first_atom, iatom, imol, last_atom, &
590 nbasis, nelec
591 REAL(kind=dp) :: charge
592 TYPE(molecule_kind_type), POINTER :: imol_kind
593
594 DO imol = 1, SIZE(molecule_set)
595
596 CALL get_molecule(molecule=molecule_set(imol), molecule_kind=imol_kind, &
597 first_atom=first_atom, last_atom=last_atom)
598
599 IF (PRESENT(mol_to_nelectrons)) THEN
600 CALL get_molecule_kind(imol_kind, nelectron=nelec)
601 mol_to_nelectrons(imol) = nelec
602 END IF
603
604 IF (PRESENT(mol_to_multiplicity)) THEN
605 ! RZK-warning: At the moment we can only get the total number
606 ! of electrons (alpha+beta) and we do not have a way to get the multiplicity of mols.
607 ! Therefore, the best we can do is to assume the singlet state for even number of electrons
608 ! and doublet state for odd number of electrons (assume ne_alpha > ne_beta).
609 ! The best way to implement a correct multiplicity subroutine in the future is to get
610 ! the number of alpha and beta e- for each atom from init_atom_electronic_state. This way (as opposed to
611 ! reading the multiplicities from file) the number of occupied and virtual orbitals
612 ! will be consistent with atomic guess. A guess with broken symmetry will be easy to
613 ! implement as well.
614 CALL get_molecule_kind(imol_kind, nelectron=nelec)
615 IF (mod(nelec, 2) == 0) THEN
616 mol_to_multiplicity(imol) = 1
617 ELSE
618 mol_to_multiplicity(imol) = 2
619 END IF
620 END IF
621
622 IF (PRESENT(mol_to_charge)) THEN
623 CALL get_molecule_kind(imol_kind, charge=charge)
624 mol_to_charge(imol) = nint(charge)
625 END IF
626
627 IF (PRESENT(mol_to_nbasis)) THEN
628 CALL get_molecule_kind(imol_kind, nsgf=nbasis)
629 mol_to_nbasis(imol) = nbasis
630 END IF
631
632 IF (PRESENT(mol_to_first_atom)) THEN
633 mol_to_first_atom(imol) = first_atom
634 END IF
635
636 IF (PRESENT(mol_to_last_atom)) THEN
637 mol_to_last_atom(imol) = last_atom
638 END IF
639
640 IF (PRESENT(atom_to_mol)) THEN
641 DO iatom = first_atom, last_atom
642 atom_to_mol(iatom) = imol
643 END DO ! iatom
644 END IF
645
646 END DO ! imol
647
648 END SUBROUTINE get_domain_set_info
649
650END 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 get_domain_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)
...
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