67#include "../../base/base_uses.f90"
89 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'thermostat_utils'
104 print_section, particles, gci)
113 INTEGER :: natom, nconstraint_ext, nconstraint_int, &
114 nrestraints_int, rot_dof, &
120 natom=natom, nconstraint=nconstraint_int, nrestraints=nrestraints_int)
123 CALL rot_ana(particles%els, dof=roto_trasl_dof, rot_dof=rot_dof, &
124 print_section=print_section, keep_rotations=.false., &
125 mass_weighted=.true., natoms=natom)
127 roto_trasl_dof = roto_trasl_dof - min(sum(cell%perd(1:3)), rot_dof)
130 simpar%nfree_rot_transl = roto_trasl_dof
133 nconstraint_ext = gci%ntot - gci%nrestraint
134 simpar%nfree = 3*natom - nconstraint_int - nconstraint_ext - roto_trasl_dof
155 local_molecules, molecules, particles, print_section, region_sections, gci, &
167 INTEGER,
INTENT(IN) :: region
170 INTEGER :: ic, iw, natom, nconstraint_ext, &
171 nconstraint_int, nrestraints_int, &
172 rot_dof, roto_trasl_dof
175 cpassert(
ASSOCIATED(gci))
179 natom=natom, nconstraint=nconstraint_int, nrestraints=nrestraints_int)
182 CALL rot_ana(particles%els, dof=roto_trasl_dof, rot_dof=rot_dof, &
183 print_section=print_section, keep_rotations=.false., &
184 mass_weighted=.true., natoms=natom)
186 roto_trasl_dof = roto_trasl_dof - min(sum(cell%perd(1:3)), rot_dof)
190 local_molecules, molecules, particles, region, simpar%ensemble, roto_trasl_dof, &
191 region_sections=region_sections, qmmm_env=qmmm_env)
194 simpar%nfree_rot_transl = roto_trasl_dof
197 nconstraint_ext = gci%ntot - gci%nrestraint
198 simpar%nfree = 3*natom - nconstraint_int - nconstraint_ext - roto_trasl_dof
204 WRITE (iw,
'(/,T2,A)') &
205 'DOF| Calculation of degrees of freedom'
206 WRITE (iw,
'(T2,A,T71,I10)') &
207 'DOF| Number of atoms', natom, &
208 'DOF| Number of intramolecular constraints', nconstraint_int, &
209 'DOF| Number of intermolecular constraints', nconstraint_ext, &
210 'DOF| Invariants (translations + rotations)', roto_trasl_dof, &
211 'DOF| Degrees of freedom', simpar%nfree
212 WRITE (iw,
'(/,T2,A)') &
213 'DOF| Restraints information'
214 WRITE (iw,
'(T2,A,T71,I10)') &
215 'DOF| Number of intramolecular restraints', nrestraints_int, &
216 'DOF| Number of intermolecular restraints', gci%nrestraint
217 IF (
ASSOCIATED(gci%colv_list))
THEN
218 DO ic = 1,
SIZE(gci%colv_list)
222 IF (
ASSOCIATED(gci%fixd_list))
THEN
223 DO ic = 1,
SIZE(gci%fixd_list)
227 IF (
ASSOCIATED(gci%g3x3_list))
THEN
228 DO ic = 1,
SIZE(gci%g3x3_list)
232 IF (
ASSOCIATED(gci%g4x6_list))
THEN
233 DO ic = 1,
SIZE(gci%g4x6_list)
237 IF (
ASSOCIATED(gci%vsite_list))
THEN
238 DO ic = 1,
SIZE(gci%vsite_list)
264 molecules, particles, region, ensemble, nfree, shell, region_sections, qmmm_env)
270 INTEGER,
INTENT(IN) :: region, ensemble
271 INTEGER,
INTENT(INOUT),
OPTIONAL :: nfree
272 LOGICAL,
INTENT(IN),
OPTIONAL :: shell
276 INTEGER :: dis_type, first_atom, i, ikind, imol, imol_global, ipart, itherm, katom, &
277 last_atom, natom, natom_local, nkind, nmol_local, nmol_per_kind, nmolecule, nshell, &
278 number, stat, sum_of_thermostats
279 INTEGER,
POINTER :: molecule_list(:), thermolist(:)
280 LOGICAL :: check, do_shell, nointer, on_therm
284 NULLIFY (molecule_kind, molecule, thermostat_info%map_loc_thermo_gen, thermolist)
285 nkind =
SIZE(molecule_kind_set)
287 IF (
PRESENT(shell)) do_shell = shell
289 sum_of_thermostats = 0
296 CALL get_adiabatic_region_info(region_sections, sum_of_thermostats, &
297 thermolist=thermolist, &
298 molecule_kind_set=molecule_kind_set, &
299 molecules=molecules, particles=particles, qmmm_env=qmmm_env)
302 molecule_set => molecules%els
303 SELECT CASE (ensemble)
305 cpabort(
'Unknown ensemble')
311 sum_of_thermostats = 1
316 molecule_kind => molecule_kind_set(ikind)
317 nmol_per_kind = local_molecules%n_el(ikind)
319 molecule_list=molecule_list)
321 DO imol_global = 1,
SIZE(molecule_list)
322 molecule => molecule_set(molecule_list(imol_global))
326 DO katom = first_atom, last_atom
327 IF (thermolist(katom) == huge(0))
THEN
334 DO katom = first_atom, last_atom
335 thermolist(katom) = itherm
341 molecule_kind => molecule_kind_set(i)
343 IF ((do_shell) .AND. (nshell == 0)) nmolecule = 0
344 sum_of_thermostats = sum_of_thermostats + nmolecule
348 IF ((nmolecule == 1) .AND. (nkind == 1)) nointer = .false.
352 molecule_kind => molecule_kind_set(i)
354 natom=natom, nshell=nshell)
355 IF (do_shell) natom = nshell
356 sum_of_thermostats = sum_of_thermostats + 3*natom*nmolecule
361 DO ikind = 1,
SIZE(molecule_kind_set)
362 nmol_per_kind = local_molecules%n_el(ikind)
363 DO imol = 1, nmol_per_kind
364 i = local_molecules%list(ikind)%array(imol)
365 molecule => molecule_set(i)
366 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
367 DO ipart = first_atom, last_atom
368 natom_local = natom_local + 1
374 ALLOCATE (thermostat_info%map_loc_thermo_gen(natom_local), stat=stat)
375 thermostat_info%map_loc_thermo_gen = huge(0)
378 DO ikind = 1,
SIZE(molecule_kind_set)
379 nmol_per_kind = local_molecules%n_el(ikind)
380 DO imol = 1, nmol_per_kind
381 i = local_molecules%list(ikind)%array(imol)
382 molecule => molecule_set(i)
383 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
384 DO ipart = first_atom, last_atom
385 natom_local = natom_local + 1
387 IF (thermolist(ipart) /= huge(0)) &
388 thermostat_info%map_loc_thermo_gen(natom_local) = thermolist(ipart)
403 nmol_local = local_molecules%n_el(ikind)
404 molecule_kind => molecule_kind_set(ikind)
408 IF (nshell == 0) nmol_local = 0
411 number = number + nmol_local
413 number = number + 3*nmol_local*natom
415 cpabort(
'Invalid region setup')
424 IF (
PRESENT(nfree))
THEN
431 thermostat_info%sum_of_thermostats = sum_of_thermostats
432 thermostat_info%number_of_thermostats = number
433 thermostat_info%dis_type = dis_type
435 DEALLOCATE (thermolist)
450 SUBROUTINE get_adiabatic_region_info(region_sections, sum_of_thermostats, &
451 thermolist, molecule_kind_set, molecules, particles, &
454 INTEGER,
INTENT(INOUT),
OPTIONAL :: sum_of_thermostats
455 INTEGER,
DIMENSION(:),
POINTER :: thermolist(:)
461 CHARACTER(LEN=default_string_length), &
462 DIMENSION(:),
POINTER :: tmpstringlist
463 INTEGER :: first_atom, i, ig, ikind, ilist, imol, &
464 ipart, itherm, jg, last_atom, &
465 mregions, n_rep, nregions, output_unit
466 INTEGER,
DIMENSION(:),
POINTER :: tmplist
472 NULLIFY (tmplist, tmpstringlist, thermolist, molecule_kind, molecule, molecule_set)
478 ALLOCATE (thermolist(particles%n_els))
480 molecule_set => molecules%els
486 CALL section_vals_val_get(region_sections,
"LIST", i_rep_section=ig, i_rep_val=jg, i_vals=tmplist)
487 DO i = 1,
SIZE(tmplist)
489 cpassert(((ipart > 0) .AND. (ipart <= particles%n_els)))
490 IF (thermolist(ipart) == huge(0))
THEN
492 thermolist(ipart) = itherm
494 CALL cp_abort(__location__, &
496 "assigned to different adiabatic regions!")
502 CALL section_vals_val_get(region_sections,
"MOLNAME", i_rep_section=ig, i_rep_val=jg, c_vals=tmpstringlist)
503 DO ilist = 1,
SIZE(tmpstringlist)
504 DO ikind = 1,
SIZE(molecule_kind_set)
505 molecule_kind => molecule_kind_set(ikind)
506 IF (molecule_kind%name == tmpstringlist(ilist))
THEN
507 DO imol = 1,
SIZE(molecule_kind%molecule_list)
508 molecule => molecule_set(molecule_kind%molecule_list(imol))
509 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
510 DO ipart = first_atom, last_atom
511 IF (thermolist(ipart) == huge(0))
THEN
513 thermolist(ipart) = itherm
515 CALL cp_abort(__location__, &
517 "assigned to different adiabatic regions!")
525 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
526 subsys_qm=.false., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
527 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
528 subsys_qm=.true., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
531 cpassert(.NOT. all(thermolist == huge(0)))
568 END SUBROUTINE get_adiabatic_region_info
585 molecules, particles, region, ensemble, nfree, shell, region_sections, qmmm_env)
591 INTEGER,
INTENT(IN) :: region, ensemble
592 INTEGER,
INTENT(INOUT),
OPTIONAL :: nfree
593 LOGICAL,
INTENT(IN),
OPTIONAL :: shell
597 INTEGER :: dis_type, i, ikind, natom, nkind, &
598 nmol_local, nmolecule, nshell, number, &
600 LOGICAL :: check, do_shell, nointer
603 NULLIFY (molecule_kind)
604 nkind =
SIZE(molecule_kind_set)
606 IF (
PRESENT(shell)) do_shell = shell
608 sum_of_thermostats = 0
615 SELECT CASE (ensemble)
617 cpabort(
'Unknown ensemble')
629 sum_of_thermostats = 1
633 molecule_kind => molecule_kind_set(i)
635 IF ((do_shell) .AND. (nshell == 0)) nmolecule = 0
636 sum_of_thermostats = sum_of_thermostats + nmolecule
640 IF ((nmolecule == 1) .AND. (nkind == 1)) nointer = .false.
644 molecule_kind => molecule_kind_set(i)
646 natom=natom, nshell=nshell)
647 IF (do_shell) natom = nshell
648 sum_of_thermostats = sum_of_thermostats + 3*natom*nmolecule
655 IF (sum_of_thermostats < 1) &
656 CALL cp_abort(__location__, &
657 "A thermostat type DEFINED is requested but no thermostat "// &
658 "regions are defined in THERMOSTAT/DEFINE_REGION.")
664 IF (sum_of_thermostats < 1) &
665 CALL cp_abort(__location__, &
666 "A thermostat type THERMAL is requested but no thermal "// &
667 "regions are defined in THERMAL_REGION/DEFINE_REGION.")
681 nmol_local = local_molecules%n_el(ikind)
682 molecule_kind => molecule_kind_set(ikind)
686 IF (nshell == 0) nmol_local = 0
689 number = number + nmol_local
691 number = number + 3*nmol_local*natom
693 cpabort(
'Invalid region setup')
702 CALL get_defined_region_info(region_sections, number, sum_of_thermostats, &
703 map_loc_thermo_gen=thermostat_info%map_loc_thermo_gen, &
704 local_molecules=local_molecules, molecule_kind_set=molecule_kind_set, &
705 molecules=molecules, particles=particles, qmmm_env=qmmm_env)
709 IF (
PRESENT(nfree))
THEN
719 thermostat_info%sum_of_thermostats = sum_of_thermostats
720 thermostat_info%number_of_thermostats = number
721 thermostat_info%dis_type = dis_type
737 SUBROUTINE get_defined_region_info(region_sections, number, sum_of_thermostats, &
738 map_loc_thermo_gen, local_molecules, molecule_kind_set, molecules, particles, &
741 INTEGER,
INTENT(OUT),
OPTIONAL :: number
742 INTEGER,
INTENT(INOUT),
OPTIONAL :: sum_of_thermostats
743 INTEGER,
DIMENSION(:),
POINTER :: map_loc_thermo_gen
750 CHARACTER(LEN=default_string_length), &
751 DIMENSION(:),
POINTER :: tmpstringlist
752 INTEGER :: first_atom, i, ig, ikind, ilist, imol, ipart, jg, last_atom, mregions, n_rep, &
753 natom_local, nmol_per_kind, nregions, output_unit
754 INTEGER,
DIMENSION(:),
POINTER :: thermolist, tmp, tmplist
760 NULLIFY (tmplist, tmpstringlist, thermolist, molecule_kind, molecule, molecule_set)
764 cpassert(.NOT. (
ASSOCIATED(map_loc_thermo_gen)))
766 ALLOCATE (thermolist(particles%n_els))
768 molecule_set => molecules%els
774 CALL section_vals_val_get(region_sections,
"LIST", i_rep_section=ig, i_rep_val=jg, i_vals=tmplist)
775 DO i = 1,
SIZE(tmplist)
777 cpassert(((ipart > 0) .AND. (ipart <= particles%n_els)))
778 IF (thermolist(ipart) == huge(0) .OR. thermolist(ipart) == ig)
THEN
779 thermolist(ipart) = ig
781 CALL cp_abort(__location__, &
783 "assigned to different thermostat regions "// &
793 CALL section_vals_val_get(region_sections,
"MOLNAME", i_rep_section=ig, i_rep_val=jg, c_vals=tmpstringlist)
794 DO ilist = 1,
SIZE(tmpstringlist)
795 DO ikind = 1,
SIZE(molecule_kind_set)
796 molecule_kind => molecule_kind_set(ikind)
797 IF (molecule_kind%name == tmpstringlist(ilist))
THEN
798 DO imol = 1,
SIZE(molecule_kind%molecule_list)
799 molecule => molecule_set(molecule_kind%molecule_list(imol))
800 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
801 DO ipart = first_atom, last_atom
802 IF (thermolist(ipart) == huge(0) .OR. thermolist(ipart) == ig)
THEN
803 thermolist(ipart) = ig
805 CALL cp_abort(__location__, &
807 "assigned to different thermostat regions "// &
818 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
819 subsys_qm=.false., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
820 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
821 subsys_qm=.true., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
825 IF (any(thermolist == huge(0)))
THEN
826 nregions = nregions + 1
827 sum_of_thermostats = sum_of_thermostats + 1
828 ALLOCATE (tmp(count(thermolist == huge(0))))
830 DO i = 1,
SIZE(thermolist)
831 IF (thermolist(i) == huge(0))
THEN
834 thermolist(i) = nregions
838 IF (output_unit > 0)
THEN
839 WRITE (output_unit,
'(/,T2,A)') &
840 "THERMOSTAT| Warning: No thermostats defined for the following atoms:"
842 WRITE (output_unit,
'(T2,A,T17,8I8)')
"THERMOSTAT|", tmp(i:min(i + 7, ilist))
844 WRITE (output_unit,
'(T2,A)') &
845 "THERMOSTAT| They will be included in a further unique thermostat!"
850 cpassert(all(thermolist /= huge(0)))
854 IF (output_unit > 0)
THEN
855 WRITE (output_unit,
'(/,T2,A)') &
856 "THERMOSTAT| Mapping of thermostat region indices to particles"
857 DO ipart = 1, particles%n_els, 16
858 WRITE (output_unit,
'(T2,A,T17,16(" ",I3))') &
859 "THERMOSTAT|", thermolist(ipart:min(ipart + 15, particles%n_els))
864 ALLOCATE (tmp(nregions))
867 DO ikind = 1,
SIZE(molecule_kind_set)
868 nmol_per_kind = local_molecules%n_el(ikind)
869 DO imol = 1, nmol_per_kind
870 i = local_molecules%list(ikind)%array(imol)
871 molecule => molecule_set(i)
872 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
873 DO ipart = first_atom, last_atom
874 natom_local = natom_local + 1
875 tmp(thermolist(ipart)) = 1
883 ALLOCATE (map_loc_thermo_gen(natom_local))
885 DO ikind = 1,
SIZE(molecule_kind_set)
886 nmol_per_kind = local_molecules%n_el(ikind)
887 DO imol = 1, nmol_per_kind
888 i = local_molecules%list(ikind)%array(imol)
889 molecule => molecule_set(i)
890 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
891 DO ipart = first_atom, last_atom
892 natom_local = natom_local + 1
893 map_loc_thermo_gen(natom_local) = thermolist(ipart)
898 DEALLOCATE (thermolist)
899 END SUBROUTINE get_defined_region_info
913 SUBROUTINE setup_thermostat_subsys(region_sections, qmmm_env, thermolist, &
914 molecule_set, subsys_qm, ig, sum_of_thermostats, nregions)
917 INTEGER,
DIMENSION(:),
POINTER :: thermolist
919 LOGICAL,
INTENT(IN) :: subsys_qm
920 INTEGER,
INTENT(IN) :: ig
921 INTEGER,
INTENT(INOUT) :: sum_of_thermostats, nregions
923 CHARACTER(LEN=default_string_length) :: label1, label2
924 INTEGER :: first_atom, i, imolecule, ipart, &
925 last_atom, nrep, thermo1
926 INTEGER,
DIMENSION(:),
POINTER :: atom_index1
937 n_rep_val=nrep, explicit=explicit)
938 IF (nrep == 1 .AND. explicit)
THEN
939 IF (
ASSOCIATED(qmmm_env))
THEN
940 atom_index1 => qmmm_env%qm%mm_atom_index
942 atom_index1 => qmmm_env%qm%qm_atom_index
945 SELECT CASE (thermo1)
947 DO i = 1,
SIZE(atom_index1)
948 ipart = atom_index1(i)
949 IF (subsys_qm .AND. qmmm_env%qm%qmmm_link .AND.
ASSOCIATED(qmmm_env%qm%mm_link_atoms))
THEN
950 IF (any(ipart == qmmm_env%qm%mm_link_atoms)) cycle
952 IF (thermolist(ipart) == huge(0))
THEN
953 thermolist(ipart) = ig
955 CALL cp_abort(__location__, &
957 trim(label1)//
' was already assigned to'// &
958 ' the thermostatting region Nr.'//
cp_to_string(thermolist(ipart))// &
959 '. Please check the input for inconsistencies!')
963 DO imolecule = 1,
SIZE(molecule_set)
964 molecule => molecule_set(imolecule)
965 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
966 IF (any(atom_index1 >= first_atom .AND. atom_index1 <= last_atom))
THEN
967 DO ipart = first_atom, last_atom
968 IF (thermolist(ipart) == huge(0))
THEN
969 thermolist(ipart) = ig
971 CALL cp_abort(__location__, &
973 trim(label1)//
' was already assigned to'// &
974 ' the thermostatting region Nr.'//
cp_to_string(thermolist(ipart))// &
975 '. Please check the input for inconsistencies!')
982 sum_of_thermostats = sum_of_thermostats - 1
983 nregions = nregions - 1
986 END SUBROUTINE setup_thermostat_subsys
1001 INTEGER :: i, j, ncoef
1003 map_info%v_scale = 1.0_dp
1004 map_info%s_kin = 0.0_dp
1006 DO i = 1,
SIZE(npt, 1)
1007 DO j = 1,
SIZE(npt, 2)
1009 map_info%p_kin(1, ncoef)%point = map_info%p_kin(1, ncoef)%point &
1010 + npt(i, j)%mass*npt(i, j)%v**2
1027 INTENT(INOUT) :: npt
1029 INTEGER :: i, j, ncoef
1032 DO i = 1,
SIZE(npt, 1)
1033 DO j = 1,
SIZE(npt, 2)
1035 npt(i, j)%v = npt(i, j)%v*map_info%p_scale(1, ncoef)%point
1053 local_molecules, molecule_set, group, vel)
1061 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: vel(:, :)
1063 INTEGER :: first_atom, ii, ikind, imol, imol_local, &
1064 ipart, last_atom, nmol_local
1065 LOGICAL :: present_vel
1066 REAL(kind=
dp) :: mass
1070 map_info%v_scale = 1.0_dp
1071 map_info%s_kin = 0.0_dp
1072 present_vel =
PRESENT(vel)
1074 DO ikind = 1,
SIZE(molecule_kind_set)
1075 nmol_local = local_molecules%n_el(ikind)
1076 DO imol_local = 1, nmol_local
1077 imol = local_molecules%list(ikind)%array(imol_local)
1078 molecule => molecule_set(imol)
1079 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
1080 DO ipart = first_atom, last_atom
1082 atomic_kind => particle_set(ipart)%atomic_kind
1084 IF (present_vel)
THEN
1085 IF (
ASSOCIATED(map_info%p_kin(1, ii)%point)) &
1086 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mass*vel(1, ipart)**2
1087 IF (
ASSOCIATED(map_info%p_kin(2, ii)%point)) &
1088 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mass*vel(2, ipart)**2
1089 IF (
ASSOCIATED(map_info%p_kin(3, ii)%point)) &
1090 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mass*vel(3, ipart)**2
1092 IF (
ASSOCIATED(map_info%p_kin(1, ii)%point)) &
1093 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mass*particle_set(ipart)%v(1)**2
1094 IF (
ASSOCIATED(map_info%p_kin(2, ii)%point)) &
1095 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mass*particle_set(ipart)%v(2)**2
1096 IF (
ASSOCIATED(map_info%p_kin(3, ii)%point)) &
1097 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mass*particle_set(ipart)%v(3)**2
1119 local_molecules, molecule_set, group, vel)
1127 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: vel(:, :)
1129 INTEGER :: first_atom, ii, ikind, imol, imol_local, &
1130 ipart, last_atom, nmol_local
1131 LOGICAL :: present_vel
1132 REAL(kind=
dp) :: mass
1136 map_info%v_scale = 1.0_dp
1137 map_info%s_kin = 0.0_dp
1138 present_vel =
PRESENT(vel)
1140 DO ikind = 1,
SIZE(molecule_kind_set)
1141 nmol_local = local_molecules%n_el(ikind)
1142 DO imol_local = 1, nmol_local
1143 imol = local_molecules%list(ikind)%array(imol_local)
1144 molecule => molecule_set(imol)
1145 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
1146 DO ipart = first_atom, last_atom
1148 atomic_kind => particle_set(ipart)%atomic_kind
1150 IF (present_vel)
THEN
1151 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + sqrt(mass)*vel(1, ipart)
1152 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + sqrt(mass)*vel(2, ipart)
1153 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + sqrt(mass)*vel(3, ipart)
1155 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + sqrt(mass)*particle_set(ipart)%v(1)
1156 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + sqrt(mass)*particle_set(ipart)%v(2)
1157 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + sqrt(mass)*particle_set(ipart)%v(3)
1183 particle_set, local_molecules, shell_adiabatic, shell_particle_set, &
1184 core_particle_set, vel, shell_vel, core_vel)
1191 LOGICAL,
INTENT(IN) :: shell_adiabatic
1192 TYPE(
particle_type),
OPTIONAL,
POINTER :: shell_particle_set(:), &
1193 core_particle_set(:)
1194 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: vel(:, :), shell_vel(:, :), &
1197 INTEGER :: first_atom, ii, ikind, imol, imol_local, &
1198 ipart, jj, last_atom, nmol_local, &
1200 LOGICAL :: present_vel
1201 REAL(kind=
dp) :: fac_massc, fac_masss, mass, vc(3), vs(3)
1208 present_vel =
PRESENT(vel)
1210 IF (present_vel)
THEN
1211 IF (shell_adiabatic)
THEN
1212 cpassert(
PRESENT(shell_vel))
1213 cpassert(
PRESENT(core_vel))
1216 IF (shell_adiabatic)
THEN
1217 cpassert(
PRESENT(shell_particle_set))
1218 cpassert(
PRESENT(core_particle_set))
1221 kind:
DO ikind = 1,
SIZE(molecule_kind_set)
1222 nmol_local = local_molecules%n_el(ikind)
1223 mol_local:
DO imol_local = 1, nmol_local
1224 imol = local_molecules%list(ikind)%array(imol_local)
1225 molecule => molecule_set(imol)
1226 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
1227 particle:
DO ipart = first_atom, last_atom
1229 IF (present_vel)
THEN
1230 vel(1, ipart) = vel(1, ipart)*map_info%p_scale(1, ii)%point
1231 vel(2, ipart) = vel(2, ipart)*map_info%p_scale(2, ii)%point
1232 vel(3, ipart) = vel(3, ipart)*map_info%p_scale(3, ii)%point
1234 particle_set(ipart)%v(1) = particle_set(ipart)%v(1)*map_info%p_scale(1, ii)%point
1235 particle_set(ipart)%v(2) = particle_set(ipart)%v(2)*map_info%p_scale(2, ii)%point
1236 particle_set(ipart)%v(3) = particle_set(ipart)%v(3)*map_info%p_scale(3, ii)%point
1239 IF (shell_adiabatic)
THEN
1240 shell_index = particle_set(ipart)%shell_index
1241 IF (shell_index /= 0)
THEN
1243 atomic_kind => particle_set(ipart)%atomic_kind
1245 fac_masss = shell%mass_shell/mass
1246 fac_massc = shell%mass_core/mass
1247 IF (present_vel)
THEN
1248 vs(1:3) = shell_vel(1:3, shell_index)
1249 vc(1:3) = core_vel(1:3, shell_index)
1250 shell_vel(1, shell_index) = vel(1, ipart) + fac_massc*(vs(1) - vc(1))
1251 shell_vel(2, shell_index) = vel(2, ipart) + fac_massc*(vs(2) - vc(2))
1252 shell_vel(3, shell_index) = vel(3, ipart) + fac_massc*(vs(3) - vc(3))
1253 core_vel(1, shell_index) = vel(1, ipart) + fac_masss*(vc(1) - vs(1))
1254 core_vel(2, shell_index) = vel(2, ipart) + fac_masss*(vc(2) - vs(2))
1255 core_vel(3, shell_index) = vel(3, ipart) + fac_masss*(vc(3) - vs(3))
1257 vs(1:3) = shell_particle_set(shell_index)%v(1:3)
1258 vc(1:3) = core_particle_set(shell_index)%v(1:3)
1259 shell_particle_set(shell_index)%v(1) = particle_set(ipart)%v(1) + fac_massc*(vs(1) - vc(1))
1260 shell_particle_set(shell_index)%v(2) = particle_set(ipart)%v(2) + fac_massc*(vs(2) - vc(2))
1261 shell_particle_set(shell_index)%v(3) = particle_set(ipart)%v(3) + fac_massc*(vs(3) - vc(3))
1262 core_particle_set(shell_index)%v(1) = particle_set(ipart)%v(1) + fac_masss*(vc(1) - vs(1))
1263 core_particle_set(shell_index)%v(2) = particle_set(ipart)%v(2) + fac_masss*(vc(2) - vs(2))
1264 core_particle_set(shell_index)%v(3) = particle_set(ipart)%v(3) + fac_masss*(vc(3) - vs(3))
1288 local_particles, group, core_particle_set, shell_particle_set, &
1289 core_vel, shell_vel)
1296 TYPE(
particle_type),
OPTIONAL,
POINTER :: core_particle_set(:), &
1297 shell_particle_set(:)
1298 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: core_vel(:, :), shell_vel(:, :)
1300 INTEGER :: ii, iparticle, iparticle_kind, &
1301 iparticle_local, nparticle_kind, &
1302 nparticle_local, shell_index
1303 LOGICAL :: is_shell, present_vel
1304 REAL(
dp) :: mass, mu_mass, v_sc(3)
1308 present_vel =
PRESENT(shell_vel)
1310 IF (present_vel)
THEN
1311 cpassert(
PRESENT(core_vel))
1313 cpassert(
PRESENT(shell_particle_set))
1314 cpassert(
PRESENT(core_particle_set))
1317 map_info%v_scale = 1.0_dp
1318 map_info%s_kin = 0.0_dp
1321 nparticle_kind =
SIZE(atomic_kind_set)
1322 DO iparticle_kind = 1, nparticle_kind
1323 atomic_kind => atomic_kind_set(iparticle_kind)
1324 CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass, shell_active=is_shell, shell=shell)
1326 mu_mass = shell%mass_shell*shell%mass_core/mass
1327 nparticle_local = local_particles%n_el(iparticle_kind)
1328 DO iparticle_local = 1, nparticle_local
1329 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
1330 shell_index = particle_set(iparticle)%shell_index
1332 IF (present_vel)
THEN
1333 v_sc(1) = core_vel(1, shell_index) - shell_vel(1, shell_index)
1334 v_sc(2) = core_vel(2, shell_index) - shell_vel(2, shell_index)
1335 v_sc(3) = core_vel(3, shell_index) - shell_vel(3, shell_index)
1336 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mu_mass*v_sc(1)**2
1337 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mu_mass*v_sc(2)**2
1338 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mu_mass*v_sc(3)**2
1340 v_sc(1) = core_particle_set(shell_index)%v(1) - shell_particle_set(shell_index)%v(1)
1341 v_sc(2) = core_particle_set(shell_index)%v(2) - shell_particle_set(shell_index)%v(2)
1342 v_sc(3) = core_particle_set(shell_index)%v(3) - shell_particle_set(shell_index)%v(3)
1343 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mu_mass*v_sc(1)**2
1344 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mu_mass*v_sc(2)**2
1345 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mu_mass*v_sc(3)**2
1368 shell_particle_set, core_particle_set, shell_vel, core_vel, vel)
1374 TYPE(
particle_type),
OPTIONAL,
POINTER :: shell_particle_set(:), &
1375 core_particle_set(:)
1376 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: shell_vel(:, :), core_vel(:, :), &
1379 INTEGER :: ii, iparticle, iparticle_kind, &
1380 iparticle_local, nparticle_kind, &
1381 nparticle_local, shell_index
1382 LOGICAL :: is_shell, present_vel
1383 REAL(
dp) :: mass, massc, masss, umass, v(3), vc(3), &
1388 present_vel =
PRESENT(vel)
1390 IF (present_vel)
THEN
1391 cpassert(
PRESENT(shell_vel))
1392 cpassert(
PRESENT(core_vel))
1394 cpassert(
PRESENT(shell_particle_set))
1395 cpassert(
PRESENT(core_particle_set))
1398 nparticle_kind =
SIZE(atomic_kind_set)
1400 kind:
DO iparticle_kind = 1, nparticle_kind
1401 atomic_kind => atomic_kind_set(iparticle_kind)
1402 CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass, shell_active=is_shell, shell=shell)
1405 masss = shell%mass_shell*umass
1406 massc = shell%mass_core*umass
1408 nparticle_local = local_particles%n_el(iparticle_kind)
1409 particles:
DO iparticle_local = 1, nparticle_local
1410 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
1411 shell_index = particle_set(iparticle)%shell_index
1413 IF (present_vel)
THEN
1414 vc(1:3) = core_vel(1:3, shell_index)
1415 vs(1:3) = shell_vel(1:3, shell_index)
1416 v(1:3) = vel(1:3, iparticle)
1417 shell_vel(1, shell_index) = v(1) + map_info%p_scale(1, ii)%point*massc*(vs(1) - vc(1))
1418 shell_vel(2, shell_index) = v(2) + map_info%p_scale(2, ii)%point*massc*(vs(2) - vc(2))
1419 shell_vel(3, shell_index) = v(3) + map_info%p_scale(3, ii)%point*massc*(vs(3) - vc(3))
1420 core_vel(1, shell_index) = v(1) + map_info%p_scale(1, ii)%point*masss*(vc(1) - vs(1))
1421 core_vel(2, shell_index) = v(2) + map_info%p_scale(2, ii)%point*masss*(vc(2) - vs(2))
1422 core_vel(3, shell_index) = v(3) + map_info%p_scale(3, ii)%point*masss*(vc(3) - vs(3))
1424 vc(1:3) = core_particle_set(shell_index)%v(1:3)
1425 vs(1:3) = shell_particle_set(shell_index)%v(1:3)
1426 v(1:3) = particle_set(iparticle)%v(1:3)
1427 shell_particle_set(shell_index)%v(1) = v(1) + map_info%p_scale(1, ii)%point*massc*(vs(1) - vc(1))
1428 shell_particle_set(shell_index)%v(2) = v(2) + map_info%p_scale(2, ii)%point*massc*(vs(2) - vc(2))
1429 shell_particle_set(shell_index)%v(3) = v(3) + map_info%p_scale(3, ii)%point*massc*(vs(3) - vc(3))
1430 core_particle_set(shell_index)%v(1) = v(1) + map_info%p_scale(1, ii)%point*masss*(vc(1) - vs(1))
1431 core_particle_set(shell_index)%v(2) = v(2) + map_info%p_scale(2, ii)%point*masss*(vc(2) - vs(2))
1432 core_particle_set(shell_index)%v(3) = v(3) + map_info%p_scale(3, ii)%point*masss*(vc(3) - vs(3))
1454 REAL(kind=
dp),
INTENT(OUT) :: nhc_pot, nhc_kin
1456 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_kin, array_pot
1458 INTEGER :: imap, l, n, number
1459 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: akin, vpot
1461 number = nhc%glob_num_nhc
1462 ALLOCATE (akin(number))
1463 ALLOCATE (vpot(number))
1466 DO n = 1, nhc%loc_num_nhc
1467 imap = nhc%map_info%index(n)
1468 DO l = 1, nhc%nhc_len
1469 akin(imap) = akin(imap) + 0.5_dp*nhc%nvt(l, n)%mass*nhc%nvt(l, n)%v**2
1470 vpot(imap) = vpot(imap) + nhc%nvt(l, n)%nkt*nhc%nvt(l, n)%eta
1476 CALL para_env%sum(akin)
1477 CALL para_env%sum(vpot)
1479 CALL communication_thermo_low1(akin, number, para_env)
1480 CALL communication_thermo_low1(vpot, number, para_env)
1486 IF (
PRESENT(array_pot))
THEN
1487 IF (
ASSOCIATED(array_pot))
THEN
1488 cpassert(
SIZE(array_pot) == number)
1490 ALLOCATE (array_pot(number))
1494 IF (
PRESENT(array_kin))
THEN
1495 IF (
ASSOCIATED(array_kin))
THEN
1496 cpassert(
SIZE(array_kin) == number)
1498 ALLOCATE (array_kin(number))
1521 para_env, array_pot, array_kin)
1524 INTEGER,
INTENT(IN) :: loc_num, glob_num
1525 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: thermo_energy
1526 REAL(kind=
dp),
INTENT(OUT) :: thermostat_kin
1528 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_pot, array_kin
1530 INTEGER :: imap, n, number
1531 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: akin
1534 ALLOCATE (akin(number))
1537 imap = map_info%index(n)
1538 akin(imap) = thermo_energy(n)
1543 CALL para_env%sum(akin)
1545 CALL communication_thermo_low1(akin, number, para_env)
1547 thermostat_kin = sum(akin)
1550 IF (
PRESENT(array_pot))
THEN
1551 IF (
ASSOCIATED(array_pot))
THEN
1552 cpassert(
SIZE(array_pot) == number)
1554 ALLOCATE (array_pot(number))
1558 IF (
PRESENT(array_kin))
THEN
1559 IF (
ASSOCIATED(array_kin))
THEN
1560 cpassert(
SIZE(array_kin) == number)
1562 ALLOCATE (array_kin(number))
1583 SUBROUTINE get_temperatures(map_info, loc_num, glob_num, nkt, dof, para_env, &
1584 temp_tot, array_temp)
1586 INTEGER,
INTENT(IN) :: loc_num, glob_num
1587 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: nkt, dof
1589 REAL(kind=
dp),
INTENT(OUT) :: temp_tot
1590 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_temp
1592 INTEGER :: i, imap, imap2, n, number
1593 REAL(kind=
dp) :: fdeg_of_free
1594 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: akin, deg_of_free
1597 ALLOCATE (akin(number))
1598 ALLOCATE (deg_of_free(number))
1600 deg_of_free = 0.0_dp
1602 imap = map_info%index(n)
1603 imap2 = map_info%map_index(n)
1604 IF (nkt(n) == 0.0_dp) cycle
1605 deg_of_free(imap) = real(dof(n), kind=
dp)
1606 akin(imap) = map_info%s_kin(imap2)
1611 CALL para_env%sum(akin)
1612 CALL para_env%sum(deg_of_free)
1614 CALL communication_thermo_low1(akin, number, para_env)
1615 CALL communication_thermo_low1(deg_of_free, number, para_env)
1617 temp_tot = sum(akin)
1618 fdeg_of_free = sum(deg_of_free)
1620 temp_tot = temp_tot/fdeg_of_free
1623 IF (
PRESENT(array_temp))
THEN
1624 IF (
ASSOCIATED(array_temp))
THEN
1625 cpassert(
SIZE(array_temp) == number)
1627 ALLOCATE (array_temp(number))
1630 array_temp(i) = akin(i)/deg_of_free(i)
1635 DEALLOCATE (deg_of_free)
1636 END SUBROUTINE get_temperatures
1649 array_pot, array_kin)
1651 REAL(kind=
dp),
INTENT(OUT) :: thermostat_pot, thermostat_kin
1653 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_pot, array_kin
1656 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: thermo_energy
1658 thermostat_pot = 0.0_dp
1659 thermostat_kin = 0.0_dp
1660 IF (
ASSOCIATED(thermostat))
THEN
1663 cpassert(
ASSOCIATED(thermostat%nhc))
1664 CALL get_nhc_energies(thermostat%nhc, thermostat_pot, thermostat_kin, para_env, &
1665 array_pot, array_kin)
1668 cpassert(
ASSOCIATED(thermostat%csvr))
1669 ALLOCATE (thermo_energy(thermostat%csvr%loc_num_csvr))
1670 DO i = 1, thermostat%csvr%loc_num_csvr
1671 thermo_energy(i) = thermostat%csvr%nvt(i)%thermostat_energy
1673 CALL get_kin_energies(thermostat%csvr%map_info, thermostat%csvr%loc_num_csvr, &
1674 thermostat%csvr%glob_num_csvr, thermo_energy, &
1675 thermostat_kin, para_env, array_pot, array_kin)
1676 DEALLOCATE (thermo_energy)
1678 ELSE IF (thermostat%type_of_thermostat ==
do_thermo_gle)
THEN
1680 cpassert(
ASSOCIATED(thermostat%gle))
1681 ALLOCATE (thermo_energy(thermostat%gle%loc_num_gle))
1682 DO i = 1, thermostat%gle%loc_num_gle
1683 thermo_energy(i) = thermostat%gle%nvt(i)%thermostat_energy
1685 CALL get_kin_energies(thermostat%gle%map_info, thermostat%gle%loc_num_gle, &
1686 thermostat%gle%glob_num_gle, thermo_energy, &
1687 thermostat_kin, para_env, array_pot, array_kin)
1688 DEALLOCATE (thermo_energy)
1705 SUBROUTINE get_region_temperatures(thermostat, tot_temperature, para_env, array_temp)
1707 REAL(kind=
dp),
INTENT(OUT) :: tot_temperature
1709 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_temp
1712 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: dof, nkt
1714 IF (
ASSOCIATED(thermostat))
THEN
1717 cpassert(
ASSOCIATED(thermostat%nhc))
1718 ALLOCATE (nkt(thermostat%nhc%loc_num_nhc))
1719 ALLOCATE (dof(thermostat%nhc%loc_num_nhc))
1720 DO i = 1, thermostat%nhc%loc_num_nhc
1721 nkt(i) = thermostat%nhc%nvt(1, i)%nkt
1722 dof(i) = real(thermostat%nhc%nvt(1, i)%degrees_of_freedom, kind=
dp)
1724 CALL get_temperatures(thermostat%nhc%map_info, thermostat%nhc%loc_num_nhc, &
1725 thermostat%nhc%glob_num_nhc, nkt, dof, para_env, tot_temperature, array_temp)
1730 cpassert(
ASSOCIATED(thermostat%csvr))
1732 ALLOCATE (nkt(thermostat%csvr%loc_num_csvr))
1733 ALLOCATE (dof(thermostat%csvr%loc_num_csvr))
1734 DO i = 1, thermostat%csvr%loc_num_csvr
1735 nkt(i) = thermostat%csvr%nvt(i)%nkt
1736 dof(i) = real(thermostat%csvr%nvt(i)%degrees_of_freedom, kind=
dp)
1738 CALL get_temperatures(thermostat%csvr%map_info, thermostat%csvr%loc_num_csvr, &
1739 thermostat%csvr%glob_num_csvr, nkt, dof, para_env, tot_temperature, array_temp)
1742 ELSE IF (thermostat%type_of_thermostat ==
do_thermo_al)
THEN
1744 cpassert(
ASSOCIATED(thermostat%al))
1746 ALLOCATE (nkt(thermostat%al%loc_num_al))
1747 ALLOCATE (dof(thermostat%al%loc_num_al))
1748 DO i = 1, thermostat%al%loc_num_al
1749 nkt(i) = thermostat%al%nvt(i)%nkt
1750 dof(i) = real(thermostat%al%nvt(i)%degrees_of_freedom, kind=
dp)
1752 CALL get_temperatures(thermostat%al%map_info, thermostat%al%loc_num_al, &
1753 thermostat%al%glob_num_al, nkt, dof, para_env, tot_temperature, array_temp)
1756 ELSE IF (thermostat%type_of_thermostat ==
do_thermo_gle)
THEN
1758 cpassert(
ASSOCIATED(thermostat%gle))
1760 ALLOCATE (nkt(thermostat%gle%loc_num_gle))
1761 ALLOCATE (dof(thermostat%gle%loc_num_gle))
1762 DO i = 1, thermostat%gle%loc_num_gle
1763 nkt(i) = thermostat%gle%nvt(i)%nkt
1764 dof(i) = real(thermostat%gle%nvt(i)%degrees_of_freedom, kind=
dp)
1766 CALL get_temperatures(thermostat%gle%map_info, thermostat%gle%loc_num_gle, &
1767 thermostat%gle%glob_num_gle, nkt, dof, para_env, tot_temperature, array_temp)
1773 END SUBROUTINE get_region_temperatures
1788 CHARACTER(LEN=default_string_length) :: my_pos, my_act
1789 INTEGER,
INTENT(IN) :: itimes
1790 REAL(kind=
dp),
INTENT(IN) :: time
1792 IF (
ASSOCIATED(thermostats))
THEN
1793 IF (
ASSOCIATED(thermostats%thermostat_part))
THEN
1794 CALL print_thermostat_status(thermostats%thermostat_part, para_env, my_pos, my_act, itimes, time)
1796 IF (
ASSOCIATED(thermostats%thermostat_shell))
THEN
1797 CALL print_thermostat_status(thermostats%thermostat_shell, para_env, my_pos, my_act, itimes, time)
1799 IF (
ASSOCIATED(thermostats%thermostat_coef))
THEN
1800 CALL print_thermostat_status(thermostats%thermostat_coef, para_env, my_pos, my_act, itimes, time)
1802 IF (
ASSOCIATED(thermostats%thermostat_baro))
THEN
1803 CALL print_thermostat_status(thermostats%thermostat_baro, para_env, my_pos, my_act, itimes, time)
1818 SUBROUTINE print_thermostat_status(thermostat, para_env, my_pos, my_act, itimes, time)
1821 CHARACTER(LEN=default_string_length) :: my_pos, my_act
1822 INTEGER,
INTENT(IN) :: itimes
1823 REAL(kind=
dp),
INTENT(IN) :: time
1827 REAL(kind=
dp) :: thermo_kin, thermo_pot, tot_temperature
1828 REAL(kind=
dp),
DIMENSION(:),
POINTER :: array_kin, array_pot, array_temp
1832 NULLIFY (logger, print_key, array_pot, array_kin, array_temp)
1835 IF (
ASSOCIATED(thermostat))
THEN
1841 extension=
"."//trim(thermostat%label)//
".tener", file_position=my_pos, &
1842 file_action=my_act, is_new_file=new_file)
1845 WRITE (unit,
'(A)')
"# Thermostat Potential and Kinetic Energies - Total and per Region"
1846 WRITE (unit,
'("#",3X,A,2X,A,13X,A,10X,A)')
"Step Nr.",
"Time[fs]",
"Kin.[a.u.]",
"Pot.[a.u.]"
1848 WRITE (unit=unit, fmt=
"(I8, F12.3,6X,2F20.10)") itimes, time*
femtoseconds, thermo_kin, thermo_pot
1849 WRITE (unit,
'(A,4F20.10)')
"# KINETIC ENERGY REGIONS: ", array_kin(1:min(4,
SIZE(array_kin)))
1850 DO i = 5,
SIZE(array_kin), 4
1851 WRITE (unit=unit, fmt=
'("#",25X,4F20.10)') array_kin(i:min(i + 3,
SIZE(array_kin)))
1853 WRITE (unit,
'(A,4F20.10)')
"# POTENT. ENERGY REGIONS: ", array_pot(1:min(4,
SIZE(array_pot)))
1854 DO i = 5,
SIZE(array_pot), 4
1855 WRITE (unit=unit, fmt=
'("#",25X,4F20.10)') array_pot(i:min(i + 3,
SIZE(array_pot)))
1859 DEALLOCATE (array_kin)
1860 DEALLOCATE (array_pot)
1866 CALL get_region_temperatures(thermostat, tot_temperature, para_env, array_temp)
1868 extension=
"."//trim(thermostat%label)//
".temp", file_position=my_pos, &
1869 file_action=my_act, is_new_file=new_file)
1872 WRITE (unit,
'(A)')
"# Temperature Total and per Region"
1873 WRITE (unit,
'("#",3X,A,2X,A,10X,A)')
"Step Nr.",
"Time[fs]",
"Temp.[K]"
1875 WRITE (unit=unit, fmt=
"(I8, F12.3,3X,F20.10)") itimes, time*
femtoseconds, tot_temperature
1876 WRITE (unit,
'(A,I10)')
"# TEMPERATURE REGIONS: ",
SIZE(array_temp)
1877 DO i = 1,
SIZE(array_temp), 4
1878 WRITE (unit=unit, fmt=
'("#",22X,4F20.10)') array_temp(i:min(i + 3,
SIZE(array_temp)))
1882 DEALLOCATE (array_temp)
1886 END SUBROUTINE print_thermostat_status
1895 SUBROUTINE communication_thermo_low1(array, number, para_env)
1896 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: array
1897 INTEGER,
INTENT(IN) :: number
1900 INTEGER :: i, icheck, ncheck
1901 REAL(kind=
dp),
DIMENSION(:),
POINTER :: work, work2
1903 ALLOCATE (work(para_env%num_pe))
1906 work(para_env%mepos + 1) = array(i)
1907 CALL para_env%sum(work)
1908 ncheck = count(work /= 0.0_dp)
1910 IF (ncheck /= 0)
THEN
1911 ALLOCATE (work2(ncheck))
1913 DO icheck = 1, para_env%num_pe
1914 IF (work(icheck) /= 0.0_dp)
THEN
1916 work2(ncheck) = work(icheck)
1919 cpassert(ncheck ==
SIZE(work2))
1920 cpassert(all(work2 == work2(1)))
1927 END SUBROUTINE communication_thermo_low1
1938 INTEGER,
DIMENSION(:, :),
INTENT(INOUT) :: array
1939 INTEGER,
INTENT(IN) :: number1, number2
1942 INTEGER :: i, icheck, j, ncheck
1943 INTEGER,
DIMENSION(:, :),
POINTER :: work, work2
1945 ALLOCATE (work(number1, para_env%num_pe))
1948 work(:, para_env%mepos + 1) = array(:, i)
1949 CALL para_env%sum(work)
1951 DO j = 1, para_env%num_pe
1952 IF (any(work(:, j) /= 0))
THEN
1957 IF (ncheck /= 0)
THEN
1958 ALLOCATE (work2(number1, ncheck))
1960 DO icheck = 1, para_env%num_pe
1961 IF (any(work(:, icheck) /= 0))
THEN
1963 work2(:, ncheck) = work(:, icheck)
1966 cpassert(ncheck ==
SIZE(work2, 2))
1968 cpassert(all(work2(:, j) == work2(:, 1)))
1970 array(:, i) = work2(:, 1)
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.
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
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...
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)
...
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, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
stores a lists of integer that are local to a processor. The idea is that these integers represent ob...
Lumps all possible extended system variables into one type for easy access and passing.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Interface to the message passing library MPI.
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 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_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 write_vsite_constraint(vsite_constraint, ivsite, iw)
Write virtual site constraint information to output unit.
represent a simple array based list of the given type
Define the data structure for the molecule information.
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.
Output Utilities for MOTION_SECTION.
subroutine, public rot_ana(particles, mat, dof, print_section, keep_rotations, mass_weighted, natoms, rot_dof, inertia)
Performs an analysis of the principal inertia axis Getting back the generators of the translating and...
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public femtoseconds
Basic container type for QM/MM.
Type for storing MD parameters.
Thermostat structure: module containing thermostat available for MD.
Utilities for thermostats.
subroutine, public setup_adiabatic_thermostat_info(thermostat_info, molecule_kind_set, local_molecules, molecules, particles, region, ensemble, nfree, shell, region_sections, qmmm_env)
...
subroutine, public compute_nfree(cell, simpar, molecule_kind_set, print_section, particles, gci)
...
subroutine, public momentum_region_particles(map_info, particle_set, molecule_kind_set, local_molecules, molecule_set, group, vel)
...
subroutine, public vel_rescale_shells(map_info, atomic_kind_set, particle_set, local_particles, shell_particle_set, core_particle_set, shell_vel, core_vel, vel)
...
subroutine, public communication_thermo_low2(array, number1, number2, para_env)
Handles the communication for thermostats (2D array)
subroutine, public print_thermostats_status(thermostats, para_env, my_pos, my_act, itimes, time)
Prints status of all thermostats during an MD run.
subroutine, public vel_rescale_particles(map_info, molecule_kind_set, molecule_set, particle_set, local_molecules, shell_adiabatic, shell_particle_set, core_particle_set, vel, shell_vel, core_vel)
...
subroutine, public ke_region_shells(map_info, particle_set, atomic_kind_set, local_particles, group, core_particle_set, shell_particle_set, core_vel, shell_vel)
...
subroutine, public get_thermostat_energies(thermostat, thermostat_pot, thermostat_kin, para_env, array_pot, array_kin)
Calculates energy associated with a thermostat.
subroutine, public ke_region_baro(map_info, npt, group)
...
subroutine, public vel_rescale_baro(map_info, npt)
...
subroutine, public ke_region_particles(map_info, particle_set, molecule_kind_set, local_molecules, molecule_set, group, vel)
...
subroutine, public get_nhc_energies(nhc, nhc_pot, nhc_kin, para_env, array_kin, array_pot)
Calculates kinetic energy and potential energy of the nhc variables.
subroutine, public setup_thermostat_info(thermostat_info, molecule_kind_set, local_molecules, molecules, particles, region, ensemble, nfree, shell, region_sections, qmmm_env)
...
subroutine, public compute_degrees_of_freedom(thermostats, cell, simpar, molecule_kind_set, local_molecules, molecules, particles, print_section, region_sections, gci, region, qmmm_env)
...
subroutine, public get_kin_energies(map_info, loc_num, glob_num, thermo_energy, thermostat_kin, para_env, array_pot, array_kin)
Calculates kinetic energy and potential energy of the csvr and gle thermostats.
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
structure to store local (to a processor) ordered lists of integers.
stores all the informations relevant to an mpi environment
represent a list of objects
represent a list of objects
Simulation parameter type for molecular dynamics.