Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief contains information regarding the decoupling/recoupling method of Bloechl
10 : !> \author Teodoro Laino
11 : ! **************************************************************************************************
12 : MODULE cp_ddapc_types
13 : USE cell_methods, ONLY: read_cell
14 : USE cell_types, ONLY: cell_release,&
15 : cell_type
16 : USE cp_ddapc_methods, ONLY: ddapc_eval_AmI,&
17 : ddapc_eval_gfunc,&
18 : ewald_ddapc_pot,&
19 : solvation_ddapc_pot
20 : USE cp_log_handling, ONLY: cp_get_default_logger,&
21 : cp_logger_type
22 : USE cp_output_handling, ONLY: cp_printkey_is_on
23 : USE ewald_spline_util, ONLY: Setup_Ewald_Spline
24 : USE input_section_types, ONLY: section_vals_get,&
25 : section_vals_get_subs_vals,&
26 : section_vals_type,&
27 : section_vals_val_get
28 : USE kinds, ONLY: dp
29 : USE mathconstants, ONLY: pi
30 : USE mathlib, ONLY: det_3x3
31 : USE message_passing, ONLY: mp_para_env_type
32 : USE particle_types, ONLY: particle_type
33 : USE pw_grid_types, ONLY: pw_grid_type
34 : USE pw_grids, ONLY: pw_grid_release
35 : USE pw_poisson_types, ONLY: pw_poisson_multipole
36 : USE pw_pool_types, ONLY: pw_pool_release,&
37 : pw_pool_type
38 : USE pw_types, ONLY: pw_c1d_gs_type,&
39 : pw_r3d_rs_type
40 : #include "./base/base_uses.f90"
41 :
42 : IMPLICIT NONE
43 : PRIVATE
44 : LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .TRUE.
45 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'cp_ddapc_types'
46 :
47 : PUBLIC :: cp_ddapc_type, cp_ddapc_create, cp_ddapc_release
48 : PUBLIC :: cp_ddapc_ewald_type, cp_ddapc_ewald_create, cp_ddapc_ewald_release
49 :
50 : ! **************************************************************************************************
51 : !> \author Teodoro Laino
52 : ! **************************************************************************************************
53 : TYPE cp_ddapc_type
54 : REAL(KIND=dp) :: c0 = 0.0_dp
55 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: AmI => NULL()
56 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: Md => NULL() ! decoupling
57 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: Mr => NULL() ! recoupling
58 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: Mt => NULL() ! decoupling+recoupling
59 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: Ms => NULL() ! solvation
60 : REAL(KIND=dp), POINTER, DIMENSION(:, :) :: gfunc => NULL()
61 : REAL(KIND=dp), POINTER, DIMENSION(:) :: w => NULL()
62 : END TYPE cp_ddapc_type
63 :
64 : ! **************************************************************************************************
65 : TYPE cp_ddapc_ewald_type
66 : LOGICAL :: do_decoupling = .FALSE.
67 : LOGICAL :: do_qmmm_periodic_decpl = .FALSE.
68 : LOGICAL :: do_solvation = .FALSE.
69 : LOGICAL :: do_property = .FALSE.
70 : LOGICAL :: do_restraint = .FALSE.
71 : TYPE(section_vals_type), POINTER :: ewald_section => NULL()
72 : TYPE(pw_pool_type), POINTER :: pw_pool_qm => NULL(), pw_pool_mm => NULL()
73 : TYPE(pw_grid_type), POINTER :: pw_grid_qm => NULL(), pw_grid_mm => NULL()
74 : TYPE(pw_r3d_rs_type), POINTER :: coeff_qm => NULL(), coeff_mm => NULL()
75 : END TYPE cp_ddapc_ewald_type
76 :
77 : CONTAINS
78 :
79 : ! **************************************************************************************************
80 : !> \brief ...
81 : !> \param cp_para_env ...
82 : !> \param cp_ddapc_env ...
83 : !> \param cp_ddapc_ewald ...
84 : !> \param particle_set ...
85 : !> \param radii ...
86 : !> \param cell ...
87 : !> \param super_cell ...
88 : !> \param rho_tot_g ...
89 : !> \param gcut ...
90 : !> \param iw2 ...
91 : !> \param Vol ...
92 : !> \param force_env_section ...
93 : !> \author Tedoro Laino
94 : !> \note NB receive cp_para_env to pass down to parallelized ewald_ddapc_pot()
95 : ! **************************************************************************************************
96 274 : SUBROUTINE cp_ddapc_create(cp_para_env, cp_ddapc_env, cp_ddapc_ewald, &
97 : particle_set, radii, cell, super_cell, rho_tot_g, gcut, iw2, Vol, &
98 : force_env_section)
99 : TYPE(mp_para_env_type), POINTER :: cp_para_env
100 : TYPE(cp_ddapc_type), INTENT(OUT) :: cp_ddapc_env
101 : TYPE(cp_ddapc_ewald_type), POINTER :: cp_ddapc_ewald
102 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
103 : REAL(kind=dp), DIMENSION(:), POINTER :: radii
104 : TYPE(cell_type), POINTER :: cell, super_cell
105 : TYPE(pw_c1d_gs_type), INTENT(IN) :: rho_tot_g
106 : REAL(KIND=dp), INTENT(IN) :: gcut
107 : INTEGER, INTENT(IN) :: iw2
108 : REAL(KIND=dp), INTENT(IN) :: Vol
109 : TYPE(section_vals_type), POINTER :: force_env_section
110 :
111 : CHARACTER(len=*), PARAMETER :: routineN = 'cp_ddapc_create'
112 :
113 : INTEGER :: handle
114 : TYPE(section_vals_type), POINTER :: param_section, solvation_section
115 :
116 274 : CALL timeset(routineN, handle)
117 : NULLIFY (cp_ddapc_env%AmI, &
118 274 : cp_ddapc_env%Md, &
119 274 : cp_ddapc_env%Mt, &
120 274 : cp_ddapc_env%Mr, &
121 274 : cp_ddapc_env%Ms, &
122 274 : cp_ddapc_env%gfunc, &
123 274 : cp_ddapc_env%w)
124 : ! Evaluates gfunc and AmI
125 274 : CALL ddapc_eval_gfunc(cp_ddapc_env%gfunc, cp_ddapc_env%w, gcut, rho_tot_g, radii)
126 : CALL ddapc_eval_AmI(cp_ddapc_env%AmI, &
127 : cp_ddapc_env%c0, &
128 : cp_ddapc_env%gfunc, &
129 : cp_ddapc_env%w, &
130 : particle_set, &
131 : gcut, &
132 : rho_tot_g, &
133 : radii, &
134 : iw2, &
135 274 : Vol)
136 274 : IF (cp_ddapc_ewald%do_qmmm_periodic_decpl .OR. &
137 : cp_ddapc_ewald%do_decoupling) THEN
138 : !
139 : ! Evaluate the matrix for the Classical contribution to the coupling/decoupling scheme
140 : !
141 140 : param_section => cp_ddapc_ewald%ewald_section
142 : !NB parallelized ewald_ddapc_pot() needs cp_para_env
143 : CALL ewald_ddapc_pot(cp_para_env, cp_ddapc_ewald%coeff_qm, &
144 : 1.0_dp, &
145 : cell, &
146 : param_section, &
147 : particle_set, &
148 : cp_ddapc_env%Md, &
149 140 : radii)
150 140 : IF (cp_ddapc_ewald%do_qmmm_periodic_decpl .OR. cp_ddapc_ewald%do_decoupling) THEN
151 560 : ALLOCATE (cp_ddapc_env%Mt(SIZE(cp_ddapc_env%Md, 1), SIZE(cp_ddapc_env%Md, 2)))
152 140 : IF (cp_ddapc_ewald%do_decoupling) THEN
153 : ! Just decoupling
154 7170 : cp_ddapc_env%Mt = cp_ddapc_env%Md
155 : ELSE
156 : ! QMMM periodic calculation
157 : !NB parallelized ewald_ddapc_pot() needs cp_para_env
158 : CALL ewald_ddapc_pot(cp_para_env, cp_ddapc_ewald%coeff_mm, -1.0_dp, super_cell, param_section, &
159 62 : particle_set, cp_ddapc_env%Mr, radii)
160 41762 : cp_ddapc_env%Mt = cp_ddapc_env%Md + cp_ddapc_env%Mr
161 : END IF
162 : END IF
163 : END IF
164 274 : IF (cp_ddapc_ewald%do_solvation) THEN
165 : ! Spherical Solvation model
166 26 : solvation_section => section_vals_get_subs_vals(force_env_section, "DFT%SCRF")
167 : CALL solvation_ddapc_pot(solvation_section, &
168 26 : particle_set, cp_ddapc_env%Ms, radii)
169 : END IF
170 274 : CALL timestop(handle)
171 274 : END SUBROUTINE cp_ddapc_create
172 :
173 : ! **************************************************************************************************
174 : !> \brief ...
175 : !> \param cp_ddapc_env ...
176 : !> \par History
177 : !> none
178 : !> \author Teodoro Laino - [tlaino]
179 : ! **************************************************************************************************
180 274 : SUBROUTINE cp_ddapc_release(cp_ddapc_env)
181 : TYPE(cp_ddapc_type), INTENT(INOUT) :: cp_ddapc_env
182 :
183 274 : IF (ASSOCIATED(cp_ddapc_env%AmI)) THEN
184 274 : DEALLOCATE (cp_ddapc_env%AmI)
185 : END IF
186 274 : IF (ASSOCIATED(cp_ddapc_env%Mt)) THEN
187 140 : DEALLOCATE (cp_ddapc_env%Mt)
188 : END IF
189 274 : IF (ASSOCIATED(cp_ddapc_env%Md)) THEN
190 140 : DEALLOCATE (cp_ddapc_env%Md)
191 : END IF
192 274 : IF (ASSOCIATED(cp_ddapc_env%Mr)) THEN
193 62 : DEALLOCATE (cp_ddapc_env%Mr)
194 : END IF
195 274 : IF (ASSOCIATED(cp_ddapc_env%Ms)) THEN
196 26 : DEALLOCATE (cp_ddapc_env%Ms)
197 : END IF
198 274 : IF (ASSOCIATED(cp_ddapc_env%gfunc)) THEN
199 274 : DEALLOCATE (cp_ddapc_env%gfunc)
200 : END IF
201 274 : IF (ASSOCIATED(cp_ddapc_env%w)) THEN
202 274 : DEALLOCATE (cp_ddapc_env%w)
203 : END IF
204 :
205 274 : END SUBROUTINE cp_ddapc_release
206 :
207 : ! **************************************************************************************************
208 : !> \brief ...
209 : !> \param cp_ddapc_ewald ...
210 : !> \param qmmm_decoupl ...
211 : !> \param qm_cell ...
212 : !> \param force_env_section ...
213 : !> \param subsys_section ...
214 : !> \param para_env ...
215 : !> \par History
216 : !> none
217 : !> \author Teodoro Laino - [tlaino]
218 : ! **************************************************************************************************
219 42150 : SUBROUTINE cp_ddapc_ewald_create(cp_ddapc_ewald, qmmm_decoupl, qm_cell, &
220 : force_env_section, subsys_section, para_env)
221 : TYPE(cp_ddapc_ewald_type), POINTER :: cp_ddapc_ewald
222 : LOGICAL, INTENT(IN) :: qmmm_decoupl
223 : TYPE(cell_type), POINTER :: qm_cell
224 : TYPE(section_vals_type), POINTER :: force_env_section, subsys_section
225 : TYPE(mp_para_env_type), POINTER :: para_env
226 :
227 : INTEGER :: my_val, npts(3)
228 8430 : INTEGER, DIMENSION(:), POINTER :: ngrids
229 : LOGICAL :: analyt, decoupling, do_qmmm_periodic_decpl, do_restraint, do_restraintB, &
230 : do_solvation, use_mm_spline, use_qm_spline
231 : REAL(KIND=dp) :: hmat(3, 3)
232 8430 : REAL(KIND=dp), DIMENSION(:), POINTER :: gx, gy, gz, LG
233 : TYPE(cell_type), POINTER :: dummy_cell, mm_cell
234 : TYPE(cp_logger_type), POINTER :: logger
235 : TYPE(section_vals_type), POINTER :: cell_section, grid_print_section, multipole_section, &
236 : poisson_section, printC_section, qmmm_per_section, restraint_section, restraint_sectionB, &
237 : solvation_section
238 :
239 16860 : logger => cp_get_default_logger()
240 8430 : CPASSERT(.NOT. ASSOCIATED(cp_ddapc_ewald))
241 8430 : ALLOCATE (cp_ddapc_ewald)
242 : NULLIFY (cp_ddapc_ewald%pw_grid_mm, &
243 : cp_ddapc_ewald%pw_grid_qm, &
244 : cp_ddapc_ewald%ewald_section, &
245 : cp_ddapc_ewald%pw_pool_mm, &
246 : cp_ddapc_ewald%pw_pool_qm, &
247 : cp_ddapc_ewald%coeff_mm, &
248 : cp_ddapc_ewald%coeff_qm)
249 8430 : NULLIFY (multipole_section)
250 :
251 8430 : poisson_section => section_vals_get_subs_vals(force_env_section, "DFT%POISSON")
252 8430 : solvation_section => section_vals_get_subs_vals(force_env_section, "DFT%SCRF")
253 8430 : qmmm_per_section => section_vals_get_subs_vals(force_env_section, "QMMM%PERIODIC")
254 8430 : printC_section => section_vals_get_subs_vals(force_env_section, "PROPERTIES%FIT_CHARGE")
255 8430 : restraint_section => section_vals_get_subs_vals(force_env_section, "DFT%QS%DDAPC_RESTRAINT")
256 : restraint_sectionB => section_vals_get_subs_vals(force_env_section, &
257 8430 : "PROPERTIES%ET_COUPLING%DDAPC_RESTRAINT_A")
258 8430 : CALL section_vals_get(solvation_section, explicit=do_solvation)
259 8430 : CALL section_vals_get(poisson_section, explicit=decoupling)
260 8430 : CALL section_vals_get(restraint_section, explicit=do_restraint)
261 8430 : CALL section_vals_get(restraint_sectionB, explicit=do_restraintB)
262 8430 : do_qmmm_periodic_decpl = qmmm_decoupl
263 8430 : cp_ddapc_ewald%do_solvation = do_solvation
264 8430 : cp_ddapc_ewald%do_qmmm_periodic_decpl = do_qmmm_periodic_decpl
265 8430 : cp_ddapc_ewald%do_property = cp_printkey_is_on(logger%iter_info, printC_section)
266 8430 : cp_ddapc_ewald%do_restraint = do_restraint .OR. do_restraintB
267 : ! Determining the tasks and further check
268 8430 : IF (do_qmmm_periodic_decpl .AND. decoupling) THEN
269 : CALL cp_warn(__LOCATION__, &
270 : "A calculation with the QMMM periodic model has been requested. "// &
271 : "The explicit POISSON section in DFT section will be IGNORED. "// &
272 0 : "QM Electrostatic controlled only by the PERIODIC section in QMMM section")
273 0 : decoupling = .FALSE.
274 : END IF
275 8430 : IF (decoupling) THEN
276 : ! Simple decoupling technique
277 2560 : CALL section_vals_val_get(poisson_section, "POISSON_SOLVER", i_val=my_val)
278 36 : SELECT CASE (my_val)
279 : CASE (pw_poisson_multipole)
280 36 : multipole_section => section_vals_get_subs_vals(poisson_section, "MULTIPOLE")
281 : CASE DEFAULT
282 2560 : decoupling = .FALSE.
283 : END SELECT
284 : END IF
285 8430 : cp_ddapc_ewald%do_decoupling = decoupling
286 8430 : IF (cp_ddapc_ewald%do_qmmm_periodic_decpl) THEN
287 : ! QMMM periodic
288 38 : multipole_section => section_vals_get_subs_vals(qmmm_per_section, "MULTIPOLE")
289 : END IF
290 8430 : cp_ddapc_ewald%ewald_section => multipole_section
291 8430 : IF (cp_ddapc_ewald%do_decoupling .OR. cp_ddapc_ewald%do_qmmm_periodic_decpl) THEN
292 : ! Do we do the calculation analytically or interpolating the g-space factor?
293 74 : CALL section_vals_val_get(multipole_section, "ANALYTICAL_GTERM", l_val=analyt)
294 74 : IF (.NOT. analyt) THEN
295 : ! The tabulated spline path is only valid for orthorhombic grids.
296 34 : use_qm_spline = qm_cell%orthorhombic
297 34 : use_mm_spline = .FALSE.
298 34 : IF (cp_ddapc_ewald%do_qmmm_periodic_decpl) THEN
299 16 : NULLIFY (mm_cell, dummy_cell)
300 16 : cell_section => section_vals_get_subs_vals(subsys_section, "CELL")
301 16 : CALL read_cell(mm_cell, dummy_cell, cell_section=cell_section, para_env=para_env)
302 16 : use_mm_spline = mm_cell%orthorhombic
303 : END IF
304 34 : IF (use_qm_spline .OR. use_mm_spline) THEN
305 32 : CALL section_vals_val_get(multipole_section, "ngrids", i_vals=ngrids)
306 128 : npts = ngrids
307 32 : grid_print_section => section_vals_get_subs_vals(force_env_section, "PRINT%GRID_INFORMATION")
308 :
309 32 : IF (use_qm_spline) THEN
310 32 : NULLIFY (LG, gx, gy, gz)
311 416 : hmat = qm_cell%hmat
312 32 : CALL eval_lg(multipole_section, hmat, LG, gx, gy, gz)
313 : CALL Setup_Ewald_Spline(pw_grid=cp_ddapc_ewald%pw_grid_qm, pw_pool=cp_ddapc_ewald%pw_pool_qm, &
314 : coeff=cp_ddapc_ewald%coeff_qm, LG=LG, gx=gx, gy=gy, gz=gz, hmat=hmat, npts=npts, &
315 : param_section=multipole_section, tag="ddapc", &
316 32 : print_section=grid_print_section)
317 32 : DEALLOCATE (LG)
318 32 : DEALLOCATE (gx)
319 32 : DEALLOCATE (gy)
320 32 : DEALLOCATE (gz)
321 : END IF
322 32 : IF (use_mm_spline) THEN
323 16 : NULLIFY (LG, gx, gy, gz)
324 208 : hmat = mm_cell%hmat
325 16 : CALL eval_lg(multipole_section, hmat, LG, gx, gy, gz)
326 : CALL Setup_Ewald_Spline(pw_grid=cp_ddapc_ewald%pw_grid_mm, pw_pool=cp_ddapc_ewald%pw_pool_mm, &
327 : coeff=cp_ddapc_ewald%coeff_mm, LG=LG, gx=gx, gy=gy, gz=gz, hmat=hmat, npts=npts, &
328 : param_section=multipole_section, tag="ddapc", &
329 16 : print_section=grid_print_section)
330 16 : DEALLOCATE (LG)
331 16 : DEALLOCATE (gx)
332 16 : DEALLOCATE (gy)
333 16 : DEALLOCATE (gz)
334 : END IF
335 : END IF
336 34 : IF (cp_ddapc_ewald%do_qmmm_periodic_decpl) THEN
337 16 : CALL cell_release(dummy_cell)
338 16 : CALL cell_release(mm_cell)
339 : END IF
340 : END IF
341 : END IF
342 8430 : END SUBROUTINE cp_ddapc_ewald_create
343 :
344 : ! **************************************************************************************************
345 : !> \brief ...
346 : !> \param multipole_section ...
347 : !> \param hmat ...
348 : !> \param LG ...
349 : !> \param gx ...
350 : !> \param gy ...
351 : !> \param gz ...
352 : !> \par History
353 : !> none
354 : !> \author Teodoro Laino - [tlaino]
355 : ! **************************************************************************************************
356 48 : SUBROUTINE eval_lg(multipole_section, hmat, LG, gx, gy, gz)
357 : TYPE(section_vals_type), POINTER :: multipole_section
358 : REAL(KIND=dp), INTENT(IN) :: hmat(3, 3)
359 : REAL(KIND=dp), DIMENSION(:), POINTER :: LG, gx, gy, gz
360 :
361 : INTEGER :: i, k1, k2, k3, n_rep, ndim, nmax1, &
362 : nmax2, nmax3
363 : REAL(KIND=dp) :: alpha, deth, eps, fac, fs, fvec(3), &
364 : galpha, gsq, gsqi, rcut, tol, tol1
365 :
366 48 : deth = ABS(det_3x3(hmat))
367 48 : rcut = MIN(hmat(1, 1), hmat(2, 2), hmat(3, 3))/2.0_dp
368 48 : CALL section_vals_val_get(multipole_section, "RCUT", n_rep_val=n_rep)
369 48 : IF (n_rep == 1) CALL section_vals_val_get(multipole_section, "RCUT", r_val=rcut)
370 48 : CALL section_vals_val_get(multipole_section, "EWALD_PRECISION", r_val=eps)
371 48 : eps = MIN(ABS(eps), 0.5_dp)
372 48 : tol = SQRT(ABS(LOG(eps*rcut)))
373 48 : alpha = SQRT(ABS(LOG(eps*rcut*tol)))/rcut
374 48 : galpha = 1.0_dp/(4.0_dp*alpha*alpha)
375 48 : tol1 = SQRT(-LOG(eps*rcut*(2.0_dp*tol*alpha)**2))
376 48 : nmax1 = NINT(0.25_dp + hmat(1, 1)*alpha*tol1/pi)
377 48 : nmax2 = NINT(0.25_dp + hmat(2, 2)*alpha*tol1/pi)
378 48 : nmax3 = NINT(0.25_dp + hmat(3, 3)*alpha*tol1/pi)
379 48 : fac = 1.e0_dp/deth
380 192 : fvec = 2.0_dp*pi/[hmat(1, 1), hmat(2, 2), hmat(3, 3)]
381 48 : ndim = (nmax1 + 1)*(2*nmax2 + 1)*(2*nmax3 + 1) - 1
382 144 : ALLOCATE (LG(ndim))
383 96 : ALLOCATE (gx(ndim))
384 96 : ALLOCATE (gy(ndim))
385 96 : ALLOCATE (gz(ndim))
386 :
387 48 : i = 0
388 306 : DO k1 = 0, nmax1
389 3524 : DO k2 = -nmax2, nmax2
390 49630 : DO k3 = -nmax3, nmax3
391 46154 : IF (k1 == 0 .AND. k2 == 0 .AND. k3 == 0) CYCLE
392 46106 : i = i + 1
393 46106 : fs = 2.0_dp; IF (k1 == 0) fs = 1.0_dp
394 46106 : gx(i) = fvec(1)*REAL(k1, KIND=dp)
395 46106 : gy(i) = fvec(2)*REAL(k2, KIND=dp)
396 46106 : gz(i) = fvec(3)*REAL(k3, KIND=dp)
397 46106 : gsq = gx(i)*gx(i) + gy(i)*gy(i) + gz(i)*gz(i)
398 46106 : gsqi = fs/gsq
399 49372 : LG(i) = fac*gsqi*EXP(-galpha*gsq)
400 : END DO
401 : END DO
402 : END DO
403 :
404 96 : END SUBROUTINE eval_lg
405 :
406 : ! **************************************************************************************************
407 : !> \brief ...
408 : !> \param cp_ddapc_ewald ...
409 : !> \par History
410 : !> none
411 : !> \author Teodoro Laino - [tlaino]
412 : ! **************************************************************************************************
413 8439 : SUBROUTINE cp_ddapc_ewald_release(cp_ddapc_ewald)
414 : TYPE(cp_ddapc_ewald_type), POINTER :: cp_ddapc_ewald
415 :
416 8439 : IF (ASSOCIATED(cp_ddapc_ewald)) THEN
417 8430 : IF (ASSOCIATED(cp_ddapc_ewald%coeff_qm)) THEN
418 32 : CALL cp_ddapc_ewald%pw_pool_qm%give_back_pw(cp_ddapc_ewald%coeff_qm)
419 32 : DEALLOCATE (cp_ddapc_ewald%coeff_qm)
420 : END IF
421 8430 : IF (ASSOCIATED(cp_ddapc_ewald%coeff_mm)) THEN
422 16 : CALL cp_ddapc_ewald%pw_pool_mm%give_back_pw(cp_ddapc_ewald%coeff_mm)
423 16 : DEALLOCATE (cp_ddapc_ewald%coeff_mm)
424 : END IF
425 8430 : IF (ASSOCIATED(cp_ddapc_ewald%pw_pool_qm)) THEN
426 32 : CALL pw_pool_release(cp_ddapc_ewald%pw_pool_qm)
427 32 : CPASSERT(.NOT. ASSOCIATED(cp_ddapc_ewald%pw_pool_qm))
428 : END IF
429 8430 : IF (ASSOCIATED(cp_ddapc_ewald%pw_pool_mm)) THEN
430 16 : CALL pw_pool_release(cp_ddapc_ewald%pw_pool_mm)
431 16 : CPASSERT(.NOT. ASSOCIATED(cp_ddapc_ewald%pw_pool_mm))
432 : END IF
433 8430 : IF (ASSOCIATED(cp_ddapc_ewald%pw_grid_qm)) THEN
434 32 : CALL pw_grid_release(cp_ddapc_ewald%pw_grid_qm)
435 32 : CPASSERT(.NOT. ASSOCIATED(cp_ddapc_ewald%pw_grid_qm))
436 : END IF
437 8430 : IF (ASSOCIATED(cp_ddapc_ewald%pw_grid_mm)) THEN
438 16 : CALL pw_grid_release(cp_ddapc_ewald%pw_grid_mm)
439 16 : CPASSERT(.NOT. ASSOCIATED(cp_ddapc_ewald%pw_grid_mm))
440 : END IF
441 8430 : DEALLOCATE (cp_ddapc_ewald)
442 : END IF
443 :
444 8439 : END SUBROUTINE cp_ddapc_ewald_release
445 :
446 0 : END MODULE cp_ddapc_types
|