LCOV - code coverage report
Current view: top level - src - qs_charge_mixing_unittest.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:24d69ee) Lines: 94.6 % 37 35
Test Date: 2026-09-03 07:32:15 Functions: 100.0 % 2 2

            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            2 : PROGRAM qs_charge_mixing_unittest
       9            2 :    USE ieee_arithmetic,                 ONLY: ieee_is_finite
      10              :    USE kinds,                           ONLY: dp
      11              :    USE message_passing,                 ONLY: mp_para_env_type,&
      12              :                                               mp_world_finalize,&
      13              :                                               mp_world_init
      14              :    USE qs_charge_mixing,                ONLY: charge_mixing
      15              :    USE qs_density_mixing_types,         ONLY: broyden_mixing_nr,&
      16              :                                               mixing_storage_release,&
      17              :                                               mixing_storage_type
      18              : 
      19              :    IMPLICIT NONE
      20              : 
      21              :    REAL(KIND=dp), DIMENSION(1, 1) :: charges
      22              :    TYPE(mp_para_env_type), POINTER :: para_env
      23              :    TYPE(mixing_storage_type), POINTER :: mixing_store
      24              : 
      25            2 :    NULLIFY (mixing_store, para_env)
      26            2 :    ALLOCATE (para_env)
      27            2 :    CALL mp_world_init(para_env)
      28              : 
      29            8 :    ALLOCATE (mixing_store)
      30            2 :    mixing_store%ncall = 0
      31            2 :    mixing_store%nbuffer = 4
      32            2 :    mixing_store%n_simple_mix = 0
      33            2 :    mixing_store%nskip_mixing = 0
      34            2 :    mixing_store%alpha = 0.1_dp
      35            2 :    mixing_store%broy_w0 = 0.01_dp
      36            2 :    mixing_store%nat_local = 1
      37            2 :    mixing_store%max_shell = 1
      38              :    ALLOCATE (mixing_store%acharge(1, 1, 4), mixing_store%dacharge(1, 1, 4), &
      39              :              mixing_store%dfbroy(1, 1, 4), mixing_store%ubroy(1, 1, 4), &
      40            2 :              mixing_store%abroy(4, 4), mixing_store%wbroy(4), mixing_store%atlist(1))
      41           26 :    mixing_store%acharge = 0.0_dp
      42           26 :    mixing_store%dacharge = 0.0_dp
      43           26 :    mixing_store%dfbroy = 0.0_dp
      44           26 :    mixing_store%ubroy = 0.0_dp
      45           42 :    mixing_store%abroy = 0.0_dp
      46           10 :    mixing_store%wbroy = 0.0_dp
      47            4 :    mixing_store%atlist = 1
      48              : 
      49            6 :    charges = 1.0_dp
      50            2 :    CALL charge_mixing(broyden_mixing_nr, mixing_store, charges, para_env, 1)
      51            6 :    charges = 0.5_dp
      52            2 :    CALL charge_mixing(broyden_mixing_nr, mixing_store, charges, para_env, 2)
      53              : 
      54              :    ! Reproduce a degenerate Broyden history by supplying the previous residual again.
      55            2 :    charges(1, 1) = mixing_store%acharge(1, 1, 2) - mixing_store%dacharge(1, 1, 1)
      56            2 :    CALL charge_mixing(broyden_mixing_nr, mixing_store, charges, para_env, 3)
      57              : 
      58            6 :    IF (.NOT. ALL(ieee_is_finite(charges))) THEN
      59            0 :       ERROR STOP "Broyden mixing produced non-finite charges for identical residuals"
      60              :    END IF
      61            6 :    IF (.NOT. ALL(mixing_store%dfbroy(:, :, 1) == 0.0_dp)) THEN
      62            0 :       ERROR STOP "Degenerate Broyden direction was not discarded"
      63              :    END IF
      64              : 
      65            2 :    CALL mixing_storage_release(mixing_store)
      66            2 :    DEALLOCATE (mixing_store)
      67            2 :    DEALLOCATE (para_env)
      68            2 :    CALL mp_world_finalize()
      69              : 
      70            2 : END PROGRAM qs_charge_mixing_unittest
      71              : ! vim: set ts=3 sw=3 tw=132 :
        

Generated by: LCOV version 2.0-1