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 :
|