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
500 CALL section_vals_val_get(region_sections,
"MOLNAME", i_rep_section=ig, i_rep_val=jg, c_vals=tmpstringlist)
501 DO ilist = 1,
SIZE(tmpstringlist)
502 DO ikind = 1,
SIZE(molecule_kind_set)
503 molecule_kind => molecule_kind_set(ikind)
504 IF (molecule_kind%name == tmpstringlist(ilist))
THEN
505 DO imol = 1,
SIZE(molecule_kind%molecule_list)
506 molecule => molecule_set(molecule_kind%molecule_list(imol))
507 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
508 DO ipart = first_atom, last_atom
509 IF (thermolist(ipart) == huge(0))
THEN
511 thermolist(ipart) = itherm
521 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
522 subsys_qm=.false., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
523 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
524 subsys_qm=.true., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
527 cpassert(.NOT. all(thermolist == huge(0)))
564 END SUBROUTINE get_adiabatic_region_info
581 molecules, particles, region, ensemble, nfree, shell, region_sections, qmmm_env)
587 INTEGER,
INTENT(IN) :: region, ensemble
588 INTEGER,
INTENT(INOUT),
OPTIONAL :: nfree
589 LOGICAL,
INTENT(IN),
OPTIONAL :: shell
593 INTEGER :: dis_type, i, ikind, natom, nkind, &
594 nmol_local, nmolecule, nshell, number, &
596 LOGICAL :: check, do_shell, nointer
599 NULLIFY (molecule_kind)
600 nkind =
SIZE(molecule_kind_set)
602 IF (
PRESENT(shell)) do_shell = shell
604 sum_of_thermostats = 0
611 SELECT CASE (ensemble)
613 cpabort(
'Unknown ensemble')
625 sum_of_thermostats = 1
629 molecule_kind => molecule_kind_set(i)
631 IF ((do_shell) .AND. (nshell == 0)) nmolecule = 0
632 sum_of_thermostats = sum_of_thermostats + nmolecule
636 IF ((nmolecule == 1) .AND. (nkind == 1)) nointer = .false.
640 molecule_kind => molecule_kind_set(i)
642 natom=natom, nshell=nshell)
643 IF (do_shell) natom = nshell
644 sum_of_thermostats = sum_of_thermostats + 3*natom*nmolecule
651 IF (sum_of_thermostats < 1) &
652 CALL cp_abort(__location__, &
653 "Provide at least 1 region (&DEFINE_REGION) when using the thermostat type DEFINED")
667 nmol_local = local_molecules%n_el(ikind)
668 molecule_kind => molecule_kind_set(ikind)
672 IF (nshell == 0) nmol_local = 0
675 number = number + nmol_local
677 number = number + 3*nmol_local*natom
679 cpabort(
'Invalid region setup')
688 CALL get_defined_region_info(region_sections, number, sum_of_thermostats, &
689 map_loc_thermo_gen=thermostat_info%map_loc_thermo_gen, &
690 local_molecules=local_molecules, molecule_kind_set=molecule_kind_set, &
691 molecules=molecules, particles=particles, qmmm_env=qmmm_env)
695 IF (
PRESENT(nfree))
THEN
705 thermostat_info%sum_of_thermostats = sum_of_thermostats
706 thermostat_info%number_of_thermostats = number
707 thermostat_info%dis_type = dis_type
723 SUBROUTINE get_defined_region_info(region_sections, number, sum_of_thermostats, &
724 map_loc_thermo_gen, local_molecules, molecule_kind_set, molecules, particles, &
727 INTEGER,
INTENT(OUT),
OPTIONAL :: number
728 INTEGER,
INTENT(INOUT),
OPTIONAL :: sum_of_thermostats
729 INTEGER,
DIMENSION(:),
POINTER :: map_loc_thermo_gen
736 CHARACTER(LEN=default_string_length), &
737 DIMENSION(:),
POINTER :: tmpstringlist
738 INTEGER :: first_atom, i, ig, ikind, ilist, imol, ipart, jg, last_atom, mregions, n_rep, &
739 natom_local, nmol_per_kind, nregions, output_unit
740 INTEGER,
DIMENSION(:),
POINTER :: thermolist, tmp, tmplist
746 NULLIFY (tmplist, tmpstringlist, thermolist, molecule_kind, molecule, molecule_set)
750 cpassert(.NOT. (
ASSOCIATED(map_loc_thermo_gen)))
752 ALLOCATE (thermolist(particles%n_els))
754 molecule_set => molecules%els
759 CALL section_vals_val_get(region_sections,
"LIST", i_rep_section=ig, i_rep_val=jg, i_vals=tmplist)
760 DO i = 1,
SIZE(tmplist)
762 cpassert(((ipart > 0) .AND. (ipart <= particles%n_els)))
763 IF (thermolist(ipart) == huge(0))
THEN
764 thermolist(ipart) = ig
772 CALL section_vals_val_get(region_sections,
"MOLNAME", i_rep_section=ig, i_rep_val=jg, c_vals=tmpstringlist)
773 DO ilist = 1,
SIZE(tmpstringlist)
774 DO ikind = 1,
SIZE(molecule_kind_set)
775 molecule_kind => molecule_kind_set(ikind)
776 IF (molecule_kind%name == tmpstringlist(ilist))
THEN
777 DO imol = 1,
SIZE(molecule_kind%molecule_list)
778 molecule => molecule_set(molecule_kind%molecule_list(imol))
779 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
780 DO ipart = first_atom, last_atom
781 IF (thermolist(ipart) == huge(0))
THEN
782 thermolist(ipart) = ig
792 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
793 subsys_qm=.false., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
794 CALL setup_thermostat_subsys(region_sections, qmmm_env, thermolist, molecule_set, &
795 subsys_qm=.true., ig=ig, sum_of_thermostats=sum_of_thermostats, nregions=nregions)
799 IF (any(thermolist == huge(0)))
THEN
800 nregions = nregions + 1
801 sum_of_thermostats = sum_of_thermostats + 1
802 ALLOCATE (tmp(count(thermolist == huge(0))))
804 DO i = 1,
SIZE(thermolist)
805 IF (thermolist(i) == huge(0))
THEN
808 thermolist(i) = nregions
811 IF (output_unit > 0)
THEN
812 WRITE (output_unit,
'(A)')
" WARNING| No thermostats defined for the following atoms:"
813 IF (ilist > 0)
WRITE (output_unit,
'(" WARNING|",9I8)') tmp
814 WRITE (output_unit,
'(A)')
" WARNING| They will be included in a further unique thermostat!"
818 cpassert(all(thermolist /= huge(0)))
821 ALLOCATE (tmp(nregions))
824 DO ikind = 1,
SIZE(molecule_kind_set)
825 nmol_per_kind = local_molecules%n_el(ikind)
826 DO imol = 1, nmol_per_kind
827 i = local_molecules%list(ikind)%array(imol)
828 molecule => molecule_set(i)
829 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
830 DO ipart = first_atom, last_atom
831 natom_local = natom_local + 1
832 tmp(thermolist(ipart)) = 1
840 ALLOCATE (map_loc_thermo_gen(natom_local))
842 DO ikind = 1,
SIZE(molecule_kind_set)
843 nmol_per_kind = local_molecules%n_el(ikind)
844 DO imol = 1, nmol_per_kind
845 i = local_molecules%list(ikind)%array(imol)
846 molecule => molecule_set(i)
847 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
848 DO ipart = first_atom, last_atom
849 natom_local = natom_local + 1
850 map_loc_thermo_gen(natom_local) = thermolist(ipart)
855 DEALLOCATE (thermolist)
856 END SUBROUTINE get_defined_region_info
870 SUBROUTINE setup_thermostat_subsys(region_sections, qmmm_env, thermolist, &
871 molecule_set, subsys_qm, ig, sum_of_thermostats, nregions)
874 INTEGER,
DIMENSION(:),
POINTER :: thermolist
876 LOGICAL,
INTENT(IN) :: subsys_qm
877 INTEGER,
INTENT(IN) :: ig
878 INTEGER,
INTENT(INOUT) :: sum_of_thermostats, nregions
880 CHARACTER(LEN=default_string_length) :: label1, label2
881 INTEGER :: first_atom, i, imolecule, ipart, &
882 last_atom, nrep, thermo1
883 INTEGER,
DIMENSION(:),
POINTER :: atom_index1
894 n_rep_val=nrep, explicit=explicit)
895 IF (nrep == 1 .AND. explicit)
THEN
896 IF (
ASSOCIATED(qmmm_env))
THEN
897 atom_index1 => qmmm_env%qm%mm_atom_index
899 atom_index1 => qmmm_env%qm%qm_atom_index
902 SELECT CASE (thermo1)
904 DO i = 1,
SIZE(atom_index1)
905 ipart = atom_index1(i)
906 IF (subsys_qm .AND. qmmm_env%qm%qmmm_link .AND.
ASSOCIATED(qmmm_env%qm%mm_link_atoms))
THEN
907 IF (any(ipart == qmmm_env%qm%mm_link_atoms)) cycle
909 IF (thermolist(ipart) == huge(0))
THEN
910 thermolist(ipart) = ig
912 CALL cp_abort(__location__, &
914 trim(label1)//
' was already assigned to'// &
915 ' the thermostatting region Nr.'//
cp_to_string(thermolist(ipart))// &
916 '. Please check the input for inconsistencies!')
920 DO imolecule = 1,
SIZE(molecule_set)
921 molecule => molecule_set(imolecule)
922 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
923 IF (any(atom_index1 >= first_atom .AND. atom_index1 <= last_atom))
THEN
924 DO ipart = first_atom, last_atom
925 IF (thermolist(ipart) == huge(0))
THEN
926 thermolist(ipart) = ig
928 CALL cp_abort(__location__, &
930 trim(label1)//
' was already assigned to'// &
931 ' the thermostatting region Nr.'//
cp_to_string(thermolist(ipart))// &
932 '. Please check the input for inconsistencies!')
939 sum_of_thermostats = sum_of_thermostats - 1
940 nregions = nregions - 1
943 END SUBROUTINE setup_thermostat_subsys
958 INTEGER :: i, j, ncoef
960 map_info%v_scale = 1.0_dp
961 map_info%s_kin = 0.0_dp
963 DO i = 1,
SIZE(npt, 1)
964 DO j = 1,
SIZE(npt, 2)
966 map_info%p_kin(1, ncoef)%point = map_info%p_kin(1, ncoef)%point &
967 + npt(i, j)%mass*npt(i, j)%v**2
986 INTEGER :: i, j, ncoef
989 DO i = 1,
SIZE(npt, 1)
990 DO j = 1,
SIZE(npt, 2)
992 npt(i, j)%v = npt(i, j)%v*map_info%p_scale(1, ncoef)%point
1010 local_molecules, molecule_set, group, vel)
1018 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: vel(:, :)
1020 INTEGER :: first_atom, ii, ikind, imol, imol_local, &
1021 ipart, last_atom, nmol_local
1022 LOGICAL :: present_vel
1023 REAL(kind=
dp) :: mass
1027 map_info%v_scale = 1.0_dp
1028 map_info%s_kin = 0.0_dp
1029 present_vel =
PRESENT(vel)
1031 DO ikind = 1,
SIZE(molecule_kind_set)
1032 nmol_local = local_molecules%n_el(ikind)
1033 DO imol_local = 1, nmol_local
1034 imol = local_molecules%list(ikind)%array(imol_local)
1035 molecule => molecule_set(imol)
1036 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
1037 DO ipart = first_atom, last_atom
1039 atomic_kind => particle_set(ipart)%atomic_kind
1041 IF (present_vel)
THEN
1042 IF (
ASSOCIATED(map_info%p_kin(1, ii)%point)) &
1043 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mass*vel(1, ipart)**2
1044 IF (
ASSOCIATED(map_info%p_kin(2, ii)%point)) &
1045 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mass*vel(2, ipart)**2
1046 IF (
ASSOCIATED(map_info%p_kin(3, ii)%point)) &
1047 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mass*vel(3, ipart)**2
1049 IF (
ASSOCIATED(map_info%p_kin(1, ii)%point)) &
1050 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mass*particle_set(ipart)%v(1)**2
1051 IF (
ASSOCIATED(map_info%p_kin(2, ii)%point)) &
1052 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mass*particle_set(ipart)%v(2)**2
1053 IF (
ASSOCIATED(map_info%p_kin(3, ii)%point)) &
1054 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mass*particle_set(ipart)%v(3)**2
1076 local_molecules, molecule_set, group, vel)
1084 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: vel(:, :)
1086 INTEGER :: first_atom, ii, ikind, imol, imol_local, &
1087 ipart, last_atom, nmol_local
1088 LOGICAL :: present_vel
1089 REAL(kind=
dp) :: mass
1093 map_info%v_scale = 1.0_dp
1094 map_info%s_kin = 0.0_dp
1095 present_vel =
PRESENT(vel)
1097 DO ikind = 1,
SIZE(molecule_kind_set)
1098 nmol_local = local_molecules%n_el(ikind)
1099 DO imol_local = 1, nmol_local
1100 imol = local_molecules%list(ikind)%array(imol_local)
1101 molecule => molecule_set(imol)
1102 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
1103 DO ipart = first_atom, last_atom
1105 atomic_kind => particle_set(ipart)%atomic_kind
1107 IF (present_vel)
THEN
1108 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + sqrt(mass)*vel(1, ipart)
1109 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + sqrt(mass)*vel(2, ipart)
1110 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + sqrt(mass)*vel(3, ipart)
1112 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + sqrt(mass)*particle_set(ipart)%v(1)
1113 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + sqrt(mass)*particle_set(ipart)%v(2)
1114 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + sqrt(mass)*particle_set(ipart)%v(3)
1140 particle_set, local_molecules, shell_adiabatic, shell_particle_set, &
1141 core_particle_set, vel, shell_vel, core_vel)
1148 LOGICAL,
INTENT(IN) :: shell_adiabatic
1149 TYPE(
particle_type),
OPTIONAL,
POINTER :: shell_particle_set(:), &
1150 core_particle_set(:)
1151 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: vel(:, :), shell_vel(:, :), &
1154 INTEGER :: first_atom, ii, ikind, imol, imol_local, &
1155 ipart, jj, last_atom, nmol_local, &
1157 LOGICAL :: present_vel
1158 REAL(kind=
dp) :: fac_massc, fac_masss, mass, vc(3), vs(3)
1165 present_vel =
PRESENT(vel)
1167 IF (present_vel)
THEN
1168 IF (shell_adiabatic)
THEN
1169 cpassert(
PRESENT(shell_vel))
1170 cpassert(
PRESENT(core_vel))
1173 IF (shell_adiabatic)
THEN
1174 cpassert(
PRESENT(shell_particle_set))
1175 cpassert(
PRESENT(core_particle_set))
1178 kind:
DO ikind = 1,
SIZE(molecule_kind_set)
1179 nmol_local = local_molecules%n_el(ikind)
1180 mol_local:
DO imol_local = 1, nmol_local
1181 imol = local_molecules%list(ikind)%array(imol_local)
1182 molecule => molecule_set(imol)
1183 CALL get_molecule(molecule, first_atom=first_atom, last_atom=last_atom)
1184 particle:
DO ipart = first_atom, last_atom
1186 IF (present_vel)
THEN
1187 vel(1, ipart) = vel(1, ipart)*map_info%p_scale(1, ii)%point
1188 vel(2, ipart) = vel(2, ipart)*map_info%p_scale(2, ii)%point
1189 vel(3, ipart) = vel(3, ipart)*map_info%p_scale(3, ii)%point
1191 particle_set(ipart)%v(1) = particle_set(ipart)%v(1)*map_info%p_scale(1, ii)%point
1192 particle_set(ipart)%v(2) = particle_set(ipart)%v(2)*map_info%p_scale(2, ii)%point
1193 particle_set(ipart)%v(3) = particle_set(ipart)%v(3)*map_info%p_scale(3, ii)%point
1196 IF (shell_adiabatic)
THEN
1197 shell_index = particle_set(ipart)%shell_index
1198 IF (shell_index /= 0)
THEN
1200 atomic_kind => particle_set(ipart)%atomic_kind
1202 fac_masss = shell%mass_shell/mass
1203 fac_massc = shell%mass_core/mass
1204 IF (present_vel)
THEN
1205 vs(1:3) = shell_vel(1:3, shell_index)
1206 vc(1:3) = core_vel(1:3, shell_index)
1207 shell_vel(1, shell_index) = vel(1, ipart) + fac_massc*(vs(1) - vc(1))
1208 shell_vel(2, shell_index) = vel(2, ipart) + fac_massc*(vs(2) - vc(2))
1209 shell_vel(3, shell_index) = vel(3, ipart) + fac_massc*(vs(3) - vc(3))
1210 core_vel(1, shell_index) = vel(1, ipart) + fac_masss*(vc(1) - vs(1))
1211 core_vel(2, shell_index) = vel(2, ipart) + fac_masss*(vc(2) - vs(2))
1212 core_vel(3, shell_index) = vel(3, ipart) + fac_masss*(vc(3) - vs(3))
1214 vs(1:3) = shell_particle_set(shell_index)%v(1:3)
1215 vc(1:3) = core_particle_set(shell_index)%v(1:3)
1216 shell_particle_set(shell_index)%v(1) = particle_set(ipart)%v(1) + fac_massc*(vs(1) - vc(1))
1217 shell_particle_set(shell_index)%v(2) = particle_set(ipart)%v(2) + fac_massc*(vs(2) - vc(2))
1218 shell_particle_set(shell_index)%v(3) = particle_set(ipart)%v(3) + fac_massc*(vs(3) - vc(3))
1219 core_particle_set(shell_index)%v(1) = particle_set(ipart)%v(1) + fac_masss*(vc(1) - vs(1))
1220 core_particle_set(shell_index)%v(2) = particle_set(ipart)%v(2) + fac_masss*(vc(2) - vs(2))
1221 core_particle_set(shell_index)%v(3) = particle_set(ipart)%v(3) + fac_masss*(vc(3) - vs(3))
1245 local_particles, group, core_particle_set, shell_particle_set, &
1246 core_vel, shell_vel)
1253 TYPE(
particle_type),
OPTIONAL,
POINTER :: core_particle_set(:), &
1254 shell_particle_set(:)
1255 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: core_vel(:, :), shell_vel(:, :)
1257 INTEGER :: ii, iparticle, iparticle_kind, &
1258 iparticle_local, nparticle_kind, &
1259 nparticle_local, shell_index
1260 LOGICAL :: is_shell, present_vel
1261 REAL(
dp) :: mass, mu_mass, v_sc(3)
1265 present_vel =
PRESENT(shell_vel)
1267 IF (present_vel)
THEN
1268 cpassert(
PRESENT(core_vel))
1270 cpassert(
PRESENT(shell_particle_set))
1271 cpassert(
PRESENT(core_particle_set))
1274 map_info%v_scale = 1.0_dp
1275 map_info%s_kin = 0.0_dp
1278 nparticle_kind =
SIZE(atomic_kind_set)
1279 DO iparticle_kind = 1, nparticle_kind
1280 atomic_kind => atomic_kind_set(iparticle_kind)
1281 CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass, shell_active=is_shell, shell=shell)
1283 mu_mass = shell%mass_shell*shell%mass_core/mass
1284 nparticle_local = local_particles%n_el(iparticle_kind)
1285 DO iparticle_local = 1, nparticle_local
1286 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
1287 shell_index = particle_set(iparticle)%shell_index
1289 IF (present_vel)
THEN
1290 v_sc(1) = core_vel(1, shell_index) - shell_vel(1, shell_index)
1291 v_sc(2) = core_vel(2, shell_index) - shell_vel(2, shell_index)
1292 v_sc(3) = core_vel(3, shell_index) - shell_vel(3, shell_index)
1293 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mu_mass*v_sc(1)**2
1294 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mu_mass*v_sc(2)**2
1295 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mu_mass*v_sc(3)**2
1297 v_sc(1) = core_particle_set(shell_index)%v(1) - shell_particle_set(shell_index)%v(1)
1298 v_sc(2) = core_particle_set(shell_index)%v(2) - shell_particle_set(shell_index)%v(2)
1299 v_sc(3) = core_particle_set(shell_index)%v(3) - shell_particle_set(shell_index)%v(3)
1300 map_info%p_kin(1, ii)%point = map_info%p_kin(1, ii)%point + mu_mass*v_sc(1)**2
1301 map_info%p_kin(2, ii)%point = map_info%p_kin(2, ii)%point + mu_mass*v_sc(2)**2
1302 map_info%p_kin(3, ii)%point = map_info%p_kin(3, ii)%point + mu_mass*v_sc(3)**2
1325 shell_particle_set, core_particle_set, shell_vel, core_vel, vel)
1331 TYPE(
particle_type),
OPTIONAL,
POINTER :: shell_particle_set(:), &
1332 core_particle_set(:)
1333 REAL(kind=
dp),
INTENT(INOUT),
OPTIONAL :: shell_vel(:, :), core_vel(:, :), &
1336 INTEGER :: ii, iparticle, iparticle_kind, &
1337 iparticle_local, nparticle_kind, &
1338 nparticle_local, shell_index
1339 LOGICAL :: is_shell, present_vel
1340 REAL(
dp) :: mass, massc, masss, umass, v(3), vc(3), &
1345 present_vel =
PRESENT(vel)
1347 IF (present_vel)
THEN
1348 cpassert(
PRESENT(shell_vel))
1349 cpassert(
PRESENT(core_vel))
1351 cpassert(
PRESENT(shell_particle_set))
1352 cpassert(
PRESENT(core_particle_set))
1355 nparticle_kind =
SIZE(atomic_kind_set)
1357 kind:
DO iparticle_kind = 1, nparticle_kind
1358 atomic_kind => atomic_kind_set(iparticle_kind)
1359 CALL get_atomic_kind(atomic_kind=atomic_kind, mass=mass, shell_active=is_shell, shell=shell)
1362 masss = shell%mass_shell*umass
1363 massc = shell%mass_core*umass
1365 nparticle_local = local_particles%n_el(iparticle_kind)
1366 particles:
DO iparticle_local = 1, nparticle_local
1367 iparticle = local_particles%list(iparticle_kind)%array(iparticle_local)
1368 shell_index = particle_set(iparticle)%shell_index
1370 IF (present_vel)
THEN
1371 vc(1:3) = core_vel(1:3, shell_index)
1372 vs(1:3) = shell_vel(1:3, shell_index)
1373 v(1:3) = vel(1:3, iparticle)
1374 shell_vel(1, shell_index) = v(1) + map_info%p_scale(1, ii)%point*massc*(vs(1) - vc(1))
1375 shell_vel(2, shell_index) = v(2) + map_info%p_scale(2, ii)%point*massc*(vs(2) - vc(2))
1376 shell_vel(3, shell_index) = v(3) + map_info%p_scale(3, ii)%point*massc*(vs(3) - vc(3))
1377 core_vel(1, shell_index) = v(1) + map_info%p_scale(1, ii)%point*masss*(vc(1) - vs(1))
1378 core_vel(2, shell_index) = v(2) + map_info%p_scale(2, ii)%point*masss*(vc(2) - vs(2))
1379 core_vel(3, shell_index) = v(3) + map_info%p_scale(3, ii)%point*masss*(vc(3) - vs(3))
1381 vc(1:3) = core_particle_set(shell_index)%v(1:3)
1382 vs(1:3) = shell_particle_set(shell_index)%v(1:3)
1383 v(1:3) = particle_set(iparticle)%v(1:3)
1384 shell_particle_set(shell_index)%v(1) = v(1) + map_info%p_scale(1, ii)%point*massc*(vs(1) - vc(1))
1385 shell_particle_set(shell_index)%v(2) = v(2) + map_info%p_scale(2, ii)%point*massc*(vs(2) - vc(2))
1386 shell_particle_set(shell_index)%v(3) = v(3) + map_info%p_scale(3, ii)%point*massc*(vs(3) - vc(3))
1387 core_particle_set(shell_index)%v(1) = v(1) + map_info%p_scale(1, ii)%point*masss*(vc(1) - vs(1))
1388 core_particle_set(shell_index)%v(2) = v(2) + map_info%p_scale(2, ii)%point*masss*(vc(2) - vs(2))
1389 core_particle_set(shell_index)%v(3) = v(3) + map_info%p_scale(3, ii)%point*masss*(vc(3) - vs(3))
1411 REAL(kind=
dp),
INTENT(OUT) :: nhc_pot, nhc_kin
1413 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_kin, array_pot
1415 INTEGER :: imap, l, n, number
1416 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: akin, vpot
1418 number = nhc%glob_num_nhc
1419 ALLOCATE (akin(number))
1420 ALLOCATE (vpot(number))
1423 DO n = 1, nhc%loc_num_nhc
1424 imap = nhc%map_info%index(n)
1425 DO l = 1, nhc%nhc_len
1426 akin(imap) = akin(imap) + 0.5_dp*nhc%nvt(l, n)%mass*nhc%nvt(l, n)%v**2
1427 vpot(imap) = vpot(imap) + nhc%nvt(l, n)%nkt*nhc%nvt(l, n)%eta
1433 CALL para_env%sum(akin)
1434 CALL para_env%sum(vpot)
1436 CALL communication_thermo_low1(akin, number, para_env)
1437 CALL communication_thermo_low1(vpot, number, para_env)
1443 IF (
PRESENT(array_pot))
THEN
1444 IF (
ASSOCIATED(array_pot))
THEN
1445 cpassert(
SIZE(array_pot) == number)
1447 ALLOCATE (array_pot(number))
1451 IF (
PRESENT(array_kin))
THEN
1452 IF (
ASSOCIATED(array_kin))
THEN
1453 cpassert(
SIZE(array_kin) == number)
1455 ALLOCATE (array_kin(number))
1478 para_env, array_pot, array_kin)
1481 INTEGER,
INTENT(IN) :: loc_num, glob_num
1482 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: thermo_energy
1483 REAL(kind=
dp),
INTENT(OUT) :: thermostat_kin
1485 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_pot, array_kin
1487 INTEGER :: imap, n, number
1488 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: akin
1491 ALLOCATE (akin(number))
1494 imap = map_info%index(n)
1495 akin(imap) = thermo_energy(n)
1500 CALL para_env%sum(akin)
1502 CALL communication_thermo_low1(akin, number, para_env)
1504 thermostat_kin = sum(akin)
1507 IF (
PRESENT(array_pot))
THEN
1508 IF (
ASSOCIATED(array_pot))
THEN
1509 cpassert(
SIZE(array_pot) == number)
1511 ALLOCATE (array_pot(number))
1515 IF (
PRESENT(array_kin))
THEN
1516 IF (
ASSOCIATED(array_kin))
THEN
1517 cpassert(
SIZE(array_kin) == number)
1519 ALLOCATE (array_kin(number))
1540 SUBROUTINE get_temperatures(map_info, loc_num, glob_num, nkt, dof, para_env, &
1541 temp_tot, array_temp)
1543 INTEGER,
INTENT(IN) :: loc_num, glob_num
1544 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: nkt, dof
1546 REAL(kind=
dp),
INTENT(OUT) :: temp_tot
1547 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_temp
1549 INTEGER :: i, imap, imap2, n, number
1550 REAL(kind=
dp) :: fdeg_of_free
1551 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: akin, deg_of_free
1554 ALLOCATE (akin(number))
1555 ALLOCATE (deg_of_free(number))
1557 deg_of_free = 0.0_dp
1559 imap = map_info%index(n)
1560 imap2 = map_info%map_index(n)
1561 IF (nkt(n) == 0.0_dp) cycle
1562 deg_of_free(imap) = real(dof(n), kind=
dp)
1563 akin(imap) = map_info%s_kin(imap2)
1568 CALL para_env%sum(akin)
1569 CALL para_env%sum(deg_of_free)
1571 CALL communication_thermo_low1(akin, number, para_env)
1572 CALL communication_thermo_low1(deg_of_free, number, para_env)
1574 temp_tot = sum(akin)
1575 fdeg_of_free = sum(deg_of_free)
1577 temp_tot = temp_tot/fdeg_of_free
1580 IF (
PRESENT(array_temp))
THEN
1581 IF (
ASSOCIATED(array_temp))
THEN
1582 cpassert(
SIZE(array_temp) == number)
1584 ALLOCATE (array_temp(number))
1587 array_temp(i) = akin(i)/deg_of_free(i)
1592 DEALLOCATE (deg_of_free)
1593 END SUBROUTINE get_temperatures
1606 array_pot, array_kin)
1608 REAL(kind=
dp),
INTENT(OUT) :: thermostat_pot, thermostat_kin
1610 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_pot, array_kin
1613 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: thermo_energy
1615 thermostat_pot = 0.0_dp
1616 thermostat_kin = 0.0_dp
1617 IF (
ASSOCIATED(thermostat))
THEN
1620 cpassert(
ASSOCIATED(thermostat%nhc))
1621 CALL get_nhc_energies(thermostat%nhc, thermostat_pot, thermostat_kin, para_env, &
1622 array_pot, array_kin)
1625 cpassert(
ASSOCIATED(thermostat%csvr))
1626 ALLOCATE (thermo_energy(thermostat%csvr%loc_num_csvr))
1627 DO i = 1, thermostat%csvr%loc_num_csvr
1628 thermo_energy(i) = thermostat%csvr%nvt(i)%thermostat_energy
1630 CALL get_kin_energies(thermostat%csvr%map_info, thermostat%csvr%loc_num_csvr, &
1631 thermostat%csvr%glob_num_csvr, thermo_energy, &
1632 thermostat_kin, para_env, array_pot, array_kin)
1633 DEALLOCATE (thermo_energy)
1635 ELSE IF (thermostat%type_of_thermostat ==
do_thermo_gle)
THEN
1637 cpassert(
ASSOCIATED(thermostat%gle))
1638 ALLOCATE (thermo_energy(thermostat%gle%loc_num_gle))
1639 DO i = 1, thermostat%gle%loc_num_gle
1640 thermo_energy(i) = thermostat%gle%nvt(i)%thermostat_energy
1642 CALL get_kin_energies(thermostat%gle%map_info, thermostat%gle%loc_num_gle, &
1643 thermostat%gle%glob_num_gle, thermo_energy, &
1644 thermostat_kin, para_env, array_pot, array_kin)
1645 DEALLOCATE (thermo_energy)
1662 SUBROUTINE get_region_temperatures(thermostat, tot_temperature, para_env, array_temp)
1664 REAL(kind=
dp),
INTENT(OUT) :: tot_temperature
1666 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL,
POINTER :: array_temp
1669 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: dof, nkt
1671 IF (
ASSOCIATED(thermostat))
THEN
1674 cpassert(
ASSOCIATED(thermostat%nhc))
1675 ALLOCATE (nkt(thermostat%nhc%loc_num_nhc))
1676 ALLOCATE (dof(thermostat%nhc%loc_num_nhc))
1677 DO i = 1, thermostat%nhc%loc_num_nhc
1678 nkt(i) = thermostat%nhc%nvt(1, i)%nkt
1679 dof(i) = real(thermostat%nhc%nvt(1, i)%degrees_of_freedom, kind=
dp)
1681 CALL get_temperatures(thermostat%nhc%map_info, thermostat%nhc%loc_num_nhc, &
1682 thermostat%nhc%glob_num_nhc, nkt, dof, para_env, tot_temperature, array_temp)
1687 cpassert(
ASSOCIATED(thermostat%csvr))
1689 ALLOCATE (nkt(thermostat%csvr%loc_num_csvr))
1690 ALLOCATE (dof(thermostat%csvr%loc_num_csvr))
1691 DO i = 1, thermostat%csvr%loc_num_csvr
1692 nkt(i) = thermostat%csvr%nvt(i)%nkt
1693 dof(i) = real(thermostat%csvr%nvt(i)%degrees_of_freedom, kind=
dp)
1695 CALL get_temperatures(thermostat%csvr%map_info, thermostat%csvr%loc_num_csvr, &
1696 thermostat%csvr%glob_num_csvr, nkt, dof, para_env, tot_temperature, array_temp)
1699 ELSE IF (thermostat%type_of_thermostat ==
do_thermo_al)
THEN
1701 cpassert(
ASSOCIATED(thermostat%al))
1703 ALLOCATE (nkt(thermostat%al%loc_num_al))
1704 ALLOCATE (dof(thermostat%al%loc_num_al))
1705 DO i = 1, thermostat%al%loc_num_al
1706 nkt(i) = thermostat%al%nvt(i)%nkt
1707 dof(i) = real(thermostat%al%nvt(i)%degrees_of_freedom, kind=
dp)
1709 CALL get_temperatures(thermostat%al%map_info, thermostat%al%loc_num_al, &
1710 thermostat%al%glob_num_al, nkt, dof, para_env, tot_temperature, array_temp)
1713 ELSE IF (thermostat%type_of_thermostat ==
do_thermo_gle)
THEN
1715 cpassert(
ASSOCIATED(thermostat%gle))
1717 ALLOCATE (nkt(thermostat%gle%loc_num_gle))
1718 ALLOCATE (dof(thermostat%gle%loc_num_gle))
1719 DO i = 1, thermostat%gle%loc_num_gle
1720 nkt(i) = thermostat%gle%nvt(i)%nkt
1721 dof(i) = real(thermostat%gle%nvt(i)%degrees_of_freedom, kind=
dp)
1723 CALL get_temperatures(thermostat%gle%map_info, thermostat%gle%loc_num_gle, &
1724 thermostat%gle%glob_num_gle, nkt, dof, para_env, tot_temperature, array_temp)
1730 END SUBROUTINE get_region_temperatures
1745 CHARACTER(LEN=default_string_length) :: my_pos, my_act
1746 INTEGER,
INTENT(IN) :: itimes
1747 REAL(kind=
dp),
INTENT(IN) :: time
1749 IF (
ASSOCIATED(thermostats))
THEN
1750 IF (
ASSOCIATED(thermostats%thermostat_part))
THEN
1751 CALL print_thermostat_status(thermostats%thermostat_part, para_env, my_pos, my_act, itimes, time)
1753 IF (
ASSOCIATED(thermostats%thermostat_shell))
THEN
1754 CALL print_thermostat_status(thermostats%thermostat_shell, para_env, my_pos, my_act, itimes, time)
1756 IF (
ASSOCIATED(thermostats%thermostat_coef))
THEN
1757 CALL print_thermostat_status(thermostats%thermostat_coef, para_env, my_pos, my_act, itimes, time)
1759 IF (
ASSOCIATED(thermostats%thermostat_baro))
THEN
1760 CALL print_thermostat_status(thermostats%thermostat_baro, para_env, my_pos, my_act, itimes, time)
1775 SUBROUTINE print_thermostat_status(thermostat, para_env, my_pos, my_act, itimes, time)
1778 CHARACTER(LEN=default_string_length) :: my_pos, my_act
1779 INTEGER,
INTENT(IN) :: itimes
1780 REAL(kind=
dp),
INTENT(IN) :: time
1784 REAL(kind=
dp) :: thermo_kin, thermo_pot, tot_temperature
1785 REAL(kind=
dp),
DIMENSION(:),
POINTER :: array_kin, array_pot, array_temp
1789 NULLIFY (logger, print_key, array_pot, array_kin, array_temp)
1792 IF (
ASSOCIATED(thermostat))
THEN
1798 extension=
"."//trim(thermostat%label)//
".tener", file_position=my_pos, &
1799 file_action=my_act, is_new_file=new_file)
1802 WRITE (unit,
'(A)')
"# Thermostat Potential and Kinetic Energies - Total and per Region"
1803 WRITE (unit,
'("#",3X,A,2X,A,13X,A,10X,A)')
"Step Nr.",
"Time[fs]",
"Kin.[a.u.]",
"Pot.[a.u.]"
1805 WRITE (unit=unit, fmt=
"(I8, F12.3,6X,2F20.10)") itimes, time*
femtoseconds, thermo_kin, thermo_pot
1806 WRITE (unit,
'(A,4F20.10)')
"# KINETIC ENERGY REGIONS: ", array_kin(1:min(4,
SIZE(array_kin)))
1807 DO i = 5,
SIZE(array_kin), 4
1808 WRITE (unit=unit, fmt=
'("#",25X,4F20.10)') array_kin(i:min(i + 3,
SIZE(array_kin)))
1810 WRITE (unit,
'(A,4F20.10)')
"# POTENT. ENERGY REGIONS: ", array_pot(1:min(4,
SIZE(array_pot)))
1811 DO i = 5,
SIZE(array_pot), 4
1812 WRITE (unit=unit, fmt=
'("#",25X,4F20.10)') array_pot(i:min(i + 3,
SIZE(array_pot)))
1816 DEALLOCATE (array_kin)
1817 DEALLOCATE (array_pot)
1823 CALL get_region_temperatures(thermostat, tot_temperature, para_env, array_temp)
1825 extension=
"."//trim(thermostat%label)//
".temp", file_position=my_pos, &
1826 file_action=my_act, is_new_file=new_file)
1829 WRITE (unit,
'(A)')
"# Temperature Total and per Region"
1830 WRITE (unit,
'("#",3X,A,2X,A,10X,A)')
"Step Nr.",
"Time[fs]",
"Temp.[K]"
1832 WRITE (unit=unit, fmt=
"(I8, F12.3,3X,F20.10)") itimes, time*
femtoseconds, tot_temperature
1833 WRITE (unit,
'(A,I10)')
"# TEMPERATURE REGIONS: ",
SIZE(array_temp)
1834 DO i = 1,
SIZE(array_temp), 4
1835 WRITE (unit=unit, fmt=
'("#",22X,4F20.10)') array_temp(i:min(i + 3,
SIZE(array_temp)))
1839 DEALLOCATE (array_temp)
1843 END SUBROUTINE print_thermostat_status
1852 SUBROUTINE communication_thermo_low1(array, number, para_env)
1853 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: array
1854 INTEGER,
INTENT(IN) :: number
1857 INTEGER :: i, icheck, ncheck
1858 REAL(kind=
dp),
DIMENSION(:),
POINTER :: work, work2
1860 ALLOCATE (work(para_env%num_pe))
1863 work(para_env%mepos + 1) = array(i)
1864 CALL para_env%sum(work)
1865 ncheck = count(work /= 0.0_dp)
1867 IF (ncheck /= 0)
THEN
1868 ALLOCATE (work2(ncheck))
1870 DO icheck = 1, para_env%num_pe
1871 IF (work(icheck) /= 0.0_dp)
THEN
1873 work2(ncheck) = work(icheck)
1876 cpassert(ncheck ==
SIZE(work2))
1877 cpassert(all(work2 == work2(1)))
1884 END SUBROUTINE communication_thermo_low1
1895 INTEGER,
DIMENSION(:, :),
INTENT(INOUT) :: array
1896 INTEGER,
INTENT(IN) :: number1, number2
1899 INTEGER :: i, icheck, j, ncheck
1900 INTEGER,
DIMENSION(:, :),
POINTER :: work, work2
1902 ALLOCATE (work(number1, para_env%num_pe))
1905 work(:, para_env%mepos + 1) = array(:, i)
1906 CALL para_env%sum(work)
1908 DO j = 1, para_env%num_pe
1909 IF (any(work(:, j) /= 0))
THEN
1914 IF (ncheck /= 0)
THEN
1915 ALLOCATE (work2(number1, ncheck))
1917 DO icheck = 1, para_env%num_pe
1918 IF (any(work(:, icheck) /= 0))
THEN
1920 work2(:, ncheck) = work(:, icheck)
1923 cpassert(ncheck ==
SIZE(work2, 2))
1925 cpassert(all(work2(:, j) == work2(:, 1)))
1927 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.