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 .NE. 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 ELSEIF (
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(cp_sll_val_type),
POINTER :: atom_list, core_list, shell_list
712 TYPE(section_vals_type),
POINTER :: atomvel_section, corevel_section, &
714 TYPE(shell_kind_type),
POINTER :: shell
715 TYPE(thermal_regions_type),
POINTER :: thermal_regions
716 TYPE(val_type),
POINTER :: val
722 atomvel_read = .false.
723 corevel_read = .false.
724 shellvel_read = .false.
725 NULLIFY (vel, atomic_kind, atom_list, core_list, shell_list)
726 NULLIFY (atomvel_section, shellvel_section, corevel_section)
727 NULLIFY (shell, thermal_regions, val)
731 IF (shell_present)
THEN
732 cpassert(
ASSOCIATED(core_part))
733 cpassert(
ASSOCIATED(shell_part))
734 nshell =
SIZE(shell_part)
745 cpassert(shellvel_explicit .EQV. corevel_explicit)
748 subsys_section, atomvel_read)
750 subsys_section, shellvel_read)
752 subsys_section, corevel_read)
754 IF (.NOT. (atomvel_explicit .OR. atomvel_read))
RETURN
757 IF (.NOT. atomvel_read)
THEN
767 SELECT CASE (is_fixed(i))
769 part(i)%v(1) = 0.0_dp
771 part(i)%v(2) = 0.0_dp
773 part(i)%v(3) = 0.0_dp
775 part(i)%v(1) = 0.0_dp
776 part(i)%v(2) = 0.0_dp
778 part(i)%v(1) = 0.0_dp
779 part(i)%v(3) = 0.0_dp
781 part(i)%v(2) = 0.0_dp
782 part(i)%v(3) = 0.0_dp
787 IF (shell_present)
THEN
788 IF (shellvel_explicit)
THEN
796 shell_part(i)%v = vel
802 IF (.NOT. (shellvel_read .AND. corevel_read))
THEN
804 CALL clone_core_shell_vel(part, shell_part, core_part)
810 CALL compute_vcom(part, is_fixed, vcom, ecom)
811 ekin = compute_ekin(part) - ecom
813 IF (simpar%do_thermal_region)
THEN
814 CALL get_md_env(md_env, thermal_regions=thermal_regions)
815 IF (
ASSOCIATED(thermal_regions))
THEN
816 rescale_regions = thermal_regions%force_rescaling
819 rescale_regions = .false.
821 IF (simpar%nfree /= 0 .AND. (force_rescaling .OR. rescale_regions))
THEN
822 IF (simpar%do_thermal_region)
THEN
823 CALL rescale_vel_region(part, md_env, simpar)
825 CALL rescale_vel(part, simpar, ekin, vcom=vcom)
830 shell_index = part(i)%shell_index
831 IF (shell_present .AND. shell_index /= 0)
THEN
832 atomic_kind => part(i)%atomic_kind
834 fac_masss = shell%mass_shell/mass
835 fac_massc = shell%mass_core/mass
836 vs = shell_part(shell_index)%v
837 vc = core_part(shell_index)%v
839 shell_part(shell_index)%v(1) = part(i)%v(1) + fac_massc*(vs(1) - vc(1))
840 shell_part(shell_index)%v(2) = part(i)%v(2) + fac_massc*(vs(2) - vc(2))
841 shell_part(shell_index)%v(3) = part(i)%v(3) + fac_massc*(vs(3) - vc(3))
842 core_part(shell_index)%v(1) = part(i)%v(1) + fac_masss*(vc(1) - vs(1))
843 core_part(shell_index)%v(2) = part(i)%v(2) + fac_masss*(vc(2) - vs(2))
844 core_part(shell_index)%v(3) = part(i)%v(3) + fac_masss*(vc(3) - vs(3))
848 END SUBROUTINE read_input_velocities
867 SUBROUTINE generate_coords_vels_vib(simpar, &
877 TYPE(simpar_type),
POINTER :: simpar
878 TYPE(particle_type),
DIMENSION(:),
POINTER :: particles
879 TYPE(section_vals_type),
POINTER :: md_section, vib_section
880 TYPE(force_env_type),
POINTER :: force_env
881 TYPE(global_environment_type),
POINTER :: global_env
882 LOGICAL,
INTENT(IN) :: shell_present
883 TYPE(particle_type),
DIMENSION(:),
POINTER :: shell_particles, core_particles
884 INTEGER,
DIMENSION(:),
INTENT(IN) :: is_fixed
886 INTEGER :: dof, fixed_dof, iatom, ii, imode, &
887 my_dof, natoms, shell_index
888 REAL(KIND=
dp) :: erand, mass, my_phase, ratio, temperature
889 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues, phase, random
890 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: dr, eigenvectors
891 TYPE(atomic_kind_type),
POINTER :: atomic_kind
892 TYPE(mp_para_env_type),
POINTER :: para_env
893 TYPE(rng_stream_type),
ALLOCATABLE :: random_stream
896 natoms =
SIZE(particles)
897 temperature = simpar%temp_ext
899 ALLOCATE (eigenvalues(my_dof))
900 ALLOCATE (eigenvectors(my_dof, my_dof))
901 ALLOCATE (phase(my_dof))
902 ALLOCATE (random(my_dof))
903 ALLOCATE (dr(3, natoms))
912 IF (my_dof .NE. dof)
THEN
913 CALL cp_abort(__location__, &
914 "number of degrees of freedom in vibrational analysis data "// &
915 "do not match total number of cartesian degrees of freedom")
919 my_phase = min(1.0_dp, my_phase)
922 CALL random_stream%fill(random)
923 IF (my_phase .LT. 0.0_dp)
THEN
924 CALL random_stream%fill(phase)
928 DEALLOCATE (random_stream)
938 erand = erand - temperature*log(1.0_dp - random(imode))
943 SELECT CASE (is_fixed(iatom))
945 fixed_dof = fixed_dof + 1
947 fixed_dof = fixed_dof + 2
949 fixed_dof = fixed_dof + 3
952 my_dof = my_dof - fixed_dof
953 ratio = real(my_dof, kind=
dp)*temperature/erand
956 atomic_kind => particles(iatom)%atomic_kind
958 SELECT CASE (is_fixed(iatom))
961 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
962 eigenvectors, random, phase, dof, ratio)
963 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
964 eigenvectors, random, phase, dof, &
969 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
970 eigenvectors, random, phase, dof, ratio)
971 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
972 eigenvectors, random, phase, dof, &
977 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
978 eigenvectors, random, phase, dof, ratio)
979 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
980 eigenvectors, random, phase, dof, &
984 dr(3, iatom) = dr_from_vib_data(iatom, 3, mass, temperature, eigenvalues, &
985 eigenvectors, random, phase, dof, ratio)
986 particles(iatom)%v(3) = dv_from_vib_data(iatom, 3, mass, temperature, &
987 eigenvectors, random, phase, dof, &
990 dr(2, iatom) = dr_from_vib_data(iatom, 2, mass, temperature, eigenvalues, &
991 eigenvectors, random, phase, dof, ratio)
992 particles(iatom)%v(2) = dv_from_vib_data(iatom, 2, mass, temperature, &
993 eigenvectors, random, phase, dof, &
996 dr(1, iatom) = dr_from_vib_data(iatom, 1, mass, temperature, eigenvalues, &
997 eigenvectors, random, phase, dof, ratio)
998 particles(iatom)%v(1) = dv_from_vib_data(iatom, 1, mass, temperature, &
999 eigenvectors, random, phase, dof, &
1003 dr(ii, iatom) = dr_from_vib_data(iatom, ii, mass, temperature, eigenvalues, &
1004 eigenvectors, random, phase, dof, ratio)
1005 particles(iatom)%v(ii) = dv_from_vib_data(iatom, ii, mass, temperature, &
1006 eigenvectors, random, phase, dof, &
1012 DEALLOCATE (eigenvalues)
1013 DEALLOCATE (eigenvectors)
1017 DO iatom = 1, natoms
1018 particles(iatom)%r(:) = particles(iatom)%r(:) + dr(:, iatom)
1021 IF (shell_present)
THEN
1025 shell_index = particles(iatom)%shell_index
1026 IF (shell_index .NE. 0)
THEN
1027 core_particles(shell_index)%r(:) = core_particles(shell_index)%r(:) + &
1029 shell_particles(shell_index)%r(:) = shell_particles(shell_index)%r(:) + &
1040 END SUBROUTINE generate_coords_vels_vib
1061 PURE FUNCTION dr_from_vib_data(iatom, &
1072 INTEGER,
INTENT(IN) :: iatom, icart
1073 REAL(KIND=
dp),
INTENT(IN) :: mass, temperature
1074 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: eigenvalues
1075 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenvectors
1076 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: random, phase
1077 INTEGER,
INTENT(IN) :: dof
1078 REAL(KIND=
dp),
INTENT(IN) :: scale
1079 REAL(KIND=
dp) :: res
1081 INTEGER :: imode, ind
1088 IF (mass .GT. 0.0_dp)
THEN
1090 ind = (iatom - 1)*3 + icart
1093 sqrt(-2.0_dp*scale*temperature*log(1 - random(imode))/mass)/ &
1094 eigenvalues(imode)* &
1095 eigenvectors(ind, imode)* &
1096 cos(2.0_dp*
pi*phase(imode))
1099 END FUNCTION dr_from_vib_data
1119 PURE FUNCTION dv_from_vib_data(iatom, &
1129 INTEGER,
INTENT(IN) :: iatom, icart
1130 REAL(KIND=
dp),
INTENT(IN) :: mass, temperature
1131 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(IN) :: eigenvectors
1132 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: random, phase
1133 INTEGER,
INTENT(IN) :: dof
1134 REAL(KIND=
dp),
INTENT(IN) :: scale
1135 REAL(KIND=
dp) :: res
1137 INTEGER :: imode, ind
1144 IF (mass .GT. 0.0_dp)
THEN
1146 ind = (iatom - 1)*3 + icart
1149 sqrt(-2.0_dp*scale*temperature*log(1 - random(imode))/mass)* &
1150 eigenvectors(ind, imode)* &
1151 sin(2.0_dp*
pi*phase(imode))
1154 END FUNCTION dv_from_vib_data
1170 SUBROUTINE generate_velocities(simpar, part, force_env, globenv, md_env, &
1171 shell_present, shell_part, core_part, is_fixed, iw)
1172 TYPE(simpar_type),
POINTER :: simpar
1173 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1174 TYPE(force_env_type),
POINTER :: force_env
1175 TYPE(global_environment_type),
POINTER :: globenv
1176 TYPE(md_environment_type),
POINTER :: md_env
1177 LOGICAL,
INTENT(IN) :: shell_present
1178 TYPE(particle_type),
DIMENSION(:),
POINTER :: shell_part, core_part
1179 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
1180 INTEGER,
INTENT(IN) :: iw
1182 INTEGER :: i, natoms
1183 REAL(KIND=
dp) :: mass
1184 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1186 NULLIFY (atomic_kind)
1190 atomic_kind => part(i)%atomic_kind
1192 part(i)%v(1) = 0.0_dp
1193 part(i)%v(2) = 0.0_dp
1194 part(i)%v(3) = 0.0_dp
1195 IF (mass .NE. 0.0)
THEN
1196 SELECT CASE (is_fixed(i))
1198 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1199 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1201 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1202 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1204 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1205 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1207 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1209 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1211 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1213 part(i)%v(1) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1214 part(i)%v(2) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1215 part(i)%v(3) = globenv%gaussian_rng_stream%next()/sqrt(mass)
1220 CALL normalize_velocities(simpar, part, force_env, md_env, is_fixed)
1221 CALL soften_velocities(simpar, part, force_env, md_env, is_fixed, iw)
1225 IF (shell_present)
THEN
1228 END SUBROUTINE generate_velocities
1242 SUBROUTINE soften_velocities(simpar, part, force_env, md_env, is_fixed, iw)
1243 TYPE(simpar_type),
POINTER :: simpar
1244 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1245 TYPE(force_env_type),
POINTER :: force_env
1246 TYPE(md_environment_type),
POINTER :: md_env
1247 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
1248 INTEGER,
INTENT(IN) :: iw
1251 REAL(KIND=
dp),
DIMENSION(SIZE(part), 3) :: f, f_t, n, x0
1253 IF (simpar%soften_nsteps <= 0)
RETURN
1256 cpabort(
"Velocitiy softening with constraints is not supported.")
1259 DO i = 1,
SIZE(part)
1260 x0(i, :) = part(i)%r
1263 DO k = 1, simpar%soften_nsteps
1266 DO i = 1,
SIZE(part)
1269 n = n/sqrt(sum(n**2))
1272 DO i = 1,
SIZE(part)
1273 part(i)%r = part(i)%r + simpar%soften_delta*n(i, :)
1278 DO i = 1,
SIZE(part)
1281 f_t = f - n*sum(n*f)
1284 DO i = 1,
SIZE(part)
1285 part(i)%r = x0(i, :)
1286 part(i)%v = part(i)%v + simpar%soften_alpha*f_t(i, :)
1289 CALL normalize_velocities(simpar, part, force_env, md_env, is_fixed)
1293 WRITE (iw,
"(A,T71, I10)")
" Velocities softening Steps: ", simpar%soften_nsteps
1294 WRITE (iw,
"(A,T71, E10.3)")
" Velocities softening NORM(F_t): ", sqrt(sum(f_t**2))
1296 END SUBROUTINE soften_velocities
1307 SUBROUTINE normalize_velocities(simpar, part, force_env, md_env, is_fixed)
1308 TYPE(simpar_type),
POINTER :: simpar
1309 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1310 TYPE(force_env_type),
POINTER :: force_env
1311 TYPE(md_environment_type),
POINTER :: md_env
1312 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: is_fixed
1314 REAL(KIND=
dp) :: ekin
1315 REAL(KIND=
dp),
DIMENSION(3) :: rcom, vang, vcom
1316 TYPE(cell_type),
POINTER :: cell
1321 CALL compute_vcom(part, is_fixed, vcom)
1322 CALL subtract_vcom(part, is_fixed, vcom)
1325 IF (sum(cell%perd(1:3)) == 0 .AND. simpar%angvel_zero)
THEN
1326 CALL compute_rcom(part, is_fixed, rcom)
1327 CALL compute_vang(part, is_fixed, rcom, vang)
1328 CALL subtract_vang(part, is_fixed, rcom, vang)
1331 IF (simpar%do_thermal_region)
THEN
1332 CALL rescale_vel_region(part, md_env, simpar)
1334 ekin = compute_ekin(part)
1335 CALL rescale_vel(part, simpar, ekin)
1337 END SUBROUTINE normalize_velocities
1347 SUBROUTINE reset_vcom(subsys, md_ener, vsubtract)
1348 TYPE(cp_subsys_type),
POINTER :: subsys
1349 TYPE(md_ener_type),
POINTER :: md_ener
1350 REAL(KIND=
dp),
DIMENSION(3),
INTENT(IN) :: vsubtract
1352 CHARACTER(LEN=*),
PARAMETER :: routineN =
'reset_vcom'
1354 INTEGER :: atom, handle, iatom, ikind, natom, &
1356 INTEGER,
DIMENSION(:),
POINTER :: atom_list
1358 REAL(KIND=
dp) :: ekin_old, imass_c, imass_s, mass, v2
1359 REAL(KIND=
dp),
DIMENSION(3) :: tmp, v
1360 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
1361 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1362 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
1364 TYPE(shell_kind_type),
POINTER :: shell
1366 NULLIFY (particles, atomic_kind, atomic_kinds, atom_list, shell)
1367 CALL timeset(routinen, handle)
1370 atomic_kinds=atomic_kinds, &
1371 particles=particles, &
1372 shell_particles=shell_particles, &
1373 core_particles=core_particles)
1375 ekin_old = md_ener%ekin
1377 DO ikind = 1, atomic_kinds%n_els
1378 atomic_kind => atomic_kinds%els(ikind)
1380 natom=natom, mass=mass, shell_active=is_shell, shell=shell)
1382 tmp = 0.5_dp*vsubtract*mass
1383 imass_s = 1.0_dp/shell%mass_shell
1384 imass_c = 1.0_dp/shell%mass_core
1386 atom = atom_list(iatom)
1387 shell_index = particles%els(
atom)%shell_index
1388 shell_particles%els(shell_index)%v = shell_particles%els(shell_index)%v - tmp*imass_s
1389 core_particles%els(shell_index)%v = core_particles%els(shell_index)%v - tmp*imass_c
1390 particles%els(
atom)%v = particles%els(
atom)%v - vsubtract
1394 atom = atom_list(iatom)
1395 particles%els(
atom)%v = particles%els(
atom)%v - vsubtract
1400 md_ener%vcom = 0.0_dp
1401 md_ener%total_mass = 0.0_dp
1402 md_ener%ekin = 0.0_dp
1403 DO ikind = 1, atomic_kinds%n_els
1404 atomic_kind => atomic_kinds%els(ikind)
1405 CALL get_atomic_kind(atomic_kind=atomic_kind, atom_list=atom_list, mass=mass, natom=natom)
1409 atom = atom_list(iatom)
1410 v2 = v2 + sum(particles%els(
atom)%v**2)
1411 v(1) = v(1) + particles%els(
atom)%v(1)
1412 v(2) = v(2) + particles%els(
atom)%v(2)
1413 v(3) = v(3) + particles%els(
atom)%v(3)
1415 md_ener%ekin = md_ener%ekin + 0.5_dp*mass*v2
1416 md_ener%vcom(1) = md_ener%vcom(1) + mass*v(1)
1417 md_ener%vcom(2) = md_ener%vcom(2) + mass*v(2)
1418 md_ener%vcom(3) = md_ener%vcom(3) + mass*v(3)
1419 md_ener%total_mass = md_ener%total_mass + real(natom, kind=
dp)*mass
1421 md_ener%vcom = md_ener%vcom/md_ener%total_mass
1422 md_ener%constant = md_ener%constant - ekin_old + md_ener%ekin
1423 IF (md_ener%nfree /= 0)
THEN
1424 md_ener%temp_part = 2.0_dp*md_ener%ekin/real(md_ener%nfree, kind=
dp)*
kelvin
1426 CALL timestop(handle)
1428 END SUBROUTINE reset_vcom
1440 SUBROUTINE scale_velocity(subsys, md_ener, temp_expected, temp_tol, iw)
1441 TYPE(cp_subsys_type),
POINTER :: subsys
1442 TYPE(md_ener_type),
POINTER :: md_ener
1443 REAL(KIND=
dp),
INTENT(IN) :: temp_expected, temp_tol
1444 INTEGER,
INTENT(IN) :: iw
1446 REAL(KIND=
dp) :: ekin_old, scale, temp_old
1448 IF (abs(temp_expected - md_ener%temp_part/
kelvin) > temp_tol)
THEN
1450 IF (md_ener%temp_part > 0.0_dp) scale = sqrt((temp_expected/md_ener%temp_part)*
kelvin)
1451 ekin_old = md_ener%ekin
1452 temp_old = md_ener%temp_part
1453 md_ener%ekin = 0.0_dp
1454 md_ener%temp_part = 0.0_dp
1455 md_ener%vcom = 0.0_dp
1456 md_ener%total_mass = 0.0_dp
1458 CALL scale_velocity_low(subsys, scale, ireg=0, ekin=md_ener%ekin, vcom=md_ener%vcom)
1459 IF (md_ener%nfree /= 0)
THEN
1460 md_ener%temp_part = 2.0_dp*md_ener%ekin/real(md_ener%nfree, kind=
dp)*
kelvin
1462 md_ener%constant = md_ener%constant - ekin_old + md_ener%ekin
1464 WRITE (unit=iw, fmt=
'(/,T2,A)') &
1465 'MD_VEL| Temperature scaled to requested temperature'
1466 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1467 'MD_VEL| Old temperature [K]', temp_old, &
1468 'MD_VEL| New temperature [K]', md_ener%temp_part
1472 END SUBROUTINE scale_velocity
1483 SUBROUTINE scale_velocity_region(md_env, subsys, md_ener, simpar, iw)
1485 TYPE(md_environment_type),
POINTER :: md_env
1486 TYPE(cp_subsys_type),
POINTER :: subsys
1487 TYPE(md_ener_type),
POINTER :: md_ener
1488 TYPE(simpar_type),
POINTER :: simpar
1489 INTEGER,
INTENT(IN) :: iw
1491 INTEGER :: ireg, nfree, nfree_done, nregions
1492 REAL(KIND=
dp) :: ekin, ekin_old, ekin_total_new, fscale, &
1493 vcom(3), vcom_total(3)
1494 REAL(KIND=
dp),
ALLOCATABLE,
DIMENSION(:) :: temp_new, temp_old
1495 TYPE(particle_list_type),
POINTER :: particles
1496 TYPE(particle_type),
DIMENSION(:),
POINTER :: part
1497 TYPE(thermal_region_type),
POINTER :: t_region
1498 TYPE(thermal_regions_type),
POINTER :: thermal_regions
1500 NULLIFY (particles, part, thermal_regions, t_region)
1502 part => particles%els
1503 CALL get_md_env(md_env, thermal_regions=thermal_regions)
1505 nregions = thermal_regions%nregions
1507 ekin_total_new = 0.0_dp
1508 ekin_old = md_ener%ekin
1510 ALLOCATE (temp_new(0:nregions), temp_old(0:nregions))
1514 DO ireg = 1, nregions
1516 t_region => thermal_regions%thermal_region(ireg)
1517 nfree = 3*t_region%npart
1518 ekin = compute_ekin(part, ireg)
1519 IF (nfree > 0) t_region%temperature = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1520 temp_old(ireg) = t_region%temperature
1521 IF (t_region%temp_tol > 0.0_dp .AND. &
1522 abs(t_region%temp_expected - t_region%temperature/
kelvin) > t_region%temp_tol)
THEN
1523 fscale = sqrt((t_region%temp_expected/t_region%temperature)*
kelvin)
1524 CALL scale_velocity_low(subsys, fscale, ireg, ekin, vcom)
1525 t_region%temperature = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1526 temp_new(ireg) = t_region%temperature
1528 nfree_done = nfree_done + nfree
1529 ekin_total_new = ekin_total_new + ekin
1531 nfree = simpar%nfree - nfree_done
1532 ekin = compute_ekin(part, ireg=0)
1533 IF (nfree > 0) thermal_regions%temp_reg0 = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1534 temp_old(0) = thermal_regions%temp_reg0
1535 IF (simpar%temp_tol > 0.0_dp .AND. nfree > 0)
THEN
1536 IF (abs(simpar%temp_ext - thermal_regions%temp_reg0/
kelvin) > simpar%temp_tol)
THEN
1537 fscale = sqrt((simpar%temp_ext/thermal_regions%temp_reg0)*
kelvin)
1538 CALL scale_velocity_low(subsys, fscale, 0, ekin, vcom)
1539 thermal_regions%temp_reg0 = 2.0_dp*ekin/real(nfree, kind=
dp)*
kelvin
1540 temp_new(0) = thermal_regions%temp_reg0
1543 ekin_total_new = ekin_total_new + ekin
1545 md_ener%ekin = ekin_total_new
1546 IF (md_ener%nfree /= 0)
THEN
1547 md_ener%temp_part = 2.0_dp*md_ener%ekin/real(md_ener%nfree, kind=
dp)*
kelvin
1549 md_ener%constant = md_ener%constant - ekin_old + md_ener%ekin
1551 DO ireg = 0, nregions
1552 IF (temp_new(ireg) > 0.0_dp)
THEN
1553 WRITE (unit=iw, fmt=
'(/,T2,A,I0,A)') &
1554 'MD_VEL| Temperature region ', ireg,
' scaled to requested temperature'
1555 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1556 'MD_VEL| Old temperature [K]', temp_old(ireg), &
1557 'MD_VEL| New temperature [K]', temp_new(ireg)
1561 DEALLOCATE (temp_new, temp_old)
1563 END SUBROUTINE scale_velocity_region
1574 SUBROUTINE scale_velocity_low(subsys, fscale, ireg, ekin, vcom)
1576 TYPE(cp_subsys_type),
POINTER :: subsys
1577 REAL(KIND=
dp),
INTENT(IN) :: fscale
1578 INTEGER,
INTENT(IN) :: ireg
1579 REAL(KIND=
dp),
INTENT(OUT) :: ekin, vcom(3)
1581 INTEGER :: atom, iatom, ikind, my_ireg, natom, &
1583 INTEGER,
DIMENSION(:),
POINTER :: atom_list
1585 REAL(KIND=
dp) :: imass, mass, tmass, v2
1586 REAL(KIND=
dp),
DIMENSION(3) :: tmp, v, vc, vs
1587 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
1588 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1589 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
1591 TYPE(shell_kind_type),
POINTER :: shell
1593 NULLIFY (atomic_kinds, particles, shell_particles, core_particles, shell, atom_list)
1600 CALL cp_subsys_get(subsys, atomic_kinds=atomic_kinds, particles=particles, &
1601 shell_particles=shell_particles, core_particles=core_particles)
1603 DO ikind = 1, atomic_kinds%n_els
1604 atomic_kind => atomic_kinds%els(ikind)
1605 CALL get_atomic_kind(atomic_kind=atomic_kind, atom_list=atom_list, mass=mass, &
1606 natom=natom, shell_active=is_shell, shell=shell)
1612 atom = atom_list(iatom)
1614 IF (particles%els(
atom)%t_region_index /= my_ireg) cycle
1616 particles%els(
atom)%v(:) = fscale*particles%els(
atom)%v
1617 shell_index = particles%els(
atom)%shell_index
1618 vs = shell_particles%els(shell_index)%v
1619 vc = core_particles%els(shell_index)%v
1620 tmp(1) = imass*(vs(1) - vc(1))
1621 tmp(2) = imass*(vs(2) - vc(2))
1622 tmp(3) = imass*(vs(3) - vc(3))
1624 shell_particles%els(shell_index)%v(1) = particles%els(
atom)%v(1) + tmp(1)*shell%mass_core
1625 shell_particles%els(shell_index)%v(2) = particles%els(
atom)%v(2) + tmp(2)*shell%mass_core
1626 shell_particles%els(shell_index)%v(3) = particles%els(
atom)%v(3) + tmp(3)*shell%mass_core
1628 core_particles%els(shell_index)%v(1) = particles%els(
atom)%v(1) - tmp(1)*shell%mass_shell
1629 core_particles%els(shell_index)%v(2) = particles%els(
atom)%v(2) - tmp(2)*shell%mass_shell
1630 core_particles%els(shell_index)%v(3) = particles%els(
atom)%v(3) - tmp(3)*shell%mass_shell
1633 v2 = v2 + sum(particles%els(
atom)%v**2)
1634 v(1) = v(1) + particles%els(
atom)%v(1)
1635 v(2) = v(2) + particles%els(
atom)%v(2)
1636 v(3) = v(3) + particles%els(
atom)%v(3)
1637 tmass = tmass + mass
1643 atom = atom_list(iatom)
1645 IF (particles%els(
atom)%t_region_index /= my_ireg) cycle
1647 particles%els(
atom)%v(:) = fscale*particles%els(
atom)%v
1649 v2 = v2 + sum(particles%els(
atom)%v**2)
1650 v(1) = v(1) + particles%els(
atom)%v(1)
1651 v(2) = v(2) + particles%els(
atom)%v(2)
1652 v(3) = v(3) + particles%els(
atom)%v(3)
1653 tmass = tmass + mass
1656 ekin = ekin + 0.5_dp*mass*v2
1657 vcom(1) = vcom(1) + mass*v(1)
1658 vcom(2) = vcom(2) + mass*v(2)
1659 vcom(3) = vcom(3) + mass*v(3)
1664 END SUBROUTINE scale_velocity_low
1676 SUBROUTINE scale_velocity_internal(subsys, md_ener, temp_expected, temp_tol, iw)
1677 TYPE(cp_subsys_type),
POINTER :: subsys
1678 TYPE(md_ener_type),
POINTER :: md_ener
1679 REAL(KIND=
dp),
INTENT(IN) :: temp_expected, temp_tol
1680 INTEGER,
INTENT(IN) :: iw
1682 INTEGER :: atom, iatom, ikind, natom, shell_index
1683 INTEGER,
DIMENSION(:),
POINTER :: atom_list
1685 REAL(KIND=
dp) :: ekin_shell_old, fac_mass, mass, scale, &
1687 REAL(KIND=
dp),
DIMENSION(3) :: tmp, v, vc, vs
1688 TYPE(atomic_kind_list_type),
POINTER :: atomic_kinds
1689 TYPE(atomic_kind_type),
POINTER :: atomic_kind
1690 TYPE(particle_list_type),
POINTER :: core_particles, particles, &
1692 TYPE(shell_kind_type),
POINTER :: shell
1694 NULLIFY (atom_list, atomic_kinds, atomic_kind, core_particles, particles, shell_particles, shell)
1695 IF (abs(temp_expected - md_ener%temp_shell/
kelvin) > temp_tol)
THEN
1697 IF (md_ener%temp_shell > epsilon(0.0_dp)) scale = sqrt((temp_expected/md_ener%temp_shell)*
kelvin)
1698 ekin_shell_old = md_ener%ekin_shell
1699 temp_shell_old = md_ener%temp_shell
1700 md_ener%ekin_shell = 0.0_dp
1701 md_ener%temp_shell = 0.0_dp
1703 CALL cp_subsys_get(subsys, atomic_kinds=atomic_kinds, particles=particles, shell_particles=shell_particles, &
1704 core_particles=core_particles)
1706 DO ikind = 1, atomic_kinds%n_els
1707 atomic_kind => atomic_kinds%els(ikind)
1708 CALL get_atomic_kind(atomic_kind=atomic_kind, atom_list=atom_list, mass=mass, natom=natom, &
1709 shell_active=is_shell, shell=shell)
1711 fac_mass = 1.0_dp/mass
1714 atom = atom_list(iatom)
1715 shell_index = particles%els(
atom)%shell_index
1716 vs = shell_particles%els(shell_index)%v
1717 vc = core_particles%els(shell_index)%v
1718 v = particles%els(
atom)%v
1719 tmp(1) = fac_mass*(vc(1) - vs(1))
1720 tmp(2) = fac_mass*(vc(2) - vs(2))
1721 tmp(3) = fac_mass*(vc(3) - vs(3))
1723 shell_particles%els(shell_index)%v(1) = v(1) - shell%mass_core*scale*tmp(1)
1724 shell_particles%els(shell_index)%v(2) = v(2) - shell%mass_core*scale*tmp(2)
1725 shell_particles%els(shell_index)%v(3) = v(3) - shell%mass_core*scale*tmp(3)
1727 core_particles%els(shell_index)%v(1) = v(1) + shell%mass_shell*scale*tmp(1)
1728 core_particles%els(shell_index)%v(2) = v(2) + shell%mass_shell*scale*tmp(2)
1729 core_particles%els(shell_index)%v(3) = v(3) + shell%mass_shell*scale*tmp(3)
1731 vs = shell_particles%els(shell_index)%v
1732 vc = core_particles%els(shell_index)%v
1733 tmp(1) = vc(1) - vs(1)
1734 tmp(2) = vc(2) - vs(2)
1735 tmp(3) = vc(3) - vs(3)
1736 v2 = v2 + sum(tmp**2)
1738 md_ener%ekin_shell = md_ener%ekin_shell + 0.5_dp*shell%mass_core*shell%mass_shell*fac_mass*v2
1741 IF (md_ener%nfree_shell > 0)
THEN
1742 md_ener%temp_shell = 2.0_dp*md_ener%ekin_shell/real(md_ener%nfree_shell, kind=
dp)*
kelvin
1744 md_ener%constant = md_ener%constant - ekin_shell_old + md_ener%ekin_shell
1746 WRITE (unit=iw, fmt=
'(/,T2,A)') &
1747 'MD_VEL| Temperature of shell internal motion scaled to requested temperature'
1748 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1749 'MD_VEL| Old temperature [K]', temp_shell_old, &
1750 'MD_VEL| New temperature [K]', md_ener%temp_shell
1754 END SUBROUTINE scale_velocity_internal
1766 SUBROUTINE scale_velocity_baro(md_env, md_ener, temp_expected, temp_tol, iw)
1767 TYPE(md_environment_type),
POINTER :: md_env
1768 TYPE(md_ener_type),
POINTER :: md_ener
1769 REAL(KIND=
dp),
INTENT(IN) :: temp_expected, temp_tol
1770 INTEGER,
INTENT(IN) :: iw
1772 INTEGER :: i, j, nfree
1773 REAL(KIND=
dp) :: ekin_old, scale, temp_old
1774 TYPE(npt_info_type),
POINTER :: npt(:, :)
1775 TYPE(simpar_type),
POINTER :: simpar
1777 NULLIFY (npt, simpar)
1778 CALL get_md_env(md_env, simpar=simpar, npt=npt)
1779 IF (abs(temp_expected - md_ener%temp_baro/
kelvin) > temp_tol)
THEN
1781 IF (md_ener%temp_baro > 0.0_dp) scale = sqrt((temp_expected/md_ener%temp_baro)*
kelvin)
1782 ekin_old = md_ener%baro_kin
1783 temp_old = md_ener%temp_baro
1784 md_ener%baro_kin = 0.0_dp
1785 md_ener%temp_baro = 0.0_dp
1788 npt(1, 1)%v = npt(1, 1)%v*scale
1789 md_ener%baro_kin = 0.5_dp*npt(1, 1)%v**2*npt(1, 1)%mass
1791 md_ener%baro_kin = 0.0_dp
1794 npt(i, j)%v = npt(i, j)%v*scale
1795 md_ener%baro_kin = md_ener%baro_kin + 0.5_dp*npt(i, j)%v**2*npt(i, j)%mass
1799 nfree =
SIZE(npt, 1)*
SIZE(npt, 2)
1800 md_ener%temp_baro = 2.0_dp*md_ener%baro_kin/real(nfree,
dp)*
kelvin
1802 WRITE (unit=iw, fmt=
'(/,T2,A)') &
1803 'MD_VEL| Temperature of barostat motion scaled to requested temperature'
1804 WRITE (unit=iw, fmt=
'(T2,A,T61,F20.6)') &
1805 'MD_VEL| Old temperature [K]', temp_old, &
1806 'MD_VEL| New temperature [K]', md_ener%temp_baro
1810 END SUBROUTINE scale_velocity_baro
1832 CHARACTER(LEN=*),
PARAMETER :: routinen =
'temperature_control'
1834 INTEGER :: handle, iw
1838 CALL timeset(routinen, handle)
1839 NULLIFY (subsys, para_env)
1840 cpassert(
ASSOCIATED(simpar))
1841 cpassert(
ASSOCIATED(md_ener))
1842 cpassert(
ASSOCIATED(force_env))
1843 CALL force_env_get(force_env, subsys=subsys, para_env=para_env)
1844 iw =
cp_print_key_unit_nr(logger, force_env%root_section,
"MOTION%MD%PRINT%PROGRAM_RUN_INFO", &
1848 IF (simpar%do_thermal_region)
THEN
1849 CALL scale_velocity_region(md_env, subsys, md_ener, simpar, iw)
1851 IF (simpar%temp_tol > 0.0_dp)
THEN
1852 CALL scale_velocity(subsys, md_ener, simpar%temp_ext, simpar%temp_tol, iw)
1856 IF (simpar%temp_sh_tol > 0.0_dp)
THEN
1857 CALL scale_velocity_internal(subsys, md_ener, simpar%temp_sh_ext, simpar%temp_sh_tol, iw)
1860 SELECT CASE (simpar%ensemble)
1863 IF (simpar%temp_baro_tol > 0.0_dp)
THEN
1864 CALL scale_velocity_baro(md_env, md_ener, simpar%temp_baro_ext, simpar%temp_baro_tol, iw)
1869 "MOTION%MD%PRINT%PROGRAM_RUN_INFO")
1870 CALL timestop(handle)
1890 CHARACTER(LEN=*),
PARAMETER :: routinen =
'comvel_control'
1892 INTEGER :: handle, iw
1894 REAL(kind=
dp) :: comvel_tol, temp_old, vel_com
1895 REAL(kind=
dp),
DIMENSION(3) :: vcom_old
1898 CALL timeset(routinen, handle)
1900 cpassert(
ASSOCIATED(force_env))
1906 WRITE (unit=iw, fmt=
"(/,T2,A)") &
1907 "MD_VEL| Centre of mass motion (COM)"
1908 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
1909 "MD_VEL| VCOM [a.u.]", md_ener%vcom(1:3)
1919 vel_com = sqrt(md_ener%vcom(1)**2 + md_ener%vcom(2)**2 + md_ener%vcom(3)**2)
1922 IF (vel_com > comvel_tol)
THEN
1923 temp_old = md_ener%temp_part/
kelvin
1924 vcom_old = md_ener%vcom
1925 CALL reset_vcom(subsys, md_ener, vsubtract=vcom_old)
1926 CALL scale_velocity(subsys, md_ener, temp_old, 0.0_dp, iw)
1928 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
1929 "MD_VEL| Old VCOM [a.u.]", vcom_old(1:3)
1930 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
1931 "MD_VEL| New VCOM [a.u.]", md_ener%vcom(1:3)
1935 "PRINT%PROGRAM_RUN_INFO")
1938 CALL timestop(handle)
1957 CHARACTER(LEN=*),
PARAMETER :: routinen =
'angvel_control'
1959 INTEGER :: handle, ifixd, imolecule_kind, iw, natoms
1960 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: is_fixed
1962 REAL(kind=
dp) :: angvel_tol, rcom(3), temp_old, vang(3), &
1972 CALL timeset(routinen, handle)
1976 NULLIFY (subsys, cell)
1977 cpassert(
ASSOCIATED(force_env))
1980 IF (sum(cell%perd(1:3)) == 0)
THEN
1986 particles=particles)
1988 natoms =
SIZE(particles%els)
1990 ALLOCATE (is_fixed(natoms))
1993 molecule_kind_set => molecule_kinds%els
1994 DO imolecule_kind = 1, molecule_kinds%n_els
1995 molecule_kind => molecule_kind_set(imolecule_kind)
1997 IF (
ASSOCIATED(fixd_list))
THEN
1998 DO ifixd = 1,
SIZE(fixd_list)
1999 IF (.NOT. fixd_list(ifixd)%restraint%active) &
2000 is_fixed(fixd_list(ifixd)%fixd) = fixd_list(ifixd)%itype
2006 CALL compute_rcom(particles%els, is_fixed, rcom)
2007 CALL compute_vang(particles%els, is_fixed, rcom, vang)
2009 IF (dot_product(vang, vang) > (angvel_tol*angvel_tol))
THEN
2010 CALL subtract_vang(particles%els, is_fixed, rcom, vang)
2013 temp_old = md_ener%temp_part/
kelvin
2014 CALL scale_velocity(subsys, md_ener, temp_old, 0.0_dp, iw)
2015 CALL compute_vang(particles%els, is_fixed, rcom, vang_new)
2017 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
2018 'MD_VEL| Old VANG [a.u.]', vang(1:3)
2019 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,F16.10))") &
2020 'MD_VEL| New VANG [a.u.]', vang_new(1:3)
2024 DEALLOCATE (is_fixed)
2027 "PRINT%PROGRAM_RUN_INFO")
2031 CALL timestop(handle)
2047 constraint_section, write_binary_restart_file)
2054 LOGICAL,
INTENT(IN) :: write_binary_restart_file
2056 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_velocities'
2058 INTEGER :: handle, nconstraint, nconstraint_fixd
2059 LOGICAL :: apply_cns0, shell_adiabatic, &
2068 TYPE(
particle_type),
DIMENSION(:),
POINTER :: core_particle_set, particle_set, &
2073 CALL timeset(routinen, handle)
2075 NULLIFY (atomic_kinds, cell, para_env, subsys, molecule_kinds, core_particles, particles)
2076 NULLIFY (shell_particles, core_particle_set, particle_set, shell_particle_set)
2077 NULLIFY (force_env_section, print_section, subsys_section)
2080 apply_cns0 = .false.
2081 IF (simpar%constraint)
THEN
2085 CALL force_env_get(force_env, subsys=subsys, cell=cell, para_env=para_env, &
2086 force_env_section=force_env_section)
2090 atomic_kinds=atomic_kinds, &
2091 core_particles=core_particles, &
2092 molecule_kinds=molecule_kinds, &
2093 particles=particles, &
2094 shell_particles=shell_particles)
2097 shell_present=shell_present, &
2098 shell_adiabatic=shell_adiabatic)
2100 NULLIFY (core_particle_set)
2101 NULLIFY (particle_set)
2102 NULLIFY (shell_particle_set)
2103 particle_set => particles%els
2105 IF (shell_present .AND. shell_adiabatic)
THEN
2108 nconstraint=nconstraint, &
2109 nconstraint_fixd=nconstraint_fixd)
2110 IF (nconstraint - nconstraint_fixd /= 0) &
2111 cpabort(
"Only the fixed atom constraint is implemented for core-shell models")
2113 cpassert(
ASSOCIATED(shell_particles))
2114 cpassert(
ASSOCIATED(core_particles))
2115 shell_particle_set => shell_particles%els
2116 core_particle_set => core_particles%els
2119 CALL initialize_velocities(simpar, &
2121 molecule_kinds=molecule_kinds, &
2122 force_env=force_env, &
2125 label=
"Velocities initialization", &
2126 print_section=print_section, &
2127 subsys_section=subsys_section, &
2128 shell_present=(shell_present .AND. shell_adiabatic), &
2129 shell_part=shell_particle_set, &
2130 core_part=core_particle_set, &
2131 force_rescaling=.false., &
2132 para_env=para_env, &
2133 write_binary_restart_file=write_binary_restart_file)
2137 IF (apply_cns0)
THEN
2140 shake_tol=simpar%shake_tol, &
2141 log_unit=simpar%info_constraint, &
2142 lagrange_mult=simpar%lagrange_multipliers, &
2143 dump_lm=simpar%dump_lm, &
2146 log_unit=simpar%info_constraint, lagrange_mult=simpar%lagrange_multipliers, &
2147 dump_lm=simpar%dump_lm, reset=.true.)
2148 IF (simpar%do_respa)
THEN
2152 shake_tol=simpar%shake_tol, log_unit=simpar%info_constraint, &
2153 lagrange_mult=simpar%lagrange_multipliers, dump_lm=simpar%dump_lm, compold=.true.)
2155 shake_tol=simpar%shake_tol, log_unit=simpar%info_constraint, &
2156 lagrange_mult=simpar%lagrange_multipliers, dump_lm=simpar%dump_lm, reset=.true.)
2160 CALL update_subsys(subsys_section, force_env, .false., write_binary_restart_file)
2161 CALL initialize_velocities(simpar, &
2163 molecule_kinds=molecule_kinds, &
2164 force_env=force_env, &
2167 label=
"Re-Initializing velocities after applying constraints", &
2168 print_section=print_section, &
2169 subsys_section=subsys_section, &
2170 shell_present=(shell_present .AND. shell_adiabatic), &
2171 shell_part=shell_particle_set, &
2172 core_part=core_particle_set, &
2173 force_rescaling=.true., &
2174 para_env=para_env, &
2175 write_binary_restart_file=write_binary_restart_file)
2180 CALL initialize_cascade(simpar, particle_set, molecule_kinds, md_section)
2182 CALL timestop(handle)
2196 SUBROUTINE initialize_cascade(simpar, particle_set, molecule_kinds, md_section)
2203 CHARACTER(LEN=*),
PARAMETER :: routinen =
'initialize_cascade'
2205 CHARACTER(len=2*default_string_length) :: line
2206 INTEGER :: handle, iatom, ifixd, imolecule_kind, &
2207 iparticle, iw, natom, nparticle
2208 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_index, is_fixed
2209 LOGICAL :: init_cascade, is_ok, no_read_error
2210 REAL(kind=
dp) :: ecom, ekin, energy, norm, temp, &
2212 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: matom, weight
2213 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: vatom
2214 REAL(kind=
dp),
DIMENSION(3) :: vcom
2225 CALL timeset(routinen, handle)
2228 NULLIFY (atom_list_section)
2229 NULLIFY (atomic_kind)
2230 NULLIFY (cascade_section)
2232 NULLIFY (molecule_kind)
2233 NULLIFY (molecule_kind_set)
2244 nparticle =
SIZE(particle_set)
2246 IF (init_cascade)
THEN
2249 IF (energy < 0.0_dp) &
2250 cpabort(
"Error occurred reading &CASCADE section: Negative energy found")
2254 WRITE (unit=iw, fmt=
"(/,T2,A,T61,F20.6)") &
2255 "CASCADE| Energy [keV]", ekin
2256 WRITE (unit=iw, fmt=
"(T2,A)") &
2265 cpabort(
"Error occurred reading &CASCADE section: No atom list found")
2268 WRITE (unit=iw, fmt=
"(T2,A,T11,A,3(11X,A),9X,A)") &
2269 "CASCADE| ",
"Atom index",
"v(x)",
"v(y)",
"v(z)",
"weight"
2272 ALLOCATE (atom_index(natom))
2273 ALLOCATE (matom(natom))
2274 ALLOCATE (vatom(3, natom))
2275 ALLOCATE (weight(natom))
2281 no_read_error = .false.
2282 READ (unit=line, fmt=*, err=999) atom_index(iatom), vatom(1:3, iatom), weight(iatom)
2283 no_read_error = .true.
2284999
IF (.NOT. no_read_error) &
2285 cpabort(
"Error occurred reading &CASCADE section. Last line read <"//trim(line)//
">")
2286 IF ((atom_index(iatom) <= 0) .OR. ((atom_index(iatom) > nparticle))) &
2287 cpabort(
"Error occurred reading &CASCADE section: Invalid atom index found")
2288 IF (weight(iatom) < 0.0_dp) &
2289 cpabort(
"Error occurred reading &CASCADE section: Negative weight found")
2291 WRITE (unit=iw, fmt=
"(T2,A,I10,4(1X,F14.6))") &
2292 "CASCADE| ", atom_index(iatom), vatom(1:3, iatom), weight(iatom)
2299 iparticle = atom_index(iatom)
2300 IF (particle_set(iparticle)%shell_index /= 0)
THEN
2301 cpwarn(
"Warning: The primary knock-on atom is a core-shell atom")
2303 atomic_kind => particle_set(iparticle)%atomic_kind
2305 norm = norm + matom(iatom)*weight(iatom)
2307 weight(:) = matom(:)*weight(:)*energy/norm
2309 norm = sqrt(dot_product(vatom(1:3, iatom), vatom(1:3, iatom)))
2310 vatom(1:3, iatom) = vatom(1:3, iatom)/norm
2314 WRITE (unit=iw, fmt=
"(T2,A)") &
2316 "CASCADE| Normalised velocities and additional kinetic energy [keV]", &
2318 WRITE (unit=iw, fmt=
"(T2,A,T11,A,3(11X,A),9X,A)") &
2319 "CASCADE| ",
"Atom index",
"v(x)",
"v(y)",
"v(z)",
"E(kin)"
2322 WRITE (unit=iw, fmt=
"(T2,A,I10,4(1X,F14.6))") &
2323 "CASCADE| ", atom_index(iatom), vatom(1:3, iatom), ekin
2329 iparticle = atom_index(iatom)
2330 particle_set(iparticle)%v(:) = particle_set(iparticle)%v(:) + &
2331 sqrt(2.0_dp*weight(iatom)/matom(iatom))*vatom(1:3, iatom)
2334 DEALLOCATE (atom_index)
2341 ALLOCATE (is_fixed(nparticle))
2343 molecule_kind_set => molecule_kinds%els
2344 DO imolecule_kind = 1, molecule_kinds%n_els
2345 molecule_kind => molecule_kind_set(imolecule_kind)
2347 IF (
ASSOCIATED(fixd_list))
THEN
2348 DO ifixd = 1,
SIZE(fixd_list)
2349 IF (.NOT. fixd_list(ifixd)%restraint%active) is_fixed(fixd_list(ifixd)%fixd) = fixd_list(ifixd)%itype
2354 CALL compute_vcom(particle_set, is_fixed, vcom, ecom)
2355 ekin = compute_ekin(particle_set) - ecom
2356 IF (simpar%nfree == 0)
THEN
2357 cpassert(ekin == 0.0_dp)
2360 temp = 2.0_dp*ekin/real(simpar%nfree, kind=
dp)
2363 WRITE (unit=iw, fmt=
"(T2,A)") &
2365 WRITE (unit=iw, fmt=
"(T2,A,T61,F20.6)") &
2366 "CASCADE| Temperature after cascade initialization [K]", temperature
2367 WRITE (unit=iw, fmt=
"(T2,A,T30,3(1X,ES16.8))") &
2368 "CASCADE| COM velocity", vcom(1:3)
2377 DEALLOCATE (is_fixed)
2384 CALL timestop(handle)
2386 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
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)
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.