124#include "./base/base_uses.f90"
130 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'environment'
151 SUBROUTINE cp2k_init(para_env, output_unit, globenv, input_file_name, wdir)
154 INTEGER :: output_unit
156 CHARACTER(LEN=*) :: input_file_name
157 CHARACTER(LEN=*),
OPTIONAL :: wdir
159 CHARACTER(LEN=10*default_string_length) :: cp_flags
160 CHARACTER(LEN=default_path_length) :: path
161 INTEGER :: i, ilen, my_output_unit
164#if defined(__FAST_MATH__)
165 CALL cp_abort(__location__, &
166 "During compilation, one of the following flags was active: "// &
167 "`-ffast-math` (GCC) or `-hfpN` (Cray, N > 0, default N=2). "// &
168 "This can lead to wrong results and numerical instabilities "// &
169 "and is therefore no longer supported.")
173 CALL cp_abort(__location__, &
174 "Please do not build CP2K with NDEBUG. There is no "// &
175 "performance advantage and asserts will save your neck. "// &
176 "See also <https://github.com/cp2k/cp2k/pull/3172>.")
187 IF (para_env%is_source())
THEN
188 my_output_unit = output_unit
194 default_global_unit_nr=output_unit, &
195 close_global_unit_on_dealloc=.false.)
205 IF (my_output_unit > 0)
THEN
206 WRITE (unit=my_output_unit, fmt=
"(/,T2,A,T31,A50)") &
208 WRITE (unit=my_output_unit, fmt=
"(T2,A,T41,A40)") &
209 "CP2K| source code revision number:", &
212 ilen = len_trim(cp_flags)
213 WRITE (unit=my_output_unit, fmt=
"(T2,A)") &
214 "CP2K| "//cp_flags(1:73)
216 DO i = 0, (ilen - 75)/61
217 WRITE (unit=my_output_unit, fmt=
"(T2,A)") &
218 "CP2K| "//trim(cp_flags(74 + i*61:min(74 + (i + 1)*61, ilen)))
221 WRITE (unit=my_output_unit, fmt=
"(T2,A,T41,A40)") &
222 "CP2K| is freely available from ", &
224 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
225 "CP2K| Program compiled at", &
227 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
228 "CP2K| Program compiled on", &
230 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
231 "CP2K| Program compiled with", &
233 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
234 "CP2K| Program compiled for", &
237 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
238 "CP2K| Program compiled in", adjustr(path(1:50))
239 DO i = 51, len_trim(path), 50
240 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A)")
"CP2K|", path(i:min(len_trim(path), i + 49))
243 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
244 "CP2K| Program executable", adjustr(path(1:50))
245 DO i = 51, len_trim(path), 50
246 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A)")
"CP2K|", path(i:min(len_trim(path), i + 49))
249 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
250 "CP2K| Data directory path", adjustr(path(1:50))
251 DO i = 51, len_trim(path), 50
252 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A)")
"CP2K|", path(i:min(len_trim(path), i + 49))
254 path = input_file_name
255 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A50)") &
256 "CP2K| Input file name", adjustr(path(1:50))
257 DO i = 51, len_trim(path), 50
258 WRITE (unit=my_output_unit, fmt=
"(T2,A,T31,A)")
"CP2K|", path(i:min(len_trim(path), i + 49))
260 FLUSH (my_output_unit)
270 SUBROUTINE echo_all_hosts(para_env, output_unit)
272 INTEGER,
INTENT(IN) :: output_unit
274 CHARACTER(LEN=default_string_length) :: string
276 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: all_pid
277 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: all_host
281 ALLOCATE (all_pid(para_env%num_pe), source=0)
282 all_pid(para_env%mepos + 1) =
r_pid
284 CALL para_env%sum(all_pid)
285 ALLOCATE (all_host(30, para_env%num_pe), source=0)
288 CALL para_env%sum(all_host)
289 IF (output_unit > 0)
THEN
290 WRITE (unit=output_unit, fmt=
"(T2,A)")
""
291 DO ipe = 1, para_env%num_pe
293 WRITE (unit=output_unit, fmt=
"(T2,A,T63,I8,T71,I10)") &
295 " has created rank and process ", ipe - 1, all_pid(ipe)
300 DEALLOCATE (all_host)
302 END SUBROUTINE echo_all_hosts
310 SUBROUTINE echo_all_process_host(para_env, output_unit, node_count)
312 INTEGER,
INTENT(IN) :: output_unit
313 INTEGER,
INTENT(OUT),
OPTIONAL :: node_count
315 CHARACTER(LEN=default_string_length) :: string, string_sec
316 INTEGER :: ipe, jpe, nr_dist, nr_occu
317 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: all_pid
318 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: all_host
320 ALLOCATE (all_host(30, para_env%num_pe), source=0)
321 ALLOCATE (all_pid(para_env%num_pe), source=0)
325 CALL para_env%sum(all_host)
329 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(T2,A)")
""
330 DO ipe = 1, para_env%num_pe
332 IF (all_pid(ipe) /= -1)
THEN
334 DO jpe = 1, para_env%num_pe
336 IF (string == string_sec)
THEN
337 nr_occu = nr_occu + 1
341 IF (output_unit > 0)
THEN
342 WRITE (unit=output_unit, fmt=
"(T2,A,T63,I8,A)") &
344 " is running ", nr_occu,
" processes"
346 nr_dist = nr_dist + 1
351 DEALLOCATE (all_host)
353 cpassert(0 < nr_dist)
354 IF (
PRESENT(node_count)) node_count = nr_dist
356 END SUBROUTINE echo_all_process_host
377 CHARACTER(LEN=default_string_length) :: c_val
388 IF (c_val /=
"")
THEN
390 local_filename=trim(c_val)//
"_localLog")
395 IF (index(c_val(:len_trim(c_val)),
" ") > 0)
THEN
396 CALL cp_warn(__location__, &
397 "Project name <"//trim(c_val)//
"> contains one or more "// &
398 "whitespaces; replacing them with underscores to reset "// &
399 "the project name for better file naming practices now.")
400 DO i = 1, len_trim(c_val)
402 IF (c_val(i:i) ==
" ") c_val(i:i) =
"_"
406 IF (c_val /=
"")
THEN
407 CALL cp_logger_set(logger, local_filename=trim(c_val)//
"_localLog")
409 logger%iter_info%project_name = c_val
412 i_val=logger%iter_info%print_level)
415 CALL read_cp2k_section(root_section, para_env, globenv)
421 "GLOBAL%PRINT/BASIC_DATA_TYPES")
427 "GLOBAL%PRINT/PHYSCON")
448 INTEGER,
DIMENSION(:),
POINTER :: seed_vals
449 REAL(kind=
dp),
DIMENSION(3, 2) :: initial_seed
464 "GLOBAL%PRINT/RNG_MATRICES")
469 IF (
SIZE(seed_vals) == 1)
THEN
470 initial_seed(:, :) = real(seed_vals(1), kind=
dp)
471 ELSE IF (
SIZE(seed_vals) == 6)
THEN
472 initial_seed(1:3, 1:2) = reshape(real(seed_vals(:), kind=
dp), [3, 2])
474 cpabort(
"Supply exactly 1 or 6 arguments for SEED in &GLOBAL only!")
478 name=
"Global Gaussian random numbers", &
481 extended_precision=.true.)
490 "GLOBAL%PRINT/RNG_CHECK")
495 CALL globenv%gaussian_rng_stream%write(iw, write_all=.true.)
499 "GLOBAL%PRINT/GLOBAL_GAUSSIAN_RNG")
527 SUBROUTINE read_global_section(root_section, para_env, globenv)
533 CHARACTER(LEN=6),
PARAMETER :: start_section_label =
"GLOBAL"
535 CHARACTER(LEN=13) :: omp_stacksize, tracing_string
536 CHARACTER(LEN=6) :: print_level_string
537 CHARACTER(LEN=default_path_length) :: basis_set_file_name, coord_file_name, &
538 mm_potential_file_name, &
540 CHARACTER(LEN=default_string_length) :: env_num, model_name, project_name
541 CHARACTER(LEN=default_string_length), &
542 DIMENSION(:),
POINTER :: trace_routines
543 INTEGER :: cpuid, cpuid_static, i_cholesky, i_dgemm, i_diag, i_fft, i_grid_backend, &
544 iforce_eval, method_name_id, n_rep_val, nforce_eval, node_count, num_threads, &
545 output_unit, print_level, trace_max, unit_nr
546 INTEGER(kind=int_8) :: buffers, buffers_avr, buffers_max, buffers_min, cached, cached_avr, &
547 cached_max, cached_min, memfree, memfree_avr, memfree_max, memfree_min, memlikelyfree, &
548 memlikelyfree_avr, memlikelyfree_max, memlikelyfree_min, memtotal, memtotal_avr, &
549 memtotal_max, memtotal_min, slab, slab_avr, slab_max, slab_min, sreclaimable, &
550 sreclaimable_avr, sreclaimable_max, sreclaimable_min
551 INTEGER,
DIMENSION(:),
POINTER :: i_force_eval
552 LOGICAL :: ata, do_echo_all_hosts, explicit, flag, &
553 report_maxloc, trace, trace_master
559 global_section, qmmm_section, &
562 NULLIFY (dft_section, global_section, i_force_eval)
570 l_val=globenv%direct_generalized_diagonalization)
583 CALL section_vals_val_get(global_section,
"DLAF_CHOLESKY_N_MIN", i_val=globenv%dlaf_cholesky_n_min)
587 CALL section_vals_val_get(global_section,
"FFT_POOL_SCRATCH_LIMIT", i_val=globenv%fft_pool_scratch_limit)
590 CALL section_vals_val_get(global_section,
"FFTW_WISDOM_FILE_NAME", c_val=globenv%fftw_wisdom_file_name, &
591 explicit=globenv%fftw_wisdom_file_explicit)
594 walltime=globenv%cp2k_target_time)
602 NULLIFY (trace_routines)
608 do_echo_all_hosts = do_echo_all_hosts .OR. report_maxloc
614 CALL fm_setup(global_section)
615 CALL fm_diag_rules_setup(global_section)
616 CALL dgemm_setup(global_section)
618 IF (trace .AND. (.NOT. trace_master .OR. para_env%mepos == 0))
THEN
620 IF (logger%para_env%is_source() .OR. .NOT. trace_master)
THEN
623 WRITE (tracing_string,
"(I6.6,A1,I6.6)") para_env%mepos,
":", para_env%num_pe
624 IF (
ASSOCIATED(trace_routines))
THEN
635 globenv%diag_library =
"ScaLAPACK"
637 globenv%diag_library =
"ELPA"
640 globenv%diag_library =
"cuSOLVER"
642 globenv%diag_library =
"DLAF"
645 cpabort(
"Unknown diagonalization library specified")
648 SELECT CASE (i_cholesky)
650 globenv%cholesky_library =
"ScaLAPACK"
653 globenv%cholesky_library =
"DLAF"
658 cpabort(
"Unknown Cholesky decomposition library specified")
663 globenv%default_fft_library =
"FFTSG"
665 globenv%default_fft_library =
"FFTW3"
668 cpabort(
"Unknown FFT library specified")
671 SELECT CASE (i_dgemm)
673 globenv%default_dgemm_library =
"SPLA"
675 globenv%default_dgemm_library =
"BLAS"
677 cpabort(
"Unknown DGEMM library specified")
680 IF (globenv%run_type_id == 0)
THEN
681 SELECT CASE (globenv%prog_name_id)
685 IF (nforce_eval /= 1)
THEN
691 SELECT CASE (method_name_id)
706 cpabort(
"FARMING program supports only NONE as run type")
709 IF (globenv%prog_name_id ==
do_test .AND. globenv%run_type_id /=
none_run)
THEN
710 cpabort(
"TEST program supports only NONE as run type")
713 CALL m_memory_details(memtotal, memfree, buffers, cached, slab, sreclaimable, memlikelyfree)
714 memtotal_avr = memtotal
715 memfree_avr = memfree
716 buffers_avr = buffers
719 sreclaimable_avr = sreclaimable
720 memlikelyfree_avr = memlikelyfree
721 CALL para_env%sum(memtotal_avr); memtotal_avr = memtotal_avr/para_env%num_pe/1024
722 CALL para_env%sum(memfree_avr); memfree_avr = memfree_avr/para_env%num_pe/1024
723 CALL para_env%sum(buffers_avr); buffers_avr = buffers_avr/para_env%num_pe/1024
724 CALL para_env%sum(cached_avr); cached_avr = cached_avr/para_env%num_pe/1024
725 CALL para_env%sum(slab_avr); slab_avr = slab_avr/para_env%num_pe/1024
726 CALL para_env%sum(sreclaimable_avr); sreclaimable_avr = sreclaimable_avr/para_env%num_pe/1024
727 CALL para_env%sum(memlikelyfree_avr); memlikelyfree_avr = memlikelyfree_avr/para_env%num_pe/1024
729 memtotal_min = -memtotal
730 memfree_min = -memfree
731 buffers_min = -buffers
734 sreclaimable_min = -sreclaimable
735 memlikelyfree_min = -memlikelyfree
736 CALL para_env%max(memtotal_min); memtotal_min = -memtotal_min/1024
737 CALL para_env%max(memfree_min); memfree_min = -memfree_min/1024
738 CALL para_env%max(buffers_min); buffers_min = -buffers_min/1024
739 CALL para_env%max(cached_min); cached_min = -cached_min/1024
740 CALL para_env%max(slab_min); slab_min = -slab_min/1024
741 CALL para_env%max(sreclaimable_min); sreclaimable_min = -sreclaimable_min/1024
742 CALL para_env%max(memlikelyfree_min); memlikelyfree_min = -memlikelyfree_min/1024
744 memtotal_max = memtotal
745 memfree_max = memfree
746 buffers_max = buffers
749 sreclaimable_max = sreclaimable
750 memlikelyfree_max = memlikelyfree
751 CALL para_env%max(memtotal_max); memtotal_max = memtotal_max/1024
752 CALL para_env%max(memfree_max); memfree_max = memfree_max/1024
753 CALL para_env%max(buffers_max); buffers_max = buffers_max/1024
754 CALL para_env%max(cached_max); cached_max = cached_max/1024
755 CALL para_env%max(slab_max); slab_max = slab_max/1024
756 CALL para_env%max(sreclaimable_max); sreclaimable_max = sreclaimable_max/1024
757 CALL para_env%max(memlikelyfree_max); memlikelyfree_max = memlikelyfree_max/1024
759 memtotal = memtotal/1024
760 memfree = memfree/1024
761 buffers = buffers/1024
764 sreclaimable = sreclaimable/1024
765 memlikelyfree = memlikelyfree/1024
769 IF (do_echo_all_hosts)
THEN
770 CALL echo_all_hosts(para_env, output_unit)
773 CALL echo_all_process_host(para_env, output_unit, node_count)
775 CALL echo_all_process_host(para_env, 0, node_count)
780 IF (output_unit > 0)
THEN
781 WRITE (unit=output_unit, fmt=*)
782 CALL multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
783 DO iforce_eval = 1, nforce_eval
785 i_rep_section=i_force_eval(iforce_eval))
787 i_rep_section=i_force_eval(iforce_eval))
789 c_val=basis_set_file_name)
791 c_val=potential_file_name)
794 c_val=mm_potential_file_name)
797 i_rep_section=i_force_eval(iforce_eval))
799 coord_file_name =
"__STD_INPUT__"
803 IF (n_rep_val == 1)
THEN
805 c_val=coord_file_name)
810 WRITE (unit=output_unit, fmt=
"(T2,A,T41,A)") &
811 start_section_label//
"| Force Environment number", &
812 adjustr(env_num(:40)), &
813 start_section_label//
"| Basis set file name", &
814 adjustr(basis_set_file_name(:40)), &
815 start_section_label//
"| Potential file name", &
816 adjustr(potential_file_name(:40)), &
817 start_section_label//
"| MM Potential file name", &
818 adjustr(mm_potential_file_name(:40)), &
819 start_section_label//
"| Coordinate file name", &
820 adjustr(coord_file_name(:40))
822 DEALLOCATE (i_force_eval)
824 NULLIFY (enum1, enum2, keyword, section)
831 WRITE (unit=output_unit, fmt=
"(T2,A,T41,A40)") &
832 start_section_label//
"| Method name", &
833 adjustr(trim(
enum_i2c(enum1, globenv%prog_name_id))), &
834 start_section_label//
"| Project name", &
835 adjustr(project_name(:40)), &
836 start_section_label//
"| Run type", &
837 adjustr(trim(
enum_i2c(enum2, globenv%run_type_id))), &
838 start_section_label//
"| FFT library", &
839 adjustr(globenv%default_fft_library(:40)), &
840 start_section_label//
"| Diagonalization library", &
841 adjustr(globenv%diag_library(:40)), &
842 start_section_label//
"| Cholesky decomposition library", &
843 adjustr(globenv%cholesky_library(:40)), &
844 start_section_label//
"| DGEMM library", &
845 adjustr(globenv%default_dgemm_library(:40))
847 IF (globenv%diag_library ==
"ELPA")
THEN
848 WRITE (unit=output_unit, fmt=
"(T2,A,T71,I10)") &
849 start_section_label//
"| Minimum number of eigenvectors for ELPA usage", &
850 globenv%elpa_neigvec_min
853 IF (globenv%diag_library ==
"DLAF")
THEN
854 WRITE (unit=output_unit, fmt=
"(T2,A,T71,I10)") &
855 start_section_label//
"| Minimum number of eigenvectors for DLAF usage", &
856 globenv%dlaf_neigvec_min
859 IF (globenv%diag_library ==
"cuSOLVER" .OR. globenv%diag_library ==
"ScaLAPACK" .OR. &
860 globenv%diag_library ==
"DLAF")
THEN
861 WRITE (unit=output_unit, fmt=
"(T2,A,T71,L10)") &
862 start_section_label//
"| Direct generalized diagonalization requested", &
863 globenv%direct_generalized_diagonalization
866 IF (globenv%diag_library ==
"cuSOLVER")
THEN
867 WRITE (unit=output_unit, fmt=
"(T2,A,T71,I10)") &
868 start_section_label//
"| Minimum matrix size for cuSOLVER diagonalization", &
872 IF (globenv%cholesky_library ==
"DLAF")
THEN
873 WRITE (unit=output_unit, fmt=
"(T2,A,T71,I10)") &
874 start_section_label//
"| Minimum matrix size for Cholesky decomposition with DLAF", &
875 globenv%dlaf_cholesky_n_min
878#if defined(__CHECK_DIAG)
880 IF (globenv%eps_check_diag < 0.0_dp)
THEN
881 WRITE (unit=output_unit, fmt=
"(T2,A,T71,ES10.3)") &
882 start_section_label//
"| Orthonormality check for eigenvectors enabled", &
885 WRITE (unit=output_unit, fmt=
"(T2,A,T71,ES10.3)") &
886 start_section_label//
"| Orthonormality check for eigenvectors enabled", &
887 globenv%eps_check_diag
890 IF (globenv%eps_check_diag < 0.0_dp)
THEN
891 WRITE (unit=output_unit, fmt=
"(T2,A,T73,A)") &
892 start_section_label//
"| Orthonormality check for eigenvectors", &
895 WRITE (unit=output_unit, fmt=
"(T2,A,T71,ES10.3)") &
896 start_section_label//
"| Orthonormality check for eigenvectors enabled", &
897 globenv%eps_check_diag
904 WRITE (unit=output_unit, fmt=
"(T2,A,T72,A)") &
905 start_section_label//
"| Matrix multiplication library",
"ScaLAPACK"
907 WRITE (unit=output_unit, fmt=
"(T2,A,T76,A)") &
908 start_section_label//
"| Matrix multiplication library",
"COSMA"
912 WRITE (unit=output_unit, fmt=
"(T2,A,T80,L1)") &
913 start_section_label//
"| All-to-all communication in single precision", ata
915 SELECT CASE (print_level)
917 print_level_string =
"SILENT"
919 print_level_string =
" LOW"
921 print_level_string =
"MEDIUM"
923 print_level_string =
" HIGH"
925 print_level_string =
" DEBUG"
927 cpabort(
"Unknown print_level")
931 SELECT CASE (i_grid_backend)
933 WRITE (unit=output_unit, fmt=
"(T2,A,T75,A6)") &
934 start_section_label//
"| Grid backend",
"AUTO"
936 WRITE (unit=output_unit, fmt=
"(T2,A,T75,A6)") &
937 start_section_label//
"| Grid backend",
"CPU"
939 WRITE (unit=output_unit, fmt=
"(T2,A,T75,A6)") &
940 start_section_label//
"| Grid backend",
"DGEMM"
942 WRITE (unit=output_unit, fmt=
"(T2,A,T75,A6)") &
943 start_section_label//
"| Grid backend",
"GPU"
945 WRITE (unit=output_unit, fmt=
"(T2,A,T75,A6)") &
946 start_section_label//
"| Grid backend",
"REF"
949 WRITE (unit=output_unit, fmt=
"(T2,A,T75,A6)") &
950 start_section_label//
"| Global print level", print_level_string
951 WRITE (unit=output_unit, fmt=
"(T2,A,T75,L6)") &
952 start_section_label//
"| MPI I/O enabled", flag
953 WRITE (unit=output_unit, fmt=
"(T2,A,T75,I6)") &
954 start_section_label//
"| Total number of message passing processes", &
956 start_section_label//
"| Number of distributed systems (nodes)", &
958 start_section_label//
"| Number of threads for this process", &
960 start_section_label//
"| This output is from process", para_env%mepos
963 WRITE (unit=output_unit, fmt=
"(T2,A,T68,A13)") &
964 start_section_label//
"| OpenMP stack size per thread (OMP_STACKSIZE)", &
965 adjustr(omp_stacksize)
968 WRITE (unit=output_unit, fmt=
"(T2,A,T68,A13)") &
969 start_section_label//
"| OpenMP issue trace (CP2K_OMP_TRACE)", &
974 WRITE (unit=output_unit, fmt=
"(T2,A,T30,A51)") &
975 start_section_label//
"| CPU model name", adjustr(trim(model_name))
980 IF ((cpuid > 0) .OR. (cpuid_static > 0))
THEN
981 WRITE (unit=output_unit, fmt=
"(T2,A,T75,I6)") &
982 start_section_label//
"| CPUID", cpuid
983 IF (cpuid /= cpuid_static)
THEN
984 WRITE (unit=output_unit, fmt=
"(T2,A,T75,I6)") &
985 start_section_label//
"| Compiled for CPUID", cpuid_static
992 CALL cp_hint(__location__,
"The compiler target ("// &
993 trim(
m_cpuid_name(cpuid_static))//
") used to build this binary does "// &
994 "not enable all instruction-set extensions available on this CPU ("// &
995 trim(
m_cpuid_name(cpuid))//
"). Consider reconfiguring and rebuilding "// &
996 "CP2K for this target system to enable them.")
999 WRITE (unit=output_unit, fmt=
"(/,T2,A)") &
1000 "MEMORY| system memory details [Kb]"
1001 WRITE (unit=output_unit, fmt=
"(T2,A23,4A14)") &
1002 "MEMORY| ",
"rank 0",
"min",
"max",
"average"
1003 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1004 "MEMORY| MemTotal ", memtotal, memtotal_min, memtotal_max, memtotal_avr
1005 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1006 "MEMORY| MemFree ", memfree, memfree_min, memfree_max, memfree_avr
1007 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1008 "MEMORY| Buffers ", buffers, buffers_min, buffers_max, buffers_avr
1009 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1010 "MEMORY| Cached ", cached, cached_min, cached_max, cached_avr
1011 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1012 "MEMORY| Slab ", slab, slab_min, slab_max, slab_avr
1013 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1014 "MEMORY| SReclaimable ", sreclaimable, sreclaimable_min, sreclaimable_max, &
1016 WRITE (unit=output_unit, fmt=
"(T2,A23,4I14)") &
1017 "MEMORY| MemLikelyFree ", memlikelyfree, memlikelyfree_min, memlikelyfree_max, &
1019 WRITE (unit=output_unit, fmt=
'()')
1026 END SUBROUTINE read_global_section
1037 SUBROUTINE read_cp2k_section(root_section, para_env, globenv)
1043 INTEGER :: output_unit
1048 CALL read_global_section(root_section, para_env, globenv)
1053 CALL integral_setup_library(global_section)
1054 CALL fft_setup_library(globenv, global_section)
1055 CALL diag_setup_library(globenv, global_section)
1065 END SUBROUTINE read_cp2k_section
1071 SUBROUTINE integral_setup_library(global_section)
1074 INTEGER :: coulomb2_library, coulomb3_library
1075 LOGICAL :: fallback_applied
1078 i_val=coulomb2_library)
1080 i_val=coulomb3_library)
1083 IF (fallback_applied)
THEN
1084 CALL cp_warn(__location__, &
1085 "Integral library Libint is not available. "// &
1086 "The native integral library is used as fallback.")
1089 END SUBROUTINE integral_setup_library
1100 SUBROUTINE fft_setup_library(globenv, global_section)
1105 CHARACTER(LEN=3*default_string_length) :: message
1106 COMPLEX(KIND=dp),
DIMENSION(4, 4, 4) :: zz
1108 INTEGER,
DIMENSION(3) :: n
1112 zz(:, :, :) = 0.0_dp
1119 IF (globenv%default_fft_library ==
"FFTW3")
THEN
1126 CALL init_fft(fftlib=trim(globenv%default_fft_library), &
1128 pool_limit=globenv%fft_pool_scratch_limit, &
1129 wisdom_file=globenv%fftw_wisdom_file_name, &
1130 plan_style=globenv%fftw_plan_type)
1136 message =
"FFT library "//trim(globenv%default_fft_library)// &
1137 " is not available. Trying FFT library FFTW3."
1138 cpwarn(trim(message))
1139 globenv%default_fft_library =
"FFTW3"
1140 CALL init_fft(fftlib=trim(globenv%default_fft_library), &
1142 pool_limit=globenv%fft_pool_scratch_limit, &
1143 wisdom_file=globenv%fftw_wisdom_file_name, &
1144 plan_style=globenv%fftw_plan_type)
1149 message =
"FFT library "//trim(globenv%default_fft_library)// &
1150 " is not available. Trying FFT library FFTSG."
1151 cpwarn(trim(message))
1152 globenv%default_fft_library =
"FFTSG"
1153 CALL init_fft(fftlib=trim(globenv%default_fft_library), &
1155 pool_limit=globenv%fft_pool_scratch_limit, &
1156 wisdom_file=globenv%fftw_wisdom_file_name, &
1157 plan_style=globenv%fftw_plan_type)
1161 cpabort(
"FFT library FFTSG does not work. No FFT library available.")
1166 END SUBROUTINE fft_setup_library
1175 SUBROUTINE diag_setup_library(globenv, global_section)
1183 CALL diag_init(diag_lib=trim(globenv%diag_library), &
1184 fallback_applied=fallback_applied, &
1186 elpa_kernel=globenv%k_elpa, &
1187 elpa_c_kernel=globenv%k_elpa_c, &
1188 elpa_neigvec_min_input=globenv%elpa_neigvec_min, &
1189 elpa_qr=globenv%elpa_qr, &
1190 elpa_print=globenv%elpa_print, &
1191 elpa_one_stage=globenv%elpa_one_stage, &
1192 dlaf_neigvec_min_input=globenv%dlaf_neigvec_min, &
1193 eps_check_diag_input=globenv%eps_check_diag, &
1194 direct_generalized_diagonalization_input= &
1195 globenv%direct_generalized_diagonalization)
1197 IF (fallback_applied)
THEN
1198 CALL cp_warn(__location__, &
1199 "Diagonalization library "//trim(globenv%diag_library)//
" is "// &
1200 "not available. The ScaLAPACK library is used as fallback.")
1203 END SUBROUTINE diag_setup_library
1209 SUBROUTINE fm_setup(glob_section)
1212 INTEGER :: mm_type, ncb, nrb
1226 END SUBROUTINE fm_setup
1232 SUBROUTINE dgemm_setup(glob_section)
1235 INTEGER :: dgemm_type
1241 END SUBROUTINE dgemm_setup
1249 SUBROUTINE fm_diag_rules_setup(glob_section)
1253 LOGICAL :: elpa_force_redistribute, should_print
1265 END SUBROUTINE fm_diag_rules_setup
1277 CHARACTER(LEN=*),
INTENT(in) :: keyword_name
1278 REAL(kind=
dp),
INTENT(out) :: walltime
1280 CHARACTER(LEN=1) :: c1, c2
1281 CHARACTER(LEN=100) :: txt
1282 INTEGER :: hours, ierr, minutes, n,
seconds
1289 ELSE IF (index(txt,
":") == 0)
THEN
1290 READ (txt(1:n), fmt=*, iostat=ierr) walltime
1291 IF (ierr /= 0) cpabort(
'Could not parse WALLTIME: "'//txt(1:n)//
'"')
1293 READ (txt(1:n), fmt=
"(I2,A1,I2,A1,I2)", iostat=ierr) hours, c1, minutes, c2,
seconds
1294 IF (n /= 8 .OR. ierr /= 0 .OR. c1 /=
":" .OR. c2 /=
":")
THEN
1295 cpabort(
'Could not parse WALLTIME: "'//txt(1:n)//
'"')
1297 walltime = 3600.0_dp*real(hours,
dp) + 60.0_dp*real(minutes,
dp) + real(
seconds,
dp)
1323 CHARACTER(LEN=*),
OPTIONAL :: wdir
1324 LOGICAL,
INTENT(IN),
OPTIONAL :: q_finalize
1326 CHARACTER(LEN=default_path_length) :: cg_filename
1327 INTEGER :: cg_mode, iw, unit_exit
1328 LOGICAL :: delete_it, do_finalize, report_maxloc, &
1330 REAL(kind=
dp) :: r_timings
1337 do_finalize = .true.
1338 IF (
PRESENT(q_finalize)) do_finalize = q_finalize
1342 IF (do_finalize)
THEN
1350 CALL finalize_fft(para_env, globenv%fftw_wisdom_file_name, &
1351 export_wisdom=globenv%fftw_wisdom_file_explicit)
1361 "GLOBAL%PROGRAM_RUN_INFO")
1367 WRITE (unit=iw, fmt=
"(/,T2,A)") repeat(
"-", 79)
1368 WRITE (unit=iw, fmt=
"(T2,A,T80,A)")
"-",
"-"
1369 WRITE (unit=iw, fmt=
"(T2,A,T30,A,T80,A)")
"-",
"R E F E R E N C E S",
"-"
1370 WRITE (unit=iw, fmt=
"(T2,A,T80,A)")
"-",
"-"
1371 WRITE (unit=iw, fmt=
"(T2,A)") repeat(
"-", 79)
1372 WRITE (unit=iw, fmt=
"(T2,A)")
""
1373 WRITE (unit=iw, fmt=
"(T2,A)") trim(
cp2k_version)//
", the CP2K developers group ("//trim(
cp2k_year)//
")."
1374 WRITE (unit=iw, fmt=
"(T2,A)")
"CP2K is freely available from "//trim(
cp2k_home)//
" ."
1375 WRITE (unit=iw, fmt=
"(T2,A)")
""
1379 "GLOBAL%REFERENCES")
1381 CALL timestop(globenv%handle)
1386 sort_by_self_time =
section_get_lval(root_section,
"GLOBAL%TIMINGS%SORT_BY_SELF_TIME")
1387 report_maxloc =
section_get_lval(root_section,
"GLOBAL%TIMINGS%REPORT_MAXLOC")
1397 IF (len_trim(cg_filename) == 0) cg_filename = trim(logger%iter_info%project_name)
1400 cg_filename = trim(cg_filename)//
"_"//trim(adjustl(
cp_to_string(para_env%mepos)))
1403 WRITE (unit=iw, fmt=
"(T2,3X,A)") &
1404 "Writing callgraph to: "//trim(cg_filename)//
".callgraph"
1405 WRITE (unit=iw, fmt=
"(/,T2,A)") &
1406 "-------------------------------------------------------------------------------"
1408 IF (cg_mode ==
callgraph_all .OR. para_env%is_source())
THEN
1419 IF (para_env%is_source())
THEN
1425 INQUIRE (file=
"EXIT", exist=delete_it)
1427 CALL open_file(file_name=
"EXIT", unit_number=unit_exit)
1428 CALL close_file(unit_number=unit_exit, file_status=
"DELETE")
1432 INQUIRE (file=trim(logger%iter_info%project_name)//
".EXIT", exist=delete_it)
1434 CALL open_file(file_name=trim(logger%iter_info%project_name)//
".EXIT", unit_number=unit_exit)
1435 CALL close_file(unit_number=unit_exit, file_status=
"DELETE")
1441 WRITE (iw,
"(T2,A,I0)")
"The number of traced issues for OpenMP : ",
m_omp_trace_issues()
1443 WRITE (iw,
"(T2,A,I0)")
"The number of warnings for this run is : ",
warning_counter
1445 WRITE (unit=iw, fmt=
"(T2,A)") repeat(
"-", 79)
1453 IF (iw > 0)
FLUSH (iw)
1456 "GLOBAL%PROGRAM_RUN_INFO")
Target architecture or instruction set extension according to compiler target flags.
Trace OpenMP constructs if ennvironment variable CP2K_OMP_TRACE=1.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public marek2014
integer, save, public solca2024
integer, save, public frigo2005
some minimal info about CP2K, including its version and license
character(len=default_string_length), save, public compile_date
character(len=default_string_length), public r_host_name
character(len= *), parameter, public cp2k_home
character(len= *), parameter, public compile_host
character(len= *), parameter, public compile_arch
character(len= *), parameter, public compile_with
character(len= *), parameter, public compile_revision
character(len= *), parameter, public cp2k_year
character(len=10 *default_string_length) function, public cp2k_flags()
list all compile time options that influence the capabilities of cp2k. All new flags should be added ...
character(len= *), parameter, public cp2k_version
subroutine, public get_runtime_info()
...
character(len=default_string_length), public r_user_name
Wrapper for ELPA (complex matrices, i.e. cp_cfm_type).
subroutine, public check_elpa_c_kernel_correctness(para_env)
One-time runtime correctness check for ELPA complex BLOCK2 kernels. A small deterministic eigenproble...
Module that contains the routines for error handling.
integer, save, public warning_counter
Utility routines to open and close files.
character(len=default_path_length) function, public get_compile_dir()
Returns the build directory.
subroutine, public open_file(file_name, unit_number, file_status, file_form, file_action, file_position, file_pad, file_access, debug)
Opens a file and returns its logical unit number.
subroutine, public close_file(unit_number, file_status)
Closes an open file given by its logical unit number.
character(len=default_path_length) function, public get_data_dir()
Returns path of data directory if set, otherwise an empty string.
various cholesky decomposition related routines
integer, parameter, public fm_cholesky_type_dlaf
integer, parameter, public fm_cholesky_type_scalapack
integer, save, public dlaf_cholesky_n_min
integer, save, public cholesky_type
Auxiliary tools to redistribute cp_fm_type and cp_cfm_type matrices before and after diagonalization....
subroutine, public cp_fm_redistribute_init(a, x, should_print, elpa_force_redistribute)
Initializes the parameters that determine how to calculate the optimal number of CPUs for diagonalizi...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
real(kind=dp), parameter, public eps_check_diag_default
integer, parameter, public fm_diag_type_cusolver
integer, parameter, public fm_diag_type_dlaf
integer, parameter, public fm_diag_type_scalapack
subroutine, public diag_finalize()
Finalize the diagonalization library.
subroutine, public diag_init(diag_lib, fallback_applied, elpa_kernel, elpa_c_kernel, elpa_neigvec_min_input, elpa_qr, elpa_print, elpa_one_stage, dlaf_neigvec_min_input, eps_check_diag_input, direct_generalized_diagonalization_input, diag_lib_explicit_input)
Setup the diagonalization library to be used.
integer, save, public diag_type
integer, parameter, public fm_diag_type_elpa
integer, parameter, public cusolver_n_min
logical, save, public diag_lib_explicit
represent the structure of a full matrix
subroutine, public cp_fm_struct_config(nrow_block, ncol_block, force_block)
allows to modify the default settings for matrix creation
represent a full matrix distributed on many processors
integer function, public cp_fm_get_mm_type()
...
subroutine, public cp_fm_setup(mm_type)
...
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_logger_set(logger, local_filename, global_filename)
sets various attributes of the given logger
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
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_mpi_io_set(flag)
Sets flag which determines whether or not to use MPI I/O for I/O routines that have been parallized w...
integer, parameter, public debug_print_level
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
integer, parameter, public low_print_level
integer, parameter, public medium_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 high_print_level
integer, parameter, public silent_print_level
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_get_walltime(section, keyword_name, walltime)
reads the Walltime also in format HH:MM:SS
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 for the force calculations.
subroutine, public multiple_fe_list(force_env_sections, root_section, i_force_eval, nforce_eval)
returns the order of the multiple force_env
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
subroutine, public deallocate_md_ftable()
Deallocate the table of F_n(t) values.
Define type storing the global information of a run. Keep the amount of stored data small....
Fortran API for the grid package, which is written in C.
integer, parameter, public grid_backend_auto
integer, parameter, public grid_backend_gpu
integer, parameter, public grid_backend_dgemm
integer, parameter, public grid_backend_cpu
integer, parameter, public grid_backend_ref
Library choices for electronic integral APIs.
subroutine, public integral_library_init(coulomb2_library, coulomb3_library, fallback_applied)
Resolves requested Coulomb integral libraries against the compiled-in backends.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
subroutine, public print_kind_info(iw)
Print informations about the used data types.
subroutine, public local_gemm_set_library(dgemm_library)
Select the backend for subsequent local GEMM calls and context creation.
Machine interface based on Fortran 2003 and POSIX.
logical, save, public flush_should_flush
integer function, public m_procrun(pid)
Returns if a process is running on the local machine 1 if yes and 0 if not.
subroutine, public m_memory_details(memtotal, memfree, buffers, cached, slab, sreclaimable, memlikelyfree)
get more detailed memory info, all units are bytes. the only 'useful' option is MemLikelyFree which i...
pure integer function, public m_cpuid()
Target architecture or instruction set extension according to CPU-check at runtime.
pure integer function, public m_cpuid_vlen(cpuid, typesize)
Determine vector-length for a given CPUID.
real(kind=dp) function, public m_energy()
returns the energy used since some time in the past. The precise meaning depends on the infrastructur...
subroutine, public m_cpuinfo(model_name)
reads /proc/cpuinfo if it exists (i.e. Linux) to return relevant info
pure character(len=default_string_length) function, public m_cpuid_name(cpuid)
Determine name of target architecture for a given CPUID.
subroutine, public m_getexe(exe_path)
Returns the path of the running executable.
subroutine, public m_omp_get_stacksize(omp_stacksize)
Retrieve environment variable OMP_STACKSIZE.
Interface to the message passing library MPI.
logical, save, public mp_collect_timings
Defines all routines to deal with the performance of MPI routines.
subroutine, public rm_mp_perf_env()
...
subroutine, public describe_mp_perf_env(scr)
...
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 ...
Provides Cartesian and spherical orbital pointers and indices.
subroutine, public init_orbital_pointers(maxl)
Initialize or update the orbital pointers.
subroutine, public deallocate_orbital_pointers()
Deallocate the orbital pointers.
Parallel (pseudo)random number generator (RNG) for multiple streams and substreams of random numbers.
subroutine, public check_rng(output_unit, ionode)
...
subroutine, public write_rng_matrices(output_unit)
Write the transformation matrices of the two MRG components (raised to the specified output).
integer, parameter, public gaussian
Definition of physical constants:
real(kind=dp), parameter, public seconds
subroutine, public write_physcon(output_unit)
Write all basic physical constants used by CP2K to a logical output unit.
provides a uniform framework to add references to CP2K cite and output these
subroutine, public collect_citations_from_ranks(para_env)
Checks for each reference if any mpi-rank has marked it for citation.
subroutine, public cite_reference(key)
marks a given reference as cited.
subroutine, public print_cited_references(unit)
printout of all cited references in the journal format sorted by publication year
Utilities for string manipulations.
subroutine, public integer_to_string(inumber, string)
Converts an integer number to a string. The WRITE statement will return an error message,...
subroutine, public string_to_ascii(string, nascii)
Convert a string to sequence of integer numbers.
subroutine, public ascii_to_string(nascii, string)
Convert a sequence of integer numbers (ASCII code) to a string. Blanks are inserted for invalid ASCII...
Timing routines for accounting.
integer, parameter, public cost_type_energy
subroutine, public timings_report_callgraph(filename)
Write accumulated callgraph information as cachegrind-file. http://kcachegrind.sourceforge....
integer, parameter, public cost_type_time
subroutine, public timings_report_print(iw, r_timings, sort_by_self_time, cost_type, report_maxloc, para_env)
Print accumulated information on timers.
Timing routines for accounting.
integer, save, public global_timings_level
subroutine, public timings_setup_tracing(trace_max, unit_nr, trace_str, routine_names)
Set routine tracer.
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
character(len=default_string_length), parameter, public root_cp2k_name
Interface for Voronoi Integration and output of BQB files.
subroutine, public finalize_libvori()
Call libvori's finalize if support is compiled in.
calculates a functional from libxc and its derivatives
subroutine, public libxc_release_workers()
Reads the external parameters of a LibXC functional from its input section.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
contains the initially parsed file and the initial parallel environment
stores all the informations relevant to an mpi environment