LCOV - code coverage report
Current view: top level - src - ec_env_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:cccd2f3) Lines: 94.4 % 90 85
Test Date: 2026-05-06 07:07:47 Functions: 75.0 % 4 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 Types needed for a for a Energy Correction
      10              : !> \par History
      11              : !>       2019.09 created
      12              : !> \author JGH
      13              : ! **************************************************************************************************
      14              : MODULE ec_env_types
      15              :    USE cp_dbcsr_api,                    ONLY: dbcsr_p_type
      16              :    USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
      17              :    USE cp_fm_types,                     ONLY: cp_fm_release,&
      18              :                                               cp_fm_type
      19              :    USE dm_ls_scf_types,                 ONLY: ls_scf_env_type,&
      20              :                                               ls_scf_release
      21              :    USE hfx_types,                       ONLY: hfx_release,&
      22              :                                               hfx_type
      23              :    USE input_section_types,             ONLY: section_vals_release,&
      24              :                                               section_vals_type
      25              :    USE kinds,                           ONLY: dp
      26              :    USE kpoint_types,                    ONLY: kpoint_release,&
      27              :                                               kpoint_type
      28              :    USE pw_types,                        ONLY: pw_r3d_rs_type
      29              :    USE qs_dispersion_types,             ONLY: qs_dispersion_release,&
      30              :                                               qs_dispersion_type
      31              :    USE qs_force_types,                  ONLY: deallocate_qs_force,&
      32              :                                               qs_force_type
      33              :    USE qs_local_rho_types,              ONLY: local_rho_set_release,&
      34              :                                               local_rho_type
      35              :    USE qs_neighbor_list_types,          ONLY: neighbor_list_set_p_type,&
      36              :                                               release_neighbor_list_sets
      37              :    USE qs_oce_types,                    ONLY: deallocate_oce_set,&
      38              :                                               oce_matrix_type
      39              :    USE qs_p_env_types,                  ONLY: p_env_release,&
      40              :                                               qs_p_env_type
      41              :    USE qs_period_efield_types,          ONLY: efield_berry_release,&
      42              :                                               efield_berry_type
      43              :    USE scf_control_types,               ONLY: smear_type
      44              :    USE task_list_types,                 ONLY: deallocate_task_list,&
      45              :                                               task_list_type
      46              : #include "./base/base_uses.f90"
      47              : 
      48              :    IMPLICIT NONE
      49              : 
      50              :    PRIVATE
      51              : 
      52              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ec_env_types'
      53              : 
      54              :    PUBLIC :: energy_correction_type, ec_env_release
      55              :    PUBLIC :: ec_env_matrix_release, ec_env_potential_release
      56              : 
      57              : ! *****************************************************************************
      58              : !> \brief Contains information on the energy correction functional for KG
      59              : !> \par History
      60              : !>       03.2014 created
      61              : !> \author JGH
      62              : ! *****************************************************************************
      63              :    TYPE energy_correction_type
      64              :       CHARACTER(len=20)                                :: ec_name = ""
      65              :       INTEGER                                          :: energy_functional = 0
      66              :       INTEGER                                          :: ks_solver = 0
      67              :       INTEGER                                          :: factorization = 0
      68              :       INTEGER                                          :: ec_initial_guess = 0
      69              :       REAL(KIND=dp)                                    :: eps_default = 0.0_dp
      70              :       LOGICAL                                          :: do_ec_admm = .FALSE.
      71              :       LOGICAL                                          :: do_ec_hfx = .FALSE.
      72              :       LOGICAL                                          :: should_update = .FALSE.
      73              :       LOGICAL                                          :: use_ls_solver = .FALSE.
      74              :       LOGICAL                                          :: reuse_hfx = .FALSE.
      75              :       LOGICAL                                          :: basis_inconsistent = .FALSE.
      76              :       !
      77              :       LOGICAL                                          :: write_harris_wfn = .FALSE.
      78              :       ! debug
      79              :       LOGICAL                                          :: debug_forces = .FALSE.
      80              :       LOGICAL                                          :: debug_stress = .FALSE.
      81              :       LOGICAL                                          :: debug_external = .FALSE.
      82              :       REAL(KIND=dp)                                    :: orbrot_index = 0.0_dp
      83              :       REAL(KIND=dp)                                    :: phase_index = 0.0_dp
      84              :       ! basis set
      85              :       CHARACTER(len=20)                                :: basis = ""
      86              :       LOGICAL                                          :: mao = .FALSE.
      87              :       ! Skip EC calculation if ground-state didnt converge
      88              :       LOGICAL                                          :: do_skip = .FALSE., skip_ec = .FALSE.
      89              :       ! MAO basis
      90              :       INTEGER                                          :: mao_max_iter = 0
      91              :       REAL(KIND=dp)                                    :: mao_eps_grad = 0.0_dp
      92              :       REAL(KIND=dp)                                    :: mao_eps1 = 0.0_dp
      93              :       INTEGER                                          :: mao_iolevel = 0
      94              :       !
      95              :       TYPE(smear_type)                                 :: smear
      96              :       ! energy components
      97              :       REAL(KIND=dp)                                    :: etotal = 0.0_dp, old_etotal = 0.0_dp
      98              :       REAL(KIND=dp)                                    :: eband = 0.0_dp, ecore = 0.0_dp, exc = 0.0_dp, &
      99              :                                                           ehartree = 0.0_dp, vhxc = 0.0_dp
     100              :       REAL(KIND=dp)                                    :: edispersion = 0.0_dp, efield_elec = 0.0_dp, &
     101              :                                                           efield_nuclear = 0.0_dp, ex = 0.0_dp, exc_aux_fit = 0.0_dp
     102              :       REAL(KIND=dp)                                    :: exc1 = 0.0_dp, exc1_aux_fit = 0.0_dp, ehartree_1c = 0.0_dp
     103              :       REAL(KIND=dp)                                    :: ekTS = 0.0_dp
     104              :       ! forces
     105              :       TYPE(qs_force_type), DIMENSION(:), POINTER       :: force => Null()
     106              :       ! full neighbor lists and corresponding task list
     107              :       TYPE(neighbor_list_set_p_type), &
     108              :          DIMENSION(:), POINTER                         :: sab_orb => Null(), sac_ppl => Null(), &
     109              :                                                           sac_ae => Null(), sap_ppnl => Null(), &
     110              :                                                           sab_kp => Null(), sab_kp_nosym => Null(), &
     111              :                                                           sap_oce => Null()
     112              :       TYPE(task_list_type), POINTER                    :: task_list => Null()
     113              :       TYPE(task_list_type), POINTER                    :: task_list_soft => Null()
     114              :       ! the XC function to be used for the correction, dispersion info
     115              :       TYPE(section_vals_type), POINTER                 :: xc_section => Null()
     116              :       TYPE(qs_dispersion_type), POINTER                :: dispersion_env => Null()
     117              :       ! kpoint information
     118              :       LOGICAL                                          :: do_kpoints = .FALSE.
     119              :       TYPE(kpoint_type), POINTER                       :: kpoints => Null()
     120              :       ! matrices in complete basis
     121              :       ! KS: Kohn-Sham; H: Core; S: overlap; T: kinetic energy;
     122              :       ! P: Harris density, W: Harris energy weighted density
     123              :       TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER     :: matrix_ks => Null(), &
     124              :                                                           matrix_h => Null(), &
     125              :                                                           matrix_s => Null(), &
     126              :                                                           matrix_t => Null(), &
     127              :                                                           matrix_p => Null(), &
     128              :                                                           matrix_w => Null()
     129              :       ! GAPW
     130              :       TYPE(local_rho_type), POINTER                    :: local_rho_set => NULL()
     131              :       TYPE(local_rho_type), POINTER                    :: local_rho_set_admm => NULL()
     132              :       TYPE(oce_matrix_type), POINTER                   :: oce => NULL()
     133              :       ! reduce basis
     134              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER        :: mao_coef => Null()
     135              :       ! external energy calclulation
     136              :       TYPE(cp_fm_type), DIMENSION(:), POINTER          :: mo_occ => NULL()
     137              :       TYPE(cp_fm_type), DIMENSION(:), POINTER          :: cpmos => NULL()
     138              :       ! CP equations
     139              :       TYPE(qs_p_env_type), POINTER                     :: p_env => Null()
     140              :       TYPE(dbcsr_p_type), DIMENSION(:), POINTER        :: matrix_hz => Null(), matrix_wz => Null(), &
     141              :                                                           matrix_z => Null(), z_admm => Null()
     142              :       ! Harris (rhoout), and response density (rhoz) on grid
     143              :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER      :: rhoout_r => Null(), &
     144              :                                                           rhoz_r => Null()
     145              :       ! potentials from input density
     146              :       TYPE(pw_r3d_rs_type)                             :: vh_rspace = pw_r3d_rs_type()
     147              :       TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER      :: vxc_rspace => Null(), &
     148              :                                                           vtau_rspace => Null(), &
     149              :                                                           vadmm_rspace => Null(), &
     150              :                                                           vadmm_tau_rspace => Null()
     151              :       ! efield
     152              :       TYPE(efield_berry_type), POINTER                 :: efield => NULL()
     153              :       ! LS matrices and types
     154              :       TYPE(ls_scf_env_type), POINTER                   :: ls_env => Null()
     155              :       ! Environment for Hartree-Fock exchange
     156              :       TYPE(hfx_type), DIMENSION(:, :), POINTER         :: x_data => Null()
     157              :       ! ADMM XC environments
     158              :       TYPE(section_vals_type), POINTER                 :: xc_section_primary => Null(), &
     159              :                                                           xc_section_aux => Null()
     160              :       ! External
     161              :       CHARACTER(len=40)                                :: exresp_fn = ""
     162              :       CHARACTER(len=40)                                :: exresperr_fn = ""
     163              :       CHARACTER(len=40)                                :: exresult_fn = ""
     164              :       LOGICAL                                          :: do_error = .FALSE.
     165              :       CHARACTER(len=1)                                 :: error_method = "E"
     166              :       REAL(KIND=dp)                                    :: error_cutoff = 0.0_dp
     167              :       INTEGER                                          :: error_subspace = 0
     168              :       REAL(KIND=dp), DIMENSION(3, 3)                   :: rpv = 0.0_dp
     169              :       REAL(KIND=dp), DIMENSION(:, :), POINTER          :: rf => NULL()
     170              :       TYPE(cp_fm_type), DIMENSION(:), POINTER          :: cpref => NULL()
     171              :    END TYPE energy_correction_type
     172              : 
     173              : CONTAINS
     174              : 
     175              : ! **************************************************************************************************
     176              : !> \brief ...
     177              : !> \param ec_env ...
     178              : ! **************************************************************************************************
     179         7970 :    SUBROUTINE ec_env_release(ec_env)
     180              :       TYPE(energy_correction_type), POINTER              :: ec_env
     181              : 
     182              :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'ec_env_release'
     183              : 
     184              :       INTEGER                                            :: handle
     185              : 
     186         7970 :       CALL timeset(routineN, handle)
     187              : 
     188         7970 :       IF (ASSOCIATED(ec_env)) THEN
     189              :          ! neighbor lists
     190         7970 :          CALL release_neighbor_list_sets(ec_env%sab_orb)
     191         7970 :          CALL release_neighbor_list_sets(ec_env%sac_ppl)
     192         7970 :          CALL release_neighbor_list_sets(ec_env%sac_ae)
     193         7970 :          CALL release_neighbor_list_sets(ec_env%sap_ppnl)
     194         7970 :          CALL release_neighbor_list_sets(ec_env%sab_kp)
     195         7970 :          CALL release_neighbor_list_sets(ec_env%sab_kp_nosym)
     196         7970 :          CALL release_neighbor_list_sets(ec_env%sap_oce)
     197              :          ! forces
     198         7970 :          IF (ASSOCIATED(ec_env%force)) CALL deallocate_qs_force(ec_env%force)
     199              :          ! operator matrices
     200         7970 :          IF (ASSOCIATED(ec_env%matrix_ks)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_ks)
     201         7970 :          IF (ASSOCIATED(ec_env%matrix_h)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_h)
     202         7970 :          IF (ASSOCIATED(ec_env%matrix_s)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_s)
     203         7970 :          IF (ASSOCIATED(ec_env%matrix_t)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_t)
     204         7970 :          IF (ASSOCIATED(ec_env%matrix_p)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_p)
     205         7970 :          IF (ASSOCIATED(ec_env%matrix_w)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_w)
     206              :          ! GAPW
     207         7970 :          IF (ASSOCIATED(ec_env%oce)) CALL deallocate_oce_set(ec_env%oce)
     208              :          ! task lists for collocate/integrate
     209         7970 :          IF (ASSOCIATED(ec_env%task_list)) THEN
     210          298 :             CALL deallocate_task_list(ec_env%task_list)
     211              :          END IF
     212         7970 :          IF (ASSOCIATED(ec_env%task_list_soft)) THEN
     213           50 :             CALL deallocate_task_list(ec_env%task_list_soft)
     214              :          END IF
     215              :          ! reduced basis
     216         7970 :          IF (ASSOCIATED(ec_env%mao_coef)) CALL dbcsr_deallocate_matrix_set(ec_env%mao_coef)
     217              :          ! dispersion environment
     218         7970 :          IF (ASSOCIATED(ec_env%dispersion_env)) THEN
     219          298 :             CALL qs_dispersion_release(ec_env%dispersion_env)
     220              :          END IF
     221              : 
     222         7970 :          CALL ec_env_matrix_release(ec_env)
     223              : 
     224              :          ! kpoints
     225         7970 :          CALL kpoint_release(ec_env%kpoints)
     226              : 
     227         7970 :          IF (ASSOCIATED(ec_env%p_env)) THEN
     228          274 :             CALL p_env_release(ec_env%p_env)
     229          274 :             DEALLOCATE (ec_env%p_env)
     230              :          END IF
     231              :          ! potential
     232         7970 :          CALL ec_env_potential_release(ec_env)
     233              :          !
     234         7970 :          CALL efield_berry_release(ec_env%efield)
     235              : 
     236         7970 :          IF (ASSOCIATED(ec_env%ls_env)) THEN
     237           22 :             CALL ls_scf_release(ec_env%ls_env)
     238              :          END IF
     239              : 
     240         7970 :          IF (.NOT. ec_env%reuse_hfx) THEN
     241         7954 :             IF (ASSOCIATED(ec_env%x_data)) CALL hfx_release(ec_env%x_data)
     242              :          END IF
     243              : 
     244         7970 :          IF (ASSOCIATED(ec_env%xc_section_aux)) CALL section_vals_release(ec_env%xc_section_aux)
     245         7970 :          IF (ASSOCIATED(ec_env%xc_section_primary)) CALL section_vals_release(ec_env%xc_section_primary)
     246              : 
     247         7970 :          CALL cp_fm_release(ec_env%mo_occ)
     248         7970 :          CALL cp_fm_release(ec_env%cpmos)
     249         7970 :          CALL cp_fm_release(ec_env%cpref)
     250              : 
     251         7970 :          IF (ASSOCIATED(ec_env%rf)) THEN
     252           16 :             DEALLOCATE (ec_env%rf)
     253              :          END IF
     254              : 
     255         7970 :          DEALLOCATE (ec_env)
     256              : 
     257              :       END IF
     258              : 
     259         7970 :       NULLIFY (ec_env)
     260              : 
     261         7970 :       CALL timestop(handle)
     262              : 
     263         7970 :    END SUBROUTINE ec_env_release
     264              : 
     265              : ! **************************************************************************************************
     266              : !> \brief ...
     267              : !> \param ec_env ...
     268              : ! **************************************************************************************************
     269         7970 :    SUBROUTINE ec_env_matrix_release(ec_env)
     270              :       TYPE(energy_correction_type), POINTER              :: ec_env
     271              : 
     272         7970 :       IF (ASSOCIATED(ec_env)) THEN
     273         7970 :          IF (ASSOCIATED(ec_env%matrix_hz)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_hz)
     274         7970 :          NULLIFY (ec_env%matrix_hz)
     275         7970 :          IF (ASSOCIATED(ec_env%matrix_wz)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_wz)
     276         7970 :          NULLIFY (ec_env%matrix_wz)
     277         7970 :          IF (ASSOCIATED(ec_env%matrix_z)) CALL dbcsr_deallocate_matrix_set(ec_env%matrix_z)
     278         7970 :          NULLIFY (ec_env%matrix_z)
     279         7970 :          IF (ASSOCIATED(ec_env%z_admm)) CALL dbcsr_deallocate_matrix_set(ec_env%z_admm)
     280         7970 :          NULLIFY (ec_env%z_admm)
     281              :       END IF
     282              : 
     283         7970 :    END SUBROUTINE ec_env_matrix_release
     284              : 
     285              : ! **************************************************************************************************
     286              : !> \brief ...
     287              : !> \param ec_env ...
     288              : ! **************************************************************************************************
     289         8666 :    SUBROUTINE ec_env_potential_release(ec_env)
     290              :       TYPE(energy_correction_type), POINTER              :: ec_env
     291              : 
     292              :       INTEGER                                            :: iab
     293              : 
     294         8666 :       IF (ASSOCIATED(ec_env)) THEN
     295         8666 :          IF (ASSOCIATED(ec_env%vh_rspace%pw_grid)) THEN
     296          696 :             CALL ec_env%vh_rspace%release()
     297              :          END IF
     298         8666 :          IF (ASSOCIATED(ec_env%vxc_rspace)) THEN
     299         1398 :             DO iab = 1, SIZE(ec_env%vxc_rspace)
     300         1398 :                CALL ec_env%vxc_rspace(iab)%release()
     301              :             END DO
     302          696 :             DEALLOCATE (ec_env%vxc_rspace)
     303          696 :             NULLIFY (ec_env%vxc_rspace)
     304              :          END IF
     305         8666 :          IF (ASSOCIATED(ec_env%vtau_rspace)) THEN
     306           64 :             DO iab = 1, SIZE(ec_env%vtau_rspace)
     307           64 :                CALL ec_env%vtau_rspace(iab)%release()
     308              :             END DO
     309           32 :             DEALLOCATE (ec_env%vtau_rspace)
     310           32 :             NULLIFY (ec_env%vtau_rspace)
     311              :          END IF
     312         8666 :          IF (ASSOCIATED(ec_env%vadmm_rspace)) THEN
     313          124 :             DO iab = 1, SIZE(ec_env%vadmm_rspace)
     314          124 :                CALL ec_env%vadmm_rspace(iab)%release()
     315              :             END DO
     316           62 :             DEALLOCATE (ec_env%vadmm_rspace)
     317           62 :             NULLIFY (ec_env%vadmm_rspace)
     318              :          END IF
     319         8666 :          IF (ASSOCIATED(ec_env%vadmm_tau_rspace)) THEN
     320            0 :             DO iab = 1, SIZE(ec_env%vadmm_tau_rspace)
     321            0 :                CALL ec_env%vadmm_tau_rspace(iab)%release()
     322              :             END DO
     323            0 :             DEALLOCATE (ec_env%vadmm_tau_rspace)
     324            0 :             NULLIFY (ec_env%vadmm_tau_rspace)
     325              :          END IF
     326         8666 :          IF (ASSOCIATED(ec_env%local_rho_set)) THEN
     327          146 :             CALL local_rho_set_release(ec_env%local_rho_set)
     328          146 :             NULLIFY (ec_env%local_rho_set)
     329              :          END IF
     330         8666 :          IF (ASSOCIATED(ec_env%local_rho_set_admm)) THEN
     331           30 :             CALL local_rho_set_release(ec_env%local_rho_set_admm)
     332           30 :             NULLIFY (ec_env%local_rho_set_admm)
     333              :          END IF
     334              :       END IF
     335              : 
     336         8666 :    END SUBROUTINE ec_env_potential_release
     337              : 
     338            0 : END MODULE ec_env_types
        

Generated by: LCOV version 2.0-1