1!--------------------------------------------------------------------------------------------------!
2!   CP2K: A general program to perform molecular dynamics simulations                              !
3!   Copyright (C) 2000 - 2020  CP2K developers group                                               !
4!--------------------------------------------------------------------------------------------------!
5
6! **************************************************************************************************
7!> \brief  Dirichlet boundary condition data types
8!> \par History
9!>       08.2014 created [Hossein Bani-Hashemian]
10!>       10.2015 completely revised [Hossein Bani-Hashemian]
11!> \author Mohammad Hossein Bani-Hashemian
12! **************************************************************************************************
13MODULE dirichlet_bc_types
14
15   USE kinds,                           ONLY: dp
16   USE pw_pool_types,                   ONLY: pw_pool_give_back_pw,&
17                                              pw_pool_type
18   USE pw_types,                        ONLY: pw_release,&
19                                              pw_type
20#include "../base/base_uses.f90"
21
22   IMPLICIT NONE
23   PRIVATE
24   CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'dirichlet_bc_types'
25
26! main types
27   TYPE :: dirichlet_bc_parameters
28      LOGICAL                                  :: verbose_output
29      LOGICAL                                  :: do_dbc_cube = .FALSE.
30      REAL(KIND=dp)                            :: time
31
32      INTEGER                                  :: n_aa_planar
33      INTEGER, DIMENSION(:, :), POINTER         :: aa_planar_nprtn => NULL()
34      INTEGER, DIMENSION(:), POINTER           :: aa_planar_pplane => NULL()
35      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_planar_xxtnt => NULL()
36      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_planar_yxtnt => NULL()
37      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_planar_zxtnt => NULL()
38      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_planar_vD => NULL()
39      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_planar_osc_frac => NULL()
40      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_planar_frequency => NULL()
41      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_planar_phase => NULL()
42      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_planar_sigma => NULL()
43      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_planar_thickness => NULL()
44      LOGICAL, DIMENSION(:), POINTER           :: aa_planar_is_periodic => NULL()
45
46      INTEGER                                  :: n_planar
47      INTEGER, DIMENSION(:, :), POINTER         :: planar_nprtn => NULL()
48      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: planar_Avtx => NULL()
49      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: planar_Bvtx => NULL()
50      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: planar_Cvtx => NULL()
51      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: planar_Dvtx => NULL()
52      REAL(KIND=dp), DIMENSION(:), POINTER     :: planar_vD => NULL()
53      REAL(KIND=dp), DIMENSION(:), POINTER     :: planar_osc_frac => NULL()
54      REAL(KIND=dp), DIMENSION(:), POINTER     :: planar_frequency => NULL()
55      REAL(KIND=dp), DIMENSION(:), POINTER     :: planar_phase => NULL()
56      REAL(KIND=dp), DIMENSION(:), POINTER     :: planar_sigma => NULL()
57      REAL(KIND=dp), DIMENSION(:), POINTER     :: planar_thickness => NULL()
58      LOGICAL, DIMENSION(:), POINTER           :: planar_is_periodic => NULL()
59
60      INTEGER                                  :: n_aa_cylindrical
61      INTEGER, DIMENSION(:, :), POINTER         :: aa_cylindrical_nprtn => NULL()
62      INTEGER, DIMENSION(:), POINTER           :: aa_cylindrical_paxis => NULL()
63      INTEGER, DIMENSION(:), POINTER           :: aa_cylindrical_nsides => NULL()
64      INTEGER, DIMENSION(:), POINTER           :: aa_cylindrical_apxtyp => NULL()
65      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_cylindrical_xtnt => NULL()
66      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_cylindrical_bctr => NULL()
67      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_brad => NULL()
68      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_vD => NULL()
69      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_osc_frac => NULL()
70      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_frequency => NULL()
71      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_phase => NULL()
72      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_sigma => NULL()
73      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_thickness => NULL()
74      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cylindrical_sgap => NULL()
75      LOGICAL, DIMENSION(:), POINTER           :: aa_cylindrical_is_periodic => NULL()
76
77      INTEGER                                  :: n_aa_cuboidal
78      INTEGER, DIMENSION(:, :), POINTER         :: aa_cuboidal_nprtn => NULL()
79      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_cuboidal_xxtnt => NULL()
80      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_cuboidal_yxtnt => NULL()
81      REAL(KIND=dp), DIMENSION(:, :), POINTER   :: aa_cuboidal_zxtnt => NULL()
82      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cuboidal_vD => NULL()
83      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cuboidal_osc_frac => NULL()
84      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cuboidal_frequency => NULL()
85      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cuboidal_phase => NULL()
86      REAL(KIND=dp), DIMENSION(:), POINTER     :: aa_cuboidal_sigma => NULL()
87      LOGICAL, DIMENSION(:), POINTER           :: aa_cuboidal_is_periodic => NULL()
88   END TYPE dirichlet_bc_parameters
89
90   TYPE :: dirichlet_bc_type
91      REAL(dp)                          :: v_D
92      REAL(dp)                          :: osc_frac
93      REAL(dp)                          :: frequency
94      REAL(dp)                          :: phase
95      INTEGER                           :: dbc_id
96      INTEGER                           :: dbc_geom
97      REAL(dp), DIMENSION(3, 8)          :: vertices
98      TYPE(tile_p_type), &
99         DIMENSION(:), POINTER           :: tiles => NULL()
100      INTEGER                           :: n_tiles
101      REAL(dp)                          :: smoothing_width
102   END TYPE dirichlet_bc_type
103
104   TYPE :: dirichlet_bc_p_type
105      TYPE(dirichlet_bc_type), POINTER  :: dirichlet_bc
106   END TYPE dirichlet_bc_p_type
107
108   TYPE :: tile_type
109      INTEGER                           :: tile_id
110      REAL(dp), DIMENSION(3, 8)          :: vertices
111      TYPE(pw_type), POINTER            :: tile_pw => NULL()
112      REAL(dp)                          :: volume
113   END TYPE tile_type
114
115   TYPE :: tile_p_type
116      TYPE(tile_type), POINTER          :: tile
117   END TYPE tile_p_type
118
119! publicly accessible entities
120   PUBLIC dirichlet_bc_type, dirichlet_bc_p_type, tile_type, tile_p_type
121   PUBLIC dirichlet_bc_parameters
122
123   PUBLIC dbc_release, &
124      dbc_tile_release, &
125      dbc_parameters_dealloc
126
127! parameters
128   INTEGER, PARAMETER, PUBLIC           :: AA_PLANAR = 10, &
129                                           PLANAR = 11, &
130                                           CYLINDRICAL = 20, &
131                                           AA_CUBOIDAL = 30
132
133   INTEGER, PARAMETER, PUBLIC           :: CIRCUMSCRIBED = 1, &
134                                           INSCRIBED = 2
135
136   INTEGER, PARAMETER, PUBLIC           :: xy_plane = 110, &
137                                           xz_plane = 101, &
138                                           yz_plane = 011
139
140   INTEGER, PARAMETER, PUBLIC           :: x_axis = 100, &
141                                           y_axis = 010, &
142                                           z_axis = 001
143CONTAINS
144
145! **************************************************************************************************
146!> \brief   releases the defined Dirichlet boundary region
147!> \param contacts the DBC region to be released
148!> \param do_dbc_cube ...
149!> \param pw_pool pool of the plane wave grid
150!> \par History
151!>       08.2014 created [Hossein Bani-Hashemian]
152!> \author Mohammad Hossein Bani-Hashemian
153! **************************************************************************************************
154   SUBROUTINE dbc_release(contacts, do_dbc_cube, pw_pool)
155
156      TYPE(dirichlet_bc_p_type), DIMENSION(:), &
157         INTENT(INOUT), POINTER                          :: contacts
158      LOGICAL, INTENT(IN)                                :: do_dbc_cube
159      TYPE(pw_pool_type), INTENT(IN), OPTIONAL, POINTER  :: pw_pool
160
161      CHARACTER(LEN=*), PARAMETER :: routineN = 'dbc_release', routineP = moduleN//':'//routineN
162
163      INTEGER                                            :: handle, i, n_contacts
164
165      CALL timeset(routineN, handle)
166
167      IF (ASSOCIATED(contacts)) THEN
168         n_contacts = SIZE(contacts)
169         IF (do_dbc_cube) THEN
170            DO i = 1, n_contacts
171               CALL dbc_tile_release(contacts(i)%dirichlet_bc, pw_pool)
172               DEALLOCATE (contacts(i)%dirichlet_bc)
173            END DO
174         ELSE
175            DO i = 1, n_contacts
176               DEALLOCATE (contacts(i)%dirichlet_bc)
177            END DO
178         END IF
179         DEALLOCATE (contacts)
180      END IF
181
182      CALL timestop(handle)
183
184   END SUBROUTINE dbc_release
185
186! **************************************************************************************************
187!> \brief   releases tiles
188!> \param dbc ...
189!> \param pw_pool pool of the plane wave grid
190!> \par History
191!>       11.2015 created [Hossein Bani-Hashemian]
192!> \author Mohammad Hossein Bani-Hashemian
193! **************************************************************************************************
194   SUBROUTINE dbc_tile_release(dbc, pw_pool)
195
196      TYPE(dirichlet_bc_type), INTENT(INOUT), POINTER    :: dbc
197      TYPE(pw_pool_type), INTENT(IN), OPTIONAL, POINTER  :: pw_pool
198
199      CHARACTER(LEN=*), PARAMETER :: routineN = 'dbc_tile_release', &
200         routineP = moduleN//':'//routineN
201
202      INTEGER                                            :: handle, k, n_tiles
203
204      CALL timeset(routineN, handle)
205
206      n_tiles = dbc%n_tiles
207      IF (PRESENT(pw_pool)) THEN
208         DO k = 1, n_tiles
209            CALL pw_pool_give_back_pw(pw_pool, dbc%tiles(k)%tile%tile_pw)
210            DEALLOCATE (dbc%tiles(k)%tile)
211         END DO
212         DEALLOCATE (dbc%tiles)
213      ELSE
214         DO k = 1, n_tiles
215            CALL pw_release(dbc%tiles(k)%tile%tile_pw)
216            DEALLOCATE (dbc%tiles(k)%tile)
217         END DO
218         DEALLOCATE (dbc%tiles)
219      END IF
220
221      CALL timestop(handle)
222
223   END SUBROUTINE dbc_tile_release
224
225! **************************************************************************************************
226!> \brief   deallocates dirichlet_bc_parameters type
227!> \param dbc_params dbc parameters
228!> \par History
229!>       08.2014 created [Hossein Bani-Hashemian]
230!> \author Mohammad Hossein Bani-Hashemian
231! **************************************************************************************************
232   SUBROUTINE dbc_parameters_dealloc(dbc_params)
233
234      TYPE(dirichlet_bc_parameters), INTENT(INOUT)       :: dbc_params
235
236      CHARACTER(LEN=*), PARAMETER :: routineN = 'dbc_parameters_dealloc', &
237         routineP = moduleN//':'//routineN
238
239      IF (ASSOCIATED(dbc_params%aa_planar_nprtn)) DEALLOCATE (dbc_params%aa_planar_nprtn)
240      IF (ASSOCIATED(dbc_params%aa_planar_pplane)) DEALLOCATE (dbc_params%aa_planar_pplane)
241      IF (ASSOCIATED(dbc_params%aa_planar_xxtnt)) DEALLOCATE (dbc_params%aa_planar_xxtnt)
242      IF (ASSOCIATED(dbc_params%aa_planar_yxtnt)) DEALLOCATE (dbc_params%aa_planar_yxtnt)
243      IF (ASSOCIATED(dbc_params%aa_planar_zxtnt)) DEALLOCATE (dbc_params%aa_planar_zxtnt)
244      IF (ASSOCIATED(dbc_params%aa_planar_vD)) DEALLOCATE (dbc_params%aa_planar_vD)
245      IF (ASSOCIATED(dbc_params%aa_planar_frequency)) DEALLOCATE (dbc_params%aa_planar_frequency)
246      IF (ASSOCIATED(dbc_params%aa_planar_osc_frac)) DEALLOCATE (dbc_params%aa_planar_osc_frac)
247      IF (ASSOCIATED(dbc_params%aa_planar_phase)) DEALLOCATE (dbc_params%aa_planar_phase)
248      IF (ASSOCIATED(dbc_params%aa_planar_sigma)) DEALLOCATE (dbc_params%aa_planar_sigma)
249      IF (ASSOCIATED(dbc_params%aa_planar_thickness)) DEALLOCATE (dbc_params%aa_planar_thickness)
250      IF (ASSOCIATED(dbc_params%aa_planar_is_periodic)) DEALLOCATE (dbc_params%aa_planar_is_periodic)
251
252      IF (ASSOCIATED(dbc_params%planar_nprtn)) DEALLOCATE (dbc_params%planar_nprtn)
253      IF (ASSOCIATED(dbc_params%planar_Avtx)) DEALLOCATE (dbc_params%planar_Avtx)
254      IF (ASSOCIATED(dbc_params%planar_Bvtx)) DEALLOCATE (dbc_params%planar_Bvtx)
255      IF (ASSOCIATED(dbc_params%planar_Cvtx)) DEALLOCATE (dbc_params%planar_Cvtx)
256      IF (ASSOCIATED(dbc_params%planar_Dvtx)) DEALLOCATE (dbc_params%planar_Dvtx)
257      IF (ASSOCIATED(dbc_params%planar_vD)) DEALLOCATE (dbc_params%planar_vD)
258      IF (ASSOCIATED(dbc_params%planar_frequency)) DEALLOCATE (dbc_params%planar_frequency)
259      IF (ASSOCIATED(dbc_params%planar_osc_frac)) DEALLOCATE (dbc_params%planar_osc_frac)
260      IF (ASSOCIATED(dbc_params%planar_phase)) DEALLOCATE (dbc_params%planar_phase)
261      IF (ASSOCIATED(dbc_params%planar_sigma)) DEALLOCATE (dbc_params%planar_sigma)
262      IF (ASSOCIATED(dbc_params%planar_thickness)) DEALLOCATE (dbc_params%planar_thickness)
263      IF (ASSOCIATED(dbc_params%planar_is_periodic)) DEALLOCATE (dbc_params%planar_is_periodic)
264
265      IF (ASSOCIATED(dbc_params%aa_cylindrical_paxis)) DEALLOCATE (dbc_params%aa_cylindrical_paxis)
266      IF (ASSOCIATED(dbc_params%aa_cylindrical_nprtn)) DEALLOCATE (dbc_params%aa_cylindrical_nprtn)
267      IF (ASSOCIATED(dbc_params%aa_cylindrical_nsides)) DEALLOCATE (dbc_params%aa_cylindrical_nsides)
268      IF (ASSOCIATED(dbc_params%aa_cylindrical_apxtyp)) DEALLOCATE (dbc_params%aa_cylindrical_apxtyp)
269      IF (ASSOCIATED(dbc_params%aa_cylindrical_xtnt)) DEALLOCATE (dbc_params%aa_cylindrical_xtnt)
270      IF (ASSOCIATED(dbc_params%aa_cylindrical_bctr)) DEALLOCATE (dbc_params%aa_cylindrical_bctr)
271      IF (ASSOCIATED(dbc_params%aa_cylindrical_brad)) DEALLOCATE (dbc_params%aa_cylindrical_brad)
272      IF (ASSOCIATED(dbc_params%aa_cylindrical_vD)) DEALLOCATE (dbc_params%aa_cylindrical_vD)
273      IF (ASSOCIATED(dbc_params%aa_cylindrical_frequency)) DEALLOCATE (dbc_params%aa_cylindrical_frequency)
274      IF (ASSOCIATED(dbc_params%aa_cylindrical_osc_frac)) DEALLOCATE (dbc_params%aa_cylindrical_osc_frac)
275      IF (ASSOCIATED(dbc_params%aa_cylindrical_phase)) DEALLOCATE (dbc_params%aa_cylindrical_phase)
276      IF (ASSOCIATED(dbc_params%aa_cylindrical_sigma)) DEALLOCATE (dbc_params%aa_cylindrical_sigma)
277      IF (ASSOCIATED(dbc_params%aa_cylindrical_thickness)) DEALLOCATE (dbc_params%aa_cylindrical_thickness)
278      IF (ASSOCIATED(dbc_params%aa_cylindrical_sgap)) DEALLOCATE (dbc_params%aa_cylindrical_sgap)
279      IF (ASSOCIATED(dbc_params%aa_cylindrical_is_periodic)) DEALLOCATE (dbc_params%aa_cylindrical_is_periodic)
280
281      IF (ASSOCIATED(dbc_params%aa_cuboidal_nprtn)) DEALLOCATE (dbc_params%aa_cuboidal_nprtn)
282      IF (ASSOCIATED(dbc_params%aa_cuboidal_xxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_xxtnt)
283      IF (ASSOCIATED(dbc_params%aa_cuboidal_yxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_yxtnt)
284      IF (ASSOCIATED(dbc_params%aa_cuboidal_zxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_zxtnt)
285      IF (ASSOCIATED(dbc_params%aa_cuboidal_vD)) DEALLOCATE (dbc_params%aa_cuboidal_vD)
286      IF (ASSOCIATED(dbc_params%aa_cuboidal_frequency)) DEALLOCATE (dbc_params%aa_cuboidal_frequency)
287      IF (ASSOCIATED(dbc_params%aa_cuboidal_osc_frac)) DEALLOCATE (dbc_params%aa_cuboidal_osc_frac)
288      IF (ASSOCIATED(dbc_params%aa_cuboidal_phase)) DEALLOCATE (dbc_params%aa_cuboidal_phase)
289      IF (ASSOCIATED(dbc_params%aa_cuboidal_sigma)) DEALLOCATE (dbc_params%aa_cuboidal_sigma)
290      IF (ASSOCIATED(dbc_params%aa_cuboidal_is_periodic)) DEALLOCATE (dbc_params%aa_cuboidal_is_periodic)
291
292   END SUBROUTINE dbc_parameters_dealloc
293
294END MODULE dirichlet_bc_types
295