184#include "./base/base_uses.f90"
190 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'force_env_methods'
196 INTEGER,
SAVE,
PRIVATE :: last_force_env_id = 0
216 consistent_energies, skip_external_control, eval_energy_forces, &
217 require_consistent_energy_force, linres, calc_stress_tensor)
220 LOGICAL,
INTENT(IN),
OPTIONAL :: calc_force, consistent_energies, skip_external_control, &
221 eval_energy_forces, require_consistent_energy_force, linres, calc_stress_tensor
223 REAL(kind=
dp),
PARAMETER :: ateps = 1.0e-6_dp
225 CHARACTER(LEN=default_string_length) :: unit_string
226 INTEGER :: ikind, nat, ndigits, nfixed_atoms, &
227 nfixed_atoms_total, nkind, &
228 output_unit, print_forces, print_grrm, &
230 LOGICAL :: calculate_forces, calculate_stress_tensor, do_apt_fd, energy_consistency, &
231 eval_ef, linres_run, my_skip, print_components
232 REAL(kind=
dp) :: checksum, e_entropy, e_gap, e_pot, &
234 REAL(kind=
dp),
DIMENSION(3) :: grand_total_force, total_force
247 NULLIFY (logger, virial, subsys, atprop_env, cell)
251 calculate_forces = .true.
252 energy_consistency = .false.
258 IF (
PRESENT(eval_energy_forces)) eval_ef = eval_energy_forces
259 IF (
PRESENT(skip_external_control)) my_skip = skip_external_control
260 IF (
PRESENT(calc_force)) calculate_forces = calc_force
261 IF (
PRESENT(calc_stress_tensor))
THEN
262 calculate_stress_tensor = calc_stress_tensor
264 calculate_stress_tensor = calculate_forces
266 IF (
PRESENT(consistent_energies)) energy_consistency = consistent_energies
267 IF (
PRESENT(linres)) linres_run = linres
269 cpassert(
ASSOCIATED(force_env))
270 cpassert(force_env%ref_count > 0)
273 CALL cp_subsys_get(subsys, virial=virial, atprop=atprop_env, cell=cell)
274 IF (virial%pv_availability)
CALL zero_virial(virial, reset=.false.)
279 SELECT CASE (force_env%in_use)
283 CALL force_env_refresh_kpoint_symmetry(force_env, fd_energy=.NOT. calculate_forces)
286 IF (virial%pv_availability .AND. calculate_stress_tensor)
THEN
291 e_gap = force_env%pwdft_env%energy%band_gap
292 e_entropy = force_env%pwdft_env%energy%entropy
294 SELECT CASE (force_env%eip_env%eip_model)
304 cpabort(
"Unknown EIP model.")
308 calculate_forces, energy_consistency, linres=linres_run)
311 calculate_forces, energy_consistency, linres=linres_run, &
312 require_consistent_energy_force=require_consistent_energy_force)
314 CALL mixed_energy_forces(force_env, calculate_forces)
319 CALL embed_energy(force_env)
323 cpabort(
"Unknown force environment; cannot evaluate energy or force")
327 IF (virial%pv_availability)
THEN
328 IF (virial%pv_numer .AND. calculate_stress_tensor)
THEN
332 IF (calculate_forces)
THEN
336 IF (calculate_stress_tensor)
THEN
337 CALL cp_warn(__location__,
"The calculation of the stress tensor "// &
338 "requires the calculation of the forces")
347 CALL section_vals_val_get(force_env%qs_env%input,
"PROPERTIES%LINRES%DCDR%APT_FD", l_val=do_apt_fd)
350 subsection_name=
"PROPERTIES%LINRES%DCDR%PRINT%APT")
361 IF (.NOT. my_skip)
THEN
363 IF (
ASSOCIATED(force_env%fp_env))
THEN
364 IF (force_env%fp_env%use_fp)
THEN
365 CALL fp_eval(force_env%fp_env, subsys, cell)
383 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
385 IF (output_unit > 0)
THEN
389 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,F26.15)") &
390 "ENERGY| Total FORCE_EVAL ( "//trim(adjustl(
use_prog_name(force_env%in_use)))// &
391 " ) energy ["//trim(adjustl(unit_string))//
"]", e_pot*fconv
392 IF (e_gap > -0.1_dp)
THEN
393 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,F26.15)") &
394 "ENERGY| Total FORCE_EVAL ( "//trim(adjustl(
use_prog_name(force_env%in_use)))// &
395 " ) gap ["//trim(adjustl(unit_string))//
"]", e_gap*fconv
397 IF (e_entropy > -0.1_dp)
THEN
398 WRITE (unit=output_unit, fmt=
"(/,T2,A,T55,F26.15)") &
399 "ENERGY| Total FORCE_EVAL ( "//trim(adjustl(
use_prog_name(force_env%in_use)))// &
400 " ) free energy ["//trim(adjustl(unit_string))//
"]", (e_pot - e_entropy)*fconv
404 "PRINT%PROGRAM_RUN_INFO")
408 cpabort(
"Potential energy is an abnormal value (NaN/Inf).")
414 IF ((print_forces > 0) .AND. calculate_forces)
THEN
417 core_particles=core_particles, &
418 particles=particles, &
419 shell_particles=shell_particles)
425 IF (
ASSOCIATED(core_particles) .OR.
ASSOCIATED(shell_particles))
THEN
426 CALL write_forces(particles, print_forces,
"Atomic", ndigits, unit_string, &
427 total_force, zero_force_core_shell_atom=.true.)
428 grand_total_force(1:3) = total_force(1:3)
429 IF (
ASSOCIATED(core_particles))
THEN
430 CALL write_forces(core_particles, print_forces,
"Core particle", ndigits, &
431 unit_string, total_force, zero_force_core_shell_atom=.false.)
432 grand_total_force(:) = grand_total_force(:) + total_force(:)
434 IF (
ASSOCIATED(shell_particles))
THEN
435 CALL write_forces(shell_particles, print_forces,
"Shell particle", ndigits, &
436 unit_string, total_force, zero_force_core_shell_atom=.false., &
437 grand_total_force=grand_total_force)
440 CALL write_forces(particles, print_forces,
"Atomic", ndigits, unit_string, total_force)
446 IF (virial%pv_availability)
THEN
449 IF (calculate_forces .AND. calculate_stress_tensor)
THEN
450 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%STRESS_TENSOR", &
451 extension=
".stress_tensor")
452 IF (output_unit > 0)
THEN
454 l_val=print_components)
457 IF (print_components)
THEN
458 IF ((.NOT. virial%pv_numer) .AND. (force_env%in_use ==
use_qs_force))
THEN
462 CALL write_stress_tensor(virial%pv_virial, output_unit, cell, unit_string, virial%pv_numer)
465 "PRINT%STRESS_TENSOR")
470 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%STRESS_TENSOR", &
471 extension=
".stress_tensor")
472 IF (output_unit > 0)
THEN
473 CALL cp_warn(__location__,
"To print the stress tensor switch on the "// &
474 "virial evaluation with the keyword: STRESS_TENSOR")
477 "PRINT%STRESS_TENSOR")
481 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
483 IF (atprop_env%energy)
THEN
484 CALL force_env%para_env%sum(atprop_env%atener)
486 IF (output_unit > 0)
THEN
489 CALL write_atener(output_unit, particles, atprop_env%atener,
"Mulliken Atomic Energies")
492 checksum = abs(e_pot - sum_energy)
493 WRITE (unit=output_unit, fmt=
"(/,(T2,A,T56,F25.13))") &
494 "Potential energy (Atomic):", sum_energy, &
495 "Potential energy (Total) :", e_pot, &
496 "Difference :", checksum
497 cpassert((checksum < ateps*abs(e_pot)))
500 "PRINT%PROGRAM_RUN_INFO")
505 file_position=
"REWIND", extension=
".rrm")
506 IF (print_grrm > 0)
THEN
509 molecule_kinds=molecule_kinds)
511 nfixed_atoms_total = 0
512 nkind = molecule_kinds%n_els
513 molecule_kind_set => molecule_kinds%els
515 molecule_kind => molecule_kind_set(ikind)
517 nfixed_atoms_total = nfixed_atoms_total + nfixed_atoms
520 CALL write_grrm(print_grrm, force_env, particles%els, e_pot, fixed_atoms=nfixed_atoms_total)
525 file_position=
"REWIND", extension=
".scine")
526 IF (print_scine > 0)
THEN
530 CALL write_scine(print_scine, force_env, particles%els, e_pot)
542 SUBROUTINE force_env_refresh_kpoint_symmetry(force_env, fd_energy)
545 LOGICAL,
INTENT(IN) :: fd_energy
547 REAL(kind=
dp),
PARAMETER :: eps_cell = 1.0e-14_dp
549 CHARACTER(LEN=default_string_length) :: kp_scheme
550 INTEGER :: run_type_id
551 LOGICAL :: debug_full_kpoint_symmetry, debug_full_kpoint_symmetry_explicit, &
552 debug_inversion_only, do_kpoints, dynamic_symmetry, force_full_debug_symmetry, full_grid, &
553 input_full_grid, input_inversion_symmetry_only, inversion_symmetry_only, kpoint_symmetry, &
554 moving_geometry, non_lower_triangular_cell, use_full_grid, use_inversion_symmetry_only
566 IF (.NOT.
ASSOCIATED(force_env))
RETURN
571 IF (.NOT.
ASSOCIATED(globenv))
RETURN
572 run_type_id = globenv%run_type_id
573 moving_geometry = .false.
574 SELECT CASE (run_type_id)
576 moving_geometry = .true.
578 moving_geometry = .false.
580 IF (run_type_id /=
debug_run .AND. .NOT. moving_geometry)
RETURN
582 NULLIFY (blacs_env, cell, dft_control, input, kpoint_section, kpoints, mos, para_env, &
583 particle_set, wf_history)
585 blacs_env=blacs_env, &
587 dft_control=dft_control, &
588 do_kpoints=do_kpoints, &
593 particle_set=particle_set, &
594 wf_history=wf_history)
595 IF (.NOT. do_kpoints)
RETURN
597 CALL get_kpoint_info(kpoints, kp_scheme=kp_scheme, symmetry=kpoint_symmetry, full_grid=full_grid, &
598 inversion_symmetry_only=inversion_symmetry_only)
599 IF (.NOT. kpoint_symmetry)
RETURN
600 IF (trim(kp_scheme) /=
"MONKHORST-PACK" .AND. trim(kp_scheme) /=
"MACDONALD" .AND. &
601 trim(kp_scheme) /=
"GENERAL")
RETURN
603 input_full_grid = full_grid
604 input_inversion_symmetry_only = inversion_symmetry_only
605 debug_full_kpoint_symmetry = .false.
606 debug_full_kpoint_symmetry_explicit = .false.
607 IF (
ASSOCIATED(input))
THEN
611 l_val=input_inversion_symmetry_only)
613 l_val=debug_full_kpoint_symmetry, &
614 explicit=debug_full_kpoint_symmetry_explicit)
620 debug_inversion_only = run_type_id ==
debug_run .AND. .NOT. debug_full_kpoint_symmetry .AND. &
621 (fd_energy .OR. dft_control%qs_control%dftb)
622 force_full_debug_symmetry = run_type_id ==
debug_run .AND. debug_full_kpoint_symmetry_explicit .AND. &
623 debug_full_kpoint_symmetry
624 use_full_grid = input_full_grid
625 use_inversion_symmetry_only = (input_inversion_symmetry_only .OR. debug_inversion_only) .AND. &
626 (.NOT. use_full_grid)
629 IF (inversion_symmetry_only .AND. .NOT. force_full_debug_symmetry .AND. .NOT. use_full_grid)
THEN
630 use_inversion_symmetry_only = .true.
632 non_lower_triangular_cell = (abs(cell%hmat(2, 1)) > eps_cell) .OR. &
633 (abs(cell%hmat(3, 1)) > eps_cell) .OR. &
634 (abs(cell%hmat(3, 2)) > eps_cell)
635 IF (non_lower_triangular_cell .AND. .NOT. force_full_debug_symmetry .AND. .NOT. use_full_grid)
THEN
636 use_inversion_symmetry_only = .true.
638 dynamic_symmetry = kpoint_symmetry .AND. .NOT. use_full_grid .AND. &
639 .NOT. use_inversion_symmetry_only
640 IF (run_type_id ==
debug_run .AND. .NOT. fd_energy .AND. .NOT. dynamic_symmetry .AND. &
641 (full_grid .EQV. use_full_grid) .AND. &
642 (inversion_symmetry_only .EQV. use_inversion_symmetry_only))
THEN
646 IF (moving_geometry .AND. .NOT. dynamic_symmetry)
RETURN
647 IF (moving_geometry .AND. .NOT. kpoint_has_nontrivial_atomic_symmetry(kpoints))
RETURN
649 inversion_symmetry_only=use_inversion_symmetry_only)
658 END SUBROUTINE force_env_refresh_kpoint_symmetry
665 FUNCTION kpoint_has_nontrivial_atomic_symmetry(kpoints)
RESULT(has_symmetry)
668 LOGICAL :: has_symmetry
670 INTEGER :: iatom, ik, isym, natom
671 REAL(kind=
dp),
DIMENSION(3, 3) :: eye3
674 has_symmetry = .false.
675 IF (.NOT.
ASSOCIATED(kpoints))
RETURN
676 IF (.NOT.
ASSOCIATED(kpoints%kp_sym))
RETURN
683 DO ik = 1, kpoints%nkp
684 kpsym => kpoints%kp_sym(ik)%kpoint_sym
685 IF (.NOT.
ASSOCIATED(
kpsym)) cycle
686 IF (.NOT.
kpsym%apply_symmetry) cycle
687 IF (.NOT.
ASSOCIATED(
kpsym%rot)) cycle
688 IF (.NOT.
ASSOCIATED(
kpsym%f0)) cycle
689 IF (.NOT.
ASSOCIATED(
kpsym%fcell)) cycle
691 natom =
SIZE(
kpsym%f0, 1)
692 DO isym = 1,
SIZE(
kpsym%rot, 3)
693 IF (maxval(abs(
kpsym%rot(1:3, 1:3, isym) - eye3(1:3, 1:3))) > 1.e-12_dp .OR. &
694 any(
kpsym%fcell(1:3, 1:natom, isym) /= 0))
THEN
695 has_symmetry = .true.
699 IF (
kpsym%f0(iatom, isym) /= iatom)
THEN
700 has_symmetry = .true.
707 END FUNCTION kpoint_has_nontrivial_atomic_symmetry
722 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: dx
724 REAL(kind=
dp),
PARAMETER :: default_dx = 0.001_dp
726 CHARACTER(LEN=default_string_length) :: unit_string
727 INTEGER :: i, ip, iq, j, k, method_id, natom, &
728 ncore, nshell, output_unit, symmetry_id
729 LOGICAL :: use_sym_strain_2d
730 REAL(kind=
dp) :: dx_w, eps_w
731 REAL(kind=
dp),
DIMENSION(2) :: numer_energy
732 REAL(kind=
dp),
DIMENSION(3) :: s
733 REAL(kind=
dp),
DIMENSION(3, 3) :: hmat_deformed, numer_pv_2d, &
735 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ref_pos_atom, ref_pos_core, ref_pos_shell
736 TYPE(
cell_type),
POINTER :: cell, cell_local
746 NULLIFY (dft_control)
747 NULLIFY (core_particles)
749 NULLIFY (shell_particles)
750 NULLIFY (ref_pos_atom)
751 NULLIFY (ref_pos_core)
752 NULLIFY (ref_pos_shell)
758 numer_stress = 0.0_dp
759 use_sym_strain_2d = .false.
764 IF (
PRESENT(dx)) dx_w = dx
765 CALL force_env_get(force_env, subsys=subsys, globenv=globenv, in_use=method_id)
767 core_particles=core_particles, &
768 particles=particles, &
769 shell_particles=shell_particles, &
771 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%STRESS_TENSOR", &
772 extension=
".stress_tensor")
773 IF (output_unit > 0)
THEN
774 WRITE (output_unit,
"(/A,A/)")
" **************************** ", &
775 "NUMERICAL STRESS ********************************"
779 natom = particles%n_els
780 ALLOCATE (ref_pos_atom(natom, 3))
782 ref_pos_atom(i, :) = particles%els(i)%r
784 IF (
ASSOCIATED(core_particles))
THEN
785 ncore = core_particles%n_els
786 ALLOCATE (ref_pos_core(ncore, 3))
788 ref_pos_core(i, :) = core_particles%els(i)%r
791 IF (
ASSOCIATED(shell_particles))
THEN
792 nshell = shell_particles%n_els
793 ALLOCATE (ref_pos_shell(nshell, 3))
795 ref_pos_shell(i, :) = shell_particles%els(i)%r
800 symmetry_id = cell%symmetry_id
805 IF (count(cell_local%perd /= 0) == 2 .AND. method_id ==
use_qs_force)
THEN
806 CALL get_qs_env(qs_env=force_env%qs_env, dft_control=dft_control)
807 SELECT CASE (dft_control%qs_control%method_id)
810 use_sym_strain_2d = .true.
816 IF (use_sym_strain_2d)
THEN
817 IF (cell_local%perd(ip) == 0 .OR. cell_local%perd(iq) == 0) cycle
820 IF (virial%pv_diagonal .AND. (ip /= iq)) cycle
822 hmat_deformed = cell_local%hmat
823 IF (use_sym_strain_2d)
THEN
824 eps_w = -(-1.0_dp)**k*dx_w
827 strain(i, i) = 1.0_dp
830 strain(ip, ip) = strain(ip, ip) + eps_w
832 strain(ip, iq) = strain(ip, iq) + 0.5_dp*eps_w
833 strain(iq, ip) = strain(iq, ip) + 0.5_dp*eps_w
835 hmat_deformed = matmul(strain, cell_local%hmat)
837 hmat_deformed(ip, iq) = hmat_deformed(ip, iq) - (-1.0_dp)**k*dx_w
839 cell%hmat = hmat_deformed
856 calc_force=.false., &
857 consistent_energies=.true., &
858 calc_stress_tensor=.false.)
859 CALL force_env_get(force_env, potential_energy=numer_energy(k))
861 cell%hmat = cell_local%hmat
864 IF (use_sym_strain_2d)
THEN
865 numer_pv_2d(ip, iq) = -0.5_dp*(numer_energy(1) - numer_energy(2))/dx_w
866 numer_pv_2d(iq, ip) = numer_pv_2d(ip, iq)
867 IF (output_unit > 0)
THEN
868 IF (globenv%run_type_id ==
debug_run)
THEN
869 WRITE (unit=output_unit, fmt=
"(/,T2,A,T19,A,F7.4,A,T44,A,F7.4,A,T69,A)") &
870 "DEBUG|",
"E(e"//achar(119 + ip)//achar(119 + iq)//
" +", dx_w,
")", &
871 "E(e"//achar(119 + ip)//achar(119 + iq)//
" -", dx_w,
")", &
873 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,F24.8),1X,F22.8)") &
874 "DEBUG|", numer_energy(1:2), numer_pv_2d(ip, iq)
876 WRITE (unit=output_unit, fmt=
"(/,T7,A,F7.4,A,T27,A,F7.4,A,T49,A)") &
877 "E(e"//achar(119 + ip)//achar(119 + iq)//
" +", dx_w,
")", &
878 "E(e"//achar(119 + ip)//achar(119 + iq)//
" -", dx_w,
")", &
880 WRITE (unit=output_unit, fmt=
"(3(1X,F19.8))") &
881 numer_energy(1:2), numer_pv_2d(ip, iq)
885 numer_stress(ip, iq) = 0.5_dp*(numer_energy(1) - numer_energy(2))/dx_w
886 IF (output_unit > 0)
THEN
887 IF (globenv%run_type_id ==
debug_run)
THEN
888 WRITE (unit=output_unit, fmt=
"(/,T2,A,T19,A,F7.4,A,T44,A,F7.4,A,T69,A)") &
889 "DEBUG|",
"E("//achar(119 + ip)//achar(119 + iq)//
" +", dx_w,
")", &
890 "E("//achar(119 + ip)//achar(119 + iq)//
" -", dx_w,
")", &
892 WRITE (unit=output_unit, fmt=
"(T2,A,2(1X,F24.8),1X,F22.8)") &
893 "DEBUG|", numer_energy(1:2), numer_stress(ip, iq)
895 WRITE (unit=output_unit, fmt=
"(/,T7,A,F7.4,A,T27,A,F7.4,A,T49,A)") &
896 "E("//achar(119 + ip)//achar(119 + iq)//
" +", dx_w,
")", &
897 "E("//achar(119 + ip)//achar(119 + iq)//
" -", dx_w,
")", &
899 WRITE (unit=output_unit, fmt=
"(3(1X,F19.8))") &
900 numer_energy(1:2), numer_stress(ip, iq)
908 cell%symmetry_id = symmetry_id
911 particles%els(i)%r = ref_pos_atom(i, :)
914 core_particles%els(i)%r = ref_pos_core(i, :)
917 shell_particles%els(i)%r = ref_pos_shell(i, :)
920 calc_force=.false., &
921 consistent_energies=.true., &
922 calc_stress_tensor=.false.)
925 virial%pv_virial = 0.0_dp
926 IF (use_sym_strain_2d)
THEN
927 virial%pv_virial = numer_pv_2d
932 virial%pv_virial(i, j) = virial%pv_virial(i, j) - &
933 0.5_dp*(numer_stress(i, k)*cell_local%hmat(j, k) + &
934 numer_stress(j, k)*cell_local%hmat(i, k))
939 IF (output_unit > 0)
THEN
940 IF (globenv%run_type_id ==
debug_run)
THEN
943 CALL write_stress_tensor(virial%pv_virial, output_unit, cell, unit_string, virial%pv_numer)
945 WRITE (output_unit,
"(/,A,/)")
" **************************** "// &
946 "NUMERICAL STRESS END *****************************"
950 "PRINT%STRESS_TENSOR")
953 IF (
ASSOCIATED(ref_pos_atom))
THEN
954 DEALLOCATE (ref_pos_atom)
956 IF (
ASSOCIATED(ref_pos_core))
THEN
957 DEALLOCATE (ref_pos_core)
959 IF (
ASSOCIATED(ref_pos_shell))
THEN
960 DEALLOCATE (ref_pos_shell)
962 IF (
ASSOCIATED(cell_local))
CALL cell_release(cell_local)
991 qs_env, meta_env, sub_force_env, qmmm_env, qmmmx_env, eip_env, pwdft_env, force_env_section, &
992 mixed_env, embed_env, nnp_env, ipi_env)
1002 POINTER :: sub_force_env
1010 TYPE(
nnp_type),
OPTIONAL,
POINTER :: nnp_env
1013 ALLOCATE (force_env)
1014 NULLIFY (force_env%fist_env, force_env%qs_env, &
1015 force_env%para_env, force_env%globenv, &
1016 force_env%meta_env, force_env%sub_force_env, &
1017 force_env%qmmm_env, force_env%qmmmx_env, force_env%fp_env, &
1018 force_env%force_env_section, force_env%eip_env, force_env%mixed_env, &
1019 force_env%embed_env, force_env%pwdft_env, force_env%nnp_env, &
1020 force_env%root_section)
1021 last_force_env_id = last_force_env_id + 1
1022 force_env%ref_count = 1
1023 force_env%in_use = 0
1024 force_env%additional_potential = 0.0_dp
1026 force_env%globenv => globenv
1029 force_env%root_section => root_section
1032 force_env%para_env => para_env
1033 CALL force_env%para_env%retain()
1036 force_env%force_env_section => force_env_section
1038 IF (
PRESENT(fist_env))
THEN
1039 cpassert(
ASSOCIATED(fist_env))
1040 cpassert(force_env%in_use == 0)
1042 force_env%fist_env => fist_env
1044 IF (
PRESENT(eip_env))
THEN
1045 cpassert(
ASSOCIATED(eip_env))
1046 cpassert(force_env%in_use == 0)
1048 force_env%eip_env => eip_env
1050 IF (
PRESENT(pwdft_env))
THEN
1051 cpassert(
ASSOCIATED(pwdft_env))
1052 cpassert(force_env%in_use == 0)
1054 force_env%pwdft_env => pwdft_env
1056 IF (
PRESENT(qs_env))
THEN
1057 cpassert(
ASSOCIATED(qs_env))
1058 cpassert(force_env%in_use == 0)
1060 force_env%qs_env => qs_env
1062 IF (
PRESENT(qmmm_env))
THEN
1063 cpassert(
ASSOCIATED(qmmm_env))
1064 cpassert(force_env%in_use == 0)
1066 force_env%qmmm_env => qmmm_env
1068 IF (
PRESENT(qmmmx_env))
THEN
1069 cpassert(
ASSOCIATED(qmmmx_env))
1070 cpassert(force_env%in_use == 0)
1072 force_env%qmmmx_env => qmmmx_env
1074 IF (
PRESENT(mixed_env))
THEN
1075 cpassert(
ASSOCIATED(mixed_env))
1076 cpassert(force_env%in_use == 0)
1078 force_env%mixed_env => mixed_env
1080 IF (
PRESENT(embed_env))
THEN
1081 cpassert(
ASSOCIATED(embed_env))
1082 cpassert(force_env%in_use == 0)
1084 force_env%embed_env => embed_env
1086 IF (
PRESENT(nnp_env))
THEN
1087 cpassert(
ASSOCIATED(nnp_env))
1088 cpassert(force_env%in_use == 0)
1090 force_env%nnp_env => nnp_env
1092 IF (
PRESENT(ipi_env))
THEN
1093 cpassert(
ASSOCIATED(ipi_env))
1094 cpassert(force_env%in_use == 0)
1096 force_env%ipi_env => ipi_env
1098 cpassert(force_env%in_use /= 0)
1100 IF (
PRESENT(sub_force_env))
THEN
1101 force_env%sub_force_env => sub_force_env
1104 IF (
PRESENT(meta_env))
THEN
1105 force_env%meta_env => meta_env
1107 NULLIFY (force_env%meta_env)
1128 SUBROUTINE mixed_energy_forces(force_env, calculate_forces)
1131 LOGICAL,
INTENT(IN) :: calculate_forces
1133 CHARACTER(LEN=default_path_length) :: coupling_function
1134 CHARACTER(LEN=default_string_length) :: def_error, description, this_error
1135 INTEGER :: iforce_eval, iparticle, istate(2), &
1136 jparticle, mixing_type, my_group, &
1137 natom, nforce_eval, source, unit_nr
1138 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms, itmplist, map_index
1139 LOGICAL :: dip_exists
1140 REAL(kind=
dp) :: coupling_parameter, dedf, der_1, der_2, &
1141 dx, energy, err, lambda, lerr, &
1142 restraint_strength, restraint_target, &
1144 REAL(kind=
dp),
DIMENSION(3) :: dip_mix
1145 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1157 mapping_section, mixed_section, &
1160 TYPE(
virial_type),
POINTER :: loc_virial, virial_mix
1163 cpassert(
ASSOCIATED(force_env))
1166 subsys=subsys_mix, &
1167 force_env_section=force_env_section, &
1168 root_section=root_section, &
1171 particles=particles_mix, &
1172 virial=virial_mix, &
1173 results=results_mix)
1174 NULLIFY (map_index, glob_natoms, global_forces, itmplist)
1176 nforce_eval =
SIZE(force_env%sub_force_env)
1180 ALLOCATE (subsystems(nforce_eval))
1181 ALLOCATE (particles(nforce_eval))
1183 ALLOCATE (global_forces(nforce_eval))
1184 ALLOCATE (energies(nforce_eval))
1185 ALLOCATE (glob_natoms(nforce_eval))
1186 ALLOCATE (virials(nforce_eval))
1187 ALLOCATE (results(nforce_eval))
1194 IF (.NOT. force_env%mixed_env%do_mixed_cdft)
THEN
1195 DO iforce_eval = 1, nforce_eval
1196 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1197 NULLIFY (results(iforce_eval)%results, virials(iforce_eval)%virial)
1198 ALLOCATE (virials(iforce_eval)%virial)
1200 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1202 my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
1203 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
1209 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1210 subsys=subsystems(iforce_eval)%subsys)
1213 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_mix)
1217 particles=particles(iforce_eval)%list)
1220 natom =
SIZE(particles(iforce_eval)%list%els)
1226 DO iparticle = 1, natom
1227 jparticle = map_index(iparticle)
1228 particles(iforce_eval)%list%els(iparticle)%r = particles_mix%els(jparticle)%r
1233 calc_force=calculate_forces, &
1234 skip_external_control=.true.)
1237 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1238 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1239 potential_energy=energy)
1241 virial=loc_virial, results=loc_results)
1242 energies(iforce_eval) = energy
1243 glob_natoms(iforce_eval) = natom
1244 virials(iforce_eval)%virial = loc_virial
1248 IF (
ASSOCIATED(map_index))
THEN
1249 DEALLOCATE (map_index)
1254 CALL mixed_cdft_energy_forces(force_env, calculate_forces, particles, energies, &
1255 glob_natoms, virials, results)
1258 CALL force_env%para_env%sync()
1260 CALL mixed_cdft_post_energy_forces(force_env)
1262 CALL force_env%para_env%sum(energies)
1263 CALL force_env%para_env%sum(glob_natoms)
1265 DO iforce_eval = 1, nforce_eval
1266 ALLOCATE (global_forces(iforce_eval)%forces(3, glob_natoms(iforce_eval)))
1267 global_forces(iforce_eval)%forces = 0.0_dp
1268 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env))
THEN
1269 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1271 DO iparticle = 1, glob_natoms(iforce_eval)
1272 global_forces(iforce_eval)%forces(:, iparticle) = &
1273 particles(iforce_eval)%list%els(iparticle)%f
1277 CALL force_env%para_env%sum(global_forces(iforce_eval)%forces)
1279 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_total)
1280 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_kinetic)
1281 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_virial)
1282 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_xc)
1283 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_fock_4c)
1284 CALL force_env%para_env%sum(virials(iforce_eval)%virial%pv_constraint)
1287 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env))
THEN
1288 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1289 source = force_env%para_env%mepos
1292 CALL force_env%para_env%sum(source)
1296 force_env%mixed_env%energies = energies
1299 mixed_energy=mixed_energy)
1303 DO iparticle = 1,
SIZE(particles_mix%els)
1304 particles_mix%els(iparticle)%f(:) = 0.0_dp
1308 SELECT CASE (mixing_type)
1311 cpassert(nforce_eval == 2)
1313 mixed_energy%pot = lambda*energies(1) + (1.0_dp - lambda)*energies(2)
1315 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1316 lambda, 1, nforce_eval, map_index, mapping_section, .true.)
1317 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1318 (1.0_dp - lambda), 2, nforce_eval, map_index, mapping_section, .false.)
1321 cpassert(nforce_eval == 2)
1322 IF (energies(1) < energies(2))
THEN
1323 mixed_energy%pot = energies(1)
1324 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1325 1.0_dp, 1, nforce_eval, map_index, mapping_section, .true.)
1327 mixed_energy%pot = energies(2)
1328 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1329 1.0_dp, 2, nforce_eval, map_index, mapping_section, .true.)
1333 cpassert(nforce_eval == 2)
1335 r_val=coupling_parameter)
1336 sd = sqrt((energies(1) - energies(2))**2 + 4.0_dp*coupling_parameter**2)
1337 der_1 = (1.0_dp - (1.0_dp/(2.0_dp*sd))*2.0_dp*(energies(1) - energies(2)))/2.0_dp
1338 der_2 = (1.0_dp + (1.0_dp/(2.0_dp*sd))*2.0_dp*(energies(1) - energies(2)))/2.0_dp
1339 mixed_energy%pot = (energies(1) + energies(2) - sd)/2.0_dp
1341 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1342 der_1, 1, nforce_eval, map_index, mapping_section, .true.)
1343 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1344 der_2, 2, nforce_eval, map_index, mapping_section, .false.)
1347 cpassert(nforce_eval == 2)
1349 r_val=restraint_target)
1351 r_val=restraint_strength)
1352 mixed_energy%pot = energies(1) + restraint_strength*(energies(1) - energies(2) - restraint_target)**2
1353 der_2 = -2.0_dp*restraint_strength*(energies(1) - energies(2) - restraint_target)
1354 der_1 = 1.0_dp - der_2
1356 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1357 der_1, 1, nforce_eval, map_index, mapping_section, .true.)
1358 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1359 der_2, 2, nforce_eval, map_index, mapping_section, .false.)
1363 CALL get_generic_info(gen_section,
"MIXING_FUNCTION", coupling_function, force_env%mixed_env%par, &
1364 force_env%mixed_env%val, energies)
1366 CALL parsef(1, trim(coupling_function), force_env%mixed_env%par)
1368 mixed_energy%pot =
evalf(1, force_env%mixed_env%val)
1372 DO iforce_eval = 1, nforce_eval
1375 dedf =
evalfd(1, iforce_eval, force_env%mixed_env%val, dx, err)
1376 IF (abs(err) > lerr)
THEN
1377 WRITE (this_error,
"(A,G12.6,A)")
"(", err,
")"
1378 WRITE (def_error,
"(A,G12.6,A)")
"(", lerr,
")"
1381 CALL cp_warn(__location__, &
1382 'ASSERTION (cond) failed at line '//
cp_to_string(__line__)// &
1383 ' Error '//trim(this_error)//
' in computing numerical derivatives larger then'// &
1384 trim(def_error)//
' .')
1387 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1388 dedf, iforce_eval, nforce_eval, map_index, mapping_section, .false.)
1389 force_env%mixed_env%val(iforce_eval) = energies(iforce_eval)
1392 force_env%mixed_env%dx = dx
1393 force_env%mixed_env%lerr = lerr
1394 force_env%mixed_env%coupling_function = trim(coupling_function)
1401 IF (
SIZE(itmplist) /= 2)
THEN
1402 CALL cp_abort(__location__, &
1403 "Keyword FORCE_STATES takes exactly two input values.")
1405 IF (any(itmplist < 0))
THEN
1406 cpabort(
"Invalid force_eval index.")
1409 IF (istate(1) > nforce_eval .OR. istate(2) > nforce_eval)
THEN
1410 cpabort(
"Invalid force_eval index.")
1412 mixed_energy%pot = lambda*energies(istate(1)) + (1.0_dp - lambda)*energies(istate(2))
1414 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1415 lambda, istate(1), nforce_eval, map_index, mapping_section, .true.)
1416 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1417 (1.0_dp - lambda), istate(2), nforce_eval, map_index, mapping_section, .false.)
1419 cpabort(
"Unknown mixing type for mixed_energy_forces")
1422 DO iforce_eval = 1, nforce_eval
1423 DEALLOCATE (global_forces(iforce_eval)%forces)
1424 IF (
ASSOCIATED(virials(iforce_eval)%virial))
DEALLOCATE (virials(iforce_eval)%virial)
1427 DEALLOCATE (global_forces)
1428 DEALLOCATE (subsystems)
1429 DEALLOCATE (particles)
1430 DEALLOCATE (energies)
1431 DEALLOCATE (glob_natoms)
1432 DEALLOCATE (virials)
1433 DEALLOCATE (results)
1436 extension=
".data", middle_name=
"MIXED_DIPOLE", log_filename=.false.)
1437 IF (unit_nr > 0)
THEN
1438 description =
'[DIPOLE]'
1439 dip_exists =
test_for_result(results=results_mix, description=description)
1440 IF (dip_exists)
THEN
1441 CALL get_results(results=results_mix, description=description, values=dip_mix)
1442 WRITE (unit_nr,
'(/,1X,A,T48,3F21.16)')
"MIXED ENV| DIPOLE ( A.U.)|", dip_mix
1443 WRITE (unit_nr,
'( 1X,A,T48,3F21.16)')
"MIXED ENV| DIPOLE (Debye)|", dip_mix*
debye
1445 WRITE (unit_nr, *)
"NO FORCE_EVAL section calculated the dipole"
1449 END SUBROUTINE mixed_energy_forces
1464 SUBROUTINE mixed_cdft_energy_forces(force_env, calculate_forces, particles, energies, &
1465 glob_natoms, virials, results)
1467 LOGICAL,
INTENT(IN) :: calculate_forces
1469 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1470 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms
1474 INTEGER :: iforce_eval, iparticle, jparticle, &
1475 my_group, natom, nforce_eval
1476 INTEGER,
DIMENSION(:),
POINTER :: map_index
1477 REAL(kind=
dp) :: energy
1485 mixed_section, root_section
1486 TYPE(
virial_type),
POINTER :: loc_virial, virial_mix
1489 cpassert(
ASSOCIATED(force_env))
1492 subsys=subsys_mix, &
1493 force_env_section=force_env_section, &
1494 root_section=root_section, &
1497 particles=particles_mix, &
1498 virial=virial_mix, &
1499 results=results_mix)
1501 nforce_eval =
SIZE(force_env%sub_force_env)
1504 ALLOCATE (subsystems(nforce_eval))
1505 DO iforce_eval = 1, nforce_eval
1506 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1507 NULLIFY (results(iforce_eval)%results, virials(iforce_eval)%virial)
1508 ALLOCATE (virials(iforce_eval)%virial)
1510 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1512 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1513 subsys=subsystems(iforce_eval)%subsys)
1516 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_mix)
1520 particles=particles(iforce_eval)%list)
1523 natom =
SIZE(particles(iforce_eval)%list%els)
1525 IF (
ASSOCIATED(map_index))
THEN
1526 DEALLOCATE (map_index)
1532 DO iparticle = 1, natom
1533 jparticle = map_index(iparticle)
1534 particles(iforce_eval)%list%els(iparticle)%r = particles_mix%els(jparticle)%r
1537 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1545 DO iforce_eval = 1, nforce_eval
1546 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1548 IF (force_env%mixed_env%cdft_control%run_type ==
mixed_cdft_serial .AND. iforce_eval >= 2)
THEN
1549 my_logger => force_env%mixed_env%cdft_control%sub_logger(iforce_eval - 1)%p
1551 my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
1552 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
1561 calc_force=calculate_forces, &
1562 skip_external_control=.true.)
1564 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1565 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1566 potential_energy=energy)
1568 virial=loc_virial, results=loc_results)
1569 energies(iforce_eval) = energy
1570 glob_natoms(iforce_eval) = natom
1571 virials(iforce_eval)%virial = loc_virial
1575 IF (
ASSOCIATED(map_index))
THEN
1576 DEALLOCATE (map_index)
1580 DEALLOCATE (subsystems)
1582 END SUBROUTINE mixed_cdft_energy_forces
1592 SUBROUTINE mixed_cdft_post_energy_forces(force_env)
1595 INTEGER :: iforce_eval, nforce_eval, nvar
1599 cpassert(
ASSOCIATED(force_env))
1600 NULLIFY (qs_env, dft_control)
1601 IF (force_env%mixed_env%do_mixed_cdft)
THEN
1602 nforce_eval =
SIZE(force_env%sub_force_env)
1603 nvar = force_env%mixed_env%cdft_control%nconstraint
1605 IF (.NOT.
ASSOCIATED(force_env%mixed_env%strength))
THEN
1606 ALLOCATE (force_env%mixed_env%strength(nforce_eval, nvar))
1608 force_env%mixed_env%strength = 0.0_dp
1609 DO iforce_eval = 1, nforce_eval
1610 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1611 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1612 qs_env => force_env%sub_force_env(iforce_eval)%force_env%qmmm_env%qs_env
1614 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, qs_env=qs_env)
1616 CALL get_qs_env(qs_env, dft_control=dft_control)
1617 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1618 force_env%mixed_env%strength(iforce_eval, :) = dft_control%qs_control%cdft_control%strength(:)
1621 CALL force_env%para_env%sum(force_env%mixed_env%strength)
1623 IF (force_env%mixed_env%do_mixed_et)
THEN
1624 IF (
modulo(force_env%mixed_env%cdft_control%sim_step, force_env%mixed_env%et_freq) == 0)
THEN
1630 END SUBROUTINE mixed_cdft_post_energy_forces
1637 SUBROUTINE embed_energy(force_env)
1641 INTEGER :: iforce_eval, iparticle, jparticle, &
1642 my_group, natom, nforce_eval
1643 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms, map_index
1644 LOGICAL :: converged_embed
1645 REAL(kind=
dp) :: energy
1646 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1660 mapping_section, root_section
1663 cpassert(
ASSOCIATED(force_env))
1666 subsys=subsys_embed, &
1667 force_env_section=force_env_section, &
1668 root_section=root_section, &
1671 particles=particles_embed, &
1672 results=results_embed)
1673 NULLIFY (map_index, glob_natoms)
1675 nforce_eval =
SIZE(force_env%sub_force_env)
1679 ALLOCATE (subsystems(nforce_eval))
1680 ALLOCATE (particles(nforce_eval))
1682 ALLOCATE (energies(nforce_eval))
1683 ALLOCATE (glob_natoms(nforce_eval))
1684 ALLOCATE (results(nforce_eval))
1688 DO iforce_eval = 1, nforce_eval
1689 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1690 NULLIFY (results(iforce_eval)%results)
1692 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1694 my_group = force_env%embed_env%group_distribution(force_env%para_env%mepos)
1695 my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
1701 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1702 subsys=subsystems(iforce_eval)%subsys)
1706 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env%qs_env))
THEN
1707 NULLIFY (dft_control)
1708 CALL get_qs_env(force_env%sub_force_env(iforce_eval)%force_env%qs_env, dft_control=dft_control)
1709 IF (dft_control%qs_control%ref_embed_subsys)
THEN
1710 IF (iforce_eval == 2) cpabort(
"Density importing force_eval can't be the first.")
1715 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_embed)
1719 particles=particles(iforce_eval)%list)
1722 natom =
SIZE(particles(iforce_eval)%list%els)
1728 DO iparticle = 1, natom
1729 jparticle = map_index(iparticle)
1730 particles(iforce_eval)%list%els(iparticle)%r = particles_embed%els(jparticle)%r
1735 calc_force=.false., &
1736 skip_external_control=.true.)
1739 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env%qs_env))
THEN
1740 NULLIFY (dft_control)
1741 CALL get_qs_env(force_env%sub_force_env(iforce_eval)%force_env%qs_env, dft_control=dft_control)
1742 IF (dft_control%qs_control%ref_embed_subsys)
THEN
1744 CALL dft_embedding(force_env, iforce_eval, energies, converged_embed)
1745 IF (.NOT. converged_embed) cpabort(
"Embedding potential optimization not converged.")
1748 IF (dft_control%qs_control%high_level_embed_subsys)
THEN
1749 CALL get_qs_env(qs_env=force_env%sub_force_env(iforce_eval)%force_env%qs_env, &
1750 embed_pot=embed_pot, spin_embed_pot=spin_embed_pot, pw_env=pw_env)
1751 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1752 CALL auxbas_pw_pool%give_back_pw(embed_pot)
1753 IF (
ASSOCIATED(embed_pot))
THEN
1754 CALL embed_pot%release()
1755 DEALLOCATE (embed_pot)
1757 IF (
ASSOCIATED(spin_embed_pot))
THEN
1758 CALL auxbas_pw_pool%give_back_pw(spin_embed_pot)
1759 CALL spin_embed_pot%release()
1760 DEALLOCATE (spin_embed_pot)
1766 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1767 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1768 potential_energy=energy)
1770 results=loc_results)
1771 energies(iforce_eval) = energy
1772 glob_natoms(iforce_eval) = natom
1776 IF (
ASSOCIATED(map_index))
THEN
1777 DEALLOCATE (map_index)
1783 CALL force_env%para_env%sync()
1785 CALL force_env%para_env%sum(energies)
1786 CALL force_env%para_env%sum(glob_natoms)
1788 force_env%embed_env%energies = energies
1791 DO iparticle = 1,
SIZE(particles_embed%els)
1792 particles_embed%els(iparticle)%f(:) = 0.0_dp
1796 force_env%embed_env%pot_energy = energies(3) + energies(4) - energies(2)
1799 DO iforce_eval = 1, nforce_eval
1802 DEALLOCATE (subsystems)
1803 DEALLOCATE (particles)
1804 DEALLOCATE (energies)
1805 DEALLOCATE (glob_natoms)
1806 DEALLOCATE (results)
1808 END SUBROUTINE embed_energy
1817 SUBROUTINE dft_embedding(force_env, ref_subsys_number, energies, converged_embed)
1819 INTEGER :: ref_subsys_number
1820 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1821 LOGICAL :: converged_embed
1823 INTEGER :: embed_method
1828 force_env_section=force_env_section)
1832 SELECT CASE (embed_method)
1835 CALL dfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1838 CALL dmfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1841 END SUBROUTINE dft_embedding
1850 SUBROUTINE dfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1852 INTEGER :: ref_subsys_number
1853 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1854 LOGICAL :: converged_embed
1856 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dfet_embedding'
1858 INTEGER :: cluster_subsys_num, handle, &
1859 i_force_eval, i_iter, i_spin, &
1860 nforce_eval, nspins, nspins_subsys, &
1862 REAL(kind=
dp) :: cluster_energy
1863 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rhs
1870 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_ref, rho_r_subsys
1872 spin_embed_pot, spin_embed_pot_subsys
1876 force_env_section, input, &
1877 mapping_section, opt_embed_section
1879 CALL timeset(routinen, handle)
1884 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
1889 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
1892 NULLIFY (dft_section, input, opt_embed_section)
1893 NULLIFY (energy, dft_control)
1895 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
1896 pw_env=pw_env, dft_control=dft_control, rho=rho, energy=energy, &
1898 nspins = dft_control%nspins
1904 CALL qs_rho_get(rho_struct=rho, rho_r=rho_r_ref)
1907 CALL understand_spin_states(force_env, ref_subsys_number, opt_embed%change_spin, opt_embed%open_shell_embed, &
1908 opt_embed%all_nspins)
1911 CALL prepare_embed_opt(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, opt_embed, &
1915 CALL init_embed_pot(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, embed_pot, &
1916 opt_embed%add_const_pot, opt_embed%Fermi_Amaldi, opt_embed%const_pot, &
1917 opt_embed%open_shell_embed, spin_embed_pot, &
1918 opt_embed%pot_diff, opt_embed%Coulomb_guess, opt_embed%grid_opt)
1921 IF (opt_embed%read_embed_pot .OR. opt_embed%read_embed_pot_cube)
CALL read_embed_pot( &
1922 force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, embed_pot, spin_embed_pot, &
1923 opt_embed_section, opt_embed)
1926 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1927 CALL auxbas_pw_pool%create_pw(diff_rho_r)
1929 IF (opt_embed%open_shell_embed)
THEN
1930 CALL auxbas_pw_pool%create_pw(diff_rho_spin)
1935 DO i_spin = 1, nspins
1936 CALL pw_axpy(rho_r_ref(i_spin), diff_rho_r, -1.0_dp)
1938 IF (opt_embed%open_shell_embed)
THEN
1939 IF (nspins == 2)
THEN
1940 CALL pw_axpy(rho_r_ref(1), diff_rho_spin, -1.0_dp)
1941 CALL pw_axpy(rho_r_ref(2), diff_rho_spin, 1.0_dp)
1945 DO i_force_eval = 1, ref_subsys_number - 1
1946 NULLIFY (subsys_rho, rho_r_subsys, dft_control)
1947 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, rho=subsys_rho, energy=energy, &
1948 dft_control=dft_control)
1949 nspins_subsys = dft_control%nspins
1951 CALL qs_rho_get(rho_struct=subsys_rho, rho_r=rho_r_subsys)
1952 DO i_spin = 1, nspins_subsys
1953 CALL pw_axpy(rho_r_subsys(i_spin), diff_rho_r, allow_noncompatible_grids=.true.)
1955 IF (opt_embed%open_shell_embed)
THEN
1956 IF (nspins_subsys == 2)
THEN
1958 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
1959 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1960 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1963 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1964 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1971 CALL print_rho_diff(diff_rho_r, 0, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
1972 IF (opt_embed%open_shell_embed)
THEN
1973 CALL print_rho_spin_diff(diff_rho_spin, 0, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
1977 IF (opt_embed%Coulomb_guess)
THEN
1979 nforce_eval =
SIZE(force_env%sub_force_env)
1981 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, rhs=rhs)
1984 force_env_section=force_env_section)
1988 DO i_force_eval = 1, ref_subsys_number - 1
1989 IF (i_force_eval == 1)
THEN
1991 force_env%sub_force_env(i_force_eval)%force_env%qs_env, nforce_eval, i_force_eval, opt_embed%eta)
1993 CALL coulomb_guess(opt_embed%pot_diff, rhs, mapping_section, &
1994 force_env%sub_force_env(i_force_eval)%force_env%qs_env, nforce_eval, i_force_eval, opt_embed%eta)
1997 CALL pw_axpy(opt_embed%pot_diff, embed_pot)
1998 IF (.NOT. opt_embed%grid_opt)
CALL pw_copy(embed_pot, opt_embed%const_pot)
2003 IF (opt_embed%diff_guess)
THEN
2004 CALL pw_copy(diff_rho_r, embed_pot)
2005 IF (.NOT. opt_embed%grid_opt)
CALL pw_copy(embed_pot, opt_embed%const_pot)
2007 IF (opt_embed%open_shell_embed)
CALL pw_copy(diff_rho_spin, spin_embed_pot)
2011 DO i_iter = 1, opt_embed%n_iter
2012 opt_embed%i_iter = i_iter
2016 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, dft_control=dft_control)
2017 nspins = dft_control%nspins
2018 DO i_spin = 1, nspins
2019 CALL pw_axpy(rho_r_ref(i_spin), diff_rho_r, -1.0_dp)
2021 IF (opt_embed%open_shell_embed)
THEN
2023 IF (nspins == 2)
THEN
2024 CALL pw_axpy(rho_r_ref(1), diff_rho_spin, -1.0_dp)
2025 CALL pw_axpy(rho_r_ref(2), diff_rho_spin, 1.0_dp)
2029 DO i_force_eval = 1, ref_subsys_number - 1
2030 NULLIFY (dft_control)
2031 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, dft_control=dft_control)
2032 nspins_subsys = dft_control%nspins
2034 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
2038 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2039 opt_embed%open_shell_embed, .true.)
2042 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2043 opt_embed%open_shell_embed, .false.)
2047 dft_control%apply_embed_pot = .true.
2050 CALL set_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, embed_pot=embed_pot_subsys)
2051 IF ((opt_embed%open_shell_embed) .AND. (nspins_subsys == 2))
THEN
2052 CALL set_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2053 spin_embed_pot=spin_embed_pot_subsys)
2057 CALL get_prev_density(opt_embed, force_env%sub_force_env(i_force_eval)%force_env, i_force_eval)
2061 calc_force=.false., &
2062 skip_external_control=.true.)
2064 CALL get_max_subsys_diff(opt_embed, force_env%sub_force_env(i_force_eval)%force_env, i_force_eval)
2067 NULLIFY (rho_r_subsys, energy)
2069 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, rho=subsys_rho, &
2071 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) + energy%total
2074 IF (dft_control%qs_control%cluster_embed_subsys)
THEN
2075 cluster_subsys_num = i_force_eval
2076 cluster_energy = energy%total
2080 CALL qs_rho_get(rho_struct=subsys_rho, rho_r=rho_r_subsys)
2081 DO i_spin = 1, nspins_subsys
2082 CALL pw_axpy(rho_r_subsys(i_spin), diff_rho_r, allow_noncompatible_grids=.true.)
2084 IF (opt_embed%open_shell_embed)
THEN
2085 IF (nspins_subsys == 2)
THEN
2087 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
2088 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
2089 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
2092 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
2093 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
2099 CALL embed_pot_subsys%release()
2100 DEALLOCATE (embed_pot_subsys)
2101 IF (opt_embed%open_shell_embed)
THEN
2102 CALL spin_embed_pot_subsys%release()
2103 DEALLOCATE (spin_embed_pot_subsys)
2110 opt_embed%dimen_aux, opt_embed%embed_pot_coef, embed_pot, i_iter, &
2111 spin_embed_pot, opt_embed%open_shell_embed, opt_embed%grid_opt, .false.)
2113 embed_pot, spin_embed_pot, i_iter, opt_embed%open_shell_embed, .false., &
2114 force_env%sub_force_env(cluster_subsys_num)%force_env%qs_env)
2117 DO i_spin = 1, nspins
2118 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) -
pw_integral_ab(embed_pot, rho_r_ref(i_spin))
2121 IF (opt_embed%open_shell_embed)
THEN
2123 IF (nspins == 2)
THEN
2124 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) &
2130 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) + opt_embed%reg_term
2135 IF (opt_embed%converged)
EXIT
2138 IF ((i_iter > 1) .AND. (.NOT. opt_embed%steep_desc))
CALL step_control(opt_embed)
2141 CALL print_rho_diff(diff_rho_r, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
2142 IF (opt_embed%open_shell_embed)
THEN
2143 CALL print_rho_spin_diff(diff_rho_spin, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
2148 IF (opt_embed%accept_step .AND. (.NOT. opt_embed%grid_opt))
THEN
2150 diff_rho_r, diff_rho_spin, opt_embed)
2153 CALL opt_embed_step(diff_rho_r, diff_rho_spin, opt_embed, embed_pot, spin_embed_pot, rho_r_ref, &
2154 force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2160 opt_embed%dimen_aux, opt_embed%embed_pot_coef, embed_pot, i_iter, &
2161 spin_embed_pot, opt_embed%open_shell_embed, opt_embed%grid_opt, .true.)
2163 embed_pot, spin_embed_pot, i_iter, opt_embed%open_shell_embed, .true., &
2164 force_env%sub_force_env(cluster_subsys_num)%force_env%qs_env)
2168 IF (opt_embed%open_shell_embed)
THEN
2169 CALL print_rho_spin_diff(diff_rho_spin, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .true.)
2173 CALL diff_rho_r%release()
2174 IF (opt_embed%open_shell_embed)
THEN
2175 CALL diff_rho_spin%release()
2179 "PRINT%PROGRAM_RUN_INFO")
2182 IF (opt_embed%converged)
THEN
2183 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, dft_control=dft_control, &
2185 nspins_subsys = dft_control%nspins
2186 dft_control%apply_embed_pot = .true.
2189 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2190 opt_embed%open_shell_embed, opt_embed%change_spin)
2192 IF (opt_embed%Coulomb_guess)
THEN
2193 CALL pw_axpy(opt_embed%pot_diff, embed_pot_subsys, -1.0_dp, allow_noncompatible_grids=.true.)
2196 CALL set_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, embed_pot=embed_pot_subsys)
2198 IF ((opt_embed%open_shell_embed) .AND. (nspins_subsys == 2))
THEN
2199 CALL set_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, &
2200 spin_embed_pot=spin_embed_pot_subsys)
2204 IF (force_env%sub_force_env(cluster_subsys_num)%force_env%para_env%is_source())
THEN
2205 energies(cluster_subsys_num) = cluster_energy
2213 CALL embed_pot%release()
2214 DEALLOCATE (embed_pot)
2215 IF (opt_embed%open_shell_embed)
THEN
2216 CALL spin_embed_pot%release()
2217 DEALLOCATE (spin_embed_pot)
2220 converged_embed = opt_embed%converged
2222 CALL timestop(handle)
2224 END SUBROUTINE dfet_embedding
2234 SUBROUTINE dmfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
2236 INTEGER :: ref_subsys_number
2237 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
2238 LOGICAL :: converged_embed
2240 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dmfet_embedding'
2242 INTEGER :: cluster_subsys_num, handle, &
2243 i_force_eval, i_iter, output_unit
2244 LOGICAL :: subsys_open_shell
2245 REAL(kind=
dp) :: cluster_energy
2253 CALL timeset(routinen, handle)
2255 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2261 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
2264 NULLIFY (dft_section, input, opt_dmfet_section)
2267 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2268 energy=energy, input=input)
2275 CALL understand_spin_states(force_env, ref_subsys_number, opt_dmfet%change_spin, opt_dmfet%open_shell_embed, &
2276 opt_dmfet%all_nspins)
2279 CALL prepare_dmfet_opt(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2280 opt_dmfet, opt_dmfet_section)
2283 subsys_open_shell =
subsys_spin(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2284 CALL build_full_dm(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2285 opt_dmfet%dm_total, subsys_open_shell, opt_dmfet%open_shell_embed, opt_dmfet%dm_total_beta)
2290 opt_dmfet%dm_diff_beta, para_env)
2292 DO i_force_eval = 1, ref_subsys_number - 1
2295 subsys_open_shell =
subsys_spin(force_env%sub_force_env(i_force_eval)%force_env%qs_env)
2297 CALL build_full_dm(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2298 opt_dmfet%dm_subsys, subsys_open_shell, opt_dmfet%open_shell_embed, &
2299 opt_dmfet%dm_subsys_beta)
2303 IF (opt_dmfet%open_shell_embed)
CALL cp_fm_scale_and_add(-1.0_dp, opt_dmfet%dm_diff_beta, &
2304 1.0_dp, opt_dmfet%dm_subsys_beta)
2309 DO i_iter = 1, opt_dmfet%n_iter
2311 opt_dmfet%i_iter = i_iter
2317 opt_dmfet%dm_diff_beta, para_env)
2320 DO i_force_eval = 1, ref_subsys_number - 1
2323 NULLIFY (dft_control)
2324 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, dft_control=dft_control)
2325 dft_control%apply_dmfet_pot = .true.
2329 calc_force=.false., &
2330 skip_external_control=.true.)
2335 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, energy=energy)
2336 opt_dmfet%w_func(i_iter) = opt_dmfet%w_func(i_iter) + energy%total
2339 IF (dft_control%qs_control%cluster_embed_subsys)
THEN
2340 cluster_subsys_num = i_force_eval
2341 cluster_energy = energy%total
2345 subsys_open_shell =
subsys_spin(force_env%sub_force_env(i_force_eval)%force_env%qs_env)
2347 CALL build_full_dm(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2348 opt_dmfet%dm_subsys, subsys_open_shell, opt_dmfet%open_shell_embed, &
2349 opt_dmfet%dm_subsys_beta)
2351 IF (opt_dmfet%open_shell_embed)
THEN
2353 IF ((i_force_eval == 2) .AND. (opt_dmfet%change_spin))
THEN
2358 CALL cp_fm_scale_and_add(-1.0_dp, opt_dmfet%dm_diff_beta, 1.0_dp, opt_dmfet%dm_subsys_beta)
2366 CALL check_dmfet(opt_dmfet, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2371 IF (force_env%sub_force_env(cluster_subsys_num)%force_env%para_env%is_source())
THEN
2372 energies(cluster_subsys_num) = cluster_energy
2377 converged_embed = .false.
2379 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, matrix_vhxc, 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