183#include "./base/base_uses.f90"
189 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'force_env_methods'
195 INTEGER,
SAVE,
PRIVATE :: last_force_env_id = 0
215 consistent_energies, skip_external_control, eval_energy_forces, &
216 require_consistent_energy_force, linres, calc_stress_tensor)
219 LOGICAL,
INTENT(IN),
OPTIONAL :: calc_force, consistent_energies, skip_external_control, &
220 eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor
222 REAL(kind=
dp),
PARAMETER :: ateps = 1.0e-6_dp
224 CHARACTER(LEN=default_string_length) :: unit_string
225 INTEGER :: ikind, nat, ndigits, nfixed_atoms, &
226 nfixed_atoms_total, nkind, &
227 output_unit, print_forces, print_grrm, &
229 LOGICAL :: calculate_forces, calculate_stress_tensor, do_apt_fd, energy_consistency, &
230 eval_ef, linres_run, my_skip, print_components
231 REAL(kind=
dp) :: checksum, e_entropy, e_gap, e_pot, &
233 REAL(kind=
dp),
DIMENSION(3) :: grand_total_force, total_force
246 NULLIFY (logger, virial, subsys, atprop_env, cell)
250 calculate_forces = .true.
251 energy_consistency = .false.
257 IF (
PRESENT(eval_energy_forces)) eval_ef = eval_energy_forces
258 IF (
PRESENT(skip_external_control)) my_skip = skip_external_control
259 IF (
PRESENT(calc_force)) calculate_forces = calc_force
260 IF (
PRESENT(calc_stress_tensor))
THEN
261 calculate_stress_tensor = calc_stress_tensor
263 calculate_stress_tensor = calculate_forces
265 IF (
PRESENT(consistent_energies)) energy_consistency = consistent_energies
266 IF (
PRESENT(linres)) linres_run = linres
268 cpassert(
ASSOCIATED(force_env))
269 cpassert(force_env%ref_count > 0)
272 CALL cp_subsys_get(subsys, virial=virial, atprop=atprop_env, cell=cell)
273 IF (virial%pv_availability)
CALL zero_virial(virial, reset=.false.)
278 SELECT CASE (force_env%in_use)
282 CALL force_env_refresh_kpoint_symmetry(force_env, fd_energy=.NOT. calculate_forces)
285 IF (virial%pv_availability .AND. calculate_stress_tensor)
THEN
290 e_gap = force_env%pwdft_env%energy%band_gap
291 e_entropy = force_env%pwdft_env%energy%entropy
293 SELECT CASE (force_env%eip_env%eip_model)
303 cpabort(
"Unknown EIP model.")
307 calculate_forces, energy_consistency, linres=linres_run)
310 calculate_forces, energy_consistency, linres=linres_run, &
311 require_consistent_energy_force=require_consistent_energy_force)
313 CALL mixed_energy_forces(force_env, calculate_forces)
318 CALL embed_energy(force_env)
326 IF (virial%pv_availability)
THEN
327 IF (virial%pv_numer .AND. calculate_stress_tensor)
THEN
331 IF (calculate_forces)
THEN
335 IF (calculate_stress_tensor)
THEN
336 CALL cp_warn(__location__,
"The calculation of the stress tensor "// &
337 "requires the calculation of the forces")
346 CALL section_vals_val_get(force_env%qs_env%input,
"PROPERTIES%LINRES%DCDR%APT_FD", l_val=do_apt_fd)
349 subsection_name=
"PROPERTIES%LINRES%DCDR%PRINT%APT")
360 IF (.NOT. my_skip)
THEN
362 IF (
ASSOCIATED(force_env%fp_env))
THEN
363 IF (force_env%fp_env%use_fp)
THEN
364 CALL fp_eval(force_env%fp_env, subsys, cell)
382 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
384 IF (output_unit > 0)
THEN
388 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,F26.15)") &
389 "ENERGY| Total FORCE_EVAL ( "//trim(adjustl(
use_prog_name(force_env%in_use)))// &
390 " ) energy ["//trim(adjustl(unit_string))//
"]", e_pot*fconv
391 IF (e_gap > -0.1_dp)
THEN
392 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,F26.15)") &
393 "ENERGY| Total FORCE_EVAL ( "//trim(adjustl(
use_prog_name(force_env%in_use)))// &
394 " ) gap ["//trim(adjustl(unit_string))//
"]", e_gap*fconv
396 IF (e_entropy > -0.1_dp)
THEN
397 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,F26.15)") &
398 "ENERGY| Total FORCE_EVAL ( "//trim(adjustl(
use_prog_name(force_env%in_use)))// &
399 " ) free energy ["//trim(adjustl(unit_string))//
"]", (e_pot - e_entropy)*fconv
403 "PRINT%PROGRAM_RUN_INFO")
407 cpabort(
"Potential energy is an abnormal value (NaN/Inf).")
412 IF ((print_forces > 0) .AND. calculate_forces)
THEN
415 core_particles=core_particles, &
416 particles=particles, &
417 shell_particles=shell_particles)
423 IF (
ASSOCIATED(core_particles) .OR.
ASSOCIATED(shell_particles))
THEN
424 CALL write_forces(particles, print_forces,
"Atomic", ndigits, unit_string, &
425 total_force, zero_force_core_shell_atom=.true.)
426 grand_total_force(1:3) = total_force(1:3)
427 IF (
ASSOCIATED(core_particles))
THEN
428 CALL write_forces(core_particles, print_forces,
"Core particle", ndigits, &
429 unit_string, total_force, zero_force_core_shell_atom=.false.)
430 grand_total_force(:) = grand_total_force(:) + total_force(:)
432 IF (
ASSOCIATED(shell_particles))
THEN
433 CALL write_forces(shell_particles, print_forces,
"Shell particle", ndigits, &
434 unit_string, total_force, zero_force_core_shell_atom=.false., &
435 grand_total_force=grand_total_force)
438 CALL write_forces(particles, print_forces,
"Atomic", ndigits, unit_string, total_force)
444 IF (virial%pv_availability)
THEN
447 IF (calculate_forces .AND. calculate_stress_tensor)
THEN
448 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%STRESS_TENSOR", &
449 extension=
".stress_tensor")
450 IF (output_unit > 0)
THEN
452 l_val=print_components)
455 IF (print_components)
THEN
456 IF ((.NOT. virial%pv_numer) .AND. (force_env%in_use ==
use_qs_force))
THEN
460 CALL write_stress_tensor(virial%pv_virial, output_unit, cell, unit_string, virial%pv_numer)
463 "PRINT%STRESS_TENSOR")
468 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%STRESS_TENSOR", &
469 extension=
".stress_tensor")
470 IF (output_unit > 0)
THEN
471 CALL cp_warn(__location__,
"To print the stress tensor switch on the "// &
472 "virial evaluation with the keyword: STRESS_TENSOR")
475 "PRINT%STRESS_TENSOR")
479 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
481 IF (atprop_env%energy)
THEN
482 CALL force_env%para_env%sum(atprop_env%atener)
484 IF (output_unit > 0)
THEN
487 CALL write_atener(output_unit, particles, atprop_env%atener,
"Mulliken Atomic Energies")
490 checksum = abs(e_pot - sum_energy)
491 WRITE (unit=output_unit, fmt=
"(/,(T2,A,T56,F25.13))") &
492 "Potential energy (Atomic):", sum_energy, &
493 "Potential energy (Total) :", e_pot, &
494 "Difference :", checksum
495 cpassert((checksum < ateps*abs(e_pot)))
498 "PRINT%PROGRAM_RUN_INFO")
503 file_position=
"REWIND", extension=
".rrm")
504 IF (print_grrm > 0)
THEN
507 molecule_kinds=molecule_kinds)
509 nfixed_atoms_total = 0
510 nkind = molecule_kinds%n_els
511 molecule_kind_set => molecule_kinds%els
513 molecule_kind => molecule_kind_set(ikind)
515 nfixed_atoms_total = nfixed_atoms_total + nfixed_atoms
518 CALL write_grrm(print_grrm, force_env, particles%els, e_pot, fixed_atoms=nfixed_atoms_total)
523 file_position=
"REWIND", extension=
".scine")
524 IF (print_scine > 0)
THEN
528 CALL write_scine(print_scine, force_env, particles%els, e_pot)
540 SUBROUTINE force_env_refresh_kpoint_symmetry(force_env, fd_energy)
543 LOGICAL,
INTENT(IN) :: fd_energy
545 CHARACTER(LEN=default_string_length) :: kp_scheme
546 INTEGER :: run_type_id
547 LOGICAL :: debug_full_kpoint_symmetry, debug_inversion_only, do_kpoints, dynamic_symmetry, &
548 full_grid, input_full_grid, input_inversion_symmetry_only, inversion_symmetry_only, &
549 kpoint_symmetry, moving_geometry, use_full_grid, use_inversion_symmetry_only
561 IF (.NOT.
ASSOCIATED(force_env))
RETURN
566 IF (.NOT.
ASSOCIATED(globenv))
RETURN
567 run_type_id = globenv%run_type_id
568 moving_geometry = .false.
569 SELECT CASE (run_type_id)
571 moving_geometry = .true.
573 moving_geometry = .false.
575 IF (run_type_id /=
debug_run .AND. .NOT. moving_geometry)
RETURN
577 NULLIFY (blacs_env, cell, dft_control, input, kpoint_section, kpoints, mos, para_env, &
578 particle_set, wf_history)
580 blacs_env=blacs_env, &
582 dft_control=dft_control, &
583 do_kpoints=do_kpoints, &
588 particle_set=particle_set, &
589 wf_history=wf_history)
590 IF (.NOT. do_kpoints)
RETURN
592 CALL get_kpoint_info(kpoints, kp_scheme=kp_scheme, symmetry=kpoint_symmetry, full_grid=full_grid, &
593 inversion_symmetry_only=inversion_symmetry_only)
594 IF (.NOT. kpoint_symmetry)
RETURN
595 IF (trim(kp_scheme) /=
"MONKHORST-PACK" .AND. trim(kp_scheme) /=
"MACDONALD" .AND. &
596 trim(kp_scheme) /=
"GENERAL")
RETURN
598 input_full_grid = full_grid
599 input_inversion_symmetry_only = inversion_symmetry_only
600 debug_full_kpoint_symmetry = .false.
601 IF (
ASSOCIATED(input))
THEN
605 l_val=input_inversion_symmetry_only)
607 l_val=debug_full_kpoint_symmetry)
613 debug_inversion_only = run_type_id ==
debug_run .AND. .NOT. debug_full_kpoint_symmetry .AND. &
614 (fd_energy .OR. dft_control%qs_control%dftb)
615 use_full_grid = input_full_grid
616 use_inversion_symmetry_only = (input_inversion_symmetry_only .OR. debug_inversion_only) .AND. &
617 (.NOT. use_full_grid)
618 dynamic_symmetry = kpoint_symmetry .AND. .NOT. use_full_grid .AND. &
619 .NOT. use_inversion_symmetry_only
620 IF (moving_geometry .AND. .NOT. dynamic_symmetry)
RETURN
621 IF (moving_geometry .AND. .NOT. kpoint_has_nontrivial_atomic_symmetry(kpoints))
RETURN
623 inversion_symmetry_only=use_inversion_symmetry_only)
632 END SUBROUTINE force_env_refresh_kpoint_symmetry
639 FUNCTION kpoint_has_nontrivial_atomic_symmetry(kpoints)
RESULT(has_symmetry)
642 LOGICAL :: has_symmetry
644 INTEGER :: iatom, ik, isym, natom
645 REAL(kind=
dp),
DIMENSION(3, 3) :: eye3
648 has_symmetry = .false.
649 IF (.NOT.
ASSOCIATED(kpoints))
RETURN
650 IF (.NOT.
ASSOCIATED(kpoints%kp_sym))
RETURN
657 DO ik = 1, kpoints%nkp
658 kpsym => kpoints%kp_sym(ik)%kpoint_sym
659 IF (.NOT.
ASSOCIATED(
kpsym)) cycle
660 IF (.NOT.
kpsym%apply_symmetry) cycle
661 IF (.NOT.
ASSOCIATED(
kpsym%rot)) cycle
662 IF (.NOT.
ASSOCIATED(
kpsym%f0)) cycle
663 IF (.NOT.
ASSOCIATED(
kpsym%fcell)) cycle
665 natom =
SIZE(
kpsym%f0, 1)
666 DO isym = 1,
SIZE(
kpsym%rot, 3)
667 IF (maxval(abs(
kpsym%rot(1:3, 1:3, isym) - eye3(1:3, 1:3))) > 1.e-12_dp .OR. &
668 any(
kpsym%fcell(1:3, 1:natom, isym) /= 0))
THEN
669 has_symmetry = .true.
673 IF (
kpsym%f0(iatom, isym) /= iatom)
THEN
674 has_symmetry = .true.
681 END FUNCTION kpoint_has_nontrivial_atomic_symmetry
696 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: dx
698 REAL(kind=
dp),
PARAMETER :: default_dx = 0.001_dp
700 CHARACTER(LEN=default_string_length) :: unit_string
701 INTEGER :: i, ip, iq, j, k, natom, ncore, nshell, &
702 output_unit, symmetry_id
703 REAL(kind=
dp) :: dx_w
704 REAL(kind=
dp),
DIMENSION(2) :: numer_energy
705 REAL(kind=
dp),
DIMENSION(3) :: s
706 REAL(kind=
dp),
DIMENSION(3, 3) :: numer_stress
707 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ref_pos_atom, ref_pos_core, ref_pos_shell
708 TYPE(
cell_type),
POINTER :: cell, cell_local
717 NULLIFY (core_particles)
719 NULLIFY (shell_particles)
720 NULLIFY (ref_pos_atom)
721 NULLIFY (ref_pos_core)
722 NULLIFY (ref_pos_shell)
726 numer_stress = 0.0_dp
731 IF (
PRESENT(dx)) dx_w = dx
732 CALL force_env_get(force_env, subsys=subsys, globenv=globenv)
734 core_particles=core_particles, &
735 particles=particles, &
736 shell_particles=shell_particles, &
738 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%STRESS_TENSOR", &
739 extension=
".stress_tensor")
740 IF (output_unit > 0)
THEN
741 WRITE (output_unit,
"(/A,A/)")
" **************************** ", &
742 "NUMERICAL STRESS ********************************"
746 natom = particles%n_els
747 ALLOCATE (ref_pos_atom(natom, 3))
749 ref_pos_atom(i, :) = particles%els(i)%r
751 IF (
ASSOCIATED(core_particles))
THEN
752 ncore = core_particles%n_els
753 ALLOCATE (ref_pos_core(ncore, 3))
755 ref_pos_core(i, :) = core_particles%els(i)%r
758 IF (
ASSOCIATED(shell_particles))
THEN
759 nshell = shell_particles%n_els
760 ALLOCATE (ref_pos_shell(nshell, 3))
762 ref_pos_shell(i, :) = shell_particles%els(i)%r
767 symmetry_id = cell%symmetry_id
775 IF (virial%pv_diagonal .AND. (ip /= iq)) cycle
777 cell%hmat(ip, iq) = cell_local%hmat(ip, iq) - (-1.0_dp)**k*dx_w
794 calc_force=.false., &
795 consistent_energies=.true., &
796 calc_stress_tensor=.false.)
797 CALL force_env_get(force_env, potential_energy=numer_energy(k))
799 cell%hmat(ip, iq) = cell_local%hmat(ip, iq)
802 numer_stress(ip, iq) = 0.5_dp*(numer_energy(1) - numer_energy(2))/dx_w
803 IF (output_unit > 0)
THEN
804 IF (globenv%run_type_id ==
debug_run)
THEN
805 WRITE (unit=output_unit, fmt=
"(/,T2,A,T19,A,F7.4,A,T44,A,F7.4,A,T69,A)") &
806 "DEBUG|",
"E("//achar(119 + ip)//achar(119 + iq)//
" +", dx_w,
")", &
807 "E("//achar(119 + ip)//achar(119 + iq)//
" -", dx_w,
")", &
809 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,F24.8),1X,F22.8)") &
810 "DEBUG|", numer_energy(1:2), numer_stress(ip, iq)
812 WRITE (unit=output_unit, fmt=
"(/,T7,A,F7.4,A,T27,A,F7.4,A,T49,A)") &
813 "E("//achar(119 + ip)//achar(119 + iq)//
" +", dx_w,
")", &
814 "E("//achar(119 + ip)//achar(119 + iq)//
" -", dx_w,
")", &
816 WRITE (unit=output_unit, fmt=
"(3(1X,F19.8))") &
817 numer_energy(1:2), numer_stress(ip, iq)
824 cell%symmetry_id = symmetry_id
827 particles%els(i)%r = ref_pos_atom(i, :)
830 core_particles%els(i)%r = ref_pos_core(i, :)
833 shell_particles%els(i)%r = ref_pos_shell(i, :)
836 calc_force=.false., &
837 consistent_energies=.true., &
838 calc_stress_tensor=.false.)
841 virial%pv_virial = 0.0_dp
845 virial%pv_virial(i, j) = virial%pv_virial(i, j) - &
846 0.5_dp*(numer_stress(i, k)*cell_local%hmat(j, k) + &
847 numer_stress(j, k)*cell_local%hmat(i, k))
852 IF (output_unit > 0)
THEN
853 IF (globenv%run_type_id ==
debug_run)
THEN
856 CALL write_stress_tensor(virial%pv_virial, output_unit, cell, unit_string, virial%pv_numer)
858 WRITE (output_unit,
"(/,A,/)")
" **************************** "// &
859 "NUMERICAL STRESS END *****************************"
863 "PRINT%STRESS_TENSOR")
866 IF (
ASSOCIATED(ref_pos_atom))
THEN
867 DEALLOCATE (ref_pos_atom)
869 IF (
ASSOCIATED(ref_pos_core))
THEN
870 DEALLOCATE (ref_pos_core)
872 IF (
ASSOCIATED(ref_pos_shell))
THEN
873 DEALLOCATE (ref_pos_shell)
875 IF (
ASSOCIATED(cell_local))
CALL cell_release(cell_local)
904 qs_env, meta_env, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, force_env_section, &
905 mixed_env, embed_env, nnp_env, ipi_env)
915 POINTER :: sub_force_env
923 TYPE(
nnp_type),
OPTIONAL,
POINTER :: nnp_env
927 NULLIFY (force_env%fist_env, force_env%qs_env, &
928 force_env%para_env, force_env%globenv, &
929 force_env%meta_env, force_env%sub_force_env, &
930 force_env%qmmm_env, force_env%qmmmx_env, force_env%fp_env, &
931 force_env%force_env_section, force_env%eip_env, force_env%mixed_env, &
932 force_env%embed_env, force_env%pwdft_env, force_env%nnp_env, &
933 force_env%root_section)
934 last_force_env_id = last_force_env_id + 1
935 force_env%ref_count = 1
937 force_env%additional_potential = 0.0_dp
939 force_env%globenv => globenv
942 force_env%root_section => root_section
945 force_env%para_env => para_env
946 CALL force_env%para_env%retain()
949 force_env%force_env_section => force_env_section
951 IF (
PRESENT(fist_env))
THEN
952 cpassert(
ASSOCIATED(fist_env))
953 cpassert(force_env%in_use == 0)
955 force_env%fist_env => fist_env
957 IF (
PRESENT(eip_env))
THEN
958 cpassert(
ASSOCIATED(eip_env))
959 cpassert(force_env%in_use == 0)
961 force_env%eip_env => eip_env
963 IF (
PRESENT(pwdft_env))
THEN
964 cpassert(
ASSOCIATED(pwdft_env))
965 cpassert(force_env%in_use == 0)
967 force_env%pwdft_env => pwdft_env
969 IF (
PRESENT(qs_env))
THEN
970 cpassert(
ASSOCIATED(qs_env))
971 cpassert(force_env%in_use == 0)
973 force_env%qs_env => qs_env
975 IF (
PRESENT(qmmm_env))
THEN
976 cpassert(
ASSOCIATED(qmmm_env))
977 cpassert(force_env%in_use == 0)
979 force_env%qmmm_env => qmmm_env
981 IF (
PRESENT(qmmmx_env))
THEN
982 cpassert(
ASSOCIATED(qmmmx_env))
983 cpassert(force_env%in_use == 0)
985 force_env%qmmmx_env => qmmmx_env
987 IF (
PRESENT(mixed_env))
THEN
988 cpassert(
ASSOCIATED(mixed_env))
989 cpassert(force_env%in_use == 0)
991 force_env%mixed_env => mixed_env
993 IF (
PRESENT(embed_env))
THEN
994 cpassert(
ASSOCIATED(embed_env))
995 cpassert(force_env%in_use == 0)
997 force_env%embed_env => embed_env
999 IF (
PRESENT(nnp_env))
THEN
1000 cpassert(
ASSOCIATED(nnp_env))
1001 cpassert(force_env%in_use == 0)
1003 force_env%nnp_env => nnp_env
1005 IF (
PRESENT(ipi_env))
THEN
1006 cpassert(
ASSOCIATED(ipi_env))
1007 cpassert(force_env%in_use == 0)
1009 force_env%ipi_env => ipi_env
1011 cpassert(force_env%in_use /= 0)
1013 IF (
PRESENT(sub_force_env))
THEN
1014 force_env%sub_force_env => sub_force_env
1017 IF (
PRESENT(meta_env))
THEN
1018 force_env%meta_env => meta_env
1020 NULLIFY (force_env%meta_env)
1041 SUBROUTINE mixed_energy_forces(force_env, calculate_forces)
1044 LOGICAL,
INTENT(IN) :: calculate_forces
1046 CHARACTER(LEN=default_path_length) :: coupling_function
1047 CHARACTER(LEN=default_string_length) :: def_error, description, this_error
1048 INTEGER :: iforce_eval, iparticle, istate(2), &
1049 jparticle, mixing_type, my_group, &
1050 natom, nforce_eval, source, unit_nr
1051 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms, itmplist, map_index
1052 LOGICAL :: dip_exists
1053 REAL(kind=
dp) :: coupling_parameter, dedf, der_1, der_2, &
1054 dx, energy, err, lambda, lerr, &
1055 restraint_strength, restraint_target, &
1057 REAL(kind=
dp),
DIMENSION(3) :: dip_mix
1058 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1070 mapping_section, mixed_section, &
1073 TYPE(
virial_type),
POINTER :: loc_virial, virial_mix
1076 cpassert(
ASSOCIATED(force_env))
1079 subsys=subsys_mix, &
1080 force_env_section=force_env_section, &
1081 root_section=root_section, &
1084 particles=particles_mix, &
1085 virial=virial_mix, &
1086 results=results_mix)
1087 NULLIFY (map_index, glob_natoms, global_forces, itmplist)
1089 nforce_eval =
SIZE(force_env%sub_force_env)
1093 ALLOCATE (subsystems(nforce_eval))
1094 ALLOCATE (particles(nforce_eval))
1096 ALLOCATE (global_forces(nforce_eval))
1097 ALLOCATE (energies(nforce_eval))
1098 ALLOCATE (glob_natoms(nforce_eval))
1099 ALLOCATE (virials(nforce_eval))
1100 ALLOCATE (results(nforce_eval))
1107 IF (.NOT. force_env%mixed_env%do_mixed_cdft)
THEN
1108 DO iforce_eval = 1, nforce_eval
1109 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1110 NULLIFY (results(iforce_eval)%results, virials(iforce_eval)%virial)
1111 ALLOCATE (virials(iforce_eval)%virial)
1113 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1115 my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
1116 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
1122 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1123 subsys=subsystems(iforce_eval)%subsys)
1126 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_mix)
1130 particles=particles(iforce_eval)%list)
1133 natom =
SIZE(particles(iforce_eval)%list%els)
1139 DO iparticle = 1, natom
1140 jparticle = map_index(iparticle)
1141 particles(iforce_eval)%list%els(iparticle)%r = particles_mix%els(jparticle)%r
1146 calc_force=calculate_forces, &
1147 skip_external_control=.true.)
1150 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1151 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1152 potential_energy=energy)
1154 virial=loc_virial, results=loc_results)
1155 energies(iforce_eval) = energy
1156 glob_natoms(iforce_eval) = natom
1157 virials(iforce_eval)%virial = loc_virial
1161 IF (
ASSOCIATED(map_index))
THEN
1162 DEALLOCATE (map_index)
1167 CALL mixed_cdft_energy_forces(force_env, calculate_forces, particles, energies, &
1168 glob_natoms, virials, results)
1171 CALL force_env%para_env%sync()
1173 CALL mixed_cdft_post_energy_forces(force_env)
1175 CALL force_env%para_env%sum(energies)
1176 CALL force_env%para_env%sum(glob_natoms)
1178 DO iforce_eval = 1, nforce_eval
1179 ALLOCATE (global_forces(iforce_eval)%forces(3, glob_natoms(iforce_eval)))
1180 global_forces(iforce_eval)%forces = 0.0_dp
1181 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env))
THEN
1182 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1184 DO iparticle = 1, glob_natoms(iforce_eval)
1185 global_forces(iforce_eval)%forces(:, iparticle) = &
1186 particles(iforce_eval)%list%els(iparticle)%f
1190 CALL force_env%para_env%sum(global_forces(iforce_eval)%forces)
1192 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_total)
1193 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_kinetic)
1194 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_virial)
1195 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_xc)
1196 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_fock_4c)
1197 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_constraint)
1200 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env))
THEN
1201 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source()) &
1202 source = force_env%para_env%mepos
1204 CALL force_env%para_env%sum(source)
1208 force_env%mixed_env%energies = energies
1211 mixed_energy=mixed_energy)
1215 DO iparticle = 1,
SIZE(particles_mix%els)
1216 particles_mix%els(iparticle)%f(:) = 0.0_dp
1220 SELECT CASE (mixing_type)
1223 cpassert(nforce_eval == 2)
1225 mixed_energy%pot = lambda*energies(1) + (1.0_dp - lambda)*energies(2)
1227 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1228 lambda, 1, nforce_eval, map_index, mapping_section, .true.)
1229 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1230 (1.0_dp - lambda), 2, nforce_eval, map_index, mapping_section, .false.)
1233 cpassert(nforce_eval == 2)
1234 IF (energies(1) < energies(2))
THEN
1235 mixed_energy%pot = energies(1)
1236 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1237 1.0_dp, 1, nforce_eval, map_index, mapping_section, .true.)
1239 mixed_energy%pot = energies(2)
1240 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1241 1.0_dp, 2, nforce_eval, map_index, mapping_section, .true.)
1245 cpassert(nforce_eval == 2)
1247 r_val=coupling_parameter)
1248 sd = sqrt((energies(1) - energies(2))**2 + 4.0_dp*coupling_parameter**2)
1249 der_1 = (1.0_dp - (1.0_dp/(2.0_dp*sd))*2.0_dp*(energies(1) - energies(2)))/2.0_dp
1250 der_2 = (1.0_dp + (1.0_dp/(2.0_dp*sd))*2.0_dp*(energies(1) - energies(2)))/2.0_dp
1251 mixed_energy%pot = (energies(1) + energies(2) - sd)/2.0_dp
1253 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1254 der_1, 1, nforce_eval, map_index, mapping_section, .true.)
1255 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1256 der_2, 2, nforce_eval, map_index, mapping_section, .false.)
1259 cpassert(nforce_eval == 2)
1261 r_val=restraint_target)
1263 r_val=restraint_strength)
1264 mixed_energy%pot = energies(1) + restraint_strength*(energies(1) - energies(2) - restraint_target)**2
1265 der_2 = -2.0_dp*restraint_strength*(energies(1) - energies(2) - restraint_target)
1266 der_1 = 1.0_dp - der_2
1268 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1269 der_1, 1, nforce_eval, map_index, mapping_section, .true.)
1270 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1271 der_2, 2, nforce_eval, map_index, mapping_section, .false.)
1275 CALL get_generic_info(gen_section,
"MIXING_FUNCTION", coupling_function, force_env%mixed_env%par, &
1276 force_env%mixed_env%val, energies)
1278 CALL parsef(1, trim(coupling_function), force_env%mixed_env%par)
1280 mixed_energy%pot =
evalf(1, force_env%mixed_env%val)
1284 DO iforce_eval = 1, nforce_eval
1287 dedf =
evalfd(1, iforce_eval, force_env%mixed_env%val, dx, err)
1288 IF (abs(err) > lerr)
THEN
1289 WRITE (this_error,
"(A,G12.6,A)")
"(", err,
")"
1290 WRITE (def_error,
"(A,G12.6,A)")
"(", lerr,
")"
1293 CALL cp_warn(__location__, &
1294 'ASSERTION (cond) failed at line '//
cp_to_string(__line__)// &
1295 ' Error '//trim(this_error)//
' in computing numerical derivatives larger then'// &
1296 trim(def_error)//
' .')
1299 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1300 dedf, iforce_eval, nforce_eval, map_index, mapping_section, .false.)
1301 force_env%mixed_env%val(iforce_eval) = energies(iforce_eval)
1304 force_env%mixed_env%dx = dx
1305 force_env%mixed_env%lerr = lerr
1306 force_env%mixed_env%coupling_function = trim(coupling_function)
1313 IF (
SIZE(itmplist) /= 2) &
1314 CALL cp_abort(__location__, &
1315 "Keyword FORCE_STATES takes exactly two input values.")
1316 IF (any(itmplist < 0)) &
1317 cpabort(
"Invalid force_eval index.")
1319 IF (istate(1) > nforce_eval .OR. istate(2) > nforce_eval) &
1320 cpabort(
"Invalid force_eval index.")
1321 mixed_energy%pot = lambda*energies(istate(1)) + (1.0_dp - lambda)*energies(istate(2))
1323 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1324 lambda, istate(1), nforce_eval, map_index, mapping_section, .true.)
1325 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1326 (1.0_dp - lambda), istate(2), nforce_eval, map_index, mapping_section, .false.)
1331 DO iforce_eval = 1, nforce_eval
1332 DEALLOCATE (global_forces(iforce_eval)%forces)
1333 IF (
ASSOCIATED(virials(iforce_eval)%virial))
DEALLOCATE (virials(iforce_eval)%virial)
1336 DEALLOCATE (global_forces)
1337 DEALLOCATE (subsystems)
1338 DEALLOCATE (particles)
1339 DEALLOCATE (energies)
1340 DEALLOCATE (glob_natoms)
1341 DEALLOCATE (virials)
1342 DEALLOCATE (results)
1345 extension=
".data", middle_name=
"MIXED_DIPOLE", log_filename=.false.)
1346 IF (unit_nr > 0)
THEN
1347 description =
'[DIPOLE]'
1348 dip_exists =
test_for_result(results=results_mix, description=description)
1349 IF (dip_exists)
THEN
1350 CALL get_results(results=results_mix, description=description, values=dip_mix)
1351 WRITE (unit_nr,
'(/,1X,A,T48,3F21.16)')
"MIXED ENV| DIPOLE ( A.U.)|", dip_mix
1352 WRITE (unit_nr,
'( 1X,A,T48,3F21.16)')
"MIXED ENV| DIPOLE (Debye)|", dip_mix*
debye
1354 WRITE (unit_nr, *)
"NO FORCE_EVAL section calculated the dipole"
1358 END SUBROUTINE mixed_energy_forces
1373 SUBROUTINE mixed_cdft_energy_forces(force_env, calculate_forces, particles, energies, &
1374 glob_natoms, virials, results)
1376 LOGICAL,
INTENT(IN) :: calculate_forces
1378 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1379 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms
1383 INTEGER :: iforce_eval, iparticle, jparticle, &
1384 my_group, natom, nforce_eval
1385 INTEGER,
DIMENSION(:),
POINTER :: map_index
1386 REAL(kind=
dp) :: energy
1394 mixed_section, root_section
1395 TYPE(
virial_type),
POINTER :: loc_virial, virial_mix
1398 cpassert(
ASSOCIATED(force_env))
1401 subsys=subsys_mix, &
1402 force_env_section=force_env_section, &
1403 root_section=root_section, &
1406 particles=particles_mix, &
1407 virial=virial_mix, &
1408 results=results_mix)
1410 nforce_eval =
SIZE(force_env%sub_force_env)
1413 ALLOCATE (subsystems(nforce_eval))
1414 DO iforce_eval = 1, nforce_eval
1415 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1416 NULLIFY (results(iforce_eval)%results, virials(iforce_eval)%virial)
1417 ALLOCATE (virials(iforce_eval)%virial)
1419 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1421 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1422 subsys=subsystems(iforce_eval)%subsys)
1425 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_mix)
1429 particles=particles(iforce_eval)%list)
1432 natom =
SIZE(particles(iforce_eval)%list%els)
1434 IF (
ASSOCIATED(map_index)) &
1435 DEALLOCATE (map_index)
1440 DO iparticle = 1, natom
1441 jparticle = map_index(iparticle)
1442 particles(iforce_eval)%list%els(iparticle)%r = particles_mix%els(jparticle)%r
1445 IF (force_env%mixed_env%do_mixed_qmmm_cdft) &
1452 DO iforce_eval = 1, nforce_eval
1453 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1455 IF (force_env%mixed_env%cdft_control%run_type ==
mixed_cdft_serial .AND. iforce_eval >= 2)
THEN
1456 my_logger => force_env%mixed_env%cdft_control%sub_logger(iforce_eval - 1)%p
1458 my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
1459 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
1468 calc_force=calculate_forces, &
1469 skip_external_control=.true.)
1471 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1472 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1473 potential_energy=energy)
1475 virial=loc_virial, results=loc_results)
1476 energies(iforce_eval) = energy
1477 glob_natoms(iforce_eval) = natom
1478 virials(iforce_eval)%virial = loc_virial
1482 IF (
ASSOCIATED(map_index))
THEN
1483 DEALLOCATE (map_index)
1487 DEALLOCATE (subsystems)
1489 END SUBROUTINE mixed_cdft_energy_forces
1499 SUBROUTINE mixed_cdft_post_energy_forces(force_env)
1502 INTEGER :: iforce_eval, nforce_eval, nvar
1506 cpassert(
ASSOCIATED(force_env))
1507 NULLIFY (qs_env, dft_control)
1508 IF (force_env%mixed_env%do_mixed_cdft)
THEN
1509 nforce_eval =
SIZE(force_env%sub_force_env)
1510 nvar = force_env%mixed_env%cdft_control%nconstraint
1512 IF (.NOT.
ASSOCIATED(force_env%mixed_env%strength)) &
1513 ALLOCATE (force_env%mixed_env%strength(nforce_eval, nvar))
1514 force_env%mixed_env%strength = 0.0_dp
1515 DO iforce_eval = 1, nforce_eval
1516 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1517 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1518 qs_env => force_env%sub_force_env(iforce_eval)%force_env%qmmm_env%qs_env
1520 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, qs_env=qs_env)
1522 CALL get_qs_env(qs_env, dft_control=dft_control)
1523 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source()) &
1524 force_env%mixed_env%strength(iforce_eval, :) = dft_control%qs_control%cdft_control%strength(:)
1526 CALL force_env%para_env%sum(force_env%mixed_env%strength)
1528 IF (force_env%mixed_env%do_mixed_et)
THEN
1529 IF (
modulo(force_env%mixed_env%cdft_control%sim_step, force_env%mixed_env%et_freq) == 0) &
1534 END SUBROUTINE mixed_cdft_post_energy_forces
1541 SUBROUTINE embed_energy(force_env)
1545 INTEGER :: iforce_eval, iparticle, jparticle, &
1546 my_group, natom, nforce_eval
1547 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms, map_index
1548 LOGICAL :: converged_embed
1549 REAL(kind=
dp) :: energy
1550 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1564 mapping_section, root_section
1567 cpassert(
ASSOCIATED(force_env))
1570 subsys=subsys_embed, &
1571 force_env_section=force_env_section, &
1572 root_section=root_section, &
1575 particles=particles_embed, &
1576 results=results_embed)
1577 NULLIFY (map_index, glob_natoms)
1579 nforce_eval =
SIZE(force_env%sub_force_env)
1583 ALLOCATE (subsystems(nforce_eval))
1584 ALLOCATE (particles(nforce_eval))
1586 ALLOCATE (energies(nforce_eval))
1587 ALLOCATE (glob_natoms(nforce_eval))
1588 ALLOCATE (results(nforce_eval))
1592 DO iforce_eval = 1, nforce_eval
1593 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1594 NULLIFY (results(iforce_eval)%results)
1596 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1598 my_group = force_env%embed_env%group_distribution(force_env%para_env%mepos)
1599 my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
1605 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1606 subsys=subsystems(iforce_eval)%subsys)
1610 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env%qs_env))
THEN
1611 NULLIFY (dft_control)
1612 CALL get_qs_env(force_env%sub_force_env(iforce_eval)%force_env%qs_env, dft_control=dft_control)
1613 IF (dft_control%qs_control%ref_embed_subsys)
THEN
1614 IF (iforce_eval == 2) cpabort(
"Density importing force_eval can't be the first.")
1619 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_embed)
1623 particles=particles(iforce_eval)%list)
1626 natom =
SIZE(particles(iforce_eval)%list%els)
1632 DO iparticle = 1, natom
1633 jparticle = map_index(iparticle)
1634 particles(iforce_eval)%list%els(iparticle)%r = particles_embed%els(jparticle)%r
1639 calc_force=.false., &
1640 skip_external_control=.true.)
1643 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env%qs_env))
THEN
1644 NULLIFY (dft_control)
1645 CALL get_qs_env(force_env%sub_force_env(iforce_eval)%force_env%qs_env, dft_control=dft_control)
1646 IF (dft_control%qs_control%ref_embed_subsys)
THEN
1648 CALL dft_embedding(force_env, iforce_eval, energies, converged_embed)
1649 IF (.NOT. converged_embed) cpabort(
"Embedding potential optimization not converged.")
1652 IF (dft_control%qs_control%high_level_embed_subsys)
THEN
1653 CALL get_qs_env(qs_env=force_env%sub_force_env(iforce_eval)%force_env%qs_env, &
1654 embed_pot=embed_pot, spin_embed_pot=spin_embed_pot, pw_env=pw_env)
1655 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1656 CALL auxbas_pw_pool%give_back_pw(embed_pot)
1657 IF (
ASSOCIATED(embed_pot))
THEN
1658 CALL embed_pot%release()
1659 DEALLOCATE (embed_pot)
1661 IF (
ASSOCIATED(spin_embed_pot))
THEN
1662 CALL auxbas_pw_pool%give_back_pw(spin_embed_pot)
1663 CALL spin_embed_pot%release()
1664 DEALLOCATE (spin_embed_pot)
1670 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1671 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1672 potential_energy=energy)
1674 results=loc_results)
1675 energies(iforce_eval) = energy
1676 glob_natoms(iforce_eval) = natom
1680 IF (
ASSOCIATED(map_index))
THEN
1681 DEALLOCATE (map_index)
1687 CALL force_env%para_env%sync()
1689 CALL force_env%para_env%sum(energies)
1690 CALL force_env%para_env%sum(glob_natoms)
1692 force_env%embed_env%energies = energies
1695 DO iparticle = 1,
SIZE(particles_embed%els)
1696 particles_embed%els(iparticle)%f(:) = 0.0_dp
1700 force_env%embed_env%pot_energy = energies(3) + energies(4) - energies(2)
1703 DO iforce_eval = 1, nforce_eval
1706 DEALLOCATE (subsystems)
1707 DEALLOCATE (particles)
1708 DEALLOCATE (energies)
1709 DEALLOCATE (glob_natoms)
1710 DEALLOCATE (results)
1712 END SUBROUTINE embed_energy
1721 SUBROUTINE dft_embedding(force_env, ref_subsys_number, energies, converged_embed)
1723 INTEGER :: ref_subsys_number
1724 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1725 LOGICAL :: converged_embed
1727 INTEGER :: embed_method
1732 force_env_section=force_env_section)
1736 SELECT CASE (embed_method)
1739 CALL dfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1742 CALL dmfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1745 END SUBROUTINE dft_embedding
1754 SUBROUTINE dfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1756 INTEGER :: ref_subsys_number
1757 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1758 LOGICAL :: converged_embed
1760 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dfet_embedding'
1762 INTEGER :: cluster_subsys_num, handle, &
1763 i_force_eval, i_iter, i_spin, &
1764 nforce_eval, nspins, nspins_subsys, &
1766 REAL(kind=
dp) :: cluster_energy
1767 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rhs
1774 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_ref, rho_r_subsys
1776 spin_embed_pot, spin_embed_pot_subsys
1780 force_env_section, input, &
1781 mapping_section, opt_embed_section
1783 CALL timeset(routinen, handle)
1788 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
1793 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
1796 NULLIFY (dft_section, input, opt_embed_section)
1797 NULLIFY (energy, dft_control)
1799 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
1800 pw_env=pw_env, dft_control=dft_control, rho=rho, energy=energy, &
1802 nspins = dft_control%nspins
1808 CALL qs_rho_get(rho_struct=rho, rho_r=rho_r_ref)
1811 CALL understand_spin_states(force_env, ref_subsys_number, opt_embed%change_spin, opt_embed%open_shell_embed, &
1812 opt_embed%all_nspins)
1815 CALL prepare_embed_opt(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, opt_embed, &
1819 CALL init_embed_pot(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, embed_pot, &
1820 opt_embed%add_const_pot, opt_embed%Fermi_Amaldi, opt_embed%const_pot, &
1821 opt_embed%open_shell_embed, spin_embed_pot, &
1822 opt_embed%pot_diff, opt_embed%Coulomb_guess, opt_embed%grid_opt)
1825 IF (opt_embed%read_embed_pot .OR. opt_embed%read_embed_pot_cube)
CALL read_embed_pot( &
1826 force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, embed_pot, spin_embed_pot, &
1827 opt_embed_section, opt_embed)
1830 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1831 CALL auxbas_pw_pool%create_pw(diff_rho_r)
1833 IF (opt_embed%open_shell_embed)
THEN
1834 CALL auxbas_pw_pool%create_pw(diff_rho_spin)
1839 DO i_spin = 1, nspins
1840 CALL pw_axpy(rho_r_ref(i_spin), diff_rho_r, -1.0_dp)
1842 IF (opt_embed%open_shell_embed)
THEN
1843 IF (nspins == 2)
THEN
1844 CALL pw_axpy(rho_r_ref(1), diff_rho_spin, -1.0_dp)
1845 CALL pw_axpy(rho_r_ref(2), diff_rho_spin, 1.0_dp)
1849 DO i_force_eval = 1, ref_subsys_number - 1
1850 NULLIFY (subsys_rho, rho_r_subsys, dft_control)
1851 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, rho=subsys_rho, energy=energy, &
1852 dft_control=dft_control)
1853 nspins_subsys = dft_control%nspins
1855 CALL qs_rho_get(rho_struct=subsys_rho, rho_r=rho_r_subsys)
1856 DO i_spin = 1, nspins_subsys
1857 CALL pw_axpy(rho_r_subsys(i_spin), diff_rho_r, allow_noncompatible_grids=.true.)
1859 IF (opt_embed%open_shell_embed)
THEN
1860 IF (nspins_subsys == 2)
THEN
1862 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
1863 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1864 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1867 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1868 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1875 CALL print_rho_diff(diff_rho_r, 0, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
1876 IF (opt_embed%open_shell_embed)
THEN
1877 CALL print_rho_spin_diff(diff_rho_spin, 0, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
1881 IF (opt_embed%Coulomb_guess)
THEN
1883 nforce_eval =
SIZE(force_env%sub_force_env)
1885 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, rhs=rhs)
1888 force_env_section=force_env_section)
1892 DO i_force_eval = 1, ref_subsys_number - 1
1893 IF (i_force_eval == 1)
THEN
1895 force_env%sub_force_env(i_force_eval)%force_env%qs_env, nforce_eval, i_force_eval, opt_embed%eta)
1897 CALL coulomb_guess(opt_embed%pot_diff, rhs, mapping_section, &
1898 force_env%sub_force_env(i_force_eval)%force_env%qs_env, nforce_eval, i_force_eval, opt_embed%eta)
1901 CALL pw_axpy(opt_embed%pot_diff, embed_pot)
1902 IF (.NOT. opt_embed%grid_opt)
CALL pw_copy(embed_pot, opt_embed%const_pot)
1907 IF (opt_embed%diff_guess)
THEN
1908 CALL pw_copy(diff_rho_r, embed_pot)
1909 IF (.NOT. opt_embed%grid_opt)
CALL pw_copy(embed_pot, opt_embed%const_pot)
1911 IF (opt_embed%open_shell_embed)
CALL pw_copy(diff_rho_spin, spin_embed_pot)
1915 DO i_iter = 1, opt_embed%n_iter
1916 opt_embed%i_iter = i_iter
1920 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, dft_control=dft_control)
1921 nspins = dft_control%nspins
1922 DO i_spin = 1, nspins
1923 CALL pw_axpy(rho_r_ref(i_spin), diff_rho_r, -1.0_dp)
1925 IF (opt_embed%open_shell_embed)
THEN
1927 IF (nspins == 2)
THEN
1928 CALL pw_axpy(rho_r_ref(1), diff_rho_spin, -1.0_dp)
1929 CALL pw_axpy(rho_r_ref(2), diff_rho_spin, 1.0_dp)
1933 DO i_force_eval = 1, ref_subsys_number - 1
1934 NULLIFY (dft_control)
1935 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, dft_control=dft_control)
1936 nspins_subsys = dft_control%nspins
1938 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
1942 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
1943 opt_embed%open_shell_embed, .true.)
1946 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
1947 opt_embed%open_shell_embed, .false.)
1951 dft_control%apply_embed_pot = .true.
1954 CALL set_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, embed_pot=embed_pot_subsys)
1955 IF ((opt_embed%open_shell_embed) .AND. (nspins_subsys == 2))
THEN
1956 CALL set_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
1957 spin_embed_pot=spin_embed_pot_subsys)
1961 CALL get_prev_density(opt_embed, force_env%sub_force_env(i_force_eval)%force_env, i_force_eval)
1965 calc_force=.false., &
1966 skip_external_control=.true.)
1968 CALL get_max_subsys_diff(opt_embed, force_env%sub_force_env(i_force_eval)%force_env, i_force_eval)
1971 NULLIFY (rho_r_subsys, energy)
1973 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, rho=subsys_rho, &
1975 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) + energy%total
1978 IF (dft_control%qs_control%cluster_embed_subsys)
THEN
1979 cluster_subsys_num = i_force_eval
1980 cluster_energy = energy%total
1984 CALL qs_rho_get(rho_struct=subsys_rho, rho_r=rho_r_subsys)
1985 DO i_spin = 1, nspins_subsys
1986 CALL pw_axpy(rho_r_subsys(i_spin), diff_rho_r, allow_noncompatible_grids=.true.)
1988 IF (opt_embed%open_shell_embed)
THEN
1989 IF (nspins_subsys == 2)
THEN
1991 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
1992 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1993 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1996 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1997 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
2003 CALL embed_pot_subsys%release()
2004 DEALLOCATE (embed_pot_subsys)
2005 IF (opt_embed%open_shell_embed)
THEN
2006 CALL spin_embed_pot_subsys%release()
2007 DEALLOCATE (spin_embed_pot_subsys)
2014 opt_embed%dimen_aux, opt_embed%embed_pot_coef, embed_pot, i_iter, &
2015 spin_embed_pot, opt_embed%open_shell_embed, opt_embed%grid_opt, .false.)
2017 embed_pot, spin_embed_pot, i_iter, opt_embed%open_shell_embed, .false., &
2018 force_env%sub_force_env(cluster_subsys_num)%force_env%qs_env)
2021 DO i_spin = 1, nspins
2022 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) -
pw_integral_ab(embed_pot, rho_r_ref(i_spin))
2025 IF (opt_embed%open_shell_embed)
THEN
2027 IF (nspins == 2)
THEN
2028 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) &
2034 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) + opt_embed%reg_term
2039 IF (opt_embed%converged)
EXIT
2042 IF ((i_iter > 1) .AND. (.NOT. opt_embed%steep_desc))
CALL step_control(opt_embed)
2045 CALL print_rho_diff(diff_rho_r, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
2046 IF (opt_embed%open_shell_embed)
THEN
2047 CALL print_rho_spin_diff(diff_rho_spin, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
2052 IF (opt_embed%accept_step .AND. (.NOT. opt_embed%grid_opt)) &
2054 diff_rho_r, diff_rho_spin, opt_embed)
2056 CALL opt_embed_step(diff_rho_r, diff_rho_spin, opt_embed, embed_pot, spin_embed_pot, rho_r_ref, &
2057 force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2063 opt_embed%dimen_aux, opt_embed%embed_pot_coef, embed_pot, i_iter, &
2064 spin_embed_pot, opt_embed%open_shell_embed, opt_embed%grid_opt, .true.)
2066 embed_pot, spin_embed_pot, i_iter, opt_embed%open_shell_embed, .true., &
2067 force_env%sub_force_env(cluster_subsys_num)%force_env%qs_env)
2071 IF (opt_embed%open_shell_embed)
THEN
2072 CALL print_rho_spin_diff(diff_rho_spin, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .true.)
2076 CALL diff_rho_r%release()
2077 IF (opt_embed%open_shell_embed)
THEN
2078 CALL diff_rho_spin%release()
2082 "PRINT%PROGRAM_RUN_INFO")
2085 IF (opt_embed%converged)
THEN
2086 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, dft_control=dft_control, &
2088 nspins_subsys = dft_control%nspins
2089 dft_control%apply_embed_pot = .true.
2092 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2093 opt_embed%open_shell_embed, opt_embed%change_spin)
2095 IF (opt_embed%Coulomb_guess)
THEN
2096 CALL pw_axpy(opt_embed%pot_diff, embed_pot_subsys, -1.0_dp, allow_noncompatible_grids=.true.)
2099 CALL set_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, embed_pot=embed_pot_subsys)
2101 IF ((opt_embed%open_shell_embed) .AND. (nspins_subsys == 2))
THEN
2102 CALL set_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, &
2103 spin_embed_pot=spin_embed_pot_subsys)
2107 IF (force_env%sub_force_env(cluster_subsys_num)%force_env%para_env%is_source())
THEN
2108 energies(cluster_subsys_num) = cluster_energy
2116 CALL embed_pot%release()
2117 DEALLOCATE (embed_pot)
2118 IF (opt_embed%open_shell_embed)
THEN
2119 CALL spin_embed_pot%release()
2120 DEALLOCATE (spin_embed_pot)
2123 converged_embed = opt_embed%converged
2125 CALL timestop(handle)
2127 END SUBROUTINE dfet_embedding
2137 SUBROUTINE dmfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
2139 INTEGER :: ref_subsys_number
2140 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
2141 LOGICAL :: converged_embed
2143 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dmfet_embedding'
2145 INTEGER :: cluster_subsys_num, handle, &
2146 i_force_eval, i_iter, output_unit
2147 LOGICAL :: subsys_open_shell
2148 REAL(kind=
dp) :: cluster_energy
2156 CALL timeset(routinen, handle)
2158 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2164 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
2167 NULLIFY (dft_section, input, opt_dmfet_section)
2170 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2171 energy=energy, input=input)
2178 CALL understand_spin_states(force_env, ref_subsys_number, opt_dmfet%change_spin, opt_dmfet%open_shell_embed, &
2179 opt_dmfet%all_nspins)
2182 CALL prepare_dmfet_opt(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2183 opt_dmfet, opt_dmfet_section)
2186 subsys_open_shell =
subsys_spin(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2187 CALL build_full_dm(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2188 opt_dmfet%dm_total, subsys_open_shell, opt_dmfet%open_shell_embed, opt_dmfet%dm_total_beta)
2193 opt_dmfet%dm_diff_beta, para_env)
2195 DO i_force_eval = 1, ref_subsys_number - 1
2198 subsys_open_shell =
subsys_spin(force_env%sub_force_env(i_force_eval)%force_env%qs_env)
2200 CALL build_full_dm(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2201 opt_dmfet%dm_subsys, subsys_open_shell, opt_dmfet%open_shell_embed, &
2202 opt_dmfet%dm_subsys_beta)
2206 IF (opt_dmfet%open_shell_embed)
CALL cp_fm_scale_and_add(-1.0_dp, opt_dmfet%dm_diff_beta, &
2207 1.0_dp, opt_dmfet%dm_subsys_beta)
2212 DO i_iter = 1, opt_dmfet%n_iter
2214 opt_dmfet%i_iter = i_iter
2220 opt_dmfet%dm_diff_beta, para_env)
2223 DO i_force_eval = 1, ref_subsys_number - 1
2226 NULLIFY (dft_control)
2227 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, dft_control=dft_control)
2228 dft_control%apply_dmfet_pot = .true.
2232 calc_force=.false., &
2233 skip_external_control=.true.)
2238 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, energy=energy)
2239 opt_dmfet%w_func(i_iter) = opt_dmfet%w_func(i_iter) + energy%total
2242 IF (dft_control%qs_control%cluster_embed_subsys)
THEN
2243 cluster_subsys_num = i_force_eval
2244 cluster_energy = energy%total
2248 subsys_open_shell =
subsys_spin(force_env%sub_force_env(i_force_eval)%force_env%qs_env)
2250 CALL build_full_dm(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2251 opt_dmfet%dm_subsys, subsys_open_shell, opt_dmfet%open_shell_embed, &
2252 opt_dmfet%dm_subsys_beta)
2254 IF (opt_dmfet%open_shell_embed)
THEN
2256 IF ((i_force_eval == 2) .AND. (opt_dmfet%change_spin))
THEN
2261 CALL cp_fm_scale_and_add(-1.0_dp, opt_dmfet%dm_diff_beta, 1.0_dp, opt_dmfet%dm_subsys_beta)
2269 CALL check_dmfet(opt_dmfet, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2274 IF (force_env%sub_force_env(cluster_subsys_num)%force_env%para_env%is_source())
THEN
2275 energies(cluster_subsys_num) = cluster_energy
2280 converged_embed = .false.
2282 END SUBROUTINE dmfet_embedding
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Holds information on atomic properties.
subroutine, public atprop_init(atprop_env, natom)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public huang2011
integer, save, public heaton_burgess2007
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
subroutine, public cell_create(cell, hmat, periodic, tag)
allocates and initializes a cell
Handles all functions related to the CELL.
subroutine, public scaled_to_real(r, s, cell)
Transform scaled cell coordinates real coordinates. r=h*s.
integer, parameter, public cell_sym_triclinic
subroutine, public real_to_scaled(s, r, cell)
Transform real to scaled cell coordinates. s=h_inv*r.
subroutine, public cell_release(cell)
releases the given cell (see doc/ReferenceCounting.html)
subroutine, public cell_clone(cell_in, cell_out, tag)
Clone cell variable.
subroutine, public fix_atom_control(force_env, w)
allows for fix atom constraints
Routines to handle the virtual site constraint/restraint.
subroutine, public vsite_force_control(force_env)
control force distribution for virtual sites
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent a full matrix distributed on many processors
subroutine, public cp_fm_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
Collection of routines to handle the iteration info.
subroutine, public cp_iteration_info_copy_iter(iteration_info_in, iteration_info_out)
Copies iterations info of an iteration info into another iteration info.
various routines to log and control the output. The idea is that decisions about where to log should ...
subroutine, public cp_rm_default_logger()
the cousin of cp_add_default_logger, decrements the stack, so that the default logger is what it has ...
subroutine, public cp_add_default_logger(logger)
adds a default logger. MUST be called before logging occours
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)
...
integer, parameter, public low_print_level
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_mp_bcast(results, source, para_env)
broadcast results type
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
logical function, public test_for_result(results, description)
test for a certain result in the result_list
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_result_copy(results_in, results_out)
Copies the cp_result type.
subroutine, public cp_result_release(results)
Releases cp_result type.
subroutine, public cp_result_create(results)
Allocates and intitializes the cp_result.
types that represent a subsys, i.e. a part of the system
subroutine, public cp_subsys_set(subsys, atomic_kinds, particles, local_particles, molecules, molecule_kinds, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, results, cell, cell_ref, use_ref_cell)
sets various propreties of the subsys
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
The environment for the empirical interatomic potential methods.
Empirical interatomic potentials for Silicon.
subroutine, public eip_stillinger_weber(eip_env)
Interface routine of the Stillinger-Weber force field to CP2K.
subroutine, public eip_lenosky(eip_env)
Interface routine of Goedecker's Lenosky force field to CP2K.
subroutine, public eip_tersoff(eip_env)
Interface routine of the Tersoff force field to CP2K.
subroutine, public eip_bazant(eip_env)
Interface routine of Goedecker's Bazant EDIP to CP2K.
Methods to include the effect of an external potential during an MD or energy calculation.
subroutine, public add_external_potential(force_env)
...
subroutine, public fist_calc_energy_force(fist_env, debug)
Calculates the total potential energy, total force, and the total pressure tensor from the potentials...
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.
subroutine, public force_env_calc_num_pressure(force_env, dx)
Evaluates the stress tensor and pressure numerically.
subroutine, public force_env_create(force_env, root_section, para_env, globenv, fist_env, qs_env, meta_env, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, force_env_section, mixed_env, embed_env, nnp_env, ipi_env)
creates and initializes a force environment
Interface for the force calculations.
integer function, public force_env_get_natom(force_env)
returns the number of atoms
integer, parameter, public use_qmmm
integer, parameter, public use_mixed_force
character(len=10), dimension(501:510), parameter, public use_prog_name
integer, parameter, public use_eip_force
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
integer, parameter, public use_embed
integer, parameter, public use_qmmmx
subroutine, public force_env_set(force_env, meta_env, fp_env, force_env_section, method_name_id, additional_potential)
changes some attributes of the force_env
integer, parameter, public use_qs_force
integer, parameter, public use_pwdft_force
integer, parameter, public use_nnp_force
integer, parameter, public use_ipi
integer, parameter, public use_fist_force
subroutine, public write_forces(particles, iw, label, ndigits, unit_string, total_force, grand_total_force, zero_force_core_shell_atom)
Write forces either to the screen or to a file.
subroutine, public write_atener(iounit, particles, atener, label)
Write the atomic coordinates, types, and energies.
subroutine, public rescale_forces(force_env)
Rescale forces if requested.
subroutine, public get_generic_info(gen_section, func_name, xfunction, parameters, values, var_values, size_variables, i_rep_sec, input_variables)
Reads from the input structure all information for generic functions.
methods used in the flexible partitioning scheme
subroutine, public fp_eval(fp_env, subsys, cell)
Computes the forces and the energy due to the flexible potential & bias, and writes the weights file.
This public domain function parser module is intended for applications where a set of mathematical ex...
subroutine, public parsef(i, funcstr, var)
Parse ith function string FuncStr and compile it into bytecode.
real(rn) function, public evalf(i, val)
...
integer, public evalerrtype
real(kind=rn) function, public evalfd(id_fun, ipar, vals, h, err)
Evaluates derivatives.
subroutine, public finalizef()
...
subroutine, public initf(n)
...
Define type storing the global information of a run. Keep the amount of stored data small....
subroutine, public globenv_retain(globenv)
Retains the global environment globenv.
subroutine, public write_grrm(iounit, force_env, particles, energy, dipole, hessian, dipder, polar, fixed_atoms)
Write GRRM interface file.
The environment for the empirical interatomic potential methods.
i–PI server mode: Communication with i–PI clients
subroutine, public request_forces(ipi_env)
Send atomic positions to a client and retrieve forces.
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Routines needed for kpoint calculation.
subroutine, public kpoint_initialize_mos(kpoint, mos, added_mos, for_aux_fit)
Initialize a set of MOs and density matrix for each kpoint (kpoint group)
subroutine, public kpoint_initialize(kpoint, particle_set, cell)
Generate the kpoints and initialize the kpoint environment.
subroutine, public kpoint_env_initialize(kpoint, para_env, blacs_env, with_aux_fit)
Initialize the kpoint environment.
Types and basic routines needed for a kpoint calculation.
subroutine, public set_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Set information in a kpoint environment.
subroutine, public kpoint_reset_initialization(kpoint)
Reset all data derived from a concrete k-point initialization. Input options such as the scheme,...
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
K-points and crystal symmetry routines based on.
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
Collection of simple mathematical functions and subroutines.
logical function, public abnormal_value(a)
determines if a value is not normal (e.g. for Inf and Nan) based on IO to work also under optimizatio...
Interface to the message passing library MPI.
Methods for mixed CDFT calculations.
subroutine, public mixed_cdft_calculate_coupling(force_env)
Driver routine to calculate the electronic coupling(s) between CDFT states.
subroutine, public mixed_cdft_build_weight(force_env, calculate_forces, iforce_eval)
Driver routine to handle the build of CDFT weight/gradient in parallel and serial modes.
subroutine, public mixed_cdft_init(force_env, calculate_forces)
Initialize a mixed CDFT calculation.
subroutine, public get_mixed_env(mixed_env, atomic_kind_set, particle_set, local_particles, local_molecules, molecule_kind_set, molecule_set, cell, cell_ref, mixed_energy, para_env, sub_para_env, subsys, input, results, cdft_control)
Get the MIXED environment.
subroutine, public get_subsys_map_index(mapping_section, natom, iforce_eval, nforce_eval, map_index, force_eval_embed)
performs mapping of the subsystems of different force_eval
subroutine, public mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, factor, iforce_eval, nforce_eval, map_index, mapping_section, overwrite)
Maps forces between the different force_eval sections/environments.
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.
Data types for neural network potentials.
Methods dealing with Neural Network potentials.
subroutine, public nnp_calc_energy_force(nnp, calc_forces)
Calculate the energy and force for a given configuration with the NNP.
subroutine, public check_dmfet(opt_dmfet, qs_env)
...
subroutine, public release_dmfet_opt(opt_dmfet)
...
subroutine, public build_full_dm(qs_env, dm, open_shell, open_shell_embed, dm_beta)
Builds density matrices from MO coefficients in full matrix format.
subroutine, public prepare_dmfet_opt(qs_env, opt_dmfet, opt_dmfet_section)
...
logical function, public subsys_spin(qs_env)
...
subroutine, public print_embed_restart(qs_env, dimen_aux, embed_pot_coef, embed_pot, i_iter, embed_pot_spin, open_shell_embed, grid_opt, final_one)
Print embedding potential as a cube and as a binary (for restarting)
subroutine, public make_subsys_embed_pot(qs_env, embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, open_shell_embed, change_spin_sign)
Creates a subsystem embedding potential.
subroutine, public print_rho_spin_diff(spin_diff_rho_r, i_iter, qs_env, final_one)
Prints a cube for the (spin_rho_A + spin_rho_B - spin_rho_ref) to be minimized in embedding.
subroutine, public get_max_subsys_diff(opt_embed, force_env, subsys_num)
...
subroutine, public print_emb_opt_info(output_unit, step_num, opt_embed)
...
subroutine, public init_embed_pot(qs_env, embed_pot, add_const_pot, fermi_amaldi, const_pot, open_shell_embed, spin_embed_pot, pot_diff, coulomb_guess, grid_opt)
...
subroutine, public understand_spin_states(force_env, ref_subsys_number, change_spin, open_shell_embed, all_nspins)
Find out whether we need to swap alpha- and beta- spind densities in the second subsystem.
subroutine, public read_embed_pot(qs_env, embed_pot, spin_embed_pot, section, opt_embed)
...
subroutine, public get_prev_density(opt_embed, force_env, subsys_num)
...
subroutine, public coulomb_guess(v_rspace, rhs, mapping_section, qs_env, nforce_eval, iforce_eval, eta)
Calculates subsystem Coulomb potential from the RESP charges of the total system.
subroutine, public print_rho_diff(diff_rho_r, i_iter, qs_env, final_one)
Prints a cube for the (rho_A + rho_B - rho_ref) to be minimized in embedding.
subroutine, public conv_check_embed(opt_embed, diff_rho_r, diff_rho_spin, output_unit)
...
subroutine, public step_control(opt_embed)
Controls the step, changes the trust radius if needed in maximization of the V_emb.
subroutine, public opt_embed_step(diff_rho_r, diff_rho_spin, opt_embed, embed_pot, spin_embed_pot, rho_r_ref, qs_env)
Takes maximization step in embedding potential optimization.
subroutine, public calculate_embed_pot_grad(qs_env, diff_rho_r, diff_rho_spin, opt_embed)
Calculates the derivative of the embedding potential wrt to the expansion coefficients.
subroutine, public print_pot_simple_grid(qs_env, embed_pot, embed_pot_spin, i_iter, open_shell_embed, final_one, qs_env_cluster)
Prints a volumetric file: X Y Z value for interfacing with external programs.
subroutine, public prepare_embed_opt(qs_env, opt_embed, opt_embed_section)
Creates and allocates objects for optimization of embedding potential.
subroutine, public release_opt_embed(opt_embed)
Deallocate stuff for optimizing embedding potential.
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 debye
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
The type definitions for the PWDFT environment.
Methods and functions on the PWDFT environment.
subroutine, public pwdft_calc_energy_force(pwdft_env, calculate_forces, calculate_stress)
Calculate energy and forces within the PWDFT/SIRIUS code.
Calculates QM/MM energy and forces.
subroutine, public qmmm_calc_energy_force(qmmm_env, calc_force, consistent_energies, linres)
calculates the qm/mm energy and forces
Basic container type for QM/MM.
subroutine, public apply_qmmm_translate(qmmm_env)
Apply translation to the full system in order to center the QM system into the QM box.
Calculates QM/MM energy and forces with Force-Mixing.
subroutine, public qmmmx_calc_energy_force(qmmmx_env, calc_force, consistent_energies, linres, require_consistent_energy_force)
calculates the qm/mm energy and forces
Basic container type for QM/MM with force mixing.
Atomic Polarization Tensor calculation by dF/d(E-field) finite differences.
subroutine, public apt_fdiff(force_env)
Calculate Atomic Polarization Tensors by dF/d(E-field) finite differences.
subroutine, public qs_basis_rotation(qs_env, kpoints, basis_type)
Construct basis set rotation matrices.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Quickstep force driver routine.
subroutine, public qs_calc_energy_force(qs_env, calc_force, consistent_energies, linres)
...
Definition and initialisation of the mo data type.
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
interpolate the wavefunctions to speed up the convergence when doing MD
subroutine, public wfi_clear(wf_history)
Clear stored wavefunction snapshots while preserving history settings.
Handles all possible kinds of restraints in CP2K.
subroutine, public restraint_control(force_env)
Computes restraints.
subroutine, public write_scine(iounit, force_env, particles, energy, hessian)
Write SCINE interface file.
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
subroutine, public write_stress_tensor(pv_virial, iw, cell, unit_string, numerical)
Print stress tensor to output file.
subroutine, public write_stress_tensor_components(virial, iw, cell, unit_string)
...
subroutine, public zero_virial(virial, reset)
...
subroutine, public symmetrize_virial(virial)
Symmetrize the virial components.
type for the atomic properties
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains arbitrary information which need to be stored
represent a pointer to a subsys, to be able to create arrays of pointers
represents a system: atoms, molecules, their pos,vel,...
The empirical interatomic potential environment.
Embedding environment type.
Type containing main data for matrix embedding potential optimization.
Type containing main data for embedding potential optimization.
allows for the creation of an array of force_env
wrapper to abstract the force evaluation of the various methods
contains the initially parsed file and the initial parallel environment
Keeps symmetry information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
represent a list of objects
Main data type collecting all relevant data for neural network potentials.
represents a pointer to a list
represent a list of objects
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
The PWDFT environment type.
keeps the density in various representations, keeping track of which ones are valid.
keeps track of the previous wavefunctions and can extrapolate them for the next step of md