109#include "./base/base_uses.f90"
114 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
115 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_env_methods'
133 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_env_create'
137 CALL timeset(routinen, handle)
139 cpassert(.NOT.
ASSOCIATED(pw_env))
141 NULLIFY (pw_env%pw_pools, pw_env%gridlevel_info, pw_env%poisson_env, &
142 pw_env%cube_info, pw_env%rs_descs, pw_env%rs_grids, &
143 pw_env%xc_pw_pool, pw_env%vdw_pw_pool, &
144 pw_env%interp_section)
145 pw_env%auxbas_grid = -1
148 CALL timestop(handle)
165 TARGET :: external_para_env
167 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_env_rebuild'
169 CHARACTER(LEN=3) :: string
170 INTEGER :: blocked_id, blocked_id_input, boundary_condition, grid_span, handle, i, &
171 igrid_level, iounit, ncommensurate, ngrid_level, xc_deriv_method_id, xc_smooth_method_id
172 INTEGER,
DIMENSION(2) :: distribution_layout
173 INTEGER,
DIMENSION(3) :: higher_grid_layout
174 LOGICAL :: do_io, efg_present, linres_present, odd, set_vdw_pool, should_output, &
175 smooth_required, spherical, uf_grid, use_ref_cell
176 REAL(kind=
dp) :: cutilev, rel_cutoff
177 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: radius
178 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cutoff
179 TYPE(
cell_type),
POINTER :: cell, cell_ref, my_cell
183 TYPE(
pw_grid_type),
POINTER :: dct_pw_grid, mt_super_ref_grid, old_pw_grid, pw_grid, &
184 super_ref_grid, vdw_grid, vdw_ref_grid, xc_super_ref_grid
188 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
194 poisson_section, print_section, &
195 rs_grid_section, xc_section
203 CALL timeset(routinen, handle)
210 NULLIFY (cutoff, cell, pw_grid, old_pw_grid, dft_control, qs_kind_set, &
211 pw_pools, rs_descs, para_env, cell_ref, vdw_ref_grid, &
212 mt_super_ref_grid, input, poisson_section, xc_super_ref_grid, &
213 dct_pw_grid, vdw_grid, super_ref_grid, my_cell, rs_grids, dispersion_env)
216 dft_control=dft_control, &
217 qs_kind_set=qs_kind_set, &
222 dispersion_env=dispersion_env)
224 cpassert(
ASSOCIATED(pw_env))
225 cpassert(pw_env%ref_count > 0)
229 IF (
ASSOCIATED(pw_env%rs_descs))
THEN
230 DO i = 1,
SIZE(pw_env%rs_descs)
233 DEALLOCATE (pw_env%rs_descs)
235 IF (
ASSOCIATED(pw_env%rs_grids))
THEN
236 DO i = 1,
SIZE(pw_env%rs_grids)
239 DEALLOCATE (pw_env%rs_grids)
241 IF (
ASSOCIATED(pw_env%gridlevel_info))
THEN
244 ALLOCATE (pw_env%gridlevel_info)
247 IF (
ASSOCIATED(pw_env%cube_info))
THEN
248 DO igrid_level = 1,
SIZE(pw_env%cube_info)
251 DEALLOCATE (pw_env%cube_info)
253 NULLIFY (pw_env%pw_pools, pw_env%cube_info)
265 IF (
PRESENT(external_para_env))
THEN
266 para_env => external_para_env
267 cpassert(
ASSOCIATED(para_env))
273 CALL get_qs_env(qs_env, use_ref_cell=use_ref_cell)
274 IF (use_ref_cell)
THEN
279 rel_cutoff = dft_control%qs_control%relative_cutoff
280 cutoff => dft_control%qs_control%e_cutoff
282 ngrid_level =
SIZE(cutoff)
288 "PRINT%GRID_INFORMATION")
290 ngrid_levels=ngrid_level, cutoff=cutoff, rel_cutoff=rel_cutoff, &
291 print_section=print_section)
293 ALLOCATE (pw_pools(ngrid_level))
295 IF (dft_control%qs_control%commensurate_mgrids)
THEN
296 ncommensurate = ngrid_level
304 IF (dft_control%qs_control%pw_grid_opt%spherical)
THEN
307 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace)
THEN
315 CALL setup_super_ref_grid(super_ref_grid, mt_super_ref_grid, &
316 xc_super_ref_grid, cutilev, grid_span, spherical, my_cell, para_env, &
317 qs_env%input, ncommensurate, uf_grid=uf_grid, &
318 print_section=print_section)
319 old_pw_grid => super_ref_grid
320 IF (.NOT.
ASSOCIATED(mt_super_ref_grid)) vdw_ref_grid => super_ref_grid
332 IF (dft_control%qs_control%pw_grid_opt%spherical)
THEN
336 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace)
THEN
347 blocked_id_input = dft_control%qs_control%pw_grid_opt%blocked
354 smooth_required = .false.
355 SELECT CASE (xc_deriv_method_id)
357 smooth_required = smooth_required .OR. .false.
360 smooth_required = smooth_required .OR. .true.
364 SELECT CASE (xc_smooth_method_id)
366 smooth_required = smooth_required .OR. .false.
368 smooth_required = smooth_required .OR. .true.
375 subsection_name=
"PROPERTIES%LINRES")
377 IF (linres_present)
THEN
378 smooth_required = smooth_required .OR. .true.
382 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
384 IF (efg_present)
THEN
385 smooth_required = smooth_required .OR. .true.
388 DO igrid_level = 1, ngrid_level
389 cutilev = cutoff(igrid_level)
393 blocked_id = blocked_id_input
395 distribution_layout = dft_control%qs_control%pw_grid_opt%distribution_layout
399 IF (qs_env%qmmm)
THEN
400 distribution_layout = (/para_env%num_pe, 1/)
405 IF (smooth_required)
THEN
406 distribution_layout = (/para_env%num_pe, 1/)
409 IF (igrid_level == 1)
THEN
410 IF (
ASSOCIATED(old_pw_grid))
THEN
411 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
413 spherical=spherical, odd=odd, fft_usage=.true., &
414 ncommensurate=ncommensurate, icommensurate=igrid_level, &
416 ref_grid=old_pw_grid, &
417 rs_dims=distribution_layout, &
419 old_pw_grid => pw_grid
421 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
423 spherical=spherical, odd=odd, fft_usage=.true., &
424 ncommensurate=ncommensurate, icommensurate=igrid_level, &
425 blocked=blocked_id, &
426 rs_dims=distribution_layout, &
428 old_pw_grid => pw_grid
431 CALL pw_grid_create(pw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
433 spherical=spherical, odd=odd, fft_usage=.true., &
434 ncommensurate=ncommensurate, icommensurate=igrid_level, &
436 ref_grid=old_pw_grid, &
437 rs_dims=distribution_layout, &
442 NULLIFY (pw_pools(igrid_level)%pool)
449 pw_env%pw_pools => pw_pools
452 DO i = 1, ngrid_level
453 IF (cutoff(i) == dft_control%qs_control%cutoff) pw_env%auxbas_grid = i
457 IF (
ASSOCIATED(xc_super_ref_grid))
THEN
459 pw_grid=xc_super_ref_grid)
462 pw_env%xc_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
463 CALL pw_env%xc_pw_pool%retain()
467 set_vdw_pool = .false.
468 IF (
ASSOCIATED(dispersion_env))
THEN
470 IF (dispersion_env%pw_cutoff > 0._dp) set_vdw_pool = .true.
473 IF (set_vdw_pool)
THEN
474 cpassert(
ASSOCIATED(old_pw_grid))
475 IF (.NOT.
ASSOCIATED(vdw_ref_grid)) vdw_ref_grid => old_pw_grid
476 IF (iounit > 0)
WRITE (iounit,
"(/,T2,A)")
"PW_GRID| Grid for non-local vdW functional"
477 CALL pw_grid_create(vdw_grid, para_env, my_cell%hmat, grid_span=grid_span, &
478 cutoff=dispersion_env%pw_cutoff, &
479 spherical=spherical, odd=odd, fft_usage=.true., &
480 ncommensurate=0, icommensurate=0, &
482 ref_grid=vdw_ref_grid, &
483 rs_dims=distribution_layout, &
488 pw_env%vdw_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
489 CALL pw_env%vdw_pw_pool%retain()
495 IF (.NOT.
ASSOCIATED(pw_env%poisson_env))
THEN
496 ALLOCATE (pw_env%poisson_env)
497 CALL pw_env%poisson_env%create()
502 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=my_cell%hmat, pw_pools=pw_env%pw_pools, &
503 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
504 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
511 IF (use_ref_cell)
THEN
512 DO igrid_level = 1,
SIZE(pw_pools)
513 CALL pw_grid_change(cell%hmat, pw_pools(igrid_level)%pool%pw_grid)
515 IF (set_vdw_pool)
CALL pw_grid_change(cell%hmat, pw_env%vdw_pw_pool%pw_grid)
517 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=cell%hmat, pw_pools=pw_env%pw_pools, &
518 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
519 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
522 IF ((poisson_params%ps_implicit_params%boundary_condition .EQ.
mixed_periodic_bc) .OR. &
523 (poisson_params%ps_implicit_params%boundary_condition .EQ.
mixed_bc))
THEN
524 pw_env%poisson_env%parameters%dbc_params%do_dbc_cube = &
526 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
529 IF ((poisson_params%ps_implicit_params%boundary_condition .EQ.
neumann_bc) .OR. &
530 (poisson_params%ps_implicit_params%boundary_condition .EQ.
mixed_bc))
THEN
531 CALL setup_dct_pw_grids(pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid, &
532 my_cell%hmat, poisson_params%ps_implicit_params%neumann_directions, &
533 pw_env%poisson_env%dct_pw_grid)
536 IF (poisson_params%has_dielectric .AND. &
537 ((poisson_params%dielectric_params%derivative_method .EQ.
derivative_cd3) .OR. &
538 (poisson_params%dielectric_params%derivative_method .EQ.
derivative_cd5) .OR. &
539 (poisson_params%dielectric_params%derivative_method .EQ.
derivative_cd7)))
THEN
541 SELECT CASE (poisson_params%ps_implicit_params%boundary_condition)
543 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
544 poisson_params%dielectric_params%derivative_method, input, &
545 pw_env%poisson_env%dct_pw_grid)
547 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
548 poisson_params%dielectric_params%derivative_method, input, &
549 pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid)
561 ALLOCATE (radius(ngrid_level))
563 CALL compute_max_radius(radius, pw_env, qs_env)
570 ALLOCATE (rs_descs(ngrid_level))
572 ALLOCATE (rs_grids(ngrid_level))
574 ALLOCATE (pw_env%cube_info(ngrid_level))
575 higher_grid_layout = (/-1, -1, -1/)
577 DO igrid_level = 1, ngrid_level
578 pw_grid => pw_pools(igrid_level)%pool%pw_grid
582 pw_grid%dr(:), pw_grid%dh(:, :), pw_grid%dh_inv(:, :), pw_grid%orthorhombic, &
588 rs_grid_section=rs_grid_section, ilevel=igrid_level, &
589 higher_grid_layout=higher_grid_layout)
591 NULLIFY (rs_descs(igrid_level)%rs_desc)
594 IF (rs_descs(igrid_level)%rs_desc%distributed) higher_grid_layout = rs_descs(igrid_level)%rs_desc%group_dim
596 CALL rs_grid_create(rs_grids(igrid_level), rs_descs(igrid_level)%rs_desc)
598 pw_env%rs_descs => rs_descs
599 pw_env%rs_grids => rs_grids
610 SELECT CASE (poisson_params%solver)
612 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
613 "POISSON| Solver",
"PERIODIC"
615 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
616 "POISSON| Solver",
"ANALYTIC"
618 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
619 "POISSON| Solver", adjustr(
"Martyna-Tuckerman (MT)")
620 WRITE (unit=iounit, fmt=
"(T2,A,T71,F10.3,/,T2,A,T71,F10.1)") &
621 "POISSON| MT| Alpha", poisson_params%mt_alpha, &
622 "POISSON| MT| Relative cutoff", poisson_params%mt_rel_cutoff
624 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
625 "POISSON| Solver",
"MULTIPOLE (Bloechl)"
627 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
628 "POISSON| Solver",
"WAVELET"
629 WRITE (unit=iounit, fmt=
"(T2,A,T71,I10)") &
630 "POISSON| Wavelet| Scaling function", poisson_params%wavelet_scf_type
631 SELECT CASE (poisson_params%wavelet_method)
633 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
634 "POISSON| Periodicity",
"NONE"
636 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
637 "POISSON| Periodicity",
"XZ"
639 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
640 "POISSON| Periodicity",
"XYZ"
642 cpabort(
"Invalid periodicity for wavelet solver selected")
645 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
646 "POISSON| Solver",
"IMPLICIT (GENERALIZED)"
647 boundary_condition = poisson_params%ps_implicit_params%boundary_condition
648 SELECT CASE (boundary_condition)
650 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
651 "POISSON| Boundary Condition",
"PERIODIC"
654 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
655 "POISSON| Boundary Condition",
"NEUMANN"
657 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
658 "POISSON| Boundary Condition",
"MIXED"
660 SELECT CASE (poisson_params%ps_implicit_params%neumann_directions)
662 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X, Y, Z"
663 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"NONE"
665 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X, Y"
666 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"Z"
668 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X, Z"
669 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"Y"
671 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"Y, Z"
672 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"X"
674 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X"
675 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"Y, Z"
677 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"Y"
678 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"X, Z"
680 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"Z"
681 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"X, Y"
683 cpabort(
"Invalid combination of Neumann and periodic conditions.")
686 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
687 "POISSON| Boundary Condition",
"PERIODIC & DIRICHLET"
689 cpabort(
"Invalid boundary conditions for the implicit (generalized) poisson solver.")
691 WRITE (unit=iounit, fmt=
"(T2,A,T71,I10)") &
692 "POISSON| Maximum number of iterations", poisson_params%ps_implicit_params%max_iter
693 WRITE (unit=iounit, fmt=
"(T2,A,T51,ES30.2)") &
694 "POISSON| Convergence threshold", poisson_params%ps_implicit_params%tol
695 IF (poisson_params%dielectric_params%dielec_functiontype .EQ.
rho_dependent)
THEN
696 WRITE (unit=iounit, fmt=
"(T2,A,T51,F30.2)") &
697 "POISSON| Dielectric Constant", poisson_params%dielectric_params%eps0
699 WRITE (unit=iounit, fmt=
"(T2,A,T31,F9.2)", advance=
'NO') &
700 "POISSON| Dielectric Constants", poisson_params%dielectric_params%eps0
701 DO i = 1, poisson_params%dielectric_params%n_aa_cuboidal
702 WRITE (unit=iounit, fmt=
"(F9.2)", advance=
'NO') &
703 poisson_params%dielectric_params%aa_cuboidal_eps(i)
705 DO i = 1, poisson_params%dielectric_params%n_xaa_annular
706 WRITE (unit=iounit, fmt=
"(F9.2)", advance=
'NO') &
707 poisson_params%dielectric_params%xaa_annular_eps(i)
709 WRITE (unit=iounit, fmt=
'(A1,/)')
711 WRITE (unit=iounit, fmt=
"(T2,A,T51,ES30.2)") &
712 "POISSON| Relaxation parameter", poisson_params%ps_implicit_params%omega
714 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
715 "POISSON| Solver",
"NONE"
717 cpabort(
"Invalid Poisson solver selected")
721 IF (sum(poisson_params%periodic(1:3)) == 0)
THEN
722 WRITE (unit=iounit, fmt=
"(T2,A,T77,A4)") &
723 "POISSON| Periodicity",
"NONE"
726 IF (poisson_params%periodic(1) == 1) string = trim(string)//
"X"
727 IF (poisson_params%periodic(2) == 1) string = trim(string)//
"Y"
728 IF (poisson_params%periodic(3) == 1) string = trim(string)//
"Z"
729 WRITE (unit=iounit, fmt=
"(T2,A,T78,A3)") &
730 "POISSON| Periodicity", adjustr(string)
735 IF ((dft_control%qs_control%method_id ==
do_method_gpw) .OR. &
743 IF (any(my_cell%perd(1:3) /= poisson_params%periodic(1:3)))
THEN
744 CALL cp_warn(__location__, &
745 "The selected periodicities in the sections &CELL and &POISSON do not match")
753 IF (should_output)
THEN
754 DO igrid_level = 1, ngrid_level
761 CALL timestop(handle)
775 SUBROUTINE compute_max_radius(radius, pw_env, qs_env)
776 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: radius
780 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_max_radius'
781 CHARACTER(LEN=8),
DIMENSION(4),
PARAMETER :: &
782 pbas = (/
"ORB ",
"AUX_FIT ",
"MAO ",
"HARRIS "/)
783 CHARACTER(LEN=8),
DIMENSION(9),
PARAMETER :: sbas = (/
"ORB ",
"AUX ",
"RI_AUX ", &
784 "MAO ",
"HARRIS ",
"RI_HXC ",
"RI_K ",
"LRI_AUX ",
"RHOIN "/)
785 REAL(kind=
dp),
PARAMETER :: safety_factor = 1.015_dp
787 INTEGER :: handle, ibasis_set_type, igrid_level, igrid_zet0_s, ikind, ipgf, iset, ishell, &
788 jkind, jpgf, jset, jshell, la, lb, lgrid_level, ngrid_level, nkind, nseta, nsetb
789 INTEGER,
DIMENSION(:),
POINTER :: npgfa, npgfb, nshella, nshellb
790 INTEGER,
DIMENSION(:, :),
POINTER :: lshella, lshellb
791 REAL(kind=
dp) :: alpha, core_charge, eps_gvg, eps_rho, &
792 max_rpgf0_s, maxradius, zet0_h, zetp
793 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zeta, zetb
796 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
805 CALL timeset(routinen, handle)
806 NULLIFY (dft_control, qs_kind_set, rho0_mpole)
808 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
810 eps_rho = dft_control%qs_control%eps_rho_rspace
811 eps_gvg = dft_control%qs_control%eps_gvg_rspace
813 IF (dft_control%qs_control%gapw)
THEN
814 CALL get_qs_env(qs_env=qs_env, rho0_mpole=rho0_mpole)
815 cpassert(
ASSOCIATED(rho0_mpole))
817 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, max_rpgf0_s=max_rpgf0_s, zet0_h=zet0_h)
819 rho0_mpole%igrid_zet0_s = igrid_zet0_s
822 ngrid_level =
SIZE(radius)
823 nkind =
SIZE(qs_kind_set)
828 DO igrid_level = 1, ngrid_level
832 IF (dft_control%qs_control%gapw)
THEN
833 IF (igrid_zet0_s == igrid_level) maxradius = max(maxradius, max_rpgf0_s)
842 alpha_core_charge=alpha, ccore_charge=core_charge)
843 IF (alpha > 0.0_dp .AND. core_charge .NE. 0.0_dp)
THEN
844 maxradius = max(maxradius,
exp_radius(0, alpha, eps_rho, core_charge, rlow=maxradius))
846 maxradius = max(maxradius,
exp_radius(1, alpha, eps_rho, core_charge, rlow=maxradius))
852 DO ibasis_set_type = 1,
SIZE(sbas)
854 qs_kind => qs_kind_set(ikind)
855 NULLIFY (orb_basis_set)
857 basis_set=orb_basis_set, basis_type=sbas(ibasis_set_type))
858 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
860 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
862 DO ipgf = 1, npgfa(iset)
863 DO ishell = 1, nshella(iset)
864 zetp = zeta(ipgf, iset)
865 la = lshella(ishell, iset)
867 IF (lgrid_level .EQ. igrid_level)
THEN
868 maxradius = max(maxradius,
exp_radius(la, zetp, eps_rho, 1.0_dp, rlow=maxradius))
876 DO ibasis_set_type = 1,
SIZE(pbas)
878 qs_kind => qs_kind_set(ikind)
879 NULLIFY (orb_basis_set)
881 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
882 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
884 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
887 qs_kind => qs_kind_set(jkind)
889 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
890 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
892 npgf=npgfb, nset=nsetb, zet=zetb, l=lshellb, nshell=nshellb)
894 DO ipgf = 1, npgfa(iset)
895 DO ishell = 1, nshella(iset)
896 la = lshella(ishell, iset)
898 DO jpgf = 1, npgfb(jset)
899 DO jshell = 1, nshellb(jset)
900 zetp = zeta(ipgf, iset) + zetb(jpgf, jset)
901 lb = lshellb(jshell, jset) + la
903 IF (lgrid_level .EQ. igrid_level)
THEN
905 maxradius = max(maxradius,
exp_radius(lb, zetp, eps_rho, 2.0_dp, rlow=maxradius))
907 maxradius = max(maxradius,
exp_radius(lb + 1, zetp, eps_rho, 2.0_dp, rlow=maxradius))
909 maxradius = max(maxradius,
exp_radius(lb, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
911 maxradius = max(maxradius,
exp_radius(lb + 1, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
924 maxradius = maxradius*safety_factor
925 radius(igrid_level) = maxradius
928 CALL timestop(handle)
930 END SUBROUTINE compute_max_radius
950 SUBROUTINE setup_super_ref_grid(super_ref_pw_grid, mt_super_ref_pw_grid, &
951 xc_super_ref_pw_grid, cutilev, grid_span, spherical, &
952 cell_ref, para_env, input, my_ncommensurate, uf_grid, print_section)
953 TYPE(
pw_grid_type),
POINTER :: super_ref_pw_grid, mt_super_ref_pw_grid, &
955 REAL(kind=
dp),
INTENT(IN) :: cutilev
956 INTEGER,
INTENT(IN) :: grid_span
957 LOGICAL,
INTENT(in) :: spherical
961 INTEGER,
INTENT(IN) :: my_ncommensurate
962 LOGICAL,
INTENT(in) :: uf_grid
965 INTEGER :: iounit, my_val, nn(3), no(3)
967 REAL(kind=
dp) :: mt_rel_cutoff, my_cutilev
971 NULLIFY (poisson_section)
972 cpassert(.NOT.
ASSOCIATED(mt_super_ref_pw_grid))
973 cpassert(.NOT.
ASSOCIATED(xc_super_ref_pw_grid))
974 cpassert(.NOT.
ASSOCIATED(super_ref_pw_grid))
984 IF (mt_rel_cutoff > 1._dp) mt_s_grid = .true.
992 CALL pw_grid_create(xc_super_ref_pw_grid, para_env, cell_ref%hmat, grid_span=grid_span, &
993 cutoff=4._dp*cutilev, spherical=spherical, odd=.false., fft_usage=.true., &
994 ncommensurate=my_ncommensurate, icommensurate=1, &
997 super_ref_pw_grid => xc_super_ref_pw_grid
1000 IF (
ASSOCIATED(xc_super_ref_pw_grid))
THEN
1001 cpabort(
"special grid for mt and fine xc grid not compatible")
1003 my_cutilev = cutilev*mt_rel_cutoff
1006 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1008 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1011 cpassert(all(nn > no))
1012 CALL pw_grid_create(mt_super_ref_pw_grid, para_env, cell_ref%hmat, &
1013 cutoff=my_cutilev, spherical=spherical, fft_usage=.true., &
1016 super_ref_pw_grid => mt_super_ref_pw_grid
1021 END SUBROUTINE setup_super_ref_grid
1034 SUBROUTINE setup_diel_rs_grid(diel_rs_grid, method, input, pw_grid)
1037 INTEGER,
INTENT(IN) :: method
1041 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_diel_rs_grid'
1043 INTEGER :: border_points, handle
1048 CALL timeset(routinen, handle)
1052 SELECT CASE (method)
1060 CALL init_input_type(input_settings, 2*border_points + 1, rs_grid_section, &
1063 border_points=border_points)
1064 ALLOCATE (diel_rs_grid)
1068 CALL timestop(handle)
1070 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
Definition of disperson types for DFT calculations.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs)
...
subroutine, public rs_grid_print(rs, iounit)
Print information on grids to output.
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public rs_grid_create_descriptor(desc, pw_grid, input_settings, border_points)
Determine the setup of real space grids - this is divided up into the creation of a descriptor and th...
subroutine, public rs_grid_release_descriptor(rs_desc)
releases the given rs grid descriptor (see doc/ReferenceCounting.html)
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
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.