LCOV - code coverage report
Current view: top level - src - hfx_screening_methods.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:70636b1) Lines: 99.5 % 408 406
Test Date: 2026-02-11 07:00:35 Functions: 100.0 % 6 6

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Several screening methods used in HFX calcualtions
      10              : !> \par History
      11              : !>      04.2008 created [Manuel Guidon]
      12              : !> \author Manuel Guidon
      13              : ! **************************************************************************************************
      14              : MODULE hfx_screening_methods
      15              :    USE ao_util,                         ONLY: exp_radius_very_extended
      16              :    USE basis_set_types,                 ONLY: gto_basis_set_type
      17              :    USE hfx_libint_interface,            ONLY: evaluate_eri_screen
      18              :    USE hfx_types,                       ONLY: hfx_basis_type,&
      19              :                                               hfx_p_kind,&
      20              :                                               hfx_potential_type,&
      21              :                                               hfx_screen_coeff_type,&
      22              :                                               log_zero,&
      23              :                                               powell_min_log
      24              :    USE kinds,                           ONLY: dp,&
      25              :                                               int_8
      26              :    USE libint_wrapper,                  ONLY: cp_libint_t
      27              :    USE machine,                         ONLY: default_output_unit
      28              :    USE orbital_pointers,                ONLY: ncoset
      29              :    USE powell,                          ONLY: opt_state_type,&
      30              :                                               powell_optimize
      31              :    USE qs_environment_types,            ONLY: get_qs_env,&
      32              :                                               qs_environment_type
      33              :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      34              :                                               qs_kind_type
      35              : #include "./base/base_uses.f90"
      36              : 
      37              :    IMPLICIT NONE
      38              :    PRIVATE
      39              : 
      40              :    PUBLIC :: update_pmax_mat, &
      41              :              calc_screening_functions, &
      42              :              calc_pair_dist_radii
      43              : 
      44              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'hfx_screening_methods'
      45              : 
      46              : !***
      47              : 
      48              : CONTAINS
      49              : 
      50              : ! **************************************************************************************************
      51              : !> \brief calculates max values of two-electron integrals in a quartet/shell
      52              : !>      w.r.t. different zetas using the library lib_int
      53              : !> \param lib ...
      54              : !> \param ra position
      55              : !> \param rb position
      56              : !> \param zeta zeta
      57              : !> \param zetb zeta
      58              : !> \param la_min angular momentum
      59              : !> \param la_max angular momentum
      60              : !> \param lb_min angular momentum
      61              : !> \param lb_max angular momentum
      62              : !> \param npgfa number of primitive cartesian gaussian in actual shell
      63              : !> \param npgfb number of primitive cartesian gaussian in actual shell
      64              : !> \param max_val schwarz screening value
      65              : !> \param potential_parameter contains info for libint
      66              : !> \param tmp_R_1 pgf_based screening coefficients
      67              : !> \param rab2 Squared Distance of centers ab
      68              : !> \param p_work ...
      69              : !> \par History
      70              : !>     03.2007 created [Manuel Guidon]
      71              : !>     02.2009 refactored [Manuel Guidon]
      72              : !> \author Manuel Guidon
      73              : ! **************************************************************************************************
      74      9272204 :    SUBROUTINE screen4(lib, ra, rb, zeta, zetb, &
      75              :                       la_min, la_max, lb_min, lb_max, &
      76              :                       npgfa, npgfb, &
      77              :                       max_val, potential_parameter, tmp_R_1, &
      78              :                       rab2, p_work)
      79              : 
      80              :       TYPE(cp_libint_t)                                  :: lib
      81              :       REAL(dp), INTENT(IN)                               :: ra(3), rb(3)
      82              :       REAL(dp), DIMENSION(:), INTENT(IN)                 :: zeta, zetb
      83              :       INTEGER, INTENT(IN)                                :: la_min, la_max, lb_min, lb_max, npgfa, &
      84              :                                                             npgfb
      85              :       REAL(dp), INTENT(INOUT)                            :: max_val
      86              :       TYPE(hfx_potential_type)                           :: potential_parameter
      87              :       TYPE(hfx_screen_coeff_type), DIMENSION(:, :), &
      88              :          POINTER                                         :: tmp_R_1
      89              :       REAL(dp)                                           :: rab2
      90              :       REAL(dp), DIMENSION(:), POINTER                    :: p_work
      91              : 
      92              :       INTEGER                                            :: ipgf, jpgf, la, lb
      93              :       REAL(dp)                                           :: max_val_temp, R1
      94              : 
      95      9272204 :       max_val_temp = max_val
      96     25007600 :       DO ipgf = 1, npgfa
      97     57115096 :          DO jpgf = 1, npgfb
      98     32107496 :             R1 = MAX(0.0_dp, tmp_R_1(jpgf, ipgf)%x(1)*rab2 + tmp_R_1(jpgf, ipgf)%x(2))
      99     90060892 :             DO la = la_min, la_max
     100    132509576 :                DO lb = lb_min, lb_max
     101              :                   !Build primitives
     102              :                   CALL evaluate_eri_screen(lib, ra, rb, ra, rb, &
     103              :                                            zeta(ipgf), zetb(jpgf), zeta(ipgf), zetb(jpgf), &
     104              :                                            la, lb, la, lb, &
     105     58184080 :                                            max_val_temp, potential_parameter, R1, R1, p_work)
     106              : 
     107    100402080 :                   max_val = MAX(max_val, max_val_temp)
     108              :                END DO !lb
     109              :             END DO !la
     110              :          END DO !jpgf
     111              :       END DO !ipgf
     112      9272204 :    END SUBROUTINE screen4
     113              : 
     114              : ! **************************************************************************************************
     115              : !> \brief updates the maximum of the density matrix in compressed form for screening purposes
     116              : !> \param pmax_set buffer to store matrix
     117              : !> \param map_atom_to_kind_atom ...
     118              : !> \param set_offset ...
     119              : !> \param atomic_block_offset ...
     120              : !> \param pmax_atom ...
     121              : !> \param full_density_alpha ...
     122              : !> \param full_density_beta ...
     123              : !> \param natom ...
     124              : !> \param kind_of ...
     125              : !> \param basis_parameter ...
     126              : !> \param nkind ...
     127              : !> \param is_assoc_atomic_block ...
     128              : !> \par History
     129              : !>     09.2007 created [Manuel Guidon]
     130              : !> \author Manuel Guidon
     131              : !> \note
     132              : !>      - updates for each pair of shells the maximum absolute value of p
     133              : ! **************************************************************************************************
     134         1536 :    SUBROUTINE update_pmax_mat(pmax_set, map_atom_to_kind_atom, set_offset, atomic_block_offset, &
     135              :                               pmax_atom, full_density_alpha, full_density_beta, natom, &
     136              :                               kind_of, basis_parameter, &
     137          768 :                               nkind, is_assoc_atomic_block)
     138              : 
     139              :       TYPE(hfx_p_kind), DIMENSION(:), POINTER            :: pmax_set
     140              :       INTEGER, DIMENSION(:), POINTER                     :: map_atom_to_kind_atom
     141              :       INTEGER, DIMENSION(:, :, :, :), POINTER            :: set_offset
     142              :       INTEGER, DIMENSION(:, :), POINTER                  :: atomic_block_offset
     143              :       REAL(dp), DIMENSION(:, :), POINTER                 :: pmax_atom, full_density_alpha, &
     144              :                                                             full_density_beta
     145              :       INTEGER, INTENT(IN)                                :: natom
     146              :       INTEGER                                            :: kind_of(*)
     147              :       TYPE(hfx_basis_type), DIMENSION(:), POINTER        :: basis_parameter
     148              :       INTEGER                                            :: nkind
     149              :       INTEGER, DIMENSION(:, :)                           :: is_assoc_atomic_block
     150              : 
     151              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'update_pmax_mat'
     152              : 
     153              :       INTEGER :: act_atomic_block_offset, act_set_offset, handle, i, img, jatom, jkind, jset, &
     154              :          katom, kind_kind_idx, kkind, kset, mb, mc, nimg, nsetb, nsetc
     155          768 :       INTEGER, DIMENSION(:), POINTER                     :: nsgfb, nsgfc
     156              :       REAL(dp)                                           :: pmax_tmp
     157              : 
     158          768 :       CALL timeset(routineN, handle)
     159              : 
     160         2976 :       DO i = 1, SIZE(pmax_set)
     161        75528 :          pmax_set(i)%p_kind = 0.0_dp
     162              :       END DO
     163              : 
     164        11356 :       pmax_atom = log_zero
     165              : 
     166          768 :       nimg = SIZE(full_density_alpha, 2)
     167              : 
     168         3166 :       DO jatom = 1, natom
     169         2398 :          jkind = kind_of(jatom)
     170         2398 :          nsetb = basis_parameter(jkind)%nset
     171         2398 :          nsgfb => basis_parameter(jkind)%nsgf
     172              : 
     173        11356 :          DO katom = 1, natom
     174         8190 :             IF (.NOT. is_assoc_atomic_block(jatom, katom) >= 1) CYCLE
     175         8142 :             kkind = kind_of(katom)
     176         8142 :             IF (kkind < jkind) CYCLE
     177         6508 :             nsetc = basis_parameter(kkind)%nset
     178         6508 :             nsgfc => basis_parameter(kkind)%nsgf
     179         6508 :             act_atomic_block_offset = atomic_block_offset(katom, jatom)
     180        25396 :             DO jset = 1, nsetb
     181        71474 :                DO kset = 1, nsetc
     182        63284 :                   IF (katom >= jatom) THEN
     183        40256 :                      pmax_tmp = 0.0_dp
     184        40256 :                      act_set_offset = set_offset(kset, jset, kkind, jkind)
     185        80512 :                      DO img = 1, nimg
     186        40256 :                         i = act_set_offset + act_atomic_block_offset - 1
     187       157180 :                         DO mc = 1, nsgfc(kset)
     188       332454 :                            DO mb = 1, nsgfb(jset)
     189       215530 :                               pmax_tmp = MAX(pmax_tmp, ABS(full_density_alpha(i, img)))
     190       215530 :                               IF (ASSOCIATED(full_density_beta)) THEN
     191        41568 :                                  pmax_tmp = MAX(pmax_tmp, ABS(full_density_beta(i, img)))
     192              :                               END IF
     193       292198 :                               i = i + 1
     194              :                            END DO
     195              :                         END DO
     196              :                      END DO
     197        40256 :                      IF (pmax_tmp == 0.0_dp) THEN
     198              :                         pmax_tmp = log_zero
     199              :                      ELSE
     200        40030 :                         pmax_tmp = LOG10(pmax_tmp)
     201              :                      END IF
     202        40256 :                      kind_kind_idx = INT(get_1D_idx(jkind, kkind, INT(nkind, int_8)))
     203              :                      pmax_set(kind_kind_idx)%p_kind(jset, &
     204              :                                                     kset, &
     205              :                                                     map_atom_to_kind_atom(jatom), &
     206        40256 :                                                     map_atom_to_kind_atom(katom)) = pmax_tmp
     207              :                   ELSE
     208         6538 :                      pmax_tmp = 0.0_dp
     209         6538 :                      act_set_offset = set_offset(jset, kset, jkind, kkind)
     210        13076 :                      DO img = 1, nimg
     211        25424 :                         DO mc = 1, nsgfc(kset)
     212        12348 :                            i = act_set_offset + act_atomic_block_offset - 1 + mc - 1
     213        47264 :                            DO mb = 1, nsgfb(jset)
     214        28378 :                               pmax_tmp = MAX(pmax_tmp, ABS(full_density_alpha(i, img)))
     215        28378 :                               IF (ASSOCIATED(full_density_beta)) THEN
     216         2858 :                                  pmax_tmp = MAX(pmax_tmp, ABS(full_density_beta(i, img)))
     217              :                               END IF
     218        40726 :                               i = i + nsgfc(kset)
     219              :                            END DO
     220              :                         END DO
     221              :                      END DO
     222         6538 :                      IF (pmax_tmp == 0.0_dp) THEN
     223              :                         pmax_tmp = log_zero
     224              :                      ELSE
     225         6512 :                         pmax_tmp = LOG10(pmax_tmp)
     226              :                      END IF
     227         6538 :                      kind_kind_idx = INT(get_1D_idx(jkind, kkind, INT(nkind, int_8)))
     228              :                      pmax_set(kind_kind_idx)%p_kind(jset, &
     229              :                                                     kset, &
     230              :                                                     map_atom_to_kind_atom(jatom), &
     231         6538 :                                                     map_atom_to_kind_atom(katom)) = pmax_tmp
     232              :                   END IF
     233              :                END DO
     234              :             END DO
     235              :          END DO
     236              :       END DO
     237              : 
     238         3166 :       DO jatom = 1, natom
     239         2398 :          jkind = kind_of(jatom)
     240         2398 :          nsetb = basis_parameter(jkind)%nset
     241        11356 :          DO katom = 1, natom
     242         8190 :             IF (.NOT. is_assoc_atomic_block(jatom, katom) >= 1) CYCLE
     243         8142 :             kkind = kind_of(katom)
     244         8142 :             IF (kkind < jkind) CYCLE
     245         6508 :             nsetc = basis_parameter(kkind)%nset
     246         6508 :             pmax_tmp = log_zero
     247        22998 :             DO jset = 1, nsetb
     248        69792 :                DO kset = 1, nsetc
     249        46794 :                   kind_kind_idx = INT(get_1D_idx(jkind, kkind, INT(nkind, int_8)))
     250              :                   pmax_tmp = MAX(pmax_set(kind_kind_idx)%p_kind(jset, &
     251              :                                                                 kset, &
     252              :                                                                 map_atom_to_kind_atom(jatom), &
     253        63284 :                                                                 map_atom_to_kind_atom(katom)), pmax_tmp)
     254              :                END DO
     255              :             END DO
     256         6508 :             pmax_atom(jatom, katom) = pmax_tmp
     257        10588 :             pmax_atom(katom, jatom) = pmax_tmp
     258              :          END DO
     259              :       END DO
     260              : 
     261          768 :       CALL timestop(handle)
     262              : 
     263          768 :    END SUBROUTINE update_pmax_mat
     264              : 
     265              : ! **************************************************************************************************
     266              : !> \brief calculates screening functions for schwarz screening
     267              : !> \param qs_env qs_env
     268              : !> \param basis_parameter ...
     269              : !> \param lib structure to libint
     270              : !> \param potential_parameter contains infos on potential
     271              : !> \param coeffs_set set based coefficients
     272              : !> \param coeffs_kind kind based coefficients
     273              : !> \param coeffs_pgf pgf based coefficients
     274              : !> \param radii_pgf coefficients for long-range screening
     275              : !> \param max_set Maximum Number of basis set sets in the system
     276              : !> \param max_pgf Maximum Number of basis set pgfs in the system
     277              : !> \param n_threads ...
     278              : !> \param i_thread Thread ID of current task
     279              : !> \param p_work ...
     280              : !> \par History
     281              : !>     02.2009 created [Manuel Guidon]
     282              : !> \author Manuel Guidon
     283              : !> \note
     284              : !>      This routine calculates (ab|ab) for different distances Rab = |a-b|
     285              : !>      and uses the powell optimiztion routines in order to fit the results
     286              : !>      in the following form:
     287              : !>
     288              : !>                 (ab|ab) = (ab|ab)(Rab) = c2*Rab^2 + c0
     289              : !>
     290              : !>      The missing linear term assures that the functions is monotonically
     291              : !>      decaying such that c2 can be used as upper bound when applying the
     292              : !>      Minimum Image Convention in the periodic case. Furthermore
     293              : !>      it seems to be a good choice to fit the logarithm of the (ab|ab)
     294              : !>      The fitting takes place at several levels: kind, set and pgf within
     295              : !>      the corresponding ranges of the prodiuct charge distributions
     296              : !>      Doing so, we only need arrays of size nkinds^2*2 instead of big
     297              : !>      screening matrices
     298              : ! **************************************************************************************************
     299              : 
     300         1298 :    SUBROUTINE calc_screening_functions(qs_env, basis_parameter, lib, potential_parameter, &
     301              :                                        coeffs_set, coeffs_kind, coeffs_pgf, radii_pgf, &
     302              :                                        max_set, max_pgf, n_threads, i_thread, &
     303              :                                        p_work)
     304              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     305              :       TYPE(hfx_basis_type), DIMENSION(:), POINTER        :: basis_parameter
     306              :       TYPE(cp_libint_t)                                  :: lib
     307              :       TYPE(hfx_potential_type)                           :: potential_parameter
     308              :       TYPE(hfx_screen_coeff_type), &
     309              :          DIMENSION(:, :, :, :), POINTER                  :: coeffs_set
     310              :       TYPE(hfx_screen_coeff_type), DIMENSION(:, :), &
     311              :          POINTER                                         :: coeffs_kind
     312              :       TYPE(hfx_screen_coeff_type), &
     313              :          DIMENSION(:, :, :, :, :, :), POINTER            :: coeffs_pgf, radii_pgf
     314              :       INTEGER, INTENT(IN)                                :: max_set, max_pgf, n_threads, i_thread
     315              :       REAL(dp), DIMENSION(:), POINTER                    :: p_work
     316              : 
     317              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'calc_screening_functions'
     318              : 
     319              :       INTEGER                                            :: handle, i, ikind, ipgf, iset, jkind, &
     320              :                                                             jpgf, jset, la, lb, ncoa, ncob, nkind, &
     321              :                                                             nseta, nsetb, sgfa, sgfb
     322         1298 :       INTEGER, DIMENSION(:), POINTER                     :: la_max, la_min, lb_max, lb_min, npgfa, &
     323         1298 :                                                             npgfb, nsgfa, nsgfb
     324         1298 :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfa, first_sgfb
     325              :       REAL(dp) :: kind_radius_a, kind_radius_b, max_contraction_a, max_contraction_b, max_val, &
     326              :          max_val_temp, R1, ra(3), radius, rb(3), x(2)
     327         1298 :       REAL(dp), DIMENSION(:), POINTER                    :: set_radius_a, set_radius_b
     328         1298 :       REAL(dp), DIMENSION(:, :), POINTER                 :: rpgfa, rpgfb, sphi_a, sphi_b, zeta, zetb
     329              :       REAL(dp), SAVE                                     :: DATA(2, 0:100)
     330              :       TYPE(gto_basis_set_type), POINTER                  :: orb_basis
     331              :       TYPE(hfx_screen_coeff_type), DIMENSION(:, :), &
     332         1298 :          POINTER                                         :: tmp_R_1
     333         1298 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     334              :       TYPE(qs_kind_type), POINTER                        :: qs_kind
     335              : 
     336         2596 : !$OMP MASTER
     337         1298 :       CALL timeset(routineN, handle)
     338              : !$OMP END MASTER
     339              : 
     340              :       CALL get_qs_env(qs_env=qs_env, &
     341         1298 :                       qs_kind_set=qs_kind_set)
     342              : 
     343         1298 :       nkind = SIZE(qs_kind_set, 1)
     344              : 
     345         1298 : !$OMP MASTER
     346      1254464 :       ALLOCATE (coeffs_pgf(max_pgf, max_pgf, max_set, max_set, nkind, nkind))
     347              : 
     348         3698 :       DO ikind = 1, nkind
     349         9382 :          DO jkind = 1, nkind
     350        24138 :             DO iset = 1, max_set
     351        86924 :                DO jset = 1, max_set
     352       285068 :                   DO ipgf = 1, max_pgf
     353      1217346 :                      DO jpgf = 1, max_pgf
     354      3048824 :                         coeffs_pgf(jpgf, ipgf, jset, iset, jkind, ikind)%x(:) = 0.0_dp
     355              :                      END DO
     356              :                   END DO
     357              :                END DO
     358              :             END DO
     359              :          END DO
     360              :       END DO
     361              : 
     362              : !$OMP END MASTER
     363         1298 : !$OMP BARRIER
     364         1298 :       ra = 0.0_dp
     365         1298 :       rb = 0.0_dp
     366         3698 :       DO ikind = 1, nkind
     367         2400 :          NULLIFY (qs_kind, orb_basis)
     368         2400 :          qs_kind => qs_kind_set(ikind)
     369         2400 :          CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     370         2400 :          NULLIFY (la_max, la_min, npgfa, zeta)
     371              : 
     372         2400 :          la_max => basis_parameter(ikind)%lmax
     373         2400 :          la_min => basis_parameter(ikind)%lmin
     374         2400 :          npgfa => basis_parameter(ikind)%npgf
     375         2400 :          nseta = basis_parameter(ikind)%nset
     376         2400 :          zeta => basis_parameter(ikind)%zet
     377         2400 :          set_radius_a => basis_parameter(ikind)%set_radius
     378         2400 :          first_sgfa => basis_parameter(ikind)%first_sgf
     379         2400 :          sphi_a => basis_parameter(ikind)%sphi
     380         2400 :          nsgfa => basis_parameter(ikind)%nsgf
     381         2400 :          rpgfa => basis_parameter(ikind)%pgf_radius
     382              : 
     383         9382 :          DO jkind = 1, nkind
     384         5684 :             NULLIFY (qs_kind, orb_basis)
     385         5684 :             qs_kind => qs_kind_set(jkind)
     386         5684 :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     387         5684 :             NULLIFY (lb_max, lb_min, npgfb, zetb)
     388              : 
     389         5684 :             lb_max => basis_parameter(jkind)%lmax
     390         5684 :             lb_min => basis_parameter(jkind)%lmin
     391         5684 :             npgfb => basis_parameter(jkind)%npgf
     392         5684 :             nsetb = basis_parameter(jkind)%nset
     393         5684 :             zetb => basis_parameter(jkind)%zet
     394         5684 :             set_radius_b => basis_parameter(jkind)%set_radius
     395         5684 :             first_sgfb => basis_parameter(jkind)%first_sgf
     396         5684 :             sphi_b => basis_parameter(jkind)%sphi
     397         5684 :             nsgfb => basis_parameter(jkind)%nsgf
     398         5684 :             rpgfb => basis_parameter(jkind)%pgf_radius
     399              : 
     400        22048 :             DO iset = 1, nseta
     401        13964 :                ncoa = npgfa(iset)*ncoset(la_max(iset))
     402        13964 :                sgfa = first_sgfa(1, iset)
     403       553060 :                max_contraction_a = MAXVAL([(SUM(ABS(sphi_a(1:ncoa, i))), i=sgfa, sgfa + nsgfa(iset) - 1)])
     404        65550 :                DO jset = 1, nsetb
     405        45902 :                   ncob = npgfb(jset)*ncoset(lb_max(jset))
     406        45902 :                   sgfb = first_sgfb(1, jset)
     407      1255716 :                   max_contraction_b = MAXVAL([(SUM(ABS(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)])
     408        45902 :                   radius = set_radius_a(iset) + set_radius_b(jset)
     409       137764 :                   DO ipgf = 1, npgfa(iset)
     410       282748 :                      DO jpgf = 1, npgfb(jset)
     411       158948 :                         radius = rpgfa(ipgf, iset) + rpgfb(jpgf, jset)
     412     16212696 :                         DO i = i_thread, 100, n_threads
     413     16053748 :                            rb(1) = 0.0_dp + REAL(i, dp)*0.01_dp*radius
     414     16053748 :                            max_val = 0.0_dp
     415              :                            R1 = MAX(0.0_dp, radii_pgf(jpgf, ipgf, jset, iset, jkind, ikind)%x(1)*rb(1)**2 + &
     416     16053748 :                                     radii_pgf(jpgf, ipgf, jset, iset, jkind, ikind)%x(2))
     417     37162748 :                            DO la = la_min(iset), la_max(iset)
     418     66254788 :                               DO lb = lb_min(jset), lb_max(jset)
     419              :                                  !Build primitives
     420     29092040 :                                  max_val_temp = 0.0_dp
     421              :                                  CALL evaluate_eri_screen(lib, ra, rb, ra, rb, &
     422              :                                                           zeta(ipgf, iset), zetb(jpgf, jset), zeta(ipgf, iset), zetb(jpgf, jset), &
     423              :                                                           la, lb, la, lb, &
     424     29092040 :                                                           max_val_temp, potential_parameter, R1, R1, p_work)
     425     50201040 :                                  max_val = MAX(max_val, max_val_temp)
     426              :                               END DO !lb
     427              :                            END DO !la
     428     16053748 :                            max_val = SQRT(max_val)
     429     16053748 :                            max_val = max_val*max_contraction_a*max_contraction_b
     430     16053748 :                            DATA(1, i) = rb(1)
     431     16212696 :                            IF (max_val == 0.0_dp) THEN
     432            0 :                               DATA(2, i) = powell_min_log
     433              :                            ELSE
     434     16053748 :                               DATA(2, i) = LOG10((max_val))
     435              :                            END IF
     436              :                         END DO
     437       158948 : !$OMP BARRIER
     438       158948 : !$OMP MASTER
     439       158948 :                         CALL optimize_it(DATA, x, powell_min_log)
     440       476844 :                         coeffs_pgf(jpgf, ipgf, jset, iset, jkind, ikind)%x = x
     441              : !$OMP END MASTER
     442       236846 : !$OMP BARRIER
     443              : 
     444              :                      END DO
     445              :                   END DO
     446              :                END DO
     447              :             END DO
     448              :          END DO
     449              :       END DO
     450              : 
     451         1298 : !$OMP MASTER
     452        99708 :       ALLOCATE (coeffs_set(max_set, max_set, nkind, nkind))
     453              : 
     454         3698 :       DO ikind = 1, nkind
     455         9382 :          DO jkind = 1, nkind
     456        24138 :             DO iset = 1, max_set
     457        86924 :                DO jset = 1, max_set
     458       211612 :                   coeffs_set(jset, iset, jkind, ikind)%x(:) = 0.0_dp
     459              :                END DO
     460              :             END DO
     461              :          END DO
     462              :       END DO
     463              : !$OMP END MASTER
     464         1298 : !$OMP BARRIER
     465         1298 :       ra = 0.0_dp
     466         1298 :       rb = 0.0_dp
     467         3698 :       DO ikind = 1, nkind
     468         2400 :          NULLIFY (qs_kind, orb_basis)
     469         2400 :          qs_kind => qs_kind_set(ikind)
     470         2400 :          CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     471         2400 :          NULLIFY (la_max, la_min, npgfa, zeta)
     472              : !      CALL get_gto_basis_set(gto_basis_set=orb_basis,&
     473              : !                             lmax=la_max,&
     474              : !                             lmin=la_min,&
     475              : !                             npgf=npgfa,&
     476              : !                             nset=nseta,&
     477              : !                             zet=zeta,&
     478              : !                             set_radius=set_radius_a,&
     479              : !                             first_sgf=first_sgfa,&
     480              : !                             sphi=sphi_a,&
     481              : !                             nsgf_set=nsgfa)
     482         2400 :          la_max => basis_parameter(ikind)%lmax
     483         2400 :          la_min => basis_parameter(ikind)%lmin
     484         2400 :          npgfa => basis_parameter(ikind)%npgf
     485         2400 :          nseta = basis_parameter(ikind)%nset
     486         2400 :          zeta => basis_parameter(ikind)%zet
     487         2400 :          set_radius_a => basis_parameter(ikind)%set_radius
     488         2400 :          first_sgfa => basis_parameter(ikind)%first_sgf
     489         2400 :          sphi_a => basis_parameter(ikind)%sphi
     490         2400 :          nsgfa => basis_parameter(ikind)%nsgf
     491              : 
     492         9382 :          DO jkind = 1, nkind
     493         5684 :             NULLIFY (qs_kind, orb_basis)
     494         5684 :             qs_kind => qs_kind_set(jkind)
     495         5684 :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     496         5684 :             NULLIFY (lb_max, lb_min, npgfb, zetb)
     497              : 
     498         5684 :             lb_max => basis_parameter(jkind)%lmax
     499         5684 :             lb_min => basis_parameter(jkind)%lmin
     500         5684 :             npgfb => basis_parameter(jkind)%npgf
     501         5684 :             nsetb = basis_parameter(jkind)%nset
     502         5684 :             zetb => basis_parameter(jkind)%zet
     503         5684 :             set_radius_b => basis_parameter(jkind)%set_radius
     504         5684 :             first_sgfb => basis_parameter(jkind)%first_sgf
     505         5684 :             sphi_b => basis_parameter(jkind)%sphi
     506         5684 :             nsgfb => basis_parameter(jkind)%nsgf
     507              : 
     508        22048 :             DO iset = 1, nseta
     509        13964 :                ncoa = npgfa(iset)*ncoset(la_max(iset))
     510        13964 :                sgfa = first_sgfa(1, iset)
     511       553060 :                max_contraction_a = MAXVAL([(SUM(ABS(sphi_a(1:ncoa, i))), i=sgfa, sgfa + nsgfa(iset) - 1)])
     512        65550 :                DO jset = 1, nsetb
     513        45902 :                   ncob = npgfb(jset)*ncoset(lb_max(jset))
     514        45902 :                   sgfb = first_sgfb(1, jset)
     515      1255716 :                   max_contraction_b = MAXVAL([(SUM(ABS(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)])
     516        45902 :                   radius = set_radius_a(iset) + set_radius_b(jset)
     517        45902 :                   tmp_R_1 => radii_pgf(:, :, jset, iset, jkind, ikind)
     518      4682004 :                   DO i = i_thread, 100, n_threads
     519      4636102 :                      rb(1) = 0.0_dp + REAL(i, dp)*0.01_dp*radius
     520      4636102 :                      max_val = 0.0_dp
     521              :                      CALL screen4(lib, ra, rb, &
     522              :                                   zeta(:, iset), zetb(:, jset), &
     523              :                                   la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
     524              :                                   npgfa(iset), npgfb(jset), &
     525      4636102 :                                   max_val, potential_parameter, tmp_R_1, rb(1)**2, p_work)
     526      4636102 :                      max_val = SQRT(max_val)
     527      4636102 :                      max_val = max_val*max_contraction_a*max_contraction_b
     528      4636102 :                      DATA(1, i) = rb(1)
     529      4682004 :                      IF (max_val == 0.0_dp) THEN
     530            0 :                         DATA(2, i) = powell_min_log
     531              :                      ELSE
     532      4636102 :                         DATA(2, i) = LOG10((max_val))
     533              :                      END IF
     534              :                   END DO
     535        45902 : !$OMP BARRIER
     536        45902 : !$OMP MASTER
     537        45902 :                   CALL optimize_it(DATA, x, powell_min_log)
     538       137706 :                   coeffs_set(jset, iset, jkind, ikind)%x = x
     539              : !$OMP END MASTER
     540        59866 : !$OMP BARRIER
     541              :                END DO
     542              :             END DO
     543              : 
     544              :          END DO
     545              :       END DO
     546              : 
     547              :       ! ** now kinds
     548         1298 : !$OMP MASTER
     549        15872 :       ALLOCATE (coeffs_kind(nkind, nkind))
     550              : 
     551         3698 :       DO ikind = 1, nkind
     552         9382 :          DO jkind = 1, nkind
     553        19452 :             coeffs_kind(jkind, ikind)%x(:) = 0.0_dp
     554              :          END DO
     555              :       END DO
     556              : !$OMP END MASTER
     557         1298 :       ra = 0.0_dp
     558         1298 :       rb = 0.0_dp
     559         3698 :       DO ikind = 1, nkind
     560         2400 :          NULLIFY (qs_kind, orb_basis)
     561         2400 :          qs_kind => qs_kind_set(ikind)
     562         2400 :          CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     563         2400 :          NULLIFY (la_max, la_min, npgfa, zeta)
     564              : 
     565         2400 :          la_max => basis_parameter(ikind)%lmax
     566         2400 :          la_min => basis_parameter(ikind)%lmin
     567         2400 :          npgfa => basis_parameter(ikind)%npgf
     568         2400 :          nseta = basis_parameter(ikind)%nset
     569         2400 :          zeta => basis_parameter(ikind)%zet
     570         2400 :          kind_radius_a = basis_parameter(ikind)%kind_radius
     571         2400 :          first_sgfa => basis_parameter(ikind)%first_sgf
     572         2400 :          sphi_a => basis_parameter(ikind)%sphi
     573         2400 :          nsgfa => basis_parameter(ikind)%nsgf
     574              : 
     575         9382 :          DO jkind = 1, nkind
     576         5684 :             NULLIFY (qs_kind, orb_basis)
     577         5684 :             qs_kind => qs_kind_set(jkind)
     578         5684 :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     579         5684 :             NULLIFY (lb_max, lb_min, npgfb, zetb)
     580              : 
     581         5684 :             lb_max => basis_parameter(jkind)%lmax
     582         5684 :             lb_min => basis_parameter(jkind)%lmin
     583         5684 :             npgfb => basis_parameter(jkind)%npgf
     584         5684 :             nsetb = basis_parameter(jkind)%nset
     585         5684 :             zetb => basis_parameter(jkind)%zet
     586         5684 :             kind_radius_b = basis_parameter(jkind)%kind_radius
     587         5684 :             first_sgfb => basis_parameter(jkind)%first_sgf
     588         5684 :             sphi_b => basis_parameter(jkind)%sphi
     589         5684 :             nsgfb => basis_parameter(jkind)%nsgf
     590              : 
     591         5684 :             radius = kind_radius_a + kind_radius_b
     592        19648 :             DO iset = 1, nseta
     593        13964 :                ncoa = npgfa(iset)*ncoset(la_max(iset))
     594        13964 :                sgfa = first_sgfa(1, iset)
     595       553060 :                max_contraction_a = MAXVAL([(SUM(ABS(sphi_a(1:ncoa, i))), i=sgfa, sgfa + nsgfa(iset) - 1)])
     596        65550 :                DO jset = 1, nsetb
     597        45902 :                   ncob = npgfb(jset)*ncoset(lb_max(jset))
     598        45902 :                   sgfb = first_sgfb(1, jset)
     599      1255716 :                   max_contraction_b = MAXVAL([(SUM(ABS(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)])
     600      4695968 :                   DO i = i_thread, 100, n_threads
     601      4636102 :                      rb(1) = 0.0_dp + REAL(i, dp)*0.01_dp*radius
     602      4636102 :                      max_val = 0.0_dp
     603      4636102 :                      tmp_R_1 => radii_pgf(:, :, jset, iset, jkind, ikind)
     604              :                      CALL screen4(lib, ra, rb, &
     605              :                                   zeta(:, iset), zetb(:, jset), &
     606              :                                   la_min(iset), la_max(iset), lb_min(jset), lb_max(jset), &
     607              :                                   npgfa(iset), npgfb(jset), &
     608      4636102 :                                   max_val, potential_parameter, tmp_R_1, rb(1)**2, p_work)
     609      4636102 :                      DATA(1, i) = rb(1)
     610      4636102 :                      max_val = SQRT(max_val)
     611      4636102 :                      max_val = max_val*max_contraction_a*max_contraction_b
     612      4682004 :                      IF (max_val == 0.0_dp) THEN
     613       147396 :                         DATA(2, i) = MAX(powell_min_log, DATA(2, i))
     614              :                      ELSE
     615      4488706 :                         DATA(2, i) = MAX(LOG10(max_val), DATA(2, i))
     616              :                      END IF
     617              :                   END DO
     618              :                END DO
     619              :             END DO
     620         5684 : !$OMP BARRIER
     621         5684 : !$OMP MASTER
     622         5684 :             CALL optimize_it(DATA, x, powell_min_log)
     623        17052 :             coeffs_kind(jkind, ikind)%x = x
     624              : !$OMP END MASTER
     625         8084 : !$OMP BARRIER
     626              :          END DO
     627              :       END DO
     628              : 
     629         1298 : !$OMP MASTER
     630         1298 :       CALL timestop(handle)
     631              : !$OMP END MASTER
     632              : 
     633         1298 :    END SUBROUTINE calc_screening_functions
     634              : 
     635              : ! **************************************************************************************************
     636              : !> \brief calculates radius functions for longrange screening
     637              : !> \param qs_env qs_env
     638              : !> \param basis_parameter ...
     639              : !> \param radii_pgf pgf based coefficients
     640              : !> \param max_set Maximum Number of basis set sets in the system
     641              : !> \param max_pgf Maximum Number of basis set pgfs in the system
     642              : !> \param eps_schwarz ...
     643              : !> \param n_threads ...
     644              : !> \param i_thread Thread ID of current task
     645              : !> \par History
     646              : !>     02.2009 created [Manuel Guidon]
     647              : !> \author Manuel Guidon
     648              : !> \note
     649              : !>      This routine calculates the pair-distribution radius of a product
     650              : !>      Gaussian and uses the powell optimiztion routines in order to fit
     651              : !>      the results in the following form:
     652              : !>
     653              : !>                 (ab| = (ab(Rab) = c2*Rab^2 + c0
     654              : !>
     655              : ! **************************************************************************************************
     656              : 
     657         1298 :    SUBROUTINE calc_pair_dist_radii(qs_env, basis_parameter, &
     658              :                                    radii_pgf, max_set, max_pgf, eps_schwarz, &
     659              :                                    n_threads, i_thread)
     660              : 
     661              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     662              :       TYPE(hfx_basis_type), DIMENSION(:), POINTER        :: basis_parameter
     663              :       TYPE(hfx_screen_coeff_type), &
     664              :          DIMENSION(:, :, :, :, :, :), POINTER            :: radii_pgf
     665              :       INTEGER, INTENT(IN)                                :: max_set, max_pgf
     666              :       REAL(dp)                                           :: eps_schwarz
     667              :       INTEGER, INTENT(IN)                                :: n_threads, i_thread
     668              : 
     669              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'calc_pair_dist_radii'
     670              : 
     671              :       INTEGER                                            :: handle, i, ikind, ipgf, iset, jkind, &
     672              :                                                             jpgf, jset, la, lb, ncoa, ncob, nkind, &
     673              :                                                             nseta, nsetb, sgfa, sgfb
     674         1298 :       INTEGER, DIMENSION(:), POINTER                     :: la_max, la_min, lb_max, lb_min, npgfa, &
     675         1298 :                                                             npgfb, nsgfa, nsgfb
     676         1298 :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfa, first_sgfb
     677              :       REAL(dp) :: cutoff, ff, max_contraction_a, max_contraction_b, prefactor, R1, R_max, ra(3), &
     678              :          rab(3), rab2, radius, rap(3), rb(3), rp(3), x(2), zetp
     679         1298 :       REAL(dp), DIMENSION(:, :), POINTER                 :: rpgfa, rpgfb, sphi_a, sphi_b, zeta, zetb
     680              :       REAL(dp), SAVE                                     :: DATA(2, 0:100)
     681              :       TYPE(gto_basis_set_type), POINTER                  :: orb_basis
     682         1298 :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     683              :       TYPE(qs_kind_type), POINTER                        :: qs_kind
     684              : 
     685         2596 : !$OMP MASTER
     686         1298 :       CALL timeset(routineN, handle)
     687              : !$OMP END MASTER
     688              :       CALL get_qs_env(qs_env=qs_env, &
     689         1298 :                       qs_kind_set=qs_kind_set)
     690              : 
     691         1298 :       nkind = SIZE(qs_kind_set, 1)
     692         1298 :       ra = 0.0_dp
     693         1298 :       rb = 0.0_dp
     694         1298 : !$OMP MASTER
     695      1254464 :       ALLOCATE (radii_pgf(max_pgf, max_pgf, max_set, max_set, nkind, nkind))
     696         3698 :       DO ikind = 1, nkind
     697         9382 :          DO jkind = 1, nkind
     698        24138 :             DO iset = 1, max_set
     699        86924 :                DO jset = 1, max_set
     700       285068 :                   DO ipgf = 1, max_pgf
     701      1217346 :                      DO jpgf = 1, max_pgf
     702      3048824 :                         radii_pgf(jpgf, ipgf, jset, iset, jkind, ikind)%x(:) = 0.0_dp
     703              :                      END DO
     704              :                   END DO
     705              :                END DO
     706              :             END DO
     707              :          END DO
     708              :       END DO
     709              : 
     710         1298 :       DATA = 0.0_dp
     711              : !$OMP END MASTER
     712         1298 : !$OMP BARRIER
     713              : 
     714         3698 :       DO ikind = 1, nkind
     715         2400 :          NULLIFY (qs_kind, orb_basis)
     716         2400 :          qs_kind => qs_kind_set(ikind)
     717         2400 :          CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     718         2400 :          NULLIFY (la_max, la_min, npgfa, zeta)
     719              : 
     720         2400 :          la_max => basis_parameter(ikind)%lmax
     721         2400 :          la_min => basis_parameter(ikind)%lmin
     722         2400 :          npgfa => basis_parameter(ikind)%npgf
     723         2400 :          nseta = basis_parameter(ikind)%nset
     724         2400 :          zeta => basis_parameter(ikind)%zet
     725         2400 :          first_sgfa => basis_parameter(ikind)%first_sgf
     726         2400 :          sphi_a => basis_parameter(ikind)%sphi
     727         2400 :          nsgfa => basis_parameter(ikind)%nsgf
     728         2400 :          rpgfa => basis_parameter(ikind)%pgf_radius
     729              : 
     730         9382 :          DO jkind = 1, nkind
     731         5684 :             NULLIFY (qs_kind, orb_basis)
     732         5684 :             qs_kind => qs_kind_set(jkind)
     733         5684 :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis)
     734         5684 :             NULLIFY (lb_max, lb_min, npgfb, zetb)
     735              : 
     736         5684 :             lb_max => basis_parameter(jkind)%lmax
     737         5684 :             lb_min => basis_parameter(jkind)%lmin
     738         5684 :             npgfb => basis_parameter(jkind)%npgf
     739         5684 :             nsetb = basis_parameter(jkind)%nset
     740         5684 :             zetb => basis_parameter(jkind)%zet
     741         5684 :             first_sgfb => basis_parameter(jkind)%first_sgf
     742         5684 :             sphi_b => basis_parameter(jkind)%sphi
     743         5684 :             nsgfb => basis_parameter(jkind)%nsgf
     744         5684 :             rpgfb => basis_parameter(jkind)%pgf_radius
     745              : 
     746        22048 :             DO iset = 1, nseta
     747        13964 :                ncoa = npgfa(iset)*ncoset(la_max(iset))
     748        13964 :                sgfa = first_sgfa(1, iset)
     749       553060 :                max_contraction_a = MAXVAL([(SUM(ABS(sphi_a(1:ncoa, i))), i=sgfa, sgfa + nsgfa(iset) - 1)])
     750        65550 :                DO jset = 1, nsetb
     751        45902 :                   ncob = npgfb(jset)*ncoset(lb_max(jset))
     752        45902 :                   sgfb = first_sgfb(1, jset)
     753      1255716 :                   max_contraction_b = MAXVAL([(SUM(ABS(sphi_b(1:ncob, i))), i=sgfb, sgfb + nsgfb(jset) - 1)])
     754       137764 :                   DO ipgf = 1, npgfa(iset)
     755       282748 :                      DO jpgf = 1, npgfb(jset)
     756       158948 :                         radius = rpgfa(ipgf, iset) + rpgfb(jpgf, jset)
     757       158948 :                         DO i = i_thread, 100, n_threads
     758     16053748 :                            rb(1) = 0.0_dp + 0.01_dp*radius*i
     759     16053748 :                            R_max = 0.0_dp
     760     37162748 :                            DO la = la_min(iset), la_max(iset)
     761     66254788 :                               DO lb = lb_min(jset), lb_max(jset)
     762     29092040 :                                  zetp = zeta(ipgf, iset) + zetb(jpgf, jset)
     763     29092040 :                                  ff = zetb(jpgf, jset)/zetp
     764     29092040 :                                  rab = 0.0_dp
     765     29092040 :                                  rab(1) = rb(1)
     766     29092040 :                                  rab2 = rb(1)**2
     767     29092040 :                                  prefactor = EXP(-zeta(ipgf, iset)*ff*rab2)
     768    116368160 :                                  rap(:) = ff*rab(:)
     769    116368160 :                                  rp(:) = ra(:) + rap(:)
     770    116368160 :                                  rb(:) = ra(:) + rab(:)
     771     29092040 :                                  cutoff = 1.0_dp
     772              :                                  R1 = exp_radius_very_extended( &
     773              :                                       la, la, lb, lb, ra=ra, rb=rb, rp=rp, &
     774     29092040 :                                       zetp=zetp, eps=eps_schwarz, prefactor=prefactor, cutoff=cutoff, epsabs=1.0E-12_dp)
     775     50201040 :                                  R_max = MAX(R_max, R1)
     776              :                               END DO
     777              :                            END DO
     778     16053748 :                            DATA(1, i) = rb(1)
     779     16053748 :                            DATA(2, i) = R_max
     780              :                         END DO
     781              :                         ! the radius can not be negative, we take that into account in the code as well by using a MAX
     782              :                         ! the functional form we use for fitting does not seem particularly accurate
     783       158948 : !$OMP BARRIER
     784       158948 : !$OMP MASTER
     785       158948 :                         CALL optimize_it(DATA, x, 0.0_dp)
     786       476844 :                         radii_pgf(jpgf, ipgf, jset, iset, jkind, ikind)%x = x
     787              : !$OMP END MASTER
     788       236846 : !$OMP BARRIER
     789              :                      END DO !jpgf
     790              :                   END DO !ipgf
     791              :                END DO
     792              :             END DO
     793              :          END DO
     794              :       END DO
     795         1298 : !$OMP MASTER
     796         1298 :       CALL timestop(handle)
     797              : !$OMP END MASTER
     798         1298 :    END SUBROUTINE calc_pair_dist_radii
     799              : 
     800              : !
     801              : !
     802              : ! little driver routine for the powell minimizer
     803              : ! data is the data to fit, x is of the form (x(1)*DATA(1)**2+x(2))
     804              : ! only values of DATA(2) larger than fmin are taken into account
     805              : ! it constructs an approximate upper bound of the fitted function
     806              : !
     807              : !
     808              : ! **************************************************************************************************
     809              : !> \brief ...
     810              : !> \param DATA ...
     811              : !> \param x ...
     812              : !> \param fmin ...
     813              : ! **************************************************************************************************
     814       369482 :    SUBROUTINE optimize_it(DATA, x, fmin)
     815              : 
     816              :       REAL(KIND=dp), INTENT(IN)                          :: DATA(2, 0:100)
     817              :       REAL(KIND=dp), INTENT(OUT)                         :: x(2)
     818              :       REAL(KIND=dp), INTENT(IN)                          :: fmin
     819              : 
     820              :       INTEGER                                            :: i, k
     821              :       REAL(KIND=dp)                                      :: f, large_weight, small_weight, weight
     822              :       TYPE(opt_state_type)                               :: opt_state
     823              : 
     824              : ! initial values
     825              : 
     826       369482 :       x(1) = 0.0_dp
     827       369482 :       x(2) = 0.0_dp
     828              : 
     829              :       ! we go in two steps, first we do the symmetric weight to get a good, unique initial guess
     830              :       ! we restart afterwards for the assym.
     831              :       ! the assym function appears to have several local minima, depending on the data to fit
     832              :       ! the loop over k can make the switch gradual, but there is not much need, seemingly
     833       738964 :       DO k = 0, 4, 4
     834              : 
     835       738964 :          small_weight = 1.0_dp
     836       738964 :          large_weight = small_weight*(10.0_dp**k)
     837              : 
     838              :          ! init opt run
     839       738964 :          opt_state%state = 0
     840       738964 :          opt_state%nvar = 2
     841       738964 :          opt_state%iprint = 3
     842       738964 :          opt_state%unit = default_output_unit
     843       738964 :          opt_state%maxfun = 100000
     844       738964 :          opt_state%rhobeg = 0.1_dp
     845       738964 :          opt_state%rhoend = 0.000001_dp
     846              : 
     847     57685802 :          DO
     848              : 
     849              :             ! compute function
     850     58424766 :             IF (opt_state%state == 2) THEN
     851     56207874 :                opt_state%f = 0.0_dp
     852   5733203148 :                DO i = 0, 100
     853   5676995274 :                   f = x(1)*DATA(1, i)**2 + x(2)
     854   5676995274 :                   IF (f > DATA(2, i)) THEN
     855              :                      weight = small_weight
     856              :                   ELSE
     857   1211007972 :                      weight = large_weight
     858              :                   END IF
     859   5733203148 :                   IF (DATA(2, i) > fmin) opt_state%f = opt_state%f + weight*(f - DATA(2, i))**2
     860              :                END DO
     861              :             END IF
     862              : 
     863     58424766 :             IF (opt_state%state == -1) EXIT
     864     57685802 :             CALL powell_optimize(opt_state%nvar, x, opt_state)
     865              :          END DO
     866              : 
     867              :          ! dealloc mem
     868       738964 :          opt_state%state = 8
     869      1108446 :          CALL powell_optimize(opt_state%nvar, x, opt_state)
     870              : 
     871              :       END DO
     872              : 
     873       369482 :    END SUBROUTINE optimize_it
     874              : 
     875              : ! **************************************************************************************************
     876              : !> \brief Given a 2d index pair, this function returns a 1d index pair for
     877              : !>        a symmetric upper triangle NxN matrix
     878              : !>        The compiler should inline this function, therefore it appears in
     879              : !>        several modules
     880              : !> \param i 2d index
     881              : !> \param j 2d index
     882              : !> \param N matrix size
     883              : !> \return ...
     884              : !> \par History
     885              : !>      03.2009 created [Manuel Guidon]
     886              : !> \author Manuel Guidon
     887              : ! **************************************************************************************************
     888        93588 :    PURE FUNCTION get_1D_idx(i, j, N)
     889              :       INTEGER, INTENT(IN)                                :: i, j
     890              :       INTEGER(int_8), INTENT(IN)                         :: N
     891              :       INTEGER(int_8)                                     :: get_1D_idx
     892              : 
     893              :       INTEGER(int_8)                                     :: min_ij
     894              : 
     895        93588 :       min_ij = MIN(i, j)
     896        93588 :       get_1D_idx = min_ij*N + MAX(i, j) - (min_ij - 1)*min_ij/2 - N
     897              : 
     898        93588 :    END FUNCTION get_1D_idx
     899              : 
     900              : END MODULE hfx_screening_methods
        

Generated by: LCOV version 2.0-1