1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \par History
8!>      05.2004 [tlaino]
9!> \author Teodoro Laino
10! **************************************************************************************************
11MODULE qs_ks_qmmm_types
12   USE cp_dbcsr_operations,             ONLY: dbcsr_deallocate_matrix_set
13   USE cube_utils,                      ONLY: cube_info_type,&
14                                              destroy_cube_info
15   USE dbcsr_api,                       ONLY: dbcsr_p_type
16   USE kinds,                           ONLY: dp
17   USE pw_env_types,                    ONLY: pw_env_get,&
18                                              pw_env_release,&
19                                              pw_env_type
20   USE pw_pool_types,                   ONLY: pw_pool_give_back_pw,&
21                                              pw_pool_type
22   USE pw_types,                        ONLY: pw_p_type
23#include "./base/base_uses.f90"
24
25   IMPLICIT NONE
26   PRIVATE
27
28   LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
29   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ks_qmmm_types'
30
31   PUBLIC :: qs_ks_qmmm_env_type
32   PUBLIC :: qs_ks_qmmm_release, qs_ks_qmmm_retain
33
34! **************************************************************************************************
35!> \brief calculation environment to calculate the ks_qmmm matrix,
36!>      holds the QM/MM potential and all the needed variables to
37!>      compute the QM/MM electrostatic 1-electron ks matrix
38!>      assumes that the core hamiltonian and energy are up to date.
39!>      v_metal_rspace is the potential at the metal sites within the image
40!>      charge approach
41!> \par History
42!>      05.2004 created [tlaino]
43!>      01.2012 added v_metal_rspace [dgolze]
44!> \author Teodoro Laino
45! **************************************************************************************************
46   TYPE qs_ks_qmmm_env_type
47      INTEGER :: n_evals, &
48                 id_nr, ref_count
49      REAL(KIND=dp)                               :: pc_ener
50      TYPE(pw_env_type), POINTER                  :: pw_env
51      TYPE(pw_p_type)                             :: v_qmmm_rspace
52      TYPE(pw_p_type)                             :: v_metal_rspace
53      TYPE(cube_info_type), DIMENSION(:), POINTER  :: cube_info
54      TYPE(dbcsr_p_type), DIMENSION(:), &
55         POINTER                                :: matrix_h
56   END TYPE qs_ks_qmmm_env_type
57
58! **************************************************************************************************
59!> \brief type to build arrays of pointers
60!> \param ks_env the ks_env pointer
61!> \par History
62!>      05.2004 [tlaino]
63!> \author Teodoro Laino
64! **************************************************************************************************
65   TYPE qs_ks_qmmm_env_p_type
66      TYPE(qs_ks_qmmm_env_type), POINTER :: ks_env
67   END TYPE qs_ks_qmmm_env_p_type
68CONTAINS
69
70! **************************************************************************************************
71!> \brief releases the ks_qmmm_env (see doc/ReferenceCounting.html)
72!> \param ks_qmmm_env the ks_qmmm_env to be released
73!> \par History
74!>      05.2004 created [tlaino]
75!> \author Teodoro Laino
76! **************************************************************************************************
77   SUBROUTINE qs_ks_qmmm_release(ks_qmmm_env)
78      TYPE(qs_ks_qmmm_env_type), POINTER                 :: ks_qmmm_env
79
80      CHARACTER(len=*), PARAMETER :: routineN = 'qs_ks_qmmm_release', &
81         routineP = moduleN//':'//routineN
82
83      INTEGER                                            :: i
84      TYPE(pw_pool_type), POINTER                        :: pool
85
86      IF (ASSOCIATED(ks_qmmm_env)) THEN
87         CPASSERT(ks_qmmm_env%ref_count > 0)
88         ks_qmmm_env%ref_count = ks_qmmm_env%ref_count - 1
89
90         IF (ks_qmmm_env%ref_count < 1) THEN
91            CALL pw_env_get(ks_qmmm_env%pw_env, auxbas_pw_pool=pool)
92            CALL pw_pool_give_back_pw(pool, ks_qmmm_env%v_qmmm_rspace%pw)
93            CALL pw_env_release(ks_qmmm_env%pw_env)
94            IF (ASSOCIATED(ks_qmmm_env%cube_info)) THEN
95               DO i = 1, SIZE(ks_qmmm_env%cube_info)
96                  CALL destroy_cube_info(ks_qmmm_env%cube_info(i))
97               END DO
98               DEALLOCATE (ks_qmmm_env%cube_info)
99            END IF
100            IF (ASSOCIATED(ks_qmmm_env%matrix_h)) THEN
101               CALL dbcsr_deallocate_matrix_set(ks_qmmm_env%matrix_h)
102            END IF
103            DEALLOCATE (ks_qmmm_env)
104         END IF
105      END IF
106      NULLIFY (ks_qmmm_env)
107   END SUBROUTINE qs_ks_qmmm_release
108
109! **************************************************************************************************
110!> \brief retains the given ks_environment
111!> \param ks_qmmm_env the KohnSham QM/MM environment to retain
112!> \par History
113!>      05.2004 created [tlaino]
114!> \author Teodoro Laino
115! **************************************************************************************************
116   SUBROUTINE qs_ks_qmmm_retain(ks_qmmm_env)
117      TYPE(qs_ks_qmmm_env_type), POINTER                 :: ks_qmmm_env
118
119      CHARACTER(len=*), PARAMETER :: routineN = 'qs_ks_qmmm_retain', &
120         routineP = moduleN//':'//routineN
121
122      CPASSERT(ASSOCIATED(ks_qmmm_env))
123      CPASSERT(ks_qmmm_env%ref_count > 0)
124      ks_qmmm_env%ref_count = ks_qmmm_env%ref_count + 1
125   END SUBROUTINE qs_ks_qmmm_retain
126
127END MODULE qs_ks_qmmm_types
128