1!--------------------------------------------------------------------------------------------------! 2! CP2K: A general program to perform molecular dynamics simulations ! 3! Copyright (C) 2000 - 2020 CP2K developers group ! 4!--------------------------------------------------------------------------------------------------! 5 6! ************************************************************************************************** 7!> \author MI (12.01.2007) 8! ************************************************************************************************** 9MODULE shell_potential_types 10 11 USE kinds, ONLY: default_string_length,& 12 dp 13#include "../base/base_uses.f90" 14 15 IMPLICIT NONE 16 17 PRIVATE 18 19! Global parameters (only in this module) 20 21 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'shell_potential_types' 22 23! ************************************************************************************************** 24!> \brief Define the shell type 25! ************************************************************************************************** 26 TYPE shell_kind_type 27 INTEGER :: ref_count 28 REAL(dp) :: charge_core, & 29 charge_shell 30 REAL(dp) :: mass_core, & 31 massfrac, & 32 mass_shell 33 REAL(dp) :: k2_spring, k4_spring 34 REAL(dp) :: max_dist 35 REAL(dp) :: shell_cutoff 36 END TYPE shell_kind_type 37 38! ************************************************************************************************** 39 TYPE shell_p_type 40 CHARACTER(LEN=default_string_length) :: atm_name 41 TYPE(shell_kind_type), POINTER :: shell 42 END TYPE shell_p_type 43 44! Public subroutines 45 46 PUBLIC :: get_shell, shell_create, shell_p_create, & 47 shell_p_release, shell_release, shell_retain 48 49! Public data types 50 51 PUBLIC :: shell_p_type, shell_kind_type 52 53CONTAINS 54 55! ************************************************************************************************** 56!> \brief ... 57!> \param shell ... 58!> \param charge ... 59!> \param charge_core ... 60!> \param charge_shell ... 61!> \param mass_core ... 62!> \param mass_shell ... 63!> \param k2_spring ... 64!> \param k4_spring ... 65!> \param max_dist ... 66!> \param shell_cutoff ... 67! ************************************************************************************************** 68 SUBROUTINE get_shell(shell, charge, charge_core, charge_shell, mass_core, & 69 mass_shell, k2_spring, k4_spring, max_dist, shell_cutoff) 70 71 TYPE(shell_kind_type), POINTER :: shell 72 REAL(KIND=dp), INTENT(OUT), OPTIONAL :: charge, charge_core, charge_shell, & 73 mass_core, mass_shell, k2_spring, & 74 k4_spring, max_dist, shell_cutoff 75 76 CHARACTER(LEN=*), PARAMETER :: routineN = 'get_shell', routineP = moduleN//':'//routineN 77 78 IF (ASSOCIATED(shell)) THEN 79 IF (PRESENT(charge)) charge = shell%charge_core + shell%charge_shell 80 IF (PRESENT(charge_core)) charge_core = shell%charge_core 81 IF (PRESENT(charge_shell)) charge_shell = shell%charge_shell 82 IF (PRESENT(mass_core)) mass_core = shell%mass_core 83 IF (PRESENT(mass_shell)) mass_shell = shell%mass_shell 84 IF (PRESENT(k2_spring)) k2_spring = shell%k2_spring 85 IF (PRESENT(k4_spring)) k4_spring = shell%k4_spring 86 IF (PRESENT(max_dist)) max_dist = shell%max_dist 87 IF (PRESENT(shell_cutoff)) shell_cutoff = shell%shell_cutoff 88 END IF 89 90 END SUBROUTINE 91! ************************************************************************************************** 92!> \brief ... 93!> \param shell ... 94! ************************************************************************************************** 95 SUBROUTINE shell_create(shell) 96 97 TYPE(shell_kind_type), POINTER :: shell 98 99 CHARACTER(len=*), PARAMETER :: routineN = 'shell_create', routineP = moduleN//':'//routineN 100 101 CPASSERT(.NOT. ASSOCIATED(shell)) 102 ALLOCATE (shell) 103 shell%ref_count = 1 104 105 END SUBROUTINE shell_create 106 107! ************************************************************************************************** 108!> \brief ... 109!> \param shell_list ... 110!> \param ndim ... 111! ************************************************************************************************** 112 SUBROUTINE shell_p_create(shell_list, ndim) 113 114 TYPE(shell_p_type), DIMENSION(:), POINTER :: shell_list 115 INTEGER, INTENT(IN) :: ndim 116 117 CHARACTER(len=*), PARAMETER :: routineN = 'shell_p_create', routineP = moduleN//':'//routineN 118 119 INTEGER :: i 120 121 CPASSERT(.NOT. ASSOCIATED(shell_list)) 122 ALLOCATE (shell_list(ndim)) 123 124 DO i = 1, ndim 125 NULLIFY (shell_list(i)%shell) 126 CALL shell_create(shell_list(i)%shell) 127 shell_list(i)%atm_name = '' 128 END DO 129 130 END SUBROUTINE shell_p_create 131 132! ************************************************************************************************** 133!> \brief ... 134!> \param shell ... 135! ************************************************************************************************** 136 SUBROUTINE shell_retain(shell) 137 138 TYPE(shell_kind_type), POINTER :: shell 139 140 CHARACTER(len=*), PARAMETER :: routineN = 'shell_retain', routineP = moduleN//':'//routineN 141 142 CPASSERT(ASSOCIATED(shell)) 143 CPASSERT(shell%ref_count > 0) 144 shell%ref_count = shell%ref_count + 1 145 146 END SUBROUTINE shell_retain 147 148! ************************************************************************************************** 149!> \brief ... 150!> \param shell ... 151! ************************************************************************************************** 152 SUBROUTINE shell_release(shell) 153 154 TYPE(shell_kind_type), POINTER :: shell 155 156 CHARACTER(len=*), PARAMETER :: routineN = 'shell_release', routineP = moduleN//':'//routineN 157 158 IF (ASSOCIATED(shell)) THEN 159 CPASSERT(shell%ref_count > 0) 160 shell%ref_count = shell%ref_count - 1 161 IF (shell%ref_count == 0) THEN 162 DEALLOCATE (shell) 163 END IF 164 END IF 165 NULLIFY (shell) 166 167 END SUBROUTINE shell_release 168 169! ************************************************************************************************** 170!> \brief ... 171!> \param shell_list ... 172! ************************************************************************************************** 173 SUBROUTINE shell_p_release(shell_list) 174 TYPE(shell_p_type), DIMENSION(:), POINTER :: shell_list 175 176 CHARACTER(len=*), PARAMETER :: routineN = 'shell_p_release', & 177 routineP = moduleN//':'//routineN 178 179 INTEGER :: i 180 181 IF (ASSOCIATED(shell_list)) THEN 182 DO i = 1, SIZE(shell_list) 183 CALL shell_release(shell_list(i)%shell) 184 END DO 185 DEALLOCATE (shell_list) 186 END IF 187 188 NULLIFY (shell_list) 189 190 END SUBROUTINE shell_p_release 191 192END MODULE shell_potential_types 193