LCOV - code coverage report
Current view: top level - src - qs_density_mixing_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:2fce0f8) Lines: 243 266 91.4 %
Date: 2024-12-21 06:28:57 Functions: 3 5 60.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief module that contains the definitions of the scf types
      10             : !> \par History
      11             : !>      02.2003 created [fawzi]
      12             : !> \author fawzi
      13             : ! **************************************************************************************************
      14             : MODULE qs_density_mixing_types
      15             :    USE ao_util,                         ONLY: exp_radius
      16             :    USE input_constants,                 ONLY: broy_mix,&
      17             :                                               direct_p_mix,&
      18             :                                               gaussian,&
      19             :                                               kerker_mix,&
      20             :                                               multisec_mix,&
      21             :                                               no_mix,&
      22             :                                               pulay_mix
      23             :    USE input_keyword_types,             ONLY: keyword_create,&
      24             :                                               keyword_release,&
      25             :                                               keyword_type
      26             :    USE input_section_types,             ONLY: section_add_keyword,&
      27             :                                               section_create,&
      28             :                                               section_type,&
      29             :                                               section_vals_type,&
      30             :                                               section_vals_val_get
      31             :    USE input_val_types,                 ONLY: real_t
      32             :    USE kinds,                           ONLY: default_string_length,&
      33             :                                               dp
      34             :    USE qs_rho_atom_types,               ONLY: rho_atom_coeff
      35             :    USE string_utilities,                ONLY: s2a
      36             : #include "./base/base_uses.f90"
      37             : 
      38             :    IMPLICIT NONE
      39             :    PRIVATE
      40             : 
      41             :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      42             : 
      43             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_density_mixing_types'
      44             : 
      45             :    INTEGER, PARAMETER, PUBLIC :: no_mixing_nr = 0, direct_mixing_nr = 1, &
      46             :                                  gspace_mixing_nr = 2, pulay_mixing_nr = 3, &
      47             :                                  broyden_mixing_nr = 4, &
      48             :                                  multisecant_mixing_nr = 6
      49             :    PUBLIC :: cp_1d_z_p_type, mixing_storage_create, mixing_storage_type, mixing_storage_release, create_mixing_section
      50             : 
      51             :    TYPE cp_1d_z_p_type
      52             :       COMPLEX(dp), DIMENSION(:), POINTER :: cc => NULL()
      53             :    END TYPE cp_1d_z_p_type
      54             : 
      55             :    TYPE mixing_storage_type
      56             :    INTEGER                                           :: ig_max = -1, ncall = -1, ncall_p(2) = -1, nbuffer = -1, n_simple_mix = -1, &
      57             :                                                            nskip_mixing = -1, p_metric_method = -1
      58             :       INTEGER, POINTER, DIMENSION(:)                    :: ig_global_index => NULL()
      59             :       LOGICAL                                           :: gmix_p = .FALSE.
      60             :       LOGICAL, POINTER, DIMENSION(:)                    :: paw => NULL()
      61             :       CHARACTER(len=15)                                 :: iter_method = ""
      62             :       REAL(KIND=dp)                                     :: alpha = -1.0_dp, bconst = -1.0_dp, beta = -1.0_dp, broy_w0 = -1.0_dp, &
      63             :                                                            max_g2 = -1.0_dp, max_gvec_exp = -1.0_dp, pulay_alpha = -1.0_dp, &
      64             :                                                            pulay_beta = -1.0_dp, r_step = -1.0_dp, reg_par = -1.0_dp, &
      65             :                                                            sigma_max = -1.0_dp, wc = -1.0_dp, wmax = -1.0_dp
      66             :       REAL(KIND=dp), DIMENSION(:), POINTER              :: p_metric => NULL()
      67             :       REAL(KIND=dp), DIMENSION(:), POINTER              :: kerker_factor => NULL()
      68             :       REAL(KIND=dp), DIMENSION(:), POINTER              :: special_metric => NULL()
      69             :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: weight => NULL()
      70             :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: norm_res_buffer => NULL()
      71             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: fmat => NULL(), gmat => NULL(), pulay_matrix => NULL(), smat => NULL()
      72             :       !
      73             :       INTEGER                                           :: nat_local = -1, max_shell = -1
      74             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: acharge => NULL()
      75             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: dacharge => NULL()
      76             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: dfbroy => NULL()
      77             :       REAL(KIND=dp), DIMENSION(:, :, :), POINTER        :: ubroy => NULL()
      78             :       REAL(KIND=dp), DIMENSION(:, :), POINTER           :: abroy => NULL()
      79             :       REAL(KIND=dp), DIMENSION(:), POINTER              :: wbroy => NULL()
      80             :       INTEGER, DIMENSION(:), POINTER                    :: atlist => NULL()
      81             :       !
      82             :       TYPE(cp_1d_z_p_type), DIMENSION(:), POINTER       :: last_res => NULL(), rhoin => NULL(), rhoin_old => NULL()
      83             :       TYPE(cp_1d_z_p_type), DIMENSION(:, :), POINTER    :: delta_res => NULL(), u_vec => NULL(), z_vec => NULL()
      84             :       TYPE(cp_1d_z_p_type), DIMENSION(:, :), POINTER    :: drho_buffer => NULL(), rhoin_buffer => NULL(), res_buffer => NULL()
      85             :       !
      86             :       TYPE(rho_atom_coeff), DIMENSION(:, :), POINTER    :: cpc_h_lastres => NULL(), cpc_s_lastres => NULL()
      87             :       TYPE(rho_atom_coeff), DIMENSION(:, :), POINTER    :: cpc_h_in => NULL(), cpc_s_in => NULL()
      88             :       TYPE(rho_atom_coeff), DIMENSION(:, :), POINTER    :: cpc_h_old => NULL(), cpc_s_old => NULL()
      89             :       TYPE(rho_atom_coeff), DIMENSION(:, :, :), POINTER :: cpc_h_in_buffer => NULL(), cpc_s_in_buffer => NULL()
      90             :       TYPE(rho_atom_coeff), DIMENSION(:, :, :), POINTER :: cpc_h_res_buffer => NULL(), cpc_s_res_buffer => NULL()
      91             :       TYPE(rho_atom_coeff), DIMENSION(:, :, :), POINTER :: dcpc_h_in => NULL(), dcpc_s_in => NULL()
      92             :    END TYPE mixing_storage_type
      93             : 
      94             : CONTAINS
      95             : 
      96             : ! **************************************************************************************************
      97             : !> \brief creates a mixing_storage
      98             : !> \param mixing_store ...
      99             : !> \param mixing_section ...
     100             : !> \param mixing_method ...
     101             : !> \param ecut ...
     102             : !> \par History
     103             : !>      05.2009 created [MI]
     104             : !> \author [MI]
     105             : ! **************************************************************************************************
     106       19695 :    SUBROUTINE mixing_storage_create(mixing_store, mixing_section, mixing_method, ecut)
     107             :       TYPE(mixing_storage_type), INTENT(OUT)             :: mixing_store
     108             :       TYPE(section_vals_type), POINTER                   :: mixing_section
     109             :       INTEGER, INTENT(IN)                                :: mixing_method
     110             :       REAL(dp), INTENT(IN)                               :: ecut
     111             : 
     112             :       REAL(dp)                                           :: alpha, eps, gcut
     113             : 
     114        6565 :       mixing_store%nbuffer = 0
     115        6565 :       mixing_store%n_simple_mix = 0
     116        6565 :       mixing_store%ncall = 0
     117       19695 :       mixing_store%ncall_p = 0
     118        6565 :       mixing_store%alpha = 1.0_dp
     119        6565 :       mixing_store%pulay_beta = 1.0_dp
     120        6565 :       mixing_store%beta = 1.0_dp
     121        6565 :       mixing_store%iter_method = "NoMix"
     122        6565 :       mixing_store%max_g2 = 2._dp*ecut
     123        6565 :       mixing_store%gmix_p = .FALSE.
     124             : 
     125        6565 :       NULLIFY (mixing_store%p_metric)
     126        6565 :       NULLIFY (mixing_store%kerker_factor)
     127        6565 :       NULLIFY (mixing_store%special_metric)
     128        6565 :       NULLIFY (mixing_store%pulay_matrix)
     129        6565 :       NULLIFY (mixing_store%weight)
     130        6565 :       NULLIFY (mixing_store%fmat)
     131        6565 :       NULLIFY (mixing_store%gmat)
     132        6565 :       NULLIFY (mixing_store%smat)
     133        6565 :       NULLIFY (mixing_store%acharge)
     134        6565 :       NULLIFY (mixing_store%dacharge)
     135        6565 :       NULLIFY (mixing_store%dfbroy)
     136        6565 :       NULLIFY (mixing_store%ubroy)
     137        6565 :       NULLIFY (mixing_store%abroy)
     138        6565 :       NULLIFY (mixing_store%wbroy)
     139        6565 :       NULLIFY (mixing_store%atlist)
     140        6565 :       NULLIFY (mixing_store%last_res)
     141        6565 :       NULLIFY (mixing_store%rhoin)
     142        6565 :       NULLIFY (mixing_store%rhoin_old)
     143        6565 :       NULLIFY (mixing_store%delta_res)
     144        6565 :       NULLIFY (mixing_store%u_vec)
     145        6565 :       NULLIFY (mixing_store%z_vec)
     146        6565 :       NULLIFY (mixing_store%drho_buffer)
     147        6565 :       NULLIFY (mixing_store%rhoin_buffer)
     148        6565 :       NULLIFY (mixing_store%res_buffer)
     149        6565 :       NULLIFY (mixing_store%norm_res_buffer)
     150        6565 :       NULLIFY (mixing_store%ig_global_index)
     151        6565 :       NULLIFY (mixing_store%paw)
     152        6565 :       NULLIFY (mixing_store%cpc_h_in)
     153        6565 :       NULLIFY (mixing_store%cpc_s_in)
     154        6565 :       NULLIFY (mixing_store%cpc_h_old)
     155        6565 :       NULLIFY (mixing_store%cpc_s_old)
     156        6565 :       NULLIFY (mixing_store%dcpc_h_in)
     157        6565 :       NULLIFY (mixing_store%dcpc_s_in)
     158        6565 :       NULLIFY (mixing_store%cpc_h_lastres)
     159        6565 :       NULLIFY (mixing_store%cpc_s_lastres)
     160        6565 :       NULLIFY (mixing_store%cpc_h_in_buffer)
     161        6565 :       NULLIFY (mixing_store%cpc_s_in_buffer)
     162        6565 :       NULLIFY (mixing_store%cpc_h_res_buffer)
     163        6565 :       NULLIFY (mixing_store%cpc_s_res_buffer)
     164             : 
     165        6565 :       CALL section_vals_val_get(mixing_section, "ALPHA", r_val=mixing_store%alpha)
     166        6565 :       CALL section_vals_val_get(mixing_section, "BETA", r_val=mixing_store%beta)
     167        6565 :       CALL section_vals_val_get(mixing_section, "N_SIMPLE_MIX", i_val=mixing_store%n_simple_mix)
     168        6565 :       CALL section_vals_val_get(mixing_section, "NBUFFER", i_val=mixing_store%nbuffer)
     169        6565 :       CALL section_vals_val_get(mixing_section, "NSKIP", i_val=mixing_store%nskip_mixing)
     170        6565 :       CALL section_vals_val_get(mixing_section, "MAX_GVEC_EXP", r_val=mixing_store%max_gvec_exp)
     171        6565 :       CALL section_vals_val_get(mixing_section, "GMIX_P", l_val=mixing_store%gmix_p)
     172             : 
     173        6565 :       IF (mixing_store%max_gvec_exp > 0._dp) THEN
     174           0 :          alpha = 0.25_dp/mixing_store%max_gvec_exp
     175           0 :          eps = 1.e-4_dp
     176           0 :          gcut = exp_radius(3, alpha, eps, 1.0_dp)
     177           0 :          mixing_store%max_g2 = gcut*gcut
     178             :       END IF
     179             : 
     180        6575 :       SELECT CASE (mixing_method)
     181             :       CASE (gspace_mixing_nr)
     182          10 :          mixing_store%nbuffer = 1
     183             :       CASE (pulay_mixing_nr)
     184          36 :          CALL section_vals_val_get(mixing_section, "PULAY_ALPHA", r_val=mixing_store%pulay_alpha)
     185          36 :          CALL section_vals_val_get(mixing_section, "PULAY_BETA", r_val=mixing_store%pulay_beta)
     186             :       CASE (broyden_mixing_nr)
     187         498 :          CALL section_vals_val_get(mixing_section, "BROY_W0", r_val=mixing_store%broy_w0)
     188         498 :          mixing_store%bconst = 20.0_dp
     189             :       CASE (multisecant_mixing_nr)
     190           0 :          CALL section_vals_val_get(mixing_section, "REGULARIZATION", r_val=mixing_store%reg_par)
     191           0 :          CALL section_vals_val_get(mixing_section, "MAX_STEP", r_val=mixing_store%sigma_max)
     192        6565 :          CALL section_vals_val_get(mixing_section, "R_FACTOR", r_val=mixing_store%r_step)
     193             :       END SELECT
     194             : 
     195        6565 :    END SUBROUTINE mixing_storage_create
     196             : 
     197             : ! **************************************************************************************************
     198             : !> \brief releases a mixing_storage
     199             : !> \param mixing_store ...
     200             : !> \par History
     201             : !>      05.2009 created [MI]
     202             : !> \author [MI]
     203             : ! **************************************************************************************************
     204        6565 :    SUBROUTINE mixing_storage_release(mixing_store)
     205             :       TYPE(mixing_storage_type), INTENT(INOUT)           :: mixing_store
     206             : 
     207             :       INTEGER                                            :: i, j, k
     208             : 
     209        6565 :       IF (ASSOCIATED(mixing_store%kerker_factor)) THEN
     210         186 :          DEALLOCATE (mixing_store%kerker_factor)
     211             :       END IF
     212             : 
     213        6565 :       IF (ASSOCIATED(mixing_store%special_metric)) THEN
     214         186 :          DEALLOCATE (mixing_store%special_metric)
     215             :       END IF
     216             : 
     217        6565 :       IF (ASSOCIATED(mixing_store%pulay_matrix)) THEN
     218          34 :          DEALLOCATE (mixing_store%pulay_matrix)
     219             :       END IF
     220             : 
     221        6565 :       IF (ASSOCIATED(mixing_store%rhoin_buffer)) THEN
     222          72 :          DO i = 1, SIZE(mixing_store%rhoin_buffer, 2)
     223         292 :             DO j = 1, SIZE(mixing_store%rhoin_buffer, 1)
     224         258 :                DEALLOCATE (mixing_store%rhoin_buffer(j, i)%cc)
     225             :             END DO
     226             :          END DO
     227          34 :          DEALLOCATE (mixing_store%rhoin_buffer)
     228             :       END IF
     229             : 
     230        6565 :       IF (ASSOCIATED(mixing_store%paw)) THEN
     231          16 :          DEALLOCATE (mixing_store%paw)
     232             :       END IF
     233        6565 :       IF (ASSOCIATED(mixing_store%cpc_h_in)) THEN
     234          38 :          DO j = 1, SIZE(mixing_store%cpc_h_in, 2)
     235         214 :          DO k = 1, SIZE(mixing_store%cpc_h_in, 1)
     236         198 :             IF (ASSOCIATED(mixing_store%cpc_h_in(k, j)%r_coef)) THEN
     237         106 :                DEALLOCATE (mixing_store%cpc_h_in(k, j)%r_coef)
     238         106 :                DEALLOCATE (mixing_store%cpc_s_in(k, j)%r_coef)
     239             :             END IF
     240             :          END DO
     241             :          END DO
     242          16 :          DEALLOCATE (mixing_store%cpc_h_in)
     243          16 :          DEALLOCATE (mixing_store%cpc_s_in)
     244             :       END IF
     245        6565 :       IF (ASSOCIATED(mixing_store%cpc_h_old)) THEN
     246          30 :          DO j = 1, SIZE(mixing_store%cpc_h_old, 2)
     247         174 :          DO k = 1, SIZE(mixing_store%cpc_h_old, 1)
     248         162 :             IF (ASSOCIATED(mixing_store%cpc_h_old(k, j)%r_coef)) THEN
     249         102 :                DEALLOCATE (mixing_store%cpc_h_old(k, j)%r_coef)
     250         102 :                DEALLOCATE (mixing_store%cpc_s_old(k, j)%r_coef)
     251             :             END IF
     252             :          END DO
     253             :          END DO
     254          12 :          DEALLOCATE (mixing_store%cpc_h_old)
     255          12 :          DEALLOCATE (mixing_store%cpc_s_old)
     256             :       END IF
     257        6565 :       IF (ASSOCIATED(mixing_store%cpc_h_in_buffer)) THEN
     258           4 :          DO i = 1, SIZE(mixing_store%cpc_h_in_buffer, 3)
     259          20 :          DO j = 1, SIZE(mixing_store%cpc_h_in_buffer, 2)
     260          98 :          DO k = 1, SIZE(mixing_store%cpc_h_in_buffer, 1)
     261          96 :             IF (ASSOCIATED(mixing_store%cpc_h_in_buffer(k, j, i)%r_coef)) THEN
     262          10 :                DEALLOCATE (mixing_store%cpc_h_in_buffer(k, j, i)%r_coef)
     263          10 :                DEALLOCATE (mixing_store%cpc_s_in_buffer(k, j, i)%r_coef)
     264             :             END IF
     265             :          END DO
     266             :          END DO
     267             :          END DO
     268           2 :          DEALLOCATE (mixing_store%cpc_h_in_buffer)
     269           2 :          DEALLOCATE (mixing_store%cpc_s_in_buffer)
     270             :       END IF
     271        6565 :       IF (ASSOCIATED(mixing_store%cpc_h_res_buffer)) THEN
     272           4 :          DO i = 1, SIZE(mixing_store%cpc_h_res_buffer, 3)
     273          20 :          DO j = 1, SIZE(mixing_store%cpc_h_res_buffer, 2)
     274          98 :          DO k = 1, SIZE(mixing_store%cpc_h_res_buffer, 1)
     275          96 :             IF (ASSOCIATED(mixing_store%cpc_h_res_buffer(k, j, i)%r_coef)) THEN
     276          10 :                DEALLOCATE (mixing_store%cpc_h_res_buffer(k, j, i)%r_coef)
     277          10 :                DEALLOCATE (mixing_store%cpc_s_res_buffer(k, j, i)%r_coef)
     278             :             END IF
     279             :          END DO
     280             :          END DO
     281             :          END DO
     282           2 :          DEALLOCATE (mixing_store%cpc_h_res_buffer)
     283           2 :          DEALLOCATE (mixing_store%cpc_s_res_buffer)
     284             :       END IF
     285             : 
     286        6565 :       IF (ASSOCIATED(mixing_store%dcpc_h_in)) THEN
     287          30 :          DO i = 1, SIZE(mixing_store%dcpc_h_in, 3)
     288         174 :          DO j = 1, SIZE(mixing_store%dcpc_h_in, 2)
     289        1266 :          DO k = 1, SIZE(mixing_store%dcpc_h_in, 1)
     290        1248 :             IF (ASSOCIATED(mixing_store%dcpc_h_in(k, j, i)%r_coef)) THEN
     291         810 :                DEALLOCATE (mixing_store%dcpc_h_in(k, j, i)%r_coef)
     292         810 :                DEALLOCATE (mixing_store%dcpc_s_in(k, j, i)%r_coef)
     293             :             END IF
     294             :          END DO
     295             :          END DO
     296             :          END DO
     297          12 :          DEALLOCATE (mixing_store%dcpc_h_in)
     298          12 :          DEALLOCATE (mixing_store%dcpc_s_in)
     299             :       END IF
     300        6565 :       IF (ASSOCIATED(mixing_store%cpc_h_lastres)) THEN
     301          30 :          DO j = 1, SIZE(mixing_store%cpc_h_lastres, 2)
     302         174 :          DO k = 1, SIZE(mixing_store%cpc_h_lastres, 1)
     303         162 :             IF (ASSOCIATED(mixing_store%cpc_h_lastres(k, j)%r_coef)) THEN
     304         102 :                DEALLOCATE (mixing_store%cpc_h_lastres(k, j)%r_coef)
     305         102 :                DEALLOCATE (mixing_store%cpc_s_lastres(k, j)%r_coef)
     306             :             END IF
     307             :          END DO
     308             :          END DO
     309          12 :          DEALLOCATE (mixing_store%cpc_h_lastres)
     310          12 :          DEALLOCATE (mixing_store%cpc_s_lastres)
     311             :       END IF
     312             : 
     313        6565 :       IF (ASSOCIATED(mixing_store%res_buffer)) THEN
     314         382 :          DO i = 1, SIZE(mixing_store%res_buffer, 2)
     315        2142 :             DO j = 1, SIZE(mixing_store%res_buffer, 1)
     316        1966 :                DEALLOCATE (mixing_store%res_buffer(j, i)%cc)
     317             :             END DO
     318             :          END DO
     319         176 :          DEALLOCATE (mixing_store%res_buffer)
     320             :       END IF
     321             : 
     322        6565 :       IF (ASSOCIATED(mixing_store%norm_res_buffer)) THEN
     323           0 :          DEALLOCATE (mixing_store%norm_res_buffer)
     324             :       END IF
     325             : 
     326        6565 :       IF (ASSOCIATED(mixing_store%ig_global_index)) THEN
     327           0 :          DEALLOCATE (mixing_store%ig_global_index)
     328             :       END IF
     329             : 
     330        6565 :       IF (ASSOCIATED(mixing_store%drho_buffer)) THEN
     331         310 :          DO i = 1, SIZE(mixing_store%drho_buffer, 2)
     332        1850 :             DO j = 1, SIZE(mixing_store%drho_buffer, 1)
     333        1708 :                DEALLOCATE (mixing_store%drho_buffer(j, i)%cc)
     334             :             END DO
     335             :          END DO
     336         142 :          DEALLOCATE (mixing_store%drho_buffer)
     337             :       END IF
     338             : 
     339        6565 :       IF (ASSOCIATED(mixing_store%last_res)) THEN
     340         310 :          DO i = 1, SIZE(mixing_store%last_res)
     341         310 :             DEALLOCATE (mixing_store%last_res(i)%cc)
     342             :          END DO
     343         142 :          DEALLOCATE (mixing_store%last_res)
     344             :       END IF
     345             : 
     346        6565 :       IF (ASSOCIATED(mixing_store%rhoin)) THEN
     347         402 :          DO i = 1, SIZE(mixing_store%rhoin)
     348         402 :             DEALLOCATE (mixing_store%rhoin(i)%cc)
     349             :          END DO
     350         186 :          DEALLOCATE (mixing_store%rhoin)
     351             :       END IF
     352             : 
     353        6565 :       IF (ASSOCIATED(mixing_store%rhoin_old)) THEN
     354         310 :          DO i = 1, SIZE(mixing_store%rhoin_old)
     355         310 :             DEALLOCATE (mixing_store%rhoin_old(i)%cc)
     356             :          END DO
     357         142 :          DEALLOCATE (mixing_store%rhoin_old)
     358             :       END IF
     359             : 
     360        6565 :       IF (ASSOCIATED(mixing_store%p_metric)) THEN
     361         142 :          DEALLOCATE (mixing_store%p_metric)
     362             :       END IF
     363             : 
     364        6565 :       IF (ASSOCIATED(mixing_store%weight)) THEN
     365           0 :          DEALLOCATE (mixing_store%weight)
     366             :       END IF
     367             : 
     368        6565 :       IF (ASSOCIATED(mixing_store%fmat)) THEN
     369           0 :          DEALLOCATE (mixing_store%fmat)
     370             :       END IF
     371             : 
     372        6565 :       IF (ASSOCIATED(mixing_store%acharge)) THEN
     373          16 :          DEALLOCATE (mixing_store%acharge)
     374             :       END IF
     375        6565 :       IF (ASSOCIATED(mixing_store%dacharge)) THEN
     376          16 :          DEALLOCATE (mixing_store%dacharge)
     377             :       END IF
     378        6565 :       IF (ASSOCIATED(mixing_store%dfbroy)) THEN
     379          16 :          DEALLOCATE (mixing_store%dfbroy)
     380             :       END IF
     381        6565 :       IF (ASSOCIATED(mixing_store%ubroy)) THEN
     382          16 :          DEALLOCATE (mixing_store%ubroy)
     383             :       END IF
     384        6565 :       IF (ASSOCIATED(mixing_store%abroy)) THEN
     385          16 :          DEALLOCATE (mixing_store%abroy)
     386             :       END IF
     387        6565 :       IF (ASSOCIATED(mixing_store%wbroy)) THEN
     388          16 :          DEALLOCATE (mixing_store%wbroy)
     389             :       END IF
     390        6565 :       IF (ASSOCIATED(mixing_store%atlist)) THEN
     391          16 :          DEALLOCATE (mixing_store%atlist)
     392             :       END IF
     393             : 
     394        6565 :       IF (ASSOCIATED(mixing_store%delta_res)) THEN
     395           0 :          DO i = 1, SIZE(mixing_store%delta_res, 2)
     396           0 :             DO j = 1, SIZE(mixing_store%delta_res, 1)
     397           0 :                DEALLOCATE (mixing_store%delta_res(j, i)%cc)
     398             :             END DO
     399             :          END DO
     400           0 :          DEALLOCATE (mixing_store%delta_res)
     401             :       END IF
     402             : 
     403        6565 :       IF (ASSOCIATED(mixing_store%u_vec)) THEN
     404           0 :          DO i = 1, SIZE(mixing_store%u_vec, 2)
     405           0 :             DO j = 1, SIZE(mixing_store%u_vec, 1)
     406           0 :                DEALLOCATE (mixing_store%u_vec(j, i)%cc)
     407             :             END DO
     408             :          END DO
     409           0 :          DEALLOCATE (mixing_store%u_vec)
     410             :       END IF
     411             : 
     412        6565 :       IF (ASSOCIATED(mixing_store%z_vec)) THEN
     413           0 :          DO i = 1, SIZE(mixing_store%z_vec, 2)
     414           0 :             DO j = 1, SIZE(mixing_store%z_vec, 1)
     415           0 :                DEALLOCATE (mixing_store%z_vec(j, i)%cc)
     416             :             END DO
     417             :          END DO
     418           0 :          DEALLOCATE (mixing_store%z_vec)
     419             :       END IF
     420             : 
     421        6565 :    END SUBROUTINE mixing_storage_release
     422             : 
     423             : ! **************************************************************************************************
     424             : !> \brief      Create CP2K input section for the mixing of the density matrix to
     425             : !>             be used only with diagonalization methods, i.e. not with OT
     426             : !> \param section ...
     427             : !> \param ls_scf ...
     428             : !> \date       20.02.2009
     429             : !> \par History
     430             : !>      02.2015 moved here from input_cp2k_dft.F, modified for use in LS SCF
     431             : !>              [Patrick Seewald]
     432             : !> \author     MI
     433             : !> \version    1.0
     434             : ! **************************************************************************************************
     435       61447 :    SUBROUTINE create_mixing_section(section, ls_scf)
     436             : 
     437             :       TYPE(section_type), POINTER                        :: section
     438             :       LOGICAL, INTENT(IN), OPTIONAL                      :: ls_scf
     439             : 
     440             :       CHARACTER(LEN=default_string_length)               :: section_name
     441             :       INTEGER                                            :: default_mix
     442             :       LOGICAL                                            :: ls
     443             :       TYPE(keyword_type), POINTER                        :: keyword
     444             : 
     445       61447 :       CPASSERT(.NOT. ASSOCIATED(section))
     446             : 
     447       61447 :       IF (PRESENT(ls_scf)) THEN
     448       18365 :          IF (ls_scf) THEN
     449             :             ls = .TRUE.
     450             :          ELSE
     451             :             ls = .FALSE.
     452             :          END IF
     453             :       ELSE
     454             :          ls = .FALSE.
     455             :       END IF
     456             : 
     457             :       IF (ls) THEN
     458        9191 :          section_name = "RHO_MIXING"
     459             :       ELSE
     460       52256 :          section_name = "MIXING"
     461             :       END IF
     462             : 
     463             :       CALL section_create(section, __LOCATION__, &
     464             :                           name=section_name, &
     465             :                           description="Define type and parameters for mixing "// &
     466             :                           "procedures to be applied to the density matrix. Normally, "// &
     467             :                           "only one type of mixing method should be accepted. The mixing "// &
     468             :                           "procedures activated by this section are only active for diagonalization "// &
     469             :                           "methods and linear scaling SCF, i.e. not with minimization methods based "// &
     470             :                           "on OT.", &
     471             :                           n_keywords=16, &
     472             :                           n_subsections=0, &
     473       61447 :                           repeats=.FALSE.)
     474             : 
     475       61447 :       NULLIFY (keyword)
     476             : 
     477             :       CALL keyword_create(keyword, __LOCATION__, &
     478             :                           name="_SECTION_PARAMETERS_", &
     479             :                           description="Controls the activation of the mixing procedure", &
     480             :                           usage="&MIXING ON", &
     481             :                           default_l_val=.TRUE., &
     482       61447 :                           lone_keyword_l_val=.TRUE.)
     483       61447 :       CALL section_add_keyword(section, keyword)
     484       61447 :       CALL keyword_release(keyword)
     485             : 
     486       61447 :       IF (.NOT. ls) THEN
     487       52256 :          default_mix = direct_p_mix
     488             :       ELSE
     489        9191 :          default_mix = broy_mix
     490             :       END IF
     491             : 
     492             :       CALL keyword_create(keyword, __LOCATION__, &
     493             :                           name="METHOD", &
     494             :                           description="Mixing method to be applied", &
     495             :                           repeats=.FALSE., &
     496             :                           usage="METHOD KERKER_MIXING", &
     497             :                           default_i_val=default_mix, &
     498             :                           enum_c_vals=s2a("NONE", &
     499             :                                           "DIRECT_P_MIXING", &
     500             :                                           "KERKER_MIXING", &
     501             :                                           "PULAY_MIXING", &
     502             :                                           "BROYDEN_MIXING", &
     503             :                                           "MULTISECANT_MIXING"), &
     504             :                           enum_i_vals=(/no_mix, direct_p_mix, kerker_mix, pulay_mix, broy_mix, &
     505             :                                         multisec_mix/), &
     506             :                           enum_desc=s2a("No mixing is applied", &
     507             :                                         "Direct mixing of new and old density matrices", &
     508             :                                         "Mixing of the potential in reciprocal space using the Kerker damping", &
     509             :                                         "Pulay mixing", "Broyden mixing", &
     510       61447 :                                         "Multisecant scheme for mixing"))
     511             : 
     512       61447 :       CALL section_add_keyword(section, keyword)
     513       61447 :       CALL keyword_release(keyword)
     514             : 
     515             :       CALL keyword_create(keyword, __LOCATION__, &
     516             :                           name="ALPHA", &
     517             :                           description="Fraction of new density to be included", &
     518             :                           repeats=.FALSE., &
     519             :                           n_var=1, &
     520             :                           type_of_var=real_t, &
     521             :                           default_r_val=0.4_dp, &
     522       61447 :                           usage="ALPHA 0.2")
     523       61447 :       CALL section_add_keyword(section, keyword)
     524       61447 :       CALL keyword_release(keyword)
     525             : 
     526             :       CALL keyword_create(keyword, __LOCATION__, &
     527             :                           name="BETA", &
     528             :                           description="Denominator parameter in Kerker damping "// &
     529             :                           "introduced to suppress charge sloshing: "// &
     530             :                           "rho_mix(g) = rho_in(g) + alpha*g^2/(g^2 + beta^2)*(rho_out(g)-rho_in(g))", &
     531             :                           repeats=.FALSE., &
     532             :                           n_var=1, &
     533             :                           type_of_var=real_t, &
     534             :                           default_r_val=0.5_dp, &
     535             :                           unit_str="bohr^-1", &
     536       61447 :                           usage="BETA 1.5")
     537       61447 :       CALL section_add_keyword(section, keyword)
     538       61447 :       CALL keyword_release(keyword)
     539             : 
     540             :       CALL keyword_create(keyword, __LOCATION__, &
     541             :                           name="PULAY_ALPHA", &
     542             :                           description="Fraction of new density to be added to the Pulay expansion", &
     543             :                           repeats=.FALSE., &
     544             :                           n_var=1, &
     545             :                           type_of_var=real_t, &
     546             :                           default_r_val=0.0_dp, &
     547       61447 :                           usage="PULAY_ALPHA 0.2")
     548       61447 :       CALL section_add_keyword(section, keyword)
     549       61447 :       CALL keyword_release(keyword)
     550             : 
     551             :       CALL keyword_create(keyword, __LOCATION__, &
     552             :                           name="PULAY_BETA", &
     553             :                           description="Fraction of residual contribution to be added to Pulay expansion", &
     554             :                           repeats=.FALSE., &
     555             :                           n_var=1, &
     556             :                           type_of_var=real_t, &
     557             :                           default_r_val=1.0_dp, &
     558       61447 :                           usage="PULAY_BETA 0.2")
     559       61447 :       CALL section_add_keyword(section, keyword)
     560       61447 :       CALL keyword_release(keyword)
     561             : 
     562             :       CALL keyword_create(keyword, __LOCATION__, name="NMIXING", &
     563             :                           description="Minimal number of density mixing (should be greater than 0), "// &
     564             :                           "before starting DIIS", &
     565       61447 :                           usage="NMIXING 1", default_i_val=2)
     566       61447 :       CALL section_add_keyword(section, keyword)
     567       61447 :       CALL keyword_release(keyword)
     568             : 
     569             :       CALL keyword_create(keyword, __LOCATION__, name="NBUFFER", &
     570             :                           variants=s2a("NPULAY", "NBROYDEN", "NMULTISECANT"), &
     571             :                           description="Number of previous steps stored for the actual mixing scheme", &
     572       61447 :                           usage="NBUFFER 2", default_i_val=4)
     573       61447 :       CALL section_add_keyword(section, keyword)
     574       61447 :       CALL keyword_release(keyword)
     575             : 
     576             :       CALL keyword_create(keyword, __LOCATION__, &
     577             :                           name="BROY_W0", &
     578             :                           description=" w0 parameter used in Broyden mixing", &
     579             :                           repeats=.FALSE., &
     580             :                           n_var=1, &
     581             :                           type_of_var=real_t, &
     582             :                           default_r_val=0.01_dp, &
     583       61447 :                           usage="BROY_W0 0.03")
     584       61447 :       CALL section_add_keyword(section, keyword)
     585       61447 :       CALL keyword_release(keyword)
     586             : 
     587             :       CALL keyword_create(keyword, __LOCATION__, &
     588             :                           name="BROY_WREF", &
     589             :                           description="", &
     590             :                           repeats=.FALSE., &
     591             :                           n_var=1, &
     592             :                           type_of_var=real_t, &
     593             :                           default_r_val=100.0_dp, &
     594       61447 :                           usage="BROY_WREF 0.2")
     595       61447 :       CALL section_add_keyword(section, keyword)
     596       61447 :       CALL keyword_release(keyword)
     597             : 
     598             :       CALL keyword_create(keyword, __LOCATION__, &
     599             :                           name="BROY_WMAX", &
     600             :                           description="", &
     601             :                           repeats=.FALSE., &
     602             :                           n_var=1, &
     603             :                           type_of_var=real_t, &
     604             :                           default_r_val=30.0_dp, &
     605       61447 :                           usage="BROY_WMAX 10.0")
     606       61447 :       CALL section_add_keyword(section, keyword)
     607       61447 :       CALL keyword_release(keyword)
     608             : 
     609             :       CALL keyword_create(keyword, __LOCATION__, &
     610             :                           name="REGULARIZATION", &
     611             :                           description="Regularization parameter to stabilize "// &
     612             :                           "the inversion of the residual matrix {Yn^t Yn} in the "// &
     613             :                           "multisecant mixing scheme (noise)", &
     614             :                           repeats=.FALSE., &
     615             :                           n_var=1, &
     616             :                           type_of_var=real_t, &
     617             :                           default_r_val=0.00001_dp, &
     618       61447 :                           usage="REGULARIZATION 0.000001")
     619       61447 :       CALL section_add_keyword(section, keyword)
     620       61447 :       CALL keyword_release(keyword)
     621             : 
     622             :       CALL keyword_create(keyword, __LOCATION__, &
     623             :                           name="MAX_STEP", &
     624             :                           description="Upper bound for the magnitude of the "// &
     625             :                           "unpredicted step size in the update by the "// &
     626             :                           "multisecant mixing scheme", &
     627             :                           repeats=.FALSE., &
     628             :                           n_var=1, &
     629             :                           type_of_var=real_t, &
     630             :                           default_r_val=0.1_dp, &
     631       61447 :                           usage="MAX_STEP .2")
     632       61447 :       CALL section_add_keyword(section, keyword)
     633       61447 :       CALL keyword_release(keyword)
     634             : 
     635             :       CALL keyword_create(keyword, __LOCATION__, &
     636             :                           name="R_FACTOR", &
     637             :                           description="Control factor for the magnitude of the "// &
     638             :                           "unpredicted step size in the update by the "// &
     639             :                           "multisecant mixing scheme", &
     640             :                           repeats=.FALSE., &
     641             :                           n_var=1, &
     642             :                           type_of_var=real_t, &
     643             :                           default_r_val=0.05_dp, &
     644       61447 :                           usage="R_FACTOR .12")
     645       61447 :       CALL section_add_keyword(section, keyword)
     646       61447 :       CALL keyword_release(keyword)
     647             : 
     648             :       CALL keyword_create(keyword, __LOCATION__, name="NSKIP", &
     649             :                           variants=(/"NSKIP_MIXING"/), &
     650             :                           description="Number of initial iteration for which the mixing is skipped", &
     651      122894 :                           usage="NSKIP 10", default_i_val=0)
     652       61447 :       CALL section_add_keyword(section, keyword)
     653       61447 :       CALL keyword_release(keyword)
     654             : 
     655             :       CALL keyword_create(keyword, __LOCATION__, name="N_SIMPLE_MIX", &
     656             :                           variants=(/"NSIMPLEMIX"/), &
     657             :                           description="Number of kerker damping iterations before starting other mixing procedures", &
     658      122894 :                           usage="NSIMPLEMIX", default_i_val=0)
     659       61447 :       CALL section_add_keyword(section, keyword)
     660       61447 :       CALL keyword_release(keyword)
     661             : 
     662             :       CALL keyword_create(keyword, __LOCATION__, name="MAX_GVEC_EXP", &
     663             :                           description="Restricts the G-space mixing to lower part of G-vector spectrum,"// &
     664             :                           " up to a G0, by assigning the exponent of the Gaussian that can be "// &
     665             :                           "represented by vectors smaller than G0 within a certain accuracy. ", &
     666             :                           repeats=.FALSE., &
     667             :                           n_var=1, &
     668             :                           type_of_var=real_t, &
     669             :                           default_r_val=-1._dp, &
     670       61447 :                           usage="MAX_GVEC_EXP 3.")
     671       61447 :       CALL section_add_keyword(section, keyword)
     672       61447 :       CALL keyword_release(keyword)
     673             : 
     674             :       CALL keyword_create(keyword, __LOCATION__, name="GMIX_P", &
     675             :                           description="Activate the mixing of the density matrix, using the same"// &
     676             :                           " mixing coefficient applied for the g-space mixing.", &
     677             :                           repeats=.FALSE., &
     678             :                           lone_keyword_l_val=.TRUE., &
     679             :                           default_l_val=.FALSE., &
     680       61447 :                           usage="GMIX_P")
     681       61447 :       CALL section_add_keyword(section, keyword)
     682       61447 :       CALL keyword_release(keyword)
     683             : 
     684       61447 :    END SUBROUTINE create_mixing_section
     685             : 
     686           0 : END MODULE qs_density_mixing_types

Generated by: LCOV version 1.15