(git:ccc2433)
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
18  USE pw_pool_types, ONLY: pw_pool_type
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
27  TYPE :: dirichlet_bc_parameters
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()
88  END TYPE dirichlet_bc_parameters
89 
90  TYPE :: dirichlet_bc_type
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 
104  TYPE :: dirichlet_bc_p_type
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 
115  TYPE :: tile_p_type
116  TYPE(tile_type), POINTER :: tile => null()
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, &
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
143 CONTAINS
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 
292 END 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 ...
Definition: pw_pool_types.F:24