1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2019  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief Types containing essential information for running implicit (iterative)
8!>        Poisson solver
9!> \par History
10!>       08.2014 created [Hossein Bani-Hashemian]
11!> \author Hossein Bani-Hashemian
12! **************************************************************************************************
13MODULE ps_implicit_types
14
15   USE dct,                             ONLY: dct_type,&
16                                              dct_type_release
17   USE dielectric_types,                ONLY: dielectric_release,&
18                                              dielectric_type
19   USE dirichlet_bc_types,              ONLY: dbc_release,&
20                                              dirichlet_bc_p_type
21   USE kinds,                           ONLY: dp
22   USE pw_pool_types,                   ONLY: pw_pool_give_back_pw,&
23                                              pw_pool_type
24   USE pw_types,                        ONLY: pw_release,&
25                                              pw_type
26#include "../base/base_uses.f90"
27
28   IMPLICIT NONE
29   PRIVATE
30   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ps_implicit_types'
31
32   TYPE :: ps_implicit_parameters
33      INTEGER                           :: boundary_condition
34      LOGICAL                           :: zero_initial_guess
35      INTEGER                           :: max_iter
36      REAL(KIND=dp)                     :: tol
37      REAL(KIND=dp)                     :: omega
38      INTEGER                           :: neumann_directions
39   END TYPE ps_implicit_parameters
40
41   TYPE :: ps_implicit_type
42      LOGICAL                           :: do_dbc_cube
43      TYPE(dielectric_type), POINTER    :: dielectric
44      TYPE(dct_type)                    :: dct_env
45      TYPE(pw_type), POINTER            :: initial_guess
46      TYPE(pw_type), POINTER            :: v_eps
47      TYPE(pw_type), POINTER            :: cstr_charge
48      REAL(dp), DIMENSION(:), POINTER   :: initial_lambda => NULL()
49      REAL(dp)                          :: ehartree
50      REAL(dp)                          :: electric_enthalpy
51      INTEGER                           :: times_called
52      TYPE(dirichlet_bc_p_type), &
53         DIMENSION(:), POINTER           :: contacts => NULL()
54      REAL(dp), DIMENSION(:, :), POINTER :: QS => NULL()
55      REAL(dp), DIMENSION(:, :), POINTER :: Rinv => NULL()
56      REAL(dp), DIMENSION(:, :), POINTER :: B => NULL()
57      REAL(dp), DIMENSION(:, :), POINTER :: Bt => NULL()
58      REAL(dp), DIMENSION(:), POINTER   :: v_D => NULL()
59      REAL(dp), DIMENSION(:), POINTER   :: osc_frac => NULL()
60      REAL(dp), DIMENSION(:), POINTER   :: frequency => NULL()
61      REAL(dp), DIMENSION(:), POINTER   :: phase => NULL()
62      INTEGER, DIMENSION(:), POINTER    :: idx_1dto3d => NULL()
63   END TYPE ps_implicit_type
64
65   PUBLIC ps_implicit_type, ps_implicit_parameters
66   PUBLIC ps_implicit_release
67
68   INTEGER, PARAMETER, PUBLIC           :: PERIODIC_BC = 0, &
69                                           MIXED_BC = 1, &
70                                           MIXED_PERIODIC_BC = 2, &
71                                           NEUMANN_BC = 3
72CONTAINS
73
74! **************************************************************************************************
75!> \brief   Deallocates ps_implicit
76!> \param ps_implicit_env the implicit_env to be deallocated
77!> \param ps_implicit_params implicit env parameters
78!> \param pw_pool pool of plane-wave grid
79!> \par History
80!>       08.2014 created [Hossein Bani-Hashemian]
81!> \author Mohammad Hossein Bani-Hashemian
82! **************************************************************************************************
83   SUBROUTINE ps_implicit_release(ps_implicit_env, ps_implicit_params, pw_pool)
84      TYPE(ps_implicit_type), POINTER                    :: ps_implicit_env
85      TYPE(ps_implicit_parameters), INTENT(INOUT)        :: ps_implicit_params
86      TYPE(pw_pool_type), INTENT(IN), OPTIONAL, POINTER  :: pw_pool
87
88      CHARACTER(len=*), PARAMETER :: routineN = 'ps_implicit_release', &
89         routineP = moduleN//':'//routineN
90
91      INTEGER                                            :: boundary_condition, handle
92      LOGICAL                                            :: can_give_back, do_dbc_cube
93
94      CALL timeset(routineN, handle)
95
96      IF (ASSOCIATED(ps_implicit_env)) THEN
97         can_give_back = PRESENT(pw_pool)
98         IF (can_give_back) can_give_back = ASSOCIATED(pw_pool)
99         do_dbc_cube = ps_implicit_env%do_dbc_cube
100
101         IF (can_give_back) THEN
102            CALL pw_pool_give_back_pw(pw_pool, ps_implicit_env%initial_guess, &
103                                      accept_non_compatible=.TRUE.)
104            CALL pw_pool_give_back_pw(pw_pool, ps_implicit_env%v_eps, &
105                                      accept_non_compatible=.TRUE.)
106            CALL pw_pool_give_back_pw(pw_pool, ps_implicit_env%cstr_charge, &
107                                      accept_non_compatible=.TRUE.)
108            CALL dbc_release(ps_implicit_env%contacts, do_dbc_cube, pw_pool=pw_pool)
109         ELSE
110            CALL pw_release(ps_implicit_env%initial_guess)
111            CALL pw_release(ps_implicit_env%v_eps)
112            CALL pw_release(ps_implicit_env%cstr_charge)
113            CALL dbc_release(ps_implicit_env%contacts, do_dbc_cube)
114         END IF
115
116         DEALLOCATE (ps_implicit_env%initial_lambda)
117         DEALLOCATE (ps_implicit_env%B)
118         DEALLOCATE (ps_implicit_env%Bt)
119         DEALLOCATE (ps_implicit_env%QS)
120         DEALLOCATE (ps_implicit_env%Rinv)
121         DEALLOCATE (ps_implicit_env%v_D)
122         DEALLOCATE (ps_implicit_env%osc_frac)
123         DEALLOCATE (ps_implicit_env%frequency)
124         DEALLOCATE (ps_implicit_env%phase)
125         DEALLOCATE (ps_implicit_env%idx_1dto3d)
126
127         CALL dielectric_release(ps_implicit_env%dielectric, pw_pool)
128         boundary_condition = ps_implicit_params%boundary_condition
129         IF (boundary_condition .EQ. MIXED_BC .OR. boundary_condition .EQ. NEUMANN_BC) THEN
130            CALL dct_type_release(ps_implicit_env%dct_env)
131         END IF
132
133         DEALLOCATE (ps_implicit_env)
134      END IF
135
136      CALL timestop(handle)
137
138   END SUBROUTINE ps_implicit_release
139
140END MODULE ps_implicit_types
141