LCOV - code coverage report
Current view: top level - src - qs_scf_subspace_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:9ccafda) Lines: 97.8 % 46 45
Test Date: 2026-10-15 00:55:44 Functions: 60.0 % 5 3

            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              : !> \brief Data types for the ADIIS SCF subspace accelerator.
      10              : ! **************************************************************************************************
      11              : MODULE qs_scf_subspace_types
      12              : 
      13              :    USE cp_dbcsr_api,                    ONLY: dbcsr_deallocate_matrix,&
      14              :                                               dbcsr_p_type
      15              :    USE kinds,                           ONLY: dp
      16              : #include "./base/base_uses.f90"
      17              : 
      18              :    IMPLICIT NONE
      19              : 
      20              :    PRIVATE
      21              : 
      22              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_scf_subspace_types'
      23              : 
      24              :    PUBLIC :: qs_scf_subspace_buffer_type, &
      25              :              qs_scf_subspace_buffer_clear, &
      26              :              qs_scf_subspace_buffer_create, &
      27              :              qs_scf_subspace_buffer_release
      28              : 
      29              : ! **************************************************************************************************
      30              : !> \brief History buffer holding strictly paired P and F[P] SCF states.
      31              : !>
      32              : !>      Matrix history is stored in the real-space cell representation.  This is
      33              : !>      the representation of the density that actually built the current KS
      34              : !>      matrix, and therefore applies to both Gamma-point and k-point runs.
      35              : ! **************************************************************************************************
      36              :    TYPE qs_scf_subspace_buffer_type
      37              :       INTEGER                                           :: nbuffer = 0
      38              :       INTEGER                                           :: ncall = 0
      39              :       INTEGER                                           :: nstored = 0
      40              :       INTEGER                                           :: last_status = 0
      41              :       LOGICAL                                           :: last_restart = .FALSE.
      42              :       LOGICAL                                           :: use_combined_fock = .FALSE.
      43              :       REAL(KIND=dp)                                     :: last_objective = 0.0_dp
      44              :       ! Total coefficient weight assigned to all entries older than the current raw Fock.
      45              :       REAL(KIND=dp)                                     :: last_old_fock_weight = 0.0_dp
      46              :       REAL(KIND=dp)                                     :: diis_weight = 0.0_dp
      47              :       TYPE(dbcsr_p_type), DIMENSION(:, :, :), POINTER   :: density => NULL()
      48              :       TYPE(dbcsr_p_type), DIMENSION(:, :, :), POINTER   :: fock => NULL()
      49              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER      :: combined_fock => NULL()
      50              :       INTEGER, DIMENSION(:), ALLOCATABLE                 :: generation
      51              :       REAL(KIND=dp), DIMENSION(:, :), ALLOCATABLE       :: pf_metric
      52              :       REAL(KIND=dp), DIMENSION(:), ALLOCATABLE          :: coefficients, state_energy
      53              :       ! Replicated conjugate variables for a separately represented operator term.
      54              :       REAL(dp), ALLOCATABLE :: density_aux(:, :, :), fock_aux(:, :, :), combined_aux(:, :)
      55              :    END TYPE qs_scf_subspace_buffer_type
      56              : 
      57              : CONTAINS
      58              : 
      59              : ! **************************************************************************************************
      60              : !> \brief Initialize SCF subspace history metadata.
      61              : !> \param buffer Buffer to initialize.
      62              : !> \param nbuffer Maximum number of paired history entries.
      63              : ! **************************************************************************************************
      64           24 :    PURE SUBROUTINE qs_scf_subspace_buffer_create(buffer, nbuffer)
      65              : 
      66              :       TYPE(qs_scf_subspace_buffer_type), INTENT(OUT)     :: buffer
      67              :       INTEGER, INTENT(IN)                                :: nbuffer
      68              : 
      69           24 :       buffer%nbuffer = MAX(nbuffer, 0)
      70              :       buffer%ncall = 0
      71              :       buffer%nstored = 0
      72              :       buffer%last_status = 0
      73              :       buffer%last_restart = .FALSE.
      74              :       buffer%use_combined_fock = .FALSE.
      75              :       buffer%last_objective = 0.0_dp
      76              :       buffer%last_old_fock_weight = 0.0_dp
      77              :       buffer%diis_weight = 0.0_dp
      78              :       NULLIFY (buffer%density, buffer%fock, buffer%combined_fock)
      79              : 
      80           24 :    END SUBROUTINE qs_scf_subspace_buffer_create
      81              : 
      82              : ! **************************************************************************************************
      83              : !> \brief Clear logical history while retaining allocated matrix storage.
      84              : !> \param buffer Buffer to clear.
      85              : ! **************************************************************************************************
      86           12 :    PURE SUBROUTINE qs_scf_subspace_buffer_clear(buffer)
      87              : 
      88              :       TYPE(qs_scf_subspace_buffer_type), INTENT(INOUT)   :: buffer
      89              : 
      90           12 :       buffer%ncall = 0
      91           12 :       buffer%nstored = 0
      92           12 :       buffer%last_status = 0
      93           12 :       buffer%last_restart = .FALSE.
      94           12 :       buffer%use_combined_fock = .FALSE.
      95           12 :       buffer%last_objective = 0.0_dp
      96           12 :       buffer%last_old_fock_weight = 0.0_dp
      97           12 :       buffer%diis_weight = 0.0_dp
      98           12 :       IF (ALLOCATED(buffer%generation)) buffer%generation = 0
      99           12 :       IF (ALLOCATED(buffer%pf_metric)) buffer%pf_metric = 0.0_dp
     100           12 :       IF (ALLOCATED(buffer%coefficients)) buffer%coefficients = 0.0_dp
     101           12 :       IF (ALLOCATED(buffer%state_energy)) buffer%state_energy = HUGE(1.0_dp)
     102              : 
     103           12 :    END SUBROUTINE qs_scf_subspace_buffer_clear
     104              : 
     105              : ! **************************************************************************************************
     106              : !> \brief Release all matrices and scalar storage owned by a subspace buffer.
     107              : !> \param buffer Buffer to release.
     108              : ! **************************************************************************************************
     109           12 :    SUBROUTINE qs_scf_subspace_buffer_release(buffer)
     110              : 
     111              :       TYPE(qs_scf_subspace_buffer_type), INTENT(INOUT)   :: buffer
     112              : 
     113              :       INTEGER                                            :: icell, islot, ispin
     114              : 
     115           12 :       IF (ASSOCIATED(buffer%density)) THEN
     116          566 :          DO icell = 1, SIZE(buffer%density, 3)
     117         1602 :             DO ispin = 1, SIZE(buffer%density, 2)
     118        18166 :                DO islot = 1, SIZE(buffer%density, 1)
     119        17612 :                   IF (ASSOCIATED(buffer%density(islot, ispin, icell)%matrix)) THEN
     120        16576 :                      CALL dbcsr_deallocate_matrix(buffer%density(islot, ispin, icell)%matrix)
     121              :                   END IF
     122              :                END DO
     123              :             END DO
     124              :          END DO
     125           12 :          DEALLOCATE (buffer%density)
     126              :       END IF
     127              : 
     128           12 :       IF (ASSOCIATED(buffer%fock)) THEN
     129          566 :          DO icell = 1, SIZE(buffer%fock, 3)
     130         1602 :             DO ispin = 1, SIZE(buffer%fock, 2)
     131        18166 :                DO islot = 1, SIZE(buffer%fock, 1)
     132        17612 :                   IF (ASSOCIATED(buffer%fock(islot, ispin, icell)%matrix)) THEN
     133        16576 :                      CALL dbcsr_deallocate_matrix(buffer%fock(islot, ispin, icell)%matrix)
     134              :                   END IF
     135              :                END DO
     136              :             END DO
     137              :          END DO
     138           12 :          DEALLOCATE (buffer%fock)
     139              :       END IF
     140              : 
     141           12 :       IF (ASSOCIATED(buffer%combined_fock)) THEN
     142          566 :          DO icell = 1, SIZE(buffer%combined_fock, 2)
     143         1602 :             DO ispin = 1, SIZE(buffer%combined_fock, 1)
     144         1590 :                IF (ASSOCIATED(buffer%combined_fock(ispin, icell)%matrix)) THEN
     145         1036 :                   CALL dbcsr_deallocate_matrix(buffer%combined_fock(ispin, icell)%matrix)
     146              :                END IF
     147              :             END DO
     148              :          END DO
     149           12 :          DEALLOCATE (buffer%combined_fock)
     150              :       END IF
     151              : 
     152           12 :       IF (ALLOCATED(buffer%generation)) DEALLOCATE (buffer%generation)
     153           12 :       IF (ALLOCATED(buffer%pf_metric)) DEALLOCATE (buffer%pf_metric)
     154           12 :       IF (ALLOCATED(buffer%coefficients)) DEALLOCATE (buffer%coefficients)
     155           12 :       IF (ALLOCATED(buffer%state_energy)) DEALLOCATE (buffer%state_energy)
     156           12 :       IF (ALLOCATED(buffer%density_aux)) DEALLOCATE (buffer%density_aux, buffer%fock_aux, buffer%combined_aux)
     157           12 :       CALL qs_scf_subspace_buffer_create(buffer, 0)
     158              : 
     159           12 :    END SUBROUTINE qs_scf_subspace_buffer_release
     160              : 
     161            0 : END MODULE qs_scf_subspace_types
        

Generated by: LCOV version 2.0-1