135 geometry_did_change, irep, distribute_fock_matrix, &
139 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
140 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_matrix
141 REAL(kind=
dp),
INTENT(OUT) :: ehfx
145 LOGICAL :: geometry_did_change
147 LOGICAL,
INTENT(IN) :: distribute_fock_matrix
148 INTEGER,
INTENT(IN) :: ispin
149 INTEGER,
INTENT(IN),
OPTIONAL :: nspins
151 CHARACTER(LEN=*),
PARAMETER :: routinen =
'integrate_four_center'
153 CHARACTER(len=default_string_length) :: eps_scaling_str, eps_schwarz_min_str
154 INTEGER :: act_atomic_block_offset, act_set_offset, atomic_offset_ac, atomic_offset_ad, &
155 atomic_offset_bc, atomic_offset_bd, bin, bits_max_val, buffer_left, buffer_size, &
156 buffer_start, cache_size, current_counter, handle, handle_bin, handle_dist_ks, &
157 handle_getp, handle_load, handle_main, i, i_list_ij, i_list_kl, i_set_list_ij, &
158 i_set_list_ij_start, i_set_list_ij_stop, i_set_list_kl, i_set_list_kl_start, &
159 i_set_list_kl_stop, i_thread, iatom, iatom_block, iatom_end, iatom_start, ikind, img, &
160 iset, iw, j, jatom, jatom_block, jatom_end, jatom_start, jkind, jset, katom, katom_block, &
162 INTEGER :: katom_start, kind_kind_idx, kkind, kset, l_max, latom, latom_block, latom_end, &
163 latom_start, lkind, lset, ma, max_am, max_pgf, max_set, mb, my_bin_id, my_bin_size, &
164 my_thread_id, n_threads, natom, nbits, ncob, ncos_max, nints, nkimages, nkind, &
165 nneighbors, nseta, nsetb, nsgf_max, my_nspins, pa, sgfb, shm_task_counter, shm_total_bins, &
166 sphi_a_u1, sphi_a_u2, sphi_a_u3, sphi_b_u1, sphi_b_u2, sphi_b_u3, sphi_c_u1, sphi_c_u2, &
167 sphi_c_u3, sphi_d_u1, sphi_d_u2, sphi_d_u3, swap_id, tmp_i4, unit_id
168 INTEGER(int_8) :: atom_block, counter, estimate_to_store_int, max_val_memory, &
169 mb_size_buffers, mb_size_f, mb_size_p, mem_compression_counter, &
170 mem_compression_counter_disk, mem_eris, mem_eris_disk, mem_max_val, memsize_after, &
171 memsize_before, my_current_counter, my_istart, n_processes, nblocks, ncpu, neris_disk, &
172 neris_incore, neris_onthefly, neris_tmp, neris_total, nprim_ints, &
173 shm_mem_compression_counter, shm_neris_disk, shm_neris_incore, shm_neris_onthefly, &
174 shm_neris_total, shm_nprim_ints, shm_stor_count_int_disk, shm_stor_count_max_val, &
175 shm_storage_counter_integrals, stor_count_int_disk
176 INTEGER(int_8) :: stor_count_max_val, storage_counter_integrals, subtr_size_mb, tmp_block, &
178 INTEGER(int_8),
ALLOCATABLE,
DIMENSION(:) :: tmp_task_list_cost
179 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, last_sgf_global, nimages, &
181 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, lb_max, lb_min, lc_max, lc_min, ld_max, &
182 ld_min, npgfa, npgfb, npgfc, npgfd, nsgfa, nsgfb, nsgfc, nsgfd, shm_block_offset
183 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfb, nsgfl_a, nsgfl_b, nsgfl_c, nsgfl_d, &
184 offset_ac_set, offset_ad_set, offset_bc_set, offset_bd_set, shm_atomic_block_offset
185 INTEGER,
DIMENSION(:, :),
POINTER,
SAVE :: shm_is_assoc_atomic_block
186 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
187 INTEGER,
DIMENSION(:, :, :, :),
POINTER :: shm_set_offset
188 INTEGER,
SAVE :: shm_number_of_p_entries
189 LOGICAL :: bins_left, buffer_overflow, do_disk_storage, do_dynamic_load_balancing, do_it, &
190 do_kpoints, do_p_screening, do_periodic, do_print_load_balance_info, is_anti_symmetric, &
191 ks_fully_occ, my_geo_change, treat_lsd_in_core, use_disk_storage
192 LOGICAL,
DIMENSION(:, :),
POINTER :: shm_atomic_pair_list
193 REAL(
dp) :: afac, bintime_start, bintime_stop, cartesian_estimate, compression_factor, &
194 compression_factor_disk, ene_x_aa, ene_x_aa_diag, ene_x_bb, ene_x_bb_diag, eps_schwarz, &
195 eps_storage, etmp,
fac, hf_fraction, ln_10, log10_eps_schwarz, log10_pmax, &
196 max_contraction_val, max_val1, max_val2, max_val2_set, pmax_atom, pmax_blocks, &
197 pmax_entry, ra(3), rab2, rb(3), rc(3), rcd2, rd(3), screen_kind_ij, screen_kind_kl, &
198 spherical_estimate, symm_fac
199 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: ee_buffer1, ee_buffer2, ee_primitives_tmp, ee_work, &
200 ee_work2, kac_buf, kad_buf, kbc_buf, kbd_buf, pac_buf, pad_buf, pbc_buf, pbd_buf, &
202 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
203 REAL(
dp),
DIMENSION(:, :),
POINTER :: full_density_alpha, full_density_beta, full_ks_alpha, &
204 full_ks_beta, max_contraction, ptr_p_1, ptr_p_2, ptr_p_3, ptr_p_4, shm_pmax_atom, &
205 shm_pmax_block, sphi_b, zeta, zetb, zetc, zetd
206 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: sphi_a_ext_set, sphi_b_ext_set, &
207 sphi_c_ext_set, sphi_d_ext_set
208 REAL(
dp),
DIMENSION(:, :, :, :),
POINTER :: sphi_a_ext, sphi_b_ext, sphi_c_ext, &
210 REAL(kind=
dp) :: coeffs_kind_max0
215 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_aux_fit_hfx
219 TYPE(
hfx_cache_type),
DIMENSION(:),
POINTER :: integral_caches, integral_caches_disk
222 integral_containers_disk
228 TYPE(
hfx_p_kind),
DIMENSION(:),
POINTER :: shm_initial_p
229 TYPE(
hfx_pgf_list),
ALLOCATABLE,
DIMENSION(:) :: pgf_list_ij, pgf_list_kl
231 DIMENSION(:) :: pgf_product_list
234 POINTER :: screen_coeffs_kind, tmp_r_1, tmp_r_2, &
235 tmp_screen_pgf1, tmp_screen_pgf2
237 DIMENSION(:, :, :, :),
POINTER :: screen_coeffs_set
239 DIMENSION(:, :, :, :, :, :),
POINTER :: radii_pgf, screen_coeffs_pgf
242 TYPE(
hfx_type),
POINTER :: actual_x_data, shm_master_x_data
246 DIMENSION(:) :: set_list_ij, set_list_kl
250 NULLIFY (dft_control, matrix_ks_aux_fit_hfx)
252 CALL timeset(routinen, handle)
260 my_geo_change = geometry_did_change
261 IF (ispin == 2) my_geo_change = .false.
267 IF (my_geo_change)
THEN
269 CALL para_env%max(memsize_before)
273 WRITE (unit=iw, fmt=
"(/,(T3,A,T60,I21))") &
274 "HFX_MEM_INFO| Est. max. program size before HFX [MiB]:", memsize_before/(1024*1024)
281 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, cell=cell)
283 NULLIFY (cell_to_index)
284 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
287 CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
292 nkind =
SIZE(atomic_kind_set, 1)
295 l_max = max(l_max, maxval(x_data(1, 1)%basis_parameter(ikind)%lmax))
303 IF (para_env%is_source())
THEN
304 CALL open_file(unit_number=unit_id, file_name=x_data(1, 1)%potential_parameter%filename)
306 CALL init(l_max, unit_id, para_env%mepos, para_env)
307 IF (para_env%is_source())
THEN
319 IF (
PRESENT(nspins)) my_nspins = nspins
323 shm_neris_onthefly = 0
324 shm_storage_counter_integrals = 0
325 shm_stor_count_int_disk = 0
328 shm_stor_count_max_val = 0
419 actual_x_data => x_data(irep, i_thread + 1)
421 shm_master_x_data => x_data(irep, 1)
425 do_periodic = actual_x_data%periodic_parameter%do_periodic
427 IF (do_periodic)
THEN
429 actual_x_data%periodic_parameter%number_of_shells = actual_x_data%periodic_parameter%mode
434 screening_parameter = actual_x_data%screening_parameter
435 potential_parameter = actual_x_data%potential_parameter
437 general_parameter = actual_x_data%general_parameter
438 load_balance_parameter => actual_x_data%load_balance_parameter
439 memory_parameter => actual_x_data%memory_parameter
441 cache_size = memory_parameter%cache_size
442 bits_max_val = memory_parameter%bits_max_val
444 basis_parameter => actual_x_data%basis_parameter
445 basis_info => actual_x_data%basis_info
447 treat_lsd_in_core = general_parameter%treat_lsd_in_core
449 ncpu = para_env%num_pe
450 n_processes = ncpu*n_threads
453 neris_total = 0_int_8
454 neris_incore = 0_int_8
456 neris_onthefly = 0_int_8
458 mem_eris_disk = 0_int_8
459 mem_max_val = 0_int_8
460 compression_factor = 0.0_dp
461 compression_factor_disk = 0.0_dp
464 max_val_memory = 1_int_8
466 max_am = basis_info%max_am
469 atomic_kind_set=atomic_kind_set, &
470 particle_set=particle_set, &
471 dft_control=dft_control)
472 IF (dft_control%do_admm)
CALL get_admm_env(qs_env%admm_env, matrix_ks_aux_fit_hfx=matrix_ks_aux_fit_hfx)
474 do_p_screening = screening_parameter%do_initial_p_screening
476 IF (do_p_screening)
THEN
477 IF (
ASSOCIATED(qs_env%mp2_env))
THEN
478 IF ((qs_env%mp2_env%ri_grad%free_hfx_buffer))
THEN
479 do_p_screening = ((qs_env%mp2_env%p_screen) .AND. (qs_env%mp2_env%not_last_hfx))
481 do_p_screening = .false.
485 max_set = basis_info%max_set
486 natom =
SIZE(particle_set, 1)
489 nkimages = dft_control%nimages
490 cpassert(nkimages == 1)
498 ikind = kind_of(iatom)
499 nseta = basis_parameter(ikind)%nset
500 npgfa => basis_parameter(ikind)%npgf
501 la_max => basis_parameter(ikind)%lmax
502 nsgfa => basis_parameter(ikind)%nsgf
504 ncos_max = max(ncos_max,
ncoset(la_max(iset)))
505 nsgf_max = max(nsgf_max, nsgfa(iset))
509 ALLOCATE (primitive_integrals(nsgf_max**4))
510 primitive_integrals = 0.0_dp
512 ALLOCATE (pbd_buf(nsgf_max**2))
513 ALLOCATE (pbc_buf(nsgf_max**2))
514 ALLOCATE (pad_buf(nsgf_max**2))
515 ALLOCATE (pac_buf(nsgf_max**2))
516 ALLOCATE (kbd_buf(nsgf_max**2))
517 ALLOCATE (kbc_buf(nsgf_max**2))
518 ALLOCATE (kad_buf(nsgf_max**2))
519 ALLOCATE (kac_buf(nsgf_max**2))
520 ALLOCATE (ee_work(ncos_max**4))
521 ALLOCATE (ee_work2(ncos_max**4))
522 ALLOCATE (ee_buffer1(ncos_max**4))
523 ALLOCATE (ee_buffer2(ncos_max**4))
524 ALLOCATE (ee_primitives_tmp(nsgf_max**4))
526 IF (my_nspins .EQ. 0) my_nspins = dft_control%nspins
528 ALLOCATE (max_contraction(max_set, natom))
530 max_contraction = 0.0_dp
533 jkind = kind_of(jatom)
534 lb_max => basis_parameter(jkind)%lmax
535 nsetb = basis_parameter(jkind)%nset
536 npgfb => basis_parameter(jkind)%npgf
537 first_sgfb => basis_parameter(jkind)%first_sgf
538 sphi_b => basis_parameter(jkind)%sphi
539 nsgfb => basis_parameter(jkind)%nsgf
542 ncob = npgfb(jset)*
ncoset(lb_max(jset))
543 sgfb = first_sgfb(1, jset)
546 max_contraction(jset, jatom) = maxval((/(sum(abs(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)/))
547 max_pgf = max(max_pgf, npgfb(jset))
552 nneighbors =
SIZE(actual_x_data%neighbor_cells)
553 ALLOCATE (pgf_list_ij(max_pgf**2))
554 ALLOCATE (pgf_list_kl(max_pgf**2))
558 ALLOCATE (pgf_product_list(tmp_i4))
559 ALLOCATE (nimages(max_pgf**2))
562 ALLOCATE (pgf_list_ij(i)%image_list(nneighbors))
563 ALLOCATE (pgf_list_kl(i)%image_list(nneighbors))
568 IF (my_geo_change)
THEN
570 shm_master_x_data%is_assoc_atomic_block, &
571 shm_master_x_data%number_of_p_entries, &
573 shm_master_x_data%atomic_block_offset, &
574 shm_master_x_data%set_offset, &
575 shm_master_x_data%block_offset, &
576 shm_master_x_data%map_atoms_to_cpus, &
579 shm_is_assoc_atomic_block => shm_master_x_data%is_assoc_atomic_block
582 ks_fully_occ = .true.
583 outer:
DO iatom = 1, natom
584 DO jatom = iatom, natom
585 IF (shm_is_assoc_atomic_block(jatom, iatom) == 0)
THEN
586 ks_fully_occ = .false.
592 IF (.NOT. ks_fully_occ)
THEN
593 CALL cp_warn(__location__, &
594 "The Kohn Sham matrix is not 100% occupied. This "// &
595 "may result in incorrect Hartree-Fock results. Setting "// &
596 "MIN_PAIR_LIST_RADIUS to -1 in the QS section ensures a "// &
597 "fully occupied KS matrix. For more information "// &
598 "see FAQ: https://www.cp2k.org/faq:hfx_eps_warning")
603 shm_number_of_p_entries = shm_master_x_data%number_of_p_entries
604 shm_is_assoc_atomic_block => shm_master_x_data%is_assoc_atomic_block
605 shm_atomic_block_offset => shm_master_x_data%atomic_block_offset
606 shm_set_offset => shm_master_x_data%set_offset
607 shm_block_offset => shm_master_x_data%block_offset
613 subtr_size_mb = 2_int_8*shm_block_offset(ncpu + 1)
615 IF (.NOT. treat_lsd_in_core)
THEN
616 IF (my_nspins == 2) subtr_size_mb = subtr_size_mb*2_int_8
619 IF (do_p_screening .OR. screening_parameter%do_p_screening_forces)
THEN
620 subtr_size_mb = subtr_size_mb + memory_parameter%size_p_screen
623 IF (screening_parameter%do_p_screening_forces)
THEN
624 IF (memory_parameter%treat_forces_in_core)
THEN
625 subtr_size_mb = subtr_size_mb + memory_parameter%size_p_screen
629 subtr_size_mb = subtr_size_mb + nsgf_max**4*n_threads
631 subtr_size_mb = subtr_size_mb + 8_int_8*nsgf_max**2*n_threads
634 subtr_size_mb = subtr_size_mb + max_pgf**2*max_set**2*nkind**2
636 subtr_size_mb = subtr_size_mb + max_set**2*nkind**2
638 subtr_size_mb = subtr_size_mb + nkind**2
640 subtr_size_mb = subtr_size_mb + max_pgf**2*max_set**2*nkind**2
643 subtr_size_mb = subtr_size_mb + natom**2
646 IF (do_p_screening)
THEN
647 subtr_size_mb = subtr_size_mb + natom**2
649 IF (screening_parameter%do_p_screening_forces)
THEN
650 IF (memory_parameter%treat_forces_in_core)
THEN
651 subtr_size_mb = subtr_size_mb + natom**2
656 subtr_size_mb = subtr_size_mb*8_int_8/1024_int_8/1024_int_8
665 use_disk_storage = .false.
667 do_disk_storage = memory_parameter%do_disk_storage
668 IF (do_disk_storage)
THEN
669 maxval_container_disk => actual_x_data%store_ints%maxval_container_disk
670 maxval_cache_disk => actual_x_data%store_ints%maxval_cache_disk
672 integral_containers_disk => actual_x_data%store_ints%integral_containers_disk
673 integral_caches_disk => actual_x_data%store_ints%integral_caches_disk
676 IF (my_geo_change)
THEN
677 memory_parameter%ram_counter = huge(memory_parameter%ram_counter)
680 IF (my_geo_change)
THEN
681 memory_parameter%recalc_forces = .true.
683 IF (.NOT. memory_parameter%treat_forces_in_core) memory_parameter%recalc_forces = .true.
687 eps_schwarz = screening_parameter%eps_schwarz
688 IF (eps_schwarz <= 0.0_dp)
THEN
691 log10_eps_schwarz = log10(eps_schwarz)
694 eps_storage = eps_schwarz*memory_parameter%eps_storage_scaling
697 hf_fraction = general_parameter%fraction
702 potential_parameter = actual_x_data%potential_parameter
706 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
707 buffer_overflow = .false.
709 buffer_overflow = .true.
713 private_lib = actual_x_data%lib
716 ALLOCATE (last_sgf_global(0:natom))
717 last_sgf_global(0) = 0
719 ikind = kind_of(iatom)
720 last_sgf_global(iatom) = last_sgf_global(iatom - 1) + basis_parameter(ikind)%nsgf_total
726 NULLIFY (full_density_alpha, full_density_beta)
727 ALLOCATE (full_density_alpha(shm_block_offset(ncpu + 1), nkimages))
728 IF (.NOT. treat_lsd_in_core .OR. my_nspins == 1)
THEN
729 CALL timeset(routinen//
"_getP", handle_getp)
731 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(ispin, img)%matrix, shm_number_of_p_entries, &
732 shm_master_x_data%block_offset, &
733 kind_of, basis_parameter, get_max_vals_spin=.false., antisymmetric=is_anti_symmetric)
736 IF (my_nspins == 2)
THEN
737 ALLOCATE (full_density_beta(shm_block_offset(ncpu + 1), nkimages))
739 CALL get_full_density(para_env, full_density_beta(:, img), rho_ao(2, img)%matrix, shm_number_of_p_entries, &
740 shm_master_x_data%block_offset, &
741 kind_of, basis_parameter, get_max_vals_spin=.false., antisymmetric=is_anti_symmetric)
744 CALL timestop(handle_getp)
749 NULLIFY (shm_initial_p)
750 IF (do_p_screening)
THEN
751 shm_initial_p => shm_master_x_data%initial_p
752 shm_pmax_atom => shm_master_x_data%pmax_atom
753 IF (my_geo_change)
THEN
755 shm_master_x_data%map_atom_to_kind_atom, &
756 shm_master_x_data%set_offset, &
757 shm_master_x_data%atomic_block_offset, &
759 full_density_alpha, full_density_beta, &
760 natom, kind_of, basis_parameter, &
761 nkind, shm_master_x_data%is_assoc_atomic_block)
765 IF (do_p_screening)
THEN
766 CALL timeset(routinen//
"_getP", handle_getp)
768 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(1, img)%matrix, shm_number_of_p_entries, &
769 shm_master_x_data%block_offset, &
770 kind_of, basis_parameter, get_max_vals_spin=.true., &
771 rho_beta=rho_ao(2, img)%matrix, antisymmetric=is_anti_symmetric)
773 CALL timestop(handle_getp)
778 NULLIFY (shm_initial_p)
779 shm_initial_p => actual_x_data%initial_p
780 shm_pmax_atom => shm_master_x_data%pmax_atom
781 IF (my_geo_change)
THEN
783 shm_master_x_data%map_atom_to_kind_atom, &
784 shm_master_x_data%set_offset, &
785 shm_master_x_data%atomic_block_offset, &
787 full_density_alpha, full_density_beta, &
788 natom, kind_of, basis_parameter, &
789 nkind, shm_master_x_data%is_assoc_atomic_block)
794 CALL get_full_density(para_env, full_density_alpha(:, img), rho_ao(ispin, img)%matrix, shm_number_of_p_entries, &
795 shm_master_x_data%block_offset, &
796 kind_of, basis_parameter, get_max_vals_spin=.false., &
797 antisymmetric=is_anti_symmetric)
801 NULLIFY (full_ks_alpha, full_ks_beta)
802 ALLOCATE (shm_master_x_data%full_ks_alpha(shm_block_offset(ncpu + 1), nkimages))
803 full_ks_alpha => shm_master_x_data%full_ks_alpha
804 full_ks_alpha = 0.0_dp
806 IF (.NOT. treat_lsd_in_core)
THEN
807 IF (my_nspins == 2)
THEN
808 ALLOCATE (shm_master_x_data%full_ks_beta(shm_block_offset(ncpu + 1), nkimages))
809 full_ks_beta => shm_master_x_data%full_ks_beta
810 full_ks_beta = 0.0_dp
822 IF (.NOT. shm_master_x_data%screen_funct_is_initialized)
THEN
824 shm_master_x_data%pair_dist_radii_pgf, max_set, max_pgf, eps_schwarz, &
828 shm_master_x_data%screen_funct_coeffs_set, &
829 shm_master_x_data%screen_funct_coeffs_kind, &
830 shm_master_x_data%screen_funct_coeffs_pgf, &
831 shm_master_x_data%pair_dist_radii_pgf, &
832 max_set, max_pgf, n_threads, i_thread, p_work)
835 shm_master_x_data%screen_funct_is_initialized = .true.
841 screen_coeffs_set => shm_master_x_data%screen_funct_coeffs_set
842 screen_coeffs_kind => shm_master_x_data%screen_funct_coeffs_kind
843 screen_coeffs_pgf => shm_master_x_data%screen_funct_coeffs_pgf
844 radii_pgf => shm_master_x_data%pair_dist_radii_pgf
849 IF (my_nspins == 1)
THEN
850 fac = 0.5_dp*hf_fraction
852 fac = 1.0_dp*hf_fraction
859 CALL timeset(routinen//
"_load", handle_load)
862 IF (my_geo_change)
THEN
863 IF (actual_x_data%b_first_load_balance_energy)
THEN
864 CALL hfx_load_balance(actual_x_data, eps_schwarz, particle_set, max_set, para_env, &
865 screen_coeffs_set, screen_coeffs_kind, &
866 shm_is_assoc_atomic_block, do_periodic, load_balance_parameter, &
867 kind_of, basis_parameter, shm_initial_p, shm_pmax_atom, i_thread, n_threads, &
868 cell, do_p_screening, actual_x_data%map_atom_to_kind_atom, &
870 actual_x_data%b_first_load_balance_energy = .false.
873 load_balance_parameter, &
879 CALL timestop(handle_load)
921 do_dynamic_load_balancing = .true.
923 IF (n_threads == 1 .OR. do_disk_storage) do_dynamic_load_balancing = .false.
925 IF (do_dynamic_load_balancing)
THEN
926 my_bin_size =
SIZE(actual_x_data%distribution_energy)
931 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
933 IF (my_geo_change)
THEN
934 CALL dealloc_containers(actual_x_data%store_ints, memory_parameter%actual_memory_usage)
937 DO bin = 1, my_bin_size
938 maxval_container => actual_x_data%store_ints%maxval_container(bin)
939 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
940 CALL hfx_init_container(maxval_container, memory_parameter%actual_memory_usage, .false.)
942 CALL hfx_init_container(integral_containers(i), memory_parameter%actual_memory_usage, .false.)
948 IF (.NOT. my_geo_change)
THEN
949 DO bin = 1, my_bin_size
950 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
951 maxval_container => actual_x_data%store_ints%maxval_container(bin)
952 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
953 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
955 memory_parameter%actual_memory_usage, .false.)
958 memory_parameter%actual_memory_usage, .false.)
967 IF (do_disk_storage)
THEN
969 IF (my_geo_change)
THEN
970 CALL hfx_init_container(maxval_container_disk, memory_parameter%actual_memory_usage_disk, do_disk_storage)
972 CALL hfx_init_container(integral_containers_disk(i), memory_parameter%actual_memory_usage_disk, do_disk_storage)
976 IF (.NOT. my_geo_change)
THEN
978 memory_parameter%actual_memory_usage_disk, .true.)
981 memory_parameter%actual_memory_usage_disk, .true.)
990 IF (do_dynamic_load_balancing)
THEN
994 shm_total_bins = shm_total_bins +
SIZE(x_data(irep, i)%distribution_energy)
996 ALLOCATE (tmp_task_list(shm_total_bins))
999 DO bin = 1,
SIZE(x_data(irep, i)%distribution_energy)
1000 shm_task_counter = shm_task_counter + 1
1001 tmp_task_list(shm_task_counter)%thread_id = i
1002 tmp_task_list(shm_task_counter)%bin_id = bin
1003 tmp_task_list(shm_task_counter)%cost = x_data(irep, i)%distribution_energy(bin)%cost
1008 ALLOCATE (tmp_task_list_cost(shm_total_bins))
1009 ALLOCATE (tmp_index(shm_total_bins))
1011 DO i = 1, shm_total_bins
1012 tmp_task_list_cost(i) = tmp_task_list(i)%cost
1015 CALL sort(tmp_task_list_cost, shm_total_bins, tmp_index)
1017 ALLOCATE (shm_master_x_data%task_list(shm_total_bins))
1019 DO i = 1, shm_total_bins
1020 shm_master_x_data%task_list(i) = tmp_task_list(tmp_index(shm_total_bins - i + 1))
1023 shm_task_list => shm_master_x_data%task_list
1024 shm_task_counter = 0
1026 DEALLOCATE (tmp_task_list_cost, tmp_index, tmp_task_list)
1031 IF (my_bin_size > 0)
THEN
1032 maxval_container => actual_x_data%store_ints%maxval_container(1)
1033 maxval_cache => actual_x_data%store_ints%maxval_cache(1)
1035 integral_containers => actual_x_data%store_ints%integral_containers(:, 1)
1036 integral_caches => actual_x_data%store_ints%integral_caches(:, 1)
1041 CALL timeset(routinen//
"_main", handle_main)
1045 coeffs_kind_max0 = maxval(screen_coeffs_kind(:, :)%x(2))
1046 ALLOCATE (set_list_ij((max_set*load_balance_parameter%block_size)**2))
1047 ALLOCATE (set_list_kl((max_set*load_balance_parameter%block_size)**2))
1053 actual_x_data%pmax_block = 0.0_dp
1054 shm_pmax_block => actual_x_data%pmax_block
1055 IF (do_p_screening)
THEN
1056 DO iatom_block = 1,
SIZE(actual_x_data%blocks)
1057 iatom_start = actual_x_data%blocks(iatom_block)%istart
1058 iatom_end = actual_x_data%blocks(iatom_block)%iend
1059 DO jatom_block = 1,
SIZE(actual_x_data%blocks)
1060 jatom_start = actual_x_data%blocks(jatom_block)%istart
1061 jatom_end = actual_x_data%blocks(jatom_block)%iend
1062 shm_pmax_block(iatom_block, jatom_block) = maxval(shm_pmax_atom(iatom_start:iatom_end, jatom_start:jatom_end))
1066 shm_atomic_pair_list => actual_x_data%atomic_pair_list
1067 IF (my_geo_change)
THEN
1069 do_periodic, screen_coeffs_kind, coeffs_kind_max0, log10_eps_schwarz, cell, &
1070 actual_x_data%blocks)
1073 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1075 IF (my_geo_change)
THEN
1076 DO bin = 1, my_bin_size
1077 actual_x_data%distribution_energy(bin)%time_first_scf = 0.0_dp
1078 actual_x_data%distribution_energy(bin)%time_other_scf = 0.0_dp
1079 actual_x_data%distribution_energy(bin)%time_forces = 0.0_dp
1085 my_bin_size =
SIZE(actual_x_data%distribution_energy)
1086 nblocks = load_balance_parameter%nblocks
1091 DO WHILE (bins_left)
1092 IF (.NOT. do_dynamic_load_balancing)
THEN
1094 IF (bin > my_bin_size)
THEN
1100 distribution_energy => actual_x_data%distribution_energy(bin)
1104 shm_task_counter = shm_task_counter + 1
1105 IF (shm_task_counter <= shm_total_bins)
THEN
1106 my_thread_id = shm_task_list(shm_task_counter)%thread_id
1107 my_bin_id = shm_task_list(shm_task_counter)%bin_id
1108 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1109 maxval_cache => x_data(irep, my_thread_id)%store_ints%maxval_cache(my_bin_id)
1110 maxval_container => x_data(irep, my_thread_id)%store_ints%maxval_container(my_bin_id)
1111 integral_caches => x_data(irep, my_thread_id)%store_ints%integral_caches(:, my_bin_id)
1112 integral_containers => x_data(irep, my_thread_id)%store_ints%integral_containers(:, my_bin_id)
1114 distribution_energy => x_data(irep, my_thread_id)%distribution_energy(my_bin_id)
1117 IF (my_geo_change)
THEN
1118 distribution_energy%ram_counter = huge(distribution_energy%ram_counter)
1128 IF (.NOT. do_it) cycle
1130 CALL timeset(routinen//
"_bin", handle_bin)
1133 my_istart = distribution_energy%istart
1134 my_current_counter = 0
1135 IF (distribution_energy%number_of_atom_quartets == 0 .OR. &
1136 my_istart == -1_int_8) my_istart = nblocks**4
1137 atomic_blocks:
DO atom_block = my_istart, nblocks**4 - 1, n_processes
1138 latom_block = int(
modulo(atom_block, nblocks)) + 1
1139 tmp_block = atom_block/nblocks
1140 katom_block = int(
modulo(tmp_block, nblocks)) + 1
1141 IF (latom_block < katom_block) cycle
1142 tmp_block = tmp_block/nblocks
1143 jatom_block = int(
modulo(tmp_block, nblocks)) + 1
1144 tmp_block = tmp_block/nblocks
1145 iatom_block = int(
modulo(tmp_block, nblocks)) + 1
1146 IF (jatom_block < iatom_block) cycle
1147 my_current_counter = my_current_counter + 1
1148 IF (my_current_counter > distribution_energy%number_of_atom_quartets)
EXIT atomic_blocks
1150 iatom_start = actual_x_data%blocks(iatom_block)%istart
1151 iatom_end = actual_x_data%blocks(iatom_block)%iend
1152 jatom_start = actual_x_data%blocks(jatom_block)%istart
1153 jatom_end = actual_x_data%blocks(jatom_block)%iend
1154 katom_start = actual_x_data%blocks(katom_block)%istart
1155 katom_end = actual_x_data%blocks(katom_block)%iend
1156 latom_start = actual_x_data%blocks(latom_block)%istart
1157 latom_end = actual_x_data%blocks(latom_block)%iend
1159 pmax_blocks = max(shm_pmax_block(katom_block, iatom_block), &
1160 shm_pmax_block(latom_block, jatom_block), &
1161 shm_pmax_block(latom_block, iatom_block), &
1162 shm_pmax_block(katom_block, jatom_block))
1164 IF (2.0_dp*coeffs_kind_max0 + pmax_blocks < log10_eps_schwarz) cycle
1166 CALL build_pair_list(natom, list_ij, set_list_ij, iatom_start, iatom_end, &
1167 jatom_start, jatom_end, &
1168 kind_of, basis_parameter, particle_set, &
1169 do_periodic, screen_coeffs_set, screen_coeffs_kind, &
1170 coeffs_kind_max0, log10_eps_schwarz, cell, pmax_blocks, &
1171 shm_atomic_pair_list)
1173 CALL build_pair_list(natom, list_kl, set_list_kl, katom_start, katom_end, &
1174 latom_start, latom_end, &
1175 kind_of, basis_parameter, particle_set, &
1176 do_periodic, screen_coeffs_set, screen_coeffs_kind, &
1177 coeffs_kind_max0, log10_eps_schwarz, cell, pmax_blocks, &
1178 shm_atomic_pair_list)
1180 DO i_list_ij = 1, list_ij%n_element
1182 iatom = list_ij%elements(i_list_ij)%pair(1)
1183 jatom = list_ij%elements(i_list_ij)%pair(2)
1184 i_set_list_ij_start = list_ij%elements(i_list_ij)%set_bounds(1)
1185 i_set_list_ij_stop = list_ij%elements(i_list_ij)%set_bounds(2)
1186 ikind = list_ij%elements(i_list_ij)%kind_pair(1)
1187 jkind = list_ij%elements(i_list_ij)%kind_pair(2)
1188 ra = list_ij%elements(i_list_ij)%r1
1189 rb = list_ij%elements(i_list_ij)%r2
1190 rab2 = list_ij%elements(i_list_ij)%dist2
1192 la_max => basis_parameter(ikind)%lmax
1193 la_min => basis_parameter(ikind)%lmin
1194 npgfa => basis_parameter(ikind)%npgf
1195 nseta = basis_parameter(ikind)%nset
1196 zeta => basis_parameter(ikind)%zet
1197 nsgfa => basis_parameter(ikind)%nsgf
1198 sphi_a_ext => basis_parameter(ikind)%sphi_ext(:, :, :, :)
1199 nsgfl_a => basis_parameter(ikind)%nsgfl
1200 sphi_a_u1 = ubound(sphi_a_ext, 1)
1201 sphi_a_u2 = ubound(sphi_a_ext, 2)
1202 sphi_a_u3 = ubound(sphi_a_ext, 3)
1204 lb_max => basis_parameter(jkind)%lmax
1205 lb_min => basis_parameter(jkind)%lmin
1206 npgfb => basis_parameter(jkind)%npgf
1207 nsetb = basis_parameter(jkind)%nset
1208 zetb => basis_parameter(jkind)%zet
1209 nsgfb => basis_parameter(jkind)%nsgf
1210 sphi_b_ext => basis_parameter(jkind)%sphi_ext(:, :, :, :)
1211 nsgfl_b => basis_parameter(jkind)%nsgfl
1212 sphi_b_u1 = ubound(sphi_b_ext, 1)
1213 sphi_b_u2 = ubound(sphi_b_ext, 2)
1214 sphi_b_u3 = ubound(sphi_b_ext, 3)
1216 DO i_list_kl = 1, list_kl%n_element
1217 katom = list_kl%elements(i_list_kl)%pair(1)
1218 latom = list_kl%elements(i_list_kl)%pair(2)
1220 IF (.NOT. (katom + latom <= iatom + jatom)) cycle
1221 IF (((iatom + jatom) .EQ. (katom + latom)) .AND. (katom < iatom)) cycle
1222 i_set_list_kl_start = list_kl%elements(i_list_kl)%set_bounds(1)
1223 i_set_list_kl_stop = list_kl%elements(i_list_kl)%set_bounds(2)
1224 kkind = list_kl%elements(i_list_kl)%kind_pair(1)
1225 lkind = list_kl%elements(i_list_kl)%kind_pair(2)
1226 rc = list_kl%elements(i_list_kl)%r1
1227 rd = list_kl%elements(i_list_kl)%r2
1228 rcd2 = list_kl%elements(i_list_kl)%dist2
1230 IF (do_p_screening)
THEN
1231 pmax_atom = max(shm_pmax_atom(katom, iatom), &
1232 shm_pmax_atom(latom, jatom), &
1233 shm_pmax_atom(latom, iatom), &
1234 shm_pmax_atom(katom, jatom))
1239 screen_kind_ij = screen_coeffs_kind(jkind, ikind)%x(1)*rab2 + &
1240 screen_coeffs_kind(jkind, ikind)%x(2)
1241 screen_kind_kl = screen_coeffs_kind(lkind, kkind)%x(1)*rcd2 + &
1242 screen_coeffs_kind(lkind, kkind)%x(2)
1244 IF (screen_kind_ij + screen_kind_kl + pmax_atom < log10_eps_schwarz) cycle
1248 IF (.NOT. (shm_is_assoc_atomic_block(latom, iatom) >= 1 .AND. &
1249 shm_is_assoc_atomic_block(katom, iatom) >= 1 .AND. &
1250 shm_is_assoc_atomic_block(katom, jatom) >= 1 .AND. &
1251 shm_is_assoc_atomic_block(latom, jatom) >= 1)) cycle
1255 IF (iatom == jatom) symm_fac = symm_fac*2.0_dp
1256 IF (katom == latom) symm_fac = symm_fac*2.0_dp
1257 IF (iatom == katom .AND. jatom == latom .AND. iatom /= jatom .AND. katom /= latom) symm_fac = symm_fac*2.0_dp
1258 IF (iatom == katom .AND. iatom == jatom .AND. katom == latom) symm_fac = symm_fac*2.0_dp
1259 symm_fac = 1.0_dp/symm_fac
1261 lc_max => basis_parameter(kkind)%lmax
1262 lc_min => basis_parameter(kkind)%lmin
1263 npgfc => basis_parameter(kkind)%npgf
1264 zetc => basis_parameter(kkind)%zet
1265 nsgfc => basis_parameter(kkind)%nsgf
1266 sphi_c_ext => basis_parameter(kkind)%sphi_ext(:, :, :, :)
1267 nsgfl_c => basis_parameter(kkind)%nsgfl
1268 sphi_c_u1 = ubound(sphi_c_ext, 1)
1269 sphi_c_u2 = ubound(sphi_c_ext, 2)
1270 sphi_c_u3 = ubound(sphi_c_ext, 3)
1272 ld_max => basis_parameter(lkind)%lmax
1273 ld_min => basis_parameter(lkind)%lmin
1274 npgfd => basis_parameter(lkind)%npgf
1275 zetd => basis_parameter(lkind)%zet
1276 nsgfd => basis_parameter(lkind)%nsgf
1277 sphi_d_ext => basis_parameter(lkind)%sphi_ext(:, :, :, :)
1278 nsgfl_d => basis_parameter(lkind)%nsgfl
1279 sphi_d_u1 = ubound(sphi_d_ext, 1)
1280 sphi_d_u2 = ubound(sphi_d_ext, 2)
1281 sphi_d_u3 = ubound(sphi_d_ext, 3)
1283 atomic_offset_bd = shm_atomic_block_offset(jatom, latom)
1284 atomic_offset_bc = shm_atomic_block_offset(jatom, katom)
1285 atomic_offset_ad = shm_atomic_block_offset(iatom, latom)
1286 atomic_offset_ac = shm_atomic_block_offset(iatom, katom)
1288 IF (jatom < latom)
THEN
1289 offset_bd_set => shm_set_offset(:, :, lkind, jkind)
1291 offset_bd_set => shm_set_offset(:, :, jkind, lkind)
1293 IF (jatom < katom)
THEN
1294 offset_bc_set => shm_set_offset(:, :, kkind, jkind)
1296 offset_bc_set => shm_set_offset(:, :, jkind, kkind)
1298 IF (iatom < latom)
THEN
1299 offset_ad_set => shm_set_offset(:, :, lkind, ikind)
1301 offset_ad_set => shm_set_offset(:, :, ikind, lkind)
1303 IF (iatom < katom)
THEN
1304 offset_ac_set => shm_set_offset(:, :, kkind, ikind)
1306 offset_ac_set => shm_set_offset(:, :, ikind, kkind)
1309 IF (do_p_screening)
THEN
1311 kind_kind_idx = int(get_1d_idx(kkind, ikind, int(nkind,
int_8)))
1312 IF (ikind >= kkind)
THEN
1313 ptr_p_1 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1314 actual_x_data%map_atom_to_kind_atom(katom), &
1315 actual_x_data%map_atom_to_kind_atom(iatom))
1317 ptr_p_1 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1318 actual_x_data%map_atom_to_kind_atom(iatom), &
1319 actual_x_data%map_atom_to_kind_atom(katom))
1320 swap_id = swap_id + 1
1322 kind_kind_idx = int(get_1d_idx(lkind, jkind, int(nkind,
int_8)))
1323 IF (jkind >= lkind)
THEN
1324 ptr_p_2 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1325 actual_x_data%map_atom_to_kind_atom(latom), &
1326 actual_x_data%map_atom_to_kind_atom(jatom))
1328 ptr_p_2 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1329 actual_x_data%map_atom_to_kind_atom(jatom), &
1330 actual_x_data%map_atom_to_kind_atom(latom))
1331 swap_id = swap_id + 2
1333 kind_kind_idx = int(get_1d_idx(lkind, ikind, int(nkind,
int_8)))
1334 IF (ikind >= lkind)
THEN
1335 ptr_p_3 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1336 actual_x_data%map_atom_to_kind_atom(latom), &
1337 actual_x_data%map_atom_to_kind_atom(iatom))
1339 ptr_p_3 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1340 actual_x_data%map_atom_to_kind_atom(iatom), &
1341 actual_x_data%map_atom_to_kind_atom(latom))
1342 swap_id = swap_id + 4
1344 kind_kind_idx = int(get_1d_idx(kkind, jkind, int(nkind,
int_8)))
1345 IF (jkind >= kkind)
THEN
1346 ptr_p_4 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1347 actual_x_data%map_atom_to_kind_atom(katom), &
1348 actual_x_data%map_atom_to_kind_atom(jatom))
1350 ptr_p_4 => shm_initial_p(kind_kind_idx)%p_kind(:, :, &
1351 actual_x_data%map_atom_to_kind_atom(jatom), &
1352 actual_x_data%map_atom_to_kind_atom(katom))
1353 swap_id = swap_id + 8
1359 IF (my_geo_change)
THEN
1360 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1367 mem_compression_counter = 0
1370 tmp_i4 = x_data(irep, i)%memory_parameter%actual_memory_usage
1371 mem_compression_counter = mem_compression_counter + &
1372 tmp_i4*memory_parameter%cache_size
1374 IF (mem_compression_counter > memory_parameter%max_compression_counter)
THEN
1375 buffer_overflow = .true.
1376 IF (do_dynamic_load_balancing)
THEN
1377 distribution_energy%ram_counter = counter
1379 memory_parameter%ram_counter = counter
1382 counter = counter + 1
1383 buffer_overflow = .false.
1387 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
1388 IF (do_dynamic_load_balancing)
THEN
1389 IF (distribution_energy%ram_counter == counter)
THEN
1390 buffer_overflow = .true.
1392 counter = counter + 1
1393 buffer_overflow = .false.
1397 IF (memory_parameter%ram_counter == counter)
THEN
1398 buffer_overflow = .true.
1400 counter = counter + 1
1401 buffer_overflow = .false.
1407 IF (buffer_overflow .AND. do_disk_storage)
THEN
1408 use_disk_storage = .true.
1409 buffer_overflow = .false.
1412 IF (use_disk_storage)
THEN
1414 tmp_i4 = memory_parameter%actual_memory_usage_disk
1415 mem_compression_counter_disk = tmp_i4*memory_parameter%cache_size
1416 IF (mem_compression_counter_disk > memory_parameter%max_compression_counter_disk)
THEN
1417 buffer_overflow = .true.
1418 use_disk_storage = .false.
1422 DO i_set_list_ij = i_set_list_ij_start, i_set_list_ij_stop
1423 iset = set_list_ij(i_set_list_ij)%pair(1)
1424 jset = set_list_ij(i_set_list_ij)%pair(2)
1426 ncob = npgfb(jset)*
ncoset(lb_max(jset))
1427 max_val1 = screen_coeffs_set(jset, iset, jkind, ikind)%x(1)*rab2 + &
1428 screen_coeffs_set(jset, iset, jkind, ikind)%x(2)
1430 IF (max_val1 + screen_kind_kl + pmax_atom < log10_eps_schwarz) cycle
1432 sphi_a_ext_set => sphi_a_ext(:, :, :, iset)
1433 sphi_b_ext_set => sphi_b_ext(:, :, :, jset)
1434 DO i_set_list_kl = i_set_list_kl_start, i_set_list_kl_stop
1435 kset = set_list_kl(i_set_list_kl)%pair(1)
1436 lset = set_list_kl(i_set_list_kl)%pair(2)
1438 max_val2_set = (screen_coeffs_set(lset, kset, lkind, kkind)%x(1)*rcd2 + &
1439 screen_coeffs_set(lset, kset, lkind, kkind)%x(2))
1440 max_val2 = max_val1 + max_val2_set
1443 IF (max_val2 + pmax_atom < log10_eps_schwarz) cycle
1444 sphi_c_ext_set => sphi_c_ext(:, :, :, kset)
1445 sphi_d_ext_set => sphi_d_ext(:, :, :, lset)
1447 IF (do_p_screening)
THEN
1448 CALL get_pmax_val(ptr_p_1, ptr_p_2, ptr_p_3, ptr_p_4, &
1449 iset, jset, kset, lset, &
1450 pmax_entry, swap_id)
1454 log10_pmax = pmax_entry
1455 max_val2 = max_val2 + log10_pmax
1456 IF (max_val2 < log10_eps_schwarz) cycle
1457 pmax_entry = exp(log10_pmax*ln_10)
1460 current_counter = nsgfa(iset)*nsgfb(jset)*nsgfc(kset)*nsgfd(lset)
1461 IF (buffer_overflow)
THEN
1462 neris_onthefly = neris_onthefly + current_counter
1466 IF (.NOT. buffer_overflow .AND. .NOT. my_geo_change)
THEN
1467 nints = current_counter
1468 IF (.NOT. use_disk_storage)
THEN
1470 estimate_to_store_int, 6, &
1471 maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
1475 estimate_to_store_int, 6, &
1476 maxval_cache_disk, maxval_container_disk, memory_parameter%actual_memory_usage_disk, &
1479 spherical_estimate = set_exponent(1.0_dp, estimate_to_store_int + 1)
1480 IF (spherical_estimate*pmax_entry < eps_schwarz) cycle
1481 nbits = exponent(anint(spherical_estimate*pmax_entry/eps_storage)) + 1
1484 IF (.NOT. use_disk_storage)
THEN
1485 neris_incore = neris_incore + int(nints,
int_8)
1487 neris_disk = neris_disk + int(nints,
int_8)
1489 DO WHILE (buffer_left > 0)
1490 buffer_size = min(buffer_left, cache_size)
1491 IF (.NOT. use_disk_storage)
THEN
1493 buffer_size, nbits, &
1494 integral_caches(nbits), &
1495 integral_containers(nbits), &
1496 eps_storage, pmax_entry, &
1497 memory_parameter%actual_memory_usage, &
1501 buffer_size, nbits, &
1502 integral_caches_disk(nbits), &
1503 integral_containers_disk(nbits), &
1504 eps_storage, pmax_entry, &
1505 memory_parameter%actual_memory_usage_disk, &
1508 buffer_left = buffer_left - buffer_size
1509 buffer_start = buffer_start + buffer_size
1513 IF (my_geo_change .OR. buffer_overflow)
THEN
1514 max_contraction_val = max_contraction(iset, iatom)* &
1515 max_contraction(jset, jatom)* &
1516 max_contraction(kset, katom)* &
1517 max_contraction(lset, latom)*pmax_entry
1518 tmp_r_1 => radii_pgf(:, :, jset, iset, jkind, ikind)
1519 tmp_r_2 => radii_pgf(:, :, lset, kset, lkind, kkind)
1520 tmp_screen_pgf1 => screen_coeffs_pgf(:, :, jset, iset, jkind, ikind)
1521 tmp_screen_pgf2 => screen_coeffs_pgf(:, :, lset, kset, lkind, kkind)
1523 CALL coulomb4(private_lib, ra, rb, rc, rd, npgfa(iset), npgfb(jset), npgfc(kset), npgfd(lset), &
1524 la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
1525 lc_min(kset), lc_max(kset), ld_min(lset), ld_max(lset), &
1526 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1527 sphi_a_u1, sphi_a_u2, sphi_a_u3, &
1528 sphi_b_u1, sphi_b_u2, sphi_b_u3, &
1529 sphi_c_u1, sphi_c_u2, sphi_c_u3, &
1530 sphi_d_u1, sphi_d_u2, sphi_d_u3, &
1531 zeta(1:npgfa(iset), iset), zetb(1:npgfb(jset), jset), &
1532 zetc(1:npgfc(kset), kset), zetd(1:npgfd(lset), lset), &
1533 primitive_integrals, &
1534 potential_parameter, &
1535 actual_x_data%neighbor_cells, screen_coeffs_set(jset, iset, jkind, ikind)%x, &
1536 screen_coeffs_set(lset, kset, lkind, kkind)%x, eps_schwarz, &
1537 max_contraction_val, cartesian_estimate, cell, neris_tmp, &
1538 log10_pmax, log10_eps_schwarz, &
1539 tmp_r_1, tmp_r_2, tmp_screen_pgf1, tmp_screen_pgf2, &
1540 pgf_list_ij, pgf_list_kl, pgf_product_list, &
1541 nsgfl_a(:, iset), nsgfl_b(:, jset), &
1542 nsgfl_c(:, kset), nsgfl_d(:, lset), &
1547 ee_work, ee_work2, ee_buffer1, ee_buffer2, ee_primitives_tmp, &
1548 nimages, do_periodic, p_work)
1550 nints = nsgfa(iset)*nsgfb(jset)*nsgfc(kset)*nsgfd(lset)
1551 neris_total = neris_total + nints
1552 nprim_ints = nprim_ints + neris_tmp
1576 spherical_estimate = 0.0_dp
1578 spherical_estimate = max(spherical_estimate, abs(primitive_integrals(i)))
1581 IF (spherical_estimate == 0.0_dp) spherical_estimate = tiny(spherical_estimate)
1582 estimate_to_store_int = exponent(spherical_estimate)
1583 estimate_to_store_int = max(estimate_to_store_int, -15_int_8)
1585 IF (.NOT. buffer_overflow .AND. my_geo_change)
THEN
1586 IF (.NOT. use_disk_storage)
THEN
1588 estimate_to_store_int, 6, &
1589 maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
1590 use_disk_storage, max_val_memory)
1593 estimate_to_store_int, 6, &
1594 maxval_cache_disk, maxval_container_disk, memory_parameter%actual_memory_usage_disk, &
1598 spherical_estimate = set_exponent(1.0_dp, estimate_to_store_int + 1)
1599 IF (spherical_estimate*pmax_entry < eps_schwarz) cycle
1600 IF (.NOT. buffer_overflow)
THEN
1601 nbits = exponent(anint(spherical_estimate*pmax_entry/eps_storage)) + 1
1614 IF (nbits > 63)
THEN
1615 WRITE (eps_schwarz_min_str,
'(ES10.3E2)') &
1616 spherical_estimate*pmax_entry/ &
1617 (set_exponent(1.0_dp, 63)*memory_parameter%eps_storage_scaling)
1619 WRITE (eps_scaling_str,
'(ES10.3E2)') &
1620 spherical_estimate*pmax_entry/(set_exponent(1.0_dp, 63)*eps_schwarz)
1622 CALL cp_abort(__location__, &
1623 "Overflow during ERI's compression. Please use a larger "// &
1624 "EPS_SCHWARZ threshold (above "//trim(adjustl(eps_schwarz_min_str))// &
1625 ") or increase the EPS_STORAGE_SCALING factor above "// &
1626 trim(adjustl(eps_scaling_str))//
".")
1631 IF (.NOT. use_disk_storage)
THEN
1632 neris_incore = neris_incore + int(nints,
int_8)
1635 neris_disk = neris_disk + int(nints,
int_8)
1638 DO WHILE (buffer_left > 0)
1639 buffer_size = min(buffer_left, cache_size)
1640 IF (.NOT. use_disk_storage)
THEN
1642 buffer_size, nbits, &
1643 integral_caches(nbits), &
1644 integral_containers(nbits), &
1645 eps_storage, pmax_entry, &
1646 memory_parameter%actual_memory_usage, &
1650 buffer_size, nbits, &
1651 integral_caches_disk(nbits), &
1652 integral_containers_disk(nbits), &
1653 eps_storage, pmax_entry, &
1654 memory_parameter%actual_memory_usage_disk, &
1657 buffer_left = buffer_left - buffer_size
1658 buffer_start = buffer_start + buffer_size
1663 primitive_integrals(i) = primitive_integrals(i)*pmax_entry
1664 IF (abs(primitive_integrals(i)) > eps_storage)
THEN
1665 primitive_integrals(i) = anint(primitive_integrals(i)/eps_storage,
dp)*eps_storage/pmax_entry
1667 primitive_integrals(i) = 0.0_dp
1674 CALL print_integrals( &
1675 iatom, jatom, katom, latom, shm_set_offset, shm_atomic_block_offset, &
1676 iset, jset, kset, lset, nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), primitive_integrals)
1678 IF (.NOT. is_anti_symmetric)
THEN
1680 CALL update_fock_matrix( &
1681 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1682 fac, symm_fac, full_density_alpha(:, 1), full_ks_alpha(:, 1), &
1683 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1684 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1685 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1686 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1687 IF (.NOT. treat_lsd_in_core)
THEN
1688 IF (my_nspins == 2)
THEN
1689 CALL update_fock_matrix( &
1690 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1691 fac, symm_fac, full_density_beta(:, 1), full_ks_beta(:, 1), &
1692 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1693 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1694 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1695 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1700 CALL update_fock_matrix_as( &
1701 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1702 fac, symm_fac, full_density_alpha(:, 1), full_ks_alpha(:, 1), &
1703 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1704 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1705 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1706 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1707 IF (.NOT. treat_lsd_in_core)
THEN
1708 IF (my_nspins == 2)
THEN
1709 CALL update_fock_matrix_as( &
1710 nsgfa(iset), nsgfb(jset), nsgfc(kset), nsgfd(lset), &
1711 fac, symm_fac, full_density_beta(:, 1), full_ks_beta(:, 1), &
1712 primitive_integrals, pbd_buf, pbc_buf, pad_buf, pac_buf, kbd_buf, &
1713 kbc_buf, kad_buf, kac_buf, iatom, jatom, katom, latom, &
1714 iset, jset, kset, lset, offset_bd_set, offset_bc_set, offset_ad_set, offset_ac_set, &
1715 atomic_offset_bd, atomic_offset_bc, atomic_offset_ad, atomic_offset_ac)
1721 IF (do_disk_storage)
THEN
1722 buffer_overflow = .true.
1726 END DO atomic_blocks
1728 IF (my_geo_change)
THEN
1729 distribution_energy%time_first_scf = bintime_stop - bintime_start
1731 distribution_energy%time_other_scf = &
1732 distribution_energy%time_other_scf + bintime_stop - bintime_start
1735 CALL timestop(handle_bin)
1741 do_print_load_balance_info = .false.
1743 "LOAD_BALANCE%PRINT/LOAD_BALANCE_INFO"),
cp_p_file)
1746 IF (do_print_load_balance_info)
THEN
1750 extension=
".scfLog")
1758 "LOAD_BALANCE%PRINT/LOAD_BALANCE_INFO")
1768 DEALLOCATE (primitive_integrals)
1772 shm_neris_total = shm_neris_total + neris_total
1774 shm_neris_onthefly = shm_neris_onthefly + neris_onthefly
1776 shm_nprim_ints = shm_nprim_ints + nprim_ints
1778 storage_counter_integrals = memory_parameter%actual_memory_usage* &
1779 memory_parameter%cache_size
1780 stor_count_int_disk = memory_parameter%actual_memory_usage_disk* &
1781 memory_parameter%cache_size
1782 stor_count_max_val = max_val_memory*memory_parameter%cache_size
1784 shm_storage_counter_integrals = shm_storage_counter_integrals + storage_counter_integrals
1786 shm_stor_count_int_disk = shm_stor_count_int_disk + stor_count_int_disk
1788 shm_neris_incore = shm_neris_incore + neris_incore
1790 shm_neris_disk = shm_neris_disk + neris_disk
1792 shm_stor_count_max_val = shm_stor_count_max_val + stor_count_max_val
1797 shm_mem_compression_counter = 0
1800 tmp_i4 = x_data(irep, i)%memory_parameter%actual_memory_usage
1801 shm_mem_compression_counter = shm_mem_compression_counter + &
1802 tmp_i4*memory_parameter%cache_size
1806 actual_x_data%memory_parameter%final_comp_counter_energy = shm_mem_compression_counter
1813 mb_size_p = shm_block_offset(ncpu + 1)/1024/128
1814 mb_size_f = shm_block_offset(ncpu + 1)/1024/128
1815 IF (.NOT. treat_lsd_in_core)
THEN
1816 IF (my_nspins == 2)
THEN
1817 mb_size_f = mb_size_f*2
1818 mb_size_p = mb_size_p*2
1822 mb_size_buffers = int(nsgf_max,
int_8)**4*n_threads
1824 mb_size_buffers = mb_size_buffers + int(nsgf_max,
int_8)**2*n_threads
1825 subtr_size_mb = subtr_size_mb + 8_int_8*nsgf_max**2*n_threads
1827 mb_size_buffers = mb_size_buffers + max_pgf**2*max_set**2*nkind**2 &
1828 + max_set**2*nkind**2 &
1830 + max_pgf**2*max_set**2*nkind**2
1832 mb_size_buffers = mb_size_buffers + natom**2
1834 IF (do_p_screening)
THEN
1835 mb_size_buffers = mb_size_buffers + natom**2
1837 IF (screening_parameter%do_p_screening_forces)
THEN
1838 IF (memory_parameter%treat_forces_in_core)
THEN
1839 mb_size_buffers = mb_size_buffers + natom**2
1843 IF (do_p_screening .OR. screening_parameter%do_p_screening_forces)
THEN
1844 mb_size_buffers = mb_size_buffers + memory_parameter%size_p_screen
1847 IF (screening_parameter%do_p_screening_forces)
THEN
1848 IF (memory_parameter%treat_forces_in_core)
THEN
1849 mb_size_buffers = mb_size_buffers + memory_parameter%size_p_screen
1854 mb_size_buffers = mb_size_buffers/1024/128
1857 IF (is_anti_symmetric) afac = -1.0_dp
1858 CALL timestop(handle_main)
1859 ene_x_aa_diag = 0.0_dp
1860 ene_x_bb_diag = 0.0_dp
1862 ikind = kind_of(iatom)
1863 nseta = basis_parameter(ikind)%nset
1864 nsgfa => basis_parameter(ikind)%nsgf
1866 jkind = kind_of(jatom)
1867 nsetb = basis_parameter(jkind)%nset
1868 nsgfb => basis_parameter(jkind)%nsgf
1869 act_atomic_block_offset = shm_atomic_block_offset(jatom, iatom)
1870 DO img = 1, nkimages
1873 act_set_offset = shm_set_offset(jset, iset, jkind, ikind)
1874 i = act_set_offset + act_atomic_block_offset - 1
1875 DO ma = 1, nsgfa(iset)
1876 j = shm_set_offset(iset, jset, jkind, ikind) + act_atomic_block_offset - 1 + ma - 1
1877 DO mb = 1, nsgfb(jset)
1879 full_ks_alpha(i, img) = (full_ks_alpha(i, img) + full_ks_alpha(j, img)*afac)
1880 full_ks_alpha(j, img) = full_ks_alpha(i, img)*afac
1881 IF (.NOT. treat_lsd_in_core .AND. my_nspins == 2)
THEN
1882 full_ks_beta(i, img) = (full_ks_beta(i, img) + full_ks_beta(j, img)*afac)
1883 full_ks_beta(j, img) = full_ks_beta(i, img)*afac
1888 ene_x_aa_diag = ene_x_aa_diag + full_ks_alpha(i, img)*full_density_alpha(i, img)
1889 IF (.NOT. treat_lsd_in_core .AND. my_nspins == 2)
THEN
1890 ene_x_bb_diag = ene_x_bb_diag + full_ks_beta(i, img)*full_density_beta(i, img)
1902 CALL para_env%sync()
1904 IF (is_anti_symmetric) afac = 0._dp
1905 IF (distribute_fock_matrix)
THEN
1907 CALL timeset(routinen//
"_dist_KS", handle_dist_ks)
1908 DO img = 1, nkimages
1909 CALL distribute_ks_matrix(para_env, full_ks_alpha(:, img), ks_matrix(ispin, img)%matrix, shm_number_of_p_entries, &
1910 shm_block_offset, kind_of, basis_parameter, &
1911 off_diag_fac=0.5_dp, diag_fac=afac)
1914 NULLIFY (full_ks_alpha)
1915 DEALLOCATE (shm_master_x_data%full_ks_alpha)
1916 IF (.NOT. treat_lsd_in_core)
THEN
1917 IF (my_nspins == 2)
THEN
1918 DO img = 1, nkimages
1919 CALL distribute_ks_matrix(para_env, full_ks_beta(:, img), ks_matrix(2, img)%matrix, shm_number_of_p_entries, &
1920 shm_block_offset, kind_of, basis_parameter, &
1921 off_diag_fac=0.5_dp, diag_fac=afac)
1923 NULLIFY (full_ks_beta)
1924 DEALLOCATE (shm_master_x_data%full_ks_beta)
1927 CALL timestop(handle_dist_ks)
1930 IF (distribute_fock_matrix)
THEN
1933 DO img = 1, nkimages
1935 ene_x_aa = ene_x_aa + etmp
1938 IF (dft_control%do_admm)
THEN
1939 cpassert(nkimages == 1)
1940 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(ispin)%matrix, ks_matrix(ispin, 1)%matrix, &
1941 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
1945 IF (my_nspins == 2 .AND. .NOT. treat_lsd_in_core)
THEN
1946 DO img = 1, nkimages
1948 ene_x_bb = ene_x_bb + etmp
1951 IF (dft_control%do_admm)
THEN
1952 cpassert(nkimages == 1)
1953 CALL dbcsr_copy(matrix_ks_aux_fit_hfx(2)%matrix, ks_matrix(2, 1)%matrix, &
1954 name=
"HF exch. part of matrix_ks_aux_fit for ADMMS")
1959 ehfx = 0.5_dp*(ene_x_aa + ene_x_bb)
1963 DO img = 1, nkimages
1964 DO pa = 1,
SIZE(full_ks_alpha, 1)
1965 ene_x_aa = ene_x_aa + full_ks_alpha(pa, img)*full_density_alpha(pa, img)
1969 ene_x_aa = (ene_x_aa + ene_x_aa_diag)*0.5_dp
1970 IF (my_nspins == 2)
THEN
1971 DO img = 1, nkimages
1972 DO pa = 1,
SIZE(full_ks_beta, 1)
1973 ene_x_bb = ene_x_bb + full_ks_beta(pa, img)*full_density_beta(pa, img)
1977 ene_x_bb = (ene_x_bb + ene_x_bb_diag)*0.5_dp
1979 CALL para_env%sum(ene_x_aa)
1980 IF (my_nspins == 2)
CALL para_env%sum(ene_x_bb)
1981 ehfx = 0.5_dp*(ene_x_aa + ene_x_bb)
1985 IF (my_geo_change)
THEN
1986 tmp_i8(1:8) = (/shm_storage_counter_integrals, shm_neris_onthefly, shm_neris_incore, shm_neris_disk, &
1987 shm_neris_total, shm_stor_count_int_disk, shm_nprim_ints, shm_stor_count_max_val/)
1988 CALL para_env%sum(tmp_i8)
1989 shm_storage_counter_integrals = tmp_i8(1)
1990 shm_neris_onthefly = tmp_i8(2)
1991 shm_neris_incore = tmp_i8(3)
1992 shm_neris_disk = tmp_i8(4)
1993 shm_neris_total = tmp_i8(5)
1994 shm_stor_count_int_disk = tmp_i8(6)
1995 shm_nprim_ints = tmp_i8(7)
1996 shm_stor_count_max_val = tmp_i8(8)
1997 CALL para_env%max(memsize_after)
1998 mem_eris = (shm_storage_counter_integrals + 128*1024 - 1)/1024/128
1999 compression_factor = real(shm_neris_incore,
dp)/real(shm_storage_counter_integrals,
dp)
2000 mem_eris_disk = (shm_stor_count_int_disk + 128*1024 - 1)/1024/128
2001 compression_factor_disk = real(shm_neris_disk,
dp)/real(shm_stor_count_int_disk,
dp)
2002 mem_max_val = (shm_stor_count_max_val + 128*1024 - 1)/1024/128
2004 IF (shm_neris_incore == 0)
THEN
2006 compression_factor = 0.0_dp
2008 IF (shm_neris_disk == 0)
THEN
2010 compression_factor_disk = 0.0_dp
2014 extension=
".scfLog")
2016 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2017 "HFX_MEM_INFO| Number of cart. primitive ERI's calculated: ", shm_nprim_ints
2019 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2020 "HFX_MEM_INFO| Number of sph. ERI's calculated: ", shm_neris_total
2022 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2023 "HFX_MEM_INFO| Number of sph. ERI's stored in-core: ", shm_neris_incore
2025 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2026 "HFX_MEM_INFO| Number of sph. ERI's stored on disk: ", shm_neris_disk
2028 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2029 "HFX_MEM_INFO| Number of sph. ERI's calculated on the fly: ", shm_neris_onthefly
2031 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2032 "HFX_MEM_INFO| Total memory consumption ERI's RAM [MiB]: ", mem_eris
2034 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2035 "HFX_MEM_INFO| Whereof max-vals [MiB]: ", mem_max_val
2037 WRITE (unit=iw, fmt=
"((T3,A,T60,F21.2))") &
2038 "HFX_MEM_INFO| Total compression factor ERI's RAM: ", compression_factor
2040 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2041 "HFX_MEM_INFO| Total memory consumption ERI's disk [MiB]: ", mem_eris_disk
2043 WRITE (unit=iw, fmt=
"((T3,A,T60,F21.2))") &
2044 "HFX_MEM_INFO| Total compression factor ERI's disk: ", compression_factor_disk
2046 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2047 "HFX_MEM_INFO| Size of density/Fock matrix [MiB]: ", 2_int_8*mb_size_p
2049 IF (do_periodic)
THEN
2050 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2051 "HFX_MEM_INFO| Size of buffers [MiB]: ", mb_size_buffers
2052 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2053 "HFX_MEM_INFO| Number of periodic image cells considered: ",
SIZE(shm_master_x_data%neighbor_cells)
2055 WRITE (unit=iw, fmt=
"((T3,A,T60,I21))") &
2056 "HFX_MEM_INFO| Size of buffers [MiB]: ", mb_size_buffers
2058 WRITE (unit=iw, fmt=
"((T3,A,T60,I21),/)") &
2059 "HFX_MEM_INFO| Est. max. program size after HFX [MiB]:", memsize_after/(1024*1024)
2069 IF (do_dynamic_load_balancing)
THEN
2070 my_bin_size =
SIZE(actual_x_data%distribution_energy)
2075 IF (my_geo_change)
THEN
2076 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
2077 DO bin = 1, my_bin_size
2078 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
2079 maxval_container => actual_x_data%store_ints%maxval_container(bin)
2080 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
2081 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
2082 CALL hfx_flush_last_cache(bits_max_val, maxval_cache, maxval_container, memory_parameter%actual_memory_usage, &
2086 memory_parameter%actual_memory_usage, .false.)
2092 IF (.NOT. memory_parameter%do_all_on_the_fly)
THEN
2093 DO bin = 1, my_bin_size
2094 maxval_cache => actual_x_data%store_ints%maxval_cache(bin)
2095 maxval_container => actual_x_data%store_ints%maxval_container(bin)
2096 integral_caches => actual_x_data%store_ints%integral_caches(:, bin)
2097 integral_containers => actual_x_data%store_ints%integral_containers(:, bin)
2102 memory_parameter%actual_memory_usage, &
2110 IF (do_disk_storage)
THEN
2112 IF (my_geo_change)
THEN
2114 memory_parameter%actual_memory_usage_disk, .true.)
2117 memory_parameter%actual_memory_usage_disk, .true.)
2125 memory_parameter%actual_memory_usage_disk, do_disk_storage)
2131 DEALLOCATE (last_sgf_global)
2133 DEALLOCATE (full_density_alpha)
2134 IF (.NOT. treat_lsd_in_core)
THEN
2135 IF (my_nspins == 2)
THEN
2136 DEALLOCATE (full_density_beta)
2139 IF (do_dynamic_load_balancing)
THEN
2140 DEALLOCATE (shm_master_x_data%task_list)
2143 DEALLOCATE (pbd_buf, pbc_buf, pad_buf, pac_buf)
2144 DEALLOCATE (kbd_buf, kbc_buf, kad_buf, kac_buf)
2145 DEALLOCATE (set_list_ij, set_list_kl)
2147 DO i = 1, max_pgf**2
2148 DEALLOCATE (pgf_list_ij(i)%image_list)
2149 DEALLOCATE (pgf_list_kl(i)%image_list)
2152 DEALLOCATE (pgf_list_ij)
2153 DEALLOCATE (pgf_list_kl)
2154 DEALLOCATE (pgf_product_list)
2156 DEALLOCATE (max_contraction, kind_of)
2158 DEALLOCATE (ee_work, ee_work2, ee_buffer1, ee_buffer2, ee_primitives_tmp)
2160 DEALLOCATE (nimages)
2165 CALL timestop(handle)