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 IF (
ALLOCATED(force_env%mixed_env%energies))
THEN
1297 DEALLOCATE (force_env%mixed_env%energies)
1299 ALLOCATE (force_env%mixed_env%energies(nforce_eval))
1300 force_env%mixed_env%energies(:) = energies(:)
1303 mixed_energy=mixed_energy)
1307 DO iparticle = 1,
SIZE(particles_mix%els)
1308 particles_mix%els(iparticle)%f(:) = 0.0_dp
1312 SELECT CASE (mixing_type)
1315 cpassert(nforce_eval == 2)
1317 mixed_energy%pot = lambda*energies(1) + (1.0_dp - lambda)*energies(2)
1319 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1320 lambda, 1, nforce_eval, map_index, mapping_section, .true.)
1321 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1322 (1.0_dp - lambda), 2, nforce_eval, map_index, mapping_section, .false.)
1325 cpassert(nforce_eval == 2)
1326 IF (energies(1) < energies(2))
THEN
1327 mixed_energy%pot = energies(1)
1328 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1329 1.0_dp, 1, nforce_eval, map_index, mapping_section, .true.)
1331 mixed_energy%pot = energies(2)
1332 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1333 1.0_dp, 2, nforce_eval, map_index, mapping_section, .true.)
1337 cpassert(nforce_eval == 2)
1339 r_val=coupling_parameter)
1340 sd = sqrt((energies(1) - energies(2))**2 + 4.0_dp*coupling_parameter**2)
1341 der_1 = (1.0_dp - (1.0_dp/(2.0_dp*sd))*2.0_dp*(energies(1) - energies(2)))/2.0_dp
1342 der_2 = (1.0_dp + (1.0_dp/(2.0_dp*sd))*2.0_dp*(energies(1) - energies(2)))/2.0_dp
1343 mixed_energy%pot = (energies(1) + energies(2) - sd)/2.0_dp
1345 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1346 der_1, 1, nforce_eval, map_index, mapping_section, .true.)
1347 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1348 der_2, 2, nforce_eval, map_index, mapping_section, .false.)
1351 cpassert(nforce_eval == 2)
1353 r_val=restraint_target)
1355 r_val=restraint_strength)
1356 mixed_energy%pot = energies(1) + restraint_strength*(energies(1) - energies(2) - restraint_target)**2
1357 der_2 = -2.0_dp*restraint_strength*(energies(1) - energies(2) - restraint_target)
1358 der_1 = 1.0_dp - der_2
1360 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1361 der_1, 1, nforce_eval, map_index, mapping_section, .true.)
1362 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1363 der_2, 2, nforce_eval, map_index, mapping_section, .false.)
1368 force_env%mixed_env%par, force_env%mixed_env%val, &
1369 var_values=energies, dx=dx, error_limit=lerr)
1371 CALL parsef(1, trim(coupling_function), force_env%mixed_env%par)
1373 mixed_energy%pot =
evalf(1, force_env%mixed_env%val)
1377 DO iforce_eval = 1, nforce_eval
1378 dedf =
evalfd(1, iforce_eval, force_env%mixed_env%val, dx, err)
1379 IF (abs(err) > lerr)
THEN
1380 WRITE (this_error,
"(A,G12.6,A)")
"(", err,
")"
1381 WRITE (def_error,
"(A,G12.6,A)")
"(", lerr,
")"
1384 CALL cp_warn(__location__, &
1385 'ASSERTION (cond) failed at line '//
cp_to_string(__line__)// &
1386 ' Error '//trim(this_error)//
' in computing numerical derivatives larger than'// &
1387 trim(def_error)//
' .')
1390 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1391 dedf, iforce_eval, nforce_eval, map_index, mapping_section, .false.)
1392 force_env%mixed_env%val(iforce_eval) = energies(iforce_eval)
1395 force_env%mixed_env%dx = dx
1396 force_env%mixed_env%lerr = lerr
1397 force_env%mixed_env%coupling_function = trim(coupling_function)
1404 IF (
SIZE(itmplist) /= 2)
THEN
1405 CALL cp_abort(__location__, &
1406 "Keyword FORCE_STATES takes exactly two input values.")
1408 IF (any(itmplist < 0))
THEN
1409 cpabort(
"Invalid force_eval index.")
1412 IF (istate(1) > nforce_eval .OR. istate(2) > nforce_eval)
THEN
1413 cpabort(
"Invalid force_eval index.")
1415 mixed_energy%pot = lambda*energies(istate(1)) + (1.0_dp - lambda)*energies(istate(2))
1417 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1418 lambda, istate(1), nforce_eval, map_index, mapping_section, .true.)
1419 CALL mixed_map_forces(particles_mix, virial_mix, results_mix, global_forces, virials, results, &
1420 (1.0_dp - lambda), istate(2), nforce_eval, map_index, mapping_section, .false.)
1422 cpabort(
"Unknown mixing type for mixed_energy_forces")
1425 DO iforce_eval = 1, nforce_eval
1426 DEALLOCATE (global_forces(iforce_eval)%forces)
1427 IF (
ASSOCIATED(virials(iforce_eval)%virial))
DEALLOCATE (virials(iforce_eval)%virial)
1430 DEALLOCATE (global_forces)
1431 DEALLOCATE (subsystems)
1432 DEALLOCATE (particles)
1433 DEALLOCATE (energies)
1434 DEALLOCATE (glob_natoms)
1435 DEALLOCATE (virials)
1436 DEALLOCATE (results)
1439 extension=
".data", middle_name=
"MIXED_DIPOLE", log_filename=.false.)
1440 IF (unit_nr > 0)
THEN
1441 description =
'[DIPOLE]'
1442 dip_exists =
test_for_result(results=results_mix, description=description)
1443 IF (dip_exists)
THEN
1444 CALL get_results(results=results_mix, description=description, values=dip_mix)
1445 WRITE (unit_nr,
'(/,1X,A,T48,3F21.16)')
"MIXED ENV| DIPOLE ( A.U.)|", dip_mix
1446 WRITE (unit_nr,
'( 1X,A,T48,3F21.16)')
"MIXED ENV| DIPOLE (Debye)|", dip_mix*
debye
1448 WRITE (unit_nr, *)
"NO FORCE_EVAL section calculated the dipole"
1452 END SUBROUTINE mixed_energy_forces
1467 SUBROUTINE mixed_cdft_energy_forces(force_env, calculate_forces, particles, energies, &
1468 glob_natoms, virials, results)
1470 LOGICAL,
INTENT(IN) :: calculate_forces
1472 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1473 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms
1477 INTEGER :: iforce_eval, iparticle, jparticle, &
1478 my_group, natom, nforce_eval
1479 INTEGER,
DIMENSION(:),
POINTER :: map_index
1480 REAL(kind=
dp) :: energy
1488 mixed_section, root_section
1489 TYPE(
virial_type),
POINTER :: loc_virial, virial_mix
1492 cpassert(
ASSOCIATED(force_env))
1495 subsys=subsys_mix, &
1496 force_env_section=force_env_section, &
1497 root_section=root_section, &
1500 particles=particles_mix, &
1501 virial=virial_mix, &
1502 results=results_mix)
1504 nforce_eval =
SIZE(force_env%sub_force_env)
1507 ALLOCATE (subsystems(nforce_eval))
1508 DO iforce_eval = 1, nforce_eval
1509 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1510 NULLIFY (results(iforce_eval)%results, virials(iforce_eval)%virial)
1511 ALLOCATE (virials(iforce_eval)%virial)
1513 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1515 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1516 subsys=subsystems(iforce_eval)%subsys)
1519 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_mix)
1523 particles=particles(iforce_eval)%list)
1526 natom =
SIZE(particles(iforce_eval)%list%els)
1528 IF (
ASSOCIATED(map_index))
THEN
1529 DEALLOCATE (map_index)
1535 DO iparticle = 1, natom
1536 jparticle = map_index(iparticle)
1537 particles(iforce_eval)%list%els(iparticle)%r = particles_mix%els(jparticle)%r
1540 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1548 DO iforce_eval = 1, nforce_eval
1549 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1551 IF (force_env%mixed_env%cdft_control%run_type ==
mixed_cdft_serial .AND. iforce_eval >= 2)
THEN
1552 my_logger => force_env%mixed_env%cdft_control%sub_logger(iforce_eval - 1)%p
1554 my_group = force_env%mixed_env%group_distribution(force_env%para_env%mepos)
1555 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
1564 calc_force=calculate_forces, &
1565 skip_external_control=.true.)
1567 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1568 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1569 potential_energy=energy)
1571 virial=loc_virial, results=loc_results)
1572 energies(iforce_eval) = energy
1573 glob_natoms(iforce_eval) = natom
1574 virials(iforce_eval)%virial = loc_virial
1578 IF (
ASSOCIATED(map_index))
THEN
1579 DEALLOCATE (map_index)
1583 DEALLOCATE (subsystems)
1585 END SUBROUTINE mixed_cdft_energy_forces
1595 SUBROUTINE mixed_cdft_post_energy_forces(force_env)
1598 INTEGER :: iforce_eval, nforce_eval, nvar
1602 cpassert(
ASSOCIATED(force_env))
1603 NULLIFY (qs_env, dft_control)
1604 IF (force_env%mixed_env%do_mixed_cdft)
THEN
1605 nforce_eval =
SIZE(force_env%sub_force_env)
1606 nvar = force_env%mixed_env%cdft_control%nconstraint
1608 IF (.NOT.
ASSOCIATED(force_env%mixed_env%strength))
THEN
1609 ALLOCATE (force_env%mixed_env%strength(nforce_eval, nvar))
1611 force_env%mixed_env%strength = 0.0_dp
1612 DO iforce_eval = 1, nforce_eval
1613 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1614 IF (force_env%mixed_env%do_mixed_qmmm_cdft)
THEN
1615 qs_env => force_env%sub_force_env(iforce_eval)%force_env%qmmm_env%qs_env
1617 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, qs_env=qs_env)
1619 CALL get_qs_env(qs_env, dft_control=dft_control)
1620 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1621 force_env%mixed_env%strength(iforce_eval, :) = dft_control%qs_control%cdft_control%strength(:)
1624 CALL force_env%para_env%sum(force_env%mixed_env%strength)
1626 IF (force_env%mixed_env%do_mixed_et)
THEN
1627 IF (
modulo(force_env%mixed_env%cdft_control%sim_step, force_env%mixed_env%et_freq) == 0)
THEN
1633 END SUBROUTINE mixed_cdft_post_energy_forces
1640 SUBROUTINE embed_energy(force_env)
1644 INTEGER :: iforce_eval, iparticle, jparticle, &
1645 my_group, natom, nforce_eval
1646 INTEGER,
DIMENSION(:),
POINTER :: glob_natoms, map_index
1647 LOGICAL :: converged_embed
1648 REAL(kind=
dp) :: energy
1649 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1663 mapping_section, root_section
1666 cpassert(
ASSOCIATED(force_env))
1669 subsys=subsys_embed, &
1670 force_env_section=force_env_section, &
1671 root_section=root_section, &
1674 particles=particles_embed, &
1675 results=results_embed)
1676 NULLIFY (map_index, glob_natoms)
1678 nforce_eval =
SIZE(force_env%sub_force_env)
1682 ALLOCATE (subsystems(nforce_eval))
1683 ALLOCATE (particles(nforce_eval))
1685 ALLOCATE (energies(nforce_eval))
1686 ALLOCATE (glob_natoms(nforce_eval))
1687 ALLOCATE (results(nforce_eval))
1691 DO iforce_eval = 1, nforce_eval
1692 NULLIFY (subsystems(iforce_eval)%subsys, particles(iforce_eval)%list)
1693 NULLIFY (results(iforce_eval)%results)
1695 IF (.NOT.
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env)) cycle
1697 my_group = force_env%embed_env%group_distribution(force_env%para_env%mepos)
1698 my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
1704 CALL force_env_get(force_env=force_env%sub_force_env(iforce_eval)%force_env, &
1705 subsys=subsystems(iforce_eval)%subsys)
1709 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env%qs_env))
THEN
1710 NULLIFY (dft_control)
1711 CALL get_qs_env(force_env%sub_force_env(iforce_eval)%force_env%qs_env, dft_control=dft_control)
1712 IF (dft_control%qs_control%ref_embed_subsys)
THEN
1713 IF (iforce_eval == 2) cpabort(
"Density importing force_eval can't be the first.")
1718 CALL cp_subsys_set(subsystems(iforce_eval)%subsys, cell=cell_embed)
1722 particles=particles(iforce_eval)%list)
1725 natom =
SIZE(particles(iforce_eval)%list%els)
1731 DO iparticle = 1, natom
1732 jparticle = map_index(iparticle)
1733 particles(iforce_eval)%list%els(iparticle)%r = particles_embed%els(jparticle)%r
1738 calc_force=.false., &
1739 skip_external_control=.true.)
1742 IF (
ASSOCIATED(force_env%sub_force_env(iforce_eval)%force_env%qs_env))
THEN
1743 NULLIFY (dft_control)
1744 CALL get_qs_env(force_env%sub_force_env(iforce_eval)%force_env%qs_env, dft_control=dft_control)
1745 IF (dft_control%qs_control%ref_embed_subsys)
THEN
1747 CALL dft_embedding(force_env, iforce_eval, energies, converged_embed)
1748 IF (.NOT. converged_embed) cpabort(
"Embedding potential optimization not converged.")
1751 IF (dft_control%qs_control%high_level_embed_subsys)
THEN
1752 CALL get_qs_env(qs_env=force_env%sub_force_env(iforce_eval)%force_env%qs_env, &
1753 embed_pot=embed_pot, spin_embed_pot=spin_embed_pot, pw_env=pw_env)
1754 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1755 CALL auxbas_pw_pool%give_back_pw(embed_pot)
1756 IF (
ASSOCIATED(embed_pot))
THEN
1757 CALL embed_pot%release()
1758 DEALLOCATE (embed_pot)
1760 IF (
ASSOCIATED(spin_embed_pot))
THEN
1761 CALL auxbas_pw_pool%give_back_pw(spin_embed_pot)
1762 CALL spin_embed_pot%release()
1763 DEALLOCATE (spin_embed_pot)
1769 IF (force_env%sub_force_env(iforce_eval)%force_env%para_env%is_source())
THEN
1770 CALL force_env_get(force_env%sub_force_env(iforce_eval)%force_env, &
1771 potential_energy=energy)
1773 results=loc_results)
1774 energies(iforce_eval) = energy
1775 glob_natoms(iforce_eval) = natom
1779 IF (
ASSOCIATED(map_index))
THEN
1780 DEALLOCATE (map_index)
1786 CALL force_env%para_env%sync()
1788 CALL force_env%para_env%sum(energies)
1789 CALL force_env%para_env%sum(glob_natoms)
1791 force_env%embed_env%energies = energies
1794 DO iparticle = 1,
SIZE(particles_embed%els)
1795 particles_embed%els(iparticle)%f(:) = 0.0_dp
1799 force_env%embed_env%pot_energy = energies(3) + energies(4) - energies(2)
1802 DO iforce_eval = 1, nforce_eval
1805 DEALLOCATE (subsystems)
1806 DEALLOCATE (particles)
1807 DEALLOCATE (energies)
1808 DEALLOCATE (glob_natoms)
1809 DEALLOCATE (results)
1811 END SUBROUTINE embed_energy
1820 SUBROUTINE dft_embedding(force_env, ref_subsys_number, energies, converged_embed)
1822 INTEGER :: ref_subsys_number
1823 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1824 LOGICAL :: converged_embed
1826 INTEGER :: embed_method
1831 force_env_section=force_env_section)
1835 SELECT CASE (embed_method)
1838 CALL dfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1841 CALL dmfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1844 END SUBROUTINE dft_embedding
1853 SUBROUTINE dfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
1855 INTEGER :: ref_subsys_number
1856 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
1857 LOGICAL :: converged_embed
1859 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dfet_embedding'
1861 INTEGER :: cluster_subsys_num, handle, &
1862 i_force_eval, i_iter, i_spin, &
1863 nforce_eval, nspins, nspins_subsys, &
1865 REAL(kind=
dp) :: cluster_energy
1866 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rhs
1873 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r_ref, rho_r_subsys
1875 spin_embed_pot, spin_embed_pot_subsys
1879 force_env_section, input, &
1880 mapping_section, opt_embed_section
1882 CALL timeset(routinen, handle)
1887 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
1892 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
1895 NULLIFY (dft_section, input, opt_embed_section)
1896 NULLIFY (energy, dft_control)
1898 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
1899 pw_env=pw_env, dft_control=dft_control, rho=rho, energy=energy, &
1901 nspins = dft_control%nspins
1907 CALL qs_rho_get(rho_struct=rho, rho_r=rho_r_ref)
1910 CALL understand_spin_states(force_env, ref_subsys_number, opt_embed%change_spin, opt_embed%open_shell_embed, &
1911 opt_embed%all_nspins)
1914 CALL prepare_embed_opt(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, opt_embed, &
1918 CALL init_embed_pot(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, embed_pot, &
1919 opt_embed%add_const_pot, opt_embed%Fermi_Amaldi, opt_embed%const_pot, &
1920 opt_embed%open_shell_embed, spin_embed_pot, &
1921 opt_embed%pot_diff, opt_embed%Coulomb_guess, opt_embed%grid_opt)
1924 IF (opt_embed%read_embed_pot .OR. opt_embed%read_embed_pot_cube)
CALL read_embed_pot( &
1925 force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, embed_pot, spin_embed_pot, &
1926 opt_embed_section, opt_embed)
1929 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1930 CALL auxbas_pw_pool%create_pw(diff_rho_r)
1932 IF (opt_embed%open_shell_embed)
THEN
1933 CALL auxbas_pw_pool%create_pw(diff_rho_spin)
1938 DO i_spin = 1, nspins
1939 CALL pw_axpy(rho_r_ref(i_spin), diff_rho_r, -1.0_dp)
1941 IF (opt_embed%open_shell_embed)
THEN
1942 IF (nspins == 2)
THEN
1943 CALL pw_axpy(rho_r_ref(1), diff_rho_spin, -1.0_dp)
1944 CALL pw_axpy(rho_r_ref(2), diff_rho_spin, 1.0_dp)
1948 DO i_force_eval = 1, ref_subsys_number - 1
1949 NULLIFY (subsys_rho, rho_r_subsys, dft_control)
1950 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, rho=subsys_rho, energy=energy, &
1951 dft_control=dft_control)
1952 nspins_subsys = dft_control%nspins
1954 CALL qs_rho_get(rho_struct=subsys_rho, rho_r=rho_r_subsys)
1955 DO i_spin = 1, nspins_subsys
1956 CALL pw_axpy(rho_r_subsys(i_spin), diff_rho_r, allow_noncompatible_grids=.true.)
1958 IF (opt_embed%open_shell_embed)
THEN
1959 IF (nspins_subsys == 2)
THEN
1961 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
1962 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1963 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1966 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
1967 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
1974 CALL print_rho_diff(diff_rho_r, 0, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
1975 IF (opt_embed%open_shell_embed)
THEN
1976 CALL print_rho_spin_diff(diff_rho_spin, 0, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
1980 IF (opt_embed%Coulomb_guess)
THEN
1982 nforce_eval =
SIZE(force_env%sub_force_env)
1984 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, rhs=rhs)
1987 force_env_section=force_env_section)
1991 DO i_force_eval = 1, ref_subsys_number - 1
1992 IF (i_force_eval == 1)
THEN
1994 force_env%sub_force_env(i_force_eval)%force_env%qs_env, nforce_eval, i_force_eval, opt_embed%eta)
1996 CALL coulomb_guess(opt_embed%pot_diff, rhs, mapping_section, &
1997 force_env%sub_force_env(i_force_eval)%force_env%qs_env, nforce_eval, i_force_eval, opt_embed%eta)
2000 CALL pw_axpy(opt_embed%pot_diff, embed_pot)
2001 IF (.NOT. opt_embed%grid_opt)
CALL pw_copy(embed_pot, opt_embed%const_pot)
2006 IF (opt_embed%diff_guess)
THEN
2007 CALL pw_copy(diff_rho_r, embed_pot)
2008 IF (.NOT. opt_embed%grid_opt)
CALL pw_copy(embed_pot, opt_embed%const_pot)
2010 IF (opt_embed%open_shell_embed)
CALL pw_copy(diff_rho_spin, spin_embed_pot)
2014 DO i_iter = 1, opt_embed%n_iter
2015 opt_embed%i_iter = i_iter
2019 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, dft_control=dft_control)
2020 nspins = dft_control%nspins
2021 DO i_spin = 1, nspins
2022 CALL pw_axpy(rho_r_ref(i_spin), diff_rho_r, -1.0_dp)
2024 IF (opt_embed%open_shell_embed)
THEN
2026 IF (nspins == 2)
THEN
2027 CALL pw_axpy(rho_r_ref(1), diff_rho_spin, -1.0_dp)
2028 CALL pw_axpy(rho_r_ref(2), diff_rho_spin, 1.0_dp)
2032 DO i_force_eval = 1, ref_subsys_number - 1
2033 NULLIFY (dft_control)
2034 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, dft_control=dft_control)
2035 nspins_subsys = dft_control%nspins
2037 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
2041 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2042 opt_embed%open_shell_embed, .true.)
2045 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2046 opt_embed%open_shell_embed, .false.)
2050 dft_control%apply_embed_pot = .true.
2053 CALL set_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, embed_pot=embed_pot_subsys)
2054 IF ((opt_embed%open_shell_embed) .AND. (nspins_subsys == 2))
THEN
2055 CALL set_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2056 spin_embed_pot=spin_embed_pot_subsys)
2060 CALL get_prev_density(opt_embed, force_env%sub_force_env(i_force_eval)%force_env, i_force_eval)
2064 calc_force=.false., &
2065 skip_external_control=.true.)
2067 CALL get_max_subsys_diff(opt_embed, force_env%sub_force_env(i_force_eval)%force_env, i_force_eval)
2070 NULLIFY (rho_r_subsys, energy)
2072 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, rho=subsys_rho, &
2074 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) + energy%total
2077 IF (dft_control%qs_control%cluster_embed_subsys)
THEN
2078 cluster_subsys_num = i_force_eval
2079 cluster_energy = energy%total
2083 CALL qs_rho_get(rho_struct=subsys_rho, rho_r=rho_r_subsys)
2084 DO i_spin = 1, nspins_subsys
2085 CALL pw_axpy(rho_r_subsys(i_spin), diff_rho_r, allow_noncompatible_grids=.true.)
2087 IF (opt_embed%open_shell_embed)
THEN
2088 IF (nspins_subsys == 2)
THEN
2090 IF ((i_force_eval == 2) .AND. (opt_embed%change_spin))
THEN
2091 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
2092 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
2095 CALL pw_axpy(rho_r_subsys(1), diff_rho_spin, 1.0_dp, allow_noncompatible_grids=.true.)
2096 CALL pw_axpy(rho_r_subsys(2), diff_rho_spin, -1.0_dp, allow_noncompatible_grids=.true.)
2102 CALL embed_pot_subsys%release()
2103 DEALLOCATE (embed_pot_subsys)
2104 IF (opt_embed%open_shell_embed)
THEN
2105 CALL spin_embed_pot_subsys%release()
2106 DEALLOCATE (spin_embed_pot_subsys)
2113 opt_embed%dimen_aux, opt_embed%embed_pot_coef, embed_pot, i_iter, &
2114 spin_embed_pot, opt_embed%open_shell_embed, opt_embed%grid_opt, .false.)
2116 embed_pot, spin_embed_pot, i_iter, opt_embed%open_shell_embed, .false., &
2117 force_env%sub_force_env(cluster_subsys_num)%force_env%qs_env)
2120 DO i_spin = 1, nspins
2121 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) -
pw_integral_ab(embed_pot, rho_r_ref(i_spin))
2124 IF (opt_embed%open_shell_embed)
THEN
2126 IF (nspins == 2)
THEN
2127 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) &
2133 opt_embed%w_func(i_iter) = opt_embed%w_func(i_iter) + opt_embed%reg_term
2138 IF (opt_embed%converged)
EXIT
2141 IF ((i_iter > 1) .AND. (.NOT. opt_embed%steep_desc))
CALL step_control(opt_embed)
2144 CALL print_rho_diff(diff_rho_r, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
2145 IF (opt_embed%open_shell_embed)
THEN
2146 CALL print_rho_spin_diff(diff_rho_spin, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .false.)
2151 IF (opt_embed%accept_step .AND. (.NOT. opt_embed%grid_opt))
THEN
2153 diff_rho_r, diff_rho_spin, opt_embed)
2156 CALL opt_embed_step(diff_rho_r, diff_rho_spin, opt_embed, embed_pot, spin_embed_pot, rho_r_ref, &
2157 force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2163 opt_embed%dimen_aux, opt_embed%embed_pot_coef, embed_pot, i_iter, &
2164 spin_embed_pot, opt_embed%open_shell_embed, opt_embed%grid_opt, .true.)
2166 embed_pot, spin_embed_pot, i_iter, opt_embed%open_shell_embed, .true., &
2167 force_env%sub_force_env(cluster_subsys_num)%force_env%qs_env)
2171 IF (opt_embed%open_shell_embed)
THEN
2172 CALL print_rho_spin_diff(diff_rho_spin, i_iter, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, .true.)
2176 CALL diff_rho_r%release()
2177 IF (opt_embed%open_shell_embed)
THEN
2178 CALL diff_rho_spin%release()
2182 "PRINT%PROGRAM_RUN_INFO")
2185 IF (opt_embed%converged)
THEN
2186 CALL get_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, dft_control=dft_control, &
2188 nspins_subsys = dft_control%nspins
2189 dft_control%apply_embed_pot = .true.
2192 embed_pot, embed_pot_subsys, spin_embed_pot, spin_embed_pot_subsys, &
2193 opt_embed%open_shell_embed, opt_embed%change_spin)
2195 IF (opt_embed%Coulomb_guess)
THEN
2196 CALL pw_axpy(opt_embed%pot_diff, embed_pot_subsys, -1.0_dp, allow_noncompatible_grids=.true.)
2199 CALL set_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, embed_pot=embed_pot_subsys)
2201 IF ((opt_embed%open_shell_embed) .AND. (nspins_subsys == 2))
THEN
2202 CALL set_qs_env(force_env%sub_force_env(ref_subsys_number + 1)%force_env%qs_env, &
2203 spin_embed_pot=spin_embed_pot_subsys)
2207 IF (force_env%sub_force_env(cluster_subsys_num)%force_env%para_env%is_source())
THEN
2208 energies(cluster_subsys_num) = cluster_energy
2216 CALL embed_pot%release()
2217 DEALLOCATE (embed_pot)
2218 IF (opt_embed%open_shell_embed)
THEN
2219 CALL spin_embed_pot%release()
2220 DEALLOCATE (spin_embed_pot)
2223 converged_embed = opt_embed%converged
2225 CALL timestop(handle)
2227 END SUBROUTINE dfet_embedding
2237 SUBROUTINE dmfet_embedding(force_env, ref_subsys_number, energies, converged_embed)
2239 INTEGER :: ref_subsys_number
2240 REAL(kind=
dp),
DIMENSION(:),
POINTER :: energies
2241 LOGICAL :: converged_embed
2243 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dmfet_embedding'
2245 INTEGER :: cluster_subsys_num, handle, &
2246 i_force_eval, i_iter, output_unit
2247 LOGICAL :: subsys_open_shell
2248 REAL(kind=
dp) :: cluster_energy
2256 CALL timeset(routinen, handle)
2258 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2264 output_unit =
cp_print_key_unit_nr(logger, force_env%force_env_section,
"PRINT%PROGRAM_RUN_INFO", &
2267 NULLIFY (dft_section, input, opt_dmfet_section)
2270 CALL get_qs_env(qs_env=force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2271 energy=energy, input=input)
2278 CALL understand_spin_states(force_env, ref_subsys_number, opt_dmfet%change_spin, opt_dmfet%open_shell_embed, &
2279 opt_dmfet%all_nspins)
2282 CALL prepare_dmfet_opt(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2283 opt_dmfet, opt_dmfet_section)
2286 subsys_open_shell =
subsys_spin(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2287 CALL build_full_dm(force_env%sub_force_env(ref_subsys_number)%force_env%qs_env, &
2288 opt_dmfet%dm_total, subsys_open_shell, opt_dmfet%open_shell_embed, opt_dmfet%dm_total_beta)
2293 opt_dmfet%dm_diff_beta, para_env)
2295 DO i_force_eval = 1, ref_subsys_number - 1
2298 subsys_open_shell =
subsys_spin(force_env%sub_force_env(i_force_eval)%force_env%qs_env)
2300 CALL build_full_dm(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2301 opt_dmfet%dm_subsys, subsys_open_shell, opt_dmfet%open_shell_embed, &
2302 opt_dmfet%dm_subsys_beta)
2306 IF (opt_dmfet%open_shell_embed)
CALL cp_fm_scale_and_add(-1.0_dp, opt_dmfet%dm_diff_beta, &
2307 1.0_dp, opt_dmfet%dm_subsys_beta)
2312 DO i_iter = 1, opt_dmfet%n_iter
2314 opt_dmfet%i_iter = i_iter
2320 opt_dmfet%dm_diff_beta, para_env)
2323 DO i_force_eval = 1, ref_subsys_number - 1
2326 NULLIFY (dft_control)
2327 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, dft_control=dft_control)
2328 dft_control%apply_dmfet_pot = .true.
2332 calc_force=.false., &
2333 skip_external_control=.true.)
2338 CALL get_qs_env(force_env%sub_force_env(i_force_eval)%force_env%qs_env, energy=energy)
2339 opt_dmfet%w_func(i_iter) = opt_dmfet%w_func(i_iter) + energy%total
2342 IF (dft_control%qs_control%cluster_embed_subsys)
THEN
2343 cluster_subsys_num = i_force_eval
2344 cluster_energy = energy%total
2348 subsys_open_shell =
subsys_spin(force_env%sub_force_env(i_force_eval)%force_env%qs_env)
2350 CALL build_full_dm(force_env%sub_force_env(i_force_eval)%force_env%qs_env, &
2351 opt_dmfet%dm_subsys, subsys_open_shell, opt_dmfet%open_shell_embed, &
2352 opt_dmfet%dm_subsys_beta)
2354 IF (opt_dmfet%open_shell_embed)
THEN
2356 IF ((i_force_eval == 2) .AND. (opt_dmfet%change_spin))
THEN
2361 CALL cp_fm_scale_and_add(-1.0_dp, opt_dmfet%dm_diff_beta, 1.0_dp, opt_dmfet%dm_subsys_beta)
2369 CALL check_dmfet(opt_dmfet, force_env%sub_force_env(ref_subsys_number)%force_env%qs_env)
2374 IF (force_env%sub_force_env(cluster_subsys_num)%force_env%para_env%is_source())
THEN
2375 energies(cluster_subsys_num) = cluster_energy
2380 converged_embed = .false.
2382 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, 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...
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, file_access)
...
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.
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, lattice_fft)
Retrieve information from a kpoint environment.
Crystal-symmetry routines originating from the K290/ACMI code.
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, storage_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