(git:4cf809f)
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-2026 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,&
91 USE pw_pool_types, ONLY: pw_pool_create,&
99 USE qs_kind_types, ONLY: get_qs_kind,&
101 USE qs_rho0_types, ONLY: get_rho0_mpole,&
103 USE realspace_grid_types, ONLY: &
107 USE xc_input_constants, ONLY: &
111#include "./base/base_uses.f90"
112
113 IMPLICIT NONE
114 PRIVATE
115
116 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
117 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pw_env_methods'
118
120
121! **************************************************************************************************
122
123CONTAINS
124
125! **************************************************************************************************
126!> \brief creates a pw_env, if qs_env is given calls pw_env_rebuild
127!> \param pw_env the pw_env that gets created
128!> \par History
129!> 10.2002 created [fawzi]
130!> \author Fawzi Mohamed
131! **************************************************************************************************
132 SUBROUTINE pw_env_create(pw_env)
133 TYPE(pw_env_type), POINTER :: pw_env
134
135 CHARACTER(len=*), PARAMETER :: routinen = 'pw_env_create'
136
137 INTEGER :: handle
138
139 CALL timeset(routinen, handle)
140
141 cpassert(.NOT. ASSOCIATED(pw_env))
142 ALLOCATE (pw_env)
143 NULLIFY (pw_env%pw_pools, pw_env%gridlevel_info, pw_env%poisson_env, &
144 pw_env%cube_info, pw_env%rs_descs, pw_env%rs_grids, &
145 pw_env%xc_pw_pool, pw_env%vdw_pw_pool, &
146 pw_env%interp_section)
147 pw_env%auxbas_grid = -1
148 pw_env%ref_count = 1
149
150 CALL timestop(handle)
151
152 END SUBROUTINE pw_env_create
153
154! **************************************************************************************************
155!> \brief rebuilds the pw_env data (necessary if cell or cutoffs change)
156!> \param pw_env the environment to rebuild
157!> \param qs_env the qs_env where to get the cell, cutoffs,...
158!> \param external_para_env ...
159!> \par History
160!> 10.2002 created [fawzi]
161!> \author Fawzi Mohamed
162! **************************************************************************************************
163 SUBROUTINE pw_env_rebuild(pw_env, qs_env, external_para_env)
164 TYPE(pw_env_type), POINTER :: pw_env
165 TYPE(qs_environment_type), POINTER :: qs_env
166 TYPE(mp_para_env_type), INTENT(IN), OPTIONAL, &
167 TARGET :: external_para_env
168
169 CHARACTER(len=*), PARAMETER :: routinen = 'pw_env_rebuild'
170
171 CHARACTER(LEN=3) :: string
172 INTEGER :: blocked_id, blocked_id_input, boundary_condition, grid_span, handle, i, &
173 igrid_level, iounit, ncommensurate, ngrid_level, xc_deriv_method_id, xc_smooth_method_id
174 INTEGER, DIMENSION(2) :: distribution_layout
175 INTEGER, DIMENSION(3) :: higher_grid_layout
176 LOGICAL :: do_io, efg_present, linres_present, odd, set_vdw_pool, should_output, &
177 smooth_required, spherical, uf_grid, use_ref_cell
178 REAL(kind=dp) :: cutilev, fine_grid_factor, rel_cutoff
179 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: radius
180 REAL(kind=dp), DIMENSION(:), POINTER :: cutoff
181 TYPE(cell_type), POINTER :: cell, cell_ref, my_cell
182 TYPE(cp_logger_type), POINTER :: logger
183 TYPE(dft_control_type), POINTER :: dft_control
184 TYPE(mp_para_env_type), POINTER :: para_env
185 TYPE(pw_grid_type), POINTER :: dct_pw_grid, mt_super_ref_grid, old_pw_grid, pw_grid, &
186 super_ref_grid, vdw_grid, vdw_ref_grid, xc_super_ref_grid
187 TYPE(pw_poisson_parameter_type) :: poisson_params
188 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: pw_pools
189 TYPE(qs_dispersion_type), POINTER :: dispersion_env
190 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
191 TYPE(realspace_grid_desc_p_type), DIMENSION(:), &
192 POINTER :: rs_descs
193 TYPE(realspace_grid_input_type) :: input_settings
194 TYPE(realspace_grid_type), DIMENSION(:), POINTER :: rs_grids
195 TYPE(section_vals_type), POINTER :: efg_section, input, linres_section, &
196 poisson_section, print_section, &
197 rs_grid_section, xc_section
198
199 ! a very small safety factor might be needed for roundoff issues
200 ! e.g. radius being computed here as 12.998 (13) and 13.002 (14) during the collocation
201 ! the latter can happen due to the lower precision in the computation of the radius in collocate
202 ! parallel cost of rs_pw_transfer goes as safety_factor**3 so it is worthwhile keeping it tight
203 ! Edit: Safety Factor was unused
204
205 CALL timeset(routinen, handle)
206
207 !
208 !
209 ! Part one, deallocate old data if needed
210 !
211 !
212 NULLIFY (cutoff, cell, pw_grid, old_pw_grid, dft_control, qs_kind_set, &
213 pw_pools, rs_descs, para_env, cell_ref, vdw_ref_grid, &
214 mt_super_ref_grid, input, poisson_section, xc_super_ref_grid, &
215 dct_pw_grid, vdw_grid, super_ref_grid, my_cell, rs_grids, dispersion_env)
216
217 CALL get_qs_env(qs_env=qs_env, &
218 dft_control=dft_control, &
219 qs_kind_set=qs_kind_set, &
220 cell_ref=cell_ref, &
221 cell=cell, &
222 para_env=para_env, &
223 input=input, &
224 dispersion_env=dispersion_env)
225
226 cpassert(ASSOCIATED(pw_env))
227 cpassert(pw_env%ref_count > 0)
228 CALL pw_pool_release(pw_env%vdw_pw_pool)
229 CALL pw_pool_release(pw_env%xc_pw_pool)
230 CALL pw_pools_dealloc(pw_env%pw_pools)
231 IF (ASSOCIATED(pw_env%rs_descs)) THEN
232 DO i = 1, SIZE(pw_env%rs_descs)
233 CALL rs_grid_release_descriptor(pw_env%rs_descs(i)%rs_desc)
234 END DO
235 DEALLOCATE (pw_env%rs_descs)
236 END IF
237 IF (ASSOCIATED(pw_env%rs_grids)) THEN
238 DO i = 1, SIZE(pw_env%rs_grids)
239 CALL rs_grid_release(pw_env%rs_grids(i))
240 END DO
241 DEALLOCATE (pw_env%rs_grids)
242 END IF
243 IF (ASSOCIATED(pw_env%gridlevel_info)) THEN
244 CALL destroy_gaussian_gridlevel(pw_env%gridlevel_info)
245 ELSE
246 ALLOCATE (pw_env%gridlevel_info)
247 END IF
248
249 IF (ASSOCIATED(pw_env%cube_info)) THEN
250 DO igrid_level = 1, SIZE(pw_env%cube_info)
251 CALL destroy_cube_info(pw_env%cube_info(igrid_level))
252 END DO
253 DEALLOCATE (pw_env%cube_info)
254 END IF
255 NULLIFY (pw_env%pw_pools, pw_env%cube_info)
256
257 ! remove fft scratch pool, as it depends on pw_env mpi group handles
259
260 !
261 !
262 ! Part two, setup the pw_grids
263 !
264 !
265
266 do_io = .true.
267 IF (PRESENT(external_para_env)) THEN
268 para_env => external_para_env
269 cpassert(ASSOCIATED(para_env))
270 do_io = .false. !multiple MPI subgroups mess-up the output file
271 END IF
272 ! interpolation section
273 pw_env%interp_section => section_vals_get_subs_vals(input, "DFT%MGRID%INTERPOLATOR")
274
275 CALL get_qs_env(qs_env, use_ref_cell=use_ref_cell)
276 IF (use_ref_cell) THEN
277 my_cell => cell_ref
278 ELSE
279 my_cell => cell
280 END IF
281 rel_cutoff = dft_control%qs_control%relative_cutoff
282 cutoff => dft_control%qs_control%e_cutoff
283 CALL section_vals_val_get(input, "DFT%XC%XC_GRID%USE_FINER_GRID", l_val=uf_grid)
284 CALL section_vals_val_get(input, "DFT%XC%XC_GRID%FINE_GRID_FACTOR", r_val=fine_grid_factor)
285 IF (uf_grid .AND. fine_grid_factor <= 1.0_dp) THEN
286 cpabort("FINE_GRID_FACTOR must be larger than one when USE_FINER_GRID is enabled")
287 END IF
288 ngrid_level = SIZE(cutoff)
289
290 ! init gridlevel_info XXXXXXXXX setup mapping to the effective cutoff ?
291 ! XXXXXXXXX the cutoff array here is more a 'wish-list'
292 ! XXXXXXXXX same holds for radius
293 print_section => section_vals_get_subs_vals(input, &
294 "PRINT%GRID_INFORMATION")
295 CALL init_gaussian_gridlevel(pw_env%gridlevel_info, &
296 ngrid_levels=ngrid_level, cutoff=cutoff, rel_cutoff=rel_cutoff, &
297 print_section=print_section)
298 ! init pw_grids and pools
299 ALLOCATE (pw_pools(ngrid_level))
300
301 IF (dft_control%qs_control%commensurate_mgrids) THEN
302 ncommensurate = ngrid_level
303 ELSE
304 ncommensurate = 0
305 END IF
306 !
307 ! If Tuckerman is present let's perform the set-up of the super-reference-grid
308 !
309 cutilev = cutoff(1)
310 IF (dft_control%qs_control%pw_grid_opt%spherical) THEN
311 grid_span = halfspace
312 spherical = .true.
313 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace) THEN
314 grid_span = fullspace
315 spherical = .false.
316 ELSE
317 grid_span = halfspace
318 spherical = .false.
319 END IF
320
321 poisson_section => section_vals_get_subs_vals(qs_env%input, "DFT%POISSON")
322 CALL setup_super_ref_grid(super_ref_grid, mt_super_ref_grid, &
323 xc_super_ref_grid, cutilev, grid_span, spherical, my_cell, para_env, &
324 poisson_section, ncommensurate, uf_grid=uf_grid, &
325 fine_grid_factor=fine_grid_factor, &
326 print_section=print_section)
327 old_pw_grid => super_ref_grid
328 IF (.NOT. ASSOCIATED(mt_super_ref_grid)) vdw_ref_grid => super_ref_grid
329 !
330 ! Setup of the multi-grid pw_grid and pw_pools
331 !
332
333 IF (do_io) THEN
334 logger => cp_get_default_logger()
335 iounit = cp_print_key_unit_nr(logger, print_section, '', extension='.Log')
336 ELSE
337 iounit = 0
338 END IF
339
340 IF (dft_control%qs_control%pw_grid_opt%spherical) THEN
341 grid_span = halfspace
342 spherical = .true.
343 odd = .true.
344 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace) THEN
345 grid_span = fullspace
346 spherical = .false.
347 odd = .false.
348 ELSE
349 grid_span = halfspace
350 spherical = .false.
351 odd = .true.
352 END IF
353
354 ! use input suggestion for blocked
355 blocked_id_input = dft_control%qs_control%pw_grid_opt%blocked
356
357 ! methods that require smoothing or nearest neighbor have to use a plane distributed setup
358 ! find the xc properties (FIXME this could miss other xc sections that operate on the grid ...)
359 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
360 xc_deriv_method_id = section_get_ival(xc_section, "XC_GRID%XC_DERIV")
361 xc_smooth_method_id = section_get_ival(xc_section, "XC_GRID%XC_SMOOTH_RHO")
362 smooth_required = .false.
363 SELECT CASE (xc_deriv_method_id)
365 smooth_required = smooth_required .OR. .false.
368 smooth_required = smooth_required .OR. .true.
369 CASE DEFAULT
370 cpabort("")
371 END SELECT
372 SELECT CASE (xc_smooth_method_id)
373 CASE (xc_rho_no_smooth)
374 smooth_required = smooth_required .OR. .false.
376 smooth_required = smooth_required .OR. .true.
377 CASE DEFAULT
378 cpabort("")
379 END SELECT
380 ! EPR, NMR, EFG can require splines. If the linres/EFG section is present we assume
381 ! it could be on and splines might be used (not quite sure if this is due to their use of splines or something else)
382 linres_section => section_vals_get_subs_vals(section_vals=input, &
383 subsection_name="PROPERTIES%LINRES")
384 CALL section_vals_get(linres_section, explicit=linres_present)
385 IF (linres_present) THEN
386 smooth_required = smooth_required .OR. .true.
387 END IF
388
389 efg_section => section_vals_get_subs_vals(section_vals=input, &
390 subsection_name="DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
391 CALL section_vals_get(efg_section, explicit=efg_present)
392 IF (efg_present) THEN
393 smooth_required = smooth_required .OR. .true.
394 END IF
395
396 DO igrid_level = 1, ngrid_level
397 cutilev = cutoff(igrid_level)
398
399 ! the whole of QS seems to work fine with either blocked/non-blocked distribution in g-space
400 ! the default choice should be made free
401 blocked_id = blocked_id_input
402
403 distribution_layout = dft_control%qs_control%pw_grid_opt%distribution_layout
404
405 ! qmmm does not support a ray distribution
406 ! FIXME ... check if a plane distributed lower grid is sufficient
407 IF (qs_env%qmmm) THEN
408 distribution_layout = [para_env%num_pe, 1]
409 END IF
410
411 ! If splines are required
412 ! FIXME.... should only be true for the highest grid
413 IF (smooth_required) THEN
414 distribution_layout = [para_env%num_pe, 1]
415 END IF
416
417 IF (igrid_level == 1) THEN
418 IF (ASSOCIATED(old_pw_grid)) THEN
419 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
420 cutoff=cutilev, &
421 spherical=spherical, odd=odd, fft_usage=.true., &
422 ncommensurate=ncommensurate, icommensurate=igrid_level, &
423 blocked=do_pw_grid_blocked_false, &
424 ref_grid=old_pw_grid, &
425 rs_dims=distribution_layout, &
426 iounit=iounit)
427 old_pw_grid => pw_grid
428 ELSE
429 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
430 cutoff=cutilev, &
431 spherical=spherical, odd=odd, fft_usage=.true., &
432 ncommensurate=ncommensurate, icommensurate=igrid_level, &
433 blocked=blocked_id, &
434 rs_dims=distribution_layout, &
435 iounit=iounit)
436 old_pw_grid => pw_grid
437 END IF
438 ELSE
439 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
440 cutoff=cutilev, &
441 spherical=spherical, odd=odd, fft_usage=.true., &
442 ncommensurate=ncommensurate, icommensurate=igrid_level, &
443 blocked=do_pw_grid_blocked_false, &
444 ref_grid=old_pw_grid, &
445 rs_dims=distribution_layout, &
446 iounit=iounit)
447 END IF
448
449 ! init pw_pools
450 NULLIFY (pw_pools(igrid_level)%pool)
451 CALL pw_pool_create(pw_pools(igrid_level)%pool, pw_grid=pw_grid)
452
453 CALL pw_grid_release(pw_grid)
454
455 END DO
456
457 pw_env%pw_pools => pw_pools
458
459 ! init auxbas_grid
460 DO i = 1, ngrid_level
461 IF (cutoff(i) == dft_control%qs_control%cutoff) pw_env%auxbas_grid = i
462 END DO
463
464 ! init xc_pool
465 IF (ASSOCIATED(xc_super_ref_grid)) THEN
466 CALL pw_pool_create(pw_env%xc_pw_pool, &
467 pw_grid=xc_super_ref_grid)
468 CALL pw_grid_release(xc_super_ref_grid)
469 ELSE
470 pw_env%xc_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
471 CALL pw_env%xc_pw_pool%retain()
472 END IF
473
474 ! init vdw_pool
475 set_vdw_pool = .false.
476 IF (ASSOCIATED(dispersion_env)) THEN
477 IF (dispersion_env%type == xc_vdw_fun_nonloc) THEN
478 IF (dispersion_env%pw_cutoff > 0._dp) set_vdw_pool = .true.
479 END IF
480 END IF
481 IF (set_vdw_pool) THEN
482 cpassert(ASSOCIATED(old_pw_grid))
483 IF (.NOT. ASSOCIATED(vdw_ref_grid)) vdw_ref_grid => old_pw_grid
484 IF (iounit > 0) WRITE (iounit, "(/,T2,A)") "PW_GRID| Grid for non-local vdW functional"
485 CALL pw_grid_create(vdw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
486 cutoff=dispersion_env%pw_cutoff, &
487 spherical=spherical, odd=odd, fft_usage=.true., &
488 ncommensurate=0, icommensurate=0, &
489 blocked=do_pw_grid_blocked_false, &
490 ref_grid=vdw_ref_grid, &
491 rs_dims=distribution_layout, &
492 iounit=iounit)
493 CALL pw_pool_create(pw_env%vdw_pw_pool, pw_grid=vdw_grid)
494 CALL pw_grid_release(vdw_grid)
495 ELSE
496 pw_env%vdw_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
497 CALL pw_env%vdw_pw_pool%retain()
498 END IF
499
500 IF (do_io) CALL cp_print_key_finished_output(iounit, logger, print_section, '')
501
502 ! complete init of the poisson_env
503 IF (.NOT. ASSOCIATED(pw_env%poisson_env)) THEN
504 ALLOCATE (pw_env%poisson_env)
505 CALL pw_env%poisson_env%create()
506 END IF
507 ! poisson_section => section_vals_get_subs_vals(input, "DFT%POISSON")
508
509 CALL pw_poisson_read_parameters(poisson_section, poisson_params)
510 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=my_cell%hmat, pw_pools=pw_env%pw_pools, &
511 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
512 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
513 CALL pw_grid_release(mt_super_ref_grid)
514 CALL pw_grid_release(dct_pw_grid)
515!
516! If reference cell is present, then use pw_grid_change to keep bounds constant...
517! do not re-init the Gaussian grid level (fix the gridlevel on which the pgf should go.
518!
519 IF (use_ref_cell) THEN
520 DO igrid_level = 1, SIZE(pw_pools)
521 CALL pw_grid_change(cell%hmat, pw_pools(igrid_level)%pool%pw_grid)
522 END DO
523 IF (set_vdw_pool) CALL pw_grid_change(cell%hmat, pw_env%vdw_pw_pool%pw_grid)
524 CALL pw_poisson_read_parameters(poisson_section, poisson_params)
525 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=cell%hmat, pw_pools=pw_env%pw_pools, &
526 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
527 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
528 END IF
529
530 IF ((poisson_params%ps_implicit_params%boundary_condition == mixed_periodic_bc) .OR. &
531 (poisson_params%ps_implicit_params%boundary_condition == mixed_bc)) THEN
532 pw_env%poisson_env%parameters%dbc_params%do_dbc_cube = &
533 btest(cp_print_key_should_output(logger%iter_info, input, &
534 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"), cp_p_file)
535 END IF
536 ! setup dct_pw_grid (an extended pw_grid) for Discrete Cosine Transformation (DCT)
537 IF ((poisson_params%ps_implicit_params%boundary_condition == neumann_bc) .OR. &
538 (poisson_params%ps_implicit_params%boundary_condition == mixed_bc)) THEN
539 CALL setup_dct_pw_grids(pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid, &
540 my_cell%hmat, poisson_params%ps_implicit_params%neumann_directions, &
541 pw_env%poisson_env%dct_pw_grid)
542 END IF
543 ! setup real space grid for finite difference derivatives of dielectric constant function
544 IF (poisson_params%has_dielectric .AND. &
545 ((poisson_params%dielectric_params%derivative_method == derivative_cd3) .OR. &
546 (poisson_params%dielectric_params%derivative_method == derivative_cd5) .OR. &
547 (poisson_params%dielectric_params%derivative_method == derivative_cd7))) THEN
548
549 SELECT CASE (poisson_params%ps_implicit_params%boundary_condition)
550 CASE (neumann_bc, mixed_bc)
551 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
552 poisson_params%dielectric_params%derivative_method, input, &
553 pw_env%poisson_env%dct_pw_grid)
555 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
556 poisson_params%dielectric_params%derivative_method, input, &
557 pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid)
558 END SELECT
559
560 END IF
561
562!
563!
564! determine the maximum radii for mapped gaussians, needed to
565! set up distributed rs grids
566!
567!
568
569 ALLOCATE (radius(ngrid_level))
570
571 CALL compute_max_radius(radius, pw_env, qs_env)
572
573!
574!
575! set up the rs_grids and the cubes, requires 'radius' to be set up correctly
576!
577!
578 ALLOCATE (rs_descs(ngrid_level))
579
580 ALLOCATE (rs_grids(ngrid_level))
581
582 ALLOCATE (pw_env%cube_info(ngrid_level))
583 higher_grid_layout = [-1, -1, -1]
584
585 DO igrid_level = 1, ngrid_level
586 pw_grid => pw_pools(igrid_level)%pool%pw_grid
587
588 CALL init_d3_poly_module() ! a fairly arbitrary but sufficient spot to do this
589 CALL init_cube_info(pw_env%cube_info(igrid_level), &
590 pw_grid%dr(:), pw_grid%dh(:, :), pw_grid%dh_inv(:, :), pw_grid%orthorhombic, &
591 radius(igrid_level))
592
593 rs_grid_section => section_vals_get_subs_vals(input, "DFT%MGRID%RS_GRID")
594
595 CALL init_input_type(input_settings, nsmax=2*max(1, return_cube_max_iradius(pw_env%cube_info(igrid_level))) + 1, &
596 rs_grid_section=rs_grid_section, ilevel=igrid_level, &
597 higher_grid_layout=higher_grid_layout)
598
599 NULLIFY (rs_descs(igrid_level)%rs_desc)
600 CALL rs_grid_create_descriptor(rs_descs(igrid_level)%rs_desc, pw_grid, input_settings)
601
602 IF (rs_descs(igrid_level)%rs_desc%distributed) higher_grid_layout = rs_descs(igrid_level)%rs_desc%group_dim
603
604 CALL rs_grid_create(rs_grids(igrid_level), rs_descs(igrid_level)%rs_desc)
605 END DO
606 pw_env%rs_descs => rs_descs
607 pw_env%rs_grids => rs_grids
608
609 DEALLOCATE (radius)
610
611 ! Print grid information
612
613 IF (do_io) THEN
614 logger => cp_get_default_logger()
615 iounit = cp_print_key_unit_nr(logger, print_section, '', extension='.Log')
616 END IF
617 IF (iounit > 0) THEN
618 SELECT CASE (poisson_params%solver)
620 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
621 "POISSON| Solver", "PERIODIC"
623 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
624 "POISSON| Solver", "ANALYTIC"
625 CASE (pw_poisson_mt)
626 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
627 "POISSON| Solver", adjustr("Martyna-Tuckerman (MT)")
628 WRITE (unit=iounit, fmt="(T2,A,T71,F10.3,/,T2,A,T71,F10.1)") &
629 "POISSON| MT| Alpha", poisson_params%mt_alpha, &
630 "POISSON| MT| Relative cutoff", poisson_params%mt_rel_cutoff
632 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
633 "POISSON| Solver", "MULTIPOLE (Bloechl)"
634 CASE (pw_poisson_wavelet)
635 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
636 "POISSON| Solver", "WAVELET"
637 WRITE (unit=iounit, fmt="(T2,A,T71,I10)") &
638 "POISSON| Wavelet| Scaling function", poisson_params%wavelet_scf_type
639 SELECT CASE (poisson_params%wavelet_method)
640 CASE (wavelet0d)
641 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
642 "POISSON| Periodicity", "NONE"
643 CASE (wavelet2d)
644 string = ""
645 IF (poisson_params%periodic(1) == 1) string = trim(string)//"X"
646 IF (poisson_params%periodic(2) == 1) string = trim(string)//"Y"
647 IF (poisson_params%periodic(3) == 1) string = trim(string)//"Z"
648 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
649 "POISSON| Periodicity", adjustr(string)
650 CASE (wavelet3d)
651 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
652 "POISSON| Periodicity", "XYZ"
653 CASE DEFAULT
654 cpabort("Invalid periodicity for wavelet solver selected")
655 END SELECT
657 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
658 "POISSON| Solver", "IMPLICIT (GENERALIZED)"
659 boundary_condition = poisson_params%ps_implicit_params%boundary_condition
660 SELECT CASE (boundary_condition)
661 CASE (periodic_bc)
662 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
663 "POISSON| Boundary Condition", "PERIODIC"
664 CASE (neumann_bc, mixed_bc)
665 IF (boundary_condition == neumann_bc) THEN
666 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
667 "POISSON| Boundary Condition", "NEUMANN"
668 ELSE
669 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
670 "POISSON| Boundary Condition", "MIXED"
671 END IF
672 SELECT CASE (poisson_params%ps_implicit_params%neumann_directions)
673 CASE (neumannxyz)
674 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X, Y, Z"
675 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "NONE"
676 CASE (neumannxy)
677 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X, Y"
678 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "Z"
679 CASE (neumannxz)
680 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X, Z"
681 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "Y"
682 CASE (neumannyz)
683 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "Y, Z"
684 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "X"
685 CASE (neumannx)
686 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "X"
687 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "Y, Z"
688 CASE (neumanny)
689 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "Y"
690 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "X, Z"
691 CASE (neumannz)
692 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| homogeneous Neumann directions", "Z"
693 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") "POISSON| periodic directions", "X, Y"
694 CASE DEFAULT
695 cpabort("Invalid combination of Neumann and periodic conditions.")
696 END SELECT
697 CASE (mixed_periodic_bc)
698 WRITE (unit=iounit, fmt="(T2,A,T51,A30)") &
699 "POISSON| Boundary Condition", "PERIODIC & DIRICHLET"
700 CASE DEFAULT
701 cpabort("Invalid boundary conditions for the implicit (generalized) poisson solver.")
702 END SELECT
703 WRITE (unit=iounit, fmt="(T2,A,T71,I10)") &
704 "POISSON| Maximum number of iterations", poisson_params%ps_implicit_params%max_iter
705 WRITE (unit=iounit, fmt="(T2,A,T51,ES30.2)") &
706 "POISSON| Convergence threshold", poisson_params%ps_implicit_params%tol
707 IF (poisson_params%dielectric_params%dielec_functiontype == rho_dependent) THEN
708 WRITE (unit=iounit, fmt="(T2,A,T51,F30.2)") &
709 "POISSON| Dielectric Constant", poisson_params%dielectric_params%eps0
710 ELSE
711 WRITE (unit=iounit, fmt="(T2,A,T31,F9.2)", advance='NO') &
712 "POISSON| Dielectric Constants", poisson_params%dielectric_params%eps0
713 DO i = 1, poisson_params%dielectric_params%n_aa_cuboidal
714 WRITE (unit=iounit, fmt="(F9.2)", advance='NO') &
715 poisson_params%dielectric_params%aa_cuboidal_eps(i)
716 END DO
717 DO i = 1, poisson_params%dielectric_params%n_xaa_annular
718 WRITE (unit=iounit, fmt="(F9.2)", advance='NO') &
719 poisson_params%dielectric_params%xaa_annular_eps(i)
720 END DO
721 WRITE (unit=iounit, fmt='(A1,/)')
722 END IF
723 WRITE (unit=iounit, fmt="(T2,A,T51,ES30.2)") &
724 "POISSON| Relaxation parameter", poisson_params%ps_implicit_params%omega
725 CASE (pw_poisson_none)
726 WRITE (unit=iounit, fmt="(/,T2,A,T51,A30)") &
727 "POISSON| Solver", "NONE"
728 CASE default
729 cpabort("Invalid Poisson solver selected")
730 END SELECT
731 IF ((poisson_params%solver /= pw_poisson_wavelet) .AND. &
732 (poisson_params%solver /= pw_poisson_implicit)) THEN
733 IF (sum(poisson_params%periodic(1:3)) == 0) THEN
734 WRITE (unit=iounit, fmt="(T2,A,T77,A4)") &
735 "POISSON| Periodicity", "NONE"
736 ELSE
737 string = ""
738 IF (poisson_params%periodic(1) == 1) string = trim(string)//"X"
739 IF (poisson_params%periodic(2) == 1) string = trim(string)//"Y"
740 IF (poisson_params%periodic(3) == 1) string = trim(string)//"Z"
741 WRITE (unit=iounit, fmt="(T2,A,T78,A3)") &
742 "POISSON| Periodicity", adjustr(string)
743 END IF
744 END IF
745 END IF
746
747 IF ((dft_control%qs_control%method_id == do_method_gpw) .OR. &
748 (dft_control%qs_control%method_id == do_method_gapw) .OR. &
749 (dft_control%qs_control%method_id == do_method_gapw_xc) .OR. &
750 (dft_control%qs_control%method_id == do_method_lrigpw) .OR. &
751 (dft_control%qs_control%method_id == do_method_rigpw) .OR. &
752 (dft_control%qs_control%method_id == do_method_ofgpw)) THEN
753 IF (poisson_params%solver /= pw_poisson_implicit) THEN
754 IF (any(my_cell%perd(1:3) /= poisson_params%periodic(1:3))) THEN
755 CALL cp_warn(__location__, &
756 "The selected periodicities in the sections &CELL and &POISSON do not match")
757 END IF
758 END IF
759 END IF
760
761 IF (do_io) THEN
762 should_output = btest(cp_print_key_should_output(logger%iter_info, &
763 print_section, ''), cp_p_file)
764 IF (should_output) THEN
765 DO igrid_level = 1, ngrid_level
766 CALL rs_grid_print(rs_grids(igrid_level), iounit)
767 END DO
768 END IF
769 CALL cp_print_key_finished_output(iounit, logger, print_section, "")
770 END IF
771
772 CALL timestop(handle)
773
774 END SUBROUTINE pw_env_rebuild
775
776! **************************************************************************************************
777!> \brief computes the maximum radius
778!> \param radius ...
779!> \param pw_env ...
780!> \param qs_env ...
781!> \par History
782!> 10.2010 refactored [Joost VandeVondele]
783!> 01.2020 igrid_zet0_s initialisation code is reused in rho0_s_grid_create() [Sergey Chulkov]
784!> \author Joost VandeVondele
785! **************************************************************************************************
786 SUBROUTINE compute_max_radius(radius, pw_env, qs_env)
787 REAL(kind=dp), DIMENSION(:), INTENT(OUT) :: radius
788 TYPE(pw_env_type), POINTER :: pw_env
789 TYPE(qs_environment_type), POINTER :: qs_env
790
791 CHARACTER(len=*), PARAMETER :: routinen = 'compute_max_radius'
792 CHARACTER(LEN=8), DIMENSION(10), PARAMETER :: sbas = ["ORB ", "AUX ", "RI_AUX ", &
793 "MAO ", "HARRIS ", "RI_HXC ", "RI_K ", "LRI_AUX ", "RHOIN ", "NUC "]
794 CHARACTER(LEN=8), DIMENSION(5), PARAMETER :: &
795 pbas = ["ORB ", "AUX_FIT ", "MAO ", "HARRIS ", "NUC "]
796 REAL(kind=dp), PARAMETER :: safety_factor = 1.015_dp
797
798 INTEGER :: handle, ibasis_set_type, igrid_level, igrid_zet0_s, ikind, ipgf, iset, ishell, &
799 jkind, jpgf, jset, jshell, la, lb, lgrid_level, ngrid_level, nkind, nseta, nsetb
800 INTEGER, DIMENSION(:), POINTER :: npgfa, npgfb, nshella, nshellb
801 INTEGER, DIMENSION(:, :), POINTER :: lshella, lshellb
802 REAL(kind=dp) :: alpha, core_charge, eps_gvg, eps_rho, &
803 max_rpgf0_s, maxradius, zet0_h, zetp
804 REAL(kind=dp), DIMENSION(:, :), POINTER :: zeta, zetb
805 TYPE(cneo_potential_type), POINTER :: cneo_potential
806 TYPE(dft_control_type), POINTER :: dft_control
807 TYPE(gto_basis_set_type), POINTER :: orb_basis_set
808 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
809 TYPE(qs_kind_type), POINTER :: qs_kind
810 TYPE(rho0_mpole_type), POINTER :: rho0_mpole
811
812 ! a very small safety factor might be needed for roundoff issues
813 ! e.g. radius being computed here as 12.998 (13) and 13.002 (14) during the collocation
814 ! the latter can happen due to the lower precision in the computation of the radius in collocate
815 ! parallel cost of rs_pw_transfer goes as safety_factor**3 so it is worthwhile keeping it tight
816
817 CALL timeset(routinen, handle)
818 NULLIFY (dft_control, qs_kind_set, rho0_mpole)
819
820 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
821
822 eps_rho = dft_control%qs_control%eps_rho_rspace
823 eps_gvg = dft_control%qs_control%eps_gvg_rspace
824
825 IF (dft_control%qs_control%gapw) THEN
826 CALL get_qs_env(qs_env=qs_env, rho0_mpole=rho0_mpole)
827 cpassert(ASSOCIATED(rho0_mpole))
828
829 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, max_rpgf0_s=max_rpgf0_s, zet0_h=zet0_h)
830 igrid_zet0_s = gaussian_gridlevel(pw_env%gridlevel_info, 2.0_dp*zet0_h)
831 rho0_mpole%igrid_zet0_s = igrid_zet0_s
832 END IF
833
834 ngrid_level = SIZE(radius)
835 nkind = SIZE(qs_kind_set)
836
837 ! try to predict the maximum radius of the gaussians to be mapped on the grid
838 ! up to now, it is not yet very good
839 radius = 0.0_dp
840 DO igrid_level = 1, ngrid_level
841
842 maxradius = 0.0_dp
843 ! Take into account the radius of the soft compensation charge rho0_soft1
844 IF (dft_control%qs_control%gapw) THEN
845 IF (igrid_zet0_s == igrid_level) maxradius = max(maxradius, max_rpgf0_s)
846 END IF
847
848 ! this is to be sure that the core charge is mapped ok
849 ! right now, the core is mapped on the auxiliary basis,
850 ! this should, at a give point be changed
851 ! so that also for the core a multigrid is used
852 DO ikind = 1, nkind
853 NULLIFY (cneo_potential)
854 CALL get_qs_kind(qs_kind_set(ikind), cneo_potential=cneo_potential)
855 IF (ASSOCIATED(cneo_potential)) cycle
856 CALL get_qs_kind(qs_kind_set(ikind), &
857 alpha_core_charge=alpha, ccore_charge=core_charge)
858 IF (alpha > 0.0_dp .AND. core_charge /= 0.0_dp) THEN
859 maxradius = max(maxradius, exp_radius(0, alpha, eps_rho, core_charge, rlow=maxradius))
860 ! forces
861 maxradius = max(maxradius, exp_radius(1, alpha, eps_rho, core_charge, rlow=maxradius))
862 END IF
863 END DO
864
865 ! loop over basis sets that are used in grid collocation directly (no product)
866 ! e.g. for calculating a wavefunction or a RI density
867 DO ibasis_set_type = 1, SIZE(sbas)
868 DO ikind = 1, nkind
869 qs_kind => qs_kind_set(ikind)
870 NULLIFY (orb_basis_set)
871 CALL get_qs_kind(qs_kind=qs_kind, &
872 basis_set=orb_basis_set, basis_type=sbas(ibasis_set_type))
873 IF (.NOT. ASSOCIATED(orb_basis_set)) cycle
874 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
875 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
876 DO iset = 1, nseta
877 DO ipgf = 1, npgfa(iset)
878 DO ishell = 1, nshella(iset)
879 zetp = zeta(ipgf, iset)
880 la = lshella(ishell, iset)
881 lgrid_level = gaussian_gridlevel(pw_env%gridlevel_info, zetp)
882 IF (lgrid_level == igrid_level) THEN
883 maxradius = max(maxradius, exp_radius(la, zetp, eps_rho, 1.0_dp, rlow=maxradius))
884 END IF
885 END DO
886 END DO
887 END DO
888 END DO
889 END DO
890 ! loop over basis sets that are used in product function grid collocation
891 DO ibasis_set_type = 1, SIZE(pbas)
892 DO ikind = 1, nkind
893 qs_kind => qs_kind_set(ikind)
894 NULLIFY (orb_basis_set)
895 CALL get_qs_kind(qs_kind=qs_kind, &
896 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
897 IF (.NOT. ASSOCIATED(orb_basis_set)) cycle
898 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
899 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
900
901 DO jkind = 1, nkind
902 qs_kind => qs_kind_set(jkind)
903 CALL get_qs_kind(qs_kind=qs_kind, &
904 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
905 IF (.NOT. ASSOCIATED(orb_basis_set)) cycle
906 CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
907 npgf=npgfb, nset=nsetb, zet=zetb, l=lshellb, nshell=nshellb)
908 DO iset = 1, nseta
909 DO ipgf = 1, npgfa(iset)
910 DO ishell = 1, nshella(iset)
911 la = lshella(ishell, iset)
912 DO jset = 1, nsetb
913 DO jpgf = 1, npgfb(jset)
914 DO jshell = 1, nshellb(jset)
915 zetp = zeta(ipgf, iset) + zetb(jpgf, jset)
916 lb = lshellb(jshell, jset) + la
917 lgrid_level = gaussian_gridlevel(pw_env%gridlevel_info, zetp)
918 IF (lgrid_level == igrid_level) THEN
919 ! density (scale is at most 2)
920 maxradius = max(maxradius, exp_radius(lb, zetp, eps_rho, 2.0_dp, rlow=maxradius))
921 ! tau, properties?
922 maxradius = max(maxradius, exp_radius(lb + 1, zetp, eps_rho, 2.0_dp, rlow=maxradius))
923 ! potential
924 maxradius = max(maxradius, exp_radius(lb, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
925 ! forces
926 maxradius = max(maxradius, exp_radius(lb + 1, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
927 END IF
928 END DO
929 END DO
930 END DO
931 END DO
932 END DO
933 END DO
934 END DO
935 END DO
936 END DO
937
938 ! this is a bit of hack, but takes into account numerics and rounding
939 maxradius = maxradius*safety_factor
940 radius(igrid_level) = maxradius
941 END DO
942
943 CALL timestop(handle)
944
945 END SUBROUTINE compute_max_radius
946
947! **************************************************************************************************
948!> \brief Initialize the super-reference grid for Tuckerman or xc
949!> \param super_ref_pw_grid ...
950!> \param mt_super_ref_pw_grid ...
951!> \param xc_super_ref_pw_grid ...
952!> \param cutilev ...
953!> \param grid_span ...
954!> \param spherical ...
955!> \param cell_ref ...
956!> \param para_env ...
957!> \param poisson_section ...
958!> \param my_ncommensurate ...
959!> \param uf_grid ...
960!> \param fine_grid_factor ...
961!> \param print_section ...
962!> \author 03-2005 Teodoro Laino [teo]
963!> \note
964!> move somewere else?
965! **************************************************************************************************
966 SUBROUTINE setup_super_ref_grid(super_ref_pw_grid, mt_super_ref_pw_grid, &
967 xc_super_ref_pw_grid, cutilev, grid_span, spherical, &
968 cell_ref, para_env, poisson_section, my_ncommensurate, uf_grid, &
969 fine_grid_factor, print_section)
970 TYPE(pw_grid_type), POINTER :: super_ref_pw_grid, mt_super_ref_pw_grid, &
971 xc_super_ref_pw_grid
972 REAL(kind=dp), INTENT(IN) :: cutilev
973 INTEGER, INTENT(IN) :: grid_span
974 LOGICAL, INTENT(in) :: spherical
975 TYPE(cell_type), POINTER :: cell_ref
976 TYPE(mp_para_env_type), POINTER :: para_env
977 TYPE(section_vals_type), POINTER :: poisson_section
978 INTEGER, INTENT(IN) :: my_ncommensurate
979 LOGICAL, INTENT(in) :: uf_grid
980 REAL(kind=dp), INTENT(IN) :: fine_grid_factor
981 TYPE(section_vals_type), POINTER :: print_section
982
983 INTEGER :: iounit, my_val, nn(3), no(3)
984 LOGICAL :: mt_s_grid
985 REAL(kind=dp) :: mt_rel_cutoff, my_cutilev
986 TYPE(cp_logger_type), POINTER :: logger
987
988 cpassert(.NOT. ASSOCIATED(mt_super_ref_pw_grid))
989 cpassert(.NOT. ASSOCIATED(xc_super_ref_pw_grid))
990 cpassert(.NOT. ASSOCIATED(super_ref_pw_grid))
991 CALL section_vals_val_get(poisson_section, "POISSON_SOLVER", i_val=my_val)
992 !
993 ! Check if grids will be the same... In this case we don't use a super-reference grid
994 !
995 mt_s_grid = .false.
996 IF (my_val == pw_poisson_mt) THEN
997 CALL section_vals_val_get(poisson_section, "MT%REL_CUTOFF", &
998 r_val=mt_rel_cutoff)
999 IF (mt_rel_cutoff > 1._dp) mt_s_grid = .true.
1000 END IF
1001
1002 logger => cp_get_default_logger()
1003 iounit = cp_print_key_unit_nr(logger, print_section, "", &
1004 extension=".Log")
1005
1006 IF (uf_grid) THEN
1007 my_cutilev = fine_grid_factor*cutilev
1008 IF (mt_s_grid) my_cutilev = max(my_cutilev, cutilev*mt_rel_cutoff)
1009 CALL pw_grid_create(xc_super_ref_pw_grid, para_env, cell_ref%hmat, grid_span=grid_span, &
1010 cutoff=my_cutilev, spherical=spherical, odd=.false., fft_usage=.true., &
1011 ncommensurate=my_ncommensurate, icommensurate=1, &
1012 blocked=do_pw_grid_blocked_false, rs_dims=[para_env%num_pe, 1], &
1013 iounit=iounit)
1014 super_ref_pw_grid => xc_super_ref_pw_grid
1015 END IF
1016 IF (mt_s_grid) THEN
1017 my_cutilev = cutilev*mt_rel_cutoff
1018 IF (ASSOCIATED(xc_super_ref_pw_grid)) my_cutilev = max(my_cutilev, fine_grid_factor*cutilev)
1019
1020 no = pw_grid_init_setup(cell_ref%hmat, cutoff=cutilev, spherical=spherical, &
1021 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1022 nn = pw_grid_init_setup(cell_ref%hmat, cutoff=my_cutilev, spherical=spherical, &
1023 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1024
1025 ! bug appears for nn==no, also in old versions
1026 cpassert(all(nn > no))
1027 IF (ASSOCIATED(xc_super_ref_pw_grid)) THEN
1028 mt_super_ref_pw_grid => xc_super_ref_pw_grid
1029 CALL pw_grid_retain(mt_super_ref_pw_grid)
1030 ELSE
1031 CALL pw_grid_create(mt_super_ref_pw_grid, para_env, cell_ref%hmat, &
1032 cutoff=my_cutilev, spherical=spherical, fft_usage=.true., &
1033 blocked=do_pw_grid_blocked_false, rs_dims=[para_env%num_pe, 1], &
1034 iounit=iounit)
1035 super_ref_pw_grid => mt_super_ref_pw_grid
1036 END IF
1037 END IF
1038 CALL cp_print_key_finished_output(iounit, logger, print_section, &
1039 "")
1040 END SUBROUTINE setup_super_ref_grid
1041
1042! **************************************************************************************************
1043!> \brief sets up a real-space grid for finite difference derivative of dielectric
1044!> constant function
1045!> \param diel_rs_grid real space grid to be created
1046!> \param method preferred finite difference derivative method
1047!> \param input input file
1048!> \param pw_grid plane-wave grid
1049!> \par History
1050!> 12.2014 created [Hossein Bani-Hashemian]
1051!> \author Mohammad Hossein Bani-Hashemian
1052! **************************************************************************************************
1053 SUBROUTINE setup_diel_rs_grid(diel_rs_grid, method, input, pw_grid)
1054
1055 TYPE(realspace_grid_type), POINTER :: diel_rs_grid
1056 INTEGER, INTENT(IN) :: method
1057 TYPE(section_vals_type), POINTER :: input
1058 TYPE(pw_grid_type), POINTER :: pw_grid
1059
1060 CHARACTER(LEN=*), PARAMETER :: routinen = 'setup_diel_rs_grid'
1061
1062 INTEGER :: border_points, handle
1063 TYPE(realspace_grid_desc_type), POINTER :: rs_desc
1064 TYPE(realspace_grid_input_type) :: input_settings
1065 TYPE(section_vals_type), POINTER :: rs_grid_section
1066
1067 CALL timeset(routinen, handle)
1068
1069 NULLIFY (rs_desc)
1070 rs_grid_section => section_vals_get_subs_vals(input, "DFT%MGRID%RS_GRID")
1071 SELECT CASE (method)
1072 CASE (derivative_cd3)
1073 border_points = 1
1074 CASE (derivative_cd5)
1075 border_points = 2
1076 CASE (derivative_cd7)
1077 border_points = 3
1078 END SELECT
1079 CALL init_input_type(input_settings, 2*border_points + 1, rs_grid_section, &
1080 1, [-1, -1, -1])
1081 CALL rs_grid_create_descriptor(rs_desc, pw_grid, input_settings, &
1082 border_points=border_points)
1083 ALLOCATE (diel_rs_grid)
1084 CALL rs_grid_create(diel_rs_grid, rs_desc)
1085 CALL rs_grid_release_descriptor(rs_desc)
1086
1087 CALL timestop(handle)
1088
1089 END SUBROUTINE setup_diel_rs_grid
1090
1091END MODULE pw_env_methods
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, ccon)
...
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_retain(pw_grid)
retains the given pw grid
Definition pw_grids.F:2147
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
Types used by CNEO-DFT (see J. Chem. Theory Comput. 2025, 21, 16, 7865–7877)
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, mimic, 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, sab_cneo, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
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, cneo_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, monovalent, 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, rhoz_cneo_s_rs, rhoz_cneo_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:60
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.