LCOV - code coverage report
Current view: top level - src/pw - dirichlet_bc_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 88.9 % 81 72
Test Date: 2025-12-04 06:27:48 Functions: 37.5 % 8 3

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 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              : ! **************************************************************************************************
      15              : MODULE dirichlet_bc_types
      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, &
     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
     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           54 :    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           54 :       CALL timeset(routineN, handle)
     166              : 
     167           54 :       IF (ALLOCATED(contacts)) THEN
     168           38 :          n_contacts = SIZE(contacts)
     169           38 :          IF (do_dbc_cube) THEN
     170            0 :             DO i = 1, n_contacts
     171            0 :                CALL dbc_tile_release(contacts(i)%dirichlet_bc, pw_pool)
     172            0 :                DEALLOCATE (contacts(i)%dirichlet_bc)
     173              :             END DO
     174              :          ELSE
     175          166 :             DO i = 1, n_contacts
     176          166 :                DEALLOCATE (contacts(i)%dirichlet_bc)
     177              :             END DO
     178              :          END IF
     179           38 :          DEALLOCATE (contacts)
     180              :       END IF
     181              : 
     182           54 :       CALL timestop(handle)
     183              : 
     184           54 :    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          128 :    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          128 :       CALL timeset(routineN, handle)
     204              : 
     205          128 :       n_tiles = dbc%n_tiles
     206          128 :       IF (PRESENT(pw_pool)) THEN
     207          352 :          DO k = 1, n_tiles
     208          224 :             CALL pw_pool%give_back_pw(dbc%tiles(k)%tile%tile_pw)
     209          224 :             DEALLOCATE (dbc%tiles(k)%tile%tile_pw)
     210          352 :             DEALLOCATE (dbc%tiles(k)%tile)
     211              :          END DO
     212          128 :          DEALLOCATE (dbc%tiles)
     213              :       ELSE
     214            0 :          DO k = 1, n_tiles
     215            0 :             CALL dbc%tiles(k)%tile%tile_pw%release()
     216            0 :             DEALLOCATE (dbc%tiles(k)%tile%tile_pw)
     217            0 :             DEALLOCATE (dbc%tiles(k)%tile)
     218              :          END DO
     219            0 :          DEALLOCATE (dbc%tiles)
     220              :       END IF
     221              : 
     222          128 :       CALL timestop(handle)
     223              : 
     224          128 :    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           54 :    SUBROUTINE dbc_parameters_dealloc(dbc_params)
     234              : 
     235              :       TYPE(dirichlet_bc_parameters), INTENT(INOUT)       :: dbc_params
     236              : 
     237           54 :       IF (ASSOCIATED(dbc_params%aa_planar_nprtn)) DEALLOCATE (dbc_params%aa_planar_nprtn)
     238           54 :       IF (ASSOCIATED(dbc_params%aa_planar_pplane)) DEALLOCATE (dbc_params%aa_planar_pplane)
     239           54 :       IF (ASSOCIATED(dbc_params%aa_planar_xxtnt)) DEALLOCATE (dbc_params%aa_planar_xxtnt)
     240           54 :       IF (ASSOCIATED(dbc_params%aa_planar_yxtnt)) DEALLOCATE (dbc_params%aa_planar_yxtnt)
     241           54 :       IF (ASSOCIATED(dbc_params%aa_planar_zxtnt)) DEALLOCATE (dbc_params%aa_planar_zxtnt)
     242           54 :       IF (ASSOCIATED(dbc_params%aa_planar_vD)) DEALLOCATE (dbc_params%aa_planar_vD)
     243           54 :       IF (ASSOCIATED(dbc_params%aa_planar_frequency)) DEALLOCATE (dbc_params%aa_planar_frequency)
     244           54 :       IF (ASSOCIATED(dbc_params%aa_planar_osc_frac)) DEALLOCATE (dbc_params%aa_planar_osc_frac)
     245           54 :       IF (ASSOCIATED(dbc_params%aa_planar_phase)) DEALLOCATE (dbc_params%aa_planar_phase)
     246           54 :       IF (ASSOCIATED(dbc_params%aa_planar_sigma)) DEALLOCATE (dbc_params%aa_planar_sigma)
     247           54 :       IF (ASSOCIATED(dbc_params%aa_planar_thickness)) DEALLOCATE (dbc_params%aa_planar_thickness)
     248           54 :       IF (ASSOCIATED(dbc_params%aa_planar_is_periodic)) DEALLOCATE (dbc_params%aa_planar_is_periodic)
     249              : 
     250           54 :       IF (ASSOCIATED(dbc_params%planar_nprtn)) DEALLOCATE (dbc_params%planar_nprtn)
     251           54 :       IF (ASSOCIATED(dbc_params%planar_Avtx)) DEALLOCATE (dbc_params%planar_Avtx)
     252           54 :       IF (ASSOCIATED(dbc_params%planar_Bvtx)) DEALLOCATE (dbc_params%planar_Bvtx)
     253           54 :       IF (ASSOCIATED(dbc_params%planar_Cvtx)) DEALLOCATE (dbc_params%planar_Cvtx)
     254           54 :       IF (ASSOCIATED(dbc_params%planar_Dvtx)) DEALLOCATE (dbc_params%planar_Dvtx)
     255           54 :       IF (ASSOCIATED(dbc_params%planar_vD)) DEALLOCATE (dbc_params%planar_vD)
     256           54 :       IF (ASSOCIATED(dbc_params%planar_frequency)) DEALLOCATE (dbc_params%planar_frequency)
     257           54 :       IF (ASSOCIATED(dbc_params%planar_osc_frac)) DEALLOCATE (dbc_params%planar_osc_frac)
     258           54 :       IF (ASSOCIATED(dbc_params%planar_phase)) DEALLOCATE (dbc_params%planar_phase)
     259           54 :       IF (ASSOCIATED(dbc_params%planar_sigma)) DEALLOCATE (dbc_params%planar_sigma)
     260           54 :       IF (ASSOCIATED(dbc_params%planar_thickness)) DEALLOCATE (dbc_params%planar_thickness)
     261           54 :       IF (ASSOCIATED(dbc_params%planar_is_periodic)) DEALLOCATE (dbc_params%planar_is_periodic)
     262              : 
     263           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_paxis)) DEALLOCATE (dbc_params%aa_cylindrical_paxis)
     264           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_nprtn)) DEALLOCATE (dbc_params%aa_cylindrical_nprtn)
     265           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_nsides)) DEALLOCATE (dbc_params%aa_cylindrical_nsides)
     266           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_apxtyp)) DEALLOCATE (dbc_params%aa_cylindrical_apxtyp)
     267           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_xtnt)) DEALLOCATE (dbc_params%aa_cylindrical_xtnt)
     268           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_bctr)) DEALLOCATE (dbc_params%aa_cylindrical_bctr)
     269           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_brad)) DEALLOCATE (dbc_params%aa_cylindrical_brad)
     270           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_vD)) DEALLOCATE (dbc_params%aa_cylindrical_vD)
     271           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_frequency)) DEALLOCATE (dbc_params%aa_cylindrical_frequency)
     272           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_osc_frac)) DEALLOCATE (dbc_params%aa_cylindrical_osc_frac)
     273           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_phase)) DEALLOCATE (dbc_params%aa_cylindrical_phase)
     274           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_sigma)) DEALLOCATE (dbc_params%aa_cylindrical_sigma)
     275           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_thickness)) DEALLOCATE (dbc_params%aa_cylindrical_thickness)
     276           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_sgap)) DEALLOCATE (dbc_params%aa_cylindrical_sgap)
     277           54 :       IF (ASSOCIATED(dbc_params%aa_cylindrical_is_periodic)) DEALLOCATE (dbc_params%aa_cylindrical_is_periodic)
     278              : 
     279           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_nprtn)) DEALLOCATE (dbc_params%aa_cuboidal_nprtn)
     280           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_xxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_xxtnt)
     281           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_yxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_yxtnt)
     282           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_zxtnt)) DEALLOCATE (dbc_params%aa_cuboidal_zxtnt)
     283           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_vD)) DEALLOCATE (dbc_params%aa_cuboidal_vD)
     284           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_frequency)) DEALLOCATE (dbc_params%aa_cuboidal_frequency)
     285           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_osc_frac)) DEALLOCATE (dbc_params%aa_cuboidal_osc_frac)
     286           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_phase)) DEALLOCATE (dbc_params%aa_cuboidal_phase)
     287           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_sigma)) DEALLOCATE (dbc_params%aa_cuboidal_sigma)
     288           54 :       IF (ASSOCIATED(dbc_params%aa_cuboidal_is_periodic)) DEALLOCATE (dbc_params%aa_cuboidal_is_periodic)
     289              : 
     290           54 :    END SUBROUTINE dbc_parameters_dealloc
     291              : 
     292            0 : END MODULE dirichlet_bc_types
        

Generated by: LCOV version 2.0-1