LCOV - code coverage report
Current view: top level - src - qs_charge_mixing.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:24d69ee) Lines: 94.5 % 201 190
Test Date: 2026-09-03 07:32:15 Functions: 100.0 % 6 6

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2026 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : 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              :                                       new_pulay_mixing_nr, &
      34              :                                       pulay_mixing_nr
      35              : #include "./base/base_uses.f90"
      36              : 
      37              :    IMPLICIT NONE
      38              : 
      39              :    PRIVATE
      40              : 
      41              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_charge_mixing'
      42              : 
      43              :    PUBLIC :: charge_mixing, charge_mixing_scc_error, tblite_scc_error_on_cp2k_scale
      44              : 
      45              :    REAL(KIND=dp), PARAMETER, PUBLIC :: tblite_scc_pconv = 2.0E-5_dp
      46              : 
      47              : CONTAINS
      48              : 
      49              : ! **************************************************************************************************
      50              : !> \brief  Driver for TB SCC variable mixing, calls the requested method.
      51              : !> \param mixing_method ...
      52              : !> \param mixing_store ...
      53              : !> \param charges ...
      54              : !> \param para_env ...
      55              : !> \param iter_count ...
      56              : !> \param scc_mixer ...
      57              : !> \param tblite_mixer_iterations ...
      58              : !> \param tblite_mixer_damping ...
      59              : !> \param tblite_mixer_memory ...
      60              : !> \param tblite_mixer_omega0 ...
      61              : !> \param tblite_mixer_min_weight ...
      62              : !> \param tblite_mixer_max_weight ...
      63              : !> \param tblite_mixer_weight_factor ...
      64              : !> \par History
      65              : !> \author JGH
      66              : ! **************************************************************************************************
      67        38814 :    SUBROUTINE charge_mixing(mixing_method, mixing_store, charges, para_env, iter_count, &
      68              :                             scc_mixer, tblite_mixer_iterations, tblite_mixer_damping, &
      69              :                             tblite_mixer_memory, tblite_mixer_omega0, tblite_mixer_min_weight, &
      70              :                             tblite_mixer_max_weight, tblite_mixer_weight_factor)
      71              :       INTEGER, INTENT(IN)                                :: mixing_method
      72              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
      73              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
      74              :       TYPE(mp_para_env_type), POINTER                    :: para_env
      75              :       INTEGER, INTENT(IN)                                :: iter_count
      76              :       INTEGER, INTENT(IN), OPTIONAL                      :: scc_mixer, tblite_mixer_iterations
      77              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: tblite_mixer_damping
      78              :       INTEGER, INTENT(IN), OPTIONAL                      :: tblite_mixer_memory
      79              :       REAL(KIND=dp), INTENT(IN), OPTIONAL                :: tblite_mixer_omega0, &
      80              :                                                             tblite_mixer_min_weight, &
      81              :                                                             tblite_mixer_max_weight, &
      82              :                                                             tblite_mixer_weight_factor
      83              : 
      84              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'charge_mixing'
      85              : 
      86              :       INTEGER                                            :: effective_scc_mixer, handle, ia, ii, &
      87              :                                                             imin, inow, nbuffer, ns, nvec
      88              :       REAL(dp)                                           :: alpha
      89              : #if defined(__TBLITE)
      90              :       INTEGER                                            :: mixer_iterations, mixer_memory
      91              :       REAL(dp)                                           :: mixer_damping, mixer_max_weight, &
      92              :                                                             mixer_min_weight, mixer_omega0, &
      93              :                                                             mixer_weight_factor
      94              : #endif
      95              : 
      96        38814 :       CALL timeset(routineN, handle)
      97              : 
      98        38814 :       effective_scc_mixer = tblite_scc_mixer_cp2k
      99        38814 :       IF (PRESENT(scc_mixer)) effective_scc_mixer = scc_mixer
     100        38814 :       IF (ASSOCIATED(mixing_store)) mixing_store%tb_scc_mixer_error = 0.0_dp
     101              : 
     102           32 :       SELECT CASE (effective_scc_mixer)
     103              :       CASE (tblite_scc_mixer_auto, tblite_scc_mixer_cp2k)
     104              :          ! Use the regular CP2K SCC-variable mixing path below.
     105              :       CASE (tblite_scc_mixer_tblite)
     106           32 :          CPASSERT(ASSOCIATED(mixing_store))
     107              : #if defined(__TBLITE)
     108           32 :          mixer_damping = tblite_mixer_damping_default
     109           32 :          IF (PRESENT(tblite_mixer_damping)) mixer_damping = tblite_mixer_damping
     110           32 :          IF (mixer_damping <= 0.0_dp) CPABORT("tblite SCC mixer DAMPING must be positive")
     111           32 :          mixer_omega0 = tblite_mixer_omega0_default
     112           32 :          IF (PRESENT(tblite_mixer_omega0)) mixer_omega0 = tblite_mixer_omega0
     113           32 :          IF (mixer_omega0 <= 0.0_dp) CPABORT("tblite SCC mixer OMEGA0 must be positive")
     114           32 :          mixer_min_weight = tblite_mixer_min_weight_default
     115           32 :          IF (PRESENT(tblite_mixer_min_weight)) mixer_min_weight = tblite_mixer_min_weight
     116           32 :          IF (mixer_min_weight <= 0.0_dp) CPABORT("tblite SCC mixer MIN_WEIGHT must be positive")
     117           32 :          mixer_max_weight = tblite_mixer_max_weight_default
     118           32 :          IF (PRESENT(tblite_mixer_max_weight)) mixer_max_weight = tblite_mixer_max_weight
     119           32 :          IF (mixer_max_weight <= 0.0_dp) CPABORT("tblite SCC mixer MAX_WEIGHT must be positive")
     120           32 :          IF (mixer_max_weight < mixer_min_weight) THEN
     121            0 :             CPABORT("tblite SCC mixer MAX_WEIGHT must not be smaller than MIN_WEIGHT")
     122              :          END IF
     123           32 :          mixer_weight_factor = tblite_mixer_weight_factor_default
     124           32 :          IF (PRESENT(tblite_mixer_weight_factor)) mixer_weight_factor = tblite_mixer_weight_factor
     125           32 :          IF (mixer_weight_factor <= 0.0_dp) CPABORT("tblite SCC mixer WEIGHT_FACTOR must be positive")
     126           32 :          mixer_iterations = tblite_mixer_iterations_default
     127           32 :          IF (PRESENT(tblite_mixer_iterations)) mixer_iterations = tblite_mixer_iterations
     128           32 :          IF (mixer_iterations < 1) CPABORT("tblite SCC mixer ITERATIONS must be positive")
     129           32 :          IF (iter_count > mixer_iterations) CPABORT("tblite SCC mixer exceeded ITERATIONS")
     130           32 :          mixer_memory = MAX(1, mixing_store%nbuffer)
     131           32 :          IF (PRESENT(tblite_mixer_memory)) mixer_memory = tblite_mixer_memory
     132           32 :          IF (mixer_memory < 1) CPABORT("tblite SCC mixer MEMORY must be positive")
     133              :          CALL tblite_charge_mixing(mixing_store, charges, para_env, iter_count, &
     134              :                                    mixer_damping, mixer_memory, mixer_omega0, mixer_min_weight, &
     135           32 :                                    mixer_max_weight, mixer_weight_factor)
     136           32 :          CALL timestop(handle)
     137           32 :          RETURN
     138              : #else
     139              :          MARK_USED(tblite_mixer_damping)
     140              :          MARK_USED(tblite_mixer_iterations)
     141              :          MARK_USED(tblite_mixer_max_weight)
     142              :          MARK_USED(tblite_mixer_memory)
     143              :          MARK_USED(tblite_mixer_min_weight)
     144              :          MARK_USED(tblite_mixer_omega0)
     145              :          MARK_USED(tblite_mixer_weight_factor)
     146              :          IF (iter_count == 1) THEN
     147              :             CALL cp_warn(__LOCATION__, &
     148              :                          "SCC_MIXER TBLITE requested but CP2K was built without tblite; "// &
     149              :                          "falling back to the CP2K SCC mixer.")
     150              :          END IF
     151              : #endif
     152              :       CASE (tblite_scc_mixer_none)
     153            0 :          IF (ASSOCIATED(mixing_store)) mixing_store%iter_method = "NoMix"
     154            0 :          CALL timestop(handle)
     155            0 :          RETURN
     156              :       CASE DEFAULT
     157        38814 :          CPABORT("Unknown SCC mixer for TB charge mixing")
     158              :       END SELECT
     159              : 
     160        38782 :       IF (mixing_method >= gspace_mixing_nr) THEN
     161         1800 :          CPASSERT(ASSOCIATED(mixing_store))
     162         1800 :          mixing_store%ncall = mixing_store%ncall + 1
     163         1800 :          ns = SIZE(charges, 2)
     164         1800 :          IF (ns > mixing_store%max_shell) THEN
     165            0 :             CPABORT("Mixing storage too small for TB SCC variables")
     166              :          END IF
     167         1800 :          alpha = mixing_store%alpha
     168         1800 :          nbuffer = mixing_store%nbuffer
     169         1800 :          inow = MOD(mixing_store%ncall - 1, nbuffer) + 1
     170         1800 :          imin = inow - 1
     171         1800 :          IF (imin == 0) imin = nbuffer
     172         1800 :          IF (mixing_store%ncall > nbuffer) THEN
     173          734 :             nvec = nbuffer
     174              :          ELSE
     175         1066 :             nvec = mixing_store%ncall - 1
     176              :          END IF
     177         1800 :          IF (mixing_store%ncall > 1) THEN
     178              :             ! store in/out charge difference
     179         5434 :             DO ia = 1, mixing_store%nat_local
     180         3788 :                ii = mixing_store%atlist(ia)
     181        17902 :                mixing_store%dacharge(ia, 1:ns, imin) = mixing_store%acharge(ia, 1:ns, imin) - charges(ii, 1:ns)
     182              :             END DO
     183              :          END IF
     184         1800 :          IF ((iter_count == 1) .OR. (iter_count + 1 <= mixing_store%nskip_mixing)) THEN
     185              :             ! skip mixing
     186          166 :             mixing_store%iter_method = "NoMix"
     187         1634 :          ELSE IF (((iter_count + 1 - mixing_store%nskip_mixing) <= mixing_store%n_simple_mix) .OR. (nvec == 1)) THEN
     188          136 :             CALL mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
     189          136 :             mixing_store%iter_method = "Mixing"
     190              :          ELSE IF (mixing_method == gspace_mixing_nr) THEN
     191            0 :             CPABORT("Kerker method not available for Charge Mixing")
     192              :          ELSE IF (mixing_method == pulay_mixing_nr) THEN
     193            0 :             CPABORT("Pulay method not available for Charge Mixing")
     194              :          ELSE IF (mixing_method == broyden_mixing_nr) THEN
     195         1410 :             CALL broyden_mixing(mixing_store, charges, imin, nvec, ns, para_env, modified=.FALSE.)
     196         1410 :             mixing_store%iter_method = "Broy."
     197              :          ELSE IF (mixing_method == modified_broyden_mixing_nr) THEN
     198           88 :             CALL broyden_mixing(mixing_store, charges, imin, nvec, ns, para_env, modified=.TRUE.)
     199           88 :             mixing_store%iter_method = "MBroy"
     200              :          ELSE IF (mixing_method == multisecant_mixing_nr) THEN
     201            0 :             CPABORT("Multisecant_mixing method not available for Charge Mixing")
     202              :          ELSE IF (mixing_method == new_pulay_mixing_nr) THEN
     203            0 :             CPABORT("New Pulay method not available for Charge Mixing")
     204              :          END IF
     205              : 
     206              :          ! store new 'input' charges
     207         5998 :          DO ia = 1, mixing_store%nat_local
     208         4198 :             ii = mixing_store%atlist(ia)
     209        19898 :             mixing_store%acharge(ia, 1:ns, inow) = charges(ii, 1:ns)
     210              :          END DO
     211              : 
     212              :       END IF
     213              : 
     214        38782 :       CALL timestop(handle)
     215              : 
     216              :    END SUBROUTINE charge_mixing
     217              : 
     218              : ! **************************************************************************************************
     219              : !> \brief Map a raw tblite SCC residual to CP2K's EPS_SCF reporting scale.
     220              : !> \param raw_error raw tblite SCC residual
     221              : !> \param eps_scf CP2K SCF convergence threshold
     222              : !> \param pconv tblite SCC convergence reference
     223              : !> \return residual on the CP2K convergence scale
     224              : ! **************************************************************************************************
     225        22384 :    PURE FUNCTION tblite_scc_error_on_cp2k_scale(raw_error, eps_scf, pconv) RESULT(scaled_error)
     226              :       REAL(KIND=dp), INTENT(IN)                          :: raw_error, eps_scf, pconv
     227              :       REAL(KIND=dp)                                      :: scaled_error
     228              : 
     229        22384 :       IF (eps_scf > 0.0_dp .AND. pconv > 0.0_dp) THEN
     230        22384 :          scaled_error = eps_scf*raw_error/pconv
     231              :       ELSE
     232            0 :          scaled_error = raw_error
     233              :       END IF
     234              : 
     235        22384 :    END FUNCTION tblite_scc_error_on_cp2k_scale
     236              : 
     237              : ! **************************************************************************************************
     238              : !> \brief Return the CP2K-side tblite SCC-mixer residual on the CP2K EPS_SCF scale.
     239              : !> \param mixing_store ...
     240              : !> \param eps_scf ...
     241              : !> \return ...
     242              : ! **************************************************************************************************
     243        56572 :    FUNCTION charge_mixing_scc_error(mixing_store, eps_scf) RESULT(mixer_error)
     244              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     245              :       REAL(KIND=dp), INTENT(IN)                          :: eps_scf
     246              :       REAL(KIND=dp)                                      :: mixer_error
     247              : 
     248        56572 :       mixer_error = 0.0_dp
     249        56572 :       IF (.NOT. ASSOCIATED(mixing_store)) RETURN
     250        56572 :       IF (mixing_store%tb_scc_mixer_step <= 1) RETURN
     251              : 
     252              :       mixer_error = tblite_scc_error_on_cp2k_scale(mixing_store%tb_scc_mixer_error, &
     253           26 :                                                    eps_scf, tblite_scc_pconv)
     254              : 
     255           26 :    END FUNCTION charge_mixing_scc_error
     256              : 
     257              : ! **************************************************************************************************
     258              : !> \brief TBLite modified-Broyden mixing for a complete TB SCC-variable vector.
     259              : !> \param mixing_store ...
     260              : !> \param charges ...
     261              : !> \param para_env ...
     262              : !> \param iter_count ...
     263              : !> \param damping ...
     264              : !> \param memory ...
     265              : !> \param omega0 ...
     266              : !> \param min_weight ...
     267              : !> \param max_weight ...
     268              : !> \param weight_factor ...
     269              : ! **************************************************************************************************
     270           32 :    SUBROUTINE tblite_charge_mixing(mixing_store, charges, para_env, iter_count, damping, memory, omega0, &
     271              :                                    min_weight, max_weight, weight_factor)
     272              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     273              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
     274              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     275              :       INTEGER, INTENT(IN)                                :: iter_count, memory
     276              :       REAL(KIND=dp), INTENT(IN)                          :: damping, max_weight, min_weight, omega0, &
     277              :                                                             weight_factor
     278              : 
     279              : #if defined(__TBLITE)
     280           32 :       TYPE(error_type), ALLOCATABLE                      :: error
     281              : #endif
     282              :       INTEGER                                            :: natom, ndim, ns
     283              :       LOGICAL                                            :: on_source, reset_mixer
     284           32 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: qvec
     285              : 
     286           32 :       natom = SIZE(charges, 1)
     287           32 :       ns = SIZE(charges, 2)
     288           32 :       ndim = natom*ns
     289           96 :       ALLOCATE (qvec(ndim))
     290           64 :       qvec(:) = RESHAPE(charges, [ndim])
     291           32 :       on_source = para_env%mepos == para_env%source
     292              :       reset_mixer = (iter_count == 1) .OR. (mixing_store%tb_scc_mixer_step == 0) .OR. &
     293              :                     (mixing_store%tb_scc_mixer_natom /= natom) .OR. &
     294              :                     (mixing_store%tb_scc_mixer_ns /= ns) .OR. &
     295           32 :                     (mixing_store%tb_scc_mixer_memory /= memory)
     296           32 :       mixing_store%tb_scc_mixer_error = 0.0_dp
     297              : 
     298              : #if defined(__TBLITE)
     299           32 :       IF (reset_mixer) THEN
     300            4 :          IF (ALLOCATED(mixing_store%tb_scc_mixer)) DEALLOCATE (mixing_store%tb_scc_mixer)
     301            4 :          IF (on_source) THEN
     302              :             CALL new_cp2k_tblite_mixer(mixing_store%tb_scc_mixer, memory, ndim, damping, omega0, &
     303            2 :                                        min_weight, max_weight, weight_factor)
     304            2 :             CALL mixing_store%tb_scc_mixer%set(qvec)
     305              :          END IF
     306            4 :          mixing_store%tb_scc_mixer_natom = natom
     307            4 :          mixing_store%tb_scc_mixer_ns = ns
     308            4 :          mixing_store%tb_scc_mixer_memory = memory
     309            4 :          mixing_store%tb_scc_mixer_step = 1
     310            4 :          mixing_store%iter_method = "NoMix"
     311            4 :          CALL para_env%bcast(qvec)
     312           12 :          charges = RESHAPE(qvec, SHAPE(charges))
     313            4 :          RETURN
     314              :       END IF
     315              : 
     316           28 :       IF (on_source) THEN
     317           14 :          CPASSERT(ALLOCATED(mixing_store%tb_scc_mixer))
     318           14 :          CALL mixing_store%tb_scc_mixer%diff(qvec)
     319           14 :          mixing_store%tb_scc_mixer_error = REAL(mixing_store%tb_scc_mixer%get_error(), KIND=dp)
     320           14 :          CALL mixing_store%tb_scc_mixer%next(error)
     321           14 :          IF (ALLOCATED(error)) CPABORT("tblite SCC mixer failed")
     322           14 :          CALL mixing_store%tb_scc_mixer%get(qvec)
     323              :       END IF
     324           28 :       CALL para_env%bcast(qvec)
     325           28 :       CALL para_env%bcast(mixing_store%tb_scc_mixer_error)
     326           84 :       charges = RESHAPE(qvec, SHAPE(charges))
     327           28 :       mixing_store%tb_scc_mixer_step = mixing_store%tb_scc_mixer_step + 1
     328           28 :       mixing_store%iter_method = "TBLITE"
     329              : #else
     330              :       MARK_USED(mixing_store)
     331              :       MARK_USED(charges)
     332              :       MARK_USED(para_env)
     333              :       MARK_USED(iter_count)
     334              :       MARK_USED(damping)
     335              :       MARK_USED(memory)
     336              :       MARK_USED(omega0)
     337              :       MARK_USED(min_weight)
     338              :       MARK_USED(max_weight)
     339              :       MARK_USED(weight_factor)
     340              :       CPABORT("SCC_MIXER TBLITE requires CP2K to be built with tblite")
     341              : #endif
     342              : 
     343           32 :    END SUBROUTINE tblite_charge_mixing
     344              : 
     345              : ! **************************************************************************************************
     346              : !> \brief Simple charge mixing
     347              : !> \param mixing_store ...
     348              : !> \param charges ...
     349              : !> \param alpha ...
     350              : !> \param imin ...
     351              : !> \param ns ...
     352              : !> \param para_env ...
     353              : !> \author JGH
     354              : ! **************************************************************************************************
     355          136 :    SUBROUTINE mix_charges_only(mixing_store, charges, alpha, imin, ns, para_env)
     356              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     357              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
     358              :       REAL(KIND=dp), INTENT(IN)                          :: alpha
     359              :       INTEGER, INTENT(IN)                                :: imin, ns
     360              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     361              : 
     362              :       INTEGER                                            :: ia, ii
     363              : 
     364         2870 :       charges = 0.0_dp
     365              : 
     366          492 :       DO ia = 1, mixing_store%nat_local
     367          356 :          ii = mixing_store%atlist(ia)
     368         1608 :          charges(ii, 1:ns) = alpha*mixing_store%dacharge(ia, 1:ns, imin) - mixing_store%acharge(ia, 1:ns, imin)
     369              :       END DO
     370              : 
     371         5604 :       CALL para_env%sum(charges)
     372              : 
     373          136 :    END SUBROUTINE mix_charges_only
     374              : 
     375              : ! **************************************************************************************************
     376              : !> \brief Broyden charge mixing
     377              : !> \param mixing_store ...
     378              : !> \param charges ...
     379              : !> \param inow ...
     380              : !> \param nvec ...
     381              : !> \param ns ...
     382              : !> \param para_env ...
     383              : !> \param modified use dynamic residual weights of modified Broyden
     384              : !> \author JGH
     385              : ! **************************************************************************************************
     386         1498 :    SUBROUTINE broyden_mixing(mixing_store, charges, inow, nvec, ns, para_env, modified)
     387              :       TYPE(mixing_storage_type), POINTER                 :: mixing_store
     388              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: charges
     389              :       INTEGER, INTENT(IN)                                :: inow, nvec, ns
     390              :       TYPE(mp_para_env_type), POINTER                    :: para_env
     391              :       LOGICAL, INTENT(IN)                                :: modified
     392              : 
     393              :       INTEGER                                            :: i, ia, ii, imin, j, nbuffer, nv
     394              :       REAL(KIND=dp)                                      :: alpha, broy_w0, res_norm, rskip, wdf, &
     395              :                                                             wprod
     396         1498 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: cvec, gammab
     397         1498 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :)        :: amat, beta
     398         1498 :       REAL(KIND=dp), DIMENSION(:, :), POINTER            :: dq_last, dq_now, q_last, q_now
     399              : 
     400            0 :       CPASSERT(nvec > 1)
     401              : 
     402         1498 :       nbuffer = mixing_store%nbuffer
     403         1498 :       alpha = mixing_store%alpha
     404         1498 :       imin = inow - 1
     405         1498 :       IF (imin == 0) imin = nvec
     406         1498 :       nv = nvec - 1
     407              : 
     408              :       ! charge vectors
     409         1498 :       q_now => mixing_store%acharge(:, :, inow)
     410         1498 :       q_last => mixing_store%acharge(:, :, imin)
     411         1498 :       dq_now => mixing_store%dacharge(:, :, inow)
     412         1498 :       dq_last => mixing_store%dacharge(:, :, imin)
     413              : 
     414         1498 :       IF (nvec == nbuffer) THEN
     415              :          ! reshuffel Broyden storage n->n-1
     416         4938 :          DO i = 1, nv - 1
     417         4204 :             mixing_store%wbroy(i) = mixing_store%wbroy(i + 1)
     418       191324 :             mixing_store%dfbroy(:, :, i) = mixing_store%dfbroy(:, :, i + 1)
     419       192058 :             mixing_store%ubroy(:, :, i) = mixing_store%ubroy(:, :, i + 1)
     420              :          END DO
     421         4938 :          DO i = 1, nv - 1
     422        29810 :             DO j = 1, nv - 1
     423        29076 :                mixing_store%abroy(i, j) = mixing_store%abroy(i + 1, j + 1)
     424              :             END DO
     425              :          END DO
     426              :       END IF
     427              : 
     428         1498 :       broy_w0 = mixing_store%broy_w0
     429         1498 :       IF (modified) THEN
     430         1720 :          res_norm = SUM(dq_now(:, 1:ns)**2)
     431           88 :          CALL para_env%sum(res_norm)
     432           88 :          res_norm = SQRT(res_norm)
     433           88 :          IF (res_norm > mixing_store%wc/mixing_store%wmax) THEN
     434           66 :             mixing_store%wbroy(nv) = mixing_store%wc/res_norm
     435              :          ELSE
     436           22 :             mixing_store%wbroy(nv) = mixing_store%wmax
     437              :          END IF
     438           88 :          mixing_store%wbroy(nv) = MAX(1.0_dp, mixing_store%wbroy(nv))
     439              :       ELSE
     440         1410 :          mixing_store%wbroy(nv) = 1.0_dp
     441              :       END IF
     442              : 
     443              :       ! dfbroy
     444        81954 :       mixing_store%dfbroy(:, :, nv) = 0.0_dp
     445        37198 :       mixing_store%dfbroy(:, 1:ns, nv) = dq_now(:, 1:ns) - dq_last(:, 1:ns)
     446        19348 :       wdf = SUM(mixing_store%dfbroy(:, 1:ns, nv)**2)
     447         1498 :       CALL para_env%sum(wdf)
     448         1498 :       IF (wdf > TINY(1.0_dp) .AND. wdf < HUGE(1.0_dp)) THEN
     449         1496 :          wdf = 1.0_dp/SQRT(wdf)
     450        19342 :          mixing_store%dfbroy(:, 1:ns, nv) = wdf*mixing_store%dfbroy(:, 1:ns, nv)
     451              :       ELSE
     452              :          ! Identical consecutive residuals do not define a Broyden direction.
     453              :          ! Keep a zero history vector so it does not enter the Broyden update.
     454            2 :          wdf = 0.0_dp
     455            6 :          mixing_store%dfbroy(:, 1:ns, nv) = 0.0_dp
     456              :       END IF
     457              : 
     458              :       ! abroy matrix
     459         9208 :       DO i = 1, nv
     460        98758 :          wprod = SUM(mixing_store%dfbroy(:, 1:ns, i)*mixing_store%dfbroy(:, 1:ns, nv))
     461         7710 :          CALL para_env%sum(wprod)
     462         7710 :          mixing_store%abroy(i, nv) = wprod
     463         9208 :          mixing_store%abroy(nv, i) = wprod
     464              :       END DO
     465              : 
     466              :       ! broyden matrices
     467        13482 :       ALLOCATE (amat(nv, nv), beta(nv, nv), cvec(nv), gammab(nv))
     468         9208 :       DO i = 1, nv
     469        98758 :          wprod = SUM(mixing_store%dfbroy(:, 1:ns, i)*dq_now(:, 1:ns))
     470         7710 :          CALL para_env%sum(wprod)
     471         9208 :          cvec(i) = mixing_store%wbroy(i)*wprod
     472              :       END DO
     473              : 
     474         9208 :       DO i = 1, nv
     475        55356 :          DO j = 1, nv
     476        55356 :             beta(j, i) = mixing_store%wbroy(j)*mixing_store%wbroy(i)*mixing_store%abroy(j, i)
     477              :          END DO
     478         9208 :          IF (modified) THEN
     479          532 :             beta(i, i) = beta(i, i) + broy_w0*broy_w0
     480              :          ELSE
     481         7178 :             beta(i, i) = beta(i, i) + broy_w0
     482              :          END IF
     483              :       END DO
     484              : 
     485         1498 :       rskip = 1.e-12_dp
     486         1498 :       CALL get_pseudo_inverse_svd(beta, amat, rskip)
     487        64564 :       gammab(1:nv) = MATMUL(cvec(1:nv), amat(1:nv, 1:nv))
     488              : 
     489              :       ! build ubroy
     490        81954 :       mixing_store%ubroy(:, :, nv) = 0.0_dp
     491              :       mixing_store%ubroy(:, 1:ns, nv) = alpha*mixing_store%dfbroy(:, 1:ns, nv) + &
     492        37198 :                                         wdf*(q_now(:, 1:ns) - q_last(:, 1:ns))
     493              : 
     494        30552 :       charges = 0.0_dp
     495         4910 :       DO ia = 1, mixing_store%nat_local
     496         3412 :          ii = mixing_store%atlist(ia)
     497        16116 :          charges(ii, 1:ns) = q_now(ia, 1:ns) + alpha*dq_now(ia, 1:ns)
     498              :       END DO
     499         9208 :       DO i = 1, nv
     500        25994 :          DO ia = 1, mixing_store%nat_local
     501        16786 :             ii = mixing_store%atlist(ia)
     502        80306 :             charges(ii, 1:ns) = charges(ii, 1:ns) - mixing_store%wbroy(i)*gammab(i)*mixing_store%ubroy(ia, 1:ns, i)
     503              :          END DO
     504              :       END DO
     505        59606 :       CALL para_env%sum(charges)
     506              : 
     507         1498 :       DEALLOCATE (amat, beta, cvec, gammab)
     508              : 
     509         1498 :    END SUBROUTINE broyden_mixing
     510              : 
     511              : END MODULE qs_charge_mixing
        

Generated by: LCOV version 2.0-1