(git:374b731)
Loading...
Searching...
No Matches
dirichlet_bc_types.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Dirichlet boundary condition data types
10!> \par History
11!> 08.2014 created [Hossein Bani-Hashemian]
12!> 10.2015 completely revised [Hossein Bani-Hashemian]
13!> \author Mohammad Hossein Bani-Hashemian
14! **************************************************************************************************
16
17 USE kinds, ONLY: dp
19 USE pw_types, ONLY: pw_r3d_rs_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
28 LOGICAL :: verbose_output = .false.
29 LOGICAL :: do_dbc_cube = .false.
30 REAL(kind=dp) :: time = 0.0_dp
31
32 INTEGER :: n_aa_planar = 0
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 = 0
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 = 0
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 = 0
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()
89
91 REAL(dp) :: v_d = 0.0_dp
92 REAL(dp) :: osc_frac = 0.0_dp
93 REAL(dp) :: frequency = 0.0_dp
94 REAL(dp) :: phase = 0.0_dp
95 INTEGER :: dbc_id = 0
96 INTEGER :: dbc_geom = 0
97 REAL(dp), DIMENSION(3, 8) :: vertices = 0
98 TYPE(tile_p_type), &
99 DIMENSION(:), POINTER :: tiles => null()
100 INTEGER :: n_tiles = 0
101 REAL(dp) :: smoothing_width = 0.0_dp
102 END TYPE dirichlet_bc_type
103
105 TYPE(dirichlet_bc_type), POINTER :: dirichlet_bc => null()
106 END TYPE dirichlet_bc_p_type
107
108 TYPE :: tile_type
109 INTEGER :: tile_id = 0
110 REAL(dp), DIMENSION(3, 8) :: vertices = 0
111 TYPE(pw_r3d_rs_type), POINTER :: tile_pw => null()
112 REAL(dp) :: volume = 0.0_dp
113 END TYPE tile_type
114
116 TYPE(tile_type), POINTER :: tile => null()
117 END TYPE tile_p_type
118
119! publicly accessible entities
122
123 PUBLIC dbc_release, &
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), ALLOCATABLE, &
157 DIMENSION(:), INTENT(INOUT) :: 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'
162
163 INTEGER :: handle, i, n_contacts
164
165 CALL timeset(routinen, handle)
166
167 IF (ALLOCATED(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
201 INTEGER :: handle, k, n_tiles
202
203 CALL timeset(routinen, handle)
204
205 n_tiles = dbc%n_tiles
206 IF (PRESENT(pw_pool)) THEN
207 DO k = 1, n_tiles
208 CALL pw_pool%give_back_pw(dbc%tiles(k)%tile%tile_pw)
209 DEALLOCATE (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 dbc%tiles(k)%tile%tile_pw%release()
216 DEALLOCATE (dbc%tiles(k)%tile%tile_pw)
217 DEALLOCATE (dbc%tiles(k)%tile)
218 END DO
219 DEALLOCATE (dbc%tiles)
220 END IF
221
222 CALL timestop(handle)
223
224 END SUBROUTINE dbc_tile_release
225
226! **************************************************************************************************
227!> \brief deallocates dirichlet_bc_parameters type
228!> \param dbc_params dbc parameters
229!> \par History
230!> 08.2014 created [Hossein Bani-Hashemian]
231!> \author Mohammad Hossein Bani-Hashemian
232! **************************************************************************************************
233 SUBROUTINE dbc_parameters_dealloc(dbc_params)
234
235 TYPE(dirichlet_bc_parameters), INTENT(INOUT) :: dbc_params
236
237 IF (ASSOCIATED(dbc_params%aa_planar_nprtn)) DEALLOCATE (dbc_params%aa_planar_nprtn)
238 IF (ASSOCIATED(dbc_params%aa_planar_pplane)) DEALLOCATE (dbc_params%aa_planar_pplane)
239 IF (ASSOCIATED(dbc_params%aa_planar_xxtnt)) DEALLOCATE (dbc_params%aa_planar_xxtnt)
240 IF (ASSOCIATED(dbc_params%aa_planar_yxtnt)) DEALLOCATE (dbc_params%aa_planar_yxtnt)
241 IF (ASSOCIATED(dbc_params%aa_planar_zxtnt)) DEALLOCATE (dbc_params%aa_planar_zxtnt)
242 IF (ASSOCIATED(dbc_params%aa_planar_vD)) DEALLOCATE (dbc_params%aa_planar_vD)
243 IF (ASSOCIATED(dbc_params%aa_planar_frequency)) DEALLOCATE (dbc_params%aa_planar_frequency)
244 IF (ASSOCIATED(dbc_params%aa_planar_osc_frac)) DEALLOCATE (dbc_params%aa_planar_osc_frac)
245 IF (ASSOCIATED(dbc_params%aa_planar_phase)) DEALLOCATE (dbc_params%aa_planar_phase)
246 IF (ASSOCIATED(dbc_params%aa_planar_sigma)) DEALLOCATE (dbc_params%aa_planar_sigma)
247 IF (ASSOCIATED(dbc_params%aa_planar_thickness)) DEALLOCATE (dbc_params%aa_planar_thickness)
248 IF (ASSOCIATED(dbc_params%aa_planar_is_periodic)) DEALLOCATE (dbc_params%aa_planar_is_periodic)
249
250 IF (ASSOCIATED(dbc_params%planar_nprtn)) DEALLOCATE (dbc_params%planar_nprtn)
251 IF (ASSOCIATED(dbc_params%planar_Avtx)) DEALLOCATE (dbc_params%planar_Avtx)
252 IF (ASSOCIATED(dbc_params%planar_Bvtx)) DEALLOCATE (dbc_params%planar_Bvtx)
253 IF (ASSOCIATED(dbc_params%planar_Cvtx)) DEALLOCATE (dbc_params%planar_Cvtx)
254 IF (ASSOCIATED(dbc_params%planar_Dvtx)) DEALLOCATE (dbc_params%planar_Dvtx)
255 IF (ASSOCIATED(dbc_params%planar_vD)) DEALLOCATE (dbc_params%planar_vD)
256 IF (ASSOCIATED(dbc_params%planar_frequency)) DEALLOCATE (dbc_params%planar_frequency)
257 IF (ASSOCIATED(dbc_params%planar_osc_frac)) DEALLOCATE (dbc_params%planar_osc_frac)
258 IF (ASSOCIATED(dbc_params%planar_phase)) DEALLOCATE (dbc_params%planar_phase)
259 IF (ASSOCIATED(dbc_params%planar_sigma)) DEALLOCATE (dbc_params%planar_sigma)
260 IF (ASSOCIATED(dbc_params%planar_thickness)) DEALLOCATE (dbc_params%planar_thickness)
261 IF (ASSOCIATED(dbc_params%planar_is_periodic)) DEALLOCATE (dbc_params%planar_is_periodic)
262
263 IF (ASSOCIATED(dbc_params%aa_cylindrical_paxis)) DEALLOCATE (dbc_params%aa_cylindrical_paxis)
264 IF (ASSOCIATED(dbc_params%aa_cylindrical_nprtn)) DEALLOCATE (dbc_params%aa_cylindrical_nprtn)
265 IF (ASSOCIATED(dbc_params%aa_cylindrical_nsides)) DEALLOCATE (dbc_params%aa_cylindrical_nsides)
266 IF (ASSOCIATED(dbc_params%aa_cylindrical_apxtyp)) DEALLOCATE (dbc_params%aa_cylindrical_apxtyp)
267 IF (ASSOCIATED(dbc_params%aa_cylindrical_xtnt)) DEALLOCATE (dbc_params%aa_cylindrical_xtnt)
268 IF (ASSOCIATED(dbc_params%aa_cylindrical_bctr)) DEALLOCATE (dbc_params%aa_cylindrical_bctr)
269 IF (ASSOCIATED(dbc_params%aa_cylindrical_brad)) DEALLOCATE (dbc_params%aa_cylindrical_brad)
270 IF (ASSOCIATED(dbc_params%aa_cylindrical_vD)) DEALLOCATE (dbc_params%aa_cylindrical_vD)
271 IF (ASSOCIATED(dbc_params%aa_cylindrical_frequency)) DEALLOCATE (dbc_params%aa_cylindrical_frequency)
272 IF (ASSOCIATED(dbc_params%aa_cylindrical_osc_frac)) DEALLOCATE (dbc_params%aa_cylindrical_osc_frac)
273 IF (ASSOCIATED(dbc_params%aa_cylindrical_phase)) DEALLOCATE (dbc_params%aa_cylindrical_phase)
274 IF (ASSOCIATED(dbc_params%aa_cylindrical_sigma)) DEALLOCATE (dbc_params%aa_cylindrical_sigma)
275 IF (ASSOCIATED(dbc_params%aa_cylindrical_thickness)) DEALLOCATE (dbc_params%aa_cylindrical_thickness)
276 IF (ASSOCIATED(dbc_params%aa_cylindrical_sgap)) DEALLOCATE (dbc_params%aa_cylindrical_sgap)
277 IF (ASSOCIATED(dbc_params%aa_cylindrical_is_periodic)) DEALLOCATE (dbc_params%aa_cylindrical_is_periodic)
278
279 IF (ASSOCIATED(dbc_params%aa_cuboidal_nprtn)) DEALLOCATE (dbc_params%aa_cuboidal_nprtn)
280 IF (ASSOCIATED(dbc_params%aa_cuboidal_xxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_xxtnt)
281 IF (ASSOCIATED(dbc_params%aa_cuboidal_yxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_yxtnt)
282 IF (ASSOCIATED(dbc_params%aa_cuboidal_zxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_zxtnt)
283 IF (ASSOCIATED(dbc_params%aa_cuboidal_vD)) DEALLOCATE (dbc_params%aa_cuboidal_vD)
284 IF (ASSOCIATED(dbc_params%aa_cuboidal_frequency)) DEALLOCATE (dbc_params%aa_cuboidal_frequency)
285 IF (ASSOCIATED(dbc_params%aa_cuboidal_osc_frac)) DEALLOCATE (dbc_params%aa_cuboidal_osc_frac)
286 IF (ASSOCIATED(dbc_params%aa_cuboidal_phase)) DEALLOCATE (dbc_params%aa_cuboidal_phase)
287 IF (ASSOCIATED(dbc_params%aa_cuboidal_sigma)) DEALLOCATE (dbc_params%aa_cuboidal_sigma)
288 IF (ASSOCIATED(dbc_params%aa_cuboidal_is_periodic)) DEALLOCATE (dbc_params%aa_cuboidal_is_periodic)
289
290 END SUBROUTINE dbc_parameters_dealloc
291
292END MODULE dirichlet_bc_types
Dirichlet boundary condition data types.
subroutine, public dbc_parameters_dealloc(dbc_params)
deallocates dirichlet_bc_parameters type
integer, parameter, public z_axis
integer, parameter, public inscribed
integer, parameter, public cylindrical
integer, parameter, public aa_cuboidal
integer, parameter, public y_axis
subroutine, public dbc_release(contacts, do_dbc_cube, pw_pool)
releases the defined Dirichlet boundary region
integer, parameter, public circumscribed
integer, parameter, public x_axis
integer, parameter, public aa_planar
integer, parameter, public xz_plane
subroutine, public dbc_tile_release(dbc, pw_pool)
releases tiles
integer, parameter, public planar
integer, parameter, public yz_plane
integer, parameter, public xy_plane
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...