LCOV - code coverage report
Current view: top level - src - qs_oce_methods.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:42dac4a) Lines: 73.2 % 310 227
Test Date: 2025-07-25 12:55:17 Functions: 85.7 % 7 6

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Routines for the construction of the coefficients
      10              : !>      for the expansion  of the atomic
      11              : !>      densities rho1_hard and rho1_soft in terms of primitive spherical gaussians.
      12              : !> \par History
      13              : !>      05-2004 created
      14              : !> \author MI
      15              : ! **************************************************************************************************
      16              : MODULE qs_oce_methods
      17              : 
      18              :    USE ai_overlap,                      ONLY: overlap
      19              :    USE ao_util,                         ONLY: exp_radius
      20              :    USE basis_set_types,                 ONLY: get_gto_basis_set,&
      21              :                                               gto_basis_set_type
      22              :    USE block_p_types,                   ONLY: block_p_type
      23              :    USE kinds,                           ONLY: dp
      24              :    USE orbital_pointers,                ONLY: init_orbital_pointers,&
      25              :                                               nco,&
      26              :                                               ncoset,&
      27              :                                               nso
      28              :    USE orbital_transformation_matrices, ONLY: orbtramat
      29              :    USE particle_types,                  ONLY: particle_type
      30              :    USE paw_basis_types,                 ONLY: get_paw_basis_info
      31              :    USE paw_proj_set_types,              ONLY: get_paw_proj_set,&
      32              :                                               paw_proj_set_type
      33              :    USE qs_kind_types,                   ONLY: get_qs_kind,&
      34              :                                               get_qs_kind_set,&
      35              :                                               qs_kind_type
      36              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type
      37              :    USE sap_kind_types,                  ONLY: clist_type,&
      38              :                                               sap_int_type,&
      39              :                                               sap_sort
      40              : #include "./base/base_uses.f90"
      41              : 
      42              :    IMPLICIT NONE
      43              : 
      44              :    PRIVATE
      45              : 
      46              :    ! Global parameters (only in this module)
      47              : 
      48              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_oce_methods'
      49              : 
      50              :    ! Public subroutines
      51              : 
      52              :    PUBLIC :: build_oce_matrices, proj_blk, prj_scatter, prj_gather
      53              : 
      54              : CONTAINS
      55              : 
      56              : ! **************************************************************************************************
      57              : !> \brief ...
      58              : !> \param oces ...
      59              : !> \param atom_ka ...
      60              : !> \param atom_kb ...
      61              : !> \param rab ...
      62              : !> \param nder ...
      63              : !> \param sgf_list ...
      64              : !> \param nsgf_cnt ...
      65              : !> \param sgf_soft_only ...
      66              : !> \param eps_fit ...
      67              : ! **************************************************************************************************
      68        66628 :    SUBROUTINE build_oce_block(oces, atom_ka, atom_kb, rab, nder, sgf_list, nsgf_cnt, sgf_soft_only, &
      69              :                               eps_fit)
      70              : 
      71              :       TYPE(block_p_type), DIMENSION(:), POINTER          :: oces
      72              :       TYPE(qs_kind_type), POINTER                        :: atom_ka, atom_kb
      73              :       REAL(KIND=dp), DIMENSION(3)                        :: rab
      74              :       INTEGER, INTENT(IN)                                :: nder
      75              :       INTEGER, DIMENSION(:), INTENT(OUT)                 :: sgf_list
      76              :       INTEGER, INTENT(OUT)                               :: nsgf_cnt
      77              :       LOGICAL, INTENT(OUT)                               :: sgf_soft_only
      78              :       REAL(KIND=dp), INTENT(IN)                          :: eps_fit
      79              : 
      80              :       INTEGER :: first_col, ic, ider, ig1, igau, ip, ipgf, is, isgfb, isgfb_cnt, isp, jc, jset, &
      81              :          lds, lm, lpoint, lprj, lsgfb, lsgfb_cnt, lshell, m, m1, maxcob, maxder, maxlb, maxlprj, &
      82              :          maxnprja, maxsoa, msab, n, ncob, np_car, np_sph, nsatbas, nseta, nsetb, nsoatot, &
      83              :          ntotsgfb, sgf_hard_only
      84        66628 :       INTEGER, DIMENSION(:), POINTER                     :: fp_cara, fp_spha, lb_max, lb_min, npgfb, &
      85        66628 :                                                             nprjla, nsgfb
      86        66628 :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfb
      87              :       LOGICAL                                            :: calculate_forces, paw_atom_a, paw_atom_b
      88              :       REAL(KIND=dp)                                      :: dab, hard_radius_a, hard_radius_b, &
      89              :                                                             radius, rcprja
      90        66628 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: ovs, spa_sb
      91        66628 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: s
      92        66628 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: set_radius_b, zisomina, zisominb
      93        66628 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: csprj, rpgfb, rzetprja, spa_tmp, sphi_b, &
      94        66628 :                                                             zetb, zetprja
      95              :       TYPE(gto_basis_set_type), POINTER                  :: basis_1c_a, orb_basis_b
      96              :       TYPE(paw_proj_set_type), POINTER                   :: paw_proj_a, paw_proj_b
      97              : 
      98        66628 :       NULLIFY (basis_1c_a, paw_proj_a)
      99              :       CALL get_qs_kind(qs_kind=atom_ka, basis_set=basis_1c_a, basis_type="GAPW_1C", &
     100              :                        paw_proj_set=paw_proj_a, paw_atom=paw_atom_a, &
     101        66628 :                        hard_radius=hard_radius_a)
     102              : 
     103        66628 :       NULLIFY (orb_basis_b, paw_proj_b)
     104              :       CALL get_qs_kind(qs_kind=atom_kb, basis_set=orb_basis_b, &
     105              :                        paw_proj_set=paw_proj_b, paw_atom=paw_atom_b, &
     106        66628 :                        hard_radius=hard_radius_b)
     107              : 
     108        66628 :       IF (.NOT. paw_atom_a) RETURN
     109              : 
     110        66628 :       NULLIFY (nprjla, fp_cara, fp_spha, rzetprja, zetprja)
     111              :       CALL get_paw_proj_set(paw_proj_set=paw_proj_a, csprj=csprj, maxl=maxlprj, &
     112              :                             nprj=nprjla, ncgauprj=np_car, nsgauprj=np_sph, nsatbas=nsatbas, rcprj=rcprja, &
     113              :                             first_prj=fp_cara, first_prjs=fp_spha, &
     114        66628 :                             zisomin=zisomina, rzetprj=rzetprja, zetprj=zetprja)
     115              : 
     116        66628 :       NULLIFY (first_sgfb, lb_max, lb_min, npgfb, nsgfb, rpgfb, sphi_b, set_radius_b, zetb, zisominb)
     117              :       CALL get_gto_basis_set(gto_basis_set=orb_basis_b, nset=nsetb, nsgf=ntotsgfb, &
     118              :                              set_radius=set_radius_b, lmax=lb_max, lmin=lb_min, &
     119              :                              npgf=npgfb, nsgf_set=nsgfb, pgf_radius=rpgfb, &
     120              :                              sphi=sphi_b, zet=zetb, first_sgf=first_sgfb, &
     121        66628 :                              maxco=maxcob, maxl=maxlb)
     122              : 
     123        66628 :       CALL get_gto_basis_set(gto_basis_set=basis_1c_a, nset=nseta, maxso=maxsoa)
     124              : 
     125              :       !  Add the block ab
     126       266512 :       dab = SQRT(SUM(rab*rab))
     127              : 
     128        66628 :       maxder = ncoset(nder)
     129        66628 :       nsoatot = maxsoa*nseta
     130        66628 :       maxnprja = SIZE(zetprja, 1)
     131              : 
     132              :       calculate_forces = .FALSE.
     133              :       IF (nder > 0) THEN
     134        66628 :          calculate_forces = .TRUE.
     135              :       END IF
     136              : 
     137        66628 :       lm = MAX(maxlb, maxlprj)
     138        66628 :       lds = ncoset(lm + nder + 1)
     139        66628 :       msab = MAX(maxnprja*ncoset(maxlprj), maxcob)
     140              : 
     141       333140 :       ALLOCATE (s(lds, lds, ncoset(nder + 1)))
     142       266512 :       ALLOCATE (spa_sb(np_car, ntotsgfb))
     143       266512 :       ALLOCATE (spa_tmp(msab, msab*maxder))
     144       266512 :       ALLOCATE (ovs(np_sph, maxcob*nsetb*maxder))
     145              : 
     146        66628 :       m1 = 0
     147        66628 :       nsgf_cnt = 0
     148        66628 :       isgfb_cnt = 1
     149        66628 :       sgf_hard_only = 0
     150       234874 :       DO jset = 1, nsetb
     151              :          !
     152              :          ! Set the contribution list
     153       168246 :          IF (hard_radius_a + set_radius_b(jset) >= dab) THEN
     154        86696 :             isgfb = first_sgfb(1, jset)
     155        86696 :             lsgfb = isgfb - 1 + nsgfb(jset)
     156       462858 :             DO jc = isgfb, lsgfb
     157       376162 :                nsgf_cnt = nsgf_cnt + 1
     158       462858 :                sgf_list(nsgf_cnt) = jc
     159              :             END DO
     160              : 
     161              :             ! check if this function is hard
     162       408262 :             radius = exp_radius(lb_max(jset), MAXVAL(zetb(1:npgfb(jset), jset)), eps_fit, 1.0_dp)
     163        86696 :             IF (radius .LE. hard_radius_b) sgf_hard_only = sgf_hard_only + 1
     164              : 
     165              :             ! Integral between proj of iatom and primitives of jatom
     166              :             ! Calculate the primitives overlap
     167    515924456 :             spa_tmp = 0.0_dp
     168    153264436 :             ovs = 0.0_dp
     169    341746060 :             s = 0.0_dp
     170        86696 :             ncob = npgfb(jset)*ncoset(lb_max(jset))
     171        86696 :             isgfb = first_sgfb(1, jset)
     172        86696 :             lsgfb = isgfb - 1 + nsgfb(jset)
     173              : 
     174        86696 :             lsgfb_cnt = isgfb_cnt - 1 + nsgfb(jset)
     175              : 
     176       298366 :             DO lprj = 0, maxlprj
     177              :                CALL overlap(lprj, lprj, nprjla(lprj), &
     178              :                             rzetprja(:, lprj), zetprja(:, lprj), &
     179              :                             lb_max(jset), lb_min(jset), npgfb(jset), &
     180              :                             rpgfb(:, jset), zetb(:, jset), &
     181              :                             -rab, dab, spa_tmp, &
     182       846680 :                             nder, .TRUE., s, lds)
     183       715830 :                DO ider = 1, maxder
     184       417464 :                   is = (ider - 1)*SIZE(spa_tmp, 1)
     185       417464 :                   isp = (ider - 1)*maxcob*nsetb
     186      2266030 :                   DO ipgf = 1, nprjla(lprj)
     187      1636896 :                      lpoint = ncoset(lprj - 1) + 1 + (ipgf - 1)*ncoset(lprj)
     188      1636896 :                      m = fp_spha(lprj) + (ipgf - 1)*nso(lprj)
     189      6596982 :                      DO ip = 1, npgfb(jset)
     190      4542622 :                         ic = (ip - 1)*ncoset(lb_max(jset))
     191      4542622 :                         igau = isp + ic + m1 + ncoset(lb_min(jset) - 1) + 1
     192      4542622 :                         ig1 = is + ic + ncoset(lb_min(jset) - 1) + 1
     193      4542622 :                         n = ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1)
     194              :                         ovs(m:m + nso(lprj) - 1, igau:igau + n - 1) = &
     195      4542622 :                            MATMUL(orbtramat(lprj)%slm(1:nso(lprj), 1:nco(lprj)), &
     196    236382328 :                                   spa_tmp(lpoint:lpoint + nco(lprj) - 1, ig1:ig1 + n - 1))
     197              :                      END DO
     198              :                   END DO
     199              :                END DO
     200              :             END DO
     201              : 
     202        86696 :             IF (paw_atom_b) THEN
     203        76768 :                CALL get_paw_proj_set(paw_proj_set=paw_proj_b, zisomin=zisominb)
     204       284964 :                DO ipgf = 1, npgfb(jset)
     205       609690 :                   DO lshell = lb_min(jset), lb_max(jset)
     206       532922 :                      IF (zetb(ipgf, jset) >= zisominb(lshell)) THEN
     207        14470 :                         n = ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1)
     208        14470 :                         igau = n*(ipgf - 1) + ncoset(lshell - 1)
     209        42290 :                         DO ider = 1, maxder
     210        27820 :                            is = maxcob*(ider - 1)
     211        27820 :                            isp = (ider - 1)*maxcob*nsetb
     212       763750 :                            ovs(:, igau + 1 + isp + m1:igau + nco(lshell) + isp + m1) = 0.0_dp
     213              :                         END DO
     214              :                      END IF
     215              :                   END DO
     216              :                END DO
     217              :             END IF
     218              : 
     219              :             ! Contraction step (integrals and derivatives)
     220       257602 :             DO ider = 1, maxder
     221       170906 :                first_col = (ider - 1)*maxcob*nsetb + 1 + m1
     222              :                ! CALL dgemm("N", "N", np_sph, nsgfb(jset), ncob, &
     223              :                !           1.0_dp, ovs(1, first_col), SIZE(ovs, 1), &
     224              :                !           sphi_b(1, isgfb), SIZE(sphi_b, 1), &
     225              :                !           0.0_dp, spa_sb(1, isgfb), SIZE(spa_sb, 1))
     226              :                spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1) = &
     227       175632 :                   MATMUL(ovs(1:np_sph, first_col:first_col + ncob - 1), &
     228    207960154 :                          sphi_b(1:ncob, isgfb:isgfb + nsgfb(jset) - 1))
     229              : 
     230              :                ! CALL dgemm("T", "N", nsatbas, nsgfb(jset), np_sph, &
     231              :                !          1.0_dp, csprj(1, 1), SIZE(csprj, 1), &
     232              :                !          spa_sb(1, isgfb), SIZE(spa_sb, 1), &
     233              :                !          1.0_dp, oces(ider)%block(1, isgfb_cnt), SIZE(oces(ider)%block, 1))
     234              :                oces(ider)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) = &
     235              :                   oces(ider)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) + &
     236       679264 :                   MATMUL(TRANSPOSE(csprj(1:np_sph, 1:nsatbas)), &
     237    449694904 :                          spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1))
     238              :             END DO
     239        86696 :             isgfb_cnt = isgfb_cnt + nsgfb(jset)
     240              :          END IF ! radius
     241       234874 :          m1 = m1 + maxcob
     242              :       END DO !jset
     243              : 
     244              :       ! Check if the screened functions are all soft
     245        66628 :       sgf_soft_only = .FALSE.
     246        66628 :       IF (sgf_hard_only .EQ. 0) sgf_soft_only = .TRUE.
     247              : 
     248        66628 :       DEALLOCATE (s, spa_sb, spa_tmp, ovs)
     249              : 
     250       133256 :    END SUBROUTINE build_oce_block
     251              : 
     252              : ! **************************************************************************************************
     253              : !> \brief ...
     254              : !> \param oceh ...
     255              : !> \param oces ...
     256              : !> \param atom_ka ...
     257              : !> \param sgf_list ...
     258              : !> \param nsgf_cnt ...
     259              : ! **************************************************************************************************
     260         6966 :    SUBROUTINE build_oce_block_local(oceh, oces, atom_ka, sgf_list, nsgf_cnt)
     261              : 
     262              :       TYPE(block_p_type), DIMENSION(:), POINTER          :: oceh, oces
     263              :       TYPE(qs_kind_type), POINTER                        :: atom_ka
     264              :       INTEGER, DIMENSION(:), INTENT(OUT)                 :: sgf_list
     265              :       INTEGER, INTENT(OUT)                               :: nsgf_cnt
     266              : 
     267              :       INTEGER                                            :: i, iset, isgfa, j, jc, lsgfa, maxlprj, &
     268              :                                                             maxso1a, n, nsatbas, nset1a, nseta, &
     269              :                                                             nsgfa
     270         6966 :       INTEGER, DIMENSION(:), POINTER                     :: n2oindex, nsgf_seta
     271         6966 :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfa
     272              :       LOGICAL                                            :: paw_atom_a
     273         6966 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: prjloc_h, prjloc_s
     274         6966 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: local_oce_h, local_oce_s
     275              :       TYPE(gto_basis_set_type), POINTER                  :: basis_1c_a, orb_basis_a
     276              :       TYPE(paw_proj_set_type), POINTER                   :: paw_proj_a
     277              : 
     278         6966 :       NULLIFY (orb_basis_a, basis_1c_a, paw_proj_a)
     279              :       CALL get_qs_kind(qs_kind=atom_ka, basis_set=orb_basis_a, &
     280         6966 :                        paw_proj_set=paw_proj_a, paw_atom=paw_atom_a)
     281              : 
     282         6966 :       IF (.NOT. paw_atom_a) RETURN
     283              : 
     284         6966 :       CALL get_paw_proj_set(paw_proj_set=paw_proj_a, maxl=maxlprj)
     285         6966 :       CALL get_qs_kind(qs_kind=atom_ka, basis_set=basis_1c_a, basis_type="GAPW_1C")
     286         6966 :       CALL get_gto_basis_set(gto_basis_set=basis_1c_a, nset=nset1a, maxso=maxso1a)
     287         6966 :       NULLIFY (n2oindex)
     288         6966 :       CALL get_paw_basis_info(basis_1c_a, n2oindex=n2oindex, nsatbas=nsatbas)
     289              : 
     290              :       CALL get_gto_basis_set(gto_basis_set=orb_basis_a, first_sgf=first_sgfa, &
     291         6966 :                              nsgf=nsgfa, nsgf_set=nsgf_seta, nset=nseta)
     292              : 
     293         6966 :       NULLIFY (local_oce_h, local_oce_s)
     294              :       CALL get_paw_proj_set(paw_proj_set=paw_proj_a, &
     295              :                             local_oce_sphi_h=local_oce_h, &
     296         6966 :                             local_oce_sphi_s=local_oce_s)
     297              : 
     298        41796 :       ALLOCATE (prjloc_h(nset1a*maxso1a, nsgfa), prjloc_s(nset1a*maxso1a, nsgfa))
     299      3476460 :       prjloc_h = 0._dp
     300      3476460 :       prjloc_s = 0._dp
     301              : 
     302         6966 :       nsgf_cnt = 0
     303        24836 :       DO iset = 1, nseta
     304        17870 :          isgfa = first_sgfa(1, iset)
     305        17870 :          lsgfa = isgfa - 1 + nsgf_seta(iset)
     306        76004 :          DO jc = isgfa, lsgfa
     307        58134 :             nsgf_cnt = nsgf_cnt + 1
     308        76004 :             sgf_list(nsgf_cnt) = jc
     309              :          END DO
     310              :          ! this asumes that the first sets are the same for basis_1c/orb_basis!
     311        17870 :          n = maxso1a*(iset - 1)
     312      1002686 :          prjloc_h(n + 1:n + maxso1a, isgfa:lsgfa) = local_oce_h(1:maxso1a, isgfa:lsgfa)
     313      1009652 :          prjloc_s(n + 1:n + maxso1a, isgfa:lsgfa) = local_oce_s(1:maxso1a, isgfa:lsgfa)
     314              :       END DO
     315              : 
     316        65100 :       DO i = 1, nsgfa
     317      1520664 :          DO j = 1, nsatbas
     318      1455564 :             jc = n2oindex(j)
     319      1455564 :             oceh(1)%block(j, i) = prjloc_h(jc, i)
     320      1513698 :             oces(1)%block(j, i) = prjloc_s(jc, i)
     321              :          END DO
     322              :       END DO
     323              : 
     324         6966 :       DEALLOCATE (prjloc_h, prjloc_s)
     325         6966 :       DEALLOCATE (n2oindex)
     326              : 
     327        20898 :    END SUBROUTINE build_oce_block_local
     328              : 
     329              : ! **************************************************************************************************
     330              : !> \brief ...
     331              : !> \param oceh ...
     332              : !> \param oces ...
     333              : !> \param atom_ka ...
     334              : !> \param sgf_list ...
     335              : !> \param nsgf_cnt ...
     336              : !> \param eps_fit ...
     337              : ! **************************************************************************************************
     338            0 :    SUBROUTINE build_oce_block_1c(oceh, oces, atom_ka, sgf_list, nsgf_cnt, eps_fit)
     339              : 
     340              :       TYPE(block_p_type), DIMENSION(:), POINTER          :: oceh, oces
     341              :       TYPE(qs_kind_type), POINTER                        :: atom_ka
     342              :       INTEGER, DIMENSION(:), INTENT(OUT)                 :: sgf_list
     343              :       INTEGER, INTENT(OUT)                               :: nsgf_cnt
     344              :       REAL(KIND=dp), INTENT(IN)                          :: eps_fit
     345              : 
     346              :       INTEGER :: first_col, ic, ig1, igau, ip, ipgf, isgfb, isgfb_cnt, jc, jset, lds, lm, lpoint, &
     347              :          lprj, lsgfb, lsgfb_cnt, lshell, m, m1, maxcob, maxlb, maxlprj, maxnprja, maxsoa, msab, n, &
     348              :          ncob, np_car, np_sph, nsatbas, nseta, nsetb, nsoatot, ntotsgfb
     349            0 :       INTEGER, DIMENSION(:), POINTER                     :: fp_cara, fp_spha, lb_max, lb_min, npgfb, &
     350            0 :                                                             nprjla, nsgfb
     351            0 :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfb
     352              :       LOGICAL                                            :: paw_atom_a
     353              :       REAL(KIND=dp)                                      :: radius, rc, rcprja
     354            0 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: ovh, ovs, spa_sb
     355            0 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: s
     356            0 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: set_radius_b, zisominb
     357            0 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: chprj, csprj, rpgfb, rzetprja, spa_tmp, &
     358            0 :                                                             sphi_b, zetb, zetprja
     359              :       TYPE(gto_basis_set_type), POINTER                  :: basis_1c_a, orb_basis_b
     360              :       TYPE(paw_proj_set_type), POINTER                   :: paw_proj_a
     361              : 
     362            0 :       NULLIFY (orb_basis_b, basis_1c_a, paw_proj_a)
     363            0 :       CALL get_qs_kind(qs_kind=atom_ka, paw_atom=paw_atom_a)
     364              : 
     365            0 :       IF (.NOT. paw_atom_a) RETURN
     366              : 
     367            0 :       CALL get_qs_kind(qs_kind=atom_ka, paw_proj_set=paw_proj_a)
     368            0 :       NULLIFY (nprjla, fp_cara, fp_spha, rzetprja, zetprja)
     369              :       CALL get_paw_proj_set(paw_proj_set=paw_proj_a, csprj=csprj, chprj=chprj, maxl=maxlprj, &
     370              :                             nprj=nprjla, ncgauprj=np_car, nsgauprj=np_sph, nsatbas=nsatbas, rcprj=rcprja, &
     371              :                             first_prj=fp_cara, first_prjs=fp_spha, &
     372            0 :                             rzetprj=rzetprja, zetprj=zetprja)
     373              : 
     374            0 :       CALL get_qs_kind(qs_kind=atom_ka, basis_set=orb_basis_b)
     375            0 :       NULLIFY (first_sgfb, lb_max, lb_min, npgfb, nsgfb, rpgfb, sphi_b, set_radius_b, zetb, zisominb)
     376              :       CALL get_gto_basis_set(gto_basis_set=orb_basis_b, nset=nsetb, nsgf=ntotsgfb, &
     377              :                              set_radius=set_radius_b, lmax=lb_max, lmin=lb_min, &
     378              :                              npgf=npgfb, nsgf_set=nsgfb, pgf_radius=rpgfb, &
     379              :                              sphi=sphi_b, zet=zetb, first_sgf=first_sgfb, &
     380            0 :                              maxco=maxcob, maxl=maxlb)
     381              : 
     382            0 :       CALL get_qs_kind(qs_kind=atom_ka, hard_radius=rc)
     383              : 
     384            0 :       CALL get_qs_kind(qs_kind=atom_ka, basis_set=basis_1c_a, basis_type="GAPW_1C")
     385            0 :       CALL get_gto_basis_set(gto_basis_set=basis_1c_a, nset=nseta, maxso=maxsoa)
     386              : 
     387              :       !  Add the block ab
     388            0 :       nsoatot = maxsoa*nseta
     389            0 :       maxnprja = SIZE(zetprja, 1)
     390              : 
     391            0 :       lm = MAX(maxlb, maxlprj)
     392            0 :       lds = ncoset(lm + 1)
     393            0 :       msab = MAX(maxnprja*ncoset(maxlprj), maxcob)
     394              : 
     395            0 :       ALLOCATE (s(lds, lds, 1))
     396            0 :       ALLOCATE (spa_sb(np_car, ntotsgfb))
     397            0 :       ALLOCATE (spa_tmp(msab, msab))
     398            0 :       ALLOCATE (ovs(np_sph, maxcob*nsetb))
     399            0 :       ALLOCATE (ovh(np_sph, maxcob*nsetb))
     400              : 
     401            0 :       m1 = 0
     402            0 :       nsgf_cnt = 0
     403            0 :       isgfb_cnt = 1
     404            0 :       DO jset = 1, nsetb
     405              :          !
     406              :          ! Set the contribution list
     407            0 :          isgfb = first_sgfb(1, jset)
     408            0 :          lsgfb = isgfb - 1 + nsgfb(jset)
     409            0 :          DO jc = isgfb, lsgfb
     410            0 :             nsgf_cnt = nsgf_cnt + 1
     411            0 :             sgf_list(nsgf_cnt) = jc
     412              :          END DO
     413              : 
     414              :          ! Integral between proj of iatom and primitives of iatom
     415              :          ! Calculate the primitives overlap
     416            0 :          spa_tmp = 0.0_dp
     417            0 :          ovs = 0.0_dp
     418            0 :          ovh = 0.0_dp
     419            0 :          s = 0.0_dp
     420            0 :          ncob = npgfb(jset)*ncoset(lb_max(jset))
     421            0 :          isgfb = first_sgfb(1, jset)
     422            0 :          lsgfb = isgfb - 1 + nsgfb(jset)
     423              : 
     424            0 :          lsgfb_cnt = isgfb_cnt - 1 + nsgfb(jset)
     425              : 
     426            0 :          DO lprj = 0, maxlprj
     427              :             CALL overlap(lprj, lprj, nprjla(lprj), &
     428              :                          rzetprja(:, lprj), zetprja(:, lprj), &
     429              :                          lb_max(jset), lb_min(jset), npgfb(jset), &
     430              :                          rpgfb(:, jset), zetb(:, jset), &
     431              :                          -(/0._dp, 0._dp, 0._dp/), 0.0_dp, spa_tmp, &
     432            0 :                          0, .TRUE., s, lds)
     433            0 :             DO ipgf = 1, nprjla(lprj)
     434            0 :                lpoint = ncoset(lprj - 1) + 1 + (ipgf - 1)*ncoset(lprj)
     435            0 :                m = fp_spha(lprj) + (ipgf - 1)*nso(lprj)
     436            0 :                DO ip = 1, npgfb(jset)
     437            0 :                   ic = (ip - 1)*ncoset(lb_max(jset))
     438            0 :                   igau = ic + m1 + ncoset(lb_min(jset) - 1) + 1
     439            0 :                   ig1 = ic + ncoset(lb_min(jset) - 1) + 1
     440            0 :                   n = ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1)
     441              :                   ovs(m:m + nso(lprj) - 1, igau:igau + n - 1) = &
     442            0 :                      MATMUL(orbtramat(lprj)%slm(1:nso(lprj), 1:nco(lprj)), &
     443            0 :                             spa_tmp(lpoint:lpoint + nco(lprj) - 1, ig1:ig1 + n - 1))
     444              :                END DO
     445              :             END DO
     446              :          END DO
     447              : 
     448            0 :          ovh(:, :) = ovs(:, :)
     449              : 
     450            0 :          CALL get_paw_proj_set(paw_proj_set=paw_proj_a, zisomin=zisominb)
     451            0 :          DO ipgf = 1, npgfb(jset)
     452            0 :             DO lshell = lb_min(jset), lb_max(jset)
     453            0 :                radius = exp_radius(lshell, zetb(ipgf, jset), eps_fit, 1.0_dp)
     454            0 :                IF (radius < rc) THEN
     455            0 :                   n = ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1)
     456            0 :                   igau = n*(ipgf - 1) + ncoset(lshell - 1)
     457            0 :                   ovs(:, igau + 1 + m1:igau + nco(lshell) + m1) = 0.0_dp
     458              :                END IF
     459              :             END DO
     460              :          END DO
     461              : 
     462              :          ! Contraction step (integrals and derivatives)
     463            0 :          first_col = 1 + m1
     464              :          spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1) = &
     465            0 :             MATMUL(ovs(1:np_sph, first_col:first_col + ncob - 1), &
     466            0 :                    sphi_b(1:ncob, isgfb:isgfb + nsgfb(jset) - 1))
     467              : 
     468              :          oces(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) = &
     469              :             oces(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) + &
     470            0 :             MATMUL(TRANSPOSE(csprj(1:np_sph, 1:nsatbas)), &
     471            0 :                    spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1))
     472              : 
     473              :          spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1) = &
     474            0 :             MATMUL(ovh(1:np_sph, first_col:first_col + ncob - 1), &
     475            0 :                    sphi_b(1:ncob, isgfb:isgfb + nsgfb(jset) - 1))
     476              : 
     477              :          oceh(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) = &
     478              :             oceh(1)%block(1:nsatbas, isgfb_cnt:isgfb_cnt + nsgfb(jset) - 1) + &
     479            0 :             MATMUL(TRANSPOSE(chprj(1:np_sph, 1:nsatbas)), &
     480            0 :                    spa_sb(1:np_sph, isgfb:isgfb + nsgfb(jset) - 1))
     481              : 
     482            0 :          isgfb_cnt = isgfb_cnt + nsgfb(jset)
     483            0 :          m1 = m1 + maxcob
     484              :       END DO !jset
     485              : 
     486            0 :       DEALLOCATE (s, spa_sb, spa_tmp, ovs)
     487              : 
     488            0 :    END SUBROUTINE build_oce_block_1c
     489              : 
     490              : ! **************************************************************************************************
     491              : !> \brief Set up the sparse matrix for the coefficients of one center expansions
     492              : !>      This routine uses the same logic as the nonlocal pseudopotential
     493              : !> \param intac TYPE that holds the integrals (a=basis; c=projector)
     494              : !> \param calculate_forces ...
     495              : !> \param nder ...
     496              : !> \param qs_kind_set ...
     497              : !> \param particle_set ...
     498              : !> \param sap_oce ...
     499              : !> \param eps_fit ...
     500              : !> \par History
     501              : !>      02.2009 created
     502              : !> \author jgh
     503              : ! **************************************************************************************************
     504         2404 :    SUBROUTINE build_oce_matrices(intac, calculate_forces, nder, &
     505              :                                  qs_kind_set, particle_set, sap_oce, eps_fit)
     506              : 
     507              :       TYPE(sap_int_type), DIMENSION(:), POINTER          :: intac
     508              :       LOGICAL, INTENT(IN)                                :: calculate_forces
     509              :       INTEGER                                            :: nder
     510              :       TYPE(qs_kind_type), DIMENSION(:), POINTER          :: qs_kind_set
     511              :       TYPE(particle_type), DIMENSION(:), POINTER         :: particle_set
     512              :       TYPE(neighbor_list_set_p_type), DIMENSION(:), &
     513              :          POINTER                                         :: sap_oce
     514              :       REAL(KIND=dp), INTENT(IN)                          :: eps_fit
     515              : 
     516              :       CHARACTER(LEN=*), PARAMETER :: routineN = 'build_oce_matrices'
     517              : 
     518              :       INTEGER :: atom_a, atom_b, handle, i, iac, ikind, ilist, jkind, jneighbor, ldai, ldsab, &
     519              :          maxco, maxder, maxl, maxlgto, maxlprj, maxprj, maxsgf, maxsoa, maxsob, mlprj, natom, &
     520              :          ncoa_sum, nkind, nlist, nneighbor, nsatbas, nseta, nsetb, nsgf_cnt, nsgfa, nsobtot, slot
     521         2404 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: sgf_list
     522              :       INTEGER, DIMENSION(3)                              :: cell_b
     523         2404 :       INTEGER, DIMENSION(:), POINTER                     :: fp_car, fp_sph, la_max, la_min, npgfa, &
     524         2404 :                                                             nprjla, nsgf_seta
     525         2404 :       INTEGER, DIMENSION(:, :), POINTER                  :: first_sgfa
     526              :       LOGICAL                                            :: local, paw_atom_b, sgf_soft_only
     527              :       REAL(KIND=dp)                                      :: dab, rcprj
     528         2404 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: sab, work
     529         2404 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :)     :: ai_work
     530              :       REAL(KIND=dp), DIMENSION(3)                        :: rab
     531         2404 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: set_radius_a
     532         2404 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: rpgfa, rzetprj, sphi_a, zeta, zetb
     533         2404 :       TYPE(block_p_type), DIMENSION(:), POINTER          :: oceh, oces
     534              :       TYPE(clist_type), POINTER                          :: clist
     535              :       TYPE(gto_basis_set_type), POINTER                  :: orb_basis_paw, orb_basis_set
     536              :       TYPE(paw_proj_set_type), POINTER                   :: paw_proj_b
     537              :       TYPE(qs_kind_type), POINTER                        :: at_a, at_b, qs_kind
     538              : 
     539         4808 :       IF (calculate_forces) THEN
     540          812 :          CALL timeset(routineN//"_forces", handle)
     541              :       ELSE
     542         1592 :          CALL timeset(routineN, handle)
     543              :       END IF
     544              : 
     545         2404 :       IF (ASSOCIATED(sap_oce)) THEN
     546              : 
     547         2404 :          nkind = SIZE(qs_kind_set)
     548         2404 :          natom = SIZE(particle_set)
     549              : 
     550         2404 :          maxder = ncoset(nder)
     551              : 
     552              :          CALL get_qs_kind_set(qs_kind_set=qs_kind_set, &
     553              :                               maxco=maxco, &
     554              :                               maxlgto=maxlgto, &
     555              :                               maxlprj=maxlprj, &
     556              :                               maxco_proj=maxprj, &
     557         2404 :                               maxsgf=maxsgf)
     558              : 
     559         2404 :          maxl = MAX(maxlgto, maxlprj)
     560         2404 :          CALL init_orbital_pointers(maxl + nder + 1)
     561              : 
     562        12376 :          DO i = 1, nkind*nkind
     563         9972 :             NULLIFY (intac(i)%alist, intac(i)%asort, intac(i)%aindex)
     564        12376 :             intac(i)%nalist = 0
     565              :          END DO
     566              : 
     567              :          ! Allocate memory list
     568        75998 :          DO slot = 1, sap_oce(1)%nl_size
     569        73594 :             ikind = sap_oce(1)%nlist_task(slot)%ikind
     570        73594 :             jkind = sap_oce(1)%nlist_task(slot)%jkind
     571        73594 :             atom_a = sap_oce(1)%nlist_task(slot)%iatom
     572        73594 :             nlist = sap_oce(1)%nlist_task(slot)%nlist
     573        73594 :             ilist = sap_oce(1)%nlist_task(slot)%ilist
     574        73594 :             nneighbor = sap_oce(1)%nlist_task(slot)%nnode
     575              : 
     576        73594 :             iac = ikind + nkind*(jkind - 1)
     577              : 
     578        73594 :             qs_kind => qs_kind_set(ikind)
     579        73594 :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_set)
     580        73594 :             IF (.NOT. ASSOCIATED(orb_basis_set)) CYCLE
     581        73594 :             qs_kind => qs_kind_set(jkind)
     582        73594 :             NULLIFY (paw_proj_b)
     583        73594 :             CALL get_qs_kind(qs_kind=qs_kind, paw_proj_set=paw_proj_b, paw_atom=paw_atom_b)
     584        73594 :             IF (.NOT. paw_atom_b) CYCLE
     585        73594 :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_paw, basis_type="GAPW_1C")
     586        73594 :             IF (.NOT. ASSOCIATED(orb_basis_paw)) CYCLE
     587        73594 :             IF (.NOT. ASSOCIATED(intac(iac)%alist)) THEN
     588         9030 :                intac(iac)%a_kind = ikind
     589         9030 :                intac(iac)%p_kind = jkind
     590         9030 :                intac(iac)%nalist = nlist
     591        41530 :                ALLOCATE (intac(iac)%alist(nlist))
     592        23470 :                DO i = 1, nlist
     593        14440 :                   NULLIFY (intac(iac)%alist(i)%clist)
     594        14440 :                   intac(iac)%alist(i)%aatom = 0
     595        23470 :                   intac(iac)%alist(i)%nclist = 0
     596              :                END DO
     597              :             END IF
     598       149592 :             IF (.NOT. ASSOCIATED(intac(iac)%alist(ilist)%clist)) THEN
     599        14440 :                intac(iac)%alist(ilist)%aatom = atom_a
     600        14440 :                intac(iac)%alist(ilist)%nclist = nneighbor
     601       217994 :                ALLOCATE (intac(iac)%alist(ilist)%clist(nneighbor))
     602              :             END IF
     603              :          END DO
     604              : 
     605         2404 :          ldsab = MAX(maxco, ncoset(maxlprj), maxsgf, maxprj)
     606         2404 :          ldai = ncoset(maxl + nder + 1)
     607              : 
     608              :          !calculate the overlap integrals <a|p>
     609              : !$OMP PARALLEL DEFAULT(NONE) &
     610              : !$OMP SHARED (intac, ldsab, ldai, nder, nkind, maxder, ncoset, sap_oce, qs_kind_set, eps_fit) &
     611              : !$OMP PRIVATE (sab, work, ai_work, oceh, oces, slot, ikind, jkind, atom_a, atom_b, ilist, jneighbor, rab, cell_b, &
     612              : !$OMP          iac, dab, qs_kind, orb_basis_set, first_sgfa, la_max, la_min, ncoa_sum, maxsoa, npgfa, nseta, &
     613              : !$OMP          nsgfa, nsgf_seta, rpgfa, set_radius_a, sphi_a, zeta, paw_proj_b, paw_atom_b, orb_basis_paw, &
     614              : !$OMP          maxsob, nsetb, mlprj, nprjla, nsatbas, rcprj, fp_car, fp_sph, rzetprj, zetb, nsobtot, clist, &
     615         2404 : !$OMP          sgf_list, at_a, at_b, local, i, sgf_soft_only, nsgf_cnt)
     616              : 
     617              :          ALLOCATE (sab(ldsab, ldsab*maxder), work(ldsab, ldsab*maxder))
     618              :          sab = 0.0_dp
     619              :          ALLOCATE (ai_work(ldai, ldai, ncoset(nder + 1)))
     620              :          ai_work = 0.0_dp
     621              :          ALLOCATE (oceh(maxder), oces(maxder))
     622              : 
     623              : !$OMP DO SCHEDULE(GUIDED)
     624              :          DO slot = 1, sap_oce(1)%nl_size
     625              :             ikind = sap_oce(1)%nlist_task(slot)%ikind
     626              :             jkind = sap_oce(1)%nlist_task(slot)%jkind
     627              :             atom_a = sap_oce(1)%nlist_task(slot)%iatom
     628              :             atom_b = sap_oce(1)%nlist_task(slot)%jatom
     629              :             ilist = sap_oce(1)%nlist_task(slot)%ilist
     630              :             jneighbor = sap_oce(1)%nlist_task(slot)%inode
     631              :             rab(1:3) = sap_oce(1)%nlist_task(slot)%r(1:3)
     632              :             cell_b(1:3) = sap_oce(1)%nlist_task(slot)%cell(1:3)
     633              : 
     634              :             iac = ikind + nkind*(jkind - 1)
     635              :             dab = SQRT(SUM(rab*rab))
     636              : 
     637              :             qs_kind => qs_kind_set(ikind)
     638              :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_set)
     639              : 
     640              :             IF (.NOT. ASSOCIATED(orb_basis_set)) CYCLE
     641              :             CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
     642              :                                    first_sgf=first_sgfa, &
     643              :                                    lmax=la_max, &
     644              :                                    lmin=la_min, &
     645              :                                    nco_sum=ncoa_sum, &
     646              :                                    maxso=maxsoa, &
     647              :                                    npgf=npgfa, &
     648              :                                    nset=nseta, &
     649              :                                    nsgf=nsgfa, &
     650              :                                    nsgf_set=nsgf_seta, &
     651              :                                    pgf_radius=rpgfa, &
     652              :                                    set_radius=set_radius_a, &
     653              :                                    sphi=sphi_a, &
     654              :                                    zet=zeta)
     655              : 
     656              :             qs_kind => qs_kind_set(jkind)
     657              : 
     658              :             NULLIFY (paw_proj_b)
     659              :             CALL get_qs_kind(qs_kind=qs_kind, paw_proj_set=paw_proj_b, paw_atom=paw_atom_b)
     660              :             IF (.NOT. paw_atom_b) CYCLE
     661              : 
     662              :             CALL get_qs_kind(qs_kind=qs_kind, basis_set=orb_basis_paw, basis_type="GAPW_1C")
     663              :             IF (.NOT. ASSOCIATED(orb_basis_paw)) CYCLE
     664              :             CALL get_gto_basis_set(gto_basis_set=orb_basis_paw, maxso=maxsob, nset=nsetb)
     665              : 
     666              :             CALL get_paw_proj_set(paw_proj_set=paw_proj_b, &
     667              :                                   maxl=mlprj, &
     668              :                                   nprj=nprjla, &
     669              :                                   nsatbas=nsatbas, &
     670              :                                   rcprj=rcprj, &
     671              :                                   first_prj=fp_car, &
     672              :                                   first_prjs=fp_sph, &
     673              :                                   rzetprj=rzetprj, &
     674              :                                   zetprj=zetb)
     675              : 
     676              :             nsobtot = nsatbas
     677              : 
     678              :             clist => intac(iac)%alist(ilist)%clist(jneighbor)
     679              :             clist%catom = atom_b
     680              :             clist%cell = cell_b
     681              :             clist%rac = rab
     682              :             clist%nsgf_cnt = 0
     683              :             clist%maxac = 0.0_dp
     684              :             clist%maxach = 0.0_dp
     685              :             NULLIFY (clist%acint, clist%achint, clist%sgf_list)
     686              : 
     687              :             ALLOCATE (sgf_list(nsgfa))
     688              : 
     689              :             at_a => qs_kind_set(jkind)
     690              :             at_b => qs_kind_set(ikind)
     691              : 
     692              :             local = (atom_a == atom_b .AND. ALL(cell_b == 0))
     693              : 
     694              :             IF (local) THEN
     695              :                DO i = 1, maxder
     696              :                   ALLOCATE (oceh(i)%block(nsobtot, nsgfa), oces(i)%block(nsobtot, nsgfa))
     697              :                   oceh(i)%block = 0._dp
     698              :                   oces(i)%block = 0._dp
     699              :                END DO
     700              :                CALL build_oce_block_local(oceh, oces, at_a, sgf_list, nsgf_cnt)
     701              :                clist%nsgf_cnt = nsgf_cnt
     702              :                clist%sgf_soft_only = .FALSE.
     703              :                IF (nsgf_cnt > 0) THEN
     704              :                   ALLOCATE (clist%acint(nsgf_cnt, nsobtot, maxder), clist%sgf_list(nsgf_cnt))
     705              :                   clist%acint(:, :, :) = 0._dp
     706              :                   clist%sgf_list(:) = HUGE(0)
     707              :                   CPASSERT(nsgf_cnt == nsgfa)
     708              :                   ! *** Special case: A=B
     709              :                   ALLOCATE (clist%achint(nsgfa, nsobtot, maxder))
     710              :                   clist%achint = 0._dp
     711              :                   clist%acint(1:nsgfa, 1:nsobtot, 1) = TRANSPOSE(oces(1)%block(1:nsobtot, 1:nsgfa))
     712              :                   clist%achint(1:nsgfa, 1:nsobtot, 1) = TRANSPOSE(oceh(1)%block(1:nsobtot, 1:nsgfa))
     713              :                   clist%maxac = MAXVAL(ABS(clist%acint(:, :, 1)))
     714              :                   clist%maxach = 0._dp
     715              :                   clist%sgf_list(1:nsgf_cnt) = sgf_list(1:nsgf_cnt)
     716              :                END IF
     717              :                DO i = 1, maxder
     718              :                   DEALLOCATE (oceh(i)%block, oces(i)%block)
     719              :                END DO
     720              :             ELSE
     721              :                DO i = 1, maxder
     722              :                   ALLOCATE (oces(i)%block(nsobtot, nsgfa))
     723              :                   oces(i)%block = 0._dp
     724              :                END DO
     725              :                CALL build_oce_block(oces, at_a, at_b, rab, nder, sgf_list, nsgf_cnt, sgf_soft_only, eps_fit)
     726              :                clist%nsgf_cnt = nsgf_cnt
     727              :                clist%sgf_soft_only = sgf_soft_only
     728              :                IF (nsgf_cnt > 0) THEN
     729              :                   ALLOCATE (clist%acint(nsgf_cnt, nsobtot, maxder), clist%sgf_list(nsgf_cnt))
     730              :                   clist%acint(:, :, :) = 0._dp
     731              :                   clist%sgf_list(:) = HUGE(0)
     732              :                   DO i = 1, maxder
     733              :                      clist%acint(1:nsgf_cnt, 1:nsobtot, i) = TRANSPOSE(oces(i)%block(1:nsobtot, 1:nsgf_cnt))
     734              :                   END DO
     735              :                   clist%maxac = MAXVAL(ABS(clist%acint(:, :, 1)))
     736              :                   clist%maxach = 0._dp
     737              :                   clist%sgf_list(1:nsgf_cnt) = sgf_list(1:nsgf_cnt)
     738              :                END IF
     739              :                DO i = 1, maxder
     740              :                   DEALLOCATE (oces(i)%block)
     741              :                END DO
     742              :             END IF
     743              : 
     744              :             DEALLOCATE (sgf_list)
     745              : 
     746              :          END DO
     747              : 
     748              :          DEALLOCATE (sab, work, ai_work)
     749              :          DEALLOCATE (oceh, oces)
     750              : !$OMP END PARALLEL
     751              : 
     752              :          ! Setup sort index
     753         2404 :          CALL sap_sort(intac)
     754              : 
     755              :       END IF
     756              : 
     757         2404 :       CALL timestop(handle)
     758              : 
     759         4808 :    END SUBROUTINE build_oce_matrices
     760              : 
     761              : ! **************************************************************************************************
     762              : !> \brief Project a matrix block onto the local atomic functions.
     763              : !>
     764              : !> \param h_a ...
     765              : !> \param s_a ...
     766              : !> \param na ...
     767              : !> \param h_b ...
     768              : !> \param s_b ...
     769              : !> \param nb ...
     770              : !> \param blk ...
     771              : !> \param ldb ...
     772              : !> \param proj_h ...
     773              : !> \param proj_s ...
     774              : !> \param nso ...
     775              : !> \param len1 ...
     776              : !> \param len2 ...
     777              : !> \param fac ...
     778              : !> \param distab ...
     779              : !> \par History
     780              : !>      02.2009 created
     781              : !>      09.2016 use automatic arrays [M Tucker]
     782              : ! **************************************************************************************************
     783      4650666 :    SUBROUTINE proj_blk(h_a, s_a, na, h_b, s_b, nb, blk, ldb, proj_h, proj_s, nso, len1, len2, fac, distab)
     784              : 
     785              :       INTEGER, INTENT(IN)                                :: na
     786              :       REAL(KIND=dp), INTENT(IN)                          :: s_a(na, *), h_a(na, *)
     787              :       INTEGER, INTENT(IN)                                :: nb
     788              :       REAL(KIND=dp), INTENT(IN)                          :: s_b(nb, *), h_b(nb, *)
     789              :       INTEGER, INTENT(IN)                                :: ldb
     790              :       REAL(KIND=dp), INTENT(IN)                          :: blk(ldb, *)
     791              :       INTEGER, INTENT(IN)                                :: nso
     792              :       REAL(KIND=dp), INTENT(INOUT)                       :: proj_s(nso, *), proj_h(nso, *)
     793              :       INTEGER, INTENT(IN)                                :: len1, len2
     794              :       REAL(KIND=dp), INTENT(IN)                          :: fac
     795              :       LOGICAL, INTENT(IN)                                :: distab
     796              : 
     797            0 :       REAL(KIND=dp)                                      :: buf1(len1), buf2(len2)
     798              : 
     799      4650666 :       IF (na .EQ. 0 .OR. nb .EQ. 0 .OR. nso .EQ. 0) RETURN
     800              : 
     801              :       ! Handle special cases
     802      4650666 :       IF (na .EQ. 1 .AND. nb .EQ. 1) THEN
     803              :          ! hard
     804       262868 :          CALL dger(nso, nso, fac*blk(1, 1), h_a(1, 1), 1, h_b(1, 1), 1, proj_h(1, 1), nso)
     805              :          ! soft
     806       262868 :          CALL dger(nso, nso, fac*blk(1, 1), s_a(1, 1), 1, s_b(1, 1), 1, proj_s(1, 1), nso)
     807              :       ELSE
     808      4387798 :          IF (distab) THEN
     809              :             ! hard
     810      4057586 :             CALL dgemm('N', 'N', na, nso, nb, fac, blk(1, 1), ldb, h_b(1, 1), nb, 0.0_dp, buf1(1), na)
     811      4057586 :             CALL dgemm('T', 'N', nso, nso, na, 1.0_dp, h_a(1, 1), na, buf1(1), na, 0.0_dp, buf2(1), nso)
     812      4057586 :             CALL daxpy(nso*nso, 1.0_dp, buf2(1), 1, proj_h(1, 1), 1)
     813              :             ! soft
     814      4057586 :             CALL daxpy(nso*nso, 1.0_dp, buf2(1), 1, proj_s(1, 1), 1)
     815              :          ELSE
     816              :             ! hard
     817       330212 :             CALL dgemm('N', 'N', na, nso, nb, fac, blk(1, 1), ldb, h_b(1, 1), nb, 0.0_dp, buf1(1), na)
     818       330212 :             CALL dgemm('T', 'N', nso, nso, na, 1.0_dp, h_a(1, 1), na, buf1(1), na, 1.0_dp, proj_h(1, 1), nso)
     819              :             ! soft
     820       330212 :             CALL dgemm('N', 'N', na, nso, nb, fac, blk(1, 1), ldb, s_b(1, 1), nb, 0.0_dp, buf1(1), na)
     821       330212 :             CALL dgemm('T', 'N', nso, nso, na, 1.0_dp, s_a(1, 1), na, buf1(1), na, 1.0_dp, proj_s(1, 1), nso)
     822              :          END IF
     823              :       END IF
     824              : 
     825      4650666 :    END SUBROUTINE proj_blk
     826              : 
     827              : ! **************************************************************************************************
     828              : !> \brief ...
     829              : !> \param ain matrix in old indexing
     830              : !> \param aout matrix in new compressed indexing
     831              : !> \param atom ...
     832              : ! **************************************************************************************************
     833        75188 :    SUBROUTINE prj_gather(ain, aout, atom)
     834              : 
     835              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN)         :: ain
     836              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: aout
     837              :       TYPE(qs_kind_type), INTENT(IN)                     :: atom
     838              : 
     839              :       INTEGER                                            :: i, ip, j, jp, nbas
     840        75188 :       INTEGER, DIMENSION(:), POINTER                     :: n2oindex
     841              :       TYPE(gto_basis_set_type), POINTER                  :: basis_1c
     842              : 
     843        75188 :       NULLIFY (basis_1c)
     844        75188 :       CALL get_qs_kind(qs_kind=atom, basis_set=basis_1c, basis_type="GAPW_1C")
     845        75188 :       NULLIFY (n2oindex)
     846        75188 :       CALL get_paw_basis_info(basis_1c, n2oindex=n2oindex, nsatbas=nbas)
     847              : 
     848      1215694 :       DO i = 1, nbas
     849      1140506 :          ip = n2oindex(i)
     850     30418288 :          DO j = 1, nbas
     851     29202594 :             jp = n2oindex(j)
     852     30343100 :             aout(j, i) = ain(jp, ip)
     853              :          END DO
     854              :       END DO
     855              : 
     856        75188 :       DEALLOCATE (n2oindex)
     857              : 
     858        75188 :    END SUBROUTINE prj_gather
     859              : 
     860              : ! **************************************************************************************************
     861              : !> \brief ...
     862              : !> \param ain  matrix in new compressed indexing
     863              : !> \param aout matrix in old indexing (addup)
     864              : !> \param atom ...
     865              : ! **************************************************************************************************
     866       120668 :    SUBROUTINE prj_scatter(ain, aout, atom)
     867              : 
     868              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN)         :: ain
     869              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: aout
     870              :       TYPE(qs_kind_type), INTENT(IN)                     :: atom
     871              : 
     872              :       INTEGER                                            :: i, ip, j, jp, nbas
     873       120668 :       INTEGER, DIMENSION(:), POINTER                     :: n2oindex
     874              :       TYPE(gto_basis_set_type), POINTER                  :: basis_1c
     875              : 
     876       120668 :       NULLIFY (basis_1c)
     877       120668 :       CALL get_qs_kind(qs_kind=atom, basis_set=basis_1c, basis_type="GAPW_1C")
     878       120668 :       NULLIFY (n2oindex)
     879       120668 :       CALL get_paw_basis_info(basis_1c, n2oindex=n2oindex, nsatbas=nbas)
     880              : 
     881      2023424 :       DO i = 1, nbas
     882      1902756 :          ip = n2oindex(i)
     883     54038884 :          DO j = 1, nbas
     884     52015460 :             jp = n2oindex(j)
     885     53918216 :             aout(jp, ip) = aout(jp, ip) + ain(j, i)
     886              :          END DO
     887              :       END DO
     888              : 
     889       120668 :       DEALLOCATE (n2oindex)
     890              : 
     891       120668 :    END SUBROUTINE prj_scatter
     892              : 
     893       170906 : END MODULE qs_oce_methods
        

Generated by: LCOV version 2.0-1