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 Definition of the semi empirical multipole integral expansions types
10 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
11 : ! **************************************************************************************************
12 : MODULE semi_empirical_mpole_types
13 :
14 : USE kinds, ONLY: dp
15 : #include "./base/base_uses.f90"
16 :
17 : IMPLICIT NONE
18 :
19 : PRIVATE
20 :
21 : ! *** Global parameters ***
22 :
23 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'semi_empirical_mpole_types'
24 :
25 : ! **************************************************************************************************
26 : !> \brief Semi-empirical integral multipole expansion type
27 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
28 : ! **************************************************************************************************
29 : TYPE semi_empirical_mpole_type
30 : LOGICAL, DIMENSION(3) :: task = .FALSE.
31 : INTEGER :: indi = -1, indj = -1
32 : REAL(KIND=dp) :: c = -1.0_dp
33 : REAL(KIND=dp), DIMENSION(3) :: d = -1.0_dp
34 : REAL(KIND=dp), DIMENSION(3, 3) :: qc = -1.0_dp ! quadrupole cartesian
35 : REAL(KIND=dp), DIMENSION(5) :: qs = -1.0_dp ! quadrupole spherical
36 : ! alternative definition used in GKS integral routines
37 : REAL(KIND=dp) :: cs = -1.0_dp
38 : REAL(KIND=dp), DIMENSION(3) :: ds = -1.0_dp
39 : REAL(KIND=dp), DIMENSION(3, 3) :: qq = -1.0_dp ! quadrupole cartesian
40 : END TYPE semi_empirical_mpole_type
41 :
42 : ! **************************************************************************************************
43 : !> \brief Semi-empirical integral multipole expansion type - pointer type
44 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
45 : ! **************************************************************************************************
46 : TYPE semi_empirical_mpole_p_type
47 : TYPE(semi_empirical_mpole_type), POINTER :: mpole => NULL()
48 : END TYPE semi_empirical_mpole_p_type
49 :
50 : ! **************************************************************************************************
51 : !> \brief Global Multipolar NDDO information type
52 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
53 : ! **************************************************************************************************
54 : TYPE nddo_mpole_type
55 : REAL(KIND=dp), DIMENSION(:), POINTER :: charge => NULL(), efield0 => NULL()
56 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: dipole => NULL(), efield1 => NULL(), efield2 => NULL()
57 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: quadrupole => NULL()
58 : END TYPE nddo_mpole_type
59 :
60 : PUBLIC :: semi_empirical_mpole_type, &
61 : semi_empirical_mpole_p_type, &
62 : semi_empirical_mpole_p_create, &
63 : semi_empirical_mpole_p_release, &
64 : nddo_mpole_type, &
65 : nddo_mpole_create, &
66 : nddo_mpole_release
67 :
68 : CONTAINS
69 :
70 : ! **************************************************************************************************
71 : !> \brief Allocate semi-empirical mpole type
72 : !> \param mpole ...
73 : !> \param ndim ...
74 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
75 : ! **************************************************************************************************
76 2240 : SUBROUTINE semi_empirical_mpole_p_create(mpole, ndim)
77 : TYPE(semi_empirical_mpole_p_type), DIMENSION(:), &
78 : POINTER :: mpole
79 : INTEGER, INTENT(IN) :: ndim
80 :
81 : INTEGER :: i
82 :
83 2240 : CPASSERT(.NOT. ASSOCIATED(mpole))
84 50738 : ALLOCATE (mpole(ndim))
85 46258 : DO i = 1, ndim
86 44018 : NULLIFY (mpole(i)%mpole)
87 46258 : CALL semi_empirical_mpole_create(mpole(i)%mpole)
88 : END DO
89 :
90 2240 : END SUBROUTINE semi_empirical_mpole_p_create
91 :
92 : ! **************************************************************************************************
93 : !> \brief Deallocate the semi-empirical mpole type
94 : !> \param mpole ...
95 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
96 : ! **************************************************************************************************
97 3964 : SUBROUTINE semi_empirical_mpole_p_release(mpole)
98 : TYPE(semi_empirical_mpole_p_type), DIMENSION(:), &
99 : POINTER :: mpole
100 :
101 : INTEGER :: i
102 :
103 3964 : IF (ASSOCIATED(mpole)) THEN
104 46258 : DO i = 1, SIZE(mpole)
105 46258 : CALL semi_empirical_mpole_release(mpole(i)%mpole)
106 : END DO
107 2240 : DEALLOCATE (mpole)
108 : END IF
109 :
110 3964 : END SUBROUTINE semi_empirical_mpole_p_release
111 :
112 : ! **************************************************************************************************
113 : !> \brief Allocate semi-empirical mpole type
114 : !> \param mpole ...
115 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
116 : ! **************************************************************************************************
117 44018 : SUBROUTINE semi_empirical_mpole_create(mpole)
118 : TYPE(semi_empirical_mpole_type), POINTER :: mpole
119 :
120 44018 : CPASSERT(.NOT. ASSOCIATED(mpole))
121 1980810 : ALLOCATE (mpole)
122 176072 : mpole%task = .FALSE.
123 44018 : mpole%indi = 0
124 44018 : mpole%indj = 0
125 44018 : mpole%c = HUGE(0.0_dp)
126 176072 : mpole%d = HUGE(0.0_dp)
127 572234 : mpole%qc = HUGE(0.0_dp)
128 264108 : mpole%qs = HUGE(0.0_dp)
129 44018 : mpole%cs = HUGE(0.0_dp)
130 176072 : mpole%ds = HUGE(0.0_dp)
131 572234 : mpole%qq = HUGE(0.0_dp)
132 44018 : END SUBROUTINE semi_empirical_mpole_create
133 :
134 : ! **************************************************************************************************
135 : !> \brief Deallocate the semi-empirical mpole type
136 : !> \param mpole ...
137 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
138 : ! **************************************************************************************************
139 44018 : SUBROUTINE semi_empirical_mpole_release(mpole)
140 : TYPE(semi_empirical_mpole_type), POINTER :: mpole
141 :
142 44018 : IF (ASSOCIATED(mpole)) THEN
143 44018 : DEALLOCATE (mpole)
144 : END IF
145 :
146 44018 : END SUBROUTINE semi_empirical_mpole_release
147 :
148 : ! **************************************************************************************************
149 : !> \brief Allocate NDDO multipole type
150 : !> \param nddo_mpole ...
151 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
152 : ! **************************************************************************************************
153 32 : SUBROUTINE nddo_mpole_create(nddo_mpole)
154 : TYPE(nddo_mpole_type), POINTER :: nddo_mpole
155 :
156 32 : CPASSERT(.NOT. ASSOCIATED(nddo_mpole))
157 32 : ALLOCATE (nddo_mpole)
158 : NULLIFY (nddo_mpole%charge)
159 : NULLIFY (nddo_mpole%dipole)
160 : NULLIFY (nddo_mpole%quadrupole)
161 : NULLIFY (nddo_mpole%efield0)
162 : NULLIFY (nddo_mpole%efield1)
163 : NULLIFY (nddo_mpole%efield2)
164 32 : END SUBROUTINE nddo_mpole_create
165 :
166 : ! **************************************************************************************************
167 : !> \brief Deallocate NDDO multipole type
168 : !> \param nddo_mpole ...
169 : !> \author Teodoro Laino [tlaino] - 08.2008 Zurich University
170 : ! **************************************************************************************************
171 64 : SUBROUTINE nddo_mpole_release(nddo_mpole)
172 : TYPE(nddo_mpole_type), POINTER :: nddo_mpole
173 :
174 64 : IF (ASSOCIATED(nddo_mpole)) THEN
175 32 : IF (ASSOCIATED(nddo_mpole%charge)) THEN
176 32 : DEALLOCATE (nddo_mpole%charge)
177 : END IF
178 32 : IF (ASSOCIATED(nddo_mpole%dipole)) THEN
179 32 : DEALLOCATE (nddo_mpole%dipole)
180 : END IF
181 32 : IF (ASSOCIATED(nddo_mpole%quadrupole)) THEN
182 32 : DEALLOCATE (nddo_mpole%quadrupole)
183 : END IF
184 32 : IF (ASSOCIATED(nddo_mpole%efield0)) THEN
185 32 : DEALLOCATE (nddo_mpole%efield0)
186 : END IF
187 32 : IF (ASSOCIATED(nddo_mpole%efield1)) THEN
188 32 : DEALLOCATE (nddo_mpole%efield1)
189 : END IF
190 32 : IF (ASSOCIATED(nddo_mpole%efield2)) THEN
191 32 : DEALLOCATE (nddo_mpole%efield2)
192 : END IF
193 32 : DEALLOCATE (nddo_mpole)
194 : END IF
195 :
196 64 : END SUBROUTINE nddo_mpole_release
197 :
198 0 : END MODULE semi_empirical_mpole_types
|