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