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