(git:b77b4be)
Loading...
Searching...
No Matches
pw_env_methods.F
Go to the documentation of this file.
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 methods of pw_env that have dependence on qs_env
10!> \par History
11!> 10.2002 created [fawzi]
12!> JGH (22-Feb-03) PW grid options added
13!> 04.2003 added rs grid pools [fawzi]
14!> 02.2004 added commensurate grids
15!> \author Fawzi Mohamed
16! **************************************************************************************************
18 USE ao_util, ONLY: exp_radius
21 USE cell_types, ONLY: cell_type
25 USE cp_output_handling, ONLY: cp_p_file,&
30 USE cube_utils, ONLY: destroy_cube_info,&
34 USE dct, ONLY: neumannx,&
35 neumannxy,&
37 neumannxz,&
38 neumanny,&
39 neumannyz,&
40 neumannz,&
62 USE kinds, ONLY: dp
64 USE ps_implicit_types, ONLY: mixed_bc,&
68 USE ps_wavelet_types, ONLY: wavelet0d,&
69 wavelet2d,&
71 USE pw_env_types, ONLY: pw_env_type
73 USE pw_grid_types, ONLY: fullspace,&
74 halfspace,&
90 USE pw_pool_types, ONLY: pw_pool_create,&
97 USE qs_kind_types, ONLY: get_qs_kind,&
99 USE qs_rho0_types, ONLY: get_rho0_mpole,&
101 USE realspace_grid_types, ONLY: &
105 USE xc_input_constants, ONLY: &
109#include "./base/base_uses.f90"
110
111 IMPLICIT NONE
112 PRIVATE
113
114 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
115 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pw_env_methods'
116
118
119! **************************************************************************************************
120
121CONTAINS
122
123! **************************************************************************************************
124!> \brief creates a pw_env, if qs_env is given calls pw_env_rebuild
125!> \param pw_env the pw_env that gets created
126!> \par History
127!> 10.2002 created [fawzi]
128!> \author Fawzi Mohamed
129! **************************************************************************************************
130 SUBROUTINE pw_env_create(pw_env)
131 TYPE(pw_env_type), POINTER :: pw_env
132
133 CHARACTER(len=*), PARAMETER :: routinen = 'pw_env_create'
134
135 INTEGER :: handle
136
137 CALL timeset(routinen, handle)
138
139 cpassert(.NOT. ASSOCIATED(pw_env))
140 ALLOCATE (pw_env)
141 NULLIFY (pw_env%pw_pools, pw_env%gridlevel_info, pw_env%poisson_env, &
142 pw_env%cube_info, pw_env%rs_descs, pw_env%rs_grids, &
143 pw_env%xc_pw_pool, pw_env%vdw_pw_pool, &
144 pw_env%interp_section)
145 pw_env%auxbas_grid = -1
146 pw_env%ref_count = 1
147
148 CALL timestop(handle)
149
150 END SUBROUTINE pw_env_create
151
152! **************************************************************************************************
153!> \brief rebuilds the pw_env data (necessary if cell or cutoffs change)
154!> \param pw_env the environment to rebuild
155!> \param qs_env the qs_env where to get the cell, cutoffs,...
156!> \param external_para_env ...
157!> \par History
158!> 10.2002 created [fawzi]
159!> \author Fawzi Mohamed
160! **************************************************************************************************
161 SUBROUTINE pw_env_rebuild(pw_env, qs_env, external_para_env)
162 TYPE(pw_env_type), POINTER :: pw_env
163 TYPE(qs_environment_type), POINTER :: qs_env
164 TYPE(mp_para_env_type), INTENT(IN), OPTIONAL, &
165 TARGET :: external_para_env
166
167 CHARACTER(len=*), PARAMETER :: routinen = 'pw_env_rebuild'
168
169 CHARACTER(LEN=3) :: string
170 INTEGER :: blocked_id, blocked_id_input, boundary_condition, grid_span, handle, i, &
171 igrid_level, iounit, ncommensurate, ngrid_level, xc_deriv_method_id, xc_smooth_method_id
172 INTEGER, DIMENSION(2) :: distribution_layout
173 INTEGER, DIMENSION(3) :: higher_grid_layout
174 LOGICAL :: do_io, efg_present, linres_present, odd, set_vdw_pool, should_output, &
175 smooth_required, spherical, uf_grid, use_ref_cell
176 REAL(kind=dp) :: cutilev, rel_cutoff
177 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: radius
178 REAL(kind=dp), DIMENSION(:), POINTER :: cutoff
179 TYPE(cell_type), POINTER :: cell, cell_ref, my_cell
180 TYPE(cp_logger_type), POINTER :: logger
181 TYPE(dft_control_type), POINTER :: dft_control
182 TYPE(mp_para_env_type), POINTER :: para_env
183 TYPE(pw_grid_type), POINTER :: dct_pw_grid, mt_super_ref_grid, old_pw_grid, pw_grid, &
184 super_ref_grid, vdw_grid, vdw_ref_grid, xc_super_ref_grid
185 TYPE(pw_poisson_parameter_type) :: poisson_params
186 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
187 TYPE(qs_dispersion_type), POINTER :: dispersion_env
188 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
189 TYPE(realspace_grid_desc_p_type), DIMENSION(:), &
190 POINTER :: rs_descs
191 TYPE(realspace_grid_input_type) :: input_settings
192 TYPE(realspace_grid_type), DIMENSION(:), POINTER :: rs_grids
193 TYPE(section_vals_type), POINTER :: efg_section, input, linres_section, &
194 poisson_section, print_section, &
195 rs_grid_section, xc_section
196
197 ! a very small safety factor might be needed for roundoff issues
198 ! e.g. radius being computed here as 12.998 (13) and 13.002 (14) during the collocation
199 ! the latter can happen due to the lower precision in the computation of the radius in collocate
200 ! parallel cost of rs_pw_transfer goes as safety_factor**3 so it is worthwhile keeping it tight
201 ! Edit: Safety Factor was unused
202
203 CALL timeset(routinen, handle)
204
205 !
206 !
207 ! Part one, deallocate old data if needed
208 !
209 !
210 NULLIFY (cutoff, cell, pw_grid, old_pw_grid, dft_control, qs_kind_set, &
211 pw_pools, rs_descs, para_env, cell_ref, vdw_ref_grid, &
212 mt_super_ref_grid, input, poisson_section, xc_super_ref_grid, &
213 dct_pw_grid, vdw_grid, super_ref_grid, my_cell, rs_grids, dispersion_env)
214
215 CALL get_qs_env(qs_env=qs_env, &
216 dft_control=dft_control, &
217 qs_kind_set=qs_kind_set, &
218 cell_ref=cell_ref, &
219 cell=cell, &
220 para_env=para_env, &
221 input=input, &
222 dispersion_env=dispersion_env)
223
224 cpassert(ASSOCIATED(pw_env))
225 cpassert(pw_env%ref_count > 0)
226 CALL pw_pool_release(pw_env%vdw_pw_pool)
227 CALL pw_pool_release(pw_env%xc_pw_pool)
228 CALL pw_pools_dealloc(pw_env%pw_pools)
229 IF (ASSOCIATED(pw_env%rs_descs)) THEN
230 DO i = 1, SIZE(pw_env%rs_descs)
231 CALL rs_grid_release_descriptor(pw_env%rs_descs(i)%rs_desc)
232 END DO
233 DEALLOCATE (pw_env%rs_descs)
234 END IF
235 IF (ASSOCIATED(pw_env%rs_grids)) THEN
236 DO i = 1, SIZE(pw_env%rs_grids)
237 CALL rs_grid_release(pw_env%rs_grids(i))
238 END DO
239 DEALLOCATE (pw_env%rs_grids)
240 END IF
241 IF (ASSOCIATED(pw_env%gridlevel_info)) THEN
242 CALL destroy_gaussian_gridlevel(pw_env%gridlevel_info)
243 ELSE
244 ALLOCATE (pw_env%gridlevel_info)
245 END IF
246
247 IF (ASSOCIATED(pw_env%cube_info)) THEN
248 DO igrid_level = 1, SIZE(pw_env%cube_info)
249 CALL destroy_cube_info(pw_env%cube_info(igrid_level))
250 END DO
251 DEALLOCATE (pw_env%cube_info)
252 END IF
253 NULLIFY (pw_env%pw_pools, pw_env%cube_info)
254
255 ! remove fft scratch pool, as it depends on pw_env mpi group handles
257
258 !
259 !
260 ! Part two, setup the pw_grids
261 !
262 !
263
264 do_io = .true.
265 IF (PRESENT(external_para_env)) THEN
266 para_env => external_para_env
267 cpassert(ASSOCIATED(para_env))
268 do_io = .false. !multiple MPI subgroups mess-up the output file
269 END IF
270 ! interpolation section
271 pw_env%interp_section => section_vals_get_subs_vals(input, "DFT%MGRID%INTERPOLATOR")
272
273 CALL get_qs_env(qs_env, use_ref_cell=use_ref_cell)
274 IF (use_ref_cell) THEN
275 my_cell => cell_ref
276 ELSE
277 my_cell => cell
278 END IF
279 rel_cutoff = dft_control%qs_control%relative_cutoff
280 cutoff => dft_control%qs_control%e_cutoff
281 CALL section_vals_val_get(input, "DFT%XC%XC_GRID%USE_FINER_GRID", l_val=uf_grid)
282 ngrid_level = SIZE(cutoff)
283
284 ! init gridlevel_info XXXXXXXXX setup mapping to the effective cutoff ?
285 ! XXXXXXXXX the cutoff array here is more a 'wish-list'
286 ! XXXXXXXXX same holds for radius
287 print_section => section_vals_get_subs_vals(input, &
288 "PRINT%GRID_INFORMATION")
289 CALL init_gaussian_gridlevel(pw_env%gridlevel_info, &
290 ngrid_levels=ngrid_level, cutoff=cutoff, rel_cutoff=rel_cutoff, &
291 print_section=print_section)
292 ! init pw_grids and pools
293 ALLOCATE (pw_pools(ngrid_level))
294
295 IF (dft_control%qs_control%commensurate_mgrids) THEN
296 ncommensurate = ngrid_level
297 ELSE
298 ncommensurate = 0
299 END IF
300 !
301 ! If Tuckerman is present let's perform the set-up of the super-reference-grid
302 !
303 cutilev = cutoff(1)
304 IF (dft_control%qs_control%pw_grid_opt%spherical) THEN
305 grid_span = halfspace
306 spherical = .true.
307 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace) THEN
308 grid_span = fullspace
309 spherical = .false.
310 ELSE
311 grid_span = halfspace
312 spherical = .false.
313 END IF
314
315 CALL setup_super_ref_grid(super_ref_grid, mt_super_ref_grid, &
316 xc_super_ref_grid, cutilev, grid_span, spherical, my_cell, para_env, &
317 qs_env%input, ncommensurate, uf_grid=uf_grid, &
318 print_section=print_section)
319 old_pw_grid => super_ref_grid
320 IF (.NOT. ASSOCIATED(mt_super_ref_grid)) vdw_ref_grid => super_ref_grid
321 !
322 ! Setup of the multi-grid pw_grid and pw_pools
323 !
324
325 IF (do_io) THEN
326 logger => cp_get_default_logger()
327 iounit = cp_print_key_unit_nr(logger, print_section, '', extension='.Log')
328 ELSE
329 iounit = 0
330 END IF
331
332 IF (dft_control%qs_control%pw_grid_opt%spherical) THEN
333 grid_span = halfspace
334 spherical = .true.
335 odd = .true.
336 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace) THEN
337 grid_span = fullspace
338 spherical = .false.
339 odd = .false.
340 ELSE
341 grid_span = halfspace
342 spherical = .false.
343 odd = .true.
344 END IF
345
346 ! use input suggestion for blocked
347 blocked_id_input = dft_control%qs_control%pw_grid_opt%blocked
348
349 ! methods that require smoothing or nearest neighbor have to use a plane distributed setup
350 ! find the xc properties (FIXME this could miss other xc sections that operate on the grid ...)
351 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
352 xc_deriv_method_id = section_get_ival(xc_section, "XC_GRID%XC_DERIV")
353 xc_smooth_method_id = section_get_ival(xc_section, "XC_GRID%XC_SMOOTH_RHO")
354 smooth_required = .false.
355 SELECT CASE (xc_deriv_method_id)
357 smooth_required = smooth_required .OR. .false.
360 smooth_required = smooth_required .OR. .true.
361 CASE DEFAULT
362 cpabort("")
363 END SELECT
364 SELECT CASE (xc_smooth_method_id)
365 CASE (xc_rho_no_smooth)
366 smooth_required = smooth_required .OR. .false.
368 smooth_required = smooth_required .OR. .true.
369 CASE DEFAULT
370 cpabort("")
371 END SELECT
372 ! EPR, NMR, EFG can require splines. If the linres/EFG section is present we assume
373 ! it could be on and splines might be used (not quite sure if this is due to their use of splines or something else)
374 linres_section => section_vals_get_subs_vals(section_vals=input, &
375 subsection_name="PROPERTIES%LINRES")
376 CALL section_vals_get(linres_section, explicit=linres_present)
377 IF (linres_present) THEN
378 smooth_required = smooth_required .OR. .true.
379 END IF
380
381 efg_section => section_vals_get_subs_vals(section_vals=input, &
382 subsection_name="DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
383 CALL section_vals_get(efg_section, explicit=efg_present)
384 IF (efg_present) THEN
385 smooth_required = smooth_required .OR. .true.
386 END IF
387
388 DO igrid_level = 1, ngrid_level
389 cutilev = cutoff(igrid_level)
390
391 ! the whole of QS seems to work fine with either blocked/non-blocked distribution in g-space
392 ! the default choice should be made free
393 blocked_id = blocked_id_input
394
395 distribution_layout = dft_control%qs_control%pw_grid_opt%distribution_layout
396
397 ! qmmm does not support a ray distribution
398 ! FIXME ... check if a plane distributed lower grid is sufficient
399 IF (qs_env%qmmm) THEN
400 distribution_layout = (/para_env%num_pe, 1/)
401 END IF
402
403 ! If splines are required
404 ! FIXME.... should only be true for the highest grid
405 IF (smooth_required) THEN
406 distribution_layout = (/para_env%num_pe, 1/)
407 END IF
408
409 IF (igrid_level == 1) THEN
410 IF (ASSOCIATED(old_pw_grid)) THEN
411 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
412 cutoff=cutilev, &
413 spherical=spherical, odd=odd, fft_usage=.true., &
414 ncommensurate=ncommensurate, icommensurate=igrid_level, &
415 blocked=do_pw_grid_blocked_false, &
416 ref_grid=old_pw_grid, &
417 rs_dims=distribution_layout, &
418 iounit=iounit)
419 old_pw_grid => pw_grid
420 ELSE
421 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
422 cutoff=cutilev, &
423 spherical=spherical, odd=odd, fft_usage=.true., &
424 ncommensurate=ncommensurate, icommensurate=igrid_level, &
425 blocked=blocked_id, &
426 rs_dims=distribution_layout, &
427 iounit=iounit)
428 old_pw_grid => pw_grid
429 END IF
430 ELSE
431 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
432 cutoff=cutilev, &
433 spherical=spherical, odd=odd, fft_usage=.true., &
434 ncommensurate=ncommensurate, icommensurate=igrid_level, &
435 blocked=do_pw_grid_blocked_false, &
436 ref_grid=old_pw_grid, &
437 rs_dims=distribution_layout, &
438 iounit=iounit)
439 END IF
440
441 ! init pw_pools
442 NULLIFY (pw_pools(igrid_level)%pool)
443 CALL pw_pool_create(pw_pools(igrid_level)%pool, pw_grid=pw_grid)
444
445 CALL pw_grid_release(pw_grid)
446
447 END DO
448
449 pw_env%pw_pools => pw_pools
450
451 ! init auxbas_grid
452 DO i = 1, ngrid_level
453 IF (cutoff(i) == dft_control%qs_control%cutoff) pw_env%auxbas_grid = i
454 END DO
455
456 ! init xc_pool
457 IF (ASSOCIATED(xc_super_ref_grid)) THEN
458 CALL pw_pool_create(pw_env%xc_pw_pool, &
459 pw_grid=xc_super_ref_grid)
460 CALL pw_grid_release(xc_super_ref_grid)
461 ELSE
462 pw_env%xc_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
463 CALL pw_env%xc_pw_pool%retain()
464 END IF
465
466 ! init vdw_pool
467 set_vdw_pool = .false.
468 IF (ASSOCIATED(dispersion_env)) THEN
469 IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
470 IF (dispersion_env%pw_cutoff > 0._dp) set_vdw_pool = .true.
471 END IF
472 END IF
473 IF (set_vdw_pool) THEN
474 cpassert(ASSOCIATED(old_pw_grid))
475 IF (.NOT. ASSOCIATED(vdw_ref_grid)) vdw_ref_grid => old_pw_grid
476 IF (iounit > 0) WRITE (iounit, "(/,T2,A)") "PW_GRID| Grid for non-local vdW functional"
477 CALL pw_grid_create(vdw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
478 cutoff=dispersion_env%pw_cutoff, &
479 spherical=spherical, odd=odd, fft_usage=.true., &
480 ncommensurate=0, icommensurate=0, &
481 blocked=do_pw_grid_blocked_false, &
482 ref_grid=vdw_ref_grid, &
483 rs_dims=distribution_layout, &
484 iounit=iounit)
485 CALL pw_pool_create(pw_env%vdw_pw_pool, pw_grid=vdw_grid)
486 CALL pw_grid_release(vdw_grid)
487 ELSE
488 pw_env%vdw_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
489 CALL pw_env%vdw_pw_pool%retain()
490 END IF
491
492 IF (do_io) CALL cp_print_key_finished_output(iounit, logger, print_section, '')
493
494 ! complete init of the poisson_env
495 IF (.NOT. ASSOCIATED(pw_env%poisson_env)) THEN
496 ALLOCATE (pw_env%poisson_env)
497 CALL pw_env%poisson_env%create()
498 END IF
499 poisson_section => section_vals_get_subs_vals(input, "DFT%POISSON")
500
501 CALL pw_poisson_read_parameters(poisson_section, poisson_params)
502 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=my_cell%hmat, pw_pools=pw_env%pw_pools, &
503 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
504 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
505 CALL pw_grid_release(mt_super_ref_grid)
506 CALL pw_grid_release(dct_pw_grid)
507!
508! If reference cell is present, then use pw_grid_change to keep bounds constant...
509! do not re-init the Gaussian grid level (fix the gridlevel on which the pgf should go.
510!
511 IF (use_ref_cell) THEN
512 DO igrid_level = 1, SIZE(pw_pools)
513 CALL pw_grid_change(cell%hmat, pw_pools(igrid_level)%pool%pw_grid)
514 END DO
515 IF (set_vdw_pool) CALL pw_grid_change(cell%hmat, pw_env%vdw_pw_pool%pw_grid)
516 CALL pw_poisson_read_parameters(poisson_section, poisson_params)
517 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=cell%hmat, pw_pools=pw_env%pw_pools, &
518 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
519 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
520 END IF
521
522 IF ((poisson_params%ps_implicit_params%boundary_condition .EQ. mixed_periodic_bc) .OR. &
523 (poisson_params%ps_implicit_params%boundary_condition .EQ. mixed_bc)) THEN
524 pw_env%poisson_env%parameters%dbc_params%do_dbc_cube = &
525 btest(cp_print_key_should_output(logger%iter_info, input, &
526 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"), cp_p_file)
527 END IF
528 ! setup dct_pw_grid (an extended pw_grid) for Discrete Cosine Transformation (DCT)
529 IF ((poisson_params%ps_implicit_params%boundary_condition .EQ. neumann_bc) .OR. &
530 (poisson_params%ps_implicit_params%boundary_condition .EQ. mixed_bc)) THEN
531 CALL setup_dct_pw_grids(pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid, &
532 my_cell%hmat, poisson_params%ps_implicit_params%neumann_directions, &
533 pw_env%poisson_env%dct_pw_grid)
534 END IF
535 ! setup real space grid for finite difference derivatives of dielectric constant function
536 IF (poisson_params%has_dielectric .AND. &
537 ((poisson_params%dielectric_params%derivative_method .EQ. derivative_cd3) .OR. &
538 (poisson_params%dielectric_params%derivative_method .EQ. derivative_cd5) .OR. &
539 (poisson_params%dielectric_params%derivative_method .EQ. derivative_cd7))) THEN
540
541 SELECT CASE (poisson_params%ps_implicit_params%boundary_condition)
542 CASE (neumann_bc, mixed_bc)
543 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
544 poisson_params%dielectric_params%derivative_method, input, &
545 pw_env%poisson_env%dct_pw_grid)
547 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
548 poisson_params%dielectric_params%derivative_method, input, &
549 pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid)
550 END SELECT
551
552 END IF
553
554!
555!
556! determine the maximum radii for mapped gaussians, needed to
557! set up distributed rs grids
558!
559!
560
561 ALLOCATE (radius(ngrid_level))
562
563 CALL compute_max_radius(radius, pw_env, qs_env)
564
565!
566!
567! set up the rs_grids and the cubes, requires 'radius' to be set up correctly
568!
569!
570 ALLOCATE (rs_descs(ngrid_level))
571
572 ALLOCATE (rs_grids(ngrid_level))
573
574 ALLOCATE (pw_env%cube_info(ngrid_level))
575 higher_grid_layout = (/-1, -1, -1/)
576
577 DO igrid_level = 1, ngrid_level
578 pw_grid => pw_pools(igrid_level)%pool%pw_grid
579
580 CALL init_d3_poly_module() ! a fairly arbitrary but sufficient spot to do this
581 CALL init_cube_info(pw_env%cube_info(igrid_level), &
582 pw_grid%dr(:), pw_grid%dh(:, :), pw_grid%dh_inv(:, :), pw_grid%orthorhombic, &
583 radius(igrid_level))
584
585 rs_grid_section => section_vals_get_subs_vals(input, "DFT%MGRID%RS_GRID")
586
587 CALL init_input_type(input_settings, nsmax=2*max(1, return_cube_max_iradius(pw_env%cube_info(igrid_level))) + 1, &
588 rs_grid_section=rs_grid_section, ilevel=igrid_level, &
589 higher_grid_layout=higher_grid_layout)
590
591 NULLIFY (rs_descs(igrid_level)%rs_desc)
592 CALL rs_grid_create_descriptor(rs_descs(igrid_level)%rs_desc, pw_grid, input_settings)
593
594 IF (rs_descs(igrid_level)%rs_desc%distributed) higher_grid_layout = rs_descs(igrid_level)%rs_desc%group_dim
595
596 CALL rs_grid_create(rs_grids(igrid_level), rs_descs(igrid_level)%rs_desc)
597 END DO
598 pw_env%rs_descs => rs_descs
599 pw_env%rs_grids => rs_grids
600
601 DEALLOCATE (radius)
602
603 ! Print grid information
604
605 IF (do_io) THEN
606 logger => cp_get_default_logger()
607 iounit = cp_print_key_unit_nr(logger, print_section, '', extension='.Log')
608 END IF
609 IF (iounit > 0) THEN
610 SELECT CASE (poisson_params%solver)
612 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
613 "POISSON| Solver", "PERIODIC"
615 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
616 "POISSON| Solver", "ANALYTIC"
617 CASE (pw_poisson_mt)
618 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
619 "POISSON| Solver", adjustr("Martyna-Tuckerman (MT)")
620 WRITE (unit=iounit, fmt="(T2,A,T71,F10.3,/,T2,A,T71,F10.1)") &
621 "POISSON| MT| Alpha", poisson_params%mt_alpha, &
622 "POISSON| MT| Relative cutoff", poisson_params%mt_rel_cutoff
624 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
625 "POISSON| Solver", "MULTIPOLE (Bloechl)"
626 CASE (pw_poisson_wavelet)
627 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
628 "POISSON| Solver", "WAVELET"
629 WRITE (unit=iounit, fmt="(T2,A,T71,I10)") &
630 "POISSON| Wavelet| Scaling function", poisson_params%wavelet_scf_type
631 SELECT CASE (poisson_params%wavelet_method)
632 CASE (wavelet0d)
633 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
634 "POISSON| Periodicity", "NONE"
635 CASE (wavelet2d)
636 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
637 "POISSON| Periodicity", "XZ"
638 CASE (wavelet3d)
639 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
640 "POISSON| Periodicity", "XYZ"
641 CASE DEFAULT
642 cpabort("Invalid periodicity for wavelet solver selected")
643 END SELECT
645 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
646 "POISSON| Solver", "IMPLICIT (GENERALIZED)"
647 boundary_condition = poisson_params%ps_implicit_params%boundary_condition
648 SELECT CASE (boundary_condition)
649 CASE (periodic_bc)
650 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
651 "POISSON| Boundary Condition", "PERIODIC"
652 CASE (neumann_bc, mixed_bc)
653 IF (boundary_condition .EQ. neumann_bc) THEN
654 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
655 "POISSON| Boundary Condition", "NEUMANN"
656 ELSE
657 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
658 "POISSON| Boundary Condition", "MIXED"
659 END IF
660 SELECT CASE (poisson_params%ps_implicit_params%neumann_directions)
661 CASE (neumannxyz)
662 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X, Y, Z"
663 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "NONE"
664 CASE (neumannxy)
665 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X, Y"
666 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "Z"
667 CASE (neumannxz)
668 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X, Z"
669 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "Y"
670 CASE (neumannyz)
671 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "Y, Z"
672 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "X"
673 CASE (neumannx)
674 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X"
675 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "Y, Z"
676 CASE (neumanny)
677 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "Y"
678 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "X, Z"
679 CASE (neumannz)
680 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "Z"
681 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "X, Y"
682 CASE DEFAULT
683 cpabort("Invalid combination of Neumann and periodic conditions.")
684 END SELECT
685 CASE (mixed_periodic_bc)
686 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
687 "POISSON| Boundary Condition", "PERIODIC & DIRICHLET"
688 CASE DEFAULT
689 cpabort("Invalid boundary conditions for the implicit (generalized) poisson solver.")
690 END SELECT
691 WRITE (unit=iounit, fmt="(T2,A,T71,I10)") &
692 "POISSON| Maximum number of iterations", poisson_params%ps_implicit_params%max_iter
693 WRITE (unit=iounit, fmt="(T2,A,T51,ES30.2)") &
694 "POISSON| Convergence threshold", poisson_params%ps_implicit_params%tol
695 IF (poisson_params%dielectric_params%dielec_functiontype .EQ. rho_dependent) THEN
696 WRITE (unit=iounit, fmt="(T2,A,T51,F30.2)") &
697 "POISSON| Dielectric Constant", poisson_params%dielectric_params%eps0
698 ELSE
699 WRITE (unit=iounit, fmt="(T2,A,T31,F9.2)", advance='NO') &
700 "POISSON| Dielectric Constants", poisson_params%dielectric_params%eps0
701 DO i = 1, poisson_params%dielectric_params%n_aa_cuboidal
702 WRITE (unit=iounit, fmt="(F9.2)", advance='NO') &
703 poisson_params%dielectric_params%aa_cuboidal_eps(i)
704 END DO
705 DO i = 1, poisson_params%dielectric_params%n_xaa_annular
706 WRITE (unit=iounit, fmt="(F9.2)", advance='NO') &
707 poisson_params%dielectric_params%xaa_annular_eps(i)
708 END DO
709 WRITE (unit=iounit, fmt='(A1,/)')
710 END IF
711 WRITE (unit=iounit, fmt="(T2,A,T51,ES30.2)") &
712 "POISSON| Relaxation parameter", poisson_params%ps_implicit_params%omega
713 CASE (pw_poisson_none)
714 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
715 "POISSON| Solver", "NONE"
716 CASE default
717 cpabort("Invalid Poisson solver selected")
718 END SELECT
719 IF ((poisson_params%solver /= pw_poisson_wavelet) .AND. &
720 (poisson_params%solver /= pw_poisson_implicit)) THEN
721 IF (sum(poisson_params%periodic(1:3)) == 0) THEN
722 WRITE (unit=iounit, fmt="(T2,A,T77,A4)") &
723 "POISSON| Periodicity", "NONE"
724 ELSE
725 string = ""
726 IF (poisson_params%periodic(1) == 1) string = trim(string)//"X"
727 IF (poisson_params%periodic(2) == 1) string = trim(string)//"Y"
728 IF (poisson_params%periodic(3) == 1) string = trim(string)//"Z"
729 WRITE (unit=iounit, fmt="(T2,A,T78,A3)") &
730 "POISSON| Periodicity", adjustr(string)
731 END IF
732 END IF
733 END IF
734
735 IF ((dft_control%qs_control%method_id == do_method_gpw) .OR. &
736 (dft_control%qs_control%method_id == do_method_gapw) .OR. &
737 (dft_control%qs_control%method_id == do_method_gapw_xc) .OR. &
738 (dft_control%qs_control%method_id == do_method_lrigpw) .OR. &
739 (dft_control%qs_control%method_id == do_method_rigpw) .OR. &
740 (dft_control%qs_control%method_id == do_method_ofgpw)) THEN
741 IF ((poisson_params%solver /= pw_poisson_wavelet) .AND. &
742 (poisson_params%solver /= pw_poisson_implicit)) THEN
743 IF (any(my_cell%perd(1:3) /= poisson_params%periodic(1:3))) THEN
744 CALL cp_warn(__location__, &
745 "The selected periodicities in the sections &CELL and &POISSON do not match")
746 END IF
747 END IF
748 END IF
749
750 IF (do_io) THEN
751 should_output = btest(cp_print_key_should_output(logger%iter_info, &
752 print_section, ''), cp_p_file)
753 IF (should_output) THEN
754 DO igrid_level = 1, ngrid_level
755 CALL rs_grid_print(rs_grids(igrid_level), iounit)
756 END DO
757 END IF
758 CALL cp_print_key_finished_output(iounit, logger, print_section, "")
759 END IF
760
761 CALL timestop(handle)
762
763 END SUBROUTINE pw_env_rebuild
764
765! **************************************************************************************************
766!> \brief computes the maximum radius
767!> \param radius ...
768!> \param pw_env ...
769!> \param qs_env ...
770!> \par History
771!> 10.2010 refactored [Joost VandeVondele]
772!> 01.2020 igrid_zet0_s initialisation code is reused in rho0_s_grid_create() [Sergey Chulkov]
773!> \author Joost VandeVondele
774! **************************************************************************************************
775 SUBROUTINE compute_max_radius(radius, pw_env, qs_env)
776 REAL(kind=dp), DIMENSION(:), INTENT(OUT) :: radius
777 TYPE(pw_env_type), POINTER :: pw_env
778 TYPE(qs_environment_type), POINTER :: qs_env
779
780 CHARACTER(len=*), PARAMETER :: routinen = 'compute_max_radius'
781 CHARACTER(LEN=8), DIMENSION(4), PARAMETER :: &
782 pbas = (/"ORB ", "AUX_FIT ", "MAO ", "HARRIS "/)
783 CHARACTER(LEN=8), DIMENSION(9), PARAMETER :: sbas = (/"ORB ", "AUX ", "RI_AUX ", &
784 "MAO ", "HARRIS ", "RI_HXC ", "RI_K ", "LRI_AUX ", "RHOIN "/)
785 REAL(kind=dp), PARAMETER :: safety_factor = 1.015_dp
786
787 INTEGER :: handle, ibasis_set_type, igrid_level, igrid_zet0_s, ikind, ipgf, iset, ishell, &
788 jkind, jpgf, jset, jshell, la, lb, lgrid_level, ngrid_level, nkind, nseta, nsetb
789 INTEGER, DIMENSION(:), POINTER :: npgfa, npgfb, nshella, nshellb
790 INTEGER, DIMENSION(:, :), POINTER :: lshella, lshellb
791 REAL(kind=dp) :: alpha, core_charge, eps_gvg, eps_rho, &
792 max_rpgf0_s, maxradius, zet0_h, zetp
793 REAL(kind=dp), DIMENSION(:, :), POINTER :: zeta, zetb
794 TYPE(dft_control_type), POINTER :: dft_control
795 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
796 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
797 TYPE(qs_kind_type), POINTER :: qs_kind
798 TYPE(rho0_mpole_type), POINTER :: rho0_mpole
799
800 ! a very small safety factor might be needed for roundoff issues
801 ! e.g. radius being computed here as 12.998 (13) and 13.002 (14) during the collocation
802 ! the latter can happen due to the lower precision in the computation of the radius in collocate
803 ! parallel cost of rs_pw_transfer goes as safety_factor**3 so it is worthwhile keeping it tight
804
805 CALL timeset(routinen, handle)
806 NULLIFY (dft_control, qs_kind_set, rho0_mpole)
807
808 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
809
810 eps_rho = dft_control%qs_control%eps_rho_rspace
811 eps_gvg = dft_control%qs_control%eps_gvg_rspace
812
813 IF (dft_control%qs_control%gapw) THEN
814 CALL get_qs_env(qs_env=qs_env, rho0_mpole=rho0_mpole)
815 cpassert(ASSOCIATED(rho0_mpole))
816
817 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, max_rpgf0_s=max_rpgf0_s, zet0_h=zet0_h)
818 igrid_zet0_s = gaussian_gridlevel(pw_env%gridlevel_info, 2.0_dp*zet0_h)
819 rho0_mpole%igrid_zet0_s = igrid_zet0_s
820 END IF
821
822 ngrid_level = SIZE(radius)
823 nkind = SIZE(qs_kind_set)
824
825 ! try to predict the maximum radius of the gaussians to be mapped on the grid
826 ! up to now, it is not yet very good
827 radius = 0.0_dp
828 DO igrid_level = 1, ngrid_level
829
830 maxradius = 0.0_dp
831 ! Take into account the radius of the soft compensation charge rho0_soft1
832 IF (dft_control%qs_control%gapw) THEN
833 IF (igrid_zet0_s == igrid_level) maxradius = max(maxradius, max_rpgf0_s)
834 END IF
835
836 ! this is to be sure that the core charge is mapped ok
837 ! right now, the core is mapped on the auxiliary basis,
838 ! this should, at a give point be changed
839 ! so that also for the core a multigrid is used
840 DO ikind = 1, nkind
841 CALL get_qs_kind(qs_kind_set(ikind), &
842 alpha_core_charge=alpha, ccore_charge=core_charge)
843 IF (alpha > 0.0_dp .AND. core_charge .NE. 0.0_dp) THEN
844 maxradius = max(maxradius, exp_radius(0, alpha, eps_rho, core_charge, rlow=maxradius))
845 ! forces
846 maxradius = max(maxradius, exp_radius(1, alpha, eps_rho, core_charge, rlow=maxradius))
847 END IF
848 END DO
849
850 ! loop over basis sets that are used in grid collocation directly (no product)
851 ! e.g. for calculating a wavefunction or a RI density
852 DO ibasis_set_type = 1, SIZE(sbas)
853 DO ikind = 1, nkind
854 qs_kind => qs_kind_set(ikind)
855 NULLIFY (orb_basis_set)
856 CALL get_qs_kind(qs_kind=qs_kind, &
857 basis_set=orb_basis_set, basis_type=sbas(ibasis_set_type))
858 IF (.NOT. ASSOCIATED(orb_basis_set)) cycle
859 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
860 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
861 DO iset = 1, nseta
862 DO ipgf = 1, npgfa(iset)
863 DO ishell = 1, nshella(iset)
864 zetp = zeta(ipgf, iset)
865 la = lshella(ishell, iset)
866 lgrid_level = gaussian_gridlevel(pw_env%gridlevel_info, zetp)
867 IF (lgrid_level .EQ. igrid_level) THEN
868 maxradius = max(maxradius, exp_radius(la, zetp, eps_rho, 1.0_dp, rlow=maxradius))
869 END IF
870 END DO
871 END DO
872 END DO
873 END DO
874 END DO
875 ! loop over basis sets that are used in product function grid collocation
876 DO ibasis_set_type = 1, SIZE(pbas)
877 DO ikind = 1, nkind
878 qs_kind => qs_kind_set(ikind)
879 NULLIFY (orb_basis_set)
880 CALL get_qs_kind(qs_kind=qs_kind, &
881 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
882 IF (.NOT. ASSOCIATED(orb_basis_set)) cycle
883 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
884 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
885
886 DO jkind = 1, nkind
887 qs_kind => qs_kind_set(jkind)
888 CALL get_qs_kind(qs_kind=qs_kind, &
889 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
890 IF (.NOT. ASSOCIATED(orb_basis_set)) cycle
891 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
892 npgf=npgfb, nset=nsetb, zet=zetb, l=lshellb, nshell=nshellb)
893 DO iset = 1, nseta
894 DO ipgf = 1, npgfa(iset)
895 DO ishell = 1, nshella(iset)
896 la = lshella(ishell, iset)
897 DO jset = 1, nsetb
898 DO jpgf = 1, npgfb(jset)
899 DO jshell = 1, nshellb(jset)
900 zetp = zeta(ipgf, iset) + zetb(jpgf, jset)
901 lb = lshellb(jshell, jset) + la
902 lgrid_level = gaussian_gridlevel(pw_env%gridlevel_info, zetp)
903 IF (lgrid_level .EQ. igrid_level) THEN
904 ! density (scale is at most 2)
905 maxradius = max(maxradius, exp_radius(lb, zetp, eps_rho, 2.0_dp, rlow=maxradius))
906 ! tau, properties?
907 maxradius = max(maxradius, exp_radius(lb + 1, zetp, eps_rho, 2.0_dp, rlow=maxradius))
908 ! potential
909 maxradius = max(maxradius, exp_radius(lb, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
910 ! forces
911 maxradius = max(maxradius, exp_radius(lb + 1, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
912 END IF
913 END DO
914 END DO
915 END DO
916 END DO
917 END DO
918 END DO
919 END DO
920 END DO
921 END DO
922
923 ! this is a bit of hack, but takes into account numerics and rounding
924 maxradius = maxradius*safety_factor
925 radius(igrid_level) = maxradius
926 END DO
927
928 CALL timestop(handle)
929
930 END SUBROUTINE compute_max_radius
931
932! **************************************************************************************************
933!> \brief Initialize the super-reference grid for Tuckerman or xc
934!> \param super_ref_pw_grid ...
935!> \param mt_super_ref_pw_grid ...
936!> \param xc_super_ref_pw_grid ...
937!> \param cutilev ...
938!> \param grid_span ...
939!> \param spherical ...
940!> \param cell_ref ...
941!> \param para_env ...
942!> \param input ...
943!> \param my_ncommensurate ...
944!> \param uf_grid ...
945!> \param print_section ...
946!> \author 03-2005 Teodoro Laino [teo]
947!> \note
948!> move somewere else?
949! **************************************************************************************************
950 SUBROUTINE setup_super_ref_grid(super_ref_pw_grid, mt_super_ref_pw_grid, &
951 xc_super_ref_pw_grid, cutilev, grid_span, spherical, &
952 cell_ref, para_env, input, my_ncommensurate, uf_grid, print_section)
953 TYPE(pw_grid_type), POINTER :: super_ref_pw_grid, mt_super_ref_pw_grid, &
954 xc_super_ref_pw_grid
955 REAL(kind=dp), INTENT(IN) :: cutilev
956 INTEGER, INTENT(IN) :: grid_span
957 LOGICAL, INTENT(in) :: spherical
958 TYPE(cell_type), POINTER :: cell_ref
959 TYPE(mp_para_env_type), POINTER :: para_env
960 TYPE(section_vals_type), POINTER :: input
961 INTEGER, INTENT(IN) :: my_ncommensurate
962 LOGICAL, INTENT(in) :: uf_grid
963 TYPE(section_vals_type), POINTER :: print_section
964
965 INTEGER :: iounit, my_val, nn(3), no(3)
966 LOGICAL :: mt_s_grid
967 REAL(kind=dp) :: mt_rel_cutoff, my_cutilev
968 TYPE(cp_logger_type), POINTER :: logger
969 TYPE(section_vals_type), POINTER :: poisson_section
970
971 NULLIFY (poisson_section)
972 cpassert(.NOT. ASSOCIATED(mt_super_ref_pw_grid))
973 cpassert(.NOT. ASSOCIATED(xc_super_ref_pw_grid))
974 cpassert(.NOT. ASSOCIATED(super_ref_pw_grid))
975 poisson_section => section_vals_get_subs_vals(input, "DFT%POISSON")
976 CALL section_vals_val_get(poisson_section, "POISSON_SOLVER", i_val=my_val)
977 !
978 ! Check if grids will be the same... In this case we don't use a super-reference grid
979 !
980 mt_s_grid = .false.
981 IF (my_val == pw_poisson_mt) THEN
982 CALL section_vals_val_get(poisson_section, "MT%REL_CUTOFF", &
983 r_val=mt_rel_cutoff)
984 IF (mt_rel_cutoff > 1._dp) mt_s_grid = .true.
985 END IF
986
987 logger => cp_get_default_logger()
988 iounit = cp_print_key_unit_nr(logger, print_section, "", &
989 extension=".Log")
990
991 IF (uf_grid) THEN
992 CALL pw_grid_create(xc_super_ref_pw_grid, para_env, cell_ref%hmat, grid_span=grid_span, &
993 cutoff=4._dp*cutilev, spherical=spherical, odd=.false., fft_usage=.true., &
994 ncommensurate=my_ncommensurate, icommensurate=1, &
995 blocked=do_pw_grid_blocked_false, rs_dims=(/para_env%num_pe, 1/), &
996 iounit=iounit)
997 super_ref_pw_grid => xc_super_ref_pw_grid
998 END IF
999 IF (mt_s_grid) THEN
1000 IF (ASSOCIATED(xc_super_ref_pw_grid)) THEN
1001 cpabort("special grid for mt and fine xc grid not compatible")
1002 ELSE
1003 my_cutilev = cutilev*mt_rel_cutoff
1004
1005 no = pw_grid_init_setup(cell_ref%hmat, cutoff=cutilev, spherical=spherical, &
1006 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1007 nn = pw_grid_init_setup(cell_ref%hmat, cutoff=my_cutilev, spherical=spherical, &
1008 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1009
1010 ! bug appears for nn==no, also in old versions
1011 cpassert(all(nn > no))
1012 CALL pw_grid_create(mt_super_ref_pw_grid, para_env, cell_ref%hmat, &
1013 cutoff=my_cutilev, spherical=spherical, fft_usage=.true., &
1014 blocked=do_pw_grid_blocked_false, rs_dims=(/para_env%num_pe, 1/), &
1015 iounit=iounit)
1016 super_ref_pw_grid => mt_super_ref_pw_grid
1017 END IF
1018 END IF
1019 CALL cp_print_key_finished_output(iounit, logger, print_section, &
1020 "")
1021 END SUBROUTINE setup_super_ref_grid
1022
1023! **************************************************************************************************
1024!> \brief sets up a real-space grid for finite difference derivative of dielectric
1025!> constant function
1026!> \param diel_rs_grid real space grid to be created
1027!> \param method preferred finite difference derivative method
1028!> \param input input file
1029!> \param pw_grid plane-wave grid
1030!> \par History
1031!> 12.2014 created [Hossein Bani-Hashemian]
1032!> \author Mohammad Hossein Bani-Hashemian
1033! **************************************************************************************************
1034 SUBROUTINE setup_diel_rs_grid(diel_rs_grid, method, input, pw_grid)
1035
1036 TYPE(realspace_grid_type), POINTER :: diel_rs_grid
1037 INTEGER, INTENT(IN) :: method
1038 TYPE(section_vals_type), POINTER :: input
1039 TYPE(pw_grid_type), POINTER :: pw_grid
1040
1041 CHARACTER(LEN=*), PARAMETER :: routinen = 'setup_diel_rs_grid'
1042
1043 INTEGER :: border_points, handle
1044 TYPE(realspace_grid_desc_type), POINTER :: rs_desc
1045 TYPE(realspace_grid_input_type) :: input_settings
1046 TYPE(section_vals_type), POINTER :: rs_grid_section
1047
1048 CALL timeset(routinen, handle)
1049
1050 NULLIFY (rs_desc)
1051 rs_grid_section => section_vals_get_subs_vals(input, "DFT%MGRID%RS_GRID")
1052 SELECT CASE (method)
1053 CASE (derivative_cd3)
1054 border_points = 1
1055 CASE (derivative_cd5)
1056 border_points = 2
1057 CASE (derivative_cd7)
1058 border_points = 3
1059 END SELECT
1060 CALL init_input_type(input_settings, 2*border_points + 1, rs_grid_section, &
1061 1, (/-1, -1, -1/))
1062 CALL rs_grid_create_descriptor(rs_desc, pw_grid, input_settings, &
1063 border_points=border_points)
1064 ALLOCATE (diel_rs_grid)
1065 CALL rs_grid_create(diel_rs_grid, rs_desc)
1066 CALL rs_grid_release_descriptor(rs_desc)
1067
1068 CALL timestop(handle)
1069
1070 END SUBROUTINE setup_diel_rs_grid
1071
1072END MODULE pw_env_methods
1073
All kind of helpful little routines.
Definition ao_util.F:14
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
Definition ao_util.F:96
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
Handles all functions related to the CELL.
Definition cell_types.F:15
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
subroutine, public init_input_type(input_settings, nsmax, rs_grid_section, ilevel, higher_grid_layout)
parses an input section to assign the proper values to the input type
for a given dr()/dh(r) this will provide the bounds to be used if one wants to go over a sphere-subre...
Definition cube_utils.F:18
integer function, public return_cube_max_iradius(info)
...
Definition cube_utils.F:175
subroutine, public destroy_cube_info(info)
...
Definition cube_utils.F:185
subroutine, public init_cube_info(info, dr, dh, dh_inv, ortho, max_radius)
...
Definition cube_utils.F:212
Routines to efficiently handle dense polynomial in 3 variables up to a given degree....
Definition d3_poly.F:23
subroutine, public init_d3_poly_module()
initialization of the cache, is called by functions in this module that use cached values
Definition d3_poly.F:74
the type I Discrete Cosine Transform (DCT-I)
Definition dct.F:16
integer, parameter, public neumannx
Definition dct.F:63
integer, parameter, public neumannxy
Definition dct.F:63
integer, parameter, public neumannxz
Definition dct.F:63
integer, parameter, public neumannxyz
Definition dct.F:63
integer, parameter, public neumannz
Definition dct.F:63
integer, parameter, public neumannyz
Definition dct.F:63
subroutine, public setup_dct_pw_grids(pw_grid, cell_hmat, neumann_directions, dct_pw_grid)
sets up an extended pw_grid for Discrete Cosine Transform (DCT) calculations
Definition dct.F:162
integer, parameter, public neumanny
Definition dct.F:63
dielectric constant data type
integer, parameter, public derivative_cd5
integer, parameter, public derivative_cd3
integer, parameter, public rho_dependent
integer, parameter, public derivative_cd7
subroutine, public init_fft_scratch_pool()
...
Definition fft_tools.F:2575
integer function, public gaussian_gridlevel(gridlevel_info, exponent)
...
subroutine, public destroy_gaussian_gridlevel(gridlevel_info, para_env)
...
subroutine, public init_gaussian_gridlevel(gridlevel_info, ngrid_levels, cutoff, rel_cutoff, print_section)
...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_method_ofgpw
integer, parameter, public do_method_rigpw
integer, parameter, public do_method_gpw
integer, parameter, public xc_vdw_fun_nonloc
integer, parameter, public do_method_gapw
integer, parameter, public do_method_lrigpw
integer, parameter, public do_method_gapw_xc
objects that represent the structure of input sections and the data contained in an input section
integer function, public section_get_ival(section_vals, keyword_name)
...
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
Definition and initialisation of the ps_wavelet data type.
integer, parameter, public wavelet3d
integer, parameter, public wavelet0d
integer, parameter, public wavelet2d
methods of pw_env that have dependence on qs_env
subroutine, public pw_env_rebuild(pw_env, qs_env, external_para_env)
rebuilds the pw_env data (necessary if cell or cutoffs change)
subroutine, public pw_env_create(pw_env)
creates a pw_env, if qs_env is given calls pw_env_rebuild
container for various plainwaves related things
This module returns additional info on PW grids.
integer function, dimension(3), public pw_grid_init_setup(hmat, cutoff, spherical, odd, fft_usage, ncommensurate, icommensurate, ref_grid, n_orig)
...
integer, parameter, public halfspace
integer, parameter, public fullspace
This module defines the grid data type and some basic operations on it.
Definition pw_grids.F:36
integer, parameter, public do_pw_grid_blocked_false
Definition pw_grids.F:77
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
Definition pw_grids.F:2163
subroutine, public pw_grid_change(cell_hmat, pw_grid)
Recalculate the g-vectors after a change of the box.
Definition pw_grids.F:2098
subroutine, public pw_poisson_set(poisson_env, cell_hmat, parameters, pw_pools, use_level, mt_super_ref_pw_grid, dct_pw_grid, force_rebuild)
sets cell, grids and parameters used by the poisson solver You should call this at least once (and se...
Reading of input parameters for the pw_poisson-modules.
subroutine, public pw_poisson_read_parameters(poisson_section, params)
Reads the POISSON input-section and into pw_poisson_parameter_type.
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_wavelet
integer, parameter, public pw_poisson_periodic
integer, parameter, public pw_poisson_none
integer, parameter, public pw_poisson_mt
integer, parameter, public pw_poisson_implicit
integer, parameter, public pw_poisson_analytic
integer, parameter, public pw_poisson_multipole
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
subroutine, public pw_pools_dealloc(pools)
deallocates the given pools (releasing each of the underlying pools)
subroutine, public pw_pool_release(pool)
releases the given pool (see cp2k/doc/ReferenceCounting.html)
subroutine, public pw_pool_create(pool, pw_grid, max_cache)
creates a pool for pw
Definition of disperson types for DFT calculations.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs)
...
subroutine, public rs_grid_print(rs, iounit)
Print information on grids to output.
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public rs_grid_create_descriptor(desc, pw_grid, input_settings, border_points)
Determine the setup of real space grids - this is divided up into the creation of a descriptor and th...
subroutine, public rs_grid_release_descriptor(rs_desc)
releases the given rs grid descriptor (see doc/ReferenceCounting.html)
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
input constants for xc
integer, parameter, public xc_deriv_spline2_smooth
integer, parameter, public xc_rho_spline2_smooth
integer, parameter, public xc_deriv_collocate
integer, parameter, public xc_rho_spline3_smooth
integer, parameter, public xc_deriv_nn10_smooth
integer, parameter, public xc_deriv_pw
integer, parameter, public xc_deriv_spline2
integer, parameter, public xc_rho_nn10
integer, parameter, public xc_deriv_nn50_smooth
integer, parameter, public xc_deriv_spline3
integer, parameter, public xc_rho_nn50
integer, parameter, public xc_deriv_spline3_smooth
integer, parameter, public xc_rho_no_smooth
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
contained for different pw related things
parameters for the poisson solver independet of input_section
to create arrays of pools
Provides all information about a quickstep kind.