80#include "../base/base_uses.f90"
85 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'md_vel_utils'
104 SUBROUTINE compute_rcom(part, is_fixed, rcom)
105 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
106 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
107 REAL(KIND=
dp),
DIMENSION(3),
INTENT(OUT) :: rcom
110 REAL(KIND=
dp) :: denom, mass
111 TYPE(atomic_kind_type),
POINTER :: atomic_kind
116 atomic_kind => part(i)%atomic_kind
118 SELECT CASE (is_fixed(i))
120 rcom(1) = rcom(1) + part(i)%r(1)*mass
121 rcom(2) = rcom(2) + part(i)%r(2)*mass
122 rcom(3) = rcom(3) + part(i)%r(3)*mass
128 END SUBROUTINE compute_rcom
141 SUBROUTINE compute_vcom(part, is_fixed, vcom, ecom)
142 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
143 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
144 REAL(KIND=
dp),
DIMENSION(3),
INTENT(OUT) :: vcom
145 REAL(KIND=
dp),
INTENT(OUT),
OPTIONAL :: ecom
148 REAL(KIND=
dp) :: denom, mass
149 TYPE(atomic_kind_type),
POINTER :: atomic_kind
154 atomic_kind => part(i)%atomic_kind
156 IF (mass /= 0.0)
THEN
157 SELECT CASE (is_fixed(i))
159 vcom(1) = vcom(1) + part(i)%v(1)*mass
160 vcom(2) = vcom(2) + part(i)%v(2)*mass
161 vcom(3) = vcom(3) + part(i)%v(3)*mass
167 IF (
PRESENT(ecom))
THEN
168 ecom = 0.5_dp*denom*sum(vcom*vcom)
171 END SUBROUTINE compute_vcom
183 SUBROUTINE clone_core_shell_vel(part, shell_part, core_part)
184 TYPE(particle_type),
DIMENSION(:),
POINTER :: part, shell_part, core_part
188 TYPE(atomic_kind_type),
POINTER :: atomic_kind
191 atomic_kind => part(i)%atomic_kind
194 shell_part(part(i)%shell_index)%v(:) = part(i)%v(:)
195 core_part(part(i)%shell_index)%v(:) = part(i)%v(:)
199 END SUBROUTINE clone_core_shell_vel
212 FUNCTION compute_ekin(part, ireg)
RESULT(ekin)
213 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
214 INTEGER,
INTENT(IN),
OPTIONAL :: ireg
215 REAL(KIND=
dp) :: ekin
218 REAL(KIND=
dp) :: mass
219 TYPE(atomic_kind_type),
POINTER :: atomic_kind
221 NULLIFY (atomic_kind)
223 IF (
PRESENT(ireg))
THEN
225 IF (part(i)%t_region_index == ireg)
THEN
226 atomic_kind => part(i)%atomic_kind
228 ekin = ekin + 0.5_dp*mass*sum(part(i)%v(:)*part(i)%v(:))
233 atomic_kind => part(i)%atomic_kind
235 ekin = ekin + 0.5_dp*mass*sum(part(i)%v(:)*part(i)%v(:))
239 END FUNCTION compute_ekin
256 SUBROUTINE rescale_vel(part, simpar, ekin, vcom, ireg, nfree, temp)
257 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
258 TYPE(simpar_type),
POINTER :: simpar
259 REAL(KIND=
dp),
INTENT(INOUT) :: ekin
260 REAL(KIND=
dp),
DIMENSION(3),
INTENT(INOUT), &
262 INTEGER,
INTENT(IN),
OPTIONAL :: ireg, nfree
263 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: temp
265 INTEGER :: i, my_ireg, my_nfree
266 REAL(KIND=
dp) :: factor, my_temp
268 IF (
PRESENT(ireg) .AND.
PRESENT(nfree) .AND.
PRESENT(temp))
THEN
272 ELSE IF (
PRESENT(nfree))
THEN
275 my_temp = simpar%temp_ext
278 my_nfree = simpar%nfree
279 my_temp = simpar%temp_ext
281 IF (my_nfree /= 0)
THEN
282 factor = my_temp/(2.0_dp*ekin)*real(my_nfree, kind=
dp)
290 factor = sqrt(factor)
291 IF (
PRESENT(ireg))
THEN
293 IF (part(i)%t_region_index == my_ireg) part(i)%v(:) = factor*part(i)%v(:)
297 part(i)%v(:) = factor*part(i)%v(:)
299 IF (
PRESENT(vcom))
THEN
304 END SUBROUTINE rescale_vel
315 SUBROUTINE rescale_vel_region(part, md_env, simpar)
317 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
318 TYPE(md_environment_type),
POINTER :: md_env
319 TYPE(simpar_type),
POINTER :: simpar
321 INTEGER :: ireg, nfree, nfree0, nfree_done
322 REAL(KIND=
dp) :: ekin, temp
323 TYPE(thermal_region_type),
POINTER :: t_region
324 TYPE(thermal_regions_type),
POINTER :: thermal_regions
326 NULLIFY (thermal_regions, t_region)
328 CALL get_md_env(md_env, thermal_regions=thermal_regions)
330 DO ireg = 1, thermal_regions%nregions
332 t_region => thermal_regions%thermal_region(ireg)
333 nfree = t_region%npart*3
334 ekin = compute_ekin(part, ireg)
335 temp = t_region%temp_expected
336 CALL rescale_vel(part, simpar, ekin, ireg=ireg, nfree=nfree, temp=temp)
337 nfree_done = nfree_done + nfree
338 ekin = compute_ekin(part, ireg)
339 temp = 2.0_dp*ekin/real(nfree,
dp)*
kelvin
340 t_region%temperature = temp
342 nfree0 = simpar%nfree - nfree_done
344 ekin = compute_ekin(part, 0)
345 CALL rescale_vel(part, simpar, ekin, ireg=0, nfree=nfree0, temp=simpar%temp_ext)
346 ekin = compute_ekin(part, 0)
347 temp = 2.0_dp*ekin/real(nfree0,
dp)*
kelvin
348 thermal_regions%temp_reg0 = temp
350 END SUBROUTINE rescale_vel_region
362 SUBROUTINE subtract_vcom(part, is_fixed, vcom)
363 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
364 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
365 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: vcom
370 SELECT CASE (is_fixed(i))
372 part(i)%v(2) = part(i)%v(2) - vcom(2)
373 part(i)%v(3) = part(i)%v(3) - vcom(3)
375 part(i)%v(1) = part(i)%v(1) - vcom(1)
376 part(i)%v(3) = part(i)%v(3) - vcom(3)
378 part(i)%v(1) = part(i)%v(1) - vcom(1)
379 part(i)%v(2) = part(i)%v(2) - vcom(2)
381 part(i)%v(3) = part(i)%v(3) - vcom(3)
383 part(i)%v(2) = part(i)%v(2) - vcom(2)
385 part(i)%v(1) = part(i)%v(1) - vcom(1)
387 part(i)%v(:) = part(i)%v(:) - vcom(:)
390 END SUBROUTINE subtract_vcom
403 SUBROUTINE compute_vang(part, is_fixed, rcom, vang)
404 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
405 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
406 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: rcom
407 REAL(KIND=
dp),
DIMENSION(3),
INTENT(OUT) :: vang
410 REAL(KIND=
dp) :: mass, proj
411 REAL(KIND=
dp),
DIMENSION(3) :: evals, mang, r
412 REAL(KIND=
dp),
DIMENSION(3, 3) :: iner
413 TYPE(atomic_kind_type),
POINTER :: atomic_kind
415 NULLIFY (atomic_kind)
420 SELECT CASE (is_fixed(i))
422 r(:) = part(i)%r(:) - rcom(:)
423 atomic_kind => part(i)%atomic_kind
425 mang(1) = mang(1) + mass*(r(2)*part(i)%v(3) - r(3)*part(i)%v(2))
426 mang(2) = mang(2) + mass*(r(3)*part(i)%v(1) - r(1)*part(i)%v(3))
427 mang(3) = mang(3) + mass*(r(1)*part(i)%v(2) - r(2)*part(i)%v(1))
429 iner(1, 1) = iner(1, 1) + mass*(r(2)*r(2) + r(3)*r(3))
430 iner(2, 2) = iner(2, 2) + mass*(r(3)*r(3) + r(1)*r(1))
431 iner(3, 3) = iner(3, 3) + mass*(r(1)*r(1) + r(2)*r(2))
433 iner(1, 2) = iner(1, 2) - mass*r(1)*r(2)
434 iner(2, 3) = iner(2, 3) - mass*r(2)*r(3)
435 iner(3, 1) = iner(3, 1) - mass*r(3)*r(1)
438 iner(2, 1) = iner(1, 2)
439 iner(3, 2) = iner(2, 3)
440 iner(1, 3) = iner(3, 1)
449 IF (evals(i) > 0.0_dp)
THEN
450 proj = sum(iner(:, i)*mang)/evals(i)
451 vang(1) = vang(1) + proj*iner(1, i)
452 vang(2) = vang(2) + proj*iner(2, i)
453 vang(3) = vang(3) + proj*iner(3, i)
457 END SUBROUTINE compute_vang
470 SUBROUTINE subtract_vang(part, is_fixed, rcom, vang)
471 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
472 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
473 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: rcom, vang
476 REAL(KIND=
dp),
DIMENSION(3) :: r
479 r(:) = part(i)%r(:) - rcom(:)
480 SELECT CASE (is_fixed(i))
482 part(i)%v(2) = part(i)%v(2) - (vang(3)*r(1) - vang(1)*r(3))
483 part(i)%v(3) = part(i)%v(3) - (vang(1)*r(2) - vang(2)*r(1))
485 part(i)%v(1) = part(i)%v(1) - (vang(2)*r(3) - vang(3)*r(2))
486 part(i)%v(3) = part(i)%v(3) - (vang(1)*r(2) - vang(2)*r(1))
488 part(i)%v(1) = part(i)%v(1) - (vang(2)*r(3) - vang(3)*r(2))
489 part(i)%v(2) = part(i)%v(2) - (vang(3)*r(1) - vang(1)*r(3))
491 part(i)%v(3) = part(i)%v(3) - (vang(1)*r(2) - vang(2)*r(1))
493 part(i)%v(2) = part(i)%v(2) - (vang(3)*r(1) - vang(1)*r(3))
495 part(i)%v(1) = part(i)%v(1) - (vang(2)*r(3) - vang(3)*r(2))
497 part(i)%v(1) = part(i)%v(1) - (vang(2)*r(3) - vang(3)*r(2))
498 part(i)%v(2) = part(i)%v(2) - (vang(3)*r(1) - vang(1)*r(3))
499 part(i)%v(3) = part(i)%v(3) - (vang(1)*r(2) - vang(2)*r(1))
503 END SUBROUTINE subtract_vang
528 SUBROUTINE initialize_velocities(simpar, &
542 write_binary_restart_file)
544 TYPE(simpar_type),
POINTER :: simpar
545 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
546 TYPE(force_env_type),
POINTER :: force_env
547 TYPE(global_environment_type),
POINTER :: globenv
548 TYPE(md_environment_type),
POINTER :: md_env
549 TYPE(molecule_kind_list_type),
POINTER :: molecule_kinds
550 CHARACTER(LEN=*),
INTENT(IN) :: label
551 TYPE(section_vals_type),
POINTER :: print_section, subsys_section
552 LOGICAL,
INTENT(IN) :: shell_present
553 TYPE(particle_type),
DIMENSION(:),
POINTER :: shell_part, core_part
554 LOGICAL,
INTENT(IN) :: force_rescaling
555 TYPE(mp_para_env_type),
POINTER :: para_env
556 LOGICAL,
INTENT(IN) :: write_binary_restart_file
558 CHARACTER(LEN=*),
PARAMETER :: routineN =
'initialize_velocities'
560 INTEGER :: handle, i, ifixd, imolecule_kind, iw, &
562 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: is_fixed
564 REAL(KIND=
dp) :: ecom, ekin, mass, mass_tot, temp, tmp_r1
565 REAL(KIND=
dp),
DIMENSION(3) :: rcom, vang, vcom
566 TYPE(atomic_kind_type),
POINTER :: atomic_kind
567 TYPE(cell_type),
POINTER :: cell
568 TYPE(cp_logger_type),
POINTER :: logger
569 TYPE(fixd_constraint_type),
DIMENSION(:),
POINTER :: fixd_list
570 TYPE(molecule_kind_type),
DIMENSION(:),
POINTER :: molecule_kind_set
571 TYPE(molecule_kind_type),
POINTER :: molecule_kind
572 TYPE(section_vals_type),
POINTER :: md_section, root_section, vib_section
574 CALL timeset(routinen, handle)
578 NULLIFY (atomic_kind, fixd_list, logger, molecule_kind)
579 NULLIFY (molecule_kind_set)
586 ALLOCATE (is_fixed(natoms))
589 molecule_kind_set => molecule_kinds%els
590 DO imolecule_kind = 1, molecule_kinds%n_els
591 molecule_kind => molecule_kind_set(imolecule_kind)
593 IF (
ASSOCIATED(fixd_list))
THEN
594 DO ifixd = 1,
SIZE(fixd_list)
595 IF (.NOT. fixd_list(ifixd)%restraint%active) is_fixed(fixd_list(ifixd)%fixd) = fixd_list(ifixd)%itype
605 atomic_kind => part(i)%atomic_kind
607 mass_tot = mass_tot + mass
609 simpar%v_shock = simpar%v_shock*sqrt(mass_tot)
612 CALL read_input_velocities(simpar, part, force_env, md_env, subsys_section, &
613 shell_present, shell_part, core_part, force_rescaling, para_env, is_fixed, success)
614 IF (.NOT. success)
THEN
615 SELECT CASE (simpar%initialization_method)
617 CALL generate_velocities(simpar, part, force_env, globenv, md_env, shell_present, &
618 shell_part, core_part, is_fixed, iw)
620 CALL force_env_get(force_env=force_env, root_section=root_section)
623 CALL generate_coords_vels_vib(simpar, &
634 CALL update_subsys(subsys_section, force_env, .false., write_binary_restart_file)
639 WRITE (iw,
'(/,T2,A)') &
640 'MD_VEL| '//trim(adjustl(label))
642 CALL compute_vcom(part, is_fixed, vcom, ecom)
643 ekin = compute_ekin(part) - ecom
644 IF (simpar%nfree == 0)
THEN
645 cpassert(ekin == 0.0_dp)
648 temp = 2.0_dp*ekin/real(simpar%nfree, kind=
dp)
651 WRITE (iw,
'(T2,A,T61,F20.6)') &
652 'MD_VEL| Initial temperature [K]', tmp_r1
653 WRITE (iw,
'(T2,A,T30,3(1X,F16.10))') &
654 'MD_VEL| COM velocity', vcom(1:3)
658 IF (sum(cell%perd(1:3)) == 0)
THEN
659 CALL compute_rcom(part, is_fixed, rcom)
660 CALL compute_vang(part, is_fixed, rcom, vang)
661 WRITE (iw,
'(T2,A,T30,3(1X,F16.10))') &
662 'MD_VEL| COM position', rcom(1:3)
663 WRITE (iw,
'(T2,A,T30,3(1X,F16.10))') &
664 'MD_VEL| Angular velocity', vang(1:3)
668 DEALLOCATE (is_fixed)
670 CALL timestop(handle)
672 END SUBROUTINE initialize_velocities
690 SUBROUTINE read_input_velocities(simpar, part, force_env, md_env, subsys_section, &
691 shell_present, shell_part, core_part, force_rescaling, para_env, is_fixed, success)
692 TYPE(simpar_type),
POINTER :: simpar
693 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
694 TYPE(force_env_type),
POINTER :: force_env
695 TYPE(md_environment_type),
POINTER :: md_env
696 TYPE(section_vals_type),
POINTER :: subsys_section
697 LOGICAL,
INTENT(IN) :: shell_present
698 TYPE(particle_type),
DIMENSION(:),
POINTER :: shell_part, core_part
699 LOGICAL,
INTENT(IN) :: force_rescaling
700 TYPE(mp_para_env_type),
POINTER :: para_env
701 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
702 LOGICAL,
INTENT(OUT) :: success
704 INTEGER :: i, natoms, nshell, shell_index
705 LOGICAL :: atomvel_explicit, atomvel_read, corevel_explicit, corevel_read, is_ok, &
706 rescale_regions, shellvel_explicit, shellvel_read
707 REAL(KIND=
dp) :: ecom, ekin, fac_massc, fac_masss, mass
708 REAL(KIND=
dp),
DIMENSION(3) :: vc, vcom, vs
709 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vel
710 TYPE(atomic_kind_type),
POINTER :: atomic_kind
711 TYPE(cell_type),
POINTER :: cell
712 TYPE(cp_sll_val_type),
POINTER :: atom_list, core_list, shell_list
713 TYPE(section_vals_type),
POINTER :: atomvel_section, corevel_section, &
715 TYPE(shell_kind_type),
POINTER :: shell
716 TYPE(thermal_regions_type),
POINTER :: thermal_regions
717 TYPE(val_type),
POINTER :: val
723 atomvel_read = .false.
724 corevel_read = .false.
725 shellvel_read = .false.
726 NULLIFY (vel, atomic_kind, atom_list, core_list, shell_list)
727 NULLIFY (atomvel_section, shellvel_section, corevel_section)
728 NULLIFY (cell, shell, thermal_regions, val)
733 IF (shell_present)
THEN
734 cpassert(
ASSOCIATED(core_part))
735 cpassert(
ASSOCIATED(shell_part))
736 nshell =
SIZE(shell_part)
747 cpassert(shellvel_explicit .EQV. corevel_explicit)
750 subsys_section, atomvel_read, cell)
752 subsys_section, shellvel_read, cell)
754 subsys_section, corevel_read, cell)
756 IF (.NOT. (atomvel_explicit .OR. atomvel_read))
RETURN
759 IF (.NOT. atomvel_read)
THEN
770 SELECT CASE (is_fixed(i))
772 part(i)%v(1) = 0.0_dp
774 part(i)%v(2) = 0.0_dp
776 part(i)%v(3) = 0.0_dp
778 part(i)%v(1) = 0.0_dp
779 part(i)%v(2) = 0.0_dp
781 part(i)%v(1) = 0.0_dp
782 part(i)%v(3) = 0.0_dp
784 part(i)%v(2) = 0.0_dp
785 part(i)%v(3) = 0.0_dp
790 IF (shell_present)
THEN
791 IF (shellvel_explicit)
THEN
799 shell_part(i)%v = vel
807 IF (.NOT. (shellvel_read .AND. corevel_read))
THEN
809 CALL clone_core_shell_vel(part, shell_part, core_part)
815 CALL compute_vcom(part, is_fixed, vcom, ecom)
816 ekin = compute_ekin(part) - ecom
818 IF (simpar%do_thermal_region)
THEN
819 CALL get_md_env(md_env, thermal_regions=thermal_regions)
820 IF (
ASSOCIATED(thermal_regions))
THEN
821 rescale_regions = thermal_regions%force_rescaling
824 rescale_regions = .false.
826 IF (simpar%nfree /= 0 .AND. (force_rescaling .OR. rescale_regions))
THEN
827 IF (simpar%do_thermal_region)
THEN
828 CALL rescale_vel_region(part, md_env, simpar)
830 CALL rescale_vel(part, simpar, ekin, vcom=vcom)
835 shell_index = part(i)%shell_index
836 IF (shell_present .AND. shell_index /= 0)
THEN
837 atomic_kind => part(i)%atomic_kind
839 fac_masss = shell%mass_shell/mass
840 fac_massc = shell%mass_core/mass
841 vs = shell_part(shell_index)%v
842 vc = core_part(shell_index)%v
844 shell_part(shell_index)%v(1) = part(i)%v(1) + fac_massc*(vs(1) - vc(1))
845 shell_part(shell_index)%v(2) = part(i)%v(2) + fac_massc*(vs(2) - vc(2))
846 shell_part(shell_index)%v(3) = part(i)%v(3) + fac_massc*(vs(3) - vc(3))
847 core_part(shell_index)%v(1) = part(i)%v(1) + fac_masss*(vc(1) - vs(1))
848 core_part(shell_index)%v(2) = part(i)%v(2) + fac_masss*(vc(2) - vs(2))
849 core_part(shell_index)%v(3) = part(i)%v(3) + fac_masss*(vc(3) - vs(3))
853 END SUBROUTINE read_input_velocities
872 SUBROUTINE generate_coords_vels_vib(simpar, &
882 TYPE(simpar_type),
POINTER :: simpar
883 TYPE(particle_type),
DIMENSION(:),
POINTER :: particles
884 TYPE(section_vals_type),
POINTER :: md_section, vib_section
885 TYPE(force_env_type),
POINTER :: force_env
886 TYPE(global_environment_type),
POINTER :: global_env
887 LOGICAL,
INTENT(IN) :: shell_present
888 TYPE(particle_type),
DIMENSION(:),
POINTER :: shell_particles, core_particles
889 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
891 INTEGER :: dof, fixed_dof, iatom, ii, imode, &
892 my_dof, natoms, shell_index
893 REAL(KIND=
dp) :: erand, mass, my_phase, ratio, temperature
894 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues, phase, random
895 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dr, eigenvectors
896 TYPE(atomic_kind_type),
POINTER :: atomic_kind
897 TYPE(mp_para_env_type),
POINTER :: para_env
898 TYPE(rng_stream_type),
ALLOCATABLE :: random_stream
901 natoms =
SIZE(particles)
902 temperature = simpar%temp_ext
904 ALLOCATE (eigenvalues(my_dof))
905 ALLOCATE (eigenvectors(my_dof, my_dof))
906 ALLOCATE (phase(my_dof))
907 ALLOCATE (random(my_dof))
908 ALLOCATE (dr(3, natoms))
917 IF (my_dof /= dof)
THEN
918 CALL cp_abort(__location__, &
919 "number of degrees of freedom in vibrational analysis data "// &
920 "do not match total number of cartesian degrees of freedom")
924 my_phase = min(1.0_dp, my_phase)
927 CALL random_stream%fill(random)
928 IF (my_phase < 0.0_dp)
THEN
929 CALL random_stream%fill(phase)
933 DEALLOCATE (random_stream)
943 erand = erand - temperature*log(1.0_dp - random(imode))
948 SELECT CASE (is_fixed(iatom))
950 fixed_dof = fixed_dof + 1
952 fixed_dof = fixed_dof + 2
954 fixed_dof = fixed_dof + 3
957 my_dof = my_dof - fixed_dof
958 ratio = real(my_dof, kind=
dp)*temperature/erand
961 atomic_kind => particles(iatom)%atomic_kind
963 SELECT CASE (is_fixed(iatom))
966 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
967 eigenvectors, random, phase, dof, ratio)
968 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
969 eigenvectors, random, phase, dof, &
974 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
975 eigenvectors, random, phase, dof, ratio)
976 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
977 eigenvectors, random, phase, dof, &
982 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
983 eigenvectors, random, phase, dof, ratio)
984 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
985 eigenvectors, random, phase, dof, &
989 dr(3, iatom) = dr_from_vib_data(iatom, 3, mass, temperature, eigenvalues, &
990 eigenvectors, random, phase, dof, ratio)
991 particles(iatom)%v(3) = dv_from_vib_data(iatom, 3, mass, temperature, &
992 eigenvectors, random, phase, dof, &
995 dr(2, iatom) = dr_from_vib_data(iatom, 2, mass, temperature, eigenvalues, &
996 eigenvectors, random, phase, dof, ratio)
997 particles(iatom)%v(2) = dv_from_vib_data(iatom, 2, mass, temperature, &
998 eigenvectors, random, phase, dof, &
1001 dr(1, iatom) = dr_from_vib_data(iatom, 1, mass, temperature, eigenvalues, &
1002 eigenvectors, random, phase, dof, ratio)
1003 particles(iatom)%v(1) = dv_from_vib_data(iatom, 1, mass, temperature, &
1004 eigenvectors, random, phase, dof, &
1008 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
1009 eigenvectors, random, phase, dof, ratio)
1010 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
1011 eigenvectors, random, phase, dof, &
1017 DEALLOCATE (eigenvalues)
1018 DEALLOCATE (eigenvectors)
1022 DO iatom = 1, natoms
1023 particles(iatom)%r(:) = particles(iatom)%r(:) + dr(:, iatom)
1026 IF (shell_present)
THEN
1030 shell_index = particles(iatom)%shell_index
1031 IF (shell_index /= 0)
THEN
1032 core_particles(shell_index)%r(:) = core_particles(shell_index)%r(:) + &
1034 shell_particles(shell_index)%r(:) = shell_particles(shell_index)%r(:) + &
1045 END SUBROUTINE generate_coords_vels_vib
1066 PURE FUNCTION dr_from_vib_data(iatom, &
1077 INTEGER,
INTENT(IN) :: iatom, icart
1078 REAL(KIND=
dp),
INTENT(IN) :: mass, temperature
1079 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: eigenvalues
1080 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenvectors
1081 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: random, phase
1082 INTEGER,
INTENT(IN) :: dof
1083 REAL(KIND=
dp),
INTENT(IN) :: scale
1084 REAL(KIND=
dp) :: res
1086 INTEGER :: imode, ind
1093 IF (mass > 0.0_dp)
THEN
1095 ind = (iatom - 1)*3 + icart
1098 sqrt(-2.0_dp*scale*temperature*log(1 - random(imode))/mass)/ &
1099 eigenvalues(imode)* &
1100 eigenvectors(ind, imode)* &
1101 cos(2.0_dp*
pi*phase(imode))
1104 END FUNCTION dr_from_vib_data
1124 PURE FUNCTION dv_from_vib_data(iatom, &
1134 INTEGER,
INTENT(IN) :: iatom, icart
1135 REAL(KIND=
dp),
INTENT(IN) :: mass, temperature
1136 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenvectors
1137 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: random, phase
1138 INTEGER,
INTENT(IN) :: dof
1139 REAL(KIND=
dp),
INTENT(IN) :: scale
1140 REAL(KIND=
dp) :: res
1142 INTEGER :: imode, ind
1149 IF (mass > 0.0_dp)
THEN
1151 ind = (iatom - 1)*3 + icart
1154 sqrt(-2.0_dp*scale*temperature*log(1 - random(imode))/mass)* &
1155 eigenvectors(ind, imode)* &
1156 sin(2.0_dp*
pi*phase(imode))
1159 END FUNCTION dv_from_vib_data
1175 SUBROUTINE generate_velocities(simpar, part, force_env, globenv, md_env, &
1176 shell_present, shell_part, core_part, is_fixed, iw)
1177 TYPE(simpar_type),
POINTER :: simpar
1178 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1179 TYPE(force_env_type),
POINTER :: force_env
1180 TYPE(global_environment_type),
POINTER :: globenv
1181 TYPE(md_environment_type),
POINTER :: md_env
1182 LOGICAL,
INTENT(IN) :: shell_present
1183 TYPE(particle_type),
DIMENSION(:),
POINTER :: shell_part, core_part
1184 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
1185 INTEGER,
INTENT(IN) :: iw
1187 INTEGER :: i, natoms
1188 REAL(KIND=
dp) :: mass
1189 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1191 NULLIFY (atomic_kind)
1195 atomic_kind => part(i)%atomic_kind
1197 part(i)%v(1) = 0.0_dp
1198 part(i)%v(2) = 0.0_dp
1199 part(i)%v(3) = 0.0_dp
1200 IF (mass /= 0.0)
THEN
1201 SELECT CASE (is_fixed(i))
1203 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1204 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1206 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1207 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1209 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1210 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1212 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1214 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1216 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1218 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1219 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1220 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1225 CALL normalize_velocities(simpar, part, force_env, md_env, is_fixed)
1226 CALL soften_velocities(simpar, part, force_env, md_env, is_fixed, iw)
1230 IF (shell_present)
THEN
1233 END SUBROUTINE generate_velocities
1247 SUBROUTINE soften_velocities(simpar, part, force_env, md_env, is_fixed, iw)
1248 TYPE(simpar_type),
POINTER :: simpar
1249 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1250 TYPE(force_env_type),
POINTER :: force_env
1251 TYPE(md_environment_type),
POINTER :: md_env
1252 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
1253 INTEGER,
INTENT(IN) :: iw
1256 REAL(KIND=
dp),
DIMENSION(SIZE(part), 3) :: f, f_t, n, x0
1258 IF (simpar%soften_nsteps <= 0)
RETURN
1261 cpabort(
"Velocitiy softening with constraints is not supported.")
1265 DO i = 1,
SIZE(part)
1266 x0(i, :) = part(i)%r
1269 DO k = 1, simpar%soften_nsteps
1272 DO i = 1,
SIZE(part)
1275 n = n/sqrt(sum(n**2))
1278 DO i = 1,
SIZE(part)
1279 part(i)%r = part(i)%r + simpar%soften_delta*n(i, :)
1284 DO i = 1,
SIZE(part)
1287 f_t = f - n*sum(n*f)
1290 DO i = 1,
SIZE(part)
1291 part(i)%r = x0(i, :)
1292 part(i)%v = part(i)%v + simpar%soften_alpha*f_t(i, :)
1295 CALL normalize_velocities(simpar, part, force_env, md_env, is_fixed)
1299 WRITE (iw,
"(A,T71, I10)")
" Velocities softening Steps: ", simpar%soften_nsteps
1300 WRITE (iw,
"(A,T71, E10.3)")
" Velocities softening NORM(F_t): ", sqrt(sum(f_t**2))
1302 END SUBROUTINE soften_velocities
1313 SUBROUTINE normalize_velocities(simpar, part, force_env, md_env, is_fixed)
1314 TYPE(simpar_type),
POINTER :: simpar
1315 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1316 TYPE(force_env_type),
POINTER :: force_env
1317 TYPE(md_environment_type),
POINTER :: md_env
1318 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
1320 REAL(KIND=
dp) :: ekin
1321 REAL(KIND=
dp),
DIMENSION(3) :: rcom, vang, vcom
1322 TYPE(cell_type),
POINTER :: cell
1327 CALL compute_vcom(part, is_fixed, vcom)
1328 CALL subtract_vcom(part, is_fixed, vcom)
1331 IF (sum(cell%perd(1:3)) == 0 .AND. simpar%angvel_zero)
THEN
1332 CALL compute_rcom(part, is_fixed, rcom)
1333 CALL compute_vang(part, is_fixed, rcom, vang)
1334 CALL subtract_vang(part, is_fixed, rcom, vang)
1337 IF (simpar%do_thermal_region)
THEN
1338 CALL rescale_vel_region(part, md_env, simpar)
1340 ekin = compute_ekin(part)
1341 CALL rescale_vel(part, simpar, ekin)
1343 END SUBROUTINE normalize_velocities
1353 SUBROUTINE reset_vcom(subsys, md_ener, vsubtract)
1354 TYPE(cp_subsys_type),
POINTER :: subsys
1355 TYPE(md_ener_type),
POINTER :: md_ener
1356 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: vsubtract
1358 CHARACTER(LEN=*),
PARAMETER :: routineN =
'reset_vcom'
1360 INTEGER :: atom, handle, iatom, ikind, natom, &
1362 INTEGER,
DIMENSION(:),
POINTER :: atom_list
1364 REAL(KIND=
dp) :: ekin_old, imass_c, imass_s, mass, v2
1365 REAL(KIND=
dp),
DIMENSION(3) :: tmp, v
1366 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
1367 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1368 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
1370 TYPE(shell_kind_type),
POINTER :: shell
1372 NULLIFY (particles, atomic_kind, atomic_kinds, atom_list, shell)
1373 CALL timeset(routinen, handle)
1376 atomic_kinds=atomic_kinds, &
1377 particles=particles, &
1378 shell_particles=shell_particles, &
1379 core_particles=core_particles)
1381 ekin_old = md_ener%ekin
1383 DO ikind = 1, atomic_kinds%n_els
1384 atomic_kind => atomic_kinds%els(ikind)
1386 natom=natom, mass=mass, shell_active=is_shell, shell=shell)
1388 tmp = 0.5_dp*vsubtract*mass
1389 imass_s = 1.0_dp/shell%mass_shell
1390 imass_c = 1.0_dp/shell%mass_core
1392 atom = atom_list(iatom)
1393 shell_index = particles%els(
atom)%shell_index
1394 shell_particles%els(shell_index)%v = shell_particles%els(shell_index)%v - tmp*imass_s
1395 core_particles%els(shell_index)%v = core_particles%els(shell_index)%v - tmp*imass_c
1396 particles%els(
atom)%v = particles%els(
atom)%v - vsubtract
1400 atom = atom_list(iatom)
1401 particles%els(
atom)%v = particles%els(
atom)%v - vsubtract
1406 md_ener%vcom = 0.0_dp
1407 md_ener%total_mass = 0.0_dp
1408 md_ener%ekin = 0.0_dp
1409 DO ikind = 1, atomic_kinds%n_els
1410 atomic_kind => atomic_kinds%els(ikind)
1411 CALL get_atomic_kind(atomic_kind=atomic_kind, atom_list=atom_list, mass=mass, natom=natom)
1415 atom = atom_list(iatom)
1416 v2 = v2 + sum(particles%els(
atom)%v**2)
1417 v(1) = v(1) + particles%els(
atom)%v(1)
1418 v(2) = v(2) + particles%els(
atom)%v(2)
1419 v(3) = v(3) + particles%els(
atom)%v(3)
1421 md_ener%ekin = md_ener%ekin + 0.5_dp*mass*v2
1422 md_ener%vcom(1) = md_ener%vcom(1) + mass*v(1)
1423 md_ener%vcom(2) = md_ener%vcom(2) + mass*v(2)
1424 md_ener%vcom(3) = md_ener%vcom(3) + mass*v(3)
1425 md_ener%total_mass = md_ener%total_mass + real(natom, kind=
dp)*mass
1427 md_ener%vcom = md_ener%vcom/md_ener%total_mass
1428 md_ener%constant = md_ener%constant - ekin_old + md_ener%ekin
1429 IF (md_ener%nfree /= 0)
THEN
1430 md_ener%temp_part = 2.0_dp*md_ener%ekin/real(md_ener%nfree, kind=
dp)*
kelvin
1432 CALL timestop(handle)
1434 END SUBROUTINE reset_vcom
1446 SUBROUTINE scale_velocity(subsys, md_ener, temp_expected, temp_tol, iw)
1447 TYPE(cp_subsys_type),
POINTER :: subsys
1448 TYPE(md_ener_type),
POINTER :: md_ener
1449 REAL(KIND=
dp),
INTENT(IN) :: temp_expected, temp_tol
1450 INTEGER,
INTENT(IN) :: iw
1452 REAL(KIND=
dp) :: ekin_old, scale, temp_old
1454 IF (abs(temp_expected - md_ener%temp_part/
kelvin) > temp_tol)
THEN
1456 IF (md_ener%temp_part > 0.0_dp) scale = sqrt((temp_expected/md_ener%temp_part)*
kelvin)
1457 ekin_old = md_ener%ekin
1458 temp_old = md_ener%temp_part
1459 md_ener%ekin = 0.0_dp
1460 md_ener%temp_part = 0.0_dp
1461 md_ener%vcom = 0.0_dp
1462 md_ener%total_mass = 0.0_dp
1464 CALL scale_velocity_low(subsys, scale, ireg=0, ekin=md_ener%ekin, vcom=md_ener%vcom)
1465 IF (md_ener%nfree /= 0)
THEN
1466 md_ener%temp_part = 2.0_dp*md_ener%ekin/real(md_ener%nfree, kind=
dp)*
kelvin
1468 md_ener%constant = md_ener%constant - ekin_old + md_ener%ekin
1470 WRITE (unit=iw, fmt=
'(/,T2,A)') &
1471 'MD_VEL| Temperature scaled to requested temperature'
1472 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1473 'MD_VEL| Old temperature [K]', temp_old, &
1474 'MD_VEL| New temperature [K]', md_ener%temp_part
1478 END SUBROUTINE scale_velocity
1489 SUBROUTINE scale_velocity_region(md_env, subsys, md_ener, simpar, iw)
1491 TYPE(md_environment_type),
POINTER :: md_env
1492 TYPE(cp_subsys_type),
POINTER :: subsys
1493 TYPE(md_ener_type),
POINTER :: md_ener
1494 TYPE(simpar_type),
POINTER :: simpar
1495 INTEGER,
INTENT(IN) :: iw
1497 INTEGER :: ireg, nfree, nfree_done, nregions
1498 REAL(KIND=
dp) :: ekin, ekin_old, ekin_total_new, fscale, &
1499 vcom(3), vcom_total(3)
1500 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:) :: temp_new, temp_old
1501 TYPE(particle_list_type),
POINTER :: particles
1502 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1503 TYPE(thermal_region_type),
POINTER :: t_region
1504 TYPE(thermal_regions_type),
POINTER :: thermal_regions
1506 NULLIFY (particles, part, thermal_regions, t_region)
1508 part => particles%els
1509 CALL get_md_env(md_env, thermal_regions=thermal_regions)
1511 nregions = thermal_regions%nregions
1513 ekin_total_new = 0.0_dp
1514 ekin_old = md_ener%ekin
1516 ALLOCATE (temp_new(0:nregions), temp_old(0:nregions))
1520 DO ireg = 1, nregions
1522 t_region => thermal_regions%thermal_region(ireg)
1523 nfree = 3*t_region%npart
1524 ekin = compute_ekin(part, ireg)
1525 IF (nfree > 0) t_region%temperature = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1526 temp_old(ireg) = t_region%temperature
1527 IF (t_region%temp_tol > 0.0_dp .AND. &
1528 abs(t_region%temp_expected - t_region%temperature/
kelvin) > t_region%temp_tol)
THEN
1529 fscale = sqrt((t_region%temp_expected/t_region%temperature)*
kelvin)
1530 CALL scale_velocity_low(subsys, fscale, ireg, ekin, vcom)
1531 t_region%temperature = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1532 temp_new(ireg) = t_region%temperature
1534 nfree_done = nfree_done + nfree
1535 ekin_total_new = ekin_total_new + ekin
1537 nfree = simpar%nfree - nfree_done
1538 ekin = compute_ekin(part, ireg=0)
1539 IF (nfree > 0) thermal_regions%temp_reg0 = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1540 temp_old(0) = thermal_regions%temp_reg0
1541 IF (simpar%temp_tol > 0.0_dp .AND. nfree > 0)
THEN
1542 IF (abs(simpar%temp_ext - thermal_regions%temp_reg0/
kelvin) > simpar%temp_tol)
THEN
1543 fscale = sqrt((simpar%temp_ext/thermal_regions%temp_reg0)*
kelvin)
1544 CALL scale_velocity_low(subsys, fscale, 0, ekin, vcom)
1545 thermal_regions%temp_reg0 = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1546 temp_new(0) = thermal_regions%temp_reg0
1549 ekin_total_new = ekin_total_new + ekin
1551 md_ener%ekin = ekin_total_new
1552 IF (md_ener%nfree /= 0)
THEN
1553 md_ener%temp_part = 2.0_dp*md_ener%ekin/real(md_ener%nfree, kind=
dp)*
kelvin
1555 md_ener%constant = md_ener%constant - ekin_old + md_ener%ekin
1557 DO ireg = 0, nregions
1558 IF (temp_new(ireg) > 0.0_dp)
THEN
1559 WRITE (unit=iw, fmt=
'(/,T2,A,I0,A)') &
1560 'MD_VEL| Temperature region ', ireg,
' scaled to requested temperature'
1561 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1562 'MD_VEL| Old temperature [K]', temp_old(ireg), &
1563 'MD_VEL| New temperature [K]', temp_new(ireg)
1567 DEALLOCATE (temp_new, temp_old)
1569 END SUBROUTINE scale_velocity_region
1580 SUBROUTINE scale_velocity_low(subsys, fscale, ireg, ekin, vcom)
1582 TYPE(cp_subsys_type),
POINTER :: subsys
1583 REAL(KIND=
dp),
INTENT(IN) :: fscale
1584 INTEGER,
INTENT(IN) :: ireg
1585 REAL(KIND=
dp),
INTENT(OUT) :: ekin, vcom(3)
1587 INTEGER :: atom, iatom, ikind, my_ireg, natom, &
1589 INTEGER,
DIMENSION(:),
POINTER :: atom_list
1591 REAL(KIND=
dp) :: imass, mass, tmass, v2
1592 REAL(KIND=
dp),
DIMENSION(3) :: tmp, v, vc, vs
1593 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
1594 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1595 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
1597 TYPE(shell_kind_type),
POINTER :: shell
1599 NULLIFY (atomic_kinds, particles, shell_particles, core_particles, shell, atom_list)
1606 CALL cp_subsys_get(subsys, atomic_kinds=atomic_kinds, particles=particles, &
1607 shell_particles=shell_particles, core_particles=core_particles)
1609 DO ikind = 1, atomic_kinds%n_els
1610 atomic_kind => atomic_kinds%els(ikind)
1611 CALL get_atomic_kind(atomic_kind=atomic_kind, atom_list=atom_list, mass=mass, &
1612 natom=natom, shell_active=is_shell, shell=shell)
1618 atom = atom_list(iatom)
1620 IF (particles%els(
atom)%t_region_index /= my_ireg) cycle
1622 particles%els(
atom)%v(:) = fscale*particles%els(
atom)%v
1623 shell_index = particles%els(
atom)%shell_index
1624 vs = shell_particles%els(shell_index)%v
1625 vc = core_particles%els(shell_index)%v
1626 tmp(1) = imass*(vs(1) - vc(1))
1627 tmp(2) = imass*(vs(2) - vc(2))
1628 tmp(3) = imass*(vs(3) - vc(3))
1630 shell_particles%els(shell_index)%v(1) = particles%els(
atom)%v(1) + tmp(1)*shell%mass_core
1631 shell_particles%els(shell_index)%v(2) = particles%els(
atom)%v(2) + tmp(2)*shell%mass_core
1632 shell_particles%els(shell_index)%v(3) = particles%els(
atom)%v(3) + tmp(3)*shell%mass_core
1634 core_particles%els(shell_index)%v(1) = particles%els(
atom)%v(1) - tmp(1)*shell%mass_shell
1635 core_particles%els(shell_index)%v(2) = particles%els(
atom)%v(2) - tmp(2)*shell%mass_shell
1636 core_particles%els(shell_index)%v(3) = particles%els(
atom)%v(3) - tmp(3)*shell%mass_shell
1639 v2 = v2 + sum(particles%els(
atom)%v**2)
1640 v(1) = v(1) + particles%els(
atom)%v(1)
1641 v(2) = v(2) + particles%els(
atom)%v(2)
1642 v(3) = v(3) + particles%els(
atom)%v(3)
1643 tmass = tmass + mass
1649 atom = atom_list(iatom)
1651 IF (particles%els(
atom)%t_region_index /= my_ireg) cycle
1653 particles%els(
atom)%v(:) = fscale*particles%els(
atom)%v
1655 v2 = v2 + sum(particles%els(
atom)%v**2)
1656 v(1) = v(1) + particles%els(
atom)%v(1)
1657 v(2) = v(2) + particles%els(
atom)%v(2)
1658 v(3) = v(3) + particles%els(
atom)%v(3)
1659 tmass = tmass + mass
1662 ekin = ekin + 0.5_dp*mass*v2
1663 vcom(1) = vcom(1) + mass*v(1)
1664 vcom(2) = vcom(2) + mass*v(2)
1665 vcom(3) = vcom(3) + mass*v(3)
1670 END SUBROUTINE scale_velocity_low
1682 SUBROUTINE scale_velocity_internal(subsys, md_ener, temp_expected, temp_tol, iw)
1683 TYPE(cp_subsys_type),
POINTER :: subsys
1684 TYPE(md_ener_type),
POINTER :: md_ener
1685 REAL(KIND=
dp),
INTENT(IN) :: temp_expected, temp_tol
1686 INTEGER,
INTENT(IN) :: iw
1688 INTEGER :: atom, iatom, ikind, natom, shell_index
1689 INTEGER,
DIMENSION(:),
POINTER :: atom_list
1691 REAL(KIND=
dp) :: ekin_shell_old, fac_mass, mass, scale, &
1693 REAL(KIND=
dp),
DIMENSION(3) :: tmp, v, vc, vs
1694 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
1695 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1696 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
1698 TYPE(shell_kind_type),
POINTER :: shell
1700 NULLIFY (atom_list, atomic_kinds, atomic_kind, core_particles, particles, shell_particles, shell)
1701 IF (abs(temp_expected - md_ener%temp_shell/
kelvin) > temp_tol)
THEN
1703 IF (md_ener%temp_shell > epsilon(0.0_dp)) scale = sqrt((temp_expected/md_ener%temp_shell)*
kelvin)
1704 ekin_shell_old = md_ener%ekin_shell
1705 temp_shell_old = md_ener%temp_shell
1706 md_ener%ekin_shell = 0.0_dp
1707 md_ener%temp_shell = 0.0_dp
1709 CALL cp_subsys_get(subsys, atomic_kinds=atomic_kinds, particles=particles, shell_particles=shell_particles, &
1710 core_particles=core_particles)
1712 DO ikind = 1, atomic_kinds%n_els
1713 atomic_kind => atomic_kinds%els(ikind)
1714 CALL get_atomic_kind(atomic_kind=atomic_kind, atom_list=atom_list, mass=mass, natom=natom, &
1715 shell_active=is_shell, shell=shell)
1717 fac_mass = 1.0_dp/mass
1720 atom = atom_list(iatom)
1721 shell_index = particles%els(
atom)%shell_index
1722 vs = shell_particles%els(shell_index)%v
1723 vc = core_particles%els(shell_index)%v
1724 v = particles%els(
atom)%v
1725 tmp(1) = fac_mass*(vc(1) - vs(1))
1726 tmp(2) = fac_mass*(vc(2) - vs(2))
1727 tmp(3) = fac_mass*(vc(3) - vs(3))
1729 shell_particles%els(shell_index)%v(1) = v(1) - shell%mass_core*scale*tmp(1)
1730 shell_particles%els(shell_index)%v(2) = v(2) - shell%mass_core*scale*tmp(2)
1731 shell_particles%els(shell_index)%v(3) = v(3) - shell%mass_core*scale*tmp(3)
1733 core_particles%els(shell_index)%v(1) = v(1) + shell%mass_shell*scale*tmp(1)
1734 core_particles%els(shell_index)%v(2) = v(2) + shell%mass_shell*scale*tmp(2)
1735 core_particles%els(shell_index)%v(3) = v(3) + shell%mass_shell*scale*tmp(3)
1737 vs = shell_particles%els(shell_index)%v
1738 vc = core_particles%els(shell_index)%v
1739 tmp(1) = vc(1) - vs(1)
1740 tmp(2) = vc(2) - vs(2)
1741 tmp(3) = vc(3) - vs(3)
1742 v2 = v2 + sum(tmp**2)
1744 md_ener%ekin_shell = md_ener%ekin_shell + 0.5_dp*shell%mass_core*shell%mass_shell*fac_mass*v2
1747 IF (md_ener%nfree_shell > 0)
THEN
1748 md_ener%temp_shell = 2.0_dp*md_ener%ekin_shell/real(md_ener%nfree_shell, kind=
dp)*
kelvin
1750 md_ener%constant = md_ener%constant - ekin_shell_old + md_ener%ekin_shell
1752 WRITE (unit=iw, fmt=
'(/,T2,A)') &
1753 'MD_VEL| Temperature of shell internal motion scaled to requested temperature'
1754 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1755 'MD_VEL| Old temperature [K]', temp_shell_old, &
1756 'MD_VEL| New temperature [K]', md_ener%temp_shell
1760 END SUBROUTINE scale_velocity_internal
1772 SUBROUTINE scale_velocity_baro(md_env, md_ener, temp_expected, temp_tol, iw)
1773 TYPE(md_environment_type),
POINTER :: md_env
1774 TYPE(md_ener_type),
POINTER :: md_ener
1775 REAL(KIND=
dp),
INTENT(IN) :: temp_expected, temp_tol
1776 INTEGER,
INTENT(IN) :: iw
1778 INTEGER :: i, j, nfree
1779 REAL(KIND=
dp) :: ekin_old, scale, temp_old
1780 TYPE(npt_info_type),
POINTER :: npt(:, :)
1781 TYPE(simpar_type),
POINTER :: simpar
1783 NULLIFY (npt, simpar)
1784 CALL get_md_env(md_env, simpar=simpar, npt=npt)
1785 IF (abs(temp_expected - md_ener%temp_baro/
kelvin) > temp_tol)
THEN
1787 IF (md_ener%temp_baro > 0.0_dp) scale = sqrt((temp_expected/md_ener%temp_baro)*
kelvin)
1788 ekin_old = md_ener%baro_kin
1789 temp_old = md_ener%temp_baro
1790 md_ener%baro_kin = 0.0_dp
1791 md_ener%temp_baro = 0.0_dp
1794 npt(1, 1)%v = npt(1, 1)%v*scale
1795 md_ener%baro_kin = 0.5_dp*npt(1, 1)%v**2*npt(1, 1)%mass
1797 md_ener%baro_kin = 0.0_dp
1800 npt(i, j)%v = npt(i, j)%v*scale
1801 md_ener%baro_kin = md_ener%baro_kin + 0.5_dp*npt(i, j)%v**2*npt(i, j)%mass
1805 nfree =
SIZE(npt, 1)*
SIZE(npt, 2)
1806 md_ener%temp_baro = 2.0_dp*md_ener%baro_kin/real(nfree,
dp)*
kelvin
1808 WRITE (unit=iw, fmt=
'(/,T2,A)') &
1809 'MD_VEL| Temperature of barostat motion scaled to requested temperature'
1810 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1811 'MD_VEL| Old temperature [K]', temp_old, &
1812 'MD_VEL| New temperature [K]', md_ener%temp_baro
1816 END SUBROUTINE scale_velocity_baro
1838 CHARACTER(LEN=*),
PARAMETER :: routinen =
'temperature_control'
1840 INTEGER :: handle, iw
1844 CALL timeset(routinen, handle)
1845 NULLIFY (subsys, para_env)
1846 cpassert(
ASSOCIATED(simpar))
1847 cpassert(
ASSOCIATED(md_ener))
1848 cpassert(
ASSOCIATED(force_env))
1849 CALL force_env_get(force_env, subsys=subsys, para_env=para_env)
1850 iw =
cp_print_key_unit_nr(logger, force_env%root_section,
"MOTION%MD%PRINT%PROGRAM_RUN_INFO", &
1854 IF (simpar%do_thermal_region)
THEN
1855 CALL scale_velocity_region(md_env, subsys, md_ener, simpar, iw)
1857 IF (simpar%temp_tol > 0.0_dp)
THEN
1858 CALL scale_velocity(subsys, md_ener, simpar%temp_ext, simpar%temp_tol, iw)
1862 IF (simpar%temp_sh_tol > 0.0_dp)
THEN
1863 CALL scale_velocity_internal(subsys, md_ener, simpar%temp_sh_ext, simpar%temp_sh_tol, iw)
1866 SELECT CASE (simpar%ensemble)
1869 IF (simpar%temp_baro_tol > 0.0_dp)
THEN
1870 CALL scale_velocity_baro(md_env, md_ener, simpar%temp_baro_ext, simpar%temp_baro_tol, iw)
1875 "MOTION%MD%PRINT%PROGRAM_RUN_INFO")
1876 CALL timestop(handle)
1896 CHARACTER(LEN=*),
PARAMETER :: routinen =
'comvel_control'
1898 INTEGER :: handle, iw
1900 REAL(kind=
dp) :: comvel_tol, temp_old, vel_com
1901 REAL(kind=
dp),
DIMENSION(3) :: vcom_old
1904 CALL timeset(routinen, handle)
1906 cpassert(
ASSOCIATED(force_env))
1912 WRITE (unit=iw, fmt=
"(/,T2,A)") &
1913 "MD_VEL| Centre of mass motion (COM)"
1914 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
1915 "MD_VEL| VCOM [a.u.]", md_ener%vcom(1:3)
1925 vel_com = sqrt(md_ener%vcom(1)**2 + md_ener%vcom(2)**2 + md_ener%vcom(3)**2)
1928 IF (vel_com > comvel_tol)
THEN
1929 temp_old = md_ener%temp_part/
kelvin
1930 vcom_old = md_ener%vcom
1931 CALL reset_vcom(subsys, md_ener, vsubtract=vcom_old)
1932 CALL scale_velocity(subsys, md_ener, temp_old, 0.0_dp, iw)
1934 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
1935 "MD_VEL| Old VCOM [a.u.]", vcom_old(1:3)
1936 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
1937 "MD_VEL| New VCOM [a.u.]", md_ener%vcom(1:3)
1941 "PRINT%PROGRAM_RUN_INFO")
1944 CALL timestop(handle)
1963 CHARACTER(LEN=*),
PARAMETER :: routinen =
'angvel_control'
1965 INTEGER :: handle, ifixd, imolecule_kind, iw, natoms
1966 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: is_fixed
1968 REAL(kind=
dp) :: angvel_tol, rcom(3), temp_old, vang(3), &
1978 CALL timeset(routinen, handle)
1982 NULLIFY (subsys, cell)
1983 cpassert(
ASSOCIATED(force_env))
1986 IF (sum(cell%perd(1:3)) == 0)
THEN
1992 particles=particles)
1994 natoms =
SIZE(particles%els)
1996 ALLOCATE (is_fixed(natoms))
1999 molecule_kind_set => molecule_kinds%els
2000 DO imolecule_kind = 1, molecule_kinds%n_els
2001 molecule_kind => molecule_kind_set(imolecule_kind)
2003 IF (
ASSOCIATED(fixd_list))
THEN
2004 DO ifixd = 1,
SIZE(fixd_list)
2005 IF (.NOT. fixd_list(ifixd)%restraint%active)
THEN
2006 is_fixed(fixd_list(ifixd)%fixd) = fixd_list(ifixd)%itype
2013 CALL compute_rcom(particles%els, is_fixed, rcom)
2014 CALL compute_vang(particles%els, is_fixed, rcom, vang)
2016 IF (dot_product(vang, vang) > (angvel_tol*angvel_tol))
THEN
2017 CALL subtract_vang(particles%els, is_fixed, rcom, vang)
2020 temp_old = md_ener%temp_part/
kelvin
2021 CALL scale_velocity(subsys, md_ener, temp_old, 0.0_dp, iw)
2022 CALL compute_vang(particles%els, is_fixed, rcom, vang_new)
2024 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
2025 'MD_VEL| Old VANG [a.u.]', vang(1:3)
2026 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
2027 'MD_VEL| New VANG [a.u.]', vang_new(1:3)
2031 DEALLOCATE (is_fixed)
2034 "PRINT%PROGRAM_RUN_INFO")
2038 CALL timestop(handle)
2054 constraint_section, write_binary_restart_file)
2061 LOGICAL,
INTENT(IN) :: write_binary_restart_file
2063 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_velocities'
2065 INTEGER :: handle, nconstraint, nconstraint_fixd
2066 LOGICAL :: apply_cns0, shell_adiabatic, &
2075 TYPE(
particle_type),
DIMENSION(:),
POINTER :: core_particle_set, particle_set, &
2080 CALL timeset(routinen, handle)
2082 NULLIFY (atomic_kinds, cell, para_env, subsys, molecule_kinds, core_particles, particles)
2083 NULLIFY (shell_particles, core_particle_set, particle_set, shell_particle_set)
2084 NULLIFY (force_env_section, print_section, subsys_section)
2087 apply_cns0 = .false.
2088 IF (simpar%constraint)
THEN
2092 CALL force_env_get(force_env, subsys=subsys, cell=cell, para_env=para_env, &
2093 force_env_section=force_env_section)
2097 atomic_kinds=atomic_kinds, &
2098 core_particles=core_particles, &
2099 molecule_kinds=molecule_kinds, &
2100 particles=particles, &
2101 shell_particles=shell_particles)
2104 shell_present=shell_present, &
2105 shell_adiabatic=shell_adiabatic)
2107 NULLIFY (core_particle_set)
2108 NULLIFY (particle_set)
2109 NULLIFY (shell_particle_set)
2110 particle_set => particles%els
2112 IF (shell_present .AND. shell_adiabatic)
THEN
2115 nconstraint=nconstraint, &
2116 nconstraint_fixd=nconstraint_fixd)
2117 IF (nconstraint - nconstraint_fixd /= 0)
THEN
2118 cpabort(
"Only the fixed atom constraint is implemented for core-shell models")
2121 cpassert(
ASSOCIATED(shell_particles))
2122 cpassert(
ASSOCIATED(core_particles))
2123 shell_particle_set => shell_particles%els
2124 core_particle_set => core_particles%els
2127 CALL initialize_velocities(simpar, &
2129 molecule_kinds=molecule_kinds, &
2130 force_env=force_env, &
2133 label=
"Velocities initialization", &
2134 print_section=print_section, &
2135 subsys_section=subsys_section, &
2136 shell_present=(shell_present .AND. shell_adiabatic), &
2137 shell_part=shell_particle_set, &
2138 core_part=core_particle_set, &
2139 force_rescaling=.false., &
2140 para_env=para_env, &
2141 write_binary_restart_file=write_binary_restart_file)
2145 IF (apply_cns0)
THEN
2148 shake_tol=simpar%shake_tol, &
2149 log_unit=simpar%info_constraint, &
2150 lagrange_mult=simpar%lagrange_multipliers, &
2151 dump_lm=simpar%dump_lm, &
2154 log_unit=simpar%info_constraint, lagrange_mult=simpar%lagrange_multipliers, &
2155 dump_lm=simpar%dump_lm, reset=.true.)
2156 IF (simpar%do_respa)
THEN
2160 shake_tol=simpar%shake_tol, log_unit=simpar%info_constraint, &
2161 lagrange_mult=simpar%lagrange_multipliers, dump_lm=simpar%dump_lm, compold=.true.)
2163 shake_tol=simpar%shake_tol, log_unit=simpar%info_constraint, &
2164 lagrange_mult=simpar%lagrange_multipliers, dump_lm=simpar%dump_lm, reset=.true.)
2168 CALL update_subsys(subsys_section, force_env, .false., write_binary_restart_file)
2169 CALL initialize_velocities(simpar, &
2171 molecule_kinds=molecule_kinds, &
2172 force_env=force_env, &
2175 label=
"Re-Initializing velocities after applying constraints", &
2176 print_section=print_section, &
2177 subsys_section=subsys_section, &
2178 shell_present=(shell_present .AND. shell_adiabatic), &
2179 shell_part=shell_particle_set, &
2180 core_part=core_particle_set, &
2181 force_rescaling=.true., &
2182 para_env=para_env, &
2183 write_binary_restart_file=write_binary_restart_file)
2188 CALL initialize_cascade(simpar, particle_set, molecule_kinds, md_section)
2190 CALL timestop(handle)
2204 SUBROUTINE initialize_cascade(simpar, particle_set, molecule_kinds, md_section)
2211 CHARACTER(LEN=*),
PARAMETER :: routinen =
'initialize_cascade'
2213 CHARACTER(len=2*default_string_length) :: line
2214 INTEGER :: handle, iatom, ifixd, imolecule_kind, &
2215 iparticle, iw, natom, nparticle
2216 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_index, is_fixed
2217 LOGICAL :: init_cascade, is_ok, no_read_error
2218 REAL(kind=
dp) :: ecom, ekin, energy, norm, temp, &
2220 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: matom, weight
2221 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: vatom
2222 REAL(kind=
dp),
DIMENSION(3) :: vcom
2233 CALL timeset(routinen, handle)
2236 NULLIFY (atom_list_section)
2237 NULLIFY (atomic_kind)
2238 NULLIFY (cascade_section)
2240 NULLIFY (molecule_kind)
2241 NULLIFY (molecule_kind_set)
2252 nparticle =
SIZE(particle_set)
2254 IF (init_cascade)
THEN
2257 IF (energy < 0.0_dp)
THEN
2258 cpabort(
"Error occurred reading &CASCADE section: Negative energy found")
2263 WRITE (unit=iw, fmt=
"(/,T2,A,T61,F20.6)") &
2264 "CASCADE| Energy [keV]", ekin
2265 WRITE (unit=iw, fmt=
"(T2,A)") &
2273 IF (natom <= 0)
THEN
2274 cpabort(
"Error occurred reading &CASCADE section: No atom list found")
2278 WRITE (unit=iw, fmt=
"(T2,A,T11,A,3(11X,A),9X,A)") &
2279 "CASCADE| ",
"Atom index",
"v(x)",
"v(y)",
"v(z)",
"weight"
2282 ALLOCATE (atom_index(natom))
2283 ALLOCATE (matom(natom))
2284 ALLOCATE (vatom(3, natom))
2285 ALLOCATE (weight(natom))
2291 no_read_error = .false.
2292 READ (unit=line, fmt=*, err=999) atom_index(iatom), vatom(1:3, iatom), weight(iatom)
2293 no_read_error = .true.
2294999
IF (.NOT. no_read_error)
THEN
2295 cpabort(
"Error occurred reading &CASCADE section. Last line read <"//trim(line)//
">")
2297 IF ((atom_index(iatom) <= 0) .OR. ((atom_index(iatom) > nparticle)))
THEN
2298 cpabort(
"Error occurred reading &CASCADE section: Invalid atom index found")
2300 IF (weight(iatom) < 0.0_dp)
THEN
2301 cpabort(
"Error occurred reading &CASCADE section: Negative weight found")
2304 WRITE (unit=iw, fmt=
"(T2,A,I10,4(1X,F14.6))") &
2305 "CASCADE| ", atom_index(iatom), vatom(1:3, iatom), weight(iatom)
2312 iparticle = atom_index(iatom)
2313 IF (particle_set(iparticle)%shell_index /= 0)
THEN
2314 cpwarn(
"Warning: The primary knock-on atom is a core-shell atom")
2316 atomic_kind => particle_set(iparticle)%atomic_kind
2318 norm = norm + matom(iatom)*weight(iatom)
2320 weight(:) = matom(:)*weight(:)*energy/norm
2322 norm = norm2(vatom(1:3, iatom))
2323 vatom(1:3, iatom) = vatom(1:3, iatom)/norm
2327 WRITE (unit=iw, fmt=
"(T2,A)") &
2329 "CASCADE| Normalised velocities and additional kinetic energy [keV]", &
2331 WRITE (unit=iw, fmt=
"(T2,A,T11,A,3(11X,A),9X,A)") &
2332 "CASCADE| ",
"Atom index",
"v(x)",
"v(y)",
"v(z)",
"E(kin)"
2335 WRITE (unit=iw, fmt=
"(T2,A,I10,4(1X,F14.6))") &
2336 "CASCADE| ", atom_index(iatom), vatom(1:3, iatom), ekin
2342 iparticle = atom_index(iatom)
2343 particle_set(iparticle)%v(:) = particle_set(iparticle)%v(:) + &
2344 sqrt(2.0_dp*weight(iatom)/matom(iatom))*vatom(1:3, iatom)
2347 DEALLOCATE (atom_index)
2354 ALLOCATE (is_fixed(nparticle))
2356 molecule_kind_set => molecule_kinds%els
2357 DO imolecule_kind = 1, molecule_kinds%n_els
2358 molecule_kind => molecule_kind_set(imolecule_kind)
2360 IF (
ASSOCIATED(fixd_list))
THEN
2361 DO ifixd = 1,
SIZE(fixd_list)
2362 IF (.NOT. fixd_list(ifixd)%restraint%active) is_fixed(fixd_list(ifixd)%fixd) = fixd_list(ifixd)%itype
2367 CALL compute_vcom(particle_set, is_fixed, vcom, ecom)
2368 ekin = compute_ekin(particle_set) - ecom
2369 IF (simpar%nfree == 0)
THEN
2370 cpassert(ekin == 0.0_dp)
2373 temp = 2.0_dp*ekin/real(simpar%nfree, kind=
dp)
2376 WRITE (unit=iw, fmt=
"(T2,A)") &
2378 WRITE (unit=iw, fmt=
"(T2,A,T61,F20.6)") &
2379 "CASCADE| Temperature after cascade initialization [K]", temperature
2380 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,ES16.8))") &
2381 "CASCADE| COM velocity", vcom(1:3)
2390 DEALLOCATE (is_fixed)
2397 CALL timestop(handle)
2399 END SUBROUTINE initialize_cascade
represent a simple array based list of the given type
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
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.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public west2006
Handles all functions related to the CELL.
integer, parameter, public use_perd_xyz
integer, parameter, public use_perd_y
integer, parameter, public use_perd_xz
integer, parameter, public use_perd_x
integer, parameter, public use_perd_z
integer, parameter, public use_perd_yz
integer, parameter, public use_perd_none
integer, parameter, public use_perd_xy
subroutine, public cell_transform_input_cartesian(cell, vector)
Transform a Cartesian real-space vector from the user input cell frame into CP2K's canonical internal...
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
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,...
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell)
returns information about various attributes of the given subsys
real(kind=dp) function, public cp_unit_from_cp2k(value, unit_str, defaults, power)
converts from the internal cp2k units to the given unit
Lumps all possible extended system variables into one type for easy access and passing.
Interface for the force calculations.
recursive subroutine, public force_env_calc_energy_force(force_env, calc_force, consistent_energies, skip_external_control, eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor)
Interface routine for force and energy calculations.
Interface for the force calculations.
recursive subroutine, public force_env_get(force_env, in_use, fist_env, qs_env, meta_env, fp_env, subsys, para_env, potential_energy, additional_potential, kinetic_energy, harmonic_shell, kinetic_shell, cell, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, globenv, input, force_env_section, method_name_id, root_section, mixed_env, nnp_env, embed_env, ipi_env)
returns various attributes about the force environment
subroutine, public force_env_shake(force_env, dt, shake_tol, log_unit, lagrange_mult, dump_lm, pos, vel, compold, reset)
perform shake (enforcing of constraints)
subroutine, public force_env_rattle(force_env, dt, shake_tol, log_unit, lagrange_mult, dump_lm, vel, reset)
perform rattle (enforcing of constraints on velocities) This routine can be easily adapted to perform...
Define type storing the global information of a run. Keep the amount of stored data small....
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Collection of simple mathematical functions and subroutines.
subroutine, public diamat_all(a, eigval, dac)
Diagonalize the symmetric n by n matrix a using the LAPACK library. Only the upper triangle of matrix...
Split md_ener module from md_environment_type.
subroutine, public get_md_env(md_env, itimes, constant, used_time, cell, simpar, npt, force_env, para_env, reftraj, t, init, first_time, fe_env, thermostats, barostat, thermostat_coeff, thermostat_part, thermostat_shell, thermostat_baro, thermostat_fast, thermostat_slow, md_ener, averages, thermal_regions, ehrenfest_md)
get components of MD environment type
Utilities for Molecular Dynamics.
subroutine, public read_vib_eigs_unformatted(md_section, vib_section, para_env, dof, eigenvalues, eigenvectors)
read eigenvalues and eigenvectors of Hessian from vibrational analysis results, for use of initialisi...
Collection of utilities for setting-up and handle velocities in MD runs.
subroutine, public setup_velocities(force_env, simpar, globenv, md_env, md_section, constraint_section, write_binary_restart_file)
Initialize Velocities for MD runs.
subroutine, public angvel_control(md_ener, force_env, md_section, logger)
Set to 0 the angular velocity along MD runs, if required.
subroutine, public temperature_control(simpar, md_env, md_ener, force_env, logger)
Perform all temperature manipulations during a QS MD run.
subroutine, public comvel_control(md_ener, force_env, md_section, logger)
Set to 0 the velocity of the COM along MD runs, if required.
Interface to the message passing library MPI.
represent a simple array based list of the given type
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 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.
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
integer, parameter, public uniform
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 kelvin
subroutine, public optimize_shell_core(force_env, particle_set, shell_particle_set, core_particle_set, globenv, tmp, check)
Optimize shell-core positions along an MD run.
Type for storing MD parameters.
Thermal regions type: to initialize and control the temperature of different regions.
represent a list of objects
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...
represents a system: atoms, molecules, their pos,vel,...
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
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.