Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Calculates Nabla V_KS (local part if PSP) on the different grids
10 : !> \par History
11 : !> created 06-2007 [RD]
12 : !> \author RD
13 : ! **************************************************************************************************
14 : MODULE qs_linres_epr_nablavks
15 : USE atomic_kind_types, ONLY: atomic_kind_type,&
16 : get_atomic_kind
17 : USE cell_types, ONLY: cell_type
18 : USE cp_control_types, ONLY: dft_control_type
19 : USE cp_dbcsr_api, ONLY: dbcsr_p_type
20 : USE cp_log_handling, ONLY: cp_get_default_logger,&
21 : cp_logger_type
22 : USE cp_output_handling, ONLY: cp_p_file,&
23 : cp_print_key_finished_output,&
24 : cp_print_key_should_output,&
25 : cp_print_key_unit_nr
26 : USE cp_realspace_grid_cube, ONLY: cp_pw_to_cube
27 : USE external_potential_types, ONLY: all_potential_type,&
28 : get_potential,&
29 : gth_potential_type,&
30 : sgp_potential_type
31 : USE hartree_local_methods, ONLY: calculate_Vh_1center
32 : USE input_section_types, ONLY: section_get_ivals,&
33 : section_vals_get_subs_vals,&
34 : section_vals_type,&
35 : section_vals_val_get
36 : USE kinds, ONLY: default_string_length,&
37 : dp
38 : USE mathconstants, ONLY: rootpi,&
39 : twopi
40 : USE message_passing, ONLY: mp_para_env_type
41 : USE particle_list_types, ONLY: particle_list_type
42 : USE particle_types, ONLY: particle_type
43 : USE pw_env_types, ONLY: pw_env_get,&
44 : pw_env_type
45 : USE pw_methods, ONLY: pw_axpy,&
46 : pw_copy,&
47 : pw_derive,&
48 : pw_transfer,&
49 : pw_zero
50 : USE pw_poisson_methods, ONLY: pw_poisson_solve
51 : USE pw_poisson_types, ONLY: pw_poisson_type
52 : USE pw_pool_types, ONLY: pw_pool_type
53 : USE pw_types, ONLY: pw_c1d_gs_type,&
54 : pw_r3d_rs_type
55 : USE qs_environment_types, ONLY: get_qs_env,&
56 : qs_environment_type
57 : USE qs_gapw_densities, ONLY: prepare_gapw_den
58 : USE qs_grid_atom, ONLY: grid_atom_type
59 : USE qs_harmonics_atom, ONLY: harmonics_atom_type
60 : USE qs_kind_types, ONLY: get_qs_kind,&
61 : qs_kind_type
62 : USE qs_ks_methods, ONLY: calc_rho_tot_gspace
63 : USE qs_ks_types, ONLY: qs_ks_env_type
64 : USE qs_linres_types, ONLY: epr_env_type,&
65 : get_epr_env,&
66 : nablavks_atom_type
67 : ! R0
68 : USE qs_local_rho_types, ONLY: rhoz_type
69 : USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
70 : USE qs_oce_types, ONLY: oce_matrix_type
71 : USE qs_rho0_types, ONLY: rho0_atom_type
72 : USE qs_rho_atom_methods, ONLY: calculate_rho_atom_coeff
73 : USE qs_rho_atom_types, ONLY: get_rho_atom,&
74 : rho_atom_coeff,&
75 : rho_atom_type
76 : ! R0
77 : USE qs_rho_types, ONLY: qs_rho_get,&
78 : qs_rho_p_type,&
79 : qs_rho_type
80 : USE qs_subsys_types, ONLY: qs_subsys_get,&
81 : qs_subsys_type
82 : USE qs_vxc, ONLY: qs_vxc_create
83 : USE qs_vxc_atom, ONLY: calculate_vxc_atom
84 : USE util, ONLY: get_limit
85 : #include "./base/base_uses.f90"
86 :
87 : IMPLICIT NONE
88 :
89 : PRIVATE
90 : PUBLIC :: epr_nablavks
91 :
92 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_linres_epr_nablavks'
93 :
94 : CONTAINS
95 :
96 : ! **************************************************************************************************
97 : !> \brief Evaluates Nabla V_KS on the grids
98 : !> \param epr_env ...
99 : !> \param qs_env ...
100 : !> \par History
101 : !> 06.2006 created [RD]
102 : !> \author RD
103 : ! **************************************************************************************************
104 14 : SUBROUTINE epr_nablavks(epr_env, qs_env)
105 :
106 : TYPE(epr_env_type) :: epr_env
107 : TYPE(qs_environment_type), POINTER :: qs_env
108 :
109 : CHARACTER(LEN=default_string_length) :: ext, filename
110 : COMPLEX(KIND=dp) :: gtemp
111 : INTEGER :: bo_atom(2), ia, iat, iatom, idir, iexp, &
112 : ig, ikind, ir, iso, ispin, ix, iy, iz, &
113 : natom, nexp_ppl, nkind, nspins, &
114 : output_unit, unit_nr
115 : INTEGER, DIMENSION(2, 3) :: bo
116 14 : INTEGER, DIMENSION(:), POINTER :: atom_list
117 : LOGICAL :: gapw, gapw_xc, gth_gspace, ionode, &
118 : make_soft, mpi_io, paw_atom
119 : REAL(KIND=dp) :: alpha, alpha_core, arg, charge, ehartree, exc, exc1, exp_rap, &
120 : gapw_max_alpha, hard_radius, hard_value, soft_value, sqrt_alpha, sqrt_rap
121 14 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: vh1_rad_h, vh1_rad_s
122 : REAL(KIND=dp), DIMENSION(3) :: rap, ratom, roffset, rpoint
123 14 : REAL(KIND=dp), DIMENSION(:), POINTER :: cexp_ppl, rho_rad_z
124 14 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: rho_rad_0
125 : TYPE(all_potential_type), POINTER :: all_potential
126 14 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
127 : TYPE(cell_type), POINTER :: cell
128 : TYPE(cp_logger_type), POINTER :: logger
129 14 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: rho_ao
130 : TYPE(dft_control_type), POINTER :: dft_control
131 : TYPE(grid_atom_type), POINTER :: grid_atom
132 : TYPE(gth_potential_type), POINTER :: gth_potential
133 : TYPE(harmonics_atom_type), POINTER :: harmonics
134 : TYPE(mp_para_env_type), POINTER :: para_env
135 14 : TYPE(nablavks_atom_type), DIMENSION(:), POINTER :: nablavks_atom_set
136 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
137 14 : POINTER :: sab
138 : TYPE(oce_matrix_type), POINTER :: oce
139 : TYPE(particle_list_type), POINTER :: particles
140 14 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
141 : TYPE(pw_c1d_gs_type) :: rho_tot_gspace, v_coulomb_gspace, &
142 : v_coulomb_gtemp, v_hartree_gspace, &
143 : v_hartree_gtemp, v_xc_gtemp
144 : TYPE(pw_env_type), POINTER :: pw_env
145 : TYPE(pw_poisson_type), POINTER :: poisson_env
146 : TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
147 : TYPE(pw_r3d_rs_type) :: v_coulomb_rtemp, v_hartree_rtemp, &
148 : v_xc_rtemp, wf_r
149 14 : TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho2_r, rho_r, v_rspace_new, &
150 14 : v_tau_rspace
151 : TYPE(pw_r3d_rs_type), POINTER :: pwx, pwy, pwz
152 14 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
153 : TYPE(qs_ks_env_type), POINTER :: ks_env
154 14 : TYPE(qs_rho_p_type), DIMENSION(:, :), POINTER :: nablavks_set
155 : TYPE(qs_rho_type), POINTER :: rho, rho_xc
156 : TYPE(qs_subsys_type), POINTER :: subsys
157 14 : TYPE(rho0_atom_type), DIMENSION(:), POINTER :: rho0_atom_set
158 14 : TYPE(rho_atom_coeff), DIMENSION(:), POINTER :: rho_rad_h, rho_rad_s
159 14 : TYPE(rho_atom_coeff), DIMENSION(:, :), POINTER :: nablavks_vec_rad_h, nablavks_vec_rad_s
160 14 : TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set
161 : TYPE(rho_atom_type), POINTER :: rho_atom
162 14 : TYPE(rhoz_type), DIMENSION(:), POINTER :: rhoz_set
163 : TYPE(section_vals_type), POINTER :: g_section, input, lr_section, xc_section
164 : TYPE(sgp_potential_type), POINTER :: sgp_potential
165 :
166 : ! R0
167 : ! R0
168 : ! R0
169 : ! R0
170 : ! R0
171 : ! R0
172 :
173 14 : NULLIFY (auxbas_pw_pool)
174 14 : NULLIFY (cell)
175 14 : NULLIFY (dft_control)
176 14 : NULLIFY (g_section)
177 14 : NULLIFY (logger)
178 14 : NULLIFY (lr_section)
179 14 : NULLIFY (nablavks_set)
180 14 : NULLIFY (nablavks_atom_set) ! R0
181 14 : NULLIFY (nablavks_vec_rad_h) ! R0
182 14 : NULLIFY (nablavks_vec_rad_s) ! R0
183 14 : NULLIFY (para_env)
184 14 : NULLIFY (particle_set)
185 14 : NULLIFY (particles)
186 14 : NULLIFY (poisson_env)
187 14 : NULLIFY (pw_env)
188 14 : NULLIFY (pwx) ! R0
189 14 : NULLIFY (pwy) ! R0
190 14 : NULLIFY (pwz) ! R0
191 14 : NULLIFY (rho)
192 14 : NULLIFY (rho_xc)
193 14 : NULLIFY (rho0_atom_set)
194 14 : NULLIFY (rho_atom_set)
195 14 : NULLIFY (rhoz_set)
196 14 : NULLIFY (subsys)
197 14 : NULLIFY (v_rspace_new)
198 14 : NULLIFY (v_tau_rspace)
199 14 : NULLIFY (xc_section)
200 14 : NULLIFY (input)
201 14 : NULLIFY (ks_env)
202 14 : NULLIFY (rho_r, rho_ao, rho1_r, rho2_r)
203 14 : NULLIFY (oce, qs_kind_set, sab)
204 :
205 28 : logger => cp_get_default_logger()
206 14 : lr_section => section_vals_get_subs_vals(qs_env%input, "PROPERTIES%LINRES")
207 : ionode = logger%para_env%is_source()
208 :
209 : output_unit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
210 14 : extension=".linresLog")
211 :
212 : ! -------------------------------------
213 : ! Read settings
214 : ! -------------------------------------
215 :
216 : g_section => section_vals_get_subs_vals(lr_section, &
217 14 : "EPR%PRINT%G_TENSOR")
218 :
219 14 : CALL section_vals_val_get(g_section, "gapw_max_alpha", r_val=gapw_max_alpha)
220 :
221 14 : gth_gspace = .TRUE.
222 :
223 : ! -------------------------------------
224 : ! Get nablavks arrays
225 : ! -------------------------------------
226 :
227 : CALL get_epr_env(epr_env, nablavks_set=nablavks_set, & ! R0
228 14 : nablavks_atom_set=nablavks_atom_set) ! R0
229 : ! R0
230 :
231 42 : DO ispin = 1, SIZE(nablavks_set, 2)
232 126 : DO idir = 1, SIZE(nablavks_set, 1)
233 84 : CALL qs_rho_get(nablavks_set(idir, ispin)%rho, rho_r=rho_r)
234 112 : CALL pw_zero(rho_r(1))
235 : END DO
236 : END DO
237 :
238 14 : CALL qs_rho_get(nablavks_set(1, 1)%rho, rho_r=rho_r)
239 14 : pwx => rho_r(1)
240 14 : CALL qs_rho_get(nablavks_set(2, 1)%rho, rho_r=rho_r)
241 14 : pwy => rho_r(1)
242 14 : CALL qs_rho_get(nablavks_set(3, 1)%rho, rho_r=rho_r)
243 14 : pwz => rho_r(1)
244 :
245 56 : roffset = -REAL(MODULO(pwx%pw_grid%npts, 2), dp)*pwx%pw_grid%dr/2.0_dp
246 :
247 : ! -------------------------------------
248 : ! Get grids / atom info
249 : ! -------------------------------------
250 :
251 : CALL get_qs_env(qs_env=qs_env, &
252 : atomic_kind_set=atomic_kind_set, &
253 : qs_kind_set=qs_kind_set, &
254 : input=input, &
255 : cell=cell, &
256 : dft_control=dft_control, &
257 : para_env=para_env, &
258 : particle_set=particle_set, &
259 : pw_env=pw_env, &
260 : rho=rho, &
261 : rho_xc=rho_xc, &
262 : rho_atom_set=rho_atom_set, &
263 : rho0_atom_set=rho0_atom_set, &
264 : rhoz_set=rhoz_set, &
265 : subsys=subsys, &
266 : ks_env=ks_env, &
267 14 : oce=oce, sab_orb=sab)
268 :
269 : CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
270 14 : poisson_env=poisson_env)
271 :
272 14 : CALL qs_subsys_get(subsys, particles=particles)
273 :
274 14 : gapw = dft_control%qs_control%gapw
275 14 : gapw_xc = dft_control%qs_control%gapw_xc
276 14 : nkind = SIZE(atomic_kind_set)
277 14 : nspins = dft_control%nspins
278 :
279 : ! -------------------------------------
280 : ! Add Hartree potential
281 : ! -------------------------------------
282 :
283 14 : CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
284 14 : CALL auxbas_pw_pool%create_pw(v_hartree_gtemp)
285 14 : CALL auxbas_pw_pool%create_pw(v_hartree_rtemp)
286 14 : CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
287 :
288 14 : IF (gapw) THEN
289 : ! need to rebuild the coeff !
290 10 : CALL qs_rho_get(rho, rho_ao_kp=rho_ao)
291 10 : CALL calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
292 :
293 10 : CALL prepare_gapw_den(qs_env, do_rho0=.TRUE.)
294 : END IF
295 :
296 14 : CALL pw_zero(rho_tot_gspace)
297 :
298 : CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, &
299 14 : skip_nuclear_density=.NOT. gapw)
300 :
301 : CALL pw_poisson_solve(poisson_env, rho_tot_gspace, ehartree, &
302 14 : v_hartree_gspace)
303 :
304 : ! -------------------------------------
305 : ! Atomic grids part
306 : ! -------------------------------------
307 :
308 14 : IF (gapw) THEN
309 :
310 30 : DO ikind = 1, nkind ! loop over atom types
311 :
312 20 : NULLIFY (atom_list)
313 20 : NULLIFY (grid_atom)
314 20 : NULLIFY (harmonics)
315 : NULLIFY (rho_rad_z)
316 :
317 20 : rho_rad_z => rhoz_set(ikind)%r_coef
318 :
319 20 : CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
320 : CALL get_qs_kind(qs_kind_set(ikind), &
321 : grid_atom=grid_atom, &
322 : harmonics=harmonics, &
323 : hard_radius=hard_radius, &
324 : paw_atom=paw_atom, &
325 : zeff=charge, &
326 20 : alpha_core_charge=alpha_core)
327 :
328 30 : IF (paw_atom) THEN
329 :
330 80 : ALLOCATE (vh1_rad_h(grid_atom%nr, harmonics%max_iso_not0))
331 60 : ALLOCATE (vh1_rad_s(grid_atom%nr, harmonics%max_iso_not0))
332 :
333 : ! DO iat = 1, natom ! natom = # atoms for ikind
334 : !
335 : ! iatom = atom_list(iat)
336 : ! ratom = particle_set(iatom)%r
337 : !
338 : ! DO ig = v_hartree_gspace%pw_grid%first_gne0,v_hartree_gspace%pw_grid%ngpts_cut_local
339 : !
340 : ! gtemp = fourpi * charge / cell%deth * &
341 : ! EXP ( - v_hartree_gspace%pw_grid%gsq(ig) / (4.0_dp * alpha_core) ) &
342 : ! / v_hartree_gspace%pw_grid%gsq(ig)
343 : !
344 : ! arg = DOT_PRODUCT(v_hartree_gspace%pw_grid%g(:,ig),ratom)
345 : !
346 : ! gtemp = gtemp * CMPLX(COS(arg),-SIN(arg),KIND=dp)
347 : !
348 : ! v_hartree_gspace%array(ig) = v_hartree_gspace%array(ig) + gtemp
349 : ! END DO
350 : ! IF ( v_hartree_gspace%pw_grid%have_g0 ) v_hartree_gspace%array(1) = 0.0_dp
351 : !
352 : ! END DO
353 :
354 20 : bo_atom = get_limit(natom, para_env%num_pe, para_env%mepos)
355 :
356 35 : DO iat = bo_atom(1), bo_atom(2) ! natomkind = # atoms for ikind
357 :
358 15 : iatom = atom_list(iat)
359 60 : ratom = particle_set(iatom)%r
360 :
361 15 : nablavks_vec_rad_h => nablavks_atom_set(iatom)%nablavks_vec_rad_h
362 15 : nablavks_vec_rad_s => nablavks_atom_set(iatom)%nablavks_vec_rad_s
363 :
364 45 : DO ispin = 1, nspins
365 135 : DO idir = 1, 3
366 229590 : nablavks_vec_rad_h(idir, ispin)%r_coef(:, :) = 0.0_dp
367 229620 : nablavks_vec_rad_s(idir, ispin)%r_coef(:, :) = 0.0_dp
368 : END DO ! idir
369 : END DO ! ispin
370 :
371 15 : rho_atom => rho_atom_set(iatom)
372 15 : NULLIFY (rho_rad_h, rho_rad_s, rho_rad_0)
373 : CALL get_rho_atom(rho_atom=rho_atom, rho_rad_h=rho_rad_h, &
374 15 : rho_rad_s=rho_rad_s)
375 15 : rho_rad_0 => rho0_atom_set(iatom)%rho0_rad_h%r_coef
376 9348 : vh1_rad_h = 0.0_dp
377 9348 : vh1_rad_s = 0.0_dp
378 :
379 15 : CALL calculate_Vh_1center(vh1_rad_h, vh1_rad_s, rho_rad_h, rho_rad_s, rho_rad_0, rho_rad_z, grid_atom)
380 :
381 750 : DO ir = 2, grid_atom%nr
382 :
383 735 : IF (grid_atom%rad(ir) >= hard_radius) CYCLE
384 :
385 21435 : DO ia = 1, grid_atom%ng_sphere
386 :
387 : ! hard part
388 :
389 84000 : DO idir = 1, 3
390 63000 : hard_value = 0.0_dp
391 831600 : DO iso = 1, harmonics%max_iso_not0
392 : hard_value = hard_value + &
393 : vh1_rad_h(ir, iso)*harmonics%dslm_dxyz(idir, ia, iso) + &
394 : harmonics%slm(ia, iso)* &
395 : (vh1_rad_h(ir - 1, iso) - vh1_rad_h(ir, iso))/ &
396 : (grid_atom%rad(ir - 1) - grid_atom%rad(ir))* &
397 831600 : (harmonics%a(idir, ia))
398 : END DO
399 84000 : nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) = hard_value
400 : END DO
401 :
402 : ! soft part
403 :
404 84735 : DO idir = 1, 3
405 63000 : soft_value = 0.0_dp
406 831600 : DO iso = 1, harmonics%max_iso_not0
407 : soft_value = soft_value + &
408 : vh1_rad_s(ir, iso)*harmonics%dslm_dxyz(idir, ia, iso) + &
409 : harmonics%slm(ia, iso)* &
410 : (vh1_rad_s(ir - 1, iso) - vh1_rad_s(ir, iso))/ &
411 : (grid_atom%rad(ir - 1) - grid_atom%rad(ir))* &
412 831600 : (harmonics%a(idir, ia))
413 : END DO
414 84000 : nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) = soft_value
415 : END DO
416 :
417 : END DO ! ia
418 :
419 : END DO ! ir
420 :
421 80 : DO idir = 1, 3
422 114795 : nablavks_vec_rad_h(idir, 2)%r_coef(:, :) = nablavks_vec_rad_h(idir, 1)%r_coef(:, :)
423 114810 : nablavks_vec_rad_s(idir, 2)%r_coef(:, :) = nablavks_vec_rad_s(idir, 1)%r_coef(:, :)
424 : END DO
425 :
426 : END DO ! iat
427 :
428 20 : DEALLOCATE (vh1_rad_h)
429 20 : DEALLOCATE (vh1_rad_s)
430 :
431 : END IF ! paw_atom
432 :
433 : END DO ! ikind
434 :
435 : END IF ! gapw
436 :
437 14 : CALL pw_copy(v_hartree_gspace, v_hartree_gtemp)
438 14 : CALL pw_derive(v_hartree_gtemp, (/1, 0, 0/))
439 14 : CALL pw_transfer(v_hartree_gtemp, v_hartree_rtemp)
440 14 : CALL pw_copy(v_hartree_rtemp, pwx)
441 :
442 14 : CALL pw_copy(v_hartree_gspace, v_hartree_gtemp)
443 14 : CALL pw_derive(v_hartree_gtemp, (/0, 1, 0/))
444 14 : CALL pw_transfer(v_hartree_gtemp, v_hartree_rtemp)
445 14 : CALL pw_copy(v_hartree_rtemp, pwy)
446 :
447 14 : CALL pw_copy(v_hartree_gspace, v_hartree_gtemp)
448 14 : CALL pw_derive(v_hartree_gtemp, (/0, 0, 1/))
449 14 : CALL pw_transfer(v_hartree_gtemp, v_hartree_rtemp)
450 14 : CALL pw_copy(v_hartree_rtemp, pwz)
451 :
452 14 : CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
453 14 : CALL auxbas_pw_pool%give_back_pw(v_hartree_gtemp)
454 14 : CALL auxbas_pw_pool%give_back_pw(v_hartree_rtemp)
455 14 : CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
456 :
457 : ! -------------------------------------
458 : ! Add Coulomb potential
459 : ! -------------------------------------
460 :
461 42 : DO ikind = 1, nkind ! loop over atom types
462 :
463 28 : NULLIFY (atom_list)
464 28 : NULLIFY (grid_atom)
465 28 : NULLIFY (harmonics)
466 :
467 28 : CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
468 : CALL get_qs_kind(qs_kind_set(ikind), &
469 : grid_atom=grid_atom, &
470 : harmonics=harmonics, &
471 : hard_radius=hard_radius, &
472 : gth_potential=gth_potential, &
473 : sgp_potential=sgp_potential, &
474 : all_potential=all_potential, &
475 28 : paw_atom=paw_atom)
476 :
477 42 : IF (ASSOCIATED(gth_potential)) THEN
478 :
479 12 : NULLIFY (cexp_ppl)
480 :
481 : CALL get_potential(potential=gth_potential, &
482 : zeff=charge, &
483 : alpha_ppl=alpha, &
484 : nexp_ppl=nexp_ppl, &
485 12 : cexp_ppl=cexp_ppl)
486 :
487 12 : sqrt_alpha = SQRT(alpha)
488 :
489 12 : IF (gapw .AND. paw_atom .AND. alpha > gapw_max_alpha) THEN
490 : make_soft = .TRUE.
491 : ELSE
492 8 : make_soft = .FALSE.
493 : END IF
494 :
495 : ! -------------------------------------
496 : ! PW grid part
497 : ! -------------------------------------
498 :
499 : IF (gth_gspace) THEN
500 :
501 12 : CALL auxbas_pw_pool%create_pw(v_coulomb_gspace)
502 12 : CALL auxbas_pw_pool%create_pw(v_coulomb_gtemp)
503 12 : CALL auxbas_pw_pool%create_pw(v_coulomb_rtemp)
504 :
505 12 : CALL pw_zero(v_coulomb_gspace)
506 :
507 30 : DO iat = 1, natom ! natom = # atoms for ikind
508 :
509 18 : iatom = atom_list(iat)
510 72 : ratom = particle_set(iatom)%r
511 :
512 820134 : DO ig = v_coulomb_gspace%pw_grid%first_gne0, v_coulomb_gspace%pw_grid%ngpts_cut_local
513 820116 : gtemp = 0.0_dp
514 : ! gtemp = - fourpi * charge / cell%deth * &
515 : ! EXP ( - v_coulomb_gspace%pw_grid%gsq(ig) / (4.0_dp * alpha) ) &
516 : ! / v_coulomb_gspace%pw_grid%gsq(ig)
517 :
518 820116 : IF (.NOT. make_soft) THEN
519 :
520 0 : SELECT CASE (nexp_ppl)
521 : CASE (1)
522 : gtemp = gtemp + &
523 : (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
524 : EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
525 : ! C1
526 : +cexp_ppl(1) &
527 0 : )
528 : CASE (2)
529 : gtemp = gtemp + &
530 : (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
531 : EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
532 : ! C1
533 : +cexp_ppl(1) &
534 : ! C2
535 : + cexp_ppl(2)/(2.0_dp*alpha)* &
536 : (3.0_dp - v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha)) &
537 546744 : )
538 : CASE (3)
539 : gtemp = gtemp + &
540 : (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
541 : EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
542 : ! C1
543 : +cexp_ppl(1) &
544 : ! C2
545 : + cexp_ppl(2)/(2.0_dp*alpha)* &
546 : (3.0_dp - v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha)) &
547 : ! C3
548 : + cexp_ppl(3)/(2.0_dp*alpha)**2* &
549 : (15.0_dp - 10.0_dp*v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha) &
550 : + (v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**2) &
551 0 : )
552 : CASE (4)
553 : gtemp = gtemp + &
554 : (twopi)**(1.5_dp)/(cell%deth*(2.0_dp*alpha)**(1.5_dp))* &
555 : EXP(-v_coulomb_gspace%pw_grid%gsq(ig)/(4.0_dp*alpha))*( &
556 : ! C1
557 : +cexp_ppl(1) &
558 : ! C2
559 : + cexp_ppl(2)/(2.0_dp*alpha)* &
560 : (3.0_dp - v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha)) &
561 : ! C3
562 : + cexp_ppl(3)/(2.0_dp*alpha)**2* &
563 : (15.0_dp - 10.0_dp*v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha) &
564 : + (v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**2) &
565 : ! C4
566 : + cexp_ppl(4)/(2.0_dp*alpha)**3* &
567 : (105.0_dp - 105.0_dp*v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha) &
568 : + 21.0_dp*(v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**2 &
569 : - (v_coulomb_gspace%pw_grid%gsq(ig)/(2.0_dp*alpha))**3) &
570 546744 : )
571 : END SELECT
572 :
573 : END IF
574 :
575 3280464 : arg = DOT_PRODUCT(v_coulomb_gspace%pw_grid%g(:, ig), ratom)
576 :
577 820116 : gtemp = gtemp*CMPLX(COS(arg), -SIN(arg), KIND=dp)
578 820134 : v_coulomb_gspace%array(ig) = v_coulomb_gspace%array(ig) + gtemp
579 : END DO
580 30 : IF (v_coulomb_gspace%pw_grid%have_g0) v_coulomb_gspace%array(1) = 0.0_dp
581 :
582 : END DO
583 :
584 12 : CALL pw_copy(v_coulomb_gspace, v_coulomb_gtemp)
585 12 : CALL pw_derive(v_coulomb_gtemp, (/1, 0, 0/))
586 12 : CALL pw_transfer(v_coulomb_gtemp, v_coulomb_rtemp)
587 12 : CALL pw_axpy(v_coulomb_rtemp, pwx)
588 :
589 12 : CALL pw_copy(v_coulomb_gspace, v_coulomb_gtemp)
590 12 : CALL pw_derive(v_coulomb_gtemp, (/0, 1, 0/))
591 12 : CALL pw_transfer(v_coulomb_gtemp, v_coulomb_rtemp)
592 12 : CALL pw_axpy(v_coulomb_rtemp, pwy)
593 :
594 12 : CALL pw_copy(v_coulomb_gspace, v_coulomb_gtemp)
595 12 : CALL pw_derive(v_coulomb_gtemp, (/0, 0, 1/))
596 12 : CALL pw_transfer(v_coulomb_gtemp, v_coulomb_rtemp)
597 12 : CALL pw_axpy(v_coulomb_rtemp, pwz)
598 :
599 12 : CALL auxbas_pw_pool%give_back_pw(v_coulomb_gspace)
600 12 : CALL auxbas_pw_pool%give_back_pw(v_coulomb_gtemp)
601 12 : CALL auxbas_pw_pool%give_back_pw(v_coulomb_rtemp)
602 : ELSE
603 :
604 : ! Attic of the atomic parallellisation
605 : !
606 : ! bo(2)
607 : ! bo = get_limit(natom, para_env%num_pe, para_env%mepos)
608 : ! DO iat = bo(1),bo(2) ! natom = # atoms for ikind
609 : ! DO ix = lbound(pwx%array,1), ubound(pwx%array,1)
610 : ! DO iy = lbound(pwx%array,2), ubound(pwx%array,2)
611 : ! DO iz = lbound(pwx%array,3), ubound(pwx%array,3)
612 :
613 : bo = pwx%pw_grid%bounds_local
614 :
615 : DO iat = 1, natom ! natom = # atoms for ikind
616 :
617 : iatom = atom_list(iat)
618 : ratom = particle_set(iatom)%r
619 :
620 : DO ix = bo(1, 1), bo(2, 1)
621 : DO iy = bo(1, 2), bo(2, 2)
622 : DO iz = bo(1, 3), bo(2, 3)
623 : rpoint = (/REAL(ix, dp)*pwx%pw_grid%dr(1), &
624 : REAL(iy, dp)*pwx%pw_grid%dr(2), &
625 : REAL(iz, dp)*pwx%pw_grid%dr(3)/)
626 : rpoint = rpoint + roffset
627 : rap = rpoint - ratom
628 : rap(1) = MODULO(rap(1), cell%hmat(1, 1)) - cell%hmat(1, 1)/2._dp
629 : rap(2) = MODULO(rap(2), cell%hmat(2, 2)) - cell%hmat(2, 2)/2._dp
630 : rap(3) = MODULO(rap(3), cell%hmat(3, 3)) - cell%hmat(3, 3)/2._dp
631 : sqrt_rap = SQRT(DOT_PRODUCT(rap, rap))
632 : exp_rap = EXP(-alpha*sqrt_rap**2)
633 : sqrt_rap = MAX(sqrt_rap, 1.e-10_dp)
634 : ! d_x
635 :
636 : pwx%array(ix, iy, iz) = pwx%array(ix, iy, iz) + charge*( &
637 : -2.0_dp*sqrt_alpha*EXP(-sqrt_rap**2*sqrt_alpha**2)*rap(1) &
638 : /(rootpi*sqrt_rap**2) &
639 : + erf(sqrt_rap*sqrt_alpha)*rap(1) &
640 : /sqrt_rap**3)
641 :
642 : ! d_y
643 :
644 : pwy%array(ix, iy, iz) = pwy%array(ix, iy, iz) + charge*( &
645 : -2.0_dp*sqrt_alpha*EXP(-sqrt_rap**2*sqrt_alpha**2)*rap(2) &
646 : /(rootpi*sqrt_rap**2) &
647 : + erf(sqrt_rap*sqrt_alpha)*rap(2) &
648 : /sqrt_rap**3)
649 :
650 : ! d_z
651 :
652 : pwz%array(ix, iy, iz) = pwz%array(ix, iy, iz) + charge*( &
653 : -2.0_dp*sqrt_alpha*EXP(-sqrt_rap**2*sqrt_alpha**2)*rap(3) &
654 : /(rootpi*sqrt_rap**2) &
655 : + erf(sqrt_rap*sqrt_alpha)*rap(3) &
656 : /sqrt_rap**3)
657 :
658 : IF (make_soft) CYCLE
659 :
660 : ! d_x
661 :
662 : DO iexp = 1, nexp_ppl
663 : pwx%array(ix, iy, iz) = pwx%array(ix, iy, iz) + ( &
664 : -2.0_dp*alpha*rap(1)*exp_rap* &
665 : cexp_ppl(iexp)*(sqrt_rap**2)**(iexp - 1))
666 : IF (iexp > 1) THEN
667 : pwx%array(ix, iy, iz) = pwx%array(ix, iy, iz) + ( &
668 : 2.0_dp*exp_rap*cexp_ppl(iexp)* &
669 : (sqrt_rap**2)**(iexp - 2)*REAL(iexp - 1, dp)*rap(1))
670 : END IF
671 : END DO
672 :
673 : ! d_y
674 :
675 : DO iexp = 1, nexp_ppl
676 : pwy%array(ix, iy, iz) = pwy%array(ix, iy, iz) + ( &
677 : -2.0_dp*alpha*rap(2)*exp_rap* &
678 : cexp_ppl(iexp)*(sqrt_rap**2)**(iexp - 1))
679 : IF (iexp > 1) THEN
680 : pwy%array(ix, iy, iz) = pwy%array(ix, iy, iz) + ( &
681 : 2.0_dp*exp_rap*cexp_ppl(iexp)* &
682 : (sqrt_rap**2)**(iexp - 2)*REAL(iexp - 1, dp)*rap(2))
683 : END IF
684 : END DO
685 :
686 : ! d_z
687 :
688 : DO iexp = 1, nexp_ppl
689 : pwz%array(ix, iy, iz) = pwz%array(ix, iy, iz) + ( &
690 : -2.0_dp*alpha*rap(3)*exp_rap* &
691 : cexp_ppl(iexp)*(sqrt_rap**2)**(iexp - 1))
692 : IF (iexp > 1) THEN
693 : pwz%array(ix, iy, iz) = pwz%array(ix, iy, iz) + ( &
694 : 2.0_dp*exp_rap*cexp_ppl(iexp)* &
695 : (sqrt_rap**2)**(iexp - 2)*REAL(iexp - 1, dp)*rap(3))
696 : END IF
697 : END DO
698 :
699 : END DO ! iz
700 : END DO ! iy
701 : END DO ! ix
702 : END DO ! iat
703 : END IF ! gth_gspace
704 :
705 : ! -------------------------------------
706 : ! Atomic grids part
707 : ! -------------------------------------
708 :
709 12 : IF (gapw .AND. paw_atom) THEN
710 :
711 4 : bo_atom = get_limit(natom, para_env%num_pe, para_env%mepos)
712 :
713 7 : DO iat = bo_atom(1), bo_atom(2) ! natom = # atoms for ikind
714 :
715 3 : iatom = atom_list(iat)
716 :
717 3 : nablavks_vec_rad_h => nablavks_atom_set(iatom)%nablavks_vec_rad_h
718 3 : nablavks_vec_rad_s => nablavks_atom_set(iatom)%nablavks_vec_rad_s
719 :
720 153 : DO ir = 1, grid_atom%nr
721 :
722 150 : IF (grid_atom%rad(ir) >= hard_radius) CYCLE
723 :
724 84 : exp_rap = EXP(-alpha*grid_atom%rad(ir)**2)
725 :
726 4287 : DO ia = 1, grid_atom%ng_sphere
727 :
728 16950 : DO idir = 1, 3
729 12600 : hard_value = 0.0_dp
730 : hard_value = charge*( &
731 : -2.0_dp*sqrt_alpha*EXP(-grid_atom%rad(ir)**2*sqrt_alpha**2) &
732 : *grid_atom%rad(ir)*harmonics%a(idir, ia) &
733 : /(rootpi*grid_atom%rad(ir)**2) &
734 : + erf(grid_atom%rad(ir)*sqrt_alpha) &
735 : *grid_atom%rad(ir)*harmonics%a(idir, ia) &
736 12600 : /grid_atom%rad(ir)**3)
737 12600 : soft_value = hard_value
738 37800 : DO iexp = 1, nexp_ppl
739 : hard_value = hard_value + ( &
740 : -2.0_dp*alpha*grid_atom%rad(ir)*harmonics%a(idir, ia) &
741 25200 : *exp_rap*cexp_ppl(iexp)*(grid_atom%rad(ir)**2)**(iexp - 1))
742 37800 : IF (iexp > 1) THEN
743 : hard_value = hard_value + ( &
744 : 2.0_dp*exp_rap*cexp_ppl(iexp) &
745 : *(grid_atom%rad(ir)**2)**(iexp - 2)*REAL(iexp - 1, dp) &
746 12600 : *grid_atom%rad(ir)*harmonics%a(idir, ia))
747 : END IF
748 : END DO
749 : nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) = &
750 12600 : nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) + hard_value
751 16800 : IF (make_soft) THEN
752 : nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) = &
753 12600 : nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) + soft_value
754 : ELSE
755 : nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) = &
756 0 : nablavks_vec_rad_s(idir, 1)%r_coef(ir, ia) + hard_value
757 : END IF
758 : END DO
759 :
760 : END DO ! ia
761 : END DO ! ir
762 :
763 10 : DO ispin = 2, nspins
764 15 : DO idir = 1, 3
765 22959 : nablavks_vec_rad_h(idir, ispin)%r_coef(:, :) = nablavks_vec_rad_h(idir, 1)%r_coef(:, :)
766 22962 : nablavks_vec_rad_s(idir, ispin)%r_coef(:, :) = nablavks_vec_rad_s(idir, 1)%r_coef(:, :)
767 : END DO
768 : END DO
769 :
770 : END DO
771 :
772 : END IF
773 :
774 16 : ELSE IF (ASSOCIATED(sgp_potential)) THEN
775 :
776 0 : CPABORT("EPR with SGP potentials is not implemented")
777 :
778 16 : ELSE IF (ASSOCIATED(all_potential)) THEN
779 :
780 : CALL get_potential(potential=all_potential, &
781 : alpha_core_charge=alpha, &
782 16 : zeff=charge)
783 :
784 16 : sqrt_alpha = SQRT(alpha)
785 :
786 : ! -------------------------------------
787 : ! Atomic grids part
788 : ! -------------------------------------
789 :
790 16 : bo_atom = get_limit(natom, para_env%num_pe, para_env%mepos)
791 :
792 28 : DO iat = bo_atom(1), bo_atom(2) ! natom = # atoms for ikind
793 :
794 12 : iatom = atom_list(iat)
795 :
796 12 : nablavks_vec_rad_h => nablavks_atom_set(iatom)%nablavks_vec_rad_h
797 :
798 612 : DO ir = 1, grid_atom%nr
799 :
800 600 : IF (grid_atom%rad(ir) >= hard_radius) CYCLE
801 :
802 17148 : DO ia = 1, grid_atom%ng_sphere
803 :
804 67800 : DO idir = 1, 3
805 50400 : hard_value = 0.0_dp
806 : hard_value = charge*( &
807 : 2.0_dp*sqrt_alpha*EXP(-grid_atom%rad(ir)**2*sqrt_alpha**2) &
808 : *grid_atom%rad(ir)*harmonics%a(idir, ia) &
809 : /(rootpi*grid_atom%rad(ir)**2) &
810 : + erfc(grid_atom%rad(ir)*sqrt_alpha) &
811 : *grid_atom%rad(ir)*harmonics%a(idir, ia) &
812 50400 : /grid_atom%rad(ir)**3)
813 : nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) = &
814 67200 : nablavks_vec_rad_h(idir, 1)%r_coef(ir, ia) + hard_value
815 : END DO
816 :
817 : END DO ! ia
818 : END DO ! ir
819 :
820 40 : DO ispin = 2, nspins
821 60 : DO idir = 1, 3
822 91848 : nablavks_vec_rad_h(idir, ispin)%r_coef(:, :) = nablavks_vec_rad_h(idir, 1)%r_coef(:, :)
823 : END DO
824 : END DO
825 :
826 : END DO
827 :
828 : ELSE
829 : CYCLE
830 : END IF
831 :
832 : END DO
833 :
834 56 : DO idir = 1, 3
835 42 : CALL qs_rho_get(nablavks_set(idir, 1)%rho, rho_r=rho1_r)
836 42 : CALL qs_rho_get(nablavks_set(idir, 2)%rho, rho_r=rho2_r)
837 56 : CALL pw_copy(rho1_r(1), rho2_r(1))
838 : END DO
839 :
840 : ! -------------------------------------
841 : ! Add V_xc potential
842 : ! -------------------------------------
843 :
844 14 : CALL auxbas_pw_pool%create_pw(v_xc_gtemp)
845 14 : CALL auxbas_pw_pool%create_pw(v_xc_rtemp)
846 :
847 14 : xc_section => section_vals_get_subs_vals(input, "PROPERTIES%LINRES%EPR%PRINT%G_TENSOR%XC")
848 : ! a possible vdW section in xc_section will be ignored
849 :
850 14 : IF (gapw_xc) THEN
851 : CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_xc, xc_section=xc_section, &
852 0 : vxc_rho=v_rspace_new, vxc_tau=v_tau_rspace, exc=exc, just_energy=.FALSE.)
853 : ELSE
854 : CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho, xc_section=xc_section, &
855 14 : vxc_rho=v_rspace_new, vxc_tau=v_tau_rspace, exc=exc, just_energy=.FALSE.)
856 : END IF
857 :
858 14 : IF (ASSOCIATED(v_rspace_new)) THEN
859 :
860 42 : DO ispin = 1, nspins
861 :
862 28 : CALL pw_transfer(v_rspace_new(ispin), v_xc_gtemp)
863 28 : CALL pw_derive(v_xc_gtemp, (/1, 0, 0/))
864 28 : CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
865 28 : CALL qs_rho_get(nablavks_set(1, ispin)%rho, rho_r=rho_r)
866 28 : CALL pw_axpy(v_xc_rtemp, rho_r(1))
867 :
868 28 : CALL pw_transfer(v_rspace_new(ispin), v_xc_gtemp)
869 28 : CALL pw_derive(v_xc_gtemp, (/0, 1, 0/))
870 28 : CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
871 28 : CALL qs_rho_get(nablavks_set(2, ispin)%rho, rho_r=rho_r)
872 28 : CALL pw_axpy(v_xc_rtemp, rho_r(1))
873 :
874 28 : CALL pw_transfer(v_rspace_new(ispin), v_xc_gtemp)
875 28 : CALL pw_derive(v_xc_gtemp, (/0, 0, 1/))
876 28 : CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
877 28 : CALL qs_rho_get(nablavks_set(3, ispin)%rho, rho_r=rho_r)
878 28 : CALL pw_axpy(v_xc_rtemp, rho_r(1))
879 :
880 42 : CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
881 :
882 : END DO
883 :
884 14 : DEALLOCATE (v_rspace_new)
885 : END IF
886 :
887 14 : IF (ASSOCIATED(v_tau_rspace)) THEN
888 :
889 0 : DO ispin = 1, nspins
890 :
891 0 : CALL pw_transfer(v_tau_rspace(ispin), v_xc_gtemp)
892 0 : CALL pw_derive(v_xc_gtemp, (/1, 0, 0/))
893 0 : CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
894 0 : CALL qs_rho_get(nablavks_set(1, ispin)%rho, rho_r=rho_r)
895 0 : CALL pw_axpy(v_xc_rtemp, rho_r(1))
896 :
897 0 : CALL pw_transfer(v_tau_rspace(ispin), v_xc_gtemp)
898 0 : CALL pw_derive(v_xc_gtemp, (/0, 1, 0/))
899 0 : CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
900 0 : CALL qs_rho_get(nablavks_set(2, ispin)%rho, rho_r=rho_r)
901 0 : CALL pw_axpy(v_xc_rtemp, rho_r(1))
902 :
903 0 : CALL pw_transfer(v_tau_rspace(ispin), v_xc_gtemp)
904 0 : CALL pw_derive(v_xc_gtemp, (/0, 0, 1/))
905 0 : CALL pw_transfer(v_xc_gtemp, v_xc_rtemp)
906 0 : CALL qs_rho_get(nablavks_set(3, ispin)%rho, rho_r=rho_r)
907 0 : CALL pw_axpy(v_xc_rtemp, rho_r(1))
908 :
909 0 : CALL auxbas_pw_pool%give_back_pw(v_tau_rspace(ispin))
910 :
911 : END DO
912 :
913 0 : DEALLOCATE (v_tau_rspace)
914 : END IF
915 :
916 14 : CALL auxbas_pw_pool%give_back_pw(v_xc_gtemp)
917 14 : CALL auxbas_pw_pool%give_back_pw(v_xc_rtemp)
918 :
919 14 : IF (gapw .OR. gapw_xc) THEN
920 : CALL calculate_vxc_atom(qs_env=qs_env, energy_only=.FALSE., exc1=exc1, &
921 10 : gradient_atom_set=nablavks_atom_set)
922 : END IF
923 :
924 : ! -------------------------------------
925 : ! Write Nabla V_KS (local) to cubes
926 : ! -------------------------------------
927 :
928 14 : IF (BTEST(cp_print_key_should_output(logger%iter_info, lr_section, &
929 : "EPR%PRINT%NABLAVKS_CUBES"), cp_p_file)) THEN
930 0 : CALL auxbas_pw_pool%create_pw(wf_r)
931 0 : DO idir = 1, 3
932 0 : CALL pw_zero(wf_r)
933 0 : CALL qs_rho_get(nablavks_set(idir, 1)%rho, rho_r=rho_r)
934 0 : CALL pw_copy(rho_r(1), wf_r) ! RA
935 0 : filename = "nablavks"
936 0 : mpi_io = .TRUE.
937 0 : WRITE (ext, '(a2,I1,a5)') "_d", idir, ".cube"
938 : unit_nr = cp_print_key_unit_nr(logger, lr_section, "EPR%PRINT%NABLAVKS_CUBES", &
939 : extension=TRIM(ext), middle_name=TRIM(filename), &
940 : log_filename=.FALSE., file_position="REWIND", &
941 0 : mpi_io=mpi_io)
942 : CALL cp_pw_to_cube(wf_r, unit_nr, "NABLA V_KS ", &
943 : particles=particles, &
944 : stride=section_get_ivals(lr_section, &
945 : "EPR%PRINT%NABLAVKS_CUBES%STRIDE"), &
946 0 : mpi_io=mpi_io)
947 : CALL cp_print_key_finished_output(unit_nr, logger, lr_section, &
948 0 : "EPR%PRINT%NABLAVKS_CUBES", mpi_io=mpi_io)
949 : END DO
950 0 : CALL auxbas_pw_pool%give_back_pw(wf_r)
951 : END IF
952 :
953 : CALL cp_print_key_finished_output(output_unit, logger, lr_section, &
954 14 : "PRINT%PROGRAM_RUN_INFO")
955 :
956 28 : END SUBROUTINE epr_nablavks
957 :
958 : END MODULE qs_linres_epr_nablavks
959 :
|