46 USE dbcsr_api,
ONLY: dbcsr_finalize_lib,&
124 pwdft_environment_type
144 #include "./base/base_uses.f90"
149 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
150 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'f77_interface'
154 TYPE(f_env_type),
POINTER :: f_env => null()
155 END TYPE f_env_p_type
160 TYPE(force_env_type),
POINTER :: force_env => null()
161 TYPE(cp_logger_type),
POINTER :: logger => null()
162 TYPE(timer_env_type),
POINTER :: timer_env => null()
163 TYPE(mp_perf_env_type),
POINTER :: mp_perf_env => null()
164 CHARACTER(len=default_path_length) :: my_path =
"", old_path =
""
167 TYPE(f_env_p_type),
DIMENSION(:),
POINTER,
SAVE :: f_envs
169 LOGICAL,
SAVE :: module_initialized = .false.
170 INTEGER,
SAVE :: last_f_env_id = 0, n_f_envs = 0
190 FUNCTION get_pos_of_env(env_id)
RESULT(res)
191 INTEGER,
INTENT(in) :: env_id
194 INTEGER :: env_pos, isub
197 DO isub = 1, n_f_envs
198 IF (f_envs(isub)%f_env%id_nr == env_id)
THEN
203 END FUNCTION get_pos_of_env
213 LOGICAL,
INTENT(in) :: init_mpi
214 INTEGER,
INTENT(out) :: ierr
216 INTEGER :: offload_device_count, unit_nr
217 TYPE(cp_logger_type),
POINTER :: logger
219 IF (.NOT. module_initialized)
THEN
257 default_global_unit_nr=unit_nr, &
258 close_global_unit_on_dealloc=.false.)
263 module_initialized = .true.
275 IF (offload_device_count > 0)
THEN
281 #if defined __DBCSR_ACC
282 IF (offload_device_count > 0)
THEN
316 LOGICAL,
INTENT(in) :: finalize_mpi
317 INTEGER,
INTENT(out) :: ierr
325 IF (.NOT. module_initialized)
THEN
328 DO ienv = n_f_envs, 1, -1
339 CALL dbcsr_finalize_lib()
352 IF (finalize_mpi)
THEN
363 RECURSIVE SUBROUTINE f_env_dealloc(f_env)
364 TYPE(f_env_type),
POINTER :: f_env
368 cpassert(
ASSOCIATED(f_env))
373 IF (f_env%old_path /= f_env%my_path)
THEN
374 CALL m_chdir(f_env%old_path, ierr)
377 END SUBROUTINE f_env_dealloc
390 SUBROUTINE f_env_create(f_env, force_env, timer_env, mp_perf_env, id_nr, logger, old_dir)
391 TYPE(f_env_type),
POINTER :: f_env
392 TYPE(force_env_type),
POINTER :: force_env
393 TYPE(timer_env_type),
POINTER :: timer_env
395 INTEGER,
INTENT(in) :: id_nr
396 TYPE(cp_logger_type),
POINTER :: logger
397 CHARACTER(len=*),
INTENT(in) :: old_dir
400 f_env%force_env => force_env
402 f_env%logger => logger
404 f_env%timer_env => timer_env
410 f_env%old_path = old_dir
411 END SUBROUTINE f_env_create
419 INTEGER,
INTENT(in) :: f_env_id
420 TYPE(f_env_type),
POINTER :: f_env
425 f_env_pos = get_pos_of_env(f_env_id)
426 IF (f_env_pos < 1)
THEN
427 cpabort(
"invalid env_id "//cp_to_string(f_env_id))
429 f_env => f_envs(f_env_pos)%f_env
450 INTEGER,
INTENT(in) :: f_env_id
451 TYPE(f_env_type),
POINTER :: f_env
452 INTEGER,
INTENT(out),
OPTIONAL :: handle
454 INTEGER :: f_env_pos, ierr
455 TYPE(cp_logger_type),
POINTER :: logger
458 f_env_pos = get_pos_of_env(f_env_id)
459 IF (f_env_pos < 1)
THEN
460 cpabort(
"invalid env_id "//cp_to_string(f_env_id))
462 f_env => f_envs(f_env_pos)%f_env
463 logger => f_env%logger
464 cpassert(
ASSOCIATED(logger))
466 IF (f_env%old_path /= f_env%my_path)
THEN
467 CALL m_chdir(trim(f_env%my_path), ierr)
494 TYPE(f_env_type),
POINTER :: f_env
495 INTEGER,
INTENT(out),
OPTIONAL :: ierr
496 INTEGER,
INTENT(in),
OPTIONAL :: handle
499 TYPE(cp_logger_type),
POINTER :: d_logger, logger
500 TYPE(mp_perf_env_type),
POINTER :: d_mp_perf_env
501 TYPE(timer_env_type),
POINTER :: d_timer_env
503 IF (
ASSOCIATED(f_env))
THEN
504 IF (
PRESENT(handle))
THEN
508 logger => f_env%logger
512 cpassert(
ASSOCIATED(logger))
513 cpassert(
ASSOCIATED(d_logger))
514 cpassert(
ASSOCIATED(d_timer_env))
515 cpassert(
ASSOCIATED(d_mp_perf_env))
516 cpassert(
ASSOCIATED(logger, d_logger))
518 cpassert(
ASSOCIATED(d_mp_perf_env, f_env%mp_perf_env))
519 IF (f_env%old_path /= f_env%my_path)
THEN
520 CALL m_chdir(trim(f_env%old_path), ierr2)
523 IF (
PRESENT(ierr))
THEN
530 IF (
PRESENT(ierr))
THEN
564 output_path, mpi_comm, output_unit, owns_out_unit, &
565 input, ierr, work_dir, initial_variables)
566 INTEGER,
INTENT(out) :: new_env_id
567 TYPE(section_type),
POINTER :: input_declaration
568 CHARACTER(len=*),
INTENT(in) :: input_path
569 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: output_path
571 CLASS(mp_comm_type),
INTENT(IN),
OPTIONAL :: mpi_comm
572 INTEGER,
INTENT(in),
OPTIONAL :: output_unit
573 LOGICAL,
INTENT(in),
OPTIONAL :: owns_out_unit
574 TYPE(section_vals_type),
OPTIONAL,
POINTER :: input
575 INTEGER,
INTENT(out),
OPTIONAL :: ierr
576 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: work_dir
577 CHARACTER(len=*),
DIMENSION(:, :),
OPTIONAL :: initial_variables
579 CHARACTER(len=*),
PARAMETER :: routinen =
'create_force_env'
581 CHARACTER(len=default_path_length) :: old_dir, wdir
582 INTEGER :: handle, i, ierr2, iforce_eval, isubforce_eval, k, method_name_id, my_group, &
583 nforce_eval, ngroups, nsubforce_size, unit_nr
584 INTEGER,
DIMENSION(:),
POINTER :: group_distribution, i_force_eval, &
586 LOGICAL :: check, do_qmmm_force_mixing, multiple_subsys, my_echo, my_owns_out_unit, &
587 use_motion_section, use_multiple_para_env
588 TYPE(cp_logger_type),
POINTER :: logger, my_logger
589 TYPE(mp_para_env_type),
POINTER :: my_para_env, para_env
590 TYPE(eip_environment_type),
POINTER :: eip_env
591 TYPE(embed_env_type),
POINTER :: embed_env
592 TYPE(enumeration_type),
POINTER :: enum
593 TYPE(f_env_p_type),
DIMENSION(:),
POINTER :: f_envs_old
594 TYPE(force_env_type),
POINTER :: force_env, my_force_env
595 TYPE(fp_type),
POINTER :: fp_env
596 TYPE(global_environment_type),
POINTER :: globenv
597 TYPE(keyword_type),
POINTER :: keyword
598 TYPE(meta_env_type),
POINTER :: meta_env
599 TYPE(mixed_environment_type),
POINTER :: mixed_env
601 TYPE(nnp_type),
POINTER :: nnp_env
602 TYPE(pwdft_environment_type),
POINTER :: pwdft_env
603 TYPE(qmmm_env_type),
POINTER :: qmmm_env
604 TYPE(qmmmx_env_type),
POINTER :: qmmmx_env
605 TYPE(qs_environment_type),
POINTER :: qs_env
606 TYPE(section_type),
POINTER :: section
607 TYPE(section_vals_type),
POINTER :: fe_section, force_env_section, force_env_sections, &
608 fp_section, input_file, qmmm_section, qmmmx_section, root_section, subsys_section, &
610 TYPE(timer_env_type),
POINTER :: timer_env
612 cpassert(
ASSOCIATED(input_declaration))
613 NULLIFY (para_env, force_env, timer_env,
mp_perf_env, globenv, meta_env, &
614 fp_env, eip_env, pwdft_env, mixed_env, qs_env, qmmm_env, embed_env)
616 IF (
PRESENT(mpi_comm))
THEN
621 CALL para_env%retain()
624 CALL timeset(routinen, handle)
628 IF (
PRESENT(work_dir))
THEN
629 IF (work_dir /=
" ")
THEN
632 IF (
PRESENT(ierr)) ierr = ierr2
639 IF (
PRESENT(output_unit))
THEN
640 unit_nr = output_unit
642 IF (para_env%is_source())
THEN
643 IF (output_path ==
"__STD_OUT__")
THEN
646 CALL open_file(file_name=output_path, file_status=
"UNKNOWN", &
647 file_action=
"WRITE", file_position=
"APPEND", &
655 IF (
PRESENT(owns_out_unit)) my_owns_out_unit = owns_out_unit
657 CALL cp2k_init(para_env, output_unit=unit_nr, globenv=globenv, input_file_name=input_path, &
664 IF (
PRESENT(input)) input_file => input
665 IF (.NOT.
ASSOCIATED(input_file))
THEN
666 IF (
PRESENT(initial_variables))
THEN
667 input_file =>
read_input(input_declaration, input_path, initial_variables, para_env=para_env)
669 input_file =>
read_input(input_declaration, input_path, empty_initial_variables, para_env=para_env)
677 IF (para_env%is_source() .AND. my_echo)
THEN
679 hide_root=.true., hide_defaults=.false.)
685 CALL check_cp2k_input(input_declaration, input_file, para_env=para_env, output_unit=unit_nr)
689 root_section => input_file
692 IF (n_f_envs + 1 >
SIZE(f_envs))
THEN
694 ALLOCATE (f_envs(n_f_envs + 10))
696 f_envs(i)%f_env => f_envs_old(i)%f_env
698 DO i = n_f_envs + 1,
SIZE(f_envs)
699 NULLIFY (f_envs(i)%f_env)
701 DEALLOCATE (f_envs_old)
704 CALL cp2k_read(root_section, para_env, globenv)
706 CALL cp2k_setup(root_section, para_env, globenv)
708 ALLOCATE (group_distribution(0:para_env%num_pe - 1))
709 group_distribution = 0
710 lgroup_distribution => group_distribution
714 l_val=multiple_subsys)
715 CALL multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
717 IF (.NOT. multiple_subsys)
THEN
718 DO iforce_eval = 2, nforce_eval
720 i_rep_section=i_force_eval(iforce_eval))
724 nsubforce_size = nforce_eval - 1
725 use_multiple_para_env = .false.
726 use_motion_section = .true.
727 DO iforce_eval = 1, nforce_eval
728 NULLIFY (force_env_section, my_force_env, subsys_section)
730 IF (.NOT. multiple_subsys)
THEN
732 i_rep_section=i_force_eval(1))
735 IF (use_multiple_para_env)
THEN
738 i_rep_section=i_force_eval(1))
740 CALL cp_abort(__location__, &
741 "In case of multiple force_eval the MAIN force_eval (the first in the list of FORCE_EVAL_ORDER or "// &
742 "the one omitted from that order list) must be a MIXED_ENV type calculation. Please check your "// &
743 "input file and possibly correct the MULTIPLE_FORCE_EVAL%FORCE_EVAL_ORDER. ")
745 IF (method_name_id .EQ.
do_mixed)
THEN
746 check =
ASSOCIATED(force_env%mixed_env%sub_para_env)
748 ngroups = force_env%mixed_env%ngroups
749 my_group = lgroup_distribution(para_env%mepos)
750 isubforce_eval = iforce_eval - 1
752 IF (
modulo(isubforce_eval - 1, ngroups) /= my_group) cycle
753 my_para_env => force_env%mixed_env%sub_para_env(my_group + 1)%para_env
754 my_logger => force_env%mixed_env%sub_logger(my_group + 1)%p
758 IF (method_name_id .EQ.
do_embed)
THEN
759 check =
ASSOCIATED(force_env%embed_env%sub_para_env)
761 ngroups = force_env%embed_env%ngroups
762 my_group = lgroup_distribution(para_env%mepos)
763 isubforce_eval = iforce_eval - 1
765 IF (
modulo(isubforce_eval - 1, ngroups) /= my_group) cycle
766 my_para_env => force_env%embed_env%sub_para_env(my_group + 1)%para_env
767 my_logger => force_env%embed_env%sub_logger(my_group + 1)%p
772 my_para_env => para_env
778 IF (nforce_eval > 1)
THEN
780 i_force_eval(iforce_eval), i_force_eval(iforce_eval))
781 IF (iforce_eval /= 1) use_motion_section = .false.
783 force_env_section => force_env_sections
784 use_motion_section = .true.
788 IF (method_name_id ==
do_qmmm)
THEN
791 IF (do_qmmm_force_mixing) &
795 SELECT CASE (method_name_id)
798 force_env_section=force_env_section, subsys_section=subsys_section, &
799 use_motion_section=use_motion_section)
804 CALL qs_init(qs_env, my_para_env, root_section, globenv=globenv, force_env_section=force_env_section, &
805 subsys_section=subsys_section, use_motion_section=use_motion_section)
806 CALL force_env_create(my_force_env, root_section, qs_env=qs_env, para_env=my_para_env, globenv=globenv, &
807 force_env_section=force_env_section)
813 force_env_section, qmmm_section, subsys_section, use_motion_section)
814 CALL force_env_create(my_force_env, root_section, qmmm_env=qmmm_env, para_env=my_para_env, &
815 globenv=globenv, force_env_section=force_env_section)
820 force_env_section, subsys_section, use_motion_section)
821 CALL force_env_create(my_force_env, root_section, qmmmx_env=qmmmx_env, para_env=my_para_env, &
822 globenv=globenv, force_env_section=force_env_section)
827 CALL eip_init(eip_env, root_section, my_para_env, force_env_section=force_env_section, &
828 subsys_section=subsys_section)
829 CALL force_env_create(my_force_env, root_section, eip_env=eip_env, para_env=my_para_env, &
830 globenv=globenv, force_env_section=force_env_section)
835 CALL pwdft_init(pwdft_env, root_section, my_para_env, force_env_section=force_env_section, &
836 subsys_section=subsys_section, use_motion_section=use_motion_section)
837 CALL force_env_create(my_force_env, root_section, pwdft_env=pwdft_env, para_env=my_para_env, &
838 globenv=globenv, force_env_section=force_env_section)
843 force_env_section=force_env_section, n_subforce_eval=nsubforce_size, &
844 use_motion_section=use_motion_section)
845 CALL force_env_create(my_force_env, root_section, mixed_env=mixed_env, para_env=my_para_env, &
846 globenv=globenv, force_env_section=force_env_section)
848 use_multiple_para_env = .true.
850 lgroup_distribution => my_force_env%mixed_env%group_distribution
855 force_env_section=force_env_section, n_subforce_eval=nsubforce_size, &
856 use_motion_section=use_motion_section)
857 CALL force_env_create(my_force_env, root_section, embed_env=embed_env, para_env=my_para_env, &
858 globenv=globenv, force_env_section=force_env_section)
860 use_multiple_para_env = .true.
862 lgroup_distribution => my_force_env%embed_env%group_distribution
866 CALL nnp_init(nnp_env, root_section, my_para_env, force_env_section=force_env_section, &
867 subsys_section=subsys_section, use_motion_section=use_motion_section)
868 CALL force_env_create(my_force_env, root_section, nnp_env=nnp_env, para_env=my_para_env, &
869 globenv=globenv, force_env_section=force_env_section)
875 CALL cp_abort(__location__, &
876 "Invalid METHOD <"//trim(
enum_i2c(enum, method_name_id))// &
881 NULLIFY (meta_env, fp_env)
882 IF (use_motion_section)
THEN
885 CALL metadyn_read(meta_env, my_force_env, root_section, my_para_env, fe_section)
896 IF (nforce_eval > 1 .AND. iforce_eval == 1)
THEN
897 ALLOCATE (my_force_env%sub_force_env(nsubforce_size))
899 DO k = 1, nsubforce_size
900 NULLIFY (my_force_env%sub_force_env(k)%force_env)
904 IF (iforce_eval == 1)
THEN
905 force_env => my_force_env
907 force_env%sub_force_env(iforce_eval - 1)%force_env => my_force_env
910 IF (.NOT. use_multiple_para_env)
THEN
911 lgroup_distribution = iforce_eval
916 IF (use_multiple_para_env) &
918 DEALLOCATE (group_distribution)
919 DEALLOCATE (i_force_eval)
922 CALL para_env%max(last_f_env_id)
923 last_f_env_id = last_f_env_id + 1
924 new_env_id = last_f_env_id
925 n_f_envs = n_f_envs + 1
926 CALL f_env_create(f_envs(n_f_envs)%f_env, logger=logger, &
928 id_nr=last_f_env_id, old_dir=old_dir)
934 CALL timestop(handle)
952 INTEGER,
INTENT(in) :: env_id
953 INTEGER,
INTENT(out) :: ierr
954 LOGICAL,
INTENT(IN),
OPTIONAL :: q_finalize
956 INTEGER :: env_pos, i
957 TYPE(f_env_type),
POINTER :: f_env
958 TYPE(global_environment_type),
POINTER :: globenv
959 TYPE(mp_para_env_type),
POINTER :: para_env
960 TYPE(section_vals_type),
POINTER :: root_section
964 env_pos = get_pos_of_env(env_id)
965 n_f_envs = n_f_envs - 1
966 DO i = env_pos, n_f_envs
967 f_envs(i)%f_env => f_envs(i + 1)%f_env
969 NULLIFY (f_envs(n_f_envs + 1)%f_env)
972 root_section=root_section, para_env=para_env)
974 cpassert(
ASSOCIATED(globenv))
975 NULLIFY (f_env%force_env%globenv)
976 CALL f_env_dealloc(f_env)
977 IF (
PRESENT(q_finalize))
THEN
978 CALL cp2k_finalize(root_section, para_env, globenv, f_env%old_path, q_finalize)
980 CALL cp2k_finalize(root_section, para_env, globenv, f_env%old_path)
998 INTEGER,
INTENT(IN) :: env_id
999 INTEGER,
INTENT(OUT) :: n_atom, ierr
1001 TYPE(f_env_type),
POINTER :: f_env
1021 INTEGER,
INTENT(IN) :: env_id
1022 INTEGER,
INTENT(OUT) :: n_particle, ierr
1024 TYPE(f_env_type),
POINTER :: f_env
1044 INTEGER,
INTENT(IN) :: env_id
1045 REAL(kind=
dp),
DIMENSION(3, 3) :: cell
1046 INTEGER,
DIMENSION(3),
OPTIONAL :: per
1047 INTEGER,
INTENT(OUT) :: ierr
1049 TYPE(cell_type),
POINTER :: cell_full
1050 TYPE(f_env_type),
POINTER :: f_env
1056 cpassert(
ASSOCIATED(cell_full))
1057 cell = cell_full%hmat
1058 IF (
PRESENT(per)) per(:) = cell_full%perd(:)
1072 INTEGER,
INTENT(IN) :: env_id
1073 REAL(kind=
dp),
DIMENSION(3, 3) :: cell
1074 INTEGER,
INTENT(OUT) :: ierr
1076 TYPE(cell_type),
POINTER :: cell_qmmm
1077 TYPE(f_env_type),
POINTER :: f_env
1078 TYPE(qmmm_env_type),
POINTER :: qmmm_env
1084 CALL get_qs_env(qmmm_env%qs_env, cell=cell_qmmm)
1085 cpassert(
ASSOCIATED(cell_qmmm))
1086 cell = cell_qmmm%hmat
1103 CHARACTER(LEN=default_string_length) :: description
1105 REAL(kind=
dp),
DIMENSION(1:N) :: result
1106 LOGICAL,
OPTIONAL :: res_exist
1110 LOGICAL :: exist_res
1111 TYPE(cp_result_type),
POINTER :: results
1112 TYPE(cp_subsys_type),
POINTER :: subsys
1113 TYPE(f_env_type),
POINTER :: f_env
1115 NULLIFY (f_env, subsys, results)
1121 IF (
PRESENT(res_exist))
THEN
1123 exist_res = res_exist
1129 CALL get_results(results, description=description, n_rep=nres)
1130 CALL get_results(results, description=description, values=result, nval=nres)
1148 INTEGER,
INTENT(IN) :: env_id, n_el
1149 REAL(kind=
dp),
DIMENSION(1:n_el) :: frc
1150 INTEGER,
INTENT(OUT) :: ierr
1152 TYPE(f_env_type),
POINTER :: f_env
1170 INTEGER,
INTENT(IN) :: env_id
1171 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT) :: stress_tensor
1172 INTEGER,
INTENT(OUT) :: ierr
1174 TYPE(cell_type),
POINTER :: cell
1175 TYPE(cp_subsys_type),
POINTER :: subsys
1176 TYPE(f_env_type),
POINTER :: f_env
1177 TYPE(virial_type),
POINTER :: virial
1179 NULLIFY (f_env, subsys, virial, cell)
1180 stress_tensor(:, :) = 0.0_dp
1183 CALL force_env_get(f_env%force_env, subsys=subsys, cell=cell)
1185 IF (virial%pv_availability)
THEN
1186 stress_tensor(:, :) = virial%pv_virial(:, :)/cell%deth
1203 INTEGER,
INTENT(IN) :: env_id, n_el
1204 REAL(kind=
dp),
DIMENSION(1:n_el) :: pos
1205 INTEGER,
INTENT(OUT) :: ierr
1207 TYPE(f_env_type),
POINTER :: f_env
1225 SUBROUTINE get_vel(env_id, vel, n_el, ierr)
1227 INTEGER,
INTENT(IN) :: env_id, n_el
1228 REAL(kind=
dp),
DIMENSION(1:n_el) :: vel
1229 INTEGER,
INTENT(OUT) :: ierr
1231 TYPE(f_env_type),
POINTER :: f_env
1238 END SUBROUTINE get_vel
1249 INTEGER,
INTENT(IN) :: env_id
1250 REAL(kind=
dp),
DIMENSION(3, 3) :: new_cell
1251 INTEGER,
INTENT(OUT) :: ierr
1253 TYPE(cell_type),
POINTER :: cell
1254 TYPE(cp_subsys_type),
POINTER :: subsys
1255 TYPE(f_env_type),
POINTER :: f_env
1257 NULLIFY (f_env, cell, subsys)
1261 cpassert(
ASSOCIATED(cell))
1262 cell%hmat = new_cell
1281 INTEGER,
INTENT(IN) :: env_id, n_el
1282 REAL(kind=
dp),
DIMENSION(1:n_el) :: new_pos
1283 INTEGER,
INTENT(OUT) :: ierr
1285 TYPE(cp_subsys_type),
POINTER :: subsys
1286 TYPE(f_env_type),
POINTER :: f_env
1308 INTEGER,
INTENT(IN) :: env_id, n_el
1309 REAL(kind=
dp),
DIMENSION(1:n_el) :: new_vel
1310 INTEGER,
INTENT(OUT) :: ierr
1312 TYPE(cp_subsys_type),
POINTER :: subsys
1313 TYPE(f_env_type),
POINTER :: f_env
1334 INTEGER,
INTENT(in) :: env_id
1336 INTEGER,
INTENT(out) :: ierr
1338 TYPE(cp_logger_type),
POINTER :: logger
1339 TYPE(f_env_type),
POINTER :: f_env
1359 INTEGER,
INTENT(in) :: env_id
1360 REAL(kind=
dp),
INTENT(out) :: e_pot
1361 INTEGER,
INTENT(out) :: ierr
1363 TYPE(f_env_type),
POINTER :: f_env
1386 INTEGER,
INTENT(IN) :: env_id, n_el
1387 REAL(kind=
dp),
DIMENSION(1:n_el),
INTENT(IN) :: pos
1388 REAL(kind=
dp),
INTENT(OUT) :: e_pot
1389 INTEGER,
INTENT(OUT) :: ierr
1391 REAL(kind=
dp),
DIMENSION(1) :: dummy_f
1393 CALL calc_force(env_id, pos, n_el, e_pot, dummy_f, 0, ierr)
1414 RECURSIVE SUBROUTINE calc_force(env_id, pos, n_el_pos, e_pot, force, n_el_force, ierr)
1416 INTEGER,
INTENT(in) :: env_id, n_el_pos
1417 REAL(kind=
dp),
DIMENSION(1:n_el_pos),
INTENT(in) :: pos
1418 REAL(kind=
dp),
INTENT(out) :: e_pot
1419 INTEGER,
INTENT(in) :: n_el_force
1420 REAL(kind=
dp),
DIMENSION(1:n_el_force), &
1421 INTENT(inout) :: force
1422 INTEGER,
INTENT(out) :: ierr
1426 calc_f = (n_el_force /= 0)
1427 CALL set_pos(env_id, pos, n_el_pos, ierr)
1429 IF (ierr == 0)
CALL get_energy(env_id, e_pot, ierr)
1430 IF (calc_f .AND. (ierr == 0))
CALL get_force(env_id, force, n_el_force, ierr)
1448 SUBROUTINE check_input(input_declaration, input_file_path, output_file_path, &
1449 echo_input, mpi_comm, initial_variables, ierr)
1450 TYPE(section_type),
POINTER :: input_declaration
1451 CHARACTER(len=*),
INTENT(in) :: input_file_path, output_file_path
1452 LOGICAL,
INTENT(in),
OPTIONAL :: echo_input
1453 TYPE(mp_comm_type),
INTENT(in),
OPTIONAL :: mpi_comm
1454 CHARACTER(len=default_path_length), &
1455 DIMENSION(:, :),
INTENT(IN) :: initial_variables
1456 INTEGER,
INTENT(out) :: ierr
1459 LOGICAL :: my_echo_input
1460 TYPE(cp_logger_type),
POINTER :: logger
1461 TYPE(mp_para_env_type),
POINTER :: para_env
1462 TYPE(section_vals_type),
POINTER :: input_file
1464 my_echo_input = .false.
1465 IF (
PRESENT(echo_input)) my_echo_input = echo_input
1467 IF (
PRESENT(mpi_comm))
THEN
1472 CALL para_env%retain()
1474 IF (para_env%is_source())
THEN
1475 IF (output_file_path ==
"__STD_OUT__")
THEN
1478 CALL open_file(file_name=output_file_path, file_status=
"UNKNOWN", &
1479 file_action=
"WRITE", file_position=
"APPEND", &
1480 unit_number=unit_nr)
1488 default_global_unit_nr=unit_nr, &
1489 close_global_unit_on_dealloc=.false.)
1493 input_file =>
read_input(input_declaration, input_file_path, initial_variables=initial_variables, &
1495 CALL check_cp2k_input(input_declaration, input_file, para_env=para_env, output_unit=unit_nr)
1496 IF (my_echo_input .AND. para_env%is_source())
THEN
1499 hide_defaults=.false.)
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
void grid_library_finalize(void)
Finalizes the grid library.
void grid_library_init(void)
Initializes the grid library.
Central dispatch for basic hooks.
procedure(cp_warn_interface), pointer, public cp_warn_hook
procedure(cp_abort_interface), pointer, public cp_abort_hook
procedure(timeset_interface), pointer, public timeset_hook
procedure(timestop_interface), pointer, public timestop_hook
collects all references to literature in CP2K as new algorithms / method are included from literature...
subroutine, public add_all_references()
adds references that can later be cited / printed using the key
Handles all functions related to the CELL.
subroutine, public init_cell(cell, hmat, periodic)
Initialise/readjust a simulation cell after hmat has been changed.
Handles all functions related to the CELL.
some minimal info about CP2K, including its version and license
subroutine, public get_runtime_info()
...
subroutine, public cp_dlaf_finalize()
Finalize DLA-Future and pika runtime.
subroutine, public cp_dlaf_initialize()
Initialize DLA-Future and pika runtime.
Module that contains the routines for error handling.
subroutine, public cp_error_handling_setup()
Registers handlers with base_hooks.F.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public init_preconnection_list()
Allocate and initialise the list of preconnected units.
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
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_logger_release(logger)
releases this logger
subroutine, public cp_logger_create(logger, para_env, print_level, default_global_unit_nr, default_local_unit_nr, global_filename, local_filename, close_global_unit_on_dealloc, iter_info, close_local_unit_on_dealloc, suffix, template_logger)
initializes a logger
integer function, public cp_default_logger_stack_size()
...
integer, parameter, public cp_failure_level
subroutine, public cp_logger_retain(logger)
retains the given logger (to be called to keep a shared copy of the logger)
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...
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
set of type/routines to handle the storage of results in force_envs
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
types that represent a subsys, i.e. a part of the system
subroutine, public unpack_subsys_particles(subsys, f, r, s, v, fscale, cell)
Unpack components of a subsystem particle sets into a single vector.
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)
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)
returns information about various attributes of the given subsys
subroutine, public dbm_library_init()
Initialize DBM library.
subroutine, public dbm_library_finalize()
Finalize DBM library.
The environment for the empirical interatomic potential methods.
subroutine, public eip_env_create(eip_env)
Creates the eip environment.
Methods and functions on the EIP environment.
subroutine, public eip_init(eip_env, root_section, para_env, force_env_section, subsys_section)
Initialize the eip environment.
Main force create for embedding.
subroutine, public embed_create_force_env(embed_env, root_section, para_env, force_env_section, n_subforce_eval, use_motion_section)
Controls program flow for embedded calculations.
Sets up and terminates the global environment variables.
subroutine, public cp2k_finalize(root_section, para_env, globenv, wdir, q_finalize)
Writes final timings and banner for CP2K.
subroutine, public cp2k_read(root_section, para_env, globenv)
read part of cp2k_init
subroutine, public cp2k_init(para_env, output_unit, globenv, input_file_name, wdir)
Initializes a CP2K run (setting of the global environment variables)
subroutine, public cp2k_setup(root_section, para_env, globenv)
globenv initializations that need the input and error
interface to use cp2k as library
recursive subroutine, public destroy_force_env(env_id, ierr, q_finalize)
deallocates the force_env with the given id
subroutine, public f_env_get_from_id(f_env_id, f_env)
...
subroutine, public set_vel(env_id, new_vel, n_el, ierr)
sets the velocities of the particles
subroutine, public get_nparticle(env_id, n_particle, ierr)
returns the number of particles in the given force env
subroutine, public get_natom(env_id, n_atom, ierr)
returns the number of atoms in the given force env
subroutine, public f_env_add_defaults(f_env_id, f_env, handle)
adds the default environments of the f_env to the stack of the defaults, and returns a new error and ...
subroutine, public get_cell(env_id, cell, per, ierr)
gets a cell
type(mp_para_env_type), pointer, save, public default_para_env
recursive subroutine, public calc_energy_force(env_id, calc_force, ierr)
updates the energy and the forces of given force_env
subroutine, public get_energy(env_id, e_pot, ierr)
returns the energy of the last configuration calculated
subroutine, public init_cp2k(init_mpi, ierr)
initializes cp2k, needs to be called once before using any of the other functions when using cp2k as ...
subroutine, public get_qmmm_cell(env_id, cell, ierr)
gets the qmmm cell
subroutine, public get_pos(env_id, pos, n_el, ierr)
gets the positions of the particles
subroutine, public get_result_r1(env_id, description, N, RESULT, res_exist, ierr)
gets a result from CP2K that is a real 1D array
recursive subroutine, public create_force_env(new_env_id, input_declaration, input_path, output_path, mpi_comm, output_unit, owns_out_unit, input, ierr, work_dir, initial_variables)
creates a new force environment using the given input, and writing the output to the given output uni...
recursive subroutine, public calc_energy(env_id, pos, n_el, e_pot, ierr)
returns the energy of the configuration given by the positions passed as argument
subroutine, public set_cell(env_id, new_cell, ierr)
sets a new cell
subroutine, public finalize_cp2k(finalize_mpi, ierr)
cleanup after you have finished using this interface
subroutine, public set_pos(env_id, new_pos, n_el, ierr)
sets the positions of the particles
subroutine, public get_stress_tensor(env_id, stress_tensor, ierr)
gets the stress tensor
subroutine, public check_input(input_declaration, input_file_path, output_file_path, echo_input, mpi_comm, initial_variables, ierr)
performs a check of the input
subroutine, public f_env_rm_defaults(f_env, ierr, handle)
removes the default environments of the f_env to the stack of the defaults, and sets ierr accordingly...
subroutine, public get_force(env_id, frc, n_el, ierr)
gets the forces of the particles
recursive subroutine, public calc_force(env_id, pos, n_el_pos, e_pot, force, n_el_force, ierr)
returns the energy of the configuration given by the positions passed as argument
perform classical molecular dynamics and path integral simulations
subroutine, public fist_create_force_env(force_env, root_section, para_env, globenv, qmmm, qmmm_env, force_env_section, subsys_section, use_motion_section, prev_subsys)
Controls program flow for classical MD and path-integrals.
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_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)
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
subroutine, public force_env_get_vel(force_env, vel, n)
returns the particle velocities in a dimension(*) array
subroutine, public multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
returns the order of the multiple force_env
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)
returns various attributes about the force environment
subroutine, public force_env_retain(force_env)
retains the given force env
subroutine, public force_env_get_pos(force_env, pos, n)
returns the particle positions in a dimension(*) array
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
subroutine, public force_env_get_frc(force_env, frc, n)
returns the particle forces in a dimension(*) array
recursive subroutine, public force_env_release(force_env)
releases the given force env
integer function, public force_env_get_nparticle(force_env)
returns the number of particles in a force environment
types used in the flexible partitioning scheme
subroutine, public fp_env_write(fp_env, fp_section)
writes information concerning the fp_env to the output
subroutine, public fp_env_read(fp_env, fp_section)
reads the corresponding input section and stores it in the fp_env
pure subroutine, public fp_env_create(fp_env)
create retain release the flexible partitioning environment
Define type storing the global information of a run. Keep the amount of stored data small....
subroutine, public globenv_create(globenv)
Creates the global environment globenv.
subroutine, public globenv_release(globenv)
Releases the global environment globenv.
Fortran API for the grid package, which is written in C.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Machine interface based on Fortran 2003 and POSIX.
integer, parameter, public default_output_unit
subroutine, public m_memory(mem)
Returns the total amount of memory [bytes] in use, if known, zero otherwise.
subroutine, public m_getcwd(curdir)
...
subroutine, public m_chdir(dir, ierror)
...
Interface to the message passing library MPI.
subroutine, public mp_world_init(mp_comm)
initializes the system default communicator
type(mp_comm_type), parameter, public mp_comm_world
subroutine, public mp_para_env_release(para_env)
releases the para object (to be called when you don't want anymore the shared copy of this object)
subroutine, public mp_world_finalize()
finalizes the system default communicator
perform biased molecular dynamics (H= k H1 + (1-k) H2 [linear or general mixing)
subroutine, public mixed_create_force_env(mixed_env, root_section, para_env, force_env_section, n_subforce_eval, use_motion_section)
Controls program flow for mixed calculations.
Defines all routines to deal with the performance of MPI routines.
subroutine, public mp_perf_env_release(perf_env)
...
subroutine, public rm_mp_perf_env()
...
type(mp_perf_env_type) function, pointer, public get_mp_perf_env()
...
elemental subroutine, public mp_perf_env_retain(perf_env)
...
subroutine, public add_mp_perf_env(perf_env)
start and stop the performance indicators for every call to start there has to be (exactly) one call ...
Data types for neural network potentials.
Methods dealing with Neural Network potentials.
subroutine, public nnp_init(nnp_env, root_section, para_env, force_env_section, subsys_section, use_motion_section)
Read and initialize all the information for neural network potentials.
Fortran API for the offload package, which is written in C.
subroutine, public offload_set_chosen_device(device_id)
Selects the chosen device to be used.
integer function, public offload_get_device_count()
Returns the number of available devices.
subroutine, public offload_init()
Initialize runtime.
integer function, public offload_get_chosen_device()
Returns the chosen device.
Periodic Table related data definitions.
subroutine, public init_periodic_table()
Initialization of Periodic Table related data.
subroutine, public pw_gpu_init()
Allocates resources on the gpu device for gpu fft acceleration.
subroutine, public pw_gpu_finalize()
Releases resources on the gpu device for gpu fft acceleration.
The type definitions for the PWDFT environment.
subroutine, public pwdft_env_create(pwdft_env)
Creates the pwdft environment.
Methods and functions on the PWDFT environment.
subroutine, public pwdft_init(pwdft_env, root_section, para_env, force_env_section, subsys_section, use_motion_section)
Initialize the pwdft environment.
Initialize a QM/MM calculation.
subroutine, public qmmm_env_create(qmmm_env, root_section, para_env, globenv, force_env_section, qmmm_section, subsys_section, use_motion_section, prev_subsys, ignore_outside_box)
...
Basic container type for QM/MM.
Initialize a QM/MM calculation with Force-Mixing.
subroutine, public qmmmx_env_create(qmmmx_env, root_section, para_env, globenv, force_env_section, subsys_section, use_motion_section)
...
Basic container type for QM/MM with force mixing.
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, 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_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_RI_aux_kp, matrix_s, matrix_s_RI_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
subroutine, public qs_env_create(qs_env, globenv)
allocates and intitializes a qs_env
subroutine, public qs_init(qs_env, para_env, root_section, globenv, cp_subsys, kpoint_env, cell, cell_ref, qmmm, qmmm_env_qm, force_env_section, subsys_section, use_motion_section)
Read the input and the database files for the setup of the QUICKSTEP environment.
provides a uniform framework to add references to CP2K cite and output these
subroutine, public remove_all_references()
deallocate the bibliography
generates a unique id number for a string (str2id) that can be used two compare two strings....
subroutine, public string_table_deallocate(iw)
deallocates the string table
subroutine, public string_table_allocate()
allocates the string table
Types used by timings.F and timings_report.F Due to the fortran restriction on cicular module-depende...
Timing routines for accounting.
subroutine, public timings_register_hooks()
Registers handlers with base_hooks.F.
type(timer_env_type) function, pointer, public get_timer_env()
returns the current timer env from the stack
subroutine, public add_timer_env(timer_env)
adds the given timer_env to the top of the stack
subroutine, public rm_timer_env()
removes the current timer env from the stack
subroutine, public timer_env_release(timer_env)
releases the given timer env
subroutine, public timer_env_retain(timer_env)
retains the given timer env