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.
289 IF (my_geo_change)
THEN
291 CALL para_env%max(memsize_before)
295 WRITE (unit=iw, fmt=
"(/,(T3,A,T60,I21))") &
296 "HFX_MEM_INFO| Est. max. program size before HFX [MiB]:", memsize_before/(1024*1024)
303 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, cell=cell)
305 NULLIFY (cell_to_index)
306 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
309 CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
314 nkind =
SIZE(atomic_kind_set, 1)
317 l_max = max(l_max, maxval(x_data(1, 1)%basis_parameter(ikind)%lmax))
325 IF (para_env%is_source())
THEN
326 CALL open_file(unit_number=unit_id, file_name=x_data(1, 1)%potential_parameter%filename)
328 CALL init(l_max, unit_id, para_env%mepos, para_env)
329 IF (para_env%is_source())
THEN
341 IF (
PRESENT(nspins)) my_nspins = nspins
345 shm_neris_onthefly = 0
346 shm_storage_counter_integrals = 0
347 shm_stor_count_int_disk = 0
350 shm_stor_count_max_val = 0
449 actual_x_data => x_data(irep, i_thread + 1)
451 shm_master_x_data => x_data(irep, 1)
455 do_periodic = actual_x_data%periodic_parameter%do_periodic
457 IF (do_periodic)
THEN
459 actual_x_data%periodic_parameter%number_of_shells = actual_x_data%periodic_parameter%mode
464 screening_parameter = actual_x_data%screening_parameter
465 potential_parameter = actual_x_data%potential_parameter
467 general_parameter = actual_x_data%general_parameter
468 load_balance_parameter => actual_x_data%load_balance_parameter
469 memory_parameter => actual_x_data%memory_parameter
471 cache_size = memory_parameter%cache_size
472 bits_max_val = memory_parameter%bits_max_val
474 basis_parameter => actual_x_data%basis_parameter
475 basis_info => actual_x_data%basis_info
477 treat_lsd_in_core = general_parameter%treat_lsd_in_core
479 ncpu = para_env%num_pe
480 n_processes = ncpu*n_threads
483 neris_total = 0_int_8
484 neris_incore = 0_int_8
486 neris_onthefly = 0_int_8
488 mem_eris_disk = 0_int_8
489 mem_max_val = 0_int_8
490 compression_factor = 0.0_dp
491 compression_factor_disk = 0.0_dp
494 max_val_memory = 1_int_8
499 use_libgint = .false.
510 max_am = basis_info%max_am
513 atomic_kind_set=atomic_kind_set, &
514 particle_set=particle_set, &
515 dft_control=dft_control)
516 IF (dft_control%do_admm)
CALL get_admm_env(qs_env%admm_env, matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx)
518 do_p_screening = screening_parameter%do_initial_p_screening
520 IF (do_p_screening)
THEN
521 IF (
ASSOCIATED(qs_env%mp2_env))
THEN
522 IF ((qs_env%mp2_env%ri_grad%free_hfx_buffer))
THEN
523 do_p_screening = ((qs_env%mp2_env%p_screen) .AND. (qs_env%mp2_env%not_last_hfx))
525 do_p_screening = .false.
529 max_set = basis_info%max_set
530 natom =
SIZE(particle_set, 1)
533 nkimages = dft_control%nimages
534 cpassert(nkimages == 1)
542 ikind = kind_of(iatom)
543 nseta = basis_parameter(ikind)%nset
544 npgfa => basis_parameter(ikind)%npgf
545 la_max => basis_parameter(ikind)%lmax
546 nsgfa => basis_parameter(ikind)%nsgf
548 ncos_max = max(ncos_max,
ncoset(la_max(iset)))
549 nsgf_max = max(nsgf_max, nsgfa(iset))
553 ALLOCATE (primitive_integrals(nsgf_max**4))
554 primitive_integrals = 0.0_dp
556 ALLOCATE (pbd_buf(nsgf_max**2))
557 ALLOCATE (pbc_buf(nsgf_max**2))
558 ALLOCATE (pad_buf(nsgf_max**2))
559 ALLOCATE (pac_buf(nsgf_max**2))
560 ALLOCATE (kbd_buf(nsgf_max**2))
561 ALLOCATE (kbc_buf(nsgf_max**2))
562 ALLOCATE (kad_buf(nsgf_max**2))
563 ALLOCATE (kac_buf(nsgf_max**2))
564 ALLOCATE (ee_work(ncos_max**4))
565 ALLOCATE (ee_work2(ncos_max**4))
566 ALLOCATE (ee_buffer1(ncos_max**4))
567 ALLOCATE (ee_buffer2(ncos_max**4))
568 ALLOCATE (ee_primitives_tmp(nsgf_max**4))
570 IF (my_nspins == 0) my_nspins = dft_control%nspins
572 ALLOCATE (max_contraction(max_set, natom))
574 max_contraction = 0.0_dp
577 jkind = kind_of(jatom)
578 lb_max => basis_parameter(jkind)%lmax
579 nsetb = basis_parameter(jkind)%nset
580 npgfb => basis_parameter(jkind)%npgf
581 first_sgfb => basis_parameter(jkind)%first_sgf
582 sphi_b => basis_parameter(jkind)%sphi
583 nsgfb => basis_parameter(jkind)%nsgf
586 ncob = npgfb(jset)*
ncoset(lb_max(jset))
587 sgfb = first_sgfb(1, jset)
590 max_contraction(jset, jatom) = maxval([(sum(abs(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)])
591 max_pgf = max(max_pgf, npgfb(jset))
596 nneighbors =
SIZE(actual_x_data%neighbor_cells)
597 ALLOCATE (pgf_list_ij(max_pgf**2))
598 ALLOCATE (pgf_list_kl(max_pgf**2))
602 ALLOCATE (pgf_product_list(tmp_i4))
603 ALLOCATE (nimages(max_pgf**2))
606 ALLOCATE (pgf_list_ij(i)%image_list(nneighbors))
607 ALLOCATE (pgf_list_kl(i)%image_list(nneighbors))
612 IF (my_geo_change)
THEN
614 shm_master_x_data%is_assoc_atomic_block, &
615 shm_master_x_data%number_of_p_entries, &
617 shm_master_x_data%atomic_block_offset, &
618 shm_master_x_data%set_offset, &
619 shm_master_x_data%block_offset, &
620 shm_master_x_data%map_atoms_to_cpus, &
623 shm_is_assoc_atomic_block => shm_master_x_data%is_assoc_atomic_block
626 ks_fully_occ = .true.
627 outer:
DO iatom = 1, natom
628 DO jatom = iatom, natom
629 IF (shm_is_assoc_atomic_block(jatom, iatom) == 0)
THEN
630 ks_fully_occ = .false.
636 IF (.NOT. ks_fully_occ)
THEN
637 CALL cp_warn(__location__, &
638 "The Kohn Sham matrix is not 100% occupied. This "// &
639 "may result in incorrect Hartree-Fock results. Setting "// &
640 "MIN_PAIR_LIST_RADIUS to -1 in the QS section ensures a "// &
641 "fully occupied KS matrix. For more information "// &
642 "see FAQ: https://www.cp2k.org/faq:hfx_eps_warning")
647 shm_number_of_p_entries = shm_master_x_data%number_of_p_entries
648 shm_is_assoc_atomic_block => shm_master_x_data%is_assoc_atomic_block
649 shm_atomic_block_offset => shm_master_x_data%atomic_block_offset
650 shm_set_offset => shm_master_x_data%set_offset
651 shm_block_offset => shm_master_x_data%block_offset
657 subtr_size_mb = 2_int_8*shm_block_offset(ncpu + 1)
659 IF (.NOT. treat_lsd_in_core)
THEN
660 IF (my_nspins == 2) subtr_size_mb = subtr_size_mb*2_int_8
663 IF (do_p_screening .OR. screening_parameter%do_p_screening_forces)
THEN
664 subtr_size_mb = subtr_size_mb + memory_parameter%size_p_screen
667 IF (screening_parameter%do_p_screening_forces)
THEN
668 IF (memory_parameter%treat_forces_in_core)
THEN
669 subtr_size_mb = subtr_size_mb + memory_parameter%size_p_screen
673 subtr_size_mb = subtr_size_mb + nsgf_max**4*n_threads
675 subtr_size_mb = subtr_size_mb + 8_int_8*nsgf_max**2*n_threads
678 subtr_size_mb = subtr_size_mb + max_pgf**2*max_set**2*nkind**2
680 subtr_size_mb = subtr_size_mb + max_set**2*nkind**2
682 subtr_size_mb = subtr_size_mb + nkind**2
684 subtr_size_mb = subtr_size_mb + max_pgf**2*max_set**2*nkind**2
687 subtr_size_mb = subtr_size_mb + natom**2
690 IF (do_p_screening)
THEN
691 subtr_size_mb = subtr_size_mb + natom**2
693 IF (screening_parameter%do_p_screening_forces)
THEN
694 IF (memory_parameter%treat_forces_in_core)
THEN
695 subtr_size_mb = subtr_size_mb + natom**2
700 subtr_size_mb = subtr_size_mb*8_int_8/1024_int_8/1024_int_8
709 use_disk_storage = .false.
711 do_disk_storage = memory_parameter%do_disk_storage
712 IF (do_disk_storage)
THEN
713 maxval_container_disk => actual_x_data%store_ints%maxval_container_disk
714 maxval_cache_disk => actual_x_data%store_ints%maxval_cache_disk
716 integral_containers_disk => actual_x_data%store_ints%integral_containers_disk
717 integral_caches_disk => actual_x_data%store_ints%integral_caches_disk
720 IF (my_geo_change)
THEN
721 memory_parameter%ram_counter = huge(memory_parameter%ram_counter)
724 IF (my_geo_change)
THEN
725 memory_parameter%recalc_forces = .true.
727 IF (.NOT. memory_parameter%treat_forces_in_core) memory_parameter%recalc_forces = .true.
731 eps_schwarz = screening_parameter%eps_schwarz
732 IF (eps_schwarz <= 0.0_dp)
THEN
735 log10_eps_schwarz = log10(eps_schwarz)
738 eps_storage = eps_schwarz*memory_parameter%eps_storage_scaling
741 hf_fraction = general_parameter%fraction
746 potential_parameter = actual_x_data%potential_parameter
750 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
751 buffer_overflow = .false.
753 buffer_overflow = .true.
757 private_lib = actual_x_data%lib
760 ALLOCATE (last_sgf_global(0:natom))
761 last_sgf_global(0) = 0
763 ikind = kind_of(iatom)
764 last_sgf_global(iatom) = last_sgf_global(iatom - 1) + basis_parameter(ikind)%nsgf_total
770 NULLIFY (full_density_alpha, full_density_beta)
771 ALLOCATE (full_density_alpha(shm_block_offset(ncpu + 1), nkimages))
772 IF (.NOT. treat_lsd_in_core .OR. my_nspins == 1)
THEN
773 CALL timeset(routinen//
"_getP", handle_getp)
775 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(ispin, img)%matrix, shm_number_of_p_entries, &
776 shm_master_x_data%block_offset, &
777 kind_of, basis_parameter, get_max_vals_spin=.false., antisymmetric=is_anti_symmetric)
780 IF (my_nspins == 2)
THEN
781 ALLOCATE (full_density_beta(shm_block_offset(ncpu + 1), nkimages))
783 CALL get_full_density(para_env, full_density_beta(:, img), rho_ao(2, img)%matrix, shm_number_of_p_entries, &
784 shm_master_x_data%block_offset, &
785 kind_of, basis_parameter, get_max_vals_spin=.false., antisymmetric=is_anti_symmetric)
788 CALL timestop(handle_getp)
793 NULLIFY (shm_initial_p)
794 IF (do_p_screening)
THEN
795 shm_initial_p => shm_master_x_data%initial_p
796 shm_pmax_atom => shm_master_x_data%pmax_atom
797 IF (my_geo_change)
THEN
799 shm_master_x_data%map_atom_to_kind_atom, &
800 shm_master_x_data%set_offset, &
801 shm_master_x_data%atomic_block_offset, &
803 full_density_alpha, full_density_beta, &
804 natom, kind_of, basis_parameter, &
805 nkind, shm_master_x_data%is_assoc_atomic_block)
809 IF (do_p_screening)
THEN
810 CALL timeset(routinen//
"_getP", handle_getp)
812 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(1, img)%matrix, shm_number_of_p_entries, &
813 shm_master_x_data%block_offset, &
814 kind_of, basis_parameter, get_max_vals_spin=.true., &
815 rho_beta=rho_ao(2, img)%matrix, antisymmetric=is_anti_symmetric)
817 CALL timestop(handle_getp)
822 NULLIFY (shm_initial_p)
823 shm_initial_p => actual_x_data%initial_p
824 shm_pmax_atom => shm_master_x_data%pmax_atom
825 IF (my_geo_change)
THEN
827 shm_master_x_data%map_atom_to_kind_atom, &
828 shm_master_x_data%set_offset, &
829 shm_master_x_data%atomic_block_offset, &
831 full_density_alpha, full_density_beta, &
832 natom, kind_of, basis_parameter, &
833 nkind, shm_master_x_data%is_assoc_atomic_block)
838 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(ispin, img)%matrix, shm_number_of_p_entries, &
839 shm_master_x_data%block_offset, &
840 kind_of, basis_parameter, get_max_vals_spin=.false., &
841 antisymmetric=is_anti_symmetric)
845 NULLIFY (full_ks_alpha, full_ks_beta)
846 ALLOCATE (shm_master_x_data%full_ks_alpha(shm_block_offset(ncpu + 1), nkimages))
847 full_ks_alpha => shm_master_x_data%full_ks_alpha
848 full_ks_alpha = 0.0_dp
850 IF (.NOT. treat_lsd_in_core)
THEN
851 IF (my_nspins == 2)
THEN
852 ALLOCATE (shm_master_x_data%full_ks_beta(shm_block_offset(ncpu + 1), nkimages))
853 full_ks_beta => shm_master_x_data%full_ks_beta
854 full_ks_beta = 0.0_dp
866 IF (.NOT. shm_master_x_data%screen_funct_is_initialized)
THEN
868 shm_master_x_data%pair_dist_radii_pgf, max_set, max_pgf, eps_schwarz, &
872 shm_master_x_data%screen_funct_coeffs_set, &
873 shm_master_x_data%screen_funct_coeffs_kind, &
874 shm_master_x_data%screen_funct_coeffs_pgf, &
875 shm_master_x_data%pair_dist_radii_pgf, &
876 max_set, max_pgf, n_threads, i_thread, p_work)
879 shm_master_x_data%screen_funct_is_initialized = .true.
885 screen_coeffs_set => shm_master_x_data%screen_funct_coeffs_set
886 screen_coeffs_kind => shm_master_x_data%screen_funct_coeffs_kind
887 screen_coeffs_pgf => shm_master_x_data%screen_funct_coeffs_pgf
888 radii_pgf => shm_master_x_data%pair_dist_radii_pgf
893 IF (my_nspins == 1)
THEN
894 fac = 0.5_dp*hf_fraction
896 fac = 1.0_dp*hf_fraction
903 CALL timeset(routinen//
"_load", handle_load)
906 IF (my_geo_change)
THEN
907 IF (actual_x_data%b_first_load_balance_energy)
THEN
908 CALL hfx_load_balance(actual_x_data, eps_schwarz, particle_set, max_set, para_env, &
909 screen_coeffs_set, screen_coeffs_kind, &
910 shm_is_assoc_atomic_block, do_periodic, load_balance_parameter, &
911 kind_of, basis_parameter, shm_initial_p, shm_pmax_atom, i_thread, n_threads, &
912 cell, do_p_screening, actual_x_data%map_atom_to_kind_atom, &
914 actual_x_data%b_first_load_balance_energy = .false.
917 load_balance_parameter, &
923 CALL timestop(handle_load)
927 use_only_alpha_spin = treat_lsd_in_core .or. .not. my_nspins == 2
930 if (use_libgint)
then
939 nneighbors, max_pgf, natom, kind_of, particle_set, basis_parameter)
942 if (use_only_alpha_spin)
then
993 do_dynamic_load_balancing = .true.
995 IF (n_threads == 1 .OR. do_disk_storage) do_dynamic_load_balancing = .false.
997 IF (do_dynamic_load_balancing)
THEN
998 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1003 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1005 IF (my_geo_change)
THEN
1006 CALL dealloc_containers(actual_x_data%store_ints, memory_parameter%actual_memory_usage)
1009 DO bin = 1, my_bin_size
1010 maxval_container => actual_x_data%store_ints%maxval_container(bin)
1011 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
1012 CALL hfx_init_container(maxval_container, memory_parameter%actual_memory_usage, .false.)
1014 CALL hfx_init_container(integral_containers(i), memory_parameter%actual_memory_usage, .false.)
1020 IF (.NOT. my_geo_change)
THEN
1021 DO bin = 1, my_bin_size
1022 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
1023 maxval_container => actual_x_data%store_ints%maxval_container(bin)
1024 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
1025 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
1027 memory_parameter%actual_memory_usage, .false.)
1030 memory_parameter%actual_memory_usage, .false.)
1039 IF (do_disk_storage)
THEN
1041 IF (my_geo_change)
THEN
1042 CALL hfx_init_container(maxval_container_disk, memory_parameter%actual_memory_usage_disk, do_disk_storage)
1044 CALL hfx_init_container(integral_containers_disk(i), memory_parameter%actual_memory_usage_disk, do_disk_storage)
1048 IF (.NOT. my_geo_change)
THEN
1050 memory_parameter%actual_memory_usage_disk, .true.)
1053 memory_parameter%actual_memory_usage_disk, .true.)
1062 IF (do_dynamic_load_balancing)
THEN
1066 shm_total_bins = shm_total_bins +
SIZE(x_data(irep, i)%distribution_energy)
1068 ALLOCATE (tmp_task_list(shm_total_bins))
1069 shm_task_counter = 0
1071 DO bin = 1,
SIZE(x_data(irep, i)%distribution_energy)
1072 shm_task_counter = shm_task_counter + 1
1073 tmp_task_list(shm_task_counter)%thread_id = i
1074 tmp_task_list(shm_task_counter)%bin_id = bin
1075 tmp_task_list(shm_task_counter)%cost = x_data(irep, i)%distribution_energy(bin)%cost
1080 ALLOCATE (tmp_task_list_cost(shm_total_bins))
1081 ALLOCATE (tmp_index(shm_total_bins))
1083 DO i = 1, shm_total_bins
1084 tmp_task_list_cost(i) = tmp_task_list(i)%cost
1087 CALL sort(tmp_task_list_cost, shm_total_bins, tmp_index)
1089 ALLOCATE (shm_master_x_data%task_list(shm_total_bins))
1091 DO i = 1, shm_total_bins
1092 shm_master_x_data%task_list(i) = tmp_task_list(tmp_index(shm_total_bins - i + 1))
1095 shm_task_list => shm_master_x_data%task_list
1096 shm_task_counter = 0
1098 DEALLOCATE (tmp_task_list_cost, tmp_index, tmp_task_list)
1103 IF (my_bin_size > 0)
THEN
1104 maxval_container => actual_x_data%store_ints%maxval_container(1)
1105 maxval_cache => actual_x_data%store_ints%maxval_cache(1)
1107 integral_containers => actual_x_data%store_ints%integral_containers(:, 1)
1108 integral_caches => actual_x_data%store_ints%integral_caches(:, 1)
1113 CALL timeset(routinen//
"_main", handle_main)
1117 coeffs_kind_max0 = maxval(screen_coeffs_kind(:, :)%x(2))
1118 ALLOCATE (set_list_ij((max_set*load_balance_parameter%block_size)**2))
1119 ALLOCATE (set_list_kl((max_set*load_balance_parameter%block_size)**2))
1125 actual_x_data%pmax_block = 0.0_dp
1126 shm_pmax_block => actual_x_data%pmax_block
1127 IF (do_p_screening)
THEN
1128 DO iatom_block = 1,
SIZE(actual_x_data%blocks)
1129 iatom_start = actual_x_data%blocks(iatom_block)%istart
1130 iatom_end = actual_x_data%blocks(iatom_block)%iend
1131 DO jatom_block = 1,
SIZE(actual_x_data%blocks)
1132 jatom_start = actual_x_data%blocks(jatom_block)%istart
1133 jatom_end = actual_x_data%blocks(jatom_block)%iend
1134 shm_pmax_block(iatom_block, jatom_block) = maxval(shm_pmax_atom(iatom_start:iatom_end, jatom_start:jatom_end))
1138 shm_atomic_pair_list => actual_x_data%atomic_pair_list
1139 IF (my_geo_change)
THEN
1141 do_periodic, screen_coeffs_kind, coeffs_kind_max0, log10_eps_schwarz, cell, &
1142 actual_x_data%blocks)
1145 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1147 IF (my_geo_change)
THEN
1148 DO bin = 1, my_bin_size
1149 actual_x_data%distribution_energy(bin)%time_first_scf = 0.0_dp
1150 actual_x_data%distribution_energy(bin)%time_other_scf = 0.0_dp
1151 actual_x_data%distribution_energy(bin)%time_forces = 0.0_dp
1157 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1158 nblocks = load_balance_parameter%nblocks
1164 DO WHILE (bins_left)
1166 IF (.NOT. do_dynamic_load_balancing)
THEN
1168 IF (bin > my_bin_size)
THEN
1174 distribution_energy => actual_x_data%distribution_energy(bin)
1178 shm_task_counter = shm_task_counter + 1
1179 IF (shm_task_counter <= shm_total_bins)
THEN
1180 my_thread_id = shm_task_list(shm_task_counter)%thread_id
1181 my_bin_id = shm_task_list(shm_task_counter)%bin_id
1182 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1183 maxval_cache => x_data(irep, my_thread_id)%store_ints%maxval_cache(my_bin_id)
1184 maxval_container => x_data(irep, my_thread_id)%store_ints%maxval_container(my_bin_id)
1185 integral_caches => x_data(irep, my_thread_id)%store_ints%integral_caches(:, my_bin_id)
1186 integral_containers => x_data(irep, my_thread_id)%store_ints%integral_containers(:, my_bin_id)
1188 distribution_energy => x_data(irep, my_thread_id)%distribution_energy(my_bin_id)
1191 IF (my_geo_change)
THEN
1192 distribution_energy%ram_counter = huge(distribution_energy%ram_counter)
1201 IF (.NOT. do_it) cycle
1204 CALL timeset(routinen//
"_bin", handle_bin)
1208 my_istart = distribution_energy%istart
1209 my_current_counter = 0
1210 IF (distribution_energy%number_of_atom_quartets == 0 .OR. &
1211 my_istart == -1_int_8) my_istart = nblocks**4
1212 atomic_blocks:
DO atom_block = my_istart, nblocks**4 - 1, n_processes
1213 latom_block = int(
modulo(atom_block, nblocks)) + 1
1214 tmp_block = atom_block/nblocks
1215 katom_block = int(
modulo(tmp_block, nblocks)) + 1
1216 IF (latom_block < katom_block) cycle atomic_blocks
1217 tmp_block = tmp_block/nblocks
1218 jatom_block = int(
modulo(tmp_block, nblocks)) + 1
1219 tmp_block = tmp_block/nblocks
1220 iatom_block = int(
modulo(tmp_block, nblocks)) + 1
1221 IF (jatom_block < iatom_block) cycle atomic_blocks
1222 my_current_counter = my_current_counter + 1
1223 IF (my_current_counter > distribution_energy%number_of_atom_quartets)
EXIT atomic_blocks
1225 iatom_start = actual_x_data%blocks(iatom_block)%istart
1226 iatom_end = actual_x_data%blocks(iatom_block)%iend
1227 jatom_start = actual_x_data%blocks(jatom_block)%istart
1228 jatom_end = actual_x_data%blocks(jatom_block)%iend
1229 katom_start = actual_x_data%blocks(katom_block)%istart
1230 katom_end = actual_x_data%blocks(katom_block)%iend
1231 latom_start = actual_x_data%blocks(latom_block)%istart
1232 latom_end = actual_x_data%blocks(latom_block)%iend
1234 pmax_blocks = max(shm_pmax_block(katom_block, iatom_block), &
1235 shm_pmax_block(latom_block, jatom_block), &
1236 shm_pmax_block(latom_block, iatom_block), &
1237 shm_pmax_block(katom_block, jatom_block))
1239 IF (2.0_dp*coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle atomic_blocks
1241 CALL build_pair_list(natom, list_ij, set_list_ij, iatom_start, iatom_end, &
1242 jatom_start, jatom_end, &
1243 kind_of, basis_parameter, particle_set, &
1244 do_periodic, screen_coeffs_set, screen_coeffs_kind, &
1245 coeffs_kind_max0, log10_eps_schwarz, cell, pmax_blocks, &
1246 shm_atomic_pair_list)
1248 CALL build_pair_list(natom, list_kl, set_list_kl, katom_start, katom_end, &
1249 latom_start, latom_end, &
1250 kind_of, basis_parameter, particle_set, &
1251 do_periodic, screen_coeffs_set, screen_coeffs_kind, &
1252 coeffs_kind_max0, log10_eps_schwarz, cell, pmax_blocks, &
1253 shm_atomic_pair_list)
1255 DO i_list_ij = 1, list_ij%n_element
1257 iatom = list_ij%elements(i_list_ij)%pair(1)
1258 jatom = list_ij%elements(i_list_ij)%pair(2)
1259 i_set_list_ij_start = list_ij%elements(i_list_ij)%set_bounds(1)
1260 i_set_list_ij_stop = list_ij%elements(i_list_ij)%set_bounds(2)
1261 ikind = list_ij%elements(i_list_ij)%kind_pair(1)
1262 jkind = list_ij%elements(i_list_ij)%kind_pair(2)
1263 ra = list_ij%elements(i_list_ij)%r1
1264 rb = list_ij%elements(i_list_ij)%r2
1265 rab2 = list_ij%elements(i_list_ij)%dist2
1267 la_max => basis_parameter(ikind)%lmax
1268 la_min => basis_parameter(ikind)%lmin
1269 npgfa => basis_parameter(ikind)%npgf
1270 nseta = basis_parameter(ikind)%nset
1271 zeta => basis_parameter(ikind)%zet
1272 nsgfa => basis_parameter(ikind)%nsgf
1273 sphi_a_ext => basis_parameter(ikind)%sphi_ext(:, :, :, :)
1274 nsgfl_a => basis_parameter(ikind)%nsgfl
1275 sphi_a_u1 = ubound(sphi_a_ext, 1)
1276 sphi_a_u2 = ubound(sphi_a_ext, 2)
1277 sphi_a_u3 = ubound(sphi_a_ext, 3)
1279 lb_max => basis_parameter(jkind)%lmax
1280 lb_min => basis_parameter(jkind)%lmin
1281 npgfb => basis_parameter(jkind)%npgf
1282 nsetb = basis_parameter(jkind)%nset
1283 zetb => basis_parameter(jkind)%zet
1284 nsgfb => basis_parameter(jkind)%nsgf
1285 sphi_b_ext => basis_parameter(jkind)%sphi_ext(:, :, :, :)
1286 nsgfl_b => basis_parameter(jkind)%nsgfl
1287 sphi_b_u1 = ubound(sphi_b_ext, 1)
1288 sphi_b_u2 = ubound(sphi_b_ext, 2)
1289 sphi_b_u3 = ubound(sphi_b_ext, 3)
1291 DO i_list_kl = 1, list_kl%n_element
1292 katom = list_kl%elements(i_list_kl)%pair(1)
1293 latom = list_kl%elements(i_list_kl)%pair(2)
1295 IF (.NOT. (katom + latom <= iatom + jatom)) cycle
1296 IF (((iatom + jatom) == (katom + latom)) .AND. (katom < iatom)) cycle
1297 i_set_list_kl_start = list_kl%elements(i_list_kl)%set_bounds(1)
1298 i_set_list_kl_stop = list_kl%elements(i_list_kl)%set_bounds(2)
1299 kkind = list_kl%elements(i_list_kl)%kind_pair(1)
1300 lkind = list_kl%elements(i_list_kl)%kind_pair(2)
1301 rc = list_kl%elements(i_list_kl)%r1
1302 rd = list_kl%elements(i_list_kl)%r2
1303 rcd2 = list_kl%elements(i_list_kl)%dist2
1305 IF (do_p_screening)
THEN
1306 pmax_atom = max(shm_pmax_atom(katom, iatom), &
1307 shm_pmax_atom(latom, jatom), &
1308 shm_pmax_atom(latom, iatom), &
1309 shm_pmax_atom(katom, jatom))
1314 screen_kind_ij = screen_coeffs_kind(jkind, ikind)%x(1)*rab2 + &
1315 screen_coeffs_kind(jkind, ikind)%x(2)
1316 screen_kind_kl = screen_coeffs_kind(lkind, kkind)%x(1)*rcd2 + &
1317 screen_coeffs_kind(lkind, kkind)%x(2)
1319 IF (screen_kind_ij + screen_kind_kl + pmax_atom < log10_eps_schwarz) cycle
1323 IF (.NOT. (shm_is_assoc_atomic_block(latom, iatom) >= 1 .AND. &
1324 shm_is_assoc_atomic_block(katom, iatom) >= 1 .AND. &
1325 shm_is_assoc_atomic_block(katom, jatom) >= 1 .AND. &
1326 shm_is_assoc_atomic_block(latom, jatom) >= 1)) cycle
1330 IF (iatom == jatom) symm_fac = symm_fac*2.0_dp
1331 IF (katom == latom) symm_fac = symm_fac*2.0_dp
1332 IF (iatom == katom .AND. jatom == latom .AND. iatom /= jatom .AND. katom /= latom) symm_fac = symm_fac*2.0_dp
1333 IF (iatom == katom .AND. iatom == jatom .AND. katom == latom) symm_fac = symm_fac*2.0_dp
1334 symm_fac = 1.0_dp/symm_fac
1336 lc_max => basis_parameter(kkind)%lmax
1337 lc_min => basis_parameter(kkind)%lmin
1338 npgfc => basis_parameter(kkind)%npgf
1339 zetc => basis_parameter(kkind)%zet
1340 nsgfc => basis_parameter(kkind)%nsgf
1341 sphi_c_ext => basis_parameter(kkind)%sphi_ext(:, :, :, :)
1342 nsgfl_c => basis_parameter(kkind)%nsgfl
1343 sphi_c_u1 = ubound(sphi_c_ext, 1)
1344 sphi_c_u2 = ubound(sphi_c_ext, 2)
1345 sphi_c_u3 = ubound(sphi_c_ext, 3)
1347 ld_max => basis_parameter(lkind)%lmax
1348 ld_min => basis_parameter(lkind)%lmin
1349 npgfd => basis_parameter(lkind)%npgf
1350 zetd => basis_parameter(lkind)%zet
1351 nsgfd => basis_parameter(lkind)%nsgf
1352 sphi_d_ext => basis_parameter(lkind)%sphi_ext(:, :, :, :)
1353 nsgfl_d => basis_parameter(lkind)%nsgfl
1354 sphi_d_u1 = ubound(sphi_d_ext, 1)
1355 sphi_d_u2 = ubound(sphi_d_ext, 2)
1356 sphi_d_u3 = ubound(sphi_d_ext, 3)
1360 atomic_offset_bd = shm_atomic_block_offset(jatom, latom)
1361 atomic_offset_bc = shm_atomic_block_offset(jatom, katom)
1362 atomic_offset_ad = shm_atomic_block_offset(iatom, latom)
1363 atomic_offset_ac = shm_atomic_block_offset(iatom, katom)
1365 IF (jatom < latom)
THEN
1366 offset_bd_set => shm_set_offset(:, :, lkind, jkind)
1368 offset_bd_set => shm_set_offset(:, :, jkind, lkind)
1370 IF (jatom < katom)
THEN
1371 offset_bc_set => shm_set_offset(:, :, kkind, jkind)
1373 offset_bc_set => shm_set_offset(:, :, jkind, kkind)
1375 IF (iatom < latom)
THEN
1376 offset_ad_set => shm_set_offset(:, :, lkind, ikind)
1378 offset_ad_set => shm_set_offset(:, :, ikind, lkind)
1380 IF (iatom < katom)
THEN
1381 offset_ac_set => shm_set_offset(:, :, kkind, ikind)
1383 offset_ac_set => shm_set_offset(:, :, ikind, kkind)
1386 IF (do_p_screening)
THEN
1388 kind_kind_idx = int(get_1d_idx(kkind, ikind, int(nkind,
int_8)))
1389 IF (ikind >= kkind)
THEN
1390 ptr_p_1 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1391 actual_x_data%map_atom_to_kind_atom(katom), &
1392 actual_x_data%map_atom_to_kind_atom(iatom))
1394 ptr_p_1 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1395 actual_x_data%map_atom_to_kind_atom(iatom), &
1396 actual_x_data%map_atom_to_kind_atom(katom))
1397 swap_id = swap_id + 1
1399 kind_kind_idx = int(get_1d_idx(lkind, jkind, int(nkind,
int_8)))
1400 IF (jkind >= lkind)
THEN
1401 ptr_p_2 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1402 actual_x_data%map_atom_to_kind_atom(latom), &
1403 actual_x_data%map_atom_to_kind_atom(jatom))
1405 ptr_p_2 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1406 actual_x_data%map_atom_to_kind_atom(jatom), &
1407 actual_x_data%map_atom_to_kind_atom(latom))
1408 swap_id = swap_id + 2
1410 kind_kind_idx = int(get_1d_idx(lkind, ikind, int(nkind,
int_8)))
1411 IF (ikind >= lkind)
THEN
1412 ptr_p_3 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1413 actual_x_data%map_atom_to_kind_atom(latom), &
1414 actual_x_data%map_atom_to_kind_atom(iatom))
1416 ptr_p_3 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1417 actual_x_data%map_atom_to_kind_atom(iatom), &
1418 actual_x_data%map_atom_to_kind_atom(latom))
1419 swap_id = swap_id + 4
1421 kind_kind_idx = int(get_1d_idx(kkind, jkind, int(nkind,
int_8)))
1422 IF (jkind >= kkind)
THEN
1423 ptr_p_4 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1424 actual_x_data%map_atom_to_kind_atom(katom), &
1425 actual_x_data%map_atom_to_kind_atom(jatom))
1427 ptr_p_4 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1428 actual_x_data%map_atom_to_kind_atom(jatom), &
1429 actual_x_data%map_atom_to_kind_atom(katom))
1430 swap_id = swap_id + 8
1435 IF (my_geo_change)
THEN
1436 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1443 mem_compression_counter = 0
1446 tmp_i4 = x_data(irep, i)%memory_parameter%actual_memory_usage
1447 mem_compression_counter = mem_compression_counter + &
1448 tmp_i4*memory_parameter%cache_size
1450 IF (mem_compression_counter > memory_parameter%max_compression_counter)
THEN
1451 buffer_overflow = .true.
1452 IF (do_dynamic_load_balancing)
THEN
1453 distribution_energy%ram_counter = counter
1455 memory_parameter%ram_counter = counter
1458 counter = counter + 1
1459 buffer_overflow = .false.
1463 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1464 IF (do_dynamic_load_balancing)
THEN
1465 IF (distribution_energy%ram_counter == counter)
THEN
1466 buffer_overflow = .true.
1468 counter = counter + 1
1469 buffer_overflow = .false.
1473 IF (memory_parameter%ram_counter == counter)
THEN
1474 buffer_overflow = .true.
1476 counter = counter + 1
1477 buffer_overflow = .false.
1483 IF (buffer_overflow .AND. do_disk_storage)
THEN
1484 use_disk_storage = .true.
1485 buffer_overflow = .false.
1488 IF (use_disk_storage)
THEN
1490 tmp_i4 = memory_parameter%actual_memory_usage_disk
1491 mem_compression_counter_disk = tmp_i4*memory_parameter%cache_size
1492 IF (mem_compression_counter_disk > memory_parameter%max_compression_counter_disk)
THEN
1493 buffer_overflow = .true.
1494 use_disk_storage = .false.
1498 DO i_set_list_ij = i_set_list_ij_start, i_set_list_ij_stop
1499 iset = set_list_ij(i_set_list_ij)%pair(1)
1500 jset = set_list_ij(i_set_list_ij)%pair(2)
1502 ncob = npgfb(jset)*
ncoset(lb_max(jset))
1503 max_val1 = screen_coeffs_set(jset, iset, jkind, ikind)%x(1)*rab2 + &
1504 screen_coeffs_set(jset, iset, jkind, ikind)%x(2)
1506 IF (max_val1 + screen_kind_kl + pmax_atom < log10_eps_schwarz) cycle
1508 sphi_a_ext_set => sphi_a_ext(:, :, :, iset)
1509 sphi_b_ext_set => sphi_b_ext(:, :, :, jset)
1510 DO i_set_list_kl = i_set_list_kl_start, i_set_list_kl_stop
1511 kset = set_list_kl(i_set_list_kl)%pair(1)
1512 lset = set_list_kl(i_set_list_kl)%pair(2)
1514 max_val2_set = (screen_coeffs_set(lset, kset, lkind, kkind)%x(1)*rcd2 + &
1515 screen_coeffs_set(lset, kset, lkind, kkind)%x(2))
1516 max_val2 = max_val1 + max_val2_set
1519 IF (max_val2 + pmax_atom < log10_eps_schwarz) cycle
1520 sphi_c_ext_set => sphi_c_ext(:, :, :, kset)
1521 sphi_d_ext_set => sphi_d_ext(:, :, :, lset)
1523 IF (do_p_screening)
THEN
1524 CALL get_pmax_val(ptr_p_1, ptr_p_2, ptr_p_3, ptr_p_4, &
1525 iset, jset, kset, lset, &
1526 pmax_entry, swap_id)
1530 log10_pmax = pmax_entry
1531 max_val2 = max_val2 + log10_pmax
1532 IF (max_val2 < log10_eps_schwarz) cycle
1533 pmax_entry = exp(log10_pmax*ln_10)
1537 if (use_libgint)
then
1538 tmp_screen_pgf1 => screen_coeffs_pgf(:, :, jset, iset, jkind, ikind)
1539 tmp_screen_pgf2 => screen_coeffs_pgf(:, :, lset, kset, lkind, kkind)
1543 iatom, jatom, katom, latom, iset, jset, kset, lset, &
1545 npgfa(iset), npgfb(jset), npgfc(kset), npgfd(lset), &
1546 potential_parameter, &
1547 screen_coeffs_set(jset, iset, jkind, ikind)%x, &
1548 screen_coeffs_set(lset, kset, lkind, kkind)%x, &
1549 log10_pmax, log10_eps_schwarz, &
1550 tmp_screen_pgf1, tmp_screen_pgf2, &
1551 actual_x_data%neighbor_cells, cell, do_periodic, screened)
1553 if (.not. screened)
then
1559 iatom, jatom, katom, latom, &
1560 iset, jset, kset, lset, &
1561 atomic_offset_ac, atomic_offset_ad, atomic_offset_bc, atomic_offset_bd, &
1562 offset_ac_set, offset_ad_set, offset_bc_set, offset_bd_set, &
1563 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1564 la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
1565 lc_min(kset), lc_max(kset), ld_min(lset), ld_max(lset), &
1566 nsgfl_a, nsgfl_b, nsgfl_c, nsgfl_d)
1571 if_use_libint:
if (use_libint)
then
1573 current_counter = nsgfa(iset)*nsgfb(jset)*nsgfc(kset)*nsgfd(lset)
1574 IF (buffer_overflow)
THEN
1575 neris_onthefly = neris_onthefly + current_counter
1579 IF (.NOT. buffer_overflow .AND. .NOT. my_geo_change)
THEN
1580 nints = current_counter
1581 IF (.NOT. use_disk_storage)
THEN
1583 estimate_to_store_int, 6, &
1584 maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
1588 estimate_to_store_int, 6, &
1589 maxval_cache_disk, maxval_container_disk, memory_parameter%actual_memory_usage_disk, &
1592 spherical_estimate = set_exponent(1.0_dp, estimate_to_store_int + 1)
1593 IF (spherical_estimate*pmax_entry < eps_schwarz) cycle
1594 nbits = exponent(anint(spherical_estimate*pmax_entry/eps_storage)) + 1
1597 IF (.NOT. use_disk_storage)
THEN
1598 neris_incore = neris_incore + int(nints,
int_8)
1600 neris_disk = neris_disk + int(nints,
int_8)
1602 DO WHILE (buffer_left > 0)
1603 buffer_size = min(buffer_left, cache_size)
1604 IF (.NOT. use_disk_storage)
THEN
1606 buffer_size, nbits, &
1607 integral_caches(nbits), &
1608 integral_containers(nbits), &
1609 eps_storage, pmax_entry, &
1610 memory_parameter%actual_memory_usage, &
1614 buffer_size, nbits, &
1615 integral_caches_disk(nbits), &
1616 integral_containers_disk(nbits), &
1617 eps_storage, pmax_entry, &
1618 memory_parameter%actual_memory_usage_disk, &
1621 buffer_left = buffer_left - buffer_size
1622 buffer_start = buffer_start + buffer_size
1626 IF (my_geo_change .OR. buffer_overflow)
THEN
1628 max_contraction_val = max_contraction(iset, iatom)* &
1629 max_contraction(jset, jatom)* &
1630 max_contraction(kset, katom)* &
1631 max_contraction(lset, latom)*pmax_entry
1632 tmp_r_1 => radii_pgf(:, :, jset, iset, jkind, ikind)
1633 tmp_r_2 => radii_pgf(:, :, lset, kset, lkind, kkind)
1634 tmp_screen_pgf1 => screen_coeffs_pgf(:, :, jset, iset, jkind, ikind)
1635 tmp_screen_pgf2 => screen_coeffs_pgf(:, :, lset, kset, lkind, kkind)
1637 CALL coulomb4(private_lib, ra, rb, rc, rd, npgfa(iset), npgfb(jset), npgfc(kset), npgfd(lset), &
1638 la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
1639 lc_min(kset), lc_max(kset), ld_min(lset), ld_max(lset), &
1640 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1641 sphi_a_u1, sphi_a_u2, sphi_a_u3, &
1642 sphi_b_u1, sphi_b_u2, sphi_b_u3, &
1643 sphi_c_u1, sphi_c_u2, sphi_c_u3, &
1644 sphi_d_u1, sphi_d_u2, sphi_d_u3, &
1645 zeta(1:npgfa(iset), iset), zetb(1:npgfb(jset), jset), &
1646 zetc(1:npgfc(kset), kset), zetd(1:npgfd(lset), lset), &
1647 primitive_integrals, &
1648 potential_parameter, &
1649 actual_x_data%neighbor_cells, screen_coeffs_set(jset, iset, jkind, ikind)%x, &
1650 screen_coeffs_set(lset, kset, lkind, kkind)%x, eps_schwarz, &
1651 max_contraction_val, cartesian_estimate, cell, neris_tmp, &
1652 log10_pmax, log10_eps_schwarz, &
1653 tmp_r_1, tmp_r_2, tmp_screen_pgf1, tmp_screen_pgf2, &
1654 pgf_list_ij, pgf_list_kl, pgf_product_list, &
1655 nsgfl_a(:, iset), nsgfl_b(:, jset), &
1656 nsgfl_c(:, kset), nsgfl_d(:, lset), &
1661 ee_work, ee_work2, ee_buffer1, ee_buffer2, ee_primitives_tmp, &
1662 nimages, do_periodic, p_work)
1664 nints = nsgfa(iset)*nsgfb(jset)*nsgfc(kset)*nsgfd(lset)
1665 neris_total = neris_total + nints
1666 nprim_ints = nprim_ints + neris_tmp
1669 spherical_estimate = 0.0_dp
1671 spherical_estimate = max(spherical_estimate, abs(primitive_integrals(i)))
1674 IF (spherical_estimate == 0.0_dp) spherical_estimate = tiny(spherical_estimate)
1675 estimate_to_store_int = exponent(spherical_estimate)
1676 estimate_to_store_int = max(estimate_to_store_int, -15_int_8)
1678 IF (.NOT. buffer_overflow .AND. my_geo_change)
THEN
1679 IF (.NOT. use_disk_storage)
THEN
1681 estimate_to_store_int, 6, &
1682 maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
1683 use_disk_storage, max_val_memory)
1686 estimate_to_store_int, 6, &
1687 maxval_cache_disk, maxval_container_disk, memory_parameter%actual_memory_usage_disk, &
1691 spherical_estimate = set_exponent(1.0_dp, estimate_to_store_int + 1)
1692 IF (spherical_estimate*pmax_entry < eps_schwarz) cycle
1693 IF (.NOT. buffer_overflow)
THEN
1694 nbits = exponent(anint(spherical_estimate*pmax_entry/eps_storage)) + 1
1707 IF (nbits > 63)
THEN
1708 WRITE (eps_schwarz_min_str,
'(ES10.3E2)') &
1709 spherical_estimate*pmax_entry/ &
1710 (set_exponent(1.0_dp, 63)*memory_parameter%eps_storage_scaling)
1712 WRITE (eps_scaling_str,
'(ES10.3E2)') &
1713 spherical_estimate*pmax_entry/(set_exponent(1.0_dp, 63)*eps_schwarz)
1715 CALL cp_abort(__location__, &
1716 "Overflow during ERI's compression. Please use a larger "// &
1717 "EPS_SCHWARZ threshold (above "//trim(adjustl(eps_schwarz_min_str))// &
1718 ") or increase the EPS_STORAGE_SCALING factor above "// &
1719 trim(adjustl(eps_scaling_str))//
".")
1724 IF (.NOT. use_disk_storage)
THEN
1725 neris_incore = neris_incore + int(nints,
int_8)
1727 neris_disk = neris_disk + int(nints,
int_8)
1729 DO WHILE (buffer_left > 0)
1730 buffer_size = min(buffer_left, cache_size)
1731 IF (.NOT. use_disk_storage)
THEN
1733 buffer_size, nbits, &
1734 integral_caches(nbits), &
1735 integral_containers(nbits), &
1736 eps_storage, pmax_entry, &
1737 memory_parameter%actual_memory_usage, &
1741 buffer_size, nbits, &
1742 integral_caches_disk(nbits), &
1743 integral_containers_disk(nbits), &
1744 eps_storage, pmax_entry, &
1745 memory_parameter%actual_memory_usage_disk, &
1748 buffer_left = buffer_left - buffer_size
1749 buffer_start = buffer_start + buffer_size
1754 primitive_integrals(i) = primitive_integrals(i)*pmax_entry
1755 IF (abs(primitive_integrals(i)) > eps_storage)
THEN
1756 primitive_integrals(i) = anint(primitive_integrals(i)/eps_storage,
dp)*eps_storage/pmax_entry
1758 primitive_integrals(i) = 0.0_dp
1765 CALL print_integrals( &
1766 iatom, jatom, katom, latom, shm_set_offset, shm_atomic_block_offset, &
1767 iset, jset, kset, lset, nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), primitive_integrals)
1769 IF (.NOT. is_anti_symmetric)
THEN
1771 CALL update_fock_matrix( &
1772 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1773 fac, symm_fac, full_density_alpha(:, 1), full_ks_alpha(:, 1), &
1774 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1775 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1776 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1777 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1778 IF (.NOT. treat_lsd_in_core)
THEN
1779 IF (my_nspins == 2)
THEN
1780 CALL update_fock_matrix( &
1781 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1782 fac, symm_fac, full_density_beta(:, 1), full_ks_beta(:, 1), &
1783 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1784 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1785 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1786 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1791 CALL update_fock_matrix_as( &
1792 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1793 fac, symm_fac, full_density_alpha(:, 1), full_ks_alpha(:, 1), &
1794 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1795 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1796 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1797 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1798 IF (.NOT. treat_lsd_in_core)
THEN
1799 IF (my_nspins == 2)
THEN
1800 CALL update_fock_matrix_as( &
1801 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1802 fac, symm_fac, full_density_beta(:, 1), full_ks_beta(:, 1), &
1803 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1804 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1805 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1806 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1810 END IF if_use_libint
1813 IF (do_disk_storage)
THEN
1814 buffer_overflow = .true.
1818 END DO atomic_blocks
1820 IF (my_geo_change)
THEN
1821 distribution_energy%time_first_scf = bintime_stop - bintime_start
1823 distribution_energy%time_other_scf = &
1824 distribution_energy%time_other_scf + bintime_stop - bintime_start
1827 CALL timestop(handle_bin)
1833 if (use_libgint .and. use_libint)
then
1836 allocate (full_ks_alpha_from_gpu, mold=full_ks_alpha)
1838 if (use_only_alpha_spin)
then
1841 allocate (full_ks_beta_from_gpu, mold=full_ks_beta)
1848 max_abs_delta_ks = 0.0_dp
1849 do i = 1,
size(full_ks_alpha)
1850 max_abs_delta_ks = max(max_abs_delta_ks, abs(full_ks_alpha(i, 1) - full_ks_alpha_from_gpu(i, 1)))
1852 write (unit=iw, fmt=*)
" ------------------------------------ "
1853 write (unit=iw, fmt=*)
" | rank ", para_env%mepos
1854 write (unit=iw, fmt=*)
" | max abs dif: ", max_abs_delta_ks
1855 write (unit=iw, fmt=*)
" ------------------------------------ "
1858 if (max_abs_delta_ks > 100*eps_schwarz .or. max_abs_delta_ks < 1.e-20)
then
1859 write (unit=iw, fmt=*)
" K from CPU | K from GPU | Delta | Ratio "
1860 do i = 1,
size(full_ks_alpha)
1861 write (unit=iw, fmt=*) i, full_ks_alpha(i, 1), full_ks_alpha_from_gpu(i, 1), &
1862 full_ks_alpha(i, 1) - full_ks_alpha_from_gpu(i, 1), &
1863 full_ks_alpha(i, 1)/full_ks_alpha_from_gpu(i, 1)
1867 if (.not. use_only_alpha_spin)
then
1868 max_abs_delta_ks = 0.0_dp
1869 do i = 1,
size(full_ks_beta)
1870 max_abs_delta_ks = max(max_abs_delta_ks, abs(full_ks_beta(i, 1) - full_ks_beta_from_gpu(i, 1)))
1872 write (unit=iw, fmt=*)
" ------------------------------------ "
1873 write (unit=iw, fmt=*)
" | rank ", para_env%mepos
1874 write (unit=iw, fmt=*)
" | max abs dif B: ", max_abs_delta_ks
1875 write (unit=iw, fmt=*)
" ------------------------------------ "
1878 if (max_abs_delta_ks > 100*eps_schwarz .or. max_abs_delta_ks < 1.e-18)
then
1879 write (unit=iw, fmt=*)
" BETA K from CPU | K from GPU | Delta | Ratio "
1880 do i = 1,
size(full_ks_beta)
1881 write (unit=iw, fmt=*) i, full_ks_beta(i, 1), full_ks_beta_from_gpu(i, 1), &
1882 full_ks_beta(i, 1) - full_ks_beta_from_gpu(i, 1), &
1883 full_ks_beta(i, 1)/full_ks_beta_from_gpu(i, 1)
1891 if (use_libgint .and. .not. use_libint)
then
1892 if (use_only_alpha_spin)
then
1901 do_print_load_balance_info = .false.
1903 "LOAD_BALANCE%PRINT/LOAD_BALANCE_INFO"),
cp_p_file)
1906 IF (do_print_load_balance_info)
THEN
1910 extension=
".scfLog")
1918 "LOAD_BALANCE%PRINT/LOAD_BALANCE_INFO")
1928 DEALLOCATE (primitive_integrals)
1932 shm_neris_total = shm_neris_total + neris_total
1934 shm_neris_onthefly = shm_neris_onthefly + neris_onthefly
1936 shm_nprim_ints = shm_nprim_ints + nprim_ints
1938 storage_counter_integrals = memory_parameter%actual_memory_usage* &
1939 memory_parameter%cache_size
1940 stor_count_int_disk = memory_parameter%actual_memory_usage_disk* &
1941 memory_parameter%cache_size
1942 stor_count_max_val = max_val_memory*memory_parameter%cache_size
1944 shm_storage_counter_integrals = shm_storage_counter_integrals + storage_counter_integrals
1946 shm_stor_count_int_disk = shm_stor_count_int_disk + stor_count_int_disk
1948 shm_neris_incore = shm_neris_incore + neris_incore
1950 shm_neris_disk = shm_neris_disk + neris_disk
1952 shm_stor_count_max_val = shm_stor_count_max_val + stor_count_max_val
1957 shm_mem_compression_counter = 0
1960 tmp_i4 = x_data(irep, i)%memory_parameter%actual_memory_usage
1961 shm_mem_compression_counter = shm_mem_compression_counter + &
1962 tmp_i4*memory_parameter%cache_size
1966 actual_x_data%memory_parameter%final_comp_counter_energy = shm_mem_compression_counter
1973 mb_size_p = shm_block_offset(ncpu + 1)/1024/128
1974 mb_size_f = shm_block_offset(ncpu + 1)/1024/128
1975 IF (.NOT. treat_lsd_in_core)
THEN
1976 IF (my_nspins == 2)
THEN
1977 mb_size_f = mb_size_f*2
1978 mb_size_p = mb_size_p*2
1982 mb_size_buffers = int(nsgf_max,
int_8)**4*n_threads
1984 mb_size_buffers = mb_size_buffers + int(nsgf_max,
int_8)**2*n_threads
1985 subtr_size_mb = subtr_size_mb + 8_int_8*nsgf_max**2*n_threads
1987 mb_size_buffers = mb_size_buffers + max_pgf**2*max_set**2*nkind**2 &
1988 + max_set**2*nkind**2 &
1990 + max_pgf**2*max_set**2*nkind**2
1992 mb_size_buffers = mb_size_buffers + natom**2
1994 IF (do_p_screening)
THEN
1995 mb_size_buffers = mb_size_buffers + natom**2
1997 IF (screening_parameter%do_p_screening_forces)
THEN
1998 IF (memory_parameter%treat_forces_in_core)
THEN
1999 mb_size_buffers = mb_size_buffers + natom**2
2003 IF (do_p_screening .OR. screening_parameter%do_p_screening_forces)
THEN
2004 mb_size_buffers = mb_size_buffers + memory_parameter%size_p_screen
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 + memory_parameter%size_p_screen
2014 mb_size_buffers = mb_size_buffers/1024/128
2017 IF (is_anti_symmetric) afac = -1.0_dp
2018 CALL timestop(handle_main)
2019 ene_x_aa_diag = 0.0_dp
2020 ene_x_bb_diag = 0.0_dp
2022 ikind = kind_of(iatom)
2023 nseta = basis_parameter(ikind)%nset
2024 nsgfa => basis_parameter(ikind)%nsgf
2026 jkind = kind_of(jatom)
2027 nsetb = basis_parameter(jkind)%nset
2028 nsgfb => basis_parameter(jkind)%nsgf
2029 act_atomic_block_offset = shm_atomic_block_offset(jatom, iatom)
2030 DO img = 1, nkimages
2033 act_set_offset = shm_set_offset(jset, iset, jkind, ikind)
2034 i = act_set_offset + act_atomic_block_offset - 1
2035 DO ma = 1, nsgfa(iset)
2036 j = shm_set_offset(iset, jset, jkind, ikind) + act_atomic_block_offset - 1 + ma - 1
2037 DO mb = 1, nsgfb(jset)
2039 full_ks_alpha(i, img) = (full_ks_alpha(i, img) + full_ks_alpha(j, img)*afac)
2040 full_ks_alpha(j, img) = full_ks_alpha(i, img)*afac
2041 IF (.NOT. treat_lsd_in_core .AND. my_nspins == 2)
THEN
2042 full_ks_beta(i, img) = (full_ks_beta(i, img) + full_ks_beta(j, img)*afac)
2043 full_ks_beta(j, img) = full_ks_beta(i, img)*afac
2048 ene_x_aa_diag = ene_x_aa_diag + full_ks_alpha(i, img)*full_density_alpha(i, img)
2049 IF (.NOT. treat_lsd_in_core .AND. my_nspins == 2)
THEN
2050 ene_x_bb_diag = ene_x_bb_diag + full_ks_beta(i, img)*full_density_beta(i, img)
2062 CALL para_env%sync()
2064 IF (is_anti_symmetric) afac = 0._dp
2065 IF (distribute_fock_matrix)
THEN
2067 CALL timeset(routinen//
"_dist_KS", handle_dist_ks)
2068 DO img = 1, nkimages
2069 CALL distribute_ks_matrix(para_env, full_ks_alpha(:, img), ks_matrix(ispin, img)%matrix, shm_number_of_p_entries, &
2070 shm_block_offset, kind_of, basis_parameter, &
2071 off_diag_fac=0.5_dp, diag_fac=afac)
2074 NULLIFY (full_ks_alpha)
2075 DEALLOCATE (shm_master_x_data%full_ks_alpha)
2076 IF (.NOT. treat_lsd_in_core)
THEN
2077 IF (my_nspins == 2)
THEN
2078 DO img = 1, nkimages
2079 CALL distribute_ks_matrix(para_env, full_ks_beta(:, img), ks_matrix(2, 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)
2083 NULLIFY (full_ks_beta)
2084 DEALLOCATE (shm_master_x_data%full_ks_beta)
2087 CALL timestop(handle_dist_ks)
2090 IF (distribute_fock_matrix)
THEN
2093 DO img = 1, nkimages
2095 ene_x_aa = ene_x_aa + etmp
2098 IF (dft_control%do_admm)
THEN
2099 cpassert(nkimages == 1)
2100 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(ispin)%matrix, ks_matrix(ispin, 1)%matrix, &
2101 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
2105 IF (my_nspins == 2 .AND. .NOT. treat_lsd_in_core)
THEN
2106 DO img = 1, nkimages
2108 ene_x_bb = ene_x_bb + etmp
2111 IF (dft_control%do_admm)
THEN
2112 cpassert(nkimages == 1)
2113 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(2)%matrix, ks_matrix(2, 1)%matrix, &
2114 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
2119 ehfx = 0.5_dp*(ene_x_aa + ene_x_bb)
2123 DO img = 1, nkimages
2124 DO pa = 1,
SIZE(full_ks_alpha, 1)
2125 ene_x_aa = ene_x_aa + full_ks_alpha(pa, img)*full_density_alpha(pa, img)
2129 ene_x_aa = (ene_x_aa + ene_x_aa_diag)*0.5_dp
2130 IF (my_nspins == 2)
THEN
2131 DO img = 1, nkimages
2132 DO pa = 1,
SIZE(full_ks_beta, 1)
2133 ene_x_bb = ene_x_bb + full_ks_beta(pa, img)*full_density_beta(pa, img)
2137 ene_x_bb = (ene_x_bb + ene_x_bb_diag)*0.5_dp
2139 CALL para_env%sum(ene_x_aa)
2140 IF (my_nspins == 2)
CALL para_env%sum(ene_x_bb)
2141 ehfx = 0.5_dp*(ene_x_aa + ene_x_bb)
2145 IF (my_geo_change)
THEN
2146 tmp_i8(1:8) = [shm_storage_counter_integrals, shm_neris_onthefly, shm_neris_incore, shm_neris_disk, &
2147 shm_neris_total, shm_stor_count_int_disk, shm_nprim_ints, shm_stor_count_max_val]
2148 CALL para_env%sum(tmp_i8)
2149 shm_storage_counter_integrals = tmp_i8(1)
2150 shm_neris_onthefly = tmp_i8(2)
2151 shm_neris_incore = tmp_i8(3)
2152 shm_neris_disk = tmp_i8(4)
2153 shm_neris_total = tmp_i8(5)
2154 shm_stor_count_int_disk = tmp_i8(6)
2155 shm_nprim_ints = tmp_i8(7)
2156 shm_stor_count_max_val = tmp_i8(8)
2157 CALL para_env%max(memsize_after)
2158 mem_eris = (shm_storage_counter_integrals + 128*1024 - 1)/1024/128
2159 compression_factor = real(shm_neris_incore,
dp)/real(shm_storage_counter_integrals,
dp)
2160 mem_eris_disk = (shm_stor_count_int_disk + 128*1024 - 1)/1024/128
2161 compression_factor_disk = real(shm_neris_disk,
dp)/real(shm_stor_count_int_disk,
dp)
2162 mem_max_val = (shm_stor_count_max_val + 128*1024 - 1)/1024/128
2164 IF (shm_neris_incore == 0)
THEN
2166 compression_factor = 0.0_dp
2168 IF (shm_neris_disk == 0)
THEN
2170 compression_factor_disk = 0.0_dp
2174 extension=
".scfLog")
2176 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2177 "HFX_MEM_INFO| Number of cart. primitive ERI's calculated: ", shm_nprim_ints
2179 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2180 "HFX_MEM_INFO| Number of sph. ERI's calculated: ", shm_neris_total
2182 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2183 "HFX_MEM_INFO| Number of sph. ERI's stored in-core: ", shm_neris_incore
2185 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2186 "HFX_MEM_INFO| Number of sph. ERI's stored on disk: ", shm_neris_disk
2188 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2189 "HFX_MEM_INFO| Number of sph. ERI's calculated on the fly: ", shm_neris_onthefly
2191 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2192 "HFX_MEM_INFO| Total memory consumption ERI's RAM [MiB]: ", mem_eris
2194 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2195 "HFX_MEM_INFO| Whereof max-vals [MiB]: ", mem_max_val
2197 WRITE (unit=iw, fmt=
"((T3,A,T60,F21.2))") &
2198 "HFX_MEM_INFO| Total compression factor ERI's RAM: ", compression_factor
2200 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2201 "HFX_MEM_INFO| Total memory consumption ERI's disk [MiB]: ", mem_eris_disk
2203 WRITE (unit=iw, fmt=
"((T3,A,T60,F21.2))") &
2204 "HFX_MEM_INFO| Total compression factor ERI's disk: ", compression_factor_disk
2206 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2207 "HFX_MEM_INFO| Size of density/Fock matrix [MiB]: ", 2_int_8*mb_size_p
2209 IF (do_periodic)
THEN
2210 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2211 "HFX_MEM_INFO| Size of buffers [MiB]: ", mb_size_buffers
2212 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2213 "HFX_MEM_INFO| Number of periodic image cells considered: ",
SIZE(shm_master_x_data%neighbor_cells)
2215 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2216 "HFX_MEM_INFO| Size of buffers [MiB]: ", mb_size_buffers
2218 WRITE (unit=iw, fmt=
"((T3,A,T60,I21),/)") &
2219 "HFX_MEM_INFO| Est. max. program size after HFX [MiB]:", memsize_after/(1024*1024)
2229 IF (do_dynamic_load_balancing)
THEN
2230 my_bin_size =
SIZE(actual_x_data%distribution_energy)
2235 IF (my_geo_change)
THEN
2236 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
2237 DO bin = 1, my_bin_size
2238 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
2239 maxval_container => actual_x_data%store_ints%maxval_container(bin)
2240 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
2241 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
2242 CALL hfx_flush_last_cache(bits_max_val, maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
2246 memory_parameter%actual_memory_usage, .false.)
2252 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
2253 DO bin = 1, my_bin_size
2254 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
2255 maxval_container => actual_x_data%store_ints%maxval_container(bin)
2256 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
2257 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
2262 memory_parameter%actual_memory_usage, &
2270 IF (do_disk_storage)
THEN
2272 IF (my_geo_change)
THEN
2274 memory_parameter%actual_memory_usage_disk, .true.)
2277 memory_parameter%actual_memory_usage_disk, .true.)
2285 memory_parameter%actual_memory_usage_disk, do_disk_storage)
2291 DEALLOCATE (last_sgf_global)
2293 DEALLOCATE (full_density_alpha)
2294 IF (.NOT. treat_lsd_in_core)
THEN
2295 IF (my_nspins == 2)
THEN
2296 DEALLOCATE (full_density_beta)
2299 IF (do_dynamic_load_balancing)
THEN
2300 DEALLOCATE (shm_master_x_data%task_list)
2303 DEALLOCATE (pbd_buf, pbc_buf, pad_buf, pac_buf)
2304 DEALLOCATE (kbd_buf, kbc_buf, kad_buf, kac_buf)
2305 DEALLOCATE (set_list_ij, set_list_kl)
2307 DO i = 1, max_pgf**2
2308 DEALLOCATE (pgf_list_ij(i)%image_list)
2309 DEALLOCATE (pgf_list_kl(i)%image_list)
2312 DEALLOCATE (pgf_list_ij)
2313 DEALLOCATE (pgf_list_kl)
2314 DEALLOCATE (pgf_product_list)
2316 DEALLOCATE (max_contraction, kind_of)
2318 DEALLOCATE (ee_work, ee_work2, ee_buffer1, ee_buffer2, ee_primitives_tmp)
2320 DEALLOCATE (nimages)
2325 CALL timestop(handle)