148 geometry_did_change, irep, distribute_fock_matrix, &
152 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
153 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix
154 REAL(kind=
dp),
INTENT(OUT) :: ehfx
158 LOGICAL :: geometry_did_change
160 LOGICAL,
INTENT(IN) :: distribute_fock_matrix
161 INTEGER,
INTENT(IN) :: ispin
162 INTEGER,
INTENT(IN),
OPTIONAL :: nspins
164 CHARACTER(LEN=*),
PARAMETER :: routinen =
'integrate_four_center'
166 CHARACTER(len=default_string_length) :: eps_scaling_str, eps_schwarz_min_str
167 INTEGER :: act_atomic_block_offset, act_set_offset, atomic_offset_ac, atomic_offset_ad, &
168 atomic_offset_bc, atomic_offset_bd, bin, bits_max_val, buffer_left, buffer_size, &
169 buffer_start, cache_size, current_counter, handle, handle_bin, handle_dist_ks, &
170 handle_getp, handle_load, handle_main, i, inla, nla, i_list_ij, i_list_kl, i_set_list_ij, &
171 i_set_list_ij_start, i_set_list_ij_stop, i_set_list_kl, i_set_list_kl_start, &
172 i_set_list_kl_stop, i_thread, iatom, iatom_block, iatom_end, iatom_start, ikind, img, &
173 iset, iw, j, jatom, jatom_block, jatom_end, jatom_start, jkind, jset, katom, katom_block, &
175 INTEGER :: katom_start, kind_kind_idx, kkind, kset, l_max, latom, latom_block, latom_end, &
176 latom_start, lkind, lset, ma, max_am, max_pgf, max_set, mb, my_bin_id, my_bin_size, &
177 my_thread_id, n_threads, natom, nbits, ncob, ncos_max, nints, nkimages, nkind, &
178 nneighbors, nseta, nsetb, nsgf_max, my_nspins, pa, sgfb, shm_task_counter, shm_total_bins, &
179 sphi_a_u1, sphi_a_u2, sphi_a_u3, sphi_b_u1, sphi_b_u2, sphi_b_u3, sphi_c_u1, sphi_c_u2, &
180 sphi_c_u3, sphi_d_u1, sphi_d_u2, sphi_d_u3, swap_id, tmp_i4, unit_id
181 INTEGER(int_8) :: atom_block, counter, estimate_to_store_int, max_val_memory, &
182 mb_size_buffers, mb_size_f, mb_size_p, mem_compression_counter, &
183 mem_compression_counter_disk, mem_eris, mem_eris_disk, mem_max_val, memsize_after, &
184 memsize_before, my_current_counter, my_istart, n_processes, nblocks, ncpu, neris_disk, &
185 neris_incore, neris_onthefly, neris_tmp, neris_total, nprim_ints, &
186 shm_mem_compression_counter, shm_neris_disk, shm_neris_incore, shm_neris_onthefly, &
187 shm_neris_total, shm_nprim_ints, shm_stor_count_int_disk, shm_stor_count_max_val, &
188 shm_storage_counter_integrals, stor_count_int_disk
189 INTEGER(int_8) :: stor_count_max_val, storage_counter_integrals, subtr_size_mb, tmp_block, &
191 INTEGER(int_8),
ALLOCATABLE,
DIMENSION(:) :: tmp_task_list_cost
192 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, last_sgf_global, nimages, &
193 tmp_index, first_set_of_atom
194 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, lc_max, lc_min, ld_max, &
195 ld_min, npgfa, npgfb, npgfc, npgfd, nsgfa, nsgfb, nsgfc, nsgfd, shm_block_offset
196 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfb, nsgfl_a, nsgfl_b, nsgfl_c, nsgfl_d, &
197 offset_ac_set, offset_ad_set, offset_bc_set, offset_bd_set, shm_atomic_block_offset
198 INTEGER,
DIMENSION(:, :),
POINTER,
SAVE :: shm_is_assoc_atomic_block
199 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
200 INTEGER,
DIMENSION(:, :, :, :),
POINTER :: shm_set_offset
201 INTEGER,
SAVE :: shm_number_of_p_entries
202 LOGICAL :: bins_left, buffer_overflow, do_disk_storage, do_dynamic_load_balancing, do_it, &
203 do_kpoints, do_p_screening, do_periodic, do_print_load_balance_info, is_anti_symmetric, &
204 ks_fully_occ, my_geo_change, treat_lsd_in_core, use_disk_storage
205 LOGICAL,
DIMENSION(:, :),
POINTER :: shm_atomic_pair_list
206 REAL(
dp) :: afac, bintime_start, bintime_stop, cartesian_estimate, compression_factor, &
207 compression_factor_disk, ene_x_aa, ene_x_aa_diag, ene_x_bb, ene_x_bb_diag, eps_schwarz, &
208 eps_storage, etmp,
fac, hf_fraction, ln_10, log10_eps_schwarz, log10_pmax, &
209 max_contraction_val, max_val1, max_val2, max_val2_set, pmax_atom, pmax_blocks, &
210 pmax_entry, ra(3), rab2, rb(3), rc(3), rcd2, rd(3), screen_kind_ij, screen_kind_kl, &
211 spherical_estimate, symm_fac
212 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: ee_buffer1, ee_buffer2, ee_primitives_tmp, ee_work, &
213 ee_work2, kac_buf, kad_buf, kbc_buf, kbd_buf, pac_buf, pad_buf, pbc_buf, pbd_buf, &
215 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
216 REAL(
dp),
DIMENSION(:, :),
POINTER :: full_density_alpha, full_density_beta, full_ks_alpha, &
217 full_ks_beta, max_contraction, ptr_p_1, ptr_p_2, ptr_p_3, ptr_p_4, shm_pmax_atom, &
218 shm_pmax_block, sphi_b, zeta, zetb, zetc, zetd, &
219 full_ks_alpha_from_gpu, full_ks_beta_from_gpu
220 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: sphi_a_ext_set, sphi_b_ext_set, &
221 sphi_c_ext_set, sphi_d_ext_set
222 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: sphi_a_ext, sphi_b_ext, sphi_c_ext, &
224 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: gcc
225 REAL(kind=
dp) :: coeffs_kind_max0
230 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit_hfx
234 TYPE(
hfx_cache_type),
DIMENSION(:),
POINTER :: integral_caches, integral_caches_disk
237 integral_containers_disk
243 TYPE(
hfx_p_kind),
DIMENSION(:),
POINTER :: shm_initial_p
244 TYPE(
hfx_pgf_list),
ALLOCATABLE,
DIMENSION(:) :: pgf_list_ij, pgf_list_kl
246 DIMENSION(:) :: pgf_product_list
249 POINTER :: screen_coeffs_kind, tmp_r_1, tmp_r_2, &
250 tmp_screen_pgf1, tmp_screen_pgf2
252 DIMENSION(:, :, :, :),
POINTER :: screen_coeffs_set
254 DIMENSION(:, :, :, :, :, :),
POINTER :: radii_pgf, screen_coeffs_pgf
257 TYPE(
hfx_type),
POINTER :: actual_x_data, shm_master_x_data
261 DIMENSION(:) :: set_list_ij, set_list_kl
266 real(
dp) :: max_abs_delta_ks
267 integer :: iatom_set, jatom_set, katom_set, latom_set, shared_dev
268 logical :: use_libint, use_libgint, use_only_alpha_spin
269 logical :: cp2k_was_compiled_with_cuda_offload, cp2k_was_compiled_with_libint
270 logical :: cp2k_was_compiled_with_libgint
272 NULLIFY (dft_control, matrix_ks_aux_fit_hfx)
274 CALL timeset(routinen, handle)
282 my_geo_change = geometry_did_change
283 IF (ispin == 2) my_geo_change = .false.
291 IF (my_geo_change)
THEN
293 CALL para_env%max(memsize_before)
297 WRITE (unit=iw, fmt=
"(/,(T3,A,T60,I21))") &
298 "HFX_MEM_INFO| Est. max. program size before HFX [MiB]:", memsize_before/(1024*1024)
305 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, cell=cell)
307 NULLIFY (cell_to_index)
308 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
311 CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
316 nkind =
SIZE(atomic_kind_set, 1)
319 l_max = max(l_max, maxval(x_data(1, 1)%basis_parameter(ikind)%lmax))
327 IF (para_env%is_source())
THEN
328 CALL open_file(unit_number=unit_id, file_name=x_data(1, 1)%potential_parameter%filename)
330 CALL init(l_max, unit_id, para_env%mepos, para_env)
331 IF (para_env%is_source())
THEN
343 IF (
PRESENT(nspins)) my_nspins = nspins
347 shm_neris_onthefly = 0
348 shm_storage_counter_integrals = 0
349 shm_stor_count_int_disk = 0
352 shm_stor_count_max_val = 0
451 actual_x_data => x_data(irep, i_thread + 1)
453 shm_master_x_data => x_data(irep, 1)
457 do_periodic = actual_x_data%periodic_parameter%do_periodic
459 IF (do_periodic)
THEN
461 actual_x_data%periodic_parameter%number_of_shells = actual_x_data%periodic_parameter%mode
466 screening_parameter = actual_x_data%screening_parameter
467 potential_parameter = actual_x_data%potential_parameter
469 general_parameter = actual_x_data%general_parameter
470 load_balance_parameter => actual_x_data%load_balance_parameter
471 memory_parameter => actual_x_data%memory_parameter
473 cache_size = memory_parameter%cache_size
474 bits_max_val = memory_parameter%bits_max_val
476 basis_parameter => actual_x_data%basis_parameter
477 basis_info => actual_x_data%basis_info
479 treat_lsd_in_core = general_parameter%treat_lsd_in_core
481 ncpu = para_env%num_pe
482 n_processes = ncpu*n_threads
485 neris_total = 0_int_8
486 neris_incore = 0_int_8
488 neris_onthefly = 0_int_8
490 mem_eris_disk = 0_int_8
491 mem_max_val = 0_int_8
492 compression_factor = 0.0_dp
493 compression_factor_disk = 0.0_dp
496 max_val_memory = 1_int_8
501 use_libgint = .false.
512 max_am = basis_info%max_am
515 atomic_kind_set=atomic_kind_set, &
516 particle_set=particle_set, &
517 dft_control=dft_control)
518 IF (dft_control%do_admm)
CALL get_admm_env(qs_env%admm_env, matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx)
520 do_p_screening = screening_parameter%do_initial_p_screening
522 IF (do_p_screening)
THEN
523 IF (
ASSOCIATED(qs_env%mp2_env))
THEN
524 IF ((qs_env%mp2_env%ri_grad%free_hfx_buffer))
THEN
525 do_p_screening = ((qs_env%mp2_env%p_screen) .AND. (qs_env%mp2_env%not_last_hfx))
527 do_p_screening = .false.
531 max_set = basis_info%max_set
532 natom =
SIZE(particle_set, 1)
535 nkimages = dft_control%nimages
536 cpassert(nkimages == 1)
544 ikind = kind_of(iatom)
545 nseta = basis_parameter(ikind)%nset
546 npgfa => basis_parameter(ikind)%npgf
547 la_max => basis_parameter(ikind)%lmax
548 nsgfa => basis_parameter(ikind)%nsgf
550 ncos_max = max(ncos_max,
ncoset(la_max(iset)))
551 nsgf_max = max(nsgf_max, nsgfa(iset))
555 ALLOCATE (primitive_integrals(nsgf_max**4))
556 primitive_integrals = 0.0_dp
558 ALLOCATE (pbd_buf(nsgf_max**2))
559 ALLOCATE (pbc_buf(nsgf_max**2))
560 ALLOCATE (pad_buf(nsgf_max**2))
561 ALLOCATE (pac_buf(nsgf_max**2))
562 ALLOCATE (kbd_buf(nsgf_max**2))
563 ALLOCATE (kbc_buf(nsgf_max**2))
564 ALLOCATE (kad_buf(nsgf_max**2))
565 ALLOCATE (kac_buf(nsgf_max**2))
566 ALLOCATE (ee_work(ncos_max**4))
567 ALLOCATE (ee_work2(ncos_max**4))
568 ALLOCATE (ee_buffer1(ncos_max**4))
569 ALLOCATE (ee_buffer2(ncos_max**4))
570 ALLOCATE (ee_primitives_tmp(nsgf_max**4))
572 IF (my_nspins == 0) my_nspins = dft_control%nspins
574 ALLOCATE (max_contraction(max_set, natom))
576 max_contraction = 0.0_dp
579 jkind = kind_of(jatom)
580 lb_max => basis_parameter(jkind)%lmax
581 nsetb = basis_parameter(jkind)%nset
582 npgfb => basis_parameter(jkind)%npgf
583 first_sgfb => basis_parameter(jkind)%first_sgf
584 sphi_b => basis_parameter(jkind)%sphi
585 nsgfb => basis_parameter(jkind)%nsgf
588 ncob = npgfb(jset)*
ncoset(lb_max(jset))
589 sgfb = first_sgfb(1, jset)
592 max_contraction(jset, jatom) = maxval([(sum(abs(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)])
593 max_pgf = max(max_pgf, npgfb(jset))
598 nneighbors =
SIZE(actual_x_data%neighbor_cells)
599 ALLOCATE (pgf_list_ij(max_pgf**2))
600 ALLOCATE (pgf_list_kl(max_pgf**2))
604 ALLOCATE (pgf_product_list(tmp_i4))
605 ALLOCATE (nimages(max_pgf**2))
608 ALLOCATE (pgf_list_ij(i)%image_list(nneighbors))
609 ALLOCATE (pgf_list_kl(i)%image_list(nneighbors))
614 IF (my_geo_change)
THEN
616 shm_master_x_data%is_assoc_atomic_block, &
617 shm_master_x_data%number_of_p_entries, &
619 shm_master_x_data%atomic_block_offset, &
620 shm_master_x_data%set_offset, &
621 shm_master_x_data%block_offset, &
622 shm_master_x_data%map_atoms_to_cpus, &
625 shm_is_assoc_atomic_block => shm_master_x_data%is_assoc_atomic_block
628 ks_fully_occ = .true.
629 outer:
DO iatom = 1, natom
630 DO jatom = iatom, natom
631 IF (shm_is_assoc_atomic_block(jatom, iatom) == 0)
THEN
632 ks_fully_occ = .false.
638 IF (.NOT. ks_fully_occ)
THEN
639 CALL cp_warn(__location__, &
640 "The Kohn Sham matrix is not 100% occupied. This "// &
641 "may result in incorrect Hartree-Fock results. Setting "// &
642 "MIN_PAIR_LIST_RADIUS to -1 in the QS section ensures a "// &
643 "fully occupied KS matrix. For more information "// &
644 "see FAQ: https://www.cp2k.org/faq:hfx_eps_warning")
649 shm_number_of_p_entries = shm_master_x_data%number_of_p_entries
650 shm_is_assoc_atomic_block => shm_master_x_data%is_assoc_atomic_block
651 shm_atomic_block_offset => shm_master_x_data%atomic_block_offset
652 shm_set_offset => shm_master_x_data%set_offset
653 shm_block_offset => shm_master_x_data%block_offset
659 subtr_size_mb = 2_int_8*shm_block_offset(ncpu + 1)
661 IF (.NOT. treat_lsd_in_core)
THEN
662 IF (my_nspins == 2) subtr_size_mb = subtr_size_mb*2_int_8
665 IF (do_p_screening .OR. screening_parameter%do_p_screening_forces)
THEN
666 subtr_size_mb = subtr_size_mb + memory_parameter%size_p_screen
669 IF (screening_parameter%do_p_screening_forces)
THEN
670 IF (memory_parameter%treat_forces_in_core)
THEN
671 subtr_size_mb = subtr_size_mb + memory_parameter%size_p_screen
675 subtr_size_mb = subtr_size_mb + nsgf_max**4*n_threads
677 subtr_size_mb = subtr_size_mb + 8_int_8*nsgf_max**2*n_threads
680 subtr_size_mb = subtr_size_mb + max_pgf**2*max_set**2*nkind**2
682 subtr_size_mb = subtr_size_mb + max_set**2*nkind**2
684 subtr_size_mb = subtr_size_mb + nkind**2
686 subtr_size_mb = subtr_size_mb + max_pgf**2*max_set**2*nkind**2
689 subtr_size_mb = subtr_size_mb + natom**2
692 IF (do_p_screening)
THEN
693 subtr_size_mb = subtr_size_mb + natom**2
695 IF (screening_parameter%do_p_screening_forces)
THEN
696 IF (memory_parameter%treat_forces_in_core)
THEN
697 subtr_size_mb = subtr_size_mb + natom**2
702 subtr_size_mb = subtr_size_mb*8_int_8/1024_int_8/1024_int_8
711 use_disk_storage = .false.
713 do_disk_storage = memory_parameter%do_disk_storage
714 IF (do_disk_storage)
THEN
715 maxval_container_disk => actual_x_data%store_ints%maxval_container_disk
716 maxval_cache_disk => actual_x_data%store_ints%maxval_cache_disk
718 integral_containers_disk => actual_x_data%store_ints%integral_containers_disk
719 integral_caches_disk => actual_x_data%store_ints%integral_caches_disk
722 IF (my_geo_change)
THEN
723 memory_parameter%ram_counter = huge(memory_parameter%ram_counter)
726 IF (my_geo_change)
THEN
727 memory_parameter%recalc_forces = .true.
729 IF (.NOT. memory_parameter%treat_forces_in_core) memory_parameter%recalc_forces = .true.
733 eps_schwarz = screening_parameter%eps_schwarz
734 IF (eps_schwarz <= 0.0_dp)
THEN
737 log10_eps_schwarz = log10(eps_schwarz)
740 eps_storage = eps_schwarz*memory_parameter%eps_storage_scaling
743 hf_fraction = general_parameter%fraction
748 potential_parameter = actual_x_data%potential_parameter
752 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
753 buffer_overflow = .false.
755 buffer_overflow = .true.
759 private_lib = actual_x_data%lib
762 ALLOCATE (last_sgf_global(0:natom))
763 last_sgf_global(0) = 0
765 ikind = kind_of(iatom)
766 last_sgf_global(iatom) = last_sgf_global(iatom - 1) + basis_parameter(ikind)%nsgf_total
772 NULLIFY (full_density_alpha, full_density_beta)
773 ALLOCATE (full_density_alpha(shm_block_offset(ncpu + 1), nkimages))
774 IF (.NOT. treat_lsd_in_core .OR. my_nspins == 1)
THEN
775 CALL timeset(routinen//
"_getP", handle_getp)
777 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(ispin, img)%matrix, shm_number_of_p_entries, &
778 shm_master_x_data%block_offset, &
779 kind_of, basis_parameter, get_max_vals_spin=.false., antisymmetric=is_anti_symmetric)
782 IF (my_nspins == 2)
THEN
783 ALLOCATE (full_density_beta(shm_block_offset(ncpu + 1), nkimages))
785 CALL get_full_density(para_env, full_density_beta(:, img), rho_ao(2, img)%matrix, shm_number_of_p_entries, &
786 shm_master_x_data%block_offset, &
787 kind_of, basis_parameter, get_max_vals_spin=.false., antisymmetric=is_anti_symmetric)
790 CALL timestop(handle_getp)
795 NULLIFY (shm_initial_p)
796 IF (do_p_screening)
THEN
797 shm_initial_p => shm_master_x_data%initial_p
798 shm_pmax_atom => shm_master_x_data%pmax_atom
799 IF (my_geo_change)
THEN
801 shm_master_x_data%map_atom_to_kind_atom, &
802 shm_master_x_data%set_offset, &
803 shm_master_x_data%atomic_block_offset, &
805 full_density_alpha, full_density_beta, &
806 natom, kind_of, basis_parameter, &
807 nkind, shm_master_x_data%is_assoc_atomic_block)
811 IF (do_p_screening)
THEN
812 CALL timeset(routinen//
"_getP", handle_getp)
814 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(1, img)%matrix, shm_number_of_p_entries, &
815 shm_master_x_data%block_offset, &
816 kind_of, basis_parameter, get_max_vals_spin=.true., &
817 rho_beta=rho_ao(2, img)%matrix, antisymmetric=is_anti_symmetric)
819 CALL timestop(handle_getp)
824 NULLIFY (shm_initial_p)
825 shm_initial_p => actual_x_data%initial_p
826 shm_pmax_atom => shm_master_x_data%pmax_atom
827 IF (my_geo_change)
THEN
829 shm_master_x_data%map_atom_to_kind_atom, &
830 shm_master_x_data%set_offset, &
831 shm_master_x_data%atomic_block_offset, &
833 full_density_alpha, full_density_beta, &
834 natom, kind_of, basis_parameter, &
835 nkind, shm_master_x_data%is_assoc_atomic_block)
840 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(ispin, img)%matrix, shm_number_of_p_entries, &
841 shm_master_x_data%block_offset, &
842 kind_of, basis_parameter, get_max_vals_spin=.false., &
843 antisymmetric=is_anti_symmetric)
847 NULLIFY (full_ks_alpha, full_ks_beta)
848 ALLOCATE (shm_master_x_data%full_ks_alpha(shm_block_offset(ncpu + 1), nkimages))
849 full_ks_alpha => shm_master_x_data%full_ks_alpha
850 full_ks_alpha = 0.0_dp
852 IF (.NOT. treat_lsd_in_core)
THEN
853 IF (my_nspins == 2)
THEN
854 ALLOCATE (shm_master_x_data%full_ks_beta(shm_block_offset(ncpu + 1), nkimages))
855 full_ks_beta => shm_master_x_data%full_ks_beta
856 full_ks_beta = 0.0_dp
868 IF (.NOT. shm_master_x_data%screen_funct_is_initialized)
THEN
870 shm_master_x_data%pair_dist_radii_pgf, max_set, max_pgf, eps_schwarz, &
874 shm_master_x_data%screen_funct_coeffs_set, &
875 shm_master_x_data%screen_funct_coeffs_kind, &
876 shm_master_x_data%screen_funct_coeffs_pgf, &
877 shm_master_x_data%pair_dist_radii_pgf, &
878 max_set, max_pgf, n_threads, i_thread, p_work)
881 shm_master_x_data%screen_funct_is_initialized = .true.
887 screen_coeffs_set => shm_master_x_data%screen_funct_coeffs_set
888 screen_coeffs_kind => shm_master_x_data%screen_funct_coeffs_kind
889 screen_coeffs_pgf => shm_master_x_data%screen_funct_coeffs_pgf
890 radii_pgf => shm_master_x_data%pair_dist_radii_pgf
895 IF (my_nspins == 1)
THEN
896 fac = 0.5_dp*hf_fraction
898 fac = 1.0_dp*hf_fraction
905 CALL timeset(routinen//
"_load", handle_load)
908 IF (my_geo_change)
THEN
909 IF (actual_x_data%b_first_load_balance_energy)
THEN
910 CALL hfx_load_balance(actual_x_data, eps_schwarz, particle_set, max_set, para_env, &
911 screen_coeffs_set, screen_coeffs_kind, &
912 shm_is_assoc_atomic_block, do_periodic, load_balance_parameter, &
913 kind_of, basis_parameter, shm_initial_p, shm_pmax_atom, i_thread, n_threads, &
914 cell, do_p_screening, actual_x_data%map_atom_to_kind_atom, &
916 actual_x_data%b_first_load_balance_energy = .false.
919 load_balance_parameter, &
925 CALL timestop(handle_load)
929 use_only_alpha_spin = treat_lsd_in_core .or. .not. my_nspins == 2
932 if (use_libgint)
then
941 nneighbors, max_pgf, natom, kind_of, particle_set, basis_parameter)
944 if (use_only_alpha_spin)
then
995 do_dynamic_load_balancing = .true.
997 IF (n_threads == 1 .OR. do_disk_storage) do_dynamic_load_balancing = .false.
999 IF (do_dynamic_load_balancing)
THEN
1000 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1005 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1007 IF (my_geo_change)
THEN
1008 CALL dealloc_containers(actual_x_data%store_ints, memory_parameter%actual_memory_usage)
1011 DO bin = 1, my_bin_size
1012 maxval_container => actual_x_data%store_ints%maxval_container(bin)
1013 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
1014 CALL hfx_init_container(maxval_container, memory_parameter%actual_memory_usage, .false.)
1016 CALL hfx_init_container(integral_containers(i), memory_parameter%actual_memory_usage, .false.)
1022 IF (.NOT. my_geo_change)
THEN
1023 DO bin = 1, my_bin_size
1024 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
1025 maxval_container => actual_x_data%store_ints%maxval_container(bin)
1026 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
1027 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
1029 memory_parameter%actual_memory_usage, .false.)
1032 memory_parameter%actual_memory_usage, .false.)
1041 IF (do_disk_storage)
THEN
1043 IF (my_geo_change)
THEN
1044 CALL hfx_init_container(maxval_container_disk, memory_parameter%actual_memory_usage_disk, do_disk_storage)
1046 CALL hfx_init_container(integral_containers_disk(i), memory_parameter%actual_memory_usage_disk, do_disk_storage)
1050 IF (.NOT. my_geo_change)
THEN
1052 memory_parameter%actual_memory_usage_disk, .true.)
1055 memory_parameter%actual_memory_usage_disk, .true.)
1064 IF (do_dynamic_load_balancing)
THEN
1068 shm_total_bins = shm_total_bins +
SIZE(x_data(irep, i)%distribution_energy)
1070 ALLOCATE (tmp_task_list(shm_total_bins))
1071 shm_task_counter = 0
1073 DO bin = 1,
SIZE(x_data(irep, i)%distribution_energy)
1074 shm_task_counter = shm_task_counter + 1
1075 tmp_task_list(shm_task_counter)%thread_id = i
1076 tmp_task_list(shm_task_counter)%bin_id = bin
1077 tmp_task_list(shm_task_counter)%cost = x_data(irep, i)%distribution_energy(bin)%cost
1082 ALLOCATE (tmp_task_list_cost(shm_total_bins))
1083 ALLOCATE (tmp_index(shm_total_bins))
1085 DO i = 1, shm_total_bins
1086 tmp_task_list_cost(i) = tmp_task_list(i)%cost
1089 CALL sort(tmp_task_list_cost, shm_total_bins, tmp_index)
1091 ALLOCATE (shm_master_x_data%task_list(shm_total_bins))
1093 DO i = 1, shm_total_bins
1094 shm_master_x_data%task_list(i) = tmp_task_list(tmp_index(shm_total_bins - i + 1))
1097 shm_task_list => shm_master_x_data%task_list
1098 shm_task_counter = 0
1100 DEALLOCATE (tmp_task_list_cost, tmp_index, tmp_task_list)
1105 IF (my_bin_size > 0)
THEN
1106 maxval_container => actual_x_data%store_ints%maxval_container(1)
1107 maxval_cache => actual_x_data%store_ints%maxval_cache(1)
1109 integral_containers => actual_x_data%store_ints%integral_containers(:, 1)
1110 integral_caches => actual_x_data%store_ints%integral_caches(:, 1)
1115 CALL timeset(routinen//
"_main", handle_main)
1119 coeffs_kind_max0 = maxval(screen_coeffs_kind(:, :)%x(2))
1120 ALLOCATE (set_list_ij((max_set*load_balance_parameter%block_size)**2))
1121 ALLOCATE (set_list_kl((max_set*load_balance_parameter%block_size)**2))
1127 actual_x_data%pmax_block = 0.0_dp
1128 shm_pmax_block => actual_x_data%pmax_block
1129 IF (do_p_screening)
THEN
1130 DO iatom_block = 1,
SIZE(actual_x_data%blocks)
1131 iatom_start = actual_x_data%blocks(iatom_block)%istart
1132 iatom_end = actual_x_data%blocks(iatom_block)%iend
1133 DO jatom_block = 1,
SIZE(actual_x_data%blocks)
1134 jatom_start = actual_x_data%blocks(jatom_block)%istart
1135 jatom_end = actual_x_data%blocks(jatom_block)%iend
1136 shm_pmax_block(iatom_block, jatom_block) = maxval(shm_pmax_atom(iatom_start:iatom_end, jatom_start:jatom_end))
1140 shm_atomic_pair_list => actual_x_data%atomic_pair_list
1141 IF (my_geo_change)
THEN
1143 do_periodic, screen_coeffs_kind, coeffs_kind_max0, log10_eps_schwarz, cell, &
1144 actual_x_data%blocks)
1147 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1149 IF (my_geo_change)
THEN
1150 DO bin = 1, my_bin_size
1151 actual_x_data%distribution_energy(bin)%time_first_scf = 0.0_dp
1152 actual_x_data%distribution_energy(bin)%time_other_scf = 0.0_dp
1153 actual_x_data%distribution_energy(bin)%time_forces = 0.0_dp
1159 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1160 nblocks = load_balance_parameter%nblocks
1166 DO WHILE (bins_left)
1168 IF (.NOT. do_dynamic_load_balancing)
THEN
1170 IF (bin > my_bin_size)
THEN
1176 distribution_energy => actual_x_data%distribution_energy(bin)
1180 shm_task_counter = shm_task_counter + 1
1181 IF (shm_task_counter <= shm_total_bins)
THEN
1182 my_thread_id = shm_task_list(shm_task_counter)%thread_id
1183 my_bin_id = shm_task_list(shm_task_counter)%bin_id
1184 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1185 maxval_cache => x_data(irep, my_thread_id)%store_ints%maxval_cache(my_bin_id)
1186 maxval_container => x_data(irep, my_thread_id)%store_ints%maxval_container(my_bin_id)
1187 integral_caches => x_data(irep, my_thread_id)%store_ints%integral_caches(:, my_bin_id)
1188 integral_containers => x_data(irep, my_thread_id)%store_ints%integral_containers(:, my_bin_id)
1190 distribution_energy => x_data(irep, my_thread_id)%distribution_energy(my_bin_id)
1193 IF (my_geo_change)
THEN
1194 distribution_energy%ram_counter = huge(distribution_energy%ram_counter)
1203 IF (.NOT. do_it) cycle
1206 CALL timeset(routinen//
"_bin", handle_bin)
1210 my_istart = distribution_energy%istart
1211 my_current_counter = 0
1212 IF (distribution_energy%number_of_atom_quartets == 0 .OR. &
1213 my_istart == -1_int_8) my_istart = nblocks**4
1214 atomic_blocks:
DO atom_block = my_istart, nblocks**4 - 1, n_processes
1215 latom_block = int(
modulo(atom_block, nblocks)) + 1
1216 tmp_block = atom_block/nblocks
1217 katom_block = int(
modulo(tmp_block, nblocks)) + 1
1218 IF (latom_block < katom_block) cycle atomic_blocks
1219 tmp_block = tmp_block/nblocks
1220 jatom_block = int(
modulo(tmp_block, nblocks)) + 1
1221 tmp_block = tmp_block/nblocks
1222 iatom_block = int(
modulo(tmp_block, nblocks)) + 1
1223 IF (jatom_block < iatom_block) cycle atomic_blocks
1224 my_current_counter = my_current_counter + 1
1225 IF (my_current_counter > distribution_energy%number_of_atom_quartets)
EXIT atomic_blocks
1227 iatom_start = actual_x_data%blocks(iatom_block)%istart
1228 iatom_end = actual_x_data%blocks(iatom_block)%iend
1229 jatom_start = actual_x_data%blocks(jatom_block)%istart
1230 jatom_end = actual_x_data%blocks(jatom_block)%iend
1231 katom_start = actual_x_data%blocks(katom_block)%istart
1232 katom_end = actual_x_data%blocks(katom_block)%iend
1233 latom_start = actual_x_data%blocks(latom_block)%istart
1234 latom_end = actual_x_data%blocks(latom_block)%iend
1236 pmax_blocks = max(shm_pmax_block(katom_block, iatom_block), &
1237 shm_pmax_block(latom_block, jatom_block), &
1238 shm_pmax_block(latom_block, iatom_block), &
1239 shm_pmax_block(katom_block, jatom_block))
1241 IF (2.0_dp*coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle atomic_blocks
1243 CALL build_pair_list(natom, list_ij, set_list_ij, iatom_start, iatom_end, &
1244 jatom_start, jatom_end, &
1245 kind_of, basis_parameter, particle_set, &
1246 do_periodic, screen_coeffs_set, screen_coeffs_kind, &
1247 coeffs_kind_max0, log10_eps_schwarz, cell, pmax_blocks, &
1248 shm_atomic_pair_list)
1250 CALL build_pair_list(natom, list_kl, set_list_kl, katom_start, katom_end, &
1251 latom_start, latom_end, &
1252 kind_of, basis_parameter, particle_set, &
1253 do_periodic, screen_coeffs_set, screen_coeffs_kind, &
1254 coeffs_kind_max0, log10_eps_schwarz, cell, pmax_blocks, &
1255 shm_atomic_pair_list)
1257 DO i_list_ij = 1, list_ij%n_element
1259 iatom = list_ij%elements(i_list_ij)%pair(1)
1260 jatom = list_ij%elements(i_list_ij)%pair(2)
1261 i_set_list_ij_start = list_ij%elements(i_list_ij)%set_bounds(1)
1262 i_set_list_ij_stop = list_ij%elements(i_list_ij)%set_bounds(2)
1263 ikind = list_ij%elements(i_list_ij)%kind_pair(1)
1264 jkind = list_ij%elements(i_list_ij)%kind_pair(2)
1265 ra = list_ij%elements(i_list_ij)%r1
1266 rb = list_ij%elements(i_list_ij)%r2
1267 rab2 = list_ij%elements(i_list_ij)%dist2
1269 la_max => basis_parameter(ikind)%lmax
1270 la_min => basis_parameter(ikind)%lmin
1271 npgfa => basis_parameter(ikind)%npgf
1272 nseta = basis_parameter(ikind)%nset
1273 zeta => basis_parameter(ikind)%zet
1274 nsgfa => basis_parameter(ikind)%nsgf
1275 sphi_a_ext => basis_parameter(ikind)%sphi_ext(:, :, :, :)
1276 nsgfl_a => basis_parameter(ikind)%nsgfl
1277 sphi_a_u1 = ubound(sphi_a_ext, 1)
1278 sphi_a_u2 = ubound(sphi_a_ext, 2)
1279 sphi_a_u3 = ubound(sphi_a_ext, 3)
1281 lb_max => basis_parameter(jkind)%lmax
1282 lb_min => basis_parameter(jkind)%lmin
1283 npgfb => basis_parameter(jkind)%npgf
1284 nsetb = basis_parameter(jkind)%nset
1285 zetb => basis_parameter(jkind)%zet
1286 nsgfb => basis_parameter(jkind)%nsgf
1287 sphi_b_ext => basis_parameter(jkind)%sphi_ext(:, :, :, :)
1288 nsgfl_b => basis_parameter(jkind)%nsgfl
1289 sphi_b_u1 = ubound(sphi_b_ext, 1)
1290 sphi_b_u2 = ubound(sphi_b_ext, 2)
1291 sphi_b_u3 = ubound(sphi_b_ext, 3)
1293 DO i_list_kl = 1, list_kl%n_element
1294 katom = list_kl%elements(i_list_kl)%pair(1)
1295 latom = list_kl%elements(i_list_kl)%pair(2)
1297 IF (.NOT. (katom + latom <= iatom + jatom)) cycle
1298 IF (((iatom + jatom) == (katom + latom)) .AND. (katom < iatom)) cycle
1299 i_set_list_kl_start = list_kl%elements(i_list_kl)%set_bounds(1)
1300 i_set_list_kl_stop = list_kl%elements(i_list_kl)%set_bounds(2)
1301 kkind = list_kl%elements(i_list_kl)%kind_pair(1)
1302 lkind = list_kl%elements(i_list_kl)%kind_pair(2)
1303 rc = list_kl%elements(i_list_kl)%r1
1304 rd = list_kl%elements(i_list_kl)%r2
1305 rcd2 = list_kl%elements(i_list_kl)%dist2
1307 IF (do_p_screening)
THEN
1308 pmax_atom = max(shm_pmax_atom(katom, iatom), &
1309 shm_pmax_atom(latom, jatom), &
1310 shm_pmax_atom(latom, iatom), &
1311 shm_pmax_atom(katom, jatom))
1316 screen_kind_ij = screen_coeffs_kind(jkind, ikind)%x(1)*rab2 + &
1317 screen_coeffs_kind(jkind, ikind)%x(2)
1318 screen_kind_kl = screen_coeffs_kind(lkind, kkind)%x(1)*rcd2 + &
1319 screen_coeffs_kind(lkind, kkind)%x(2)
1321 IF (screen_kind_ij + screen_kind_kl + pmax_atom < log10_eps_schwarz) cycle
1325 IF (.NOT. (shm_is_assoc_atomic_block(latom, iatom) >= 1 .AND. &
1326 shm_is_assoc_atomic_block(katom, iatom) >= 1 .AND. &
1327 shm_is_assoc_atomic_block(katom, jatom) >= 1 .AND. &
1328 shm_is_assoc_atomic_block(latom, jatom) >= 1)) cycle
1332 IF (iatom == jatom) symm_fac = symm_fac*2.0_dp
1333 IF (katom == latom) symm_fac = symm_fac*2.0_dp
1334 IF (iatom == katom .AND. jatom == latom .AND. iatom /= jatom .AND. katom /= latom) symm_fac = symm_fac*2.0_dp
1335 IF (iatom == katom .AND. iatom == jatom .AND. katom == latom) symm_fac = symm_fac*2.0_dp
1336 symm_fac = 1.0_dp/symm_fac
1338 lc_max => basis_parameter(kkind)%lmax
1339 lc_min => basis_parameter(kkind)%lmin
1340 npgfc => basis_parameter(kkind)%npgf
1341 zetc => basis_parameter(kkind)%zet
1342 nsgfc => basis_parameter(kkind)%nsgf
1343 sphi_c_ext => basis_parameter(kkind)%sphi_ext(:, :, :, :)
1344 nsgfl_c => basis_parameter(kkind)%nsgfl
1345 sphi_c_u1 = ubound(sphi_c_ext, 1)
1346 sphi_c_u2 = ubound(sphi_c_ext, 2)
1347 sphi_c_u3 = ubound(sphi_c_ext, 3)
1349 ld_max => basis_parameter(lkind)%lmax
1350 ld_min => basis_parameter(lkind)%lmin
1351 npgfd => basis_parameter(lkind)%npgf
1352 zetd => basis_parameter(lkind)%zet
1353 nsgfd => basis_parameter(lkind)%nsgf
1354 sphi_d_ext => basis_parameter(lkind)%sphi_ext(:, :, :, :)
1355 nsgfl_d => basis_parameter(lkind)%nsgfl
1356 sphi_d_u1 = ubound(sphi_d_ext, 1)
1357 sphi_d_u2 = ubound(sphi_d_ext, 2)
1358 sphi_d_u3 = ubound(sphi_d_ext, 3)
1362 atomic_offset_bd = shm_atomic_block_offset(jatom, latom)
1363 atomic_offset_bc = shm_atomic_block_offset(jatom, katom)
1364 atomic_offset_ad = shm_atomic_block_offset(iatom, latom)
1365 atomic_offset_ac = shm_atomic_block_offset(iatom, katom)
1367 IF (jatom < latom)
THEN
1368 offset_bd_set => shm_set_offset(:, :, lkind, jkind)
1370 offset_bd_set => shm_set_offset(:, :, jkind, lkind)
1372 IF (jatom < katom)
THEN
1373 offset_bc_set => shm_set_offset(:, :, kkind, jkind)
1375 offset_bc_set => shm_set_offset(:, :, jkind, kkind)
1377 IF (iatom < latom)
THEN
1378 offset_ad_set => shm_set_offset(:, :, lkind, ikind)
1380 offset_ad_set => shm_set_offset(:, :, ikind, lkind)
1382 IF (iatom < katom)
THEN
1383 offset_ac_set => shm_set_offset(:, :, kkind, ikind)
1385 offset_ac_set => shm_set_offset(:, :, ikind, kkind)
1388 IF (do_p_screening)
THEN
1390 kind_kind_idx = int(get_1d_idx(kkind, ikind, int(nkind,
int_8)))
1391 IF (ikind >= kkind)
THEN
1392 ptr_p_1 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1393 actual_x_data%map_atom_to_kind_atom(katom), &
1394 actual_x_data%map_atom_to_kind_atom(iatom))
1396 ptr_p_1 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1397 actual_x_data%map_atom_to_kind_atom(iatom), &
1398 actual_x_data%map_atom_to_kind_atom(katom))
1399 swap_id = swap_id + 1
1401 kind_kind_idx = int(get_1d_idx(lkind, jkind, int(nkind,
int_8)))
1402 IF (jkind >= lkind)
THEN
1403 ptr_p_2 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1404 actual_x_data%map_atom_to_kind_atom(latom), &
1405 actual_x_data%map_atom_to_kind_atom(jatom))
1407 ptr_p_2 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1408 actual_x_data%map_atom_to_kind_atom(jatom), &
1409 actual_x_data%map_atom_to_kind_atom(latom))
1410 swap_id = swap_id + 2
1412 kind_kind_idx = int(get_1d_idx(lkind, ikind, int(nkind,
int_8)))
1413 IF (ikind >= lkind)
THEN
1414 ptr_p_3 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1415 actual_x_data%map_atom_to_kind_atom(latom), &
1416 actual_x_data%map_atom_to_kind_atom(iatom))
1418 ptr_p_3 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1419 actual_x_data%map_atom_to_kind_atom(iatom), &
1420 actual_x_data%map_atom_to_kind_atom(latom))
1421 swap_id = swap_id + 4
1423 kind_kind_idx = int(get_1d_idx(kkind, jkind, int(nkind,
int_8)))
1424 IF (jkind >= kkind)
THEN
1425 ptr_p_4 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1426 actual_x_data%map_atom_to_kind_atom(katom), &
1427 actual_x_data%map_atom_to_kind_atom(jatom))
1429 ptr_p_4 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1430 actual_x_data%map_atom_to_kind_atom(jatom), &
1431 actual_x_data%map_atom_to_kind_atom(katom))
1432 swap_id = swap_id + 8
1437 IF (my_geo_change)
THEN
1438 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1445 mem_compression_counter = 0
1448 tmp_i4 = x_data(irep, i)%memory_parameter%actual_memory_usage
1449 mem_compression_counter = mem_compression_counter + &
1450 tmp_i4*memory_parameter%cache_size
1452 IF (mem_compression_counter > memory_parameter%max_compression_counter)
THEN
1453 buffer_overflow = .true.
1454 IF (do_dynamic_load_balancing)
THEN
1455 distribution_energy%ram_counter = counter
1457 memory_parameter%ram_counter = counter
1460 counter = counter + 1
1461 buffer_overflow = .false.
1465 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1466 IF (do_dynamic_load_balancing)
THEN
1467 IF (distribution_energy%ram_counter == counter)
THEN
1468 buffer_overflow = .true.
1470 counter = counter + 1
1471 buffer_overflow = .false.
1475 IF (memory_parameter%ram_counter == counter)
THEN
1476 buffer_overflow = .true.
1478 counter = counter + 1
1479 buffer_overflow = .false.
1485 IF (buffer_overflow .AND. do_disk_storage)
THEN
1486 use_disk_storage = .true.
1487 buffer_overflow = .false.
1490 IF (use_disk_storage)
THEN
1492 tmp_i4 = memory_parameter%actual_memory_usage_disk
1493 mem_compression_counter_disk = tmp_i4*memory_parameter%cache_size
1494 IF (mem_compression_counter_disk > memory_parameter%max_compression_counter_disk)
THEN
1495 buffer_overflow = .true.
1496 use_disk_storage = .false.
1500 DO i_set_list_ij = i_set_list_ij_start, i_set_list_ij_stop
1501 iset = set_list_ij(i_set_list_ij)%pair(1)
1502 jset = set_list_ij(i_set_list_ij)%pair(2)
1504 ncob = npgfb(jset)*
ncoset(lb_max(jset))
1505 max_val1 = screen_coeffs_set(jset, iset, jkind, ikind)%x(1)*rab2 + &
1506 screen_coeffs_set(jset, iset, jkind, ikind)%x(2)
1508 IF (max_val1 + screen_kind_kl + pmax_atom < log10_eps_schwarz) cycle
1510 sphi_a_ext_set => sphi_a_ext(:, :, :, iset)
1511 sphi_b_ext_set => sphi_b_ext(:, :, :, jset)
1512 DO i_set_list_kl = i_set_list_kl_start, i_set_list_kl_stop
1513 kset = set_list_kl(i_set_list_kl)%pair(1)
1514 lset = set_list_kl(i_set_list_kl)%pair(2)
1516 max_val2_set = (screen_coeffs_set(lset, kset, lkind, kkind)%x(1)*rcd2 + &
1517 screen_coeffs_set(lset, kset, lkind, kkind)%x(2))
1518 max_val2 = max_val1 + max_val2_set
1521 IF (max_val2 + pmax_atom < log10_eps_schwarz) cycle
1522 sphi_c_ext_set => sphi_c_ext(:, :, :, kset)
1523 sphi_d_ext_set => sphi_d_ext(:, :, :, lset)
1525 IF (do_p_screening)
THEN
1526 CALL get_pmax_val(ptr_p_1, ptr_p_2, ptr_p_3, ptr_p_4, &
1527 iset, jset, kset, lset, &
1528 pmax_entry, swap_id)
1532 log10_pmax = pmax_entry
1533 max_val2 = max_val2 + log10_pmax
1534 IF (max_val2 < log10_eps_schwarz) cycle
1535 pmax_entry = exp(log10_pmax*ln_10)
1539 if (use_libgint)
then
1540 tmp_screen_pgf1 => screen_coeffs_pgf(:, :, jset, iset, jkind, ikind)
1541 tmp_screen_pgf2 => screen_coeffs_pgf(:, :, lset, kset, lkind, kkind)
1545 iatom, jatom, katom, latom, iset, jset, kset, lset, &
1547 npgfa(iset), npgfb(jset), npgfc(kset), npgfd(lset), &
1548 potential_parameter, &
1549 screen_coeffs_set(jset, iset, jkind, ikind)%x, &
1550 screen_coeffs_set(lset, kset, lkind, kkind)%x, &
1551 log10_pmax, log10_eps_schwarz, &
1552 tmp_screen_pgf1, tmp_screen_pgf2, &
1553 actual_x_data%neighbor_cells, cell, do_periodic, screened)
1555 if (.not. screened)
then
1561 iatom, jatom, katom, latom, &
1562 iset, jset, kset, lset, &
1563 atomic_offset_ac, atomic_offset_ad, atomic_offset_bc, atomic_offset_bd, &
1564 offset_ac_set, offset_ad_set, offset_bc_set, offset_bd_set, &
1565 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1566 la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
1567 lc_min(kset), lc_max(kset), ld_min(lset), ld_max(lset), &
1568 nsgfl_a, nsgfl_b, nsgfl_c, nsgfl_d)
1573 if_use_libint:
if (use_libint)
then
1575 current_counter = nsgfa(iset)*nsgfb(jset)*nsgfc(kset)*nsgfd(lset)
1576 IF (buffer_overflow)
THEN
1577 neris_onthefly = neris_onthefly + current_counter
1581 IF (.NOT. buffer_overflow .AND. .NOT. my_geo_change)
THEN
1582 nints = current_counter
1583 IF (.NOT. use_disk_storage)
THEN
1585 estimate_to_store_int, 6, &
1586 maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
1590 estimate_to_store_int, 6, &
1591 maxval_cache_disk, maxval_container_disk, memory_parameter%actual_memory_usage_disk, &
1594 spherical_estimate = set_exponent(1.0_dp, estimate_to_store_int + 1)
1595 IF (spherical_estimate*pmax_entry < eps_schwarz) cycle
1596 nbits = exponent(anint(spherical_estimate*pmax_entry/eps_storage)) + 1
1599 IF (.NOT. use_disk_storage)
THEN
1600 neris_incore = neris_incore + int(nints,
int_8)
1602 neris_disk = neris_disk + int(nints,
int_8)
1604 DO WHILE (buffer_left > 0)
1605 buffer_size = min(buffer_left, cache_size)
1606 IF (.NOT. use_disk_storage)
THEN
1608 buffer_size, nbits, &
1609 integral_caches(nbits), &
1610 integral_containers(nbits), &
1611 eps_storage, pmax_entry, &
1612 memory_parameter%actual_memory_usage, &
1616 buffer_size, nbits, &
1617 integral_caches_disk(nbits), &
1618 integral_containers_disk(nbits), &
1619 eps_storage, pmax_entry, &
1620 memory_parameter%actual_memory_usage_disk, &
1623 buffer_left = buffer_left - buffer_size
1624 buffer_start = buffer_start + buffer_size
1628 IF (my_geo_change .OR. buffer_overflow)
THEN
1630 max_contraction_val = max_contraction(iset, iatom)* &
1631 max_contraction(jset, jatom)* &
1632 max_contraction(kset, katom)* &
1633 max_contraction(lset, latom)*pmax_entry
1634 tmp_r_1 => radii_pgf(:, :, jset, iset, jkind, ikind)
1635 tmp_r_2 => radii_pgf(:, :, lset, kset, lkind, kkind)
1636 tmp_screen_pgf1 => screen_coeffs_pgf(:, :, jset, iset, jkind, ikind)
1637 tmp_screen_pgf2 => screen_coeffs_pgf(:, :, lset, kset, lkind, kkind)
1639 CALL coulomb4(private_lib, ra, rb, rc, rd, npgfa(iset), npgfb(jset), npgfc(kset), npgfd(lset), &
1640 la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
1641 lc_min(kset), lc_max(kset), ld_min(lset), ld_max(lset), &
1642 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1643 sphi_a_u1, sphi_a_u2, sphi_a_u3, &
1644 sphi_b_u1, sphi_b_u2, sphi_b_u3, &
1645 sphi_c_u1, sphi_c_u2, sphi_c_u3, &
1646 sphi_d_u1, sphi_d_u2, sphi_d_u3, &
1647 zeta(1:npgfa(iset), iset), zetb(1:npgfb(jset), jset), &
1648 zetc(1:npgfc(kset), kset), zetd(1:npgfd(lset), lset), &
1649 primitive_integrals, &
1650 potential_parameter, &
1651 actual_x_data%neighbor_cells, screen_coeffs_set(jset, iset, jkind, ikind)%x, &
1652 screen_coeffs_set(lset, kset, lkind, kkind)%x, eps_schwarz, &
1653 max_contraction_val, cartesian_estimate, cell, neris_tmp, &
1654 log10_pmax, log10_eps_schwarz, &
1655 tmp_r_1, tmp_r_2, tmp_screen_pgf1, tmp_screen_pgf2, &
1656 pgf_list_ij, pgf_list_kl, pgf_product_list, &
1657 nsgfl_a(:, iset), nsgfl_b(:, jset), &
1658 nsgfl_c(:, kset), nsgfl_d(:, lset), &
1663 ee_work, ee_work2, ee_buffer1, ee_buffer2, ee_primitives_tmp, &
1664 nimages, do_periodic, p_work)
1666 nints = nsgfa(iset)*nsgfb(jset)*nsgfc(kset)*nsgfd(lset)
1667 neris_total = neris_total + nints
1668 nprim_ints = nprim_ints + neris_tmp
1671 spherical_estimate = 0.0_dp
1673 spherical_estimate = max(spherical_estimate, abs(primitive_integrals(i)))
1676 IF (spherical_estimate == 0.0_dp) spherical_estimate = tiny(spherical_estimate)
1677 estimate_to_store_int = exponent(spherical_estimate)
1678 estimate_to_store_int = max(estimate_to_store_int, -15_int_8)
1680 IF (.NOT. buffer_overflow .AND. my_geo_change)
THEN
1681 IF (.NOT. use_disk_storage)
THEN
1683 estimate_to_store_int, 6, &
1684 maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
1685 use_disk_storage, max_val_memory)
1688 estimate_to_store_int, 6, &
1689 maxval_cache_disk, maxval_container_disk, memory_parameter%actual_memory_usage_disk, &
1693 spherical_estimate = set_exponent(1.0_dp, estimate_to_store_int + 1)
1694 IF (spherical_estimate*pmax_entry < eps_schwarz) cycle
1695 IF (.NOT. buffer_overflow)
THEN
1696 nbits = exponent(anint(spherical_estimate*pmax_entry/eps_storage)) + 1
1709 IF (nbits > 63)
THEN
1710 WRITE (eps_schwarz_min_str,
'(ES10.3E2)') &
1711 spherical_estimate*pmax_entry/ &
1712 (set_exponent(1.0_dp, 63)*memory_parameter%eps_storage_scaling)
1714 WRITE (eps_scaling_str,
'(ES10.3E2)') &
1715 spherical_estimate*pmax_entry/(set_exponent(1.0_dp, 63)*eps_schwarz)
1717 CALL cp_abort(__location__, &
1718 "Overflow during ERI's compression. Please use a larger "// &
1719 "EPS_SCHWARZ threshold (above "//trim(adjustl(eps_schwarz_min_str))// &
1720 ") or increase the EPS_STORAGE_SCALING factor above "// &
1721 trim(adjustl(eps_scaling_str))//
".")
1726 IF (.NOT. use_disk_storage)
THEN
1727 neris_incore = neris_incore + int(nints,
int_8)
1729 neris_disk = neris_disk + int(nints,
int_8)
1731 DO WHILE (buffer_left > 0)
1732 buffer_size = min(buffer_left, cache_size)
1733 IF (.NOT. use_disk_storage)
THEN
1735 buffer_size, nbits, &
1736 integral_caches(nbits), &
1737 integral_containers(nbits), &
1738 eps_storage, pmax_entry, &
1739 memory_parameter%actual_memory_usage, &
1743 buffer_size, nbits, &
1744 integral_caches_disk(nbits), &
1745 integral_containers_disk(nbits), &
1746 eps_storage, pmax_entry, &
1747 memory_parameter%actual_memory_usage_disk, &
1750 buffer_left = buffer_left - buffer_size
1751 buffer_start = buffer_start + buffer_size
1756 primitive_integrals(i) = primitive_integrals(i)*pmax_entry
1757 IF (abs(primitive_integrals(i)) > eps_storage)
THEN
1758 primitive_integrals(i) = anint(primitive_integrals(i)/eps_storage,
dp)*eps_storage/pmax_entry
1760 primitive_integrals(i) = 0.0_dp
1767 CALL print_integrals( &
1768 iatom, jatom, katom, latom, shm_set_offset, shm_atomic_block_offset, &
1769 iset, jset, kset, lset, nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), primitive_integrals)
1771 IF (.NOT. is_anti_symmetric)
THEN
1773 CALL update_fock_matrix( &
1774 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1775 fac, symm_fac, full_density_alpha(:, 1), full_ks_alpha(:, 1), &
1776 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1777 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1778 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1779 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1780 IF (.NOT. treat_lsd_in_core)
THEN
1781 IF (my_nspins == 2)
THEN
1782 CALL update_fock_matrix( &
1783 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1784 fac, symm_fac, full_density_beta(:, 1), full_ks_beta(:, 1), &
1785 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1786 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1787 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1788 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1793 CALL update_fock_matrix_as( &
1794 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1795 fac, symm_fac, full_density_alpha(:, 1), full_ks_alpha(:, 1), &
1796 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1797 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1798 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1799 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1800 IF (.NOT. treat_lsd_in_core)
THEN
1801 IF (my_nspins == 2)
THEN
1802 CALL update_fock_matrix_as( &
1803 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1804 fac, symm_fac, full_density_beta(:, 1), full_ks_beta(:, 1), &
1805 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1806 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1807 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1808 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1812 END IF if_use_libint
1815 IF (do_disk_storage)
THEN
1816 buffer_overflow = .true.
1820 END DO atomic_blocks
1822 IF (my_geo_change)
THEN
1823 distribution_energy%time_first_scf = bintime_stop - bintime_start
1825 distribution_energy%time_other_scf = &
1826 distribution_energy%time_other_scf + bintime_stop - bintime_start
1829 CALL timestop(handle_bin)
1835 IF (use_libgint .and. use_libint)
THEN
1838 ALLOCATE (full_ks_alpha_from_gpu, mold=full_ks_alpha)
1840 IF (use_only_alpha_spin)
THEN
1843 ALLOCATE (full_ks_beta_from_gpu, mold=full_ks_beta)
1850 max_abs_delta_ks = 0.0_dp
1851 DO i = 1,
SIZE(full_ks_alpha)
1852 max_abs_delta_ks = max(max_abs_delta_ks, abs(full_ks_alpha(i, 1) - full_ks_alpha_from_gpu(i, 1)))
1855 WRITE (unit=iw, fmt=*)
" ------------------------------------ "
1856 WRITE (unit=iw, fmt=*)
" | rank ", para_env%mepos
1857 WRITE (unit=iw, fmt=*)
" | max abs dif: ", max_abs_delta_ks
1858 WRITE (unit=iw, fmt=*)
" ------------------------------------ "
1863 if (max_abs_delta_ks > 100.0_dp*eps_schwarz .or. max_abs_delta_ks < 1.0e-20_dp)
THEN
1864 WRITE (unit=iw, fmt=*)
" K from CPU | K from GPU | Delta | Ratio "
1865 DO i = 1,
SIZE(full_ks_alpha)
1866 write (unit=iw, fmt=*) i, full_ks_alpha(i, 1), full_ks_alpha_from_gpu(i, 1), &
1867 full_ks_alpha(i, 1) - full_ks_alpha_from_gpu(i, 1), &
1868 full_ks_alpha(i, 1)/full_ks_alpha_from_gpu(i, 1)
1873 IF (.NOT. use_only_alpha_spin)
THEN
1874 max_abs_delta_ks = 0.0_dp
1875 DO i = 1,
size(full_ks_beta)
1876 max_abs_delta_ks = max(max_abs_delta_ks, abs(full_ks_beta(i, 1) - full_ks_beta_from_gpu(i, 1)))
1879 WRITE (unit=iw, fmt=*)
" ------------------------------------ "
1880 WRITE (unit=iw, fmt=*)
" | rank ", para_env%mepos
1881 WRITE (unit=iw, fmt=*)
" | max abs dif B: ", max_abs_delta_ks
1882 WRITE (unit=iw, fmt=*)
" ------------------------------------ "
1886 IF (max_abs_delta_ks > 100.0_dp*eps_schwarz .or. max_abs_delta_ks < 1.0e-18_dp)
THEN
1888 WRITE (unit=iw, fmt=*)
" BETA K from CPU | K from GPU | Delta | Ratio "
1889 DO i = 1,
size(full_ks_beta)
1890 WRITE (unit=iw, fmt=*) i, full_ks_beta(i, 1), full_ks_beta_from_gpu(i, 1), &
1891 full_ks_beta(i, 1) - full_ks_beta_from_gpu(i, 1), &
1892 full_ks_beta(i, 1)/full_ks_beta_from_gpu(i, 1)
1901 IF (use_libgint .AND. (.NOT. use_libint))
THEN
1902 IF (use_only_alpha_spin)
THEN
1911 do_print_load_balance_info = .false.
1913 "LOAD_BALANCE%PRINT/LOAD_BALANCE_INFO"),
cp_p_file)
1916 IF (do_print_load_balance_info)
THEN
1920 extension=
".scfLog")
1928 "LOAD_BALANCE%PRINT/LOAD_BALANCE_INFO")
1938 DEALLOCATE (primitive_integrals)
1942 shm_neris_total = shm_neris_total + neris_total
1944 shm_neris_onthefly = shm_neris_onthefly + neris_onthefly
1946 shm_nprim_ints = shm_nprim_ints + nprim_ints
1948 storage_counter_integrals = memory_parameter%actual_memory_usage* &
1949 memory_parameter%cache_size
1950 stor_count_int_disk = memory_parameter%actual_memory_usage_disk* &
1951 memory_parameter%cache_size
1952 stor_count_max_val = max_val_memory*memory_parameter%cache_size
1954 shm_storage_counter_integrals = shm_storage_counter_integrals + storage_counter_integrals
1956 shm_stor_count_int_disk = shm_stor_count_int_disk + stor_count_int_disk
1958 shm_neris_incore = shm_neris_incore + neris_incore
1960 shm_neris_disk = shm_neris_disk + neris_disk
1962 shm_stor_count_max_val = shm_stor_count_max_val + stor_count_max_val
1967 shm_mem_compression_counter = 0
1970 tmp_i4 = x_data(irep, i)%memory_parameter%actual_memory_usage
1971 shm_mem_compression_counter = shm_mem_compression_counter + &
1972 tmp_i4*memory_parameter%cache_size
1976 actual_x_data%memory_parameter%final_comp_counter_energy = shm_mem_compression_counter
1983 mb_size_p = shm_block_offset(ncpu + 1)/1024/128
1984 mb_size_f = shm_block_offset(ncpu + 1)/1024/128
1985 IF (.NOT. treat_lsd_in_core)
THEN
1986 IF (my_nspins == 2)
THEN
1987 mb_size_f = mb_size_f*2
1988 mb_size_p = mb_size_p*2
1992 mb_size_buffers = int(nsgf_max,
int_8)**4*n_threads
1994 mb_size_buffers = mb_size_buffers + int(nsgf_max,
int_8)**2*n_threads
1995 subtr_size_mb = subtr_size_mb + 8_int_8*nsgf_max**2*n_threads
1997 mb_size_buffers = mb_size_buffers + max_pgf**2*max_set**2*nkind**2 &
1998 + max_set**2*nkind**2 &
2000 + max_pgf**2*max_set**2*nkind**2
2002 mb_size_buffers = mb_size_buffers + natom**2
2004 IF (do_p_screening)
THEN
2005 mb_size_buffers = mb_size_buffers + natom**2
2007 IF (screening_parameter%do_p_screening_forces)
THEN
2008 IF (memory_parameter%treat_forces_in_core)
THEN
2009 mb_size_buffers = mb_size_buffers + natom**2
2013 IF (do_p_screening .OR. screening_parameter%do_p_screening_forces)
THEN
2014 mb_size_buffers = mb_size_buffers + memory_parameter%size_p_screen
2017 IF (screening_parameter%do_p_screening_forces)
THEN
2018 IF (memory_parameter%treat_forces_in_core)
THEN
2019 mb_size_buffers = mb_size_buffers + memory_parameter%size_p_screen
2024 mb_size_buffers = mb_size_buffers/1024/128
2027 IF (is_anti_symmetric) afac = -1.0_dp
2028 CALL timestop(handle_main)
2029 ene_x_aa_diag = 0.0_dp
2030 ene_x_bb_diag = 0.0_dp
2032 ikind = kind_of(iatom)
2033 nseta = basis_parameter(ikind)%nset
2034 nsgfa => basis_parameter(ikind)%nsgf
2036 jkind = kind_of(jatom)
2037 nsetb = basis_parameter(jkind)%nset
2038 nsgfb => basis_parameter(jkind)%nsgf
2039 act_atomic_block_offset = shm_atomic_block_offset(jatom, iatom)
2040 DO img = 1, nkimages
2043 act_set_offset = shm_set_offset(jset, iset, jkind, ikind)
2044 i = act_set_offset + act_atomic_block_offset - 1
2045 DO ma = 1, nsgfa(iset)
2046 j = shm_set_offset(iset, jset, jkind, ikind) + act_atomic_block_offset - 1 + ma - 1
2047 DO mb = 1, nsgfb(jset)
2049 full_ks_alpha(i, img) = (full_ks_alpha(i, img) + full_ks_alpha(j, img)*afac)
2050 full_ks_alpha(j, img) = full_ks_alpha(i, img)*afac
2051 IF (.NOT. treat_lsd_in_core .AND. my_nspins == 2)
THEN
2052 full_ks_beta(i, img) = (full_ks_beta(i, img) + full_ks_beta(j, img)*afac)
2053 full_ks_beta(j, img) = full_ks_beta(i, img)*afac
2058 ene_x_aa_diag = ene_x_aa_diag + full_ks_alpha(i, img)*full_density_alpha(i, img)
2059 IF (.NOT. treat_lsd_in_core .AND. my_nspins == 2)
THEN
2060 ene_x_bb_diag = ene_x_bb_diag + full_ks_beta(i, img)*full_density_beta(i, img)
2072 CALL para_env%sync()
2074 IF (is_anti_symmetric) afac = 0._dp
2075 IF (distribute_fock_matrix)
THEN
2077 CALL timeset(routinen//
"_dist_KS", handle_dist_ks)
2078 DO img = 1, nkimages
2079 CALL distribute_ks_matrix(para_env, full_ks_alpha(:, img), ks_matrix(ispin, img)%matrix, shm_number_of_p_entries, &
2080 shm_block_offset, kind_of, basis_parameter, &
2081 off_diag_fac=0.5_dp, diag_fac=afac)
2084 NULLIFY (full_ks_alpha)
2085 DEALLOCATE (shm_master_x_data%full_ks_alpha)
2086 IF (.NOT. treat_lsd_in_core)
THEN
2087 IF (my_nspins == 2)
THEN
2088 DO img = 1, nkimages
2089 CALL distribute_ks_matrix(para_env, full_ks_beta(:, img), ks_matrix(2, img)%matrix, shm_number_of_p_entries, &
2090 shm_block_offset, kind_of, basis_parameter, &
2091 off_diag_fac=0.5_dp, diag_fac=afac)
2093 NULLIFY (full_ks_beta)
2094 DEALLOCATE (shm_master_x_data%full_ks_beta)
2097 CALL timestop(handle_dist_ks)
2100 IF (distribute_fock_matrix)
THEN
2103 DO img = 1, nkimages
2105 ene_x_aa = ene_x_aa + etmp
2108 IF (dft_control%do_admm)
THEN
2109 cpassert(nkimages == 1)
2110 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(ispin)%matrix, ks_matrix(ispin, 1)%matrix, &
2111 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
2115 IF (my_nspins == 2 .AND. .NOT. treat_lsd_in_core)
THEN
2116 DO img = 1, nkimages
2118 ene_x_bb = ene_x_bb + etmp
2121 IF (dft_control%do_admm)
THEN
2122 cpassert(nkimages == 1)
2123 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(2)%matrix, ks_matrix(2, 1)%matrix, &
2124 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
2129 ehfx = 0.5_dp*(ene_x_aa + ene_x_bb)
2133 DO img = 1, nkimages
2134 DO pa = 1,
SIZE(full_ks_alpha, 1)
2135 ene_x_aa = ene_x_aa + full_ks_alpha(pa, img)*full_density_alpha(pa, img)
2139 ene_x_aa = (ene_x_aa + ene_x_aa_diag)*0.5_dp
2140 IF (my_nspins == 2)
THEN
2141 DO img = 1, nkimages
2142 DO pa = 1,
SIZE(full_ks_beta, 1)
2143 ene_x_bb = ene_x_bb + full_ks_beta(pa, img)*full_density_beta(pa, img)
2147 ene_x_bb = (ene_x_bb + ene_x_bb_diag)*0.5_dp
2149 CALL para_env%sum(ene_x_aa)
2150 IF (my_nspins == 2)
CALL para_env%sum(ene_x_bb)
2151 ehfx = 0.5_dp*(ene_x_aa + ene_x_bb)
2155 IF (my_geo_change)
THEN
2156 tmp_i8(1:8) = [shm_storage_counter_integrals, shm_neris_onthefly, shm_neris_incore, shm_neris_disk, &
2157 shm_neris_total, shm_stor_count_int_disk, shm_nprim_ints, shm_stor_count_max_val]
2158 CALL para_env%sum(tmp_i8)
2159 shm_storage_counter_integrals = tmp_i8(1)
2160 shm_neris_onthefly = tmp_i8(2)
2161 shm_neris_incore = tmp_i8(3)
2162 shm_neris_disk = tmp_i8(4)
2163 shm_neris_total = tmp_i8(5)
2164 shm_stor_count_int_disk = tmp_i8(6)
2165 shm_nprim_ints = tmp_i8(7)
2166 shm_stor_count_max_val = tmp_i8(8)
2167 CALL para_env%max(memsize_after)
2168 mem_eris = (shm_storage_counter_integrals + 128*1024 - 1)/1024/128
2169 compression_factor = real(shm_neris_incore,
dp)/real(shm_storage_counter_integrals,
dp)
2170 mem_eris_disk = (shm_stor_count_int_disk + 128*1024 - 1)/1024/128
2171 compression_factor_disk = real(shm_neris_disk,
dp)/real(shm_stor_count_int_disk,
dp)
2172 mem_max_val = (shm_stor_count_max_val + 128*1024 - 1)/1024/128
2174 IF (shm_neris_incore == 0)
THEN
2176 compression_factor = 0.0_dp
2178 IF (shm_neris_disk == 0)
THEN
2180 compression_factor_disk = 0.0_dp
2184 extension=
".scfLog")
2186 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2187 "HFX_MEM_INFO| Number of cart. primitive ERI's calculated: ", shm_nprim_ints
2189 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2190 "HFX_MEM_INFO| Number of sph. ERI's calculated: ", shm_neris_total
2192 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2193 "HFX_MEM_INFO| Number of sph. ERI's stored in-core: ", shm_neris_incore
2195 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2196 "HFX_MEM_INFO| Number of sph. ERI's stored on disk: ", shm_neris_disk
2198 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2199 "HFX_MEM_INFO| Number of sph. ERI's calculated on the fly: ", shm_neris_onthefly
2201 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2202 "HFX_MEM_INFO| Total memory consumption ERI's RAM [MiB]: ", mem_eris
2204 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2205 "HFX_MEM_INFO| Whereof max-vals [MiB]: ", mem_max_val
2207 WRITE (unit=iw, fmt=
"((T3,A,T60,F21.2))") &
2208 "HFX_MEM_INFO| Total compression factor ERI's RAM: ", compression_factor
2210 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2211 "HFX_MEM_INFO| Total memory consumption ERI's disk [MiB]: ", mem_eris_disk
2213 WRITE (unit=iw, fmt=
"((T3,A,T60,F21.2))") &
2214 "HFX_MEM_INFO| Total compression factor ERI's disk: ", compression_factor_disk
2216 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2217 "HFX_MEM_INFO| Size of density/Fock matrix [MiB]: ", 2_int_8*mb_size_p
2219 IF (do_periodic)
THEN
2220 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2221 "HFX_MEM_INFO| Size of buffers [MiB]: ", mb_size_buffers
2222 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2223 "HFX_MEM_INFO| Number of periodic image cells considered: ",
SIZE(shm_master_x_data%neighbor_cells)
2225 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2226 "HFX_MEM_INFO| Size of buffers [MiB]: ", mb_size_buffers
2228 WRITE (unit=iw, fmt=
"((T3,A,T60,I21),/)") &
2229 "HFX_MEM_INFO| Est. max. program size after HFX [MiB]:", memsize_after/(1024*1024)
2239 IF (do_dynamic_load_balancing)
THEN
2240 my_bin_size =
SIZE(actual_x_data%distribution_energy)
2245 IF (my_geo_change)
THEN
2246 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
2247 DO bin = 1, my_bin_size
2248 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
2249 maxval_container => actual_x_data%store_ints%maxval_container(bin)
2250 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
2251 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
2252 CALL hfx_flush_last_cache(bits_max_val, maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
2256 memory_parameter%actual_memory_usage, .false.)
2262 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
2263 DO bin = 1, my_bin_size
2264 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
2265 maxval_container => actual_x_data%store_ints%maxval_container(bin)
2266 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
2267 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
2272 memory_parameter%actual_memory_usage, &
2280 IF (do_disk_storage)
THEN
2282 IF (my_geo_change)
THEN
2284 memory_parameter%actual_memory_usage_disk, .true.)
2287 memory_parameter%actual_memory_usage_disk, .true.)
2295 memory_parameter%actual_memory_usage_disk, do_disk_storage)
2301 DEALLOCATE (last_sgf_global)
2303 DEALLOCATE (full_density_alpha)
2304 IF (.NOT. treat_lsd_in_core)
THEN
2305 IF (my_nspins == 2)
THEN
2306 DEALLOCATE (full_density_beta)
2309 IF (do_dynamic_load_balancing)
THEN
2310 DEALLOCATE (shm_master_x_data%task_list)
2313 DEALLOCATE (pbd_buf, pbc_buf, pad_buf, pac_buf)
2314 DEALLOCATE (kbd_buf, kbc_buf, kad_buf, kac_buf)
2315 DEALLOCATE (set_list_ij, set_list_kl)
2317 DO i = 1, max_pgf**2
2318 DEALLOCATE (pgf_list_ij(i)%image_list)
2319 DEALLOCATE (pgf_list_kl(i)%image_list)
2322 DEALLOCATE (pgf_list_ij)
2323 DEALLOCATE (pgf_list_kl)
2324 DEALLOCATE (pgf_product_list)
2326 DEALLOCATE (max_contraction, kind_of)
2328 DEALLOCATE (ee_work, ee_work2, ee_buffer1, ee_buffer2, ee_primitives_tmp)
2330 DEALLOCATE (nimages)
2335 CALL timestop(handle)