1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief basis types for the calculation of the perturbation of density theory.
8!> \par History
9!>      4.2002 created [fawzi]
10!> \author Fawzi Mohamed
11! **************************************************************************************************
12MODULE qs_kpp1_env_types
13   USE dbcsr_api,                       ONLY: dbcsr_deallocate_matrix,&
14                                              dbcsr_p_type
15   USE pw_types,                        ONLY: pw_p_type,&
16                                              pw_release
17   USE xc_derivative_set_types,         ONLY: xc_derivative_set_type,&
18                                              xc_dset_release
19   USE xc_rho_set_types,                ONLY: xc_rho_set_release,&
20                                              xc_rho_set_type
21#include "./base/base_uses.f90"
22
23   IMPLICIT NONE
24   PRIVATE
25   PUBLIC :: qs_kpp1_env_type
26   PUBLIC :: kpp1_release
27
28   LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
29   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_kpp1_env_types'
30
31! **************************************************************************************************
32!> \brief environment that keeps the informations and temporary
33!>      val to build the kpp1 kernel matrix
34!> \param ref_count reference count (how may objects are sharing this one)
35!> \param v_rspace potential in r space. This is used to do an update only
36!>        of what has changed. Useful if P1 converges to some density
37!>        (you spare in the grid-ao conversion).
38!>        With LSD contains the various orbitals.
39!> \param v_ao the potential in the ao basis (used togheter with v_rspace
40!>        to update only what changed
41!> \param id_nr identification number, unique for each kpp1 env
42!> \param print_count counter to create unique filename
43!> \param iter number of iterations
44!> \param drho_r (idir,ispin): the derivative of rho wrt. x,y,z in the real space
45!> \param deriv_xc (ii,ipot): the second derivative of the xc potential at psi0
46!>        (qs_env%c), if grad pot is true it should already be divised
47!>        by the gradient
48!> \param spin_pot (1:2,ipot): information about wrt. to which spins the
49!>         corresponding component of deriv_xc was derived (see
50!>         xc_create_2nd_deriv_info)
51!> \param grad_pot (1:2,ipot): if the derivative spin_pot was wrt. to
52!>        the gradient (see xc_create_2nd_deriv_info)
53!> \param ndiag_term (ipot): it the term is an off diagonal term (see
54!>        xc_create_2nd_deriv_info)
55! **************************************************************************************************
56   TYPE qs_kpp1_env_type
57      INTEGER :: ref_count, id_nr, print_count, iter
58      TYPE(pw_p_type), DIMENSION(:), POINTER :: v_rspace
59      TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: v_ao
60      TYPE(pw_p_type), DIMENSION(:, :), POINTER :: drho_r
61      TYPE(xc_derivative_set_type), POINTER :: deriv_set
62      TYPE(xc_rho_set_type), POINTER        :: rho_set
63      INTEGER, DIMENSION(:, :), POINTER :: spin_pot
64      LOGICAL, DIMENSION(:, :), POINTER :: grad_pot
65      LOGICAL, DIMENSION(:), POINTER :: ndiag_term
66   END TYPE qs_kpp1_env_type
67
68! **************************************************************************************************
69!> \brief just to build array of pointers
70!> \param kpp1_env: the pointer to the kpp1_env
71!> \par History
72!>      12.2002 created [fawzi]
73!> \author Fawzi Mohamed
74! **************************************************************************************************
75   TYPE qs_kpp1_env_p_type
76      TYPE(qs_kpp1_env_type), POINTER :: kpp1_env
77   END TYPE qs_kpp1_env_p_type
78
79CONTAINS
80
81! **************************************************************************************************
82!> \brief releases a kpp1_env (see doc/ReferenceCounting.html)
83!> \param kpp1_env the environment to release
84!> \par History
85!>      07.2002 created [fawzi]
86!> \author Fawzi Mohamed
87! **************************************************************************************************
88   SUBROUTINE kpp1_release(kpp1_env)
89      TYPE(qs_kpp1_env_type), POINTER                    :: kpp1_env
90
91      CHARACTER(len=*), PARAMETER :: routineN = 'kpp1_release', routineP = moduleN//':'//routineN
92
93      INTEGER                                            :: ispin
94
95      IF (ASSOCIATED(kpp1_env)) THEN
96         CPASSERT(kpp1_env%ref_count > 0)
97         kpp1_env%ref_count = kpp1_env%ref_count - 1
98         IF (kpp1_env%ref_count < 1) THEN
99            IF (ASSOCIATED(kpp1_env%v_rspace)) THEN
100               DO ispin = 1, SIZE(kpp1_env%v_rspace)
101                  CALL pw_release(kpp1_env%v_rspace(ispin)%pw)
102               END DO
103               DEALLOCATE (kpp1_env%v_rspace)
104            END IF
105            IF (ASSOCIATED(kpp1_env%v_ao)) THEN
106               DO ispin = 1, SIZE(kpp1_env%v_ao)
107                  IF (ASSOCIATED(kpp1_env%v_ao(ispin)%matrix)) THEN
108                     CALL dbcsr_deallocate_matrix(kpp1_env%v_ao(ispin)%matrix)
109                  END IF
110               END DO
111               DEALLOCATE (kpp1_env%v_ao)
112            END IF
113            IF (ASSOCIATED(kpp1_env%drho_r)) THEN
114               DEALLOCATE (kpp1_env%drho_r)
115            END IF
116            IF (ASSOCIATED(kpp1_env%deriv_set)) THEN
117               CALL xc_dset_release(kpp1_env%deriv_set)
118               NULLIFY (kpp1_env%deriv_set)
119            END IF
120            IF (ASSOCIATED(kpp1_env%rho_set)) THEN
121               CALL xc_rho_set_release(kpp1_env%rho_set)
122               NULLIFY (kpp1_env%rho_set)
123            END IF
124            IF (ASSOCIATED(kpp1_env%spin_pot)) THEN
125               DEALLOCATE (kpp1_env%spin_pot)
126            END IF
127            IF (ASSOCIATED(kpp1_env%grad_pot)) THEN
128               DEALLOCATE (kpp1_env%grad_pot)
129            END IF
130            IF (ASSOCIATED(kpp1_env%ndiag_term)) THEN
131               DEALLOCATE (kpp1_env%ndiag_term)
132            END IF
133            DEALLOCATE (kpp1_env)
134         END IF
135      END IF
136      NULLIFY (kpp1_env)
137   END SUBROUTINE kpp1_release
138
139! **************************************************************************************************
140!> \brief retains a kpp1_env (see doc/ReferenceCounting.html)
141!> \param kpp1_env the environment to retain
142!> \par History
143!>      11.2002 created [fawzi]
144!> \author Fawzi Mohamed
145! **************************************************************************************************
146   SUBROUTINE kpp1_retain(kpp1_env)
147      TYPE(qs_kpp1_env_type), POINTER                    :: kpp1_env
148
149      CHARACTER(len=*), PARAMETER :: routineN = 'kpp1_retain', routineP = moduleN//':'//routineN
150
151      CPASSERT(ASSOCIATED(kpp1_env))
152      CPASSERT(kpp1_env%ref_count > 0)
153      kpp1_env%ref_count = kpp1_env%ref_count + 1
154   END SUBROUTINE kpp1_retain
155
156END MODULE qs_kpp1_env_types
157