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