LCOV - code coverage report
Current view: top level - src - qs_wf_history_types.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:2fce0f8) Lines: 37 39 94.9 %
Date: 2024-12-21 06:28:57 Functions: 4 8 50.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 interpolate the wavefunctions to speed up the convergence when
      10             : !>      doing MD
      11             : !> \par History
      12             : !>      12.2002 created [fawzi]
      13             : !>      02.2005 wf_mol added [MI]
      14             : !> \author fawzi
      15             : ! **************************************************************************************************
      16             : MODULE qs_wf_history_types
      17             :    USE cp_dbcsr_api,                    ONLY: dbcsr_deallocate_matrix,&
      18             :                                               dbcsr_p_type,&
      19             :                                               dbcsr_type
      20             :    USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
      21             :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      22             :                                               cp_fm_type
      23             :    USE kinds,                           ONLY: dp
      24             :    USE pw_types,                        ONLY: pw_c1d_gs_type,&
      25             :                                               pw_r3d_rs_type
      26             :    USE qs_rho_types,                    ONLY: qs_rho_release,&
      27             :                                               qs_rho_type
      28             : #include "./base/base_uses.f90"
      29             : 
      30             :    IMPLICIT NONE
      31             :    PRIVATE
      32             : 
      33             :    LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
      34             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_wf_history_types'
      35             : 
      36             :    PUBLIC :: qs_wf_snapshot_type, &
      37             :              qs_wf_history_type, qs_wf_history_p_type
      38             :    PUBLIC :: wfi_retain, wfi_release, wfi_get_snapshot
      39             : 
      40             : ! **************************************************************************************************
      41             : !> \brief represent a past snapshot of the wavefunction.
      42             : !>      some elements might not be associated (to spare memory)
      43             : !>      depending on how the snapshot was taken
      44             : !> \param wf the wavefunctions
      45             : !> \param rho_r the density in r space
      46             : !> \param rho_g the density in g space
      47             : !> \param rho_ao the density in ao space
      48             : !> \param overlap the overlap matrix
      49             : !> \param rho_frozen the frozen density structure
      50             : !> \param dt the time of the snapshot (wrf to te previous snapshot!)
      51             : !> \note
      52             : !>      keep track also of occupation numbers and energies?
      53             : !> \par History
      54             : !>      02.2003 created [fawzi]
      55             : !>      02.2005 wf_mol added [MI]
      56             : !> \author fawzi
      57             : ! **************************************************************************************************
      58             :    TYPE qs_wf_snapshot_type
      59             :       TYPE(cp_fm_type), DIMENSION(:), POINTER :: wf => NULL()
      60             :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r => NULL()
      61             :       TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g => NULL()
      62             :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho_ao => NULL()
      63             :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao_kp => NULL()
      64             :       TYPE(dbcsr_type), POINTER :: overlap => NULL()
      65             :       TYPE(qs_rho_type), POINTER :: rho_frozen => NULL()
      66             :       REAL(KIND=dp) :: dt = 0.0_dp
      67             :    END TYPE qs_wf_snapshot_type
      68             : 
      69             : ! **************************************************************************************************
      70             : !> \brief pointer to a snapshot
      71             : !> \param snapshot the pointer to the snapshot
      72             : !> \par History
      73             : !>      02.2003 created [fawzi]
      74             : !> \author fawzi
      75             : ! **************************************************************************************************
      76             :    TYPE qs_wf_snapshot_p_type
      77             :       TYPE(qs_wf_snapshot_type), POINTER :: snapshot => NULL()
      78             :    END TYPE qs_wf_snapshot_p_type
      79             : 
      80             : ! **************************************************************************************************
      81             : !> \brief keeps track of the previous wavefunctions and can extrapolate them
      82             : !>      for the next step of md
      83             : !> \param ref_cont reference count (see doc/ReferenceCounting.html)
      84             : !> \param memory_depth how many snapshots should be stored
      85             : !> \param last_state_index index of the latest snapshot
      86             : !> \param past_states array with the past states (index starts at
      87             : !>        last_state_index)
      88             : !> \param interpolation_method_nr the tag of the method used to
      89             : !>        extrapolate the new start state for qs
      90             : !> \param snapshot_count number of snapshot taken so far (cumulative,
      91             : !>        can be bigger than the history depth)
      92             : !> \note
      93             : !>      use a linked list for the past states ?
      94             : !> \par History
      95             : !>      02.2003 created [fawzi]
      96             : !> \author fawzi
      97             : ! **************************************************************************************************
      98             :    TYPE qs_wf_history_type
      99             :       INTEGER :: ref_count = -1, memory_depth = -1, last_state_index = -1, &
     100             :                  interpolation_method_nr = -1, snapshot_count = -1
     101             :       LOGICAL :: store_wf = .FALSE., store_rho_r = .FALSE., store_rho_g = .FALSE., &
     102             :                  store_rho_ao = .FALSE., store_rho_ao_kp = .FALSE., &
     103             :                  store_overlap = .FALSE., store_frozen_density = .FALSE.
     104             :       TYPE(qs_wf_snapshot_p_type), DIMENSION(:), POINTER :: past_states => NULL()
     105             :    END TYPE qs_wf_history_type
     106             : 
     107             : ! **************************************************************************************************
     108             : !> \brief to create arrays of pointers to qs_wf_history_type
     109             : !> \param wf_hist the pointer to the wf history
     110             : !> \author fawzi
     111             : ! **************************************************************************************************
     112             :    TYPE qs_wf_history_p_type
     113             :       TYPE(qs_wf_history_type), POINTER :: wf_history => NULL()
     114             :    END TYPE qs_wf_history_p_type
     115             : 
     116             : CONTAINS
     117             : 
     118             : ! **************************************************************************************************
     119             : !> \brief releases a snapshot of a wavefunction (see doc/ReferenceCounting.html)
     120             : !> \param snapshot the snapshot to release
     121             : !> \par History
     122             : !>      02.2003 created [fawzi]
     123             : !>      02.2005 wf_mol added [MI]
     124             : !> \author fawzi
     125             : ! **************************************************************************************************
     126       10224 :    SUBROUTINE wfs_release(snapshot)
     127             :       TYPE(qs_wf_snapshot_type), INTENT(INOUT)           :: snapshot
     128             : 
     129       10224 :       CALL cp_fm_release(snapshot%wf)
     130             :       ! snapshot%rho_r & snapshot%rho_g is deallocated in wfs_update
     131             :       ! of qs_wf_history_methods, in case you wonder about it.
     132       10224 :       IF (ASSOCIATED(snapshot%rho_ao)) THEN
     133          68 :          CALL dbcsr_deallocate_matrix_set(snapshot%rho_ao)
     134             :       END IF
     135       10224 :       IF (ASSOCIATED(snapshot%rho_ao_kp)) THEN
     136           6 :          CALL dbcsr_deallocate_matrix_set(snapshot%rho_ao_kp)
     137             :       END IF
     138       10224 :       IF (ASSOCIATED(snapshot%overlap)) THEN
     139        9122 :          CALL dbcsr_deallocate_matrix(snapshot%overlap)
     140             :       END IF
     141       10224 :       IF (ASSOCIATED(snapshot%rho_frozen)) THEN
     142           4 :          CALL qs_rho_release(snapshot%rho_frozen)
     143           4 :          DEALLOCATE (snapshot%rho_frozen)
     144             :       END IF
     145             : 
     146       10224 :    END SUBROUTINE wfs_release
     147             : 
     148             : ! **************************************************************************************************
     149             : !> \brief retains a wf history (see doc/ReferenceCounting.html)
     150             : !> \param wf_history the wf_history to retain
     151             : !> \par History
     152             : !>      02.2003 created [fawzi]
     153             : !> \author fawzi
     154             : ! **************************************************************************************************
     155        7736 :    SUBROUTINE wfi_retain(wf_history)
     156             :       TYPE(qs_wf_history_type), POINTER                  :: wf_history
     157             : 
     158        7736 :       CPASSERT(ASSOCIATED(wf_history))
     159        7736 :       wf_history%ref_count = wf_history%ref_count + 1
     160             : 
     161        7736 :    END SUBROUTINE wfi_retain
     162             : 
     163             : ! **************************************************************************************************
     164             : !> \brief releases a wf_history of a wavefunction
     165             : !>      (see doc/ReferenceCounting.html)
     166             : !> \param wf_history the wf_history to release
     167             : !> \par History
     168             : !>      02.2003 created [fawzi]
     169             : !> \author fawzi
     170             : ! **************************************************************************************************
     171       22419 :    SUBROUTINE wfi_release(wf_history)
     172             :       TYPE(qs_wf_history_type), POINTER                  :: wf_history
     173             : 
     174             :       INTEGER                                            :: i
     175             : 
     176       22419 :       IF (ASSOCIATED(wf_history)) THEN
     177       15076 :          CPASSERT(wf_history%ref_count > 0)
     178       15076 :          wf_history%ref_count = wf_history%ref_count - 1
     179       15076 :          IF (wf_history%ref_count == 0) THEN
     180        7340 :             IF (ASSOCIATED(wf_history%past_states)) THEN
     181       42013 :                DO i = 1, SIZE(wf_history%past_states)
     182       42013 :                   IF (ASSOCIATED(wf_history%past_states(i)%snapshot)) THEN
     183       10224 :                      CALL wfs_release(wf_history%past_states(i)%snapshot)
     184       10224 :                      DEALLOCATE (wf_history%past_states(i)%snapshot)
     185             :                   END IF
     186             :                END DO
     187        7340 :                DEALLOCATE (wf_history%past_states)
     188             :             END IF
     189        7340 :             DEALLOCATE (wf_history)
     190             :          END IF
     191             :       END IF
     192       22419 :       NULLIFY (wf_history)
     193       22419 :    END SUBROUTINE wfi_release
     194             : 
     195             : ! **************************************************************************************************
     196             : !> \brief returns a snapshot, the first being the latest snapshot
     197             : !> \param wf_history the plage where to get the snapshot
     198             : !> \param wf_index the index of the snapshot you want
     199             : !> \return ...
     200             : !> \par History
     201             : !>      12.2002 created [fawzi]
     202             : !> \author fawzi
     203             : ! **************************************************************************************************
     204       45283 :    FUNCTION wfi_get_snapshot(wf_history, wf_index) RESULT(res)
     205             :       TYPE(qs_wf_history_type), POINTER                  :: wf_history
     206             :       INTEGER, INTENT(in)                                :: wf_index
     207             :       TYPE(qs_wf_snapshot_type), POINTER                 :: res
     208             : 
     209       45283 :       NULLIFY (res)
     210             : 
     211       45283 :       CPASSERT(ASSOCIATED(wf_history))
     212       45283 :       CPASSERT(ASSOCIATED(wf_history%past_states))
     213       45283 :       IF (wf_index > wf_history%memory_depth .OR. wf_index > wf_history%snapshot_count) THEN
     214           0 :          CPABORT("")
     215             :       END IF
     216             :       res => wf_history%past_states( &
     217             :              MODULO(wf_history%snapshot_count + 1 - wf_index, &
     218       45283 :                     wf_history%memory_depth) + 1)%snapshot
     219       45283 :    END FUNCTION wfi_get_snapshot
     220             : 
     221           0 : END MODULE qs_wf_history_types

Generated by: LCOV version 1.15