LCOV - code coverage report
Current view: top level - src - qs_charge_mixing.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:06f838d) Lines: 94.0 % 182 171
Test Date: 2026-06-05 07:04:50 Functions: 100.0 % 5 5

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : MODULE qs_charge_mixing
      10              : 
      11              : #if defined(__TBLITE)
      12              :    USE mctc_env, ONLY: error_type
      13              :    USE tblite_scc_mixer, ONLY: new_cp2k_tblite_mixer
      14              : #endif
      15              :    USE input_constants, ONLY: tblite_mixer_damping_default, &
      16              :                               tblite_mixer_iterations_default, &
      17              :                               tblite_mixer_max_weight_default, &
      18              :                               tblite_mixer_min_weight_default, &
      19              :                               tblite_mixer_omega0_default, &
      20              :                               tblite_mixer_weight_factor_default, &
      21              :                               tblite_scc_mixer_auto, &
      22              :                               tblite_scc_mixer_cp2k, &
      23              :                               tblite_scc_mixer_none, &
      24              :                               tblite_scc_mixer_tblite
      25              :    USE kinds, ONLY: dp
      26              :    USE mathlib, ONLY: get_pseudo_inverse_svd
      27              :    USE message_passing, ONLY: mp_para_env_type
      28              :    USE qs_density_mixing_types, ONLY: broyden_mixing_nr, &
      29              :                                       gspace_mixing_nr, &
      30              :                                       mixing_storage_type, &
      31              :                                       modified_broyden_mixing_nr, &
      32              :                                       multisecant_mixing_nr, &
      33              :                                       pulay_mixing_nr
      34              : #include "./base/base_uses.f90"
      35              : 
      36              :    IMPLICIT NONE
      37              : 
      38              :    PRIVATE
      39              : 
      40              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_charge_mixing'
      41              : 
      42              :    PUBLIC :: charge_mixing, charge_mixing_scc_error
      43              : 
      44              :    REAL(KIND=dp), PARAMETER, PRIVATE :: tblite_scc_pconv = 2.0E-5_dp
      45              : 
      46              : CONTAINS
      47              : 
      48              : ! **************************************************************************************************
      49              : !> \brief  Driver for TB SCC variable mixing, calls the requested method.
      50              : !> \param mixing_method ...
      51              : !> \param mixing_store ...
      52              : !> \param charges ...
      53              : !> \param para_env ...
      54              : !> \param iter_count ...
      55              : !> \param scc_mixer ...
      56              : !> \param tblite_mixer_iterations ...
      57              : !> \param tblite_mixer_damping ...
      58              : !> \param tblite_mixer_memory ...
      59              : !> \param tblite_mixer_omega0 ...
      60              : !> \param tblite_mixer_min_weight ...
      61              : !> \param tblite_mixer_max_weight ...
      62              : !> \param tblite_mixer_weight_factor ...
      63              : !> \par History
      64              : !> \author JGH
      65              : ! **************************************************************************************************
      66        34648 :    SUBROUTINE charge_mixing(mixing_method, mixing_store, charges, para_env, iter_count, &
      67              :                             scc_mixer, tblite_mixer_iterations, tblite_mixer_damping, &
      68              :                             tblite_mixer_memory, tblite_mixer_omega0, tblite_mixer_min_weight, &
      69              :                             tblite_mixer_max_weight, tblite_mixer_weight_factor)
      70              :       INTEGER, INTENT(IN)                                :: mixing_method
      71              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
      72              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
      73              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      74              :       INTEGER, INTENT(IN)                                :: iter_count
      75              :       INTEGER, INTENT(IN), OPTIONAL                      :: scc_mixer, tblite_mixer_iterations
      76              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: tblite_mixer_damping
      77              :       INTEGER, INTENT(IN), OPTIONAL                      :: tblite_mixer_memory
      78              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: tblite_mixer_omega0, &
      79              :                                                             tblite_mixer_min_weight, &
      80              :                                                             tblite_mixer_max_weight, &
      81              :                                                             tblite_mixer_weight_factor
      82              : 
      83              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'charge_mixing'
      84              : 
      85              :       INTEGER                                            :: effective_scc_mixer, handle, ia, ii, &
      86              :                                                             imin, inow, nbuffer, ns, nvec
      87              :       REAL(dp)                                           :: alpha
      88              : #if defined(__TBLITE)
      89              :       INTEGER                                            :: mixer_iterations, mixer_memory
      90              :       REAL(dp)                                           :: mixer_damping, mixer_max_weight, &
      91              :                                                             mixer_min_weight, mixer_omega0, &
      92              :                                                             mixer_weight_factor
      93              : #endif
      94              : 
      95        34648 :       CALL timeset(routineN, handle)
      96              : 
      97        34648 :       effective_scc_mixer = tblite_scc_mixer_cp2k
      98        34648 :       IF (PRESENT(scc_mixer)) effective_scc_mixer = scc_mixer
      99        34648 :       IF (ASSOCIATED(mixing_store)) mixing_store%tb_scc_mixer_error = 0.0_dp
     100              : 
     101          244 :       SELECT CASE (effective_scc_mixer)
     102              :       CASE (tblite_scc_mixer_auto, tblite_scc_mixer_cp2k)
     103              :          ! Use the regular CP2K SCC-variable mixing path below.
     104              :       CASE (tblite_scc_mixer_tblite)
     105          244 :          CPASSERT(ASSOCIATED(mixing_store))
     106              : #if defined(__TBLITE)
     107          244 :          mixer_damping = tblite_mixer_damping_default
     108          244 :          IF (PRESENT(tblite_mixer_damping)) mixer_damping = tblite_mixer_damping
     109          244 :          IF (mixer_damping <= 0.0_dp) CPABORT("tblite SCC mixer DAMPING must be positive")
     110          244 :          mixer_omega0 = tblite_mixer_omega0_default
     111          244 :          IF (PRESENT(tblite_mixer_omega0)) mixer_omega0 = tblite_mixer_omega0
     112          244 :          IF (mixer_omega0 <= 0.0_dp) CPABORT("tblite SCC mixer OMEGA0 must be positive")
     113          244 :          mixer_min_weight = tblite_mixer_min_weight_default
     114          244 :          IF (PRESENT(tblite_mixer_min_weight)) mixer_min_weight = tblite_mixer_min_weight
     115          244 :          IF (mixer_min_weight <= 0.0_dp) CPABORT("tblite SCC mixer MIN_WEIGHT must be positive")
     116          244 :          mixer_max_weight = tblite_mixer_max_weight_default
     117          244 :          IF (PRESENT(tblite_mixer_max_weight)) mixer_max_weight = tblite_mixer_max_weight
     118          244 :          IF (mixer_max_weight <= 0.0_dp) CPABORT("tblite SCC mixer MAX_WEIGHT must be positive")
     119          244 :          IF (mixer_max_weight < mixer_min_weight) &
     120            0 :             CPABORT("tblite SCC mixer MAX_WEIGHT must not be smaller than MIN_WEIGHT")
     121          244 :          mixer_weight_factor = tblite_mixer_weight_factor_default
     122          244 :          IF (PRESENT(tblite_mixer_weight_factor)) mixer_weight_factor = tblite_mixer_weight_factor
     123          244 :          IF (mixer_weight_factor <= 0.0_dp) CPABORT("tblite SCC mixer WEIGHT_FACTOR must be positive")
     124          244 :          mixer_iterations = tblite_mixer_iterations_default
     125          244 :          IF (PRESENT(tblite_mixer_iterations)) mixer_iterations = tblite_mixer_iterations
     126          244 :          IF (mixer_iterations < 1) CPABORT("tblite SCC mixer ITERATIONS must be positive")
     127          244 :          IF (iter_count > mixer_iterations) CPABORT("tblite SCC mixer exceeded ITERATIONS")
     128          244 :          mixer_memory = MAX(1, mixing_store%nbuffer)
     129          244 :          IF (PRESENT(tblite_mixer_memory)) mixer_memory = tblite_mixer_memory
     130          244 :          IF (mixer_memory < 1) CPABORT("tblite SCC mixer MEMORY must be positive")
     131              :          CALL tblite_charge_mixing(mixing_store, charges, para_env, iter_count, &
     132              :                                    mixer_damping, mixer_memory, mixer_omega0, mixer_min_weight, &
     133          244 :                                    mixer_max_weight, mixer_weight_factor)
     134          244 :          CALL timestop(handle)
     135          244 :          RETURN
     136              : #else
     137              :          MARK_USED(tblite_mixer_damping)
     138              :          MARK_USED(tblite_mixer_iterations)
     139              :          MARK_USED(tblite_mixer_max_weight)
     140              :          MARK_USED(tblite_mixer_memory)
     141              :          MARK_USED(tblite_mixer_min_weight)
     142              :          MARK_USED(tblite_mixer_omega0)
     143              :          MARK_USED(tblite_mixer_weight_factor)
     144              :          IF (iter_count == 1) THEN
     145              :             CALL cp_warn(__LOCATION__, &
     146              :                          "SCC_MIXER TBLITE requested but CP2K was built without tblite; "// &
     147              :                          "falling back to the CP2K SCC mixer.")
     148              :          END IF
     149              : #endif
     150              :       CASE (tblite_scc_mixer_none)
     151            0 :          IF (ASSOCIATED(mixing_store)) mixing_store%iter_method = "NoMix"
     152            0 :          CALL timestop(handle)
     153            0 :          RETURN
     154              :       CASE DEFAULT
     155        34648 :          CPABORT("Unknown SCC mixer for TB charge mixing")
     156              :       END SELECT
     157              : 
     158        34404 :       IF (mixing_method >= gspace_mixing_nr) THEN
     159         1086 :          CPASSERT(ASSOCIATED(mixing_store))
     160         1086 :          mixing_store%ncall = mixing_store%ncall + 1
     161         1086 :          ns = SIZE(charges, 2)
     162         1086 :          IF (ns > mixing_store%max_shell) THEN
     163            0 :             CPABORT("Mixing storage too small for TB SCC variables")
     164              :          END IF
     165         1086 :          alpha = mixing_store%alpha
     166         1086 :          nbuffer = mixing_store%nbuffer
     167         1086 :          inow = MOD(mixing_store%ncall - 1, nbuffer) + 1
     168         1086 :          imin = inow - 1
     169         1086 :          IF (imin == 0) imin = nbuffer
     170         1086 :          IF (mixing_store%ncall > nbuffer) THEN
     171          300 :             nvec = nbuffer
     172              :          ELSE
     173          786 :             nvec = mixing_store%ncall - 1
     174              :          END IF
     175         1086 :          IF (mixing_store%ncall > 1) THEN
     176              :             ! store in/out charge difference
     177         4064 :             DO ia = 1, mixing_store%nat_local
     178         3094 :                ii = mixing_store%atlist(ia)
     179        13050 :                mixing_store%dacharge(ia, 1:ns, imin) = mixing_store%acharge(ia, 1:ns, imin) - charges(ii, 1:ns)
     180              :             END DO
     181              :          END IF
     182         1086 :          IF ((iter_count == 1) .OR. (iter_count + 1 <= mixing_store%nskip_mixing)) THEN
     183              :             ! skip mixing
     184          126 :             mixing_store%iter_method = "NoMix"
     185          960 :          ELSEIF (((iter_count + 1 - mixing_store%nskip_mixing) <= mixing_store%n_simple_mix) .OR. (nvec == 1)) THEN
     186          102 :             CALL mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
     187          102 :             mixing_store%iter_method = "Mixing"
     188              :          ELSEIF (mixing_method == gspace_mixing_nr) THEN
     189            0 :             CPABORT("Kerker method not available for Charge Mixing")
     190              :          ELSEIF (mixing_method == pulay_mixing_nr) THEN
     191            0 :             CPABORT("Pulay method not available for Charge Mixing")
     192              :          ELSEIF (mixing_method == broyden_mixing_nr) THEN
     193          858 :             CALL broyden_mixing(mixing_store, charges, imin, nvec, ns, para_env)
     194          858 :             mixing_store%iter_method = "Broy."
     195              :          ELSEIF (mixing_method == modified_broyden_mixing_nr) THEN
     196            0 :             CPABORT("Modified Broyden mixing is only available for DFT density mixing")
     197              :          ELSEIF (mixing_method == multisecant_mixing_nr) THEN
     198            0 :             CPABORT("Multisecant_mixing method not available for Charge Mixing")
     199              :          END IF
     200              : 
     201              :          ! store new 'input' charges
     202         4524 :          DO ia = 1, mixing_store%nat_local
     203         3438 :             ii = mixing_store%atlist(ia)
     204        14624 :             mixing_store%acharge(ia, 1:ns, inow) = charges(ii, 1:ns)
     205              :          END DO
     206              : 
     207              :       END IF
     208              : 
     209        34404 :       CALL timestop(handle)
     210              : 
     211              :    END SUBROUTINE charge_mixing
     212              : 
     213              : ! **************************************************************************************************
     214              : !> \brief Return the CP2K-side tblite SCC-mixer residual on the CP2K EPS_SCF scale.
     215              : !> \param mixing_store ...
     216              : !> \param eps_scf ...
     217              : !> \return ...
     218              : ! **************************************************************************************************
     219        53138 :    FUNCTION charge_mixing_scc_error(mixing_store, eps_scf) RESULT(mixer_error)
     220              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     221              :       REAL(KIND=dp), INTENT(IN)                          :: eps_scf
     222              :       REAL(KIND=dp)                                      :: mixer_error
     223              : 
     224        53138 :       mixer_error = 0.0_dp
     225        53138 :       IF (.NOT. ASSOCIATED(mixing_store)) RETURN
     226        53138 :       IF (mixing_store%tb_scc_mixer_step <= 1) RETURN
     227              : 
     228          238 :       IF (eps_scf > 0.0_dp) THEN
     229          238 :          mixer_error = eps_scf*mixing_store%tb_scc_mixer_error/tblite_scc_pconv
     230              :       ELSE
     231            0 :          mixer_error = mixing_store%tb_scc_mixer_error
     232              :       END IF
     233              : 
     234              :    END FUNCTION charge_mixing_scc_error
     235              : 
     236              : ! **************************************************************************************************
     237              : !> \brief TBLite modified-Broyden mixing for a complete TB SCC-variable vector.
     238              : !> \param mixing_store ...
     239              : !> \param charges ...
     240              : !> \param para_env ...
     241              : !> \param iter_count ...
     242              : !> \param damping ...
     243              : !> \param memory ...
     244              : !> \param omega0 ...
     245              : !> \param min_weight ...
     246              : !> \param max_weight ...
     247              : !> \param weight_factor ...
     248              : ! **************************************************************************************************
     249          244 :    SUBROUTINE tblite_charge_mixing(mixing_store, charges, para_env, iter_count, damping, memory, omega0, &
     250              :                                    min_weight, max_weight, weight_factor)
     251              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     252              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
     253              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     254              :       INTEGER, INTENT(IN)                                :: iter_count, memory
     255              :       REAL(KIND=dp), INTENT(IN)                          :: damping, max_weight, min_weight, omega0, &
     256              :                                                             weight_factor
     257              : 
     258              : #if defined(__TBLITE)
     259          244 :       TYPE(error_type), ALLOCATABLE                      :: error
     260              : #endif
     261              :       INTEGER                                            :: natom, ndim, ns
     262              :       LOGICAL                                            :: on_source, reset_mixer
     263          244 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: qvec
     264              : 
     265          244 :       natom = SIZE(charges, 1)
     266          244 :       ns = SIZE(charges, 2)
     267          244 :       ndim = natom*ns
     268          732 :       ALLOCATE (qvec(ndim))
     269          488 :       qvec(:) = RESHAPE(charges, [ndim])
     270          244 :       on_source = para_env%mepos == para_env%source
     271              :       reset_mixer = (iter_count == 1) .OR. (mixing_store%tb_scc_mixer_step == 0) .OR. &
     272              :                     (mixing_store%tb_scc_mixer_natom /= natom) .OR. &
     273              :                     (mixing_store%tb_scc_mixer_ns /= ns) .OR. &
     274          244 :                     (mixing_store%tb_scc_mixer_memory /= memory)
     275          244 :       mixing_store%tb_scc_mixer_error = 0.0_dp
     276              : 
     277              : #if defined(__TBLITE)
     278          244 :       IF (reset_mixer) THEN
     279            4 :          IF (ALLOCATED(mixing_store%tb_scc_mixer)) DEALLOCATE (mixing_store%tb_scc_mixer)
     280            4 :          IF (on_source) THEN
     281              :             CALL new_cp2k_tblite_mixer(mixing_store%tb_scc_mixer, memory, ndim, damping, omega0, &
     282            2 :                                        min_weight, max_weight, weight_factor)
     283            2 :             CALL mixing_store%tb_scc_mixer%set(qvec)
     284              :          END IF
     285            4 :          mixing_store%tb_scc_mixer_natom = natom
     286            4 :          mixing_store%tb_scc_mixer_ns = ns
     287            4 :          mixing_store%tb_scc_mixer_memory = memory
     288            4 :          mixing_store%tb_scc_mixer_step = 1
     289            4 :          mixing_store%iter_method = "NoMix"
     290            4 :          CALL para_env%bcast(qvec)
     291           12 :          charges = RESHAPE(qvec, SHAPE(charges))
     292            4 :          RETURN
     293              :       END IF
     294              : 
     295          240 :       IF (on_source) THEN
     296          120 :          CPASSERT(ALLOCATED(mixing_store%tb_scc_mixer))
     297          120 :          CALL mixing_store%tb_scc_mixer%diff(qvec)
     298          120 :          mixing_store%tb_scc_mixer_error = REAL(mixing_store%tb_scc_mixer%get_error(), KIND=dp)
     299          120 :          CALL mixing_store%tb_scc_mixer%next(error)
     300          120 :          IF (ALLOCATED(error)) CPABORT("tblite SCC mixer failed")
     301          120 :          CALL mixing_store%tb_scc_mixer%get(qvec)
     302              :       END IF
     303          240 :       CALL para_env%bcast(qvec)
     304          240 :       CALL para_env%bcast(mixing_store%tb_scc_mixer_error)
     305          720 :       charges = RESHAPE(qvec, SHAPE(charges))
     306          240 :       mixing_store%tb_scc_mixer_step = mixing_store%tb_scc_mixer_step + 1
     307          240 :       mixing_store%iter_method = "TBLITE"
     308              : #else
     309              :       MARK_USED(mixing_store)
     310              :       MARK_USED(charges)
     311              :       MARK_USED(para_env)
     312              :       MARK_USED(iter_count)
     313              :       MARK_USED(damping)
     314              :       MARK_USED(memory)
     315              :       MARK_USED(omega0)
     316              :       MARK_USED(min_weight)
     317              :       MARK_USED(max_weight)
     318              :       MARK_USED(weight_factor)
     319              :       CPABORT("SCC_MIXER TBLITE requires CP2K to be built with tblite")
     320              : #endif
     321              : 
     322          244 :    END SUBROUTINE tblite_charge_mixing
     323              : 
     324              : ! **************************************************************************************************
     325              : !> \brief Simple charge mixing
     326              : !> \param mixing_store ...
     327              : !> \param charges ...
     328              : !> \param alpha ...
     329              : !> \param imin ...
     330              : !> \param ns ...
     331              : !> \param para_env ...
     332              : !> \author JGH
     333              : ! **************************************************************************************************
     334          102 :    SUBROUTINE mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
     335              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     336              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
     337              :       REAL(KIND=dp), INTENT(IN)                          :: alpha
     338              :       INTEGER, INTENT(IN)                                :: imin, ns
     339              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     340              : 
     341              :       INTEGER                                            :: ia, ii
     342              : 
     343         2372 :       charges = 0.0_dp
     344              : 
     345          422 :       DO ia = 1, mixing_store%nat_local
     346          320 :          ii = mixing_store%atlist(ia)
     347         1382 :          charges(ii, 1:ns) = alpha*mixing_store%dacharge(ia, 1:ns, imin) - mixing_store%acharge(ia, 1:ns, imin)
     348              :       END DO
     349              : 
     350         4642 :       CALL para_env%sum(charges)
     351              : 
     352          102 :    END SUBROUTINE mix_charges_only
     353              : 
     354              : ! **************************************************************************************************
     355              : !> \brief Broyden charge mixing
     356              : !> \param mixing_store ...
     357              : !> \param charges ...
     358              : !> \param inow ...
     359              : !> \param nvec ...
     360              : !> \param ns ...
     361              : !> \param para_env ...
     362              : !> \author JGH
     363              : ! **************************************************************************************************
     364          858 :    SUBROUTINE broyden_mixing(mixing_store, charges, inow, nvec, ns, para_env)
     365              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     366              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
     367              :       INTEGER, INTENT(IN)                                :: inow, nvec, ns
     368              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     369              : 
     370              :       INTEGER                                            :: i, ia, ii, imin, j, nbuffer, nv
     371              :       REAL(KIND=dp)                                      :: alpha, broy_w0, rskip, wdf, wprod
     372          858 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: cvec, gammab
     373          858 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: amat, beta
     374          858 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: dq_last, dq_now, q_last, q_now
     375              : 
     376            0 :       CPASSERT(nvec > 1)
     377              : 
     378          858 :       nbuffer = mixing_store%nbuffer
     379          858 :       alpha = mixing_store%alpha
     380          858 :       imin = inow - 1
     381          858 :       IF (imin == 0) imin = nvec
     382          858 :       nv = nvec - 1
     383              : 
     384              :       ! charge vectors
     385          858 :       q_now => mixing_store%acharge(:, :, inow)
     386          858 :       q_last => mixing_store%acharge(:, :, imin)
     387          858 :       dq_now => mixing_store%dacharge(:, :, inow)
     388          858 :       dq_last => mixing_store%dacharge(:, :, imin)
     389              : 
     390          858 :       IF (nvec == nbuffer) THEN
     391              :          ! reshuffel Broyden storage n->n-1
     392         1900 :          DO i = 1, nv - 1
     393         1600 :             mixing_store%wbroy(i) = mixing_store%wbroy(i + 1)
     394        44168 :             mixing_store%dfbroy(:, :, i) = mixing_store%dfbroy(:, :, i + 1)
     395        44468 :             mixing_store%ubroy(:, :, i) = mixing_store%ubroy(:, :, i + 1)
     396              :          END DO
     397         1900 :          DO i = 1, nv - 1
     398        11148 :             DO j = 1, nv - 1
     399        10848 :                mixing_store%abroy(i, j) = mixing_store%abroy(i + 1, j + 1)
     400              :             END DO
     401              :          END DO
     402              :       END IF
     403              : 
     404          858 :       broy_w0 = mixing_store%broy_w0
     405          858 :       mixing_store%wbroy(nv) = 1.0_dp
     406              : 
     407              :       ! dfbroy
     408        46430 :       mixing_store%dfbroy(:, :, nv) = 0.0_dp
     409        23374 :       mixing_store%dfbroy(:, 1:ns, nv) = dq_now(:, 1:ns) - dq_last(:, 1:ns)
     410        12116 :       wdf = SUM(mixing_store%dfbroy(:, 1:ns, nv)**2)
     411          858 :       CALL para_env%sum(wdf)
     412          858 :       wdf = 1.0_dp/SQRT(wdf)
     413        12116 :       mixing_store%dfbroy(:, 1:ns, nv) = wdf*mixing_store%dfbroy(:, 1:ns, nv)
     414              : 
     415              :       ! abroy matrix
     416         4814 :       DO i = 1, nv
     417        56234 :          wprod = SUM(mixing_store%dfbroy(:, 1:ns, i)*mixing_store%dfbroy(:, 1:ns, nv))
     418         3956 :          CALL para_env%sum(wprod)
     419         3956 :          mixing_store%abroy(i, nv) = wprod
     420         4814 :          mixing_store%abroy(nv, i) = wprod
     421              :       END DO
     422              : 
     423              :       ! broyden matrices
     424         7722 :       ALLOCATE (amat(nv, nv), beta(nv, nv), cvec(nv), gammab(nv))
     425         4814 :       DO i = 1, nv
     426        56234 :          wprod = SUM(mixing_store%dfbroy(:, 1:ns, i)*dq_now(:, 1:ns))
     427         3956 :          CALL para_env%sum(wprod)
     428         4814 :          cvec(i) = mixing_store%wbroy(i)*wprod
     429              :       END DO
     430              : 
     431         4814 :       DO i = 1, nv
     432        27240 :          DO j = 1, nv
     433        27240 :             beta(j, i) = mixing_store%wbroy(j)*mixing_store%wbroy(i)*mixing_store%abroy(j, i)
     434              :          END DO
     435         4814 :          beta(i, i) = beta(i, i) + broy_w0
     436              :       END DO
     437              : 
     438          858 :       rskip = 1.e-12_dp
     439          858 :       CALL get_pseudo_inverse_svd(beta, amat, rskip)
     440        32054 :       gammab(1:nv) = MATMUL(cvec(1:nv), amat(1:nv, 1:nv))
     441              : 
     442              :       ! build ubroy
     443        46430 :       mixing_store%ubroy(:, :, nv) = 0.0_dp
     444              :       mixing_store%ubroy(:, 1:ns, nv) = alpha*mixing_store%dfbroy(:, 1:ns, nv) + &
     445        23374 :                                         wdf*(q_now(:, 1:ns) - q_last(:, 1:ns))
     446              : 
     447        20018 :       charges = 0.0_dp
     448         3614 :       DO ia = 1, mixing_store%nat_local
     449         2756 :          ii = mixing_store%atlist(ia)
     450        11516 :          charges(ii, 1:ns) = q_now(ia, 1:ns) + alpha*dq_now(ia, 1:ns)
     451              :       END DO
     452         4814 :       DO i = 1, nv
     453        17776 :          DO ia = 1, mixing_store%nat_local
     454        12962 :             ii = mixing_store%atlist(ia)
     455        53308 :             charges(ii, 1:ns) = charges(ii, 1:ns) - mixing_store%wbroy(i)*gammab(i)*mixing_store%ubroy(ia, 1:ns, i)
     456              :          END DO
     457              :       END DO
     458        39178 :       CALL para_env%sum(charges)
     459              : 
     460          858 :       DEALLOCATE (amat, beta, cvec, gammab)
     461              : 
     462          858 :    END SUBROUTINE broyden_mixing
     463              : 
     464              : END MODULE qs_charge_mixing
        

Generated by: LCOV version 2.0-1