110#include "./base/base_uses.f90"
115 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
116 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_env_methods'
134 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_env_create'
138 CALL timeset(routinen, handle)
140 cpassert(.NOT.
ASSOCIATED(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
149 CALL timestop(handle)
166 TARGET :: external_para_env
168 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_env_rebuild'
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
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
189 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
195 poisson_section, print_section, &
196 rs_grid_section, xc_section
204 CALL timeset(routinen, handle)
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)
217 dft_control=dft_control, &
218 qs_kind_set=qs_kind_set, &
223 dispersion_env=dispersion_env)
225 cpassert(
ASSOCIATED(pw_env))
226 cpassert(pw_env%ref_count > 0)
230 IF (
ASSOCIATED(pw_env%rs_descs))
THEN
231 DO i = 1,
SIZE(pw_env%rs_descs)
234 DEALLOCATE (pw_env%rs_descs)
236 IF (
ASSOCIATED(pw_env%rs_grids))
THEN
237 DO i = 1,
SIZE(pw_env%rs_grids)
240 DEALLOCATE (pw_env%rs_grids)
242 IF (
ASSOCIATED(pw_env%gridlevel_info))
THEN
245 ALLOCATE (pw_env%gridlevel_info)
248 IF (
ASSOCIATED(pw_env%cube_info))
THEN
249 DO igrid_level = 1,
SIZE(pw_env%cube_info)
252 DEALLOCATE (pw_env%cube_info)
254 NULLIFY (pw_env%pw_pools, pw_env%cube_info)
266 IF (
PRESENT(external_para_env))
THEN
267 para_env => external_para_env
268 cpassert(
ASSOCIATED(para_env))
274 CALL get_qs_env(qs_env, use_ref_cell=use_ref_cell)
275 IF (use_ref_cell)
THEN
280 rel_cutoff = dft_control%qs_control%relative_cutoff
281 cutoff => dft_control%qs_control%e_cutoff
283 ngrid_level =
SIZE(cutoff)
289 "PRINT%GRID_INFORMATION")
291 ngrid_levels=ngrid_level, cutoff=cutoff, rel_cutoff=rel_cutoff, &
292 print_section=print_section)
294 ALLOCATE (pw_pools(ngrid_level))
296 IF (dft_control%qs_control%commensurate_mgrids)
THEN
297 ncommensurate = ngrid_level
305 IF (dft_control%qs_control%pw_grid_opt%spherical)
THEN
308 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace)
THEN
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
334 IF (dft_control%qs_control%pw_grid_opt%spherical)
THEN
338 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace)
THEN
349 blocked_id_input = dft_control%qs_control%pw_grid_opt%blocked
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.
366 SELECT CASE (xc_smooth_method_id)
368 smooth_required = smooth_required .OR. .false.
370 smooth_required = smooth_required .OR. .true.
377 subsection_name=
"PROPERTIES%LINRES")
379 IF (linres_present)
THEN
380 smooth_required = smooth_required .OR. .true.
384 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
386 IF (efg_present)
THEN
387 smooth_required = smooth_required .OR. .true.
390 DO igrid_level = 1, ngrid_level
391 cutilev = cutoff(igrid_level)
395 blocked_id = blocked_id_input
397 distribution_layout = dft_control%qs_control%pw_grid_opt%distribution_layout
401 IF (qs_env%qmmm)
THEN
402 distribution_layout = (/para_env%num_pe, 1/)
407 IF (smooth_required)
THEN
408 distribution_layout = (/para_env%num_pe, 1/)
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, &
415 spherical=spherical, odd=odd, fft_usage=.true., &
416 ncommensurate=ncommensurate, icommensurate=igrid_level, &
418 ref_grid=old_pw_grid, &
419 rs_dims=distribution_layout, &
421 old_pw_grid => pw_grid
423 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
425 spherical=spherical, odd=odd, fft_usage=.true., &
426 ncommensurate=ncommensurate, icommensurate=igrid_level, &
427 blocked=blocked_id, &
428 rs_dims=distribution_layout, &
430 old_pw_grid => pw_grid
433 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
435 spherical=spherical, odd=odd, fft_usage=.true., &
436 ncommensurate=ncommensurate, icommensurate=igrid_level, &
438 ref_grid=old_pw_grid, &
439 rs_dims=distribution_layout, &
444 NULLIFY (pw_pools(igrid_level)%pool)
451 pw_env%pw_pools => pw_pools
454 DO i = 1, ngrid_level
455 IF (cutoff(i) == dft_control%qs_control%cutoff) pw_env%auxbas_grid = i
459 IF (
ASSOCIATED(xc_super_ref_grid))
THEN
461 pw_grid=xc_super_ref_grid)
464 pw_env%xc_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
465 CALL pw_env%xc_pw_pool%retain()
469 set_vdw_pool = .false.
470 IF (
ASSOCIATED(dispersion_env))
THEN
472 IF (dispersion_env%pw_cutoff > 0._dp) set_vdw_pool = .true.
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, &
484 ref_grid=vdw_ref_grid, &
485 rs_dims=distribution_layout, &
490 pw_env%vdw_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
491 CALL pw_env%vdw_pw_pool%retain()
497 IF (.NOT.
ASSOCIATED(pw_env%poisson_env))
THEN
498 ALLOCATE (pw_env%poisson_env)
499 CALL pw_env%poisson_env%create()
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)
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)
517 IF (set_vdw_pool)
CALL pw_grid_change(cell%hmat, pw_env%vdw_pw_pool%pw_grid)
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)
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 = &
528 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
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)
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
543 SELECT CASE (poisson_params%ps_implicit_params%boundary_condition)
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)
563 ALLOCATE (radius(ngrid_level))
565 CALL compute_max_radius(radius, pw_env, qs_env)
572 ALLOCATE (rs_descs(ngrid_level))
574 ALLOCATE (rs_grids(ngrid_level))
576 ALLOCATE (pw_env%cube_info(ngrid_level))
577 higher_grid_layout = (/-1, -1, -1/)
579 DO igrid_level = 1, ngrid_level
580 pw_grid => pw_pools(igrid_level)%pool%pw_grid
584 pw_grid%dr(:), pw_grid%dh(:, :), pw_grid%dh_inv(:, :), pw_grid%orthorhombic, &
590 rs_grid_section=rs_grid_section, ilevel=igrid_level, &
591 higher_grid_layout=higher_grid_layout)
593 NULLIFY (rs_descs(igrid_level)%rs_desc)
596 IF (rs_descs(igrid_level)%rs_desc%distributed) higher_grid_layout = rs_descs(igrid_level)%rs_desc%group_dim
598 CALL rs_grid_create(rs_grids(igrid_level), rs_descs(igrid_level)%rs_desc)
600 pw_env%rs_descs => rs_descs
601 pw_env%rs_grids => rs_grids
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"
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)"
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)
635 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
636 "POISSON| Periodicity",
"NONE"
638 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
639 "POISSON| Periodicity",
"XZ"
641 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
642 "POISSON| Periodicity",
"XYZ"
644 cpabort(
"Invalid periodicity for wavelet solver selected")
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)
652 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
653 "POISSON| Boundary Condition",
"PERIODIC"
656 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
657 "POISSON| Boundary Condition",
"NEUMANN"
659 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
660 "POISSON| Boundary Condition",
"MIXED"
662 SELECT CASE (poisson_params%ps_implicit_params%neumann_directions)
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"
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"
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"
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"
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"
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"
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"
685 cpabort(
"Invalid combination of Neumann and periodic conditions.")
688 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
689 "POISSON| Boundary Condition",
"PERIODIC & DIRICHLET"
691 cpabort(
"Invalid boundary conditions for the implicit (generalized) poisson solver.")
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
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)
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)
711 WRITE (unit=iounit, fmt=
'(A1,/)')
713 WRITE (unit=iounit, fmt=
"(T2,A,T51,ES30.2)") &
714 "POISSON| Relaxation parameter", poisson_params%ps_implicit_params%omega
716 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
717 "POISSON| Solver",
"NONE"
719 cpabort(
"Invalid Poisson solver selected")
723 IF (sum(poisson_params%periodic(1:3)) == 0)
THEN
724 WRITE (unit=iounit, fmt=
"(T2,A,T77,A4)") &
725 "POISSON| Periodicity",
"NONE"
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)
737 IF ((dft_control%qs_control%method_id ==
do_method_gpw) .OR. &
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")
755 IF (should_output)
THEN
756 DO igrid_level = 1, ngrid_level
763 CALL timestop(handle)
777 SUBROUTINE compute_max_radius(radius, pw_env, qs_env)
778 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: radius
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
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
799 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
808 CALL timeset(routinen, handle)
809 NULLIFY (dft_control, qs_kind_set, rho0_mpole)
811 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
813 eps_rho = dft_control%qs_control%eps_rho_rspace
814 eps_gvg = dft_control%qs_control%eps_gvg_rspace
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))
820 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, max_rpgf0_s=max_rpgf0_s, zet0_h=zet0_h)
822 rho0_mpole%igrid_zet0_s = igrid_zet0_s
825 ngrid_level =
SIZE(radius)
826 nkind =
SIZE(qs_kind_set)
831 DO igrid_level = 1, ngrid_level
835 IF (dft_control%qs_control%gapw)
THEN
836 IF (igrid_zet0_s == igrid_level) maxradius = max(maxradius, max_rpgf0_s)
844 NULLIFY (cneo_potential)
845 CALL get_qs_kind(qs_kind_set(ikind), cneo_potential=cneo_potential)
846 IF (
ASSOCIATED(cneo_potential)) cycle
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))
852 maxradius = max(maxradius,
exp_radius(1, alpha, eps_rho, core_charge, rlow=maxradius))
858 DO ibasis_set_type = 1,
SIZE(sbas)
860 qs_kind => qs_kind_set(ikind)
861 NULLIFY (orb_basis_set)
863 basis_set=orb_basis_set, basis_type=sbas(ibasis_set_type))
864 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
866 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
868 DO ipgf = 1, npgfa(iset)
869 DO ishell = 1, nshella(iset)
870 zetp = zeta(ipgf, iset)
871 la = lshella(ishell, iset)
873 IF (lgrid_level .EQ. igrid_level)
THEN
874 maxradius = max(maxradius,
exp_radius(la, zetp, eps_rho, 1.0_dp, rlow=maxradius))
882 DO ibasis_set_type = 1,
SIZE(pbas)
884 qs_kind => qs_kind_set(ikind)
885 NULLIFY (orb_basis_set)
887 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
888 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
890 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
893 qs_kind => qs_kind_set(jkind)
895 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
896 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
898 npgf=npgfb, nset=nsetb, zet=zetb, l=lshellb, nshell=nshellb)
900 DO ipgf = 1, npgfa(iset)
901 DO ishell = 1, nshella(iset)
902 la = lshella(ishell, iset)
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
909 IF (lgrid_level .EQ. igrid_level)
THEN
911 maxradius = max(maxradius,
exp_radius(lb, zetp, eps_rho, 2.0_dp, rlow=maxradius))
913 maxradius = max(maxradius,
exp_radius(lb + 1, zetp, eps_rho, 2.0_dp, rlow=maxradius))
915 maxradius = max(maxradius,
exp_radius(lb, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
917 maxradius = max(maxradius,
exp_radius(lb + 1, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
930 maxradius = maxradius*safety_factor
931 radius(igrid_level) = maxradius
934 CALL timestop(handle)
936 END SUBROUTINE compute_max_radius
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, &
961 REAL(kind=
dp),
INTENT(IN) :: cutilev
962 INTEGER,
INTENT(IN) :: grid_span
963 LOGICAL,
INTENT(in) :: spherical
967 INTEGER,
INTENT(IN) :: my_ncommensurate
968 LOGICAL,
INTENT(in) :: uf_grid
971 INTEGER :: iounit, my_val, nn(3), no(3)
973 REAL(kind=
dp) :: mt_rel_cutoff, my_cutilev
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))
987 IF (mt_rel_cutoff > 1._dp) mt_s_grid = .true.
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, &
1000 super_ref_pw_grid => xc_super_ref_pw_grid
1003 IF (
ASSOCIATED(xc_super_ref_pw_grid))
THEN
1004 cpabort(
"special grid for mt and fine xc grid not compatible")
1006 my_cutilev = cutilev*mt_rel_cutoff
1009 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1011 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
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., &
1019 super_ref_pw_grid => mt_super_ref_pw_grid
1024 END SUBROUTINE setup_super_ref_grid
1037 SUBROUTINE setup_diel_rs_grid(diel_rs_grid, method, input, pw_grid)
1040 INTEGER,
INTENT(IN) :: method
1044 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_diel_rs_grid'
1046 INTEGER :: border_points, handle
1051 CALL timeset(routinen, handle)
1055 SELECT CASE (method)
1063 CALL init_input_type(input_settings, 2*border_points + 1, rs_grid_section, &
1066 border_points=border_points)
1067 ALLOCATE (diel_rs_grid)
1071 CALL timestop(handle)
1073 END SUBROUTINE setup_diel_rs_grid
All kind of helpful little routines.
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**...
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.
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...
integer function, public return_cube_max_iradius(info)
...
subroutine, public destroy_cube_info(info)
...
subroutine, public init_cube_info(info, dr, dh, dh_inv, ortho, max_radius)
...
Routines to efficiently handle dense polynomial in 3 variables up to a given degree....
subroutine, public init_d3_poly_module()
initialization of the cache, is called by functions in this module that use cached values
the type I Discrete Cosine Transform (DCT-I)
integer, parameter, public neumannx
integer, parameter, public neumannxy
integer, parameter, public neumannxz
integer, parameter, public neumannxyz
integer, parameter, public neumannz
integer, parameter, public neumannyz
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
integer, parameter, public neumanny
dielectric constant data type
integer, parameter, public derivative_cd5
integer, parameter, public derivative_cd3
integer, parameter, public rho_dependent
integer, parameter, public derivative_cd7
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)
...
Defines the basic variable types.
integer, parameter, public dp
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.
integer, parameter, public do_pw_grid_blocked_false
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
subroutine, public pw_grid_change(cell_hmat, pw_grid)
Recalculate the g-vectors after a change of the box.
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...
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)
Type defining parameters related to the simulation cell.
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.