LCOV - code coverage report
Current view: top level - src - qs_gspace_mixing.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 68.7 % 585 402
Test Date: 2025-12-04 06:27:48 Functions: 80.0 % 5 4

            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              : MODULE qs_gspace_mixing
      10              : 
      11              :    USE cp_control_types,                ONLY: dft_control_type
      12              :    USE kinds,                           ONLY: dp
      13              :    USE mathconstants,                   ONLY: z_one,&
      14              :                                               z_zero
      15              :    USE mathlib,                         ONLY: invert_matrix
      16              :    USE message_passing,                 ONLY: mp_para_env_type
      17              :    USE pw_env_types,                    ONLY: pw_env_get,&
      18              :                                               pw_env_type
      19              :    USE pw_methods,                      ONLY: pw_axpy,&
      20              :                                               pw_copy,&
      21              :                                               pw_integrate_function,&
      22              :                                               pw_scale,&
      23              :                                               pw_transfer,&
      24              :                                               pw_zero
      25              :    USE pw_pool_types,                   ONLY: pw_pool_type
      26              :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      27              :                                               pw_r3d_rs_type
      28              :    USE qs_density_mixing_types,         ONLY: broyden_mixing_nr,&
      29              :                                               gspace_mixing_nr,&
      30              :                                               mixing_storage_type,&
      31              :                                               multisecant_mixing_nr,&
      32              :                                               pulay_mixing_nr
      33              :    USE qs_environment_types,            ONLY: get_qs_env,&
      34              :                                               qs_environment_type
      35              :    USE qs_rho_atom_types,               ONLY: rho_atom_type
      36              :    USE qs_rho_types,                    ONLY: qs_rho_get,&
      37              :                                               qs_rho_type
      38              : #include "./base/base_uses.f90"
      39              : 
      40              :    IMPLICIT NONE
      41              : 
      42              :    PRIVATE
      43              : 
      44              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_gspace_mixing'
      45              : 
      46              :    PUBLIC :: gspace_mixing
      47              : 
      48              : CONTAINS
      49              : 
      50              : ! **************************************************************************************************
      51              : !> \brief  Driver for the g-space mixing, calls the proper routine given the
      52              : !>requested method
      53              : !> \param qs_env ...
      54              : !> \param mixing_method ...
      55              : !> \param mixing_store ...
      56              : !> \param rho ...
      57              : !> \param para_env ...
      58              : !> \param iter_count ...
      59              : !> \par History
      60              : !>      05.2009
      61              : !>      02.2015 changed input to make g-space mixing available in linear scaling
      62              : !>              SCF [Patrick Seewald]
      63              : !> \author MI
      64              : ! **************************************************************************************************
      65         1986 :    SUBROUTINE gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
      66              :       TYPE(qs_environment_type), POINTER                 :: qs_env
      67              :       INTEGER                                            :: mixing_method
      68              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
      69              :       TYPE(qs_rho_type), POINTER                         :: rho
      70              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      71              :       INTEGER                                            :: iter_count
      72              : 
      73              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'gspace_mixing'
      74              : 
      75              :       INTEGER                                            :: handle, iatom, ig, ispin, natom, ng, &
      76              :                                                             nimg, nspin
      77              :       LOGICAL                                            :: gapw
      78              :       REAL(dp)                                           :: alpha
      79         1986 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: tot_rho_r
      80              :       TYPE(dft_control_type), POINTER                    :: dft_control
      81              :       TYPE(pw_c1d_gs_type)                               :: rho_tmp
      82         1986 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g
      83              :       TYPE(pw_env_type), POINTER                         :: pw_env
      84              :       TYPE(pw_pool_type), POINTER                        :: auxbas_pw_pool
      85         1986 :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER        :: rho_r
      86         1986 :       TYPE(rho_atom_type), DIMENSION(:), POINTER         :: rho_atom
      87              : 
      88         1986 :       CALL timeset(routineN, handle)
      89              : 
      90         1986 :       CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env)
      91         1986 :       IF (.NOT. (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
      92              :                  dft_control%qs_control%semi_empirical)) THEN
      93              : 
      94         1442 :          CPASSERT(ASSOCIATED(mixing_store))
      95         1442 :          NULLIFY (auxbas_pw_pool, rho_atom, rho_g, rho_r, tot_rho_r)
      96         1442 :          CALL qs_rho_get(rho, rho_g=rho_g, rho_r=rho_r, tot_rho_r=tot_rho_r)
      97              : 
      98         1442 :          nspin = SIZE(rho_g, 1)
      99         1442 :          nimg = dft_control%nimages
     100         1442 :          ng = SIZE(rho_g(1)%pw_grid%gsq)
     101         1442 :          CPASSERT(ng == SIZE(mixing_store%rhoin(1)%cc))
     102              : 
     103         1442 :          alpha = mixing_store%alpha
     104         1442 :          gapw = dft_control%qs_control%gapw
     105              : 
     106         1442 :          IF (nspin == 2) THEN
     107          114 :             CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool)
     108          114 :             CALL auxbas_pw_pool%create_pw(rho_tmp)
     109          114 :             CALL pw_zero(rho_tmp)
     110          114 :             CALL pw_copy(rho_g(1), rho_tmp)
     111          114 :             CALL pw_axpy(rho_g(2), rho_g(1), 1.0_dp)
     112          114 :             CALL pw_axpy(rho_tmp, rho_g(2), -1.0_dp)
     113          114 :             CALL pw_scale(rho_g(2), -1.0_dp)
     114              :          END IF
     115              : 
     116         1442 :          IF (iter_count + 1 <= mixing_store%nskip_mixing) THEN
     117              :             ! skip mixing
     118            8 :             DO ispin = 1, nspin
     119        27656 :                DO ig = 1, ng
     120        27652 :                   mixing_store%rhoin(ispin)%cc(ig) = rho_g(ispin)%array(ig)
     121              :                END DO
     122              :             END DO
     123            4 :             IF (mixing_store%gmix_p .AND. gapw) THEN
     124            0 :                CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
     125            0 :                natom = SIZE(rho_atom)
     126            0 :                DO ispin = 1, nspin
     127            0 :                   DO iatom = 1, natom
     128            0 :                      IF (mixing_store%paw(iatom)) THEN
     129            0 :                         mixing_store%cpc_h_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef
     130            0 :                         mixing_store%cpc_s_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef
     131              :                      END IF
     132              :                   END DO
     133              :                END DO
     134              :             END IF
     135              : 
     136            4 :             mixing_store%iter_method = "NoMix"
     137            4 :             IF (nspin == 2) THEN
     138            0 :                CALL pw_axpy(rho_g(2), rho_g(1), 1.0_dp)
     139            0 :                CALL pw_scale(rho_g(1), 0.5_dp)
     140            0 :                CALL pw_axpy(rho_g(1), rho_g(2), -1.0_dp)
     141            0 :                CALL pw_scale(rho_g(2), -1.0_dp)
     142            0 :                CALL auxbas_pw_pool%give_back_pw(rho_tmp)
     143              :             END IF
     144            4 :             CALL timestop(handle)
     145            4 :             RETURN
     146              :          END IF
     147              : 
     148         1438 :          IF ((iter_count + 1 - mixing_store%nskip_mixing) <= mixing_store%n_simple_mix) THEN
     149            6 :             CALL gmix_potential_only(qs_env, mixing_store, rho)
     150            6 :             mixing_store%iter_method = "Kerker"
     151         1432 :          ELSEIF (mixing_method == gspace_mixing_nr) THEN
     152           40 :             CALL gmix_potential_only(qs_env, mixing_store, rho)
     153           40 :             mixing_store%iter_method = "Kerker"
     154         1392 :          ELSEIF (mixing_method == pulay_mixing_nr) THEN
     155          184 :             CALL pulay_mixing(qs_env, mixing_store, rho, para_env)
     156          184 :             mixing_store%iter_method = "Pulay"
     157         1208 :          ELSEIF (mixing_method == broyden_mixing_nr) THEN
     158         1208 :             CALL broyden_mixing(qs_env, mixing_store, rho, para_env)
     159         1208 :             mixing_store%iter_method = "Broy."
     160            0 :          ELSEIF (mixing_method == multisecant_mixing_nr) THEN
     161            0 :             CPASSERT(.NOT. gapw)
     162            0 :             CALL multisecant_mixing(mixing_store, rho, para_env)
     163            0 :             mixing_store%iter_method = "MSec."
     164              :          END IF
     165              : 
     166         1438 :          IF (nspin == 2) THEN
     167          114 :             CALL pw_axpy(rho_g(2), rho_g(1), 1.0_dp)
     168          114 :             CALL pw_scale(rho_g(1), 0.5_dp)
     169          114 :             CALL pw_axpy(rho_g(1), rho_g(2), -1.0_dp)
     170          114 :             CALL pw_scale(rho_g(2), -1.0_dp)
     171          114 :             CALL auxbas_pw_pool%give_back_pw(rho_tmp)
     172              :          END IF
     173              : 
     174         2990 :          DO ispin = 1, nspin
     175         1552 :             CALL pw_transfer(rho_g(ispin), rho_r(ispin))
     176         2990 :             tot_rho_r(ispin) = pw_integrate_function(rho_r(ispin), isign=-1)
     177              :          END DO
     178              :       END IF
     179              : 
     180         1982 :       CALL timestop(handle)
     181              : 
     182         1986 :    END SUBROUTINE gspace_mixing
     183              : 
     184              : ! **************************************************************************************************
     185              : !> \brief G-space mixing performed via the Kerker damping on the density on the grid
     186              : !>        thus affecting only the caluclation of the potential, but not the denisity matrix
     187              : !> \param qs_env ...
     188              : !> \param mixing_store ...
     189              : !> \param rho ...
     190              : !> \par History
     191              : !>      02.2009
     192              : !> \author MI
     193              : ! **************************************************************************************************
     194              : 
     195           92 :    SUBROUTINE gmix_potential_only(qs_env, mixing_store, rho)
     196              : 
     197              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     198              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     199              :       TYPE(qs_rho_type), POINTER                         :: rho
     200              : 
     201              :       CHARACTER(len=*), PARAMETER :: routineN = 'gmix_potential_only'
     202              : 
     203           46 :       COMPLEX(dp), DIMENSION(:), POINTER                 :: cc_new
     204              :       INTEGER                                            :: handle, iatom, ig, ispin, natom, ng, &
     205              :                                                             nspin
     206              :       LOGICAL                                            :: gapw
     207              :       REAL(dp)                                           :: alpha, f_mix
     208              :       TYPE(dft_control_type), POINTER                    :: dft_control
     209           46 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g
     210           46 :       TYPE(rho_atom_type), DIMENSION(:), POINTER         :: rho_atom
     211              : 
     212            0 :       CPASSERT(ASSOCIATED(mixing_store%rhoin))
     213           46 :       CPASSERT(ASSOCIATED(mixing_store%kerker_factor))
     214              : 
     215           46 :       CALL timeset(routineN, handle)
     216           46 :       NULLIFY (cc_new, dft_control, rho_atom, rho_g)
     217              : 
     218           46 :       CALL get_qs_env(qs_env, dft_control=dft_control)
     219           46 :       CALL qs_rho_get(rho, rho_g=rho_g)
     220              : 
     221           46 :       nspin = SIZE(rho_g, 1)
     222           46 :       ng = SIZE(rho_g(1)%pw_grid%gsq)
     223              : 
     224           46 :       gapw = dft_control%qs_control%gapw
     225           46 :       alpha = mixing_store%alpha
     226              : 
     227           92 :       DO ispin = 1, nspin
     228           46 :          cc_new => rho_g(ispin)%array
     229       580654 :          DO ig = 1, mixing_store%ig_max ! ng
     230       580608 :             f_mix = mixing_store%alpha*mixing_store%kerker_factor(ig)
     231       580608 :             cc_new(ig) = (1.0_dp - f_mix)*mixing_store%rhoin(ispin)%cc(ig) + f_mix*cc_new(ig)
     232       580654 :             mixing_store%rhoin(ispin)%cc(ig) = cc_new(ig)
     233              :          END DO
     234           92 :          DO ig = mixing_store%ig_max + 1, ng
     235            0 :             f_mix = mixing_store%alpha
     236            0 :             cc_new(ig) = (1.0_dp - f_mix)*mixing_store%rhoin(ispin)%cc(ig) + f_mix*cc_new(ig)
     237           46 :             mixing_store%rhoin(ispin)%cc(ig) = cc_new(ig)
     238              :          END DO
     239              : 
     240              :       END DO
     241              : 
     242           46 :       IF (mixing_store%gmix_p .AND. gapw) THEN
     243              :          CALL get_qs_env(qs_env=qs_env, &
     244            8 :                          rho_atom_set=rho_atom)
     245            8 :          natom = SIZE(rho_atom)
     246           16 :          DO ispin = 1, nspin
     247           80 :             DO iatom = 1, natom
     248           72 :                IF (mixing_store%paw(iatom)) THEN
     249              :                   rho_atom(iatom)%cpc_h(ispin)%r_coef = alpha*rho_atom(iatom)%cpc_h(ispin)%r_coef + &
     250         7408 :                                                         mixing_store%cpc_h_in(iatom, ispin)%r_coef*(1._dp - alpha)
     251              :                   rho_atom(iatom)%cpc_s(ispin)%r_coef = alpha*rho_atom(iatom)%cpc_s(ispin)%r_coef + &
     252         7408 :                                                         mixing_store%cpc_s_in(iatom, ispin)%r_coef*(1._dp - alpha)
     253         7408 :                   mixing_store%cpc_h_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef
     254         7408 :                   mixing_store%cpc_s_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef
     255              :                END IF
     256              :             END DO
     257              :          END DO
     258              :       END IF
     259              : 
     260           46 :       CALL timestop(handle)
     261              : 
     262           46 :    END SUBROUTINE gmix_potential_only
     263              : 
     264              : ! **************************************************************************************************
     265              : !> \brief Pulay Mixing using as metrics for the residual the Kerer damping factor
     266              : !>        The mixing is applied directly on the density in reciprocal space,
     267              : !>        therefore it affects the potentials
     268              : !>        on the grid but not the density matrix
     269              : !> \param qs_env ...
     270              : !> \param mixing_store ...
     271              : !> \param rho ...
     272              : !> \param para_env ...
     273              : !> \par History
     274              : !>      03.2009
     275              : !> \author MI
     276              : ! **************************************************************************************************
     277              : 
     278          184 :    SUBROUTINE pulay_mixing(qs_env, mixing_store, rho, para_env)
     279              : 
     280              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     281              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     282              :       TYPE(qs_rho_type), POINTER                         :: rho
     283              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     284              : 
     285              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'pulay_mixing'
     286              : 
     287          184 :       COMPLEX(dp), ALLOCATABLE, DIMENSION(:)             :: cc_mix
     288              :       INTEGER                                            :: handle, i, iatom, ib, ibb, ig, ispin, &
     289              :                                                             jb, n1, n2, natom, nb, nb1, nbuffer, &
     290              :                                                             ng, nspin
     291              :       LOGICAL                                            :: gapw
     292              :       REAL(dp)                                           :: alpha_kerker, alpha_pulay, beta, f_mix, &
     293              :                                                             inv_err, norm, norm_c_inv, res_norm, &
     294              :                                                             vol
     295          184 :       REAL(dp), ALLOCATABLE, DIMENSION(:)                :: alpha_c, ev
     296          184 :       REAL(dp), ALLOCATABLE, DIMENSION(:, :)             :: b, c, c_inv, cpc_h_mix, cpc_s_mix
     297              :       TYPE(dft_control_type), POINTER                    :: dft_control
     298          184 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g
     299          184 :       TYPE(rho_atom_type), DIMENSION(:), POINTER         :: rho_atom
     300              : 
     301            0 :       CPASSERT(ASSOCIATED(mixing_store%res_buffer))
     302          184 :       CPASSERT(ASSOCIATED(mixing_store%rhoin_buffer))
     303          184 :       NULLIFY (dft_control, rho_atom, rho_g)
     304          184 :       CALL timeset(routineN, handle)
     305              : 
     306          184 :       CALL get_qs_env(qs_env, dft_control=dft_control)
     307          184 :       CALL qs_rho_get(rho, rho_g=rho_g)
     308          184 :       nspin = SIZE(rho_g, 1)
     309          184 :       ng = SIZE(mixing_store%res_buffer(1, 1)%cc)
     310          184 :       vol = rho_g(1)%pw_grid%vol
     311              : 
     312          184 :       alpha_kerker = mixing_store%alpha
     313          184 :       beta = mixing_store%pulay_beta
     314          184 :       alpha_pulay = mixing_store%pulay_alpha
     315          184 :       nbuffer = mixing_store%nbuffer
     316          184 :       gapw = dft_control%qs_control%gapw
     317          184 :       IF (gapw) THEN
     318           12 :          CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
     319           12 :          natom = SIZE(rho_atom)
     320              :       END IF
     321              : 
     322          552 :       ALLOCATE (cc_mix(ng))
     323              : 
     324          184 :       IF (nspin == 2) THEN
     325           14 :          CALL pw_axpy(rho_g(1), rho_g(2), 1.0_dp, -1.0_dp)
     326        96782 :          DO ig = 1, ng
     327        96782 :             mixing_store%rhoin(2)%cc(ig) = mixing_store%rhoin(1)%cc(ig) - mixing_store%rhoin(2)%cc(ig)
     328              :          END DO
     329           14 :          IF (gapw .AND. mixing_store%gmix_p) THEN
     330            0 :             DO iatom = 1, natom
     331            0 :                IF (mixing_store%paw(iatom)) THEN
     332            0 :                   rho_atom(iatom)%cpc_h(2)%r_coef = rho_atom(iatom)%cpc_h(1)%r_coef - rho_atom(iatom)%cpc_h(2)%r_coef
     333            0 :                   rho_atom(iatom)%cpc_s(2)%r_coef = rho_atom(iatom)%cpc_s(1)%r_coef - rho_atom(iatom)%cpc_s(2)%r_coef
     334              :                   mixing_store%cpc_h_in(iatom, 2)%r_coef = mixing_store%cpc_h_in(iatom, 1)%r_coef - &
     335            0 :                                                            mixing_store%cpc_h_in(iatom, 2)%r_coef
     336              :                   mixing_store%cpc_s_in(iatom, 2)%r_coef = mixing_store%cpc_s_in(iatom, 1)%r_coef - &
     337            0 :                                                            mixing_store%cpc_s_in(iatom, 2)%r_coef
     338              :                END IF
     339              :             END DO
     340              :          END IF
     341              :       END IF
     342              : 
     343          382 :       DO ispin = 1, nspin
     344          198 :          ib = MODULO(mixing_store%ncall_p(ispin), nbuffer) + 1
     345              : 
     346          198 :          mixing_store%ncall_p(ispin) = mixing_store%ncall_p(ispin) + 1
     347          198 :          nb = MIN(mixing_store%ncall_p(ispin), nbuffer)
     348          198 :          ibb = MODULO(mixing_store%ncall_p(ispin), nbuffer) + 1
     349              : 
     350      8641926 :          mixing_store%res_buffer(ib, ispin)%cc(:) = CMPLX(0._dp, 0._dp, KIND=dp)
     351          198 :          norm = 0.0_dp
     352      1306566 :          IF (nb == 1) mixing_store%rhoin_buffer(1, ispin)%cc = mixing_store%rhoin(ispin)%cc
     353          198 :          res_norm = 0.0_dp
     354      8641926 :          DO ig = 1, ng
     355      8641728 :             f_mix = mixing_store%kerker_factor(ig)
     356              :             mixing_store%res_buffer(ib, ispin)%cc(ig) = f_mix*(rho_g(ispin)%array(ig) - &
     357      8641728 :                                                                mixing_store%rhoin_buffer(ib, ispin)%cc(ig))
     358              :             res_norm = res_norm + &
     359              :                        REAL(mixing_store%res_buffer(ib, ispin)%cc(ig), dp)*REAL(mixing_store%res_buffer(ib, ispin)%cc(ig), dp) + &
     360      8641926 :                        AIMAG(mixing_store%res_buffer(ib, ispin)%cc(ig))*AIMAG(mixing_store%res_buffer(ib, ispin)%cc(ig))
     361              :          END DO
     362              : 
     363          198 :          CALL para_env%sum(res_norm)
     364          198 :          res_norm = SQRT(res_norm)
     365              : 
     366          198 :          IF (res_norm < 1.E-14_dp) THEN
     367            0 :             mixing_store%ncall_p(ispin) = mixing_store%ncall_p(ispin) - 1
     368              :          ELSE
     369          198 :             nb1 = nb + 1
     370          198 :             IF (ALLOCATED(b)) DEALLOCATE (b)
     371          792 :             ALLOCATE (b(nb1, nb1))
     372         5202 :             b = 0.0_dp
     373          198 :             IF (ALLOCATED(c)) DEALLOCATE (c)
     374          792 :             ALLOCATE (c(nb, nb))
     375         3518 :             c = 0.0_dp
     376          198 :             IF (ALLOCATED(c_inv)) DEALLOCATE (c_inv)
     377          594 :             ALLOCATE (c_inv(nb, nb))
     378         3518 :             c_inv = 0.0_dp
     379          198 :             IF (ALLOCATED(alpha_c)) DEALLOCATE (alpha_c)
     380          594 :             ALLOCATE (alpha_c(nb))
     381          842 :             alpha_c = 0.0_dp
     382          198 :             norm_c_inv = 0.0_dp
     383          198 :             IF (ALLOCATED(ev)) DEALLOCATE (ev)
     384          594 :             ALLOCATE (ev(nb1))
     385         1040 :             ev = 0.0_dp
     386              : 
     387              :          END IF
     388              : 
     389          842 :          DO jb = 1, nb
     390          644 :             mixing_store%pulay_matrix(jb, ib, ispin) = 0.0_dp
     391     33413252 :             DO ig = 1, ng
     392     33412608 :                f_mix = mixing_store%special_metric(ig)
     393              :                mixing_store%pulay_matrix(jb, ib, ispin) = mixing_store%pulay_matrix(jb, ib, ispin) + &
     394              :                                                           f_mix*(REAL(mixing_store%res_buffer(jb, ispin)%cc(ig), dp) &
     395              :                                                                  *REAL(mixing_store%res_buffer(ib, ispin)%cc(ig), dp) + &
     396              :                                                                  AIMAG(mixing_store%res_buffer(jb, ispin)%cc(ig))* &
     397     33413252 :                                                                  AIMAG(mixing_store%res_buffer(ib, ispin)%cc(ig)))
     398              :             END DO
     399          644 :             CALL para_env%sum(mixing_store%pulay_matrix(jb, ib, ispin))
     400          644 :             mixing_store%pulay_matrix(jb, ib, ispin) = mixing_store%pulay_matrix(jb, ib, ispin)*vol*vol
     401          842 :             mixing_store%pulay_matrix(ib, jb, ispin) = mixing_store%pulay_matrix(jb, ib, ispin)
     402              :          END DO
     403              : 
     404          198 :          IF (nb == 1 .OR. res_norm < 1.E-14_dp) THEN
     405      1306406 :             DO ig = 1, ng
     406      1306368 :                f_mix = alpha_kerker*mixing_store%kerker_factor(ig)
     407              :                cc_mix(ig) = rho_g(ispin)%array(ig) - &
     408      1306368 :                             mixing_store%rhoin_buffer(ib, ispin)%cc(ig)
     409              :                rho_g(ispin)%array(ig) = f_mix*cc_mix(ig) + &
     410      1306368 :                                         mixing_store%rhoin_buffer(ib, ispin)%cc(ig)
     411      1306406 :                mixing_store%rhoin_buffer(ibb, ispin)%cc(ig) = rho_g(ispin)%array(ig)
     412              :             END DO
     413           38 :             IF (mixing_store%gmix_p) THEN
     414            2 :                IF (gapw) THEN
     415           18 :                   DO iatom = 1, natom
     416           18 :                      IF (mixing_store%paw(iatom)) THEN
     417              :                         mixing_store%cpc_h_res_buffer(ib, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef - &
     418         1850 :                                                                                  mixing_store%cpc_h_in(iatom, ispin)%r_coef
     419              :                         mixing_store%cpc_s_res_buffer(ib, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef - &
     420         1850 :                                                                                  mixing_store%cpc_s_in(iatom, ispin)%r_coef
     421              : 
     422              :                         rho_atom(iatom)%cpc_h(ispin)%r_coef = alpha_kerker*rho_atom(iatom)%cpc_h(ispin)%r_coef + &
     423         1850 :                                                               (1.0_dp - alpha_kerker)*mixing_store%cpc_h_in(iatom, ispin)%r_coef
     424              :                         rho_atom(iatom)%cpc_s(ispin)%r_coef = alpha_kerker*rho_atom(iatom)%cpc_s(ispin)%r_coef + &
     425         1850 :                                                               (1.0_dp - alpha_kerker)*mixing_store%cpc_s_in(iatom, ispin)%r_coef
     426              : 
     427          926 :                         mixing_store%cpc_h_in_buffer(ib, iatom, ispin)%r_coef = mixing_store%cpc_h_in(iatom, ispin)%r_coef
     428          926 :                         mixing_store%cpc_s_in_buffer(ib, iatom, ispin)%r_coef = mixing_store%cpc_s_in(iatom, ispin)%r_coef
     429              : 
     430         1850 :                         mixing_store%cpc_h_in_buffer(ibb, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef
     431         1850 :                         mixing_store%cpc_s_in_buffer(ibb, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef
     432              :                      END IF
     433              :                   END DO
     434              :                END IF
     435              :             END IF
     436              :          ELSE
     437              : 
     438         3404 :             b(1:nb, 1:nb) = mixing_store%pulay_matrix(1:nb, 1:nb, ispin)
     439         3404 :             c(1:nb, 1:nb) = b(1:nb, 1:nb)
     440          766 :             b(nb1, 1:nb) = -1.0_dp
     441          766 :             b(1:nb, nb1) = -1.0_dp
     442          160 :             b(nb1, nb1) = 0.0_dp
     443              : 
     444          160 :             CALL invert_matrix(c, c_inv, inv_err, improve=.TRUE.)
     445          766 :             alpha_c = 0.0_dp
     446          766 :             DO i = 1, nb
     447         3404 :                DO jb = 1, nb
     448         2638 :                   alpha_c(i) = alpha_c(i) + c_inv(jb, i)
     449         3244 :                   norm_c_inv = norm_c_inv + c_inv(jb, i)
     450              :                END DO
     451              :             END DO
     452          766 :             alpha_c(1:nb) = alpha_c(1:nb)/norm_c_inv
     453      7335520 :             cc_mix = CMPLX(0._dp, 0._dp, KIND=dp)
     454          766 :             DO jb = 1, nb
     455     32107006 :                DO ig = 1, ng
     456              :                   cc_mix(ig) = cc_mix(ig) + &
     457              :                                alpha_c(jb)*(mixing_store%rhoin_buffer(jb, ispin)%cc(ig) + &
     458     32106846 :                                             mixing_store%pulay_beta*mixing_store%res_buffer(jb, ispin)%cc(ig))
     459              :                END DO
     460              :             END DO
     461      7335520 :             mixing_store%rhoin_buffer(ibb, ispin)%cc = CMPLX(0._dp, 0._dp, KIND=dp)
     462          160 :             IF (alpha_pulay > 0.0_dp) THEN
     463       233290 :                DO ig = 1, ng
     464       233280 :                   f_mix = alpha_pulay*mixing_store%kerker_factor(ig)
     465              :                   rho_g(ispin)%array(ig) = f_mix*rho_g(ispin)%array(ig) + &
     466       233280 :                                            (1.0_dp - f_mix)*cc_mix(ig)
     467       233290 :                   mixing_store%rhoin_buffer(ibb, ispin)%cc(ig) = rho_g(ispin)%array(ig)
     468              :                END DO
     469              :             ELSE
     470      7102230 :                DO ig = 1, ng
     471      7102080 :                   rho_g(ispin)%array(ig) = cc_mix(ig)
     472      7102230 :                   mixing_store%rhoin_buffer(ibb, ispin)%cc(ig) = rho_g(ispin)%array(ig)
     473              :                END DO
     474              :             END IF
     475              : 
     476          160 :             IF (mixing_store%gmix_p .AND. gapw) THEN
     477           10 :                CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
     478           90 :                DO iatom = 1, natom
     479           90 :                   IF (mixing_store%paw(iatom)) THEN
     480           10 :                      n1 = SIZE(rho_atom(iatom)%cpc_h(ispin)%r_coef, 1)
     481           10 :                      n2 = SIZE(rho_atom(iatom)%cpc_h(ispin)%r_coef, 2)
     482           40 :                      ALLOCATE (cpc_h_mix(n1, n2))
     483           30 :                      ALLOCATE (cpc_s_mix(n1, n2))
     484              : 
     485              :                      mixing_store%cpc_h_res_buffer(ib, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef - &
     486         9250 :                                                                               mixing_store%cpc_h_in_buffer(ib, iatom, ispin)%r_coef
     487              :                      mixing_store%cpc_s_res_buffer(ib, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef - &
     488         9250 :                                                                               mixing_store%cpc_s_in_buffer(ib, iatom, ispin)%r_coef
     489         4630 :                      cpc_h_mix = 0.0_dp
     490         4630 :                      cpc_s_mix = 0.0_dp
     491           48 :                      DO jb = 1, nb
     492              :                         cpc_h_mix(:, :) = cpc_h_mix(:, :) + &
     493              :                                           alpha_c(jb)*mixing_store%cpc_h_in_buffer(jb, iatom, ispin)%r_coef(:, :) + &
     494        17594 :                                           alpha_c(jb)*beta*mixing_store%cpc_h_res_buffer(jb, iatom, ispin)%r_coef(:, :)
     495              :                         cpc_s_mix(:, :) = cpc_s_mix(:, :) + &
     496              :                                           alpha_c(jb)*mixing_store%cpc_s_in_buffer(jb, iatom, ispin)%r_coef(:, :) + &
     497        17604 :                                           alpha_c(jb)*beta*mixing_store%cpc_s_res_buffer(jb, iatom, ispin)%r_coef(:, :)
     498              :                      END DO
     499              :                      rho_atom(iatom)%cpc_h(ispin)%r_coef = alpha_pulay*rho_atom(iatom)%cpc_h(ispin)%r_coef + &
     500         4630 :                                                            (1.0_dp - alpha_pulay)*cpc_h_mix
     501              :                      rho_atom(iatom)%cpc_s(ispin)%r_coef = alpha_pulay*rho_atom(iatom)%cpc_s(ispin)%r_coef + &
     502         4630 :                                                            (1.0_dp - alpha_pulay)*cpc_s_mix
     503         9250 :                      mixing_store%cpc_h_in_buffer(ibb, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef
     504         9250 :                      mixing_store%cpc_s_in_buffer(ibb, iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef
     505           10 :                      DEALLOCATE (cpc_h_mix)
     506           10 :                      DEALLOCATE (cpc_s_mix)
     507              :                   END IF
     508              :                END DO
     509              :             END IF
     510              :          END IF ! nb==1
     511              : 
     512          382 :          IF (res_norm > 1.E-14_dp) THEN
     513          198 :             DEALLOCATE (b)
     514          198 :             DEALLOCATE (ev)
     515          198 :             DEALLOCATE (c, c_inv, alpha_c)
     516              :          END IF
     517              : 
     518              :       END DO ! ispin
     519              : 
     520          184 :       DEALLOCATE (cc_mix)
     521              : 
     522          184 :       IF (nspin == 2) THEN
     523           14 :          CALL pw_axpy(rho_g(1), rho_g(2), 1.0_dp, -1.0_dp)
     524        96782 :          DO ig = 1, ng
     525        96782 :             mixing_store%rhoin(2)%cc(ig) = mixing_store%rhoin(1)%cc(ig) - mixing_store%rhoin(2)%cc(ig)
     526              :          END DO
     527           14 :          IF (gapw .AND. mixing_store%gmix_p) THEN
     528            0 :             DO iatom = 1, natom
     529            0 :                IF (mixing_store%paw(iatom)) THEN
     530            0 :                   rho_atom(iatom)%cpc_h(2)%r_coef = rho_atom(iatom)%cpc_h(1)%r_coef - rho_atom(iatom)%cpc_h(2)%r_coef
     531            0 :                   rho_atom(iatom)%cpc_s(2)%r_coef = rho_atom(iatom)%cpc_s(1)%r_coef - rho_atom(iatom)%cpc_s(2)%r_coef
     532              :                   mixing_store%cpc_h_in(iatom, 2)%r_coef = mixing_store%cpc_h_in(iatom, 1)%r_coef - &
     533            0 :                                                            mixing_store%cpc_h_in(iatom, 2)%r_coef
     534              :                   mixing_store%cpc_s_in(iatom, 2)%r_coef = mixing_store%cpc_s_in(iatom, 1)%r_coef - &
     535            0 :                                                            mixing_store%cpc_s_in(iatom, 2)%r_coef
     536              :                END IF
     537              :             END DO
     538              :          END IF
     539              : 
     540              :       END IF
     541              : 
     542          184 :       CALL timestop(handle)
     543              : 
     544          552 :    END SUBROUTINE pulay_mixing
     545              : 
     546              : ! **************************************************************************************************
     547              : !> \brief Broyden Mixing using as metrics for the residual the Kerer damping factor
     548              : !>        The mixing is applied directly on the density expansion in reciprocal space
     549              : !> \param qs_env ...
     550              : !> \param mixing_store ...
     551              : !> \param rho ...
     552              : !> \param para_env ...
     553              : !> \par History
     554              : !>      03.2009
     555              : !> \author MI
     556              : ! **************************************************************************************************
     557              : 
     558         1208 :    SUBROUTINE broyden_mixing(qs_env, mixing_store, rho, para_env)
     559              : 
     560              :       TYPE(qs_environment_type), POINTER                 :: qs_env
     561              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     562              :       TYPE(qs_rho_type), POINTER                         :: rho
     563              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     564              : 
     565              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'broyden_mixing'
     566              : 
     567              :       COMPLEX(dp)                                        :: cc_mix
     568         1208 :       COMPLEX(dp), ALLOCATABLE, DIMENSION(:)             :: res_rho
     569              :       INTEGER                                            :: handle, i, iatom, ib, ig, ispin, j, jb, &
     570              :                                                             kb, n1, n2, natom, nb, nbuffer, ng, &
     571              :                                                             nspin
     572              :       LOGICAL                                            :: gapw, only_kerker
     573              :       REAL(dp)                                           :: alpha, dcpc_h_res, dcpc_s_res, &
     574              :                                                             delta_norm, f_mix, inv_err, res_norm, &
     575              :                                                             rho_norm, valh, vals, w0
     576         1208 :       REAL(dp), ALLOCATABLE, DIMENSION(:)                :: c, g
     577         1208 :       REAL(dp), ALLOCATABLE, DIMENSION(:, :)             :: a, b
     578              :       TYPE(dft_control_type), POINTER                    :: dft_control
     579         1208 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g
     580         1208 :       TYPE(rho_atom_type), DIMENSION(:), POINTER         :: rho_atom
     581              : 
     582            0 :       CPASSERT(ASSOCIATED(mixing_store%res_buffer))
     583         1208 :       CPASSERT(ASSOCIATED(mixing_store%rhoin))
     584         1208 :       CPASSERT(ASSOCIATED(mixing_store%rhoin_old))
     585         1208 :       CPASSERT(ASSOCIATED(mixing_store%drho_buffer))
     586         1208 :       NULLIFY (dft_control, rho_atom, rho_g)
     587         1208 :       CALL timeset(routineN, handle)
     588              : 
     589         1208 :       CALL get_qs_env(qs_env, dft_control=dft_control)
     590         1208 :       CALL qs_rho_get(rho, rho_g=rho_g)
     591              : 
     592         1208 :       nspin = SIZE(rho_g, 1)
     593         1208 :       ng = SIZE(mixing_store%res_buffer(1, 1)%cc)
     594              : 
     595         1208 :       alpha = mixing_store%alpha
     596         1208 :       w0 = mixing_store%broy_w0
     597         1208 :       nbuffer = mixing_store%nbuffer
     598         1208 :       gapw = dft_control%qs_control%gapw
     599              : 
     600         3624 :       ALLOCATE (res_rho(ng))
     601              : 
     602         1208 :       mixing_store%ncall = mixing_store%ncall + 1
     603         1208 :       IF (mixing_store%ncall == 1) THEN
     604              :          only_kerker = .TRUE.
     605              :       ELSE
     606         1046 :          only_kerker = .FALSE.
     607         1046 :          nb = MIN(mixing_store%ncall - 1, nbuffer)
     608         1046 :          ib = MODULO(mixing_store%ncall - 2, nbuffer) + 1
     609              :       END IF
     610              : 
     611         1208 :       IF (gapw) THEN
     612          238 :          CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
     613          238 :          natom = SIZE(rho_atom)
     614              :       ELSE
     615              :          natom = 0
     616              :       END IF
     617              : 
     618         1208 :       IF (nspin == 2) THEN
     619          100 :          CALL pw_axpy(rho_g(1), rho_g(2), 1.0_dp, -1.0_dp)
     620      9659620 :          DO ig = 1, ng
     621      9659620 :             mixing_store%rhoin(2)%cc(ig) = mixing_store%rhoin(1)%cc(ig) - mixing_store%rhoin(2)%cc(ig)
     622              :          END DO
     623          100 :          IF (gapw .AND. mixing_store%gmix_p) THEN
     624           90 :             DO iatom = 1, natom
     625           90 :                IF (mixing_store%paw(iatom)) THEN
     626        60560 :                   rho_atom(iatom)%cpc_h(2)%r_coef = rho_atom(iatom)%cpc_h(1)%r_coef - rho_atom(iatom)%cpc_h(2)%r_coef
     627        60560 :                   rho_atom(iatom)%cpc_s(2)%r_coef = rho_atom(iatom)%cpc_s(1)%r_coef - rho_atom(iatom)%cpc_s(2)%r_coef
     628              :                   mixing_store%cpc_h_in(iatom, 2)%r_coef = mixing_store%cpc_h_in(iatom, 1)%r_coef - &
     629        60560 :                                                            mixing_store%cpc_h_in(iatom, 2)%r_coef
     630              :                   mixing_store%cpc_s_in(iatom, 2)%r_coef = mixing_store%cpc_s_in(iatom, 1)%r_coef - &
     631        60560 :                                                            mixing_store%cpc_s_in(iatom, 2)%r_coef
     632              :                END IF
     633              :             END DO
     634              :          END IF
     635              :       END IF
     636              : 
     637         2516 :       DO ispin = 1, nspin
     638    175392878 :          res_rho = z_zero
     639    175392878 :          DO ig = 1, ng
     640    175392878 :             res_rho(ig) = rho_g(ispin)%array(ig) - mixing_store%rhoin(ispin)%cc(ig)
     641              :          END DO
     642              : 
     643         2516 :          IF (only_kerker) THEN
     644     13717430 :             DO ig = 1, ng
     645     13717238 :                mixing_store%last_res(ispin)%cc(ig) = res_rho(ig)
     646     13717238 :                f_mix = alpha*mixing_store%kerker_factor(ig)
     647     13717238 :                rho_g(ispin)%array(ig) = mixing_store%rhoin(ispin)%cc(ig) + f_mix*res_rho(ig)
     648     13717238 :                mixing_store%rhoin_old(ispin)%cc(ig) = mixing_store%rhoin(ispin)%cc(ig)
     649     13717430 :                mixing_store%rhoin(ispin)%cc(ig) = rho_g(ispin)%array(ig)
     650              :             END DO
     651              : 
     652          192 :             IF (mixing_store%gmix_p) THEN
     653           24 :                IF (gapw) THEN
     654          216 :                   DO iatom = 1, natom
     655          216 :                      IF (mixing_store%paw(iatom)) THEN
     656              :                         mixing_store%cpc_h_lastres(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef - &
     657       245780 :                                                                           mixing_store%cpc_h_in(iatom, ispin)%r_coef
     658              :                         mixing_store%cpc_s_lastres(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef - &
     659       245780 :                                                                           mixing_store%cpc_s_in(iatom, ispin)%r_coef
     660              : 
     661              :                         rho_atom(iatom)%cpc_h(ispin)%r_coef = alpha*rho_atom(iatom)%cpc_h(ispin)%r_coef + &
     662       245780 :                                                               mixing_store%cpc_h_in(iatom, ispin)%r_coef*(1._dp - alpha)
     663              :                         rho_atom(iatom)%cpc_s(ispin)%r_coef = alpha*rho_atom(iatom)%cpc_s(ispin)%r_coef + &
     664       245780 :                                                               mixing_store%cpc_s_in(iatom, ispin)%r_coef*(1._dp - alpha)
     665              : 
     666       122972 :                         mixing_store%cpc_h_old(iatom, ispin)%r_coef = mixing_store%cpc_h_in(iatom, ispin)%r_coef
     667       122972 :                         mixing_store%cpc_s_old(iatom, ispin)%r_coef = mixing_store%cpc_s_in(iatom, ispin)%r_coef
     668       245780 :                         mixing_store%cpc_h_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef
     669       245780 :                         mixing_store%cpc_s_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef
     670              :                      END IF
     671              :                   END DO
     672              :                END IF
     673              :             END IF
     674              :          ELSE
     675              : 
     676         4464 :             ALLOCATE (a(nb, nb))
     677        39192 :             a = 0.0_dp
     678         3348 :             ALLOCATE (b(nb, nb))
     679        39192 :             b = 0.0_dp
     680         3348 :             ALLOCATE (c(nb))
     681         6282 :             c = 0.0_dp
     682         2232 :             ALLOCATE (g(nb))
     683         6282 :             g = 0.0_dp
     684              : 
     685         1116 :             delta_norm = 0.0_dp
     686         1116 :             res_norm = 0.0_dp
     687         1116 :             rho_norm = 0.0_dp
     688    161675448 :             DO ig = 1, ng
     689    161674332 :                mixing_store%res_buffer(ib, ispin)%cc(ig) = res_rho(ig) - mixing_store%last_res(ispin)%cc(ig)
     690    161674332 :                mixing_store%last_res(ispin)%cc(ig) = res_rho(ig)
     691              :                res_norm = res_norm + &
     692              :                           REAL(res_rho(ig), dp)*REAL(res_rho(ig), dp) + &
     693    161674332 :                           AIMAG(res_rho(ig))*AIMAG(res_rho(ig))
     694              :                delta_norm = delta_norm + &
     695              :                             REAL(mixing_store%res_buffer(ib, ispin)%cc(ig), dp)* &
     696              :                             REAL(mixing_store%res_buffer(ib, ispin)%cc(ig), dp) + &
     697              :                             AIMAG(mixing_store%res_buffer(ib, ispin)%cc(ig))* &
     698    161674332 :                             AIMAG(mixing_store%res_buffer(ib, ispin)%cc(ig))
     699              :                rho_norm = rho_norm + &
     700              :                           REAL(rho_g(ispin)%array(ig), dp)*REAL(rho_g(ispin)%array(ig), dp) + &
     701    161675448 :                           AIMAG(rho_g(ispin)%array(ig))*AIMAG(rho_g(ispin)%array(ig))
     702              :             END DO
     703    161675448 :             DO ig = 1, ng
     704              :                mixing_store%drho_buffer(ib, ispin)%cc(ig) = &
     705              :                   mixing_store%rhoin(ispin)%cc(ig) - &
     706    161675448 :                   mixing_store%rhoin_old(ispin)%cc(ig)
     707              :             END DO
     708         1116 :             CALL para_env%sum(delta_norm)
     709         1116 :             delta_norm = SQRT(delta_norm)
     710         1116 :             CALL para_env%sum(res_norm)
     711         1116 :             res_norm = SQRT(res_norm)
     712         1116 :             CALL para_env%sum(rho_norm)
     713         1116 :             rho_norm = SQRT(rho_norm)
     714              : 
     715         1116 :             IF (res_norm > 1.E-14_dp) THEN
     716    161675448 :                mixing_store%res_buffer(ib, ispin)%cc(:) = mixing_store%res_buffer(ib, ispin)%cc(:)/delta_norm
     717    161675448 :                mixing_store%drho_buffer(ib, ispin)%cc(:) = mixing_store%drho_buffer(ib, ispin)%cc(:)/delta_norm
     718              : 
     719         1116 :                IF (mixing_store%gmix_p .AND. gapw) THEN
     720          252 :                   DO iatom = 1, natom
     721          252 :                      IF (mixing_store%paw(iatom)) THEN
     722           28 :                         n1 = SIZE(mixing_store%cpc_s_in(iatom, ispin)%r_coef, 1)
     723           28 :                         n2 = SIZE(mixing_store%cpc_s_in(iatom, ispin)%r_coef, 2)
     724          616 :                         DO i = 1, n2
     725        12964 :                            DO j = 1, n1
     726              :                               mixing_store%dcpc_h_in(ib, iatom, ispin)%r_coef(j, i) = &
     727              :                                  (mixing_store%cpc_h_in(iatom, ispin)%r_coef(j, i) - &
     728        12348 :                                   mixing_store%cpc_h_old(iatom, ispin)%r_coef(j, i))/delta_norm
     729              :                               dcpc_h_res = ((rho_atom(iatom)%cpc_h(ispin)%r_coef(j, i) - &
     730              :                                              mixing_store%cpc_h_in(iatom, ispin)%r_coef(j, i)) - &
     731        12348 :                                             mixing_store%cpc_h_lastres(iatom, ispin)%r_coef(j, i))/delta_norm
     732              :                               mixing_store%cpc_h_lastres(iatom, ispin)%r_coef(j, i) = rho_atom(iatom)%cpc_h(ispin)%r_coef(j, i) - &
     733        12348 :                                                                                     mixing_store%cpc_h_in(iatom, ispin)%r_coef(j, i)
     734              : 
     735              :                               mixing_store%dcpc_s_in(ib, iatom, ispin)%r_coef(j, i) = &
     736              :                                  (mixing_store%cpc_s_in(iatom, ispin)%r_coef(j, i) - &
     737        12348 :                                   mixing_store%cpc_s_old(iatom, ispin)%r_coef(j, i))/delta_norm
     738              :                               dcpc_s_res = ((rho_atom(iatom)%cpc_s(ispin)%r_coef(j, i) - &
     739              :                                              mixing_store%cpc_s_in(iatom, ispin)%r_coef(j, i)) - &
     740        12348 :                                             mixing_store%cpc_s_lastres(iatom, ispin)%r_coef(j, i))/delta_norm
     741              :                               mixing_store%cpc_s_lastres(iatom, ispin)%r_coef(j, i) = rho_atom(iatom)%cpc_s(ispin)%r_coef(j, i) - &
     742        12348 :                                                                                     mixing_store%cpc_s_in(iatom, ispin)%r_coef(j, i)
     743              : 
     744              :                               mixing_store%dcpc_h_in(ib, iatom, ispin)%r_coef(j, i) = &
     745              :                                  alpha*dcpc_h_res + &
     746        12348 :                                  mixing_store%dcpc_h_in(ib, iatom, ispin)%r_coef(j, i)
     747              :                               mixing_store%dcpc_s_in(ib, iatom, ispin)%r_coef(j, i) = &
     748              :                                  alpha*dcpc_s_res + &
     749        12936 :                                  mixing_store%dcpc_s_in(ib, iatom, ispin)%r_coef(j, i)
     750              :                            END DO
     751              :                         END DO
     752              :                      END IF
     753              :                   END DO
     754              :                END IF
     755              : 
     756        39192 :                a(:, :) = 0.0_dp
     757    161675448 :                DO ig = 1, ng
     758    161674332 :                   f_mix = alpha*mixing_store%kerker_factor(ig)
     759              :                   mixing_store%drho_buffer(ib, ispin)%cc(ig) = &
     760              :                      f_mix*mixing_store%res_buffer(ib, ispin)%cc(ig) + &
     761    161675448 :                      mixing_store%drho_buffer(ib, ispin)%cc(ig)
     762              :                END DO
     763         6282 :                DO jb = 1, nb
     764        25320 :                   DO kb = jb, nb
     765   4070645342 :                      DO ig = 1, mixing_store%ig_max !ng
     766              :                         a(kb, jb) = a(kb, jb) + mixing_store%p_metric(ig)*( &
     767              :                                     REAL(mixing_store%res_buffer(jb, ispin)%cc(ig), dp)* &
     768              :                                     REAL(mixing_store%res_buffer(kb, ispin)%cc(ig), dp) + &
     769              :                                     AIMAG(mixing_store%res_buffer(jb, ispin)%cc(ig))* &
     770   4070645342 :                                     AIMAG(mixing_store%res_buffer(kb, ispin)%cc(ig)))
     771              :                      END DO
     772        24204 :                      a(jb, kb) = a(kb, jb)
     773              :                   END DO
     774              :                END DO
     775         1116 :                CALL para_env%sum(a)
     776              : 
     777         6282 :                C = 0.0_dp
     778         6282 :                DO jb = 1, nb
     779         5166 :                   a(jb, jb) = w0 + a(jb, jb)
     780    962437602 :                   DO ig = 1, mixing_store%ig_max !ng
     781              :                      c(jb) = c(jb) + mixing_store%p_metric(ig)*( &
     782              :                              REAL(mixing_store%res_buffer(jb, ispin)%cc(ig), dp)*REAL(res_rho(ig), dp) + &
     783    962436486 :                              AIMAG(mixing_store%res_buffer(jb, ispin)%cc(ig))*AIMAG(res_rho(ig)))
     784              :                   END DO
     785              :                END DO
     786         1116 :                CALL para_env%sum(c)
     787         1116 :                CALL invert_matrix(a, b, inv_err)
     788              : 
     789         1116 :                CALL dgemv('T', nb, nb, 1.0_dp, B, nb, C, 1, 0.0_dp, G, 1)
     790              :             ELSE
     791            0 :                G = 0.0_dp
     792              :             END IF
     793              : 
     794    161675448 :             DO ig = 1, ng
     795    161674332 :                cc_mix = z_zero
     796   1124105652 :                DO jb = 1, nb
     797   1124105652 :                   cc_mix = cc_mix - G(jb)*mixing_store%drho_buffer(jb, ispin)%cc(ig)
     798              :                END DO
     799    161674332 :                f_mix = alpha*mixing_store%kerker_factor(ig)
     800              : 
     801    161674332 :                IF (res_norm > 1.E-14_dp) rho_g(ispin)%array(ig) = mixing_store%rhoin(ispin)%cc(ig) + &
     802    161674332 :                                                                   f_mix*res_rho(ig) + cc_mix
     803    161674332 :                mixing_store%rhoin_old(ispin)%cc(ig) = mixing_store%rhoin(ispin)%cc(ig)
     804    161675448 :                mixing_store%rhoin(ispin)%cc(ig) = rho_g(ispin)%array(ig)
     805              :             END DO
     806              : 
     807         1116 :             IF (mixing_store%gmix_p) THEN
     808           28 :                IF (gapw) THEN
     809          252 :                   DO iatom = 1, natom
     810          252 :                      IF (mixing_store%paw(iatom)) THEN
     811           28 :                         n1 = SIZE(mixing_store%cpc_s_in(iatom, ispin)%r_coef, 1)
     812           28 :                         n2 = SIZE(mixing_store%cpc_s_in(iatom, ispin)%r_coef, 2)
     813          616 :                         DO i = 1, n2
     814        12964 :                            DO j = 1, n1
     815        12348 :                               valh = 0.0_dp
     816        12348 :                               vals = 0.0_dp
     817        61740 :                               DO jb = 1, nb
     818        49392 :                                  valh = valh - G(jb)*mixing_store%dcpc_h_in(jb, iatom, ispin)%r_coef(j, i)
     819        61740 :                                  vals = vals - G(jb)*mixing_store%dcpc_s_in(jb, iatom, ispin)%r_coef(j, i)
     820              :                               END DO
     821        12936 :                               IF (res_norm > 1.E-14_dp) THEN
     822              :                                  rho_atom(iatom)%cpc_h(ispin)%r_coef(j, i) = &
     823              :                                     alpha*rho_atom(iatom)%cpc_h(ispin)%r_coef(j, i) + &
     824        12348 :                                     mixing_store%cpc_h_in(iatom, ispin)%r_coef(j, i)*(1._dp - alpha) + valh
     825              :                                  rho_atom(iatom)%cpc_s(ispin)%r_coef(j, i) = &
     826              :                                     alpha*rho_atom(iatom)%cpc_s(ispin)%r_coef(j, i) + &
     827        12348 :                                     mixing_store%cpc_s_in(iatom, ispin)%r_coef(j, i)*(1._dp - alpha) + vals
     828              :                               END IF
     829              :                            END DO
     830              :                         END DO
     831              : 
     832        12964 :                         mixing_store%cpc_h_old(iatom, ispin)%r_coef = mixing_store%cpc_h_in(iatom, ispin)%r_coef
     833        12964 :                         mixing_store%cpc_s_old(iatom, ispin)%r_coef = mixing_store%cpc_s_in(iatom, ispin)%r_coef
     834        25900 :                         mixing_store%cpc_h_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_h(ispin)%r_coef
     835        25900 :                         mixing_store%cpc_s_in(iatom, ispin)%r_coef = rho_atom(iatom)%cpc_s(ispin)%r_coef
     836              :                      END IF
     837              :                   END DO
     838              :                END IF
     839              :             END IF
     840              : 
     841         1116 :             DEALLOCATE (a, b, c, g)
     842              :          END IF
     843              : 
     844              :       END DO ! ispin
     845         1208 :       IF (nspin == 2) THEN
     846          100 :          CALL pw_axpy(rho_g(1), rho_g(2), 1.0_dp, -1.0_dp)
     847      9659620 :          DO ig = 1, ng
     848      9659620 :             mixing_store%rhoin(2)%cc(ig) = mixing_store%rhoin(1)%cc(ig) - mixing_store%rhoin(2)%cc(ig)
     849              :          END DO
     850          100 :          IF (gapw .AND. mixing_store%gmix_p) THEN
     851           90 :             DO iatom = 1, natom
     852           90 :                IF (mixing_store%paw(iatom)) THEN
     853        60560 :                   rho_atom(iatom)%cpc_h(2)%r_coef = rho_atom(iatom)%cpc_h(1)%r_coef - rho_atom(iatom)%cpc_h(2)%r_coef
     854        60560 :                   rho_atom(iatom)%cpc_s(2)%r_coef = rho_atom(iatom)%cpc_s(1)%r_coef - rho_atom(iatom)%cpc_s(2)%r_coef
     855              :                   mixing_store%cpc_h_in(iatom, 2)%r_coef = mixing_store%cpc_h_in(iatom, 1)%r_coef - &
     856        60560 :                                                            mixing_store%cpc_h_in(iatom, 2)%r_coef
     857              :                   mixing_store%cpc_s_in(iatom, 2)%r_coef = mixing_store%cpc_s_in(iatom, 1)%r_coef - &
     858        60560 :                                                            mixing_store%cpc_s_in(iatom, 2)%r_coef
     859              :                END IF
     860              :             END DO
     861              :          END IF
     862              : 
     863              :       END IF
     864              : 
     865         1208 :       DEALLOCATE (res_rho)
     866              : 
     867         1208 :       CALL timestop(handle)
     868              : 
     869         3624 :    END SUBROUTINE broyden_mixing
     870              : 
     871              : ! **************************************************************************************************
     872              : !> \brief Multisecant scheme to perform charge density Mixing
     873              : !>        as preconditioner we use the Kerker damping factor
     874              : !>        The mixing is applied directly on the density in reciprocal space,
     875              : !>        therefore it affects the potentials
     876              : !>        on the grid but not the density matrix
     877              : !> \param mixing_store ...
     878              : !> \param rho ...
     879              : !> \param para_env ...
     880              : !> \par History
     881              : !>      05.2009
     882              : !> \author MI
     883              : ! **************************************************************************************************
     884            0 :    SUBROUTINE multisecant_mixing(mixing_store, rho, para_env)
     885              : 
     886              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     887              :       TYPE(qs_rho_type), POINTER                         :: rho
     888              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     889              : 
     890              :       CHARACTER(len=*), PARAMETER :: routineN = 'multisecant_mixing'
     891              :       COMPLEX(KIND=dp), PARAMETER                        :: cmone = (-1.0_dp, 0.0_dp), &
     892              :                                                             cone = (1.0_dp, 0.0_dp), &
     893              :                                                             czero = (0.0_dp, 0.0_dp)
     894              : 
     895              :       COMPLEX(dp)                                        :: saa, yaa
     896            0 :       COMPLEX(dp), ALLOCATABLE, DIMENSION(:)             :: gn_global, pgn, res_matrix_global, &
     897            0 :                                                             tmp_vec, ugn
     898            0 :       COMPLEX(dp), ALLOCATABLE, DIMENSION(:, :)          :: a_matrix, res_matrix, sa, step_matrix, ya
     899            0 :       COMPLEX(dp), DIMENSION(:), POINTER                 :: gn
     900              :       INTEGER                                            :: handle, ib, ib_next, ib_prev, ig, &
     901              :                                                             ig_global, iig, ispin, jb, kb, nb, &
     902              :                                                             nbuffer, ng, ng_global, nspin
     903              :       LOGICAL                                            :: use_zgemm, use_zgemm_rev
     904              :       REAL(dp) :: alpha, f_mix, gn_norm, gn_norm_old, inv_err, n_low, n_up, pgn_norm, prec, &
     905              :          r_step, reg_par, sigma_max, sigma_tilde, step_size
     906            0 :       REAL(dp), ALLOCATABLE, DIMENSION(:)                :: norm_res, norm_res_low, norm_res_up
     907            0 :       REAL(dp), ALLOCATABLE, DIMENSION(:, :)             :: b_matrix, binv_matrix
     908            0 :       REAL(dp), DIMENSION(:), POINTER                    :: g2
     909              :       REAL(dp), SAVE                                     :: sigma_old = 1.0_dp
     910            0 :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER        :: rho_g
     911              : 
     912            0 :       CPASSERT(ASSOCIATED(mixing_store))
     913              : 
     914            0 :       CALL timeset(routineN, handle)
     915              : 
     916            0 :       NULLIFY (gn, rho_g)
     917              : 
     918            0 :       use_zgemm = .FALSE.
     919            0 :       use_zgemm_rev = .TRUE.
     920              : 
     921              :       ! prepare the parameters
     922            0 :       CALL qs_rho_get(rho, rho_g=rho_g)
     923              : 
     924            0 :       nspin = SIZE(rho_g, 1)
     925              :       ! not implemented for large grids.
     926            0 :       CPASSERT(rho_g(1)%pw_grid%ngpts < HUGE(ng_global))
     927            0 :       ng_global = INT(rho_g(1)%pw_grid%ngpts)
     928            0 :       ng = SIZE(mixing_store%rhoin_buffer(1, 1)%cc)
     929            0 :       alpha = mixing_store%alpha
     930              : 
     931            0 :       sigma_max = mixing_store%sigma_max
     932            0 :       reg_par = mixing_store%reg_par
     933            0 :       r_step = mixing_store%r_step
     934            0 :       nbuffer = mixing_store%nbuffer
     935              : 
     936              :       ! determine the step number, and multisecant iteration
     937            0 :       nb = MIN(mixing_store%ncall, nbuffer - 1)
     938            0 :       ib = MODULO(mixing_store%ncall, nbuffer) + 1
     939            0 :       IF (mixing_store%ncall > 0) THEN
     940            0 :          ib_prev = MODULO(mixing_store%ncall - 1, nbuffer) + 1
     941              :       ELSE
     942              :          ib_prev = 0
     943              :       END IF
     944            0 :       mixing_store%ncall = mixing_store%ncall + 1
     945            0 :       ib_next = MODULO(mixing_store%ncall, nbuffer) + 1
     946              : 
     947              :       ! compute the residual gn and its norm gn_norm
     948            0 :       DO ispin = 1, nspin
     949            0 :          gn => mixing_store%res_buffer(ib, ispin)%cc
     950            0 :          gn_norm = 0.0_dp
     951            0 :          DO ig = 1, ng
     952            0 :             gn(ig) = (rho_g(ispin)%array(ig) - mixing_store%rhoin_buffer(ib, ispin)%cc(ig))
     953              :             gn_norm = gn_norm + &
     954            0 :                       REAL(gn(ig), dp)*REAL(gn(ig), dp) + AIMAG(gn(ig))*AIMAG(gn(ig))
     955              :          END DO
     956            0 :          CALL para_env%sum(gn_norm)
     957            0 :          gn_norm = SQRT(gn_norm)
     958            0 :          mixing_store%norm_res_buffer(ib, ispin) = gn_norm
     959              :       END DO
     960              : 
     961            0 :       IF (nb == 0) THEN
     962              :          !simple mixing
     963            0 :          DO ispin = 1, nspin
     964            0 :             DO ig = 1, ng
     965            0 :                f_mix = alpha*mixing_store%kerker_factor(ig)
     966              :                rho_g(ispin)%array(ig) = mixing_store%rhoin_buffer(1, ispin)%cc(ig) + &
     967            0 :                                         f_mix*mixing_store%res_buffer(1, ispin)%cc(ig)
     968            0 :                mixing_store%rhoin_buffer(ib_next, ispin)%cc(ig) = rho_g(ispin)%array(ig)
     969              :             END DO
     970              :          END DO
     971            0 :          CALL timestop(handle)
     972            0 :          RETURN
     973              :       END IF
     974              : 
     975              :       ! allocate temporary arrays
     976              :       ! step_matrix  S ngxnb
     977            0 :       ALLOCATE (step_matrix(ng, nb))
     978              :       ! res_matrix Y  ngxnb
     979            0 :       ALLOCATE (res_matrix(ng, nb))
     980              :       ! matrix A  nbxnb
     981            0 :       ALLOCATE (a_matrix(nb, ng_global))
     982              :       ! PSI nb vector of norms
     983            0 :       ALLOCATE (norm_res(nb))
     984            0 :       ALLOCATE (norm_res_low(nb))
     985            0 :       ALLOCATE (norm_res_up(nb))
     986              : 
     987              :       ! matrix B   nbxnb
     988            0 :       ALLOCATE (b_matrix(nb, nb))
     989              :       ! matrix B_inv   nbxnb
     990            0 :       ALLOCATE (binv_matrix(nb, nb))
     991              : 
     992            0 :       ALLOCATE (gn_global(ng_global))
     993            0 :       ALLOCATE (res_matrix_global(ng_global))
     994              :       IF (use_zgemm) THEN
     995              :          ALLOCATE (sa(ng, ng_global))
     996              :          ALLOCATE (ya(ng, ng_global))
     997              :       END IF
     998              :       IF (use_zgemm_rev) THEN
     999            0 :          ALLOCATE (tmp_vec(nb))
    1000              :       END IF
    1001            0 :       ALLOCATE (pgn(ng))
    1002            0 :       ALLOCATE (ugn(ng))
    1003              : 
    1004            0 :       DO ispin = 1, nspin
    1005              :          ! generate the global vector with the present residual
    1006            0 :          gn => mixing_store%res_buffer(ib, ispin)%cc
    1007            0 :          gn_global = z_zero
    1008            0 :          DO ig = 1, ng
    1009            0 :             ig_global = mixing_store%ig_global_index(ig)
    1010            0 :             gn_global(ig_global) = gn(ig)
    1011              :          END DO
    1012            0 :          CALL para_env%sum(gn_global)
    1013              : 
    1014              :          ! compute steps (matrix S) and residual differences (matrix Y)
    1015              :          ! with respect to the present
    1016              :          ! step and the present residual (use stored rho_in and res_buffer)
    1017              : 
    1018              :          ! These quantities are pre-conditioned by means of Kerker factor multipliccation
    1019            0 :          g2 => rho_g(1)%pw_grid%gsq
    1020              : 
    1021            0 :          DO jb = 1, nb + 1
    1022            0 :             IF (jb < ib) THEN
    1023              :                kb = jb
    1024            0 :             ELSEIF (jb > ib) THEN
    1025            0 :                kb = jb - 1
    1026              :             ELSE
    1027              :                CYCLE
    1028              :             END IF
    1029            0 :             norm_res(kb) = 0.0_dp
    1030            0 :             norm_res_low(kb) = 0.0_dp
    1031            0 :             norm_res_up(kb) = 0.0_dp
    1032            0 :             DO ig = 1, ng
    1033              : 
    1034            0 :                prec = 1.0_dp
    1035              : 
    1036              :                step_matrix(ig, kb) = prec*(mixing_store%rhoin_buffer(jb, ispin)%cc(ig) - &
    1037            0 :                                            mixing_store%rhoin_buffer(ib, ispin)%cc(ig))
    1038              :                res_matrix(ig, kb) = (mixing_store%res_buffer(jb, ispin)%cc(ig) - &
    1039            0 :                                      mixing_store%res_buffer(ib, ispin)%cc(ig))
    1040              :                norm_res(kb) = norm_res(kb) + REAL(res_matrix(ig, kb), dp)*REAL(res_matrix(ig, kb), dp) + &
    1041            0 :                               AIMAG(res_matrix(ig, kb))*AIMAG(res_matrix(ig, kb))
    1042            0 :                IF (g2(ig) < 4.0_dp) THEN
    1043              :                   norm_res_low(kb) = norm_res_low(kb) + &
    1044              :                                      REAL(res_matrix(ig, kb), dp)*REAL(res_matrix(ig, kb), dp) + &
    1045            0 :                                      AIMAG(res_matrix(ig, kb))*AIMAG(res_matrix(ig, kb))
    1046              :                ELSE
    1047              :                   norm_res_up(kb) = norm_res_up(kb) + &
    1048              :                                     REAL(res_matrix(ig, kb), dp)*REAL(res_matrix(ig, kb), dp) + &
    1049            0 :                                     AIMAG(res_matrix(ig, kb))*AIMAG(res_matrix(ig, kb))
    1050              :                END IF
    1051            0 :                res_matrix(ig, kb) = prec*res_matrix(ig, kb)
    1052              :             END DO
    1053              :          END DO !jb
    1054              : 
    1055              :          ! normalize each column of S and Y => Snorm Ynorm
    1056            0 :          CALL para_env%sum(norm_res)
    1057            0 :          CALL para_env%sum(norm_res_up)
    1058            0 :          CALL para_env%sum(norm_res_low)
    1059            0 :          norm_res(1:nb) = 1.0_dp/SQRT(norm_res(1:nb))
    1060              :          n_low = 0.0_dp
    1061              :          n_up = 0.0_dp
    1062            0 :          DO jb = 1, nb
    1063            0 :             n_low = n_low + norm_res_low(jb)/norm_res(jb)
    1064            0 :             n_up = n_up + norm_res_up(jb)/norm_res(jb)
    1065              :          END DO
    1066            0 :          DO ig = 1, ng
    1067            0 :             IF (g2(ig) > 4.0_dp) THEN
    1068            0 :                step_matrix(ig, 1:nb) = step_matrix(ig, 1:nb)*SQRT(n_low/n_up)
    1069            0 :                res_matrix(ig, 1:nb) = res_matrix(ig, 1:nb)*SQRT(n_low/n_up)
    1070              :             END IF
    1071              :          END DO
    1072            0 :          DO kb = 1, nb
    1073            0 :             step_matrix(1:ng, kb) = step_matrix(1:ng, kb)*norm_res(kb)
    1074            0 :             res_matrix(1:ng, kb) = res_matrix(1:ng, kb)*norm_res(kb)
    1075              :          END DO
    1076              : 
    1077              :          ! compute A as [(Ynorm^t Ynorm) + (alpha I)]^(-1) Ynorm^t
    1078              :          ! compute B
    1079            0 :          DO jb = 1, nb
    1080            0 :             DO kb = 1, nb
    1081            0 :                b_matrix(kb, jb) = 0.0_dp
    1082            0 :                DO ig = 1, ng
    1083              :                   ! it is assumed that summing over all G vector gives a real, because
    1084              :                   !  y(-G,kb) = (y(G,kb))*
    1085            0 :                   b_matrix(kb, jb) = b_matrix(kb, jb) + REAL(res_matrix(ig, kb)*res_matrix(ig, jb), dp)
    1086              :                END DO
    1087              :             END DO
    1088              :          END DO
    1089              : 
    1090            0 :          CALL para_env%sum(b_matrix)
    1091            0 :          DO jb = 1, nb
    1092            0 :             b_matrix(jb, jb) = b_matrix(jb, jb) + reg_par
    1093              :          END DO
    1094              :          ! invert B
    1095            0 :          CALL invert_matrix(b_matrix, binv_matrix, inv_err)
    1096              : 
    1097              :          ! A = Binv Ynorm^t
    1098            0 :          a_matrix = z_zero
    1099            0 :          DO kb = 1, nb
    1100            0 :             res_matrix_global = z_zero
    1101            0 :             DO ig = 1, ng
    1102            0 :                ig_global = mixing_store%ig_global_index(ig)
    1103            0 :                res_matrix_global(ig_global) = res_matrix(ig, kb)
    1104              :             END DO
    1105            0 :             CALL para_env%sum(res_matrix_global)
    1106              : 
    1107            0 :             DO jb = 1, nb
    1108            0 :                DO ig = 1, ng
    1109            0 :                   ig_global = mixing_store%ig_global_index(ig)
    1110              :                   a_matrix(jb, ig_global) = a_matrix(jb, ig_global) + &
    1111            0 :                                             binv_matrix(jb, kb)*res_matrix_global(ig_global)
    1112              :                END DO
    1113              :             END DO
    1114              :          END DO
    1115            0 :          CALL para_env%sum(a_matrix)
    1116              : 
    1117              :          ! compute the two components of gn that will be used to update rho
    1118            0 :          gn => mixing_store%res_buffer(ib, ispin)%cc
    1119            0 :          pgn_norm = 0.0_dp
    1120              : 
    1121              :          IF (use_zgemm) THEN
    1122              : 
    1123              :             CALL zgemm("N", "N", ng, ng_global, nb, cmone, step_matrix(1, 1), ng, &
    1124              :                        a_matrix(1, 1), nb, czero, sa(1, 1), ng)
    1125              :             CALL zgemm("N", "N", ng, ng_global, nb, cmone, res_matrix(1, 1), ng, &
    1126              :                        a_matrix(1, 1), nb, czero, ya(1, 1), ng)
    1127              :             DO ig = 1, ng
    1128              :                ig_global = mixing_store%ig_global_index(ig)
    1129              :                ya(ig, ig_global) = ya(ig, ig_global) + z_one
    1130              :             END DO
    1131              : 
    1132              :             CALL zgemv("N", ng, ng_global, cone, sa(1, 1), &
    1133              :                        ng, gn_global(1), 1, czero, pgn(1), 1)
    1134              :             CALL zgemv("N", ng, ng_global, cone, ya(1, 1), &
    1135              :                        ng, gn_global(1), 1, czero, ugn(1), 1)
    1136              : 
    1137              :             DO ig = 1, ng
    1138              :                pgn_norm = pgn_norm + REAL(pgn(ig), dp)*REAL(pgn(ig), dp) + &
    1139              :                           AIMAG(pgn(ig))*AIMAG(pgn(ig))
    1140              :             END DO
    1141              :             CALL para_env%sum(pgn_norm)
    1142              :          ELSEIF (use_zgemm_rev) THEN
    1143              : 
    1144              :             CALL zgemv("N", nb, ng_global, cone, a_matrix(1, 1), &
    1145            0 :                        nb, gn_global(1), 1, czero, tmp_vec(1), 1)
    1146              : 
    1147              :             CALL zgemv("N", ng, nb, cmone, step_matrix(1, 1), ng, &
    1148            0 :                        tmp_vec(1), 1, czero, pgn(1), 1)
    1149              : 
    1150              :             CALL zgemv("N", ng, nb, cmone, res_matrix(1, 1), ng, &
    1151            0 :                        tmp_vec(1), 1, czero, ugn(1), 1)
    1152              : 
    1153            0 :             DO ig = 1, ng
    1154              :                pgn_norm = pgn_norm + REAL(pgn(ig), dp)*REAL(pgn(ig), dp) + &
    1155            0 :                           AIMAG(pgn(ig))*AIMAG(pgn(ig))
    1156            0 :                ugn(ig) = ugn(ig) + gn(ig)
    1157              :             END DO
    1158            0 :             CALL para_env%sum(pgn_norm)
    1159              : 
    1160              :          ELSE
    1161              :             DO ig = 1, ng
    1162              :                pgn(ig) = z_zero
    1163              :                ugn(ig) = z_zero
    1164              :                ig_global = mixing_store%ig_global_index(ig)
    1165              :                DO iig = 1, ng_global
    1166              :                   saa = z_zero
    1167              :                   yaa = z_zero
    1168              : 
    1169              :                   IF (ig_global == iig) yaa = z_one
    1170              : 
    1171              :                   DO jb = 1, nb
    1172              :                      saa = saa - step_matrix(ig, jb)*a_matrix(jb, iig)
    1173              :                      yaa = yaa - res_matrix(ig, jb)*a_matrix(jb, iig)
    1174              :                   END DO
    1175              :                   pgn(ig) = pgn(ig) + saa*gn_global(iig)
    1176              :                   ugn(ig) = ugn(ig) + yaa*gn_global(iig)
    1177              :                END DO
    1178              :             END DO
    1179              :             DO ig = 1, ng
    1180              :                pgn_norm = pgn_norm + REAL(pgn(ig), dp)*REAL(pgn(ig), dp) + &
    1181              :                           AIMAG(pgn(ig))*AIMAG(pgn(ig))
    1182              :             END DO
    1183              :             CALL para_env%sum(pgn_norm)
    1184              :          END IF
    1185              : 
    1186            0 :          gn_norm = mixing_store%norm_res_buffer(ib, ispin)
    1187            0 :          gn_norm_old = mixing_store%norm_res_buffer(ib_prev, ispin)
    1188              :          IF (ib_prev /= 0) THEN
    1189            0 :             sigma_tilde = sigma_old*MAX(0.5_dp, MIN(2.0_dp, gn_norm_old/gn_norm))
    1190              :          ELSE
    1191              :             sigma_tilde = 0.5_dp
    1192              :          END IF
    1193            0 :          sigma_tilde = 0.1_dp
    1194              :          ! Step size for the unpredicted component
    1195            0 :          step_size = MIN(sigma_tilde, r_step*pgn_norm/gn_norm, sigma_max)
    1196            0 :          sigma_old = step_size
    1197              : 
    1198              :          ! update the density
    1199            0 :          DO ig = 1, ng
    1200            0 :             prec = mixing_store%kerker_factor(ig)
    1201              :             rho_g(ispin)%array(ig) = mixing_store%rhoin_buffer(ib, ispin)%cc(ig) &
    1202            0 :                                      - prec*step_size*ugn(ig) + prec*pgn(ig) ! - 0.1_dp * prec* gn(ig)
    1203            0 :             mixing_store%rhoin_buffer(ib_next, ispin)%cc(ig) = rho_g(ispin)%array(ig)
    1204              :          END DO
    1205              : 
    1206              :       END DO ! ispin
    1207              : 
    1208              :       ! Deallocate  temporary arrays
    1209            0 :       DEALLOCATE (step_matrix, res_matrix)
    1210            0 :       DEALLOCATE (norm_res)
    1211            0 :       DEALLOCATE (norm_res_up)
    1212            0 :       DEALLOCATE (norm_res_low)
    1213            0 :       DEALLOCATE (a_matrix, b_matrix, binv_matrix)
    1214            0 :       DEALLOCATE (ugn, pgn)
    1215              :       IF (use_zgemm) THEN
    1216              :          DEALLOCATE (sa, ya)
    1217              :       END IF
    1218              :       IF (use_zgemm_rev) THEN
    1219            0 :          DEALLOCATE (tmp_vec)
    1220              :       END IF
    1221            0 :       DEALLOCATE (gn_global, res_matrix_global)
    1222              : 
    1223            0 :       CALL timestop(handle)
    1224              : 
    1225            0 :    END SUBROUTINE multisecant_mixing
    1226              : 
    1227              : END MODULE qs_gspace_mixing
        

Generated by: LCOV version 2.0-1