87 pw_poisson_parameter_type,&
102 realspace_grid_desc_p_type, realspace_grid_desc_type, realspace_grid_input_type, &
109 #include "./base/base_uses.f90"
114 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
115 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_env_methods'
129 TYPE(pw_env_type),
POINTER :: pw_env
131 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_env_create'
135 CALL timeset(routinen, handle)
137 cpassert(.NOT.
ASSOCIATED(pw_env))
139 NULLIFY (pw_env%pw_pools, pw_env%gridlevel_info, pw_env%poisson_env, &
140 pw_env%cube_info, pw_env%rs_descs, pw_env%rs_grids, &
141 pw_env%xc_pw_pool, pw_env%vdw_pw_pool, &
142 pw_env%interp_section)
143 pw_env%auxbas_grid = -1
146 CALL timestop(handle)
160 TYPE(pw_env_type),
POINTER :: pw_env
161 TYPE(qs_environment_type),
POINTER :: qs_env
162 TYPE(mp_para_env_type),
INTENT(IN),
OPTIONAL, &
163 TARGET :: external_para_env
165 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_env_rebuild'
167 CHARACTER(LEN=3) :: string
168 INTEGER :: blocked_id, blocked_id_input, boundary_condition, grid_span, handle, i, &
169 igrid_level, iounit, ncommensurate, ngrid_level, xc_deriv_method_id, xc_smooth_method_id
170 INTEGER,
DIMENSION(2) :: distribution_layout
171 INTEGER,
DIMENSION(3) :: higher_grid_layout
172 LOGICAL :: do_io, efg_present, linres_present, odd, set_vdw_pool, should_output, &
173 smooth_required, spherical, uf_grid, use_ref_cell
174 REAL(kind=
dp) :: cutilev, rel_cutoff
175 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: radius
176 REAL(kind=
dp),
DIMENSION(:),
POINTER :: cutoff
177 TYPE(cell_type),
POINTER :: cell, cell_ref, my_cell
178 TYPE(cp_logger_type),
POINTER :: logger
179 TYPE(dft_control_type),
POINTER :: dft_control
180 TYPE(mp_para_env_type),
POINTER :: para_env
181 TYPE(pw_grid_type),
POINTER :: dct_pw_grid, mt_super_ref_grid, old_pw_grid, pw_grid, &
182 super_ref_grid, vdw_grid, vdw_ref_grid, xc_super_ref_grid
183 TYPE(pw_poisson_parameter_type) :: poisson_params
184 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
185 TYPE(qs_dispersion_type),
POINTER :: dispersion_env
186 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
187 TYPE(realspace_grid_desc_p_type),
DIMENSION(:), &
189 TYPE(realspace_grid_input_type) :: input_settings
190 TYPE(realspace_grid_type),
DIMENSION(:),
POINTER :: rs_grids
191 TYPE(section_vals_type),
POINTER :: efg_section, input, linres_section, &
192 poisson_section, print_section, &
193 rs_grid_section, xc_section
201 CALL timeset(routinen, handle)
208 NULLIFY (cutoff, cell, pw_grid, old_pw_grid, dft_control, qs_kind_set, &
209 pw_pools, rs_descs, para_env, cell_ref, vdw_ref_grid, &
210 mt_super_ref_grid, input, poisson_section, xc_super_ref_grid, &
211 dct_pw_grid, vdw_grid, super_ref_grid, my_cell, rs_grids, dispersion_env)
214 dft_control=dft_control, &
215 qs_kind_set=qs_kind_set, &
220 dispersion_env=dispersion_env)
222 cpassert(
ASSOCIATED(pw_env))
223 cpassert(pw_env%ref_count > 0)
227 IF (
ASSOCIATED(pw_env%rs_descs))
THEN
228 DO i = 1,
SIZE(pw_env%rs_descs)
231 DEALLOCATE (pw_env%rs_descs)
233 IF (
ASSOCIATED(pw_env%rs_grids))
THEN
234 DO i = 1,
SIZE(pw_env%rs_grids)
237 DEALLOCATE (pw_env%rs_grids)
239 IF (
ASSOCIATED(pw_env%gridlevel_info))
THEN
242 ALLOCATE (pw_env%gridlevel_info)
245 IF (
ASSOCIATED(pw_env%cube_info))
THEN
246 DO igrid_level = 1,
SIZE(pw_env%cube_info)
249 DEALLOCATE (pw_env%cube_info)
251 NULLIFY (pw_env%pw_pools, pw_env%cube_info)
260 IF (
PRESENT(external_para_env))
THEN
261 para_env => external_para_env
262 cpassert(
ASSOCIATED(para_env))
268 CALL get_qs_env(qs_env, use_ref_cell=use_ref_cell)
269 IF (use_ref_cell)
THEN
274 rel_cutoff = dft_control%qs_control%relative_cutoff
275 cutoff => dft_control%qs_control%e_cutoff
277 ngrid_level =
SIZE(cutoff)
283 "PRINT%GRID_INFORMATION")
285 ngrid_levels=ngrid_level, cutoff=cutoff, rel_cutoff=rel_cutoff, &
286 print_section=print_section)
288 ALLOCATE (pw_pools(ngrid_level))
290 IF (dft_control%qs_control%commensurate_mgrids)
THEN
291 ncommensurate = ngrid_level
299 IF (dft_control%qs_control%pw_grid_opt%spherical)
THEN
302 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace)
THEN
310 CALL setup_super_ref_grid(super_ref_grid, mt_super_ref_grid, &
311 xc_super_ref_grid, cutilev, grid_span, spherical, my_cell, para_env, &
312 qs_env%input, ncommensurate, uf_grid=uf_grid, &
313 print_section=print_section)
314 old_pw_grid => super_ref_grid
315 IF (.NOT.
ASSOCIATED(mt_super_ref_grid)) vdw_ref_grid => super_ref_grid
327 IF (dft_control%qs_control%pw_grid_opt%spherical)
THEN
331 ELSE IF (dft_control%qs_control%pw_grid_opt%fullspace)
THEN
342 blocked_id_input = dft_control%qs_control%pw_grid_opt%blocked
349 smooth_required = .false.
350 SELECT CASE (xc_deriv_method_id)
352 smooth_required = smooth_required .OR. .false.
355 smooth_required = smooth_required .OR. .true.
359 SELECT CASE (xc_smooth_method_id)
361 smooth_required = smooth_required .OR. .false.
363 smooth_required = smooth_required .OR. .true.
370 subsection_name=
"PROPERTIES%LINRES")
372 IF (linres_present)
THEN
373 smooth_required = smooth_required .OR. .true.
377 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
379 IF (efg_present)
THEN
380 smooth_required = smooth_required .OR. .true.
383 DO igrid_level = 1, ngrid_level
386 cutilev = cutoff(igrid_level)
390 blocked_id = blocked_id_input
392 distribution_layout = dft_control%qs_control%pw_grid_opt%distribution_layout
396 IF (qs_env%qmmm)
THEN
397 distribution_layout = (/para_env%num_pe, 1/)
402 IF (smooth_required)
THEN
403 distribution_layout = (/para_env%num_pe, 1/)
406 IF (igrid_level == 1)
THEN
407 IF (
ASSOCIATED(old_pw_grid))
THEN
408 CALL pw_grid_setup(my_cell%hmat, pw_grid, grid_span=grid_span, &
410 spherical=spherical, odd=odd, fft_usage=.true., &
411 ncommensurate=ncommensurate, icommensurate=igrid_level, &
413 ref_grid=old_pw_grid, &
414 rs_dims=distribution_layout, &
416 old_pw_grid => pw_grid
418 CALL pw_grid_setup(my_cell%hmat, pw_grid, grid_span=grid_span, &
420 spherical=spherical, odd=odd, fft_usage=.true., &
421 ncommensurate=ncommensurate, icommensurate=igrid_level, &
422 blocked=blocked_id, &
423 rs_dims=distribution_layout, &
425 old_pw_grid => pw_grid
428 CALL pw_grid_setup(my_cell%hmat, pw_grid, grid_span=grid_span, &
430 spherical=spherical, odd=odd, fft_usage=.true., &
431 ncommensurate=ncommensurate, icommensurate=igrid_level, &
433 ref_grid=old_pw_grid, &
434 rs_dims=distribution_layout, &
439 NULLIFY (pw_pools(igrid_level)%pool)
446 pw_env%pw_pools => pw_pools
449 DO i = 1, ngrid_level
450 IF (cutoff(i) == dft_control%qs_control%cutoff) pw_env%auxbas_grid = i
454 IF (
ASSOCIATED(xc_super_ref_grid))
THEN
456 pw_grid=xc_super_ref_grid)
459 pw_env%xc_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
460 CALL pw_env%xc_pw_pool%retain()
464 set_vdw_pool = .false.
465 IF (
ASSOCIATED(dispersion_env))
THEN
467 IF (dispersion_env%pw_cutoff > 0._dp) set_vdw_pool = .true.
470 IF (set_vdw_pool)
THEN
471 cpassert(
ASSOCIATED(old_pw_grid))
472 IF (.NOT.
ASSOCIATED(vdw_ref_grid)) vdw_ref_grid => old_pw_grid
474 IF (iounit > 0)
WRITE (iounit,
"(/,T2,A)")
"PW_GRID| Grid for non-local vdW functional"
475 CALL pw_grid_setup(my_cell%hmat, vdw_grid, grid_span=grid_span, &
476 cutoff=dispersion_env%pw_cutoff, &
477 spherical=spherical, odd=odd, fft_usage=.true., &
478 ncommensurate=0, icommensurate=0, &
480 ref_grid=vdw_ref_grid, &
481 rs_dims=distribution_layout, &
486 pw_env%vdw_pw_pool => pw_pools(pw_env%auxbas_grid)%pool
487 CALL pw_env%vdw_pw_pool%retain()
493 IF (.NOT.
ASSOCIATED(pw_env%poisson_env))
THEN
494 ALLOCATE (pw_env%poisson_env)
495 CALL pw_env%poisson_env%create()
500 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=my_cell%hmat, pw_pools=pw_env%pw_pools, &
501 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
502 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
509 IF (use_ref_cell)
THEN
510 DO igrid_level = 1,
SIZE(pw_pools)
511 CALL pw_grid_change(cell%hmat, pw_pools(igrid_level)%pool%pw_grid)
513 IF (set_vdw_pool)
CALL pw_grid_change(cell%hmat, pw_env%vdw_pw_pool%pw_grid)
515 CALL pw_poisson_set(pw_env%poisson_env, cell_hmat=cell%hmat, pw_pools=pw_env%pw_pools, &
516 parameters=poisson_params, mt_super_ref_pw_grid=mt_super_ref_grid, &
517 dct_pw_grid=dct_pw_grid, use_level=pw_env%auxbas_grid)
520 IF ((poisson_params%ps_implicit_params%boundary_condition .EQ.
mixed_periodic_bc) .OR. &
521 (poisson_params%ps_implicit_params%boundary_condition .EQ.
mixed_bc))
THEN
522 pw_env%poisson_env%parameters%dbc_params%do_dbc_cube = &
524 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
527 IF ((poisson_params%ps_implicit_params%boundary_condition .EQ.
neumann_bc) .OR. &
528 (poisson_params%ps_implicit_params%boundary_condition .EQ.
mixed_bc))
THEN
529 CALL setup_dct_pw_grids(pw_env%poisson_env%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid, &
530 my_cell%hmat, poisson_params%ps_implicit_params%neumann_directions, &
531 pw_env%poisson_env%dct_pw_grid)
534 IF (poisson_params%has_dielectric .AND. &
535 ((poisson_params%dielectric_params%derivative_method .EQ.
derivative_cd3) .OR. &
536 (poisson_params%dielectric_params%derivative_method .EQ.
derivative_cd5) .OR. &
537 (poisson_params%dielectric_params%derivative_method .EQ.
derivative_cd7)))
THEN
539 SELECT CASE (poisson_params%ps_implicit_params%boundary_condition)
541 CALL setup_diel_rs_grid(pw_env%poisson_env%diel_rs_grid, &
542 poisson_params%dielectric_params%derivative_method, input, &
543 pw_env%poisson_env%dct_pw_grid)
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%pw_pools(pw_env%poisson_env%pw_level)%pool%pw_grid)
559 ALLOCATE (radius(ngrid_level))
561 CALL compute_max_radius(radius, pw_env, qs_env)
568 ALLOCATE (rs_descs(ngrid_level))
570 ALLOCATE (rs_grids(ngrid_level))
572 ALLOCATE (pw_env%cube_info(ngrid_level))
573 higher_grid_layout = (/-1, -1, -1/)
575 DO igrid_level = 1, ngrid_level
576 pw_grid => pw_pools(igrid_level)%pool%pw_grid
580 pw_grid%dr(:), pw_grid%dh(:, :), pw_grid%dh_inv(:, :), pw_grid%orthorhombic, &
586 rs_grid_section=rs_grid_section, ilevel=igrid_level, &
587 higher_grid_layout=higher_grid_layout)
589 NULLIFY (rs_descs(igrid_level)%rs_desc)
592 IF (rs_descs(igrid_level)%rs_desc%distributed) higher_grid_layout = rs_descs(igrid_level)%rs_desc%group_dim
594 CALL rs_grid_create(rs_grids(igrid_level), rs_descs(igrid_level)%rs_desc)
596 pw_env%rs_descs => rs_descs
597 pw_env%rs_grids => rs_grids
608 SELECT CASE (poisson_params%solver)
610 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
611 "POISSON| Solver",
"PERIODIC"
613 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
614 "POISSON| Solver",
"ANALYTIC"
616 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
617 "POISSON| Solver", adjustr(
"Martyna-Tuckerman (MT)")
618 WRITE (unit=iounit, fmt=
"(T2,A,T71,F10.3,/,T2,A,T71,F10.1)") &
619 "POISSON| MT| Alpha", poisson_params%mt_alpha, &
620 "POISSON| MT| Relative cutoff", poisson_params%mt_rel_cutoff
622 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
623 "POISSON| Solver",
"MULTIPOLE (Bloechl)"
625 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
626 "POISSON| Solver",
"WAVELET"
627 WRITE (unit=iounit, fmt=
"(T2,A,T71,I10)") &
628 "POISSON| Wavelet| Scaling function", poisson_params%wavelet_scf_type
629 SELECT CASE (poisson_params%wavelet_method)
631 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
632 "POISSON| Periodicity",
"NONE"
634 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
635 "POISSON| Periodicity",
"XZ"
637 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
638 "POISSON| Periodicity",
"XYZ"
640 cpabort(
"Invalid periodicity for wavelet solver selected")
643 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
644 "POISSON| Solver",
"IMPLICIT (GENERALIZED)"
645 boundary_condition = poisson_params%ps_implicit_params%boundary_condition
646 SELECT CASE (boundary_condition)
648 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
649 "POISSON| Boundary Condition",
"PERIODIC"
652 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
653 "POISSON| Boundary Condition",
"NEUMANN"
655 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
656 "POISSON| Boundary Condition",
"MIXED"
658 SELECT CASE (poisson_params%ps_implicit_params%neumann_directions)
660 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X, Y, Z"
661 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"NONE"
663 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X, Y"
664 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"Z"
666 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X, Z"
667 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"Y"
669 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"Y, Z"
670 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"X"
672 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"X"
673 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"Y, Z"
675 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"Y"
676 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"X, Z"
678 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| homogeneous Neumann directions",
"Z"
679 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)")
"POISSON| periodic directions",
"X, Y"
681 cpabort(
"Invalid combination of Neumann and periodic conditions.")
684 WRITE (unit=iounit, fmt=
"(T2,A,T51,A30)") &
685 "POISSON| Boundary Condition",
"PERIODIC & DIRICHLET"
687 cpabort(
"Invalid boundary conditions for the implicit (generalized) poisson solver.")
689 WRITE (unit=iounit, fmt=
"(T2,A,T71,I10)") &
690 "POISSON| Maximum number of iterations", poisson_params%ps_implicit_params%max_iter
691 WRITE (unit=iounit, fmt=
"(T2,A,T51,ES30.2)") &
692 "POISSON| Convergence threshold", poisson_params%ps_implicit_params%tol
693 IF (poisson_params%dielectric_params%dielec_functiontype .EQ.
rho_dependent)
THEN
694 WRITE (unit=iounit, fmt=
"(T2,A,T51,F30.2)") &
695 "POISSON| Dielectric Constant", poisson_params%dielectric_params%eps0
697 WRITE (unit=iounit, fmt=
"(T2,A,T31,F9.2)", advance=
'NO') &
698 "POISSON| Dielectric Constants", poisson_params%dielectric_params%eps0
699 DO i = 1, poisson_params%dielectric_params%n_aa_cuboidal
700 WRITE (unit=iounit, fmt=
"(F9.2)", advance=
'NO') &
701 poisson_params%dielectric_params%aa_cuboidal_eps(i)
703 DO i = 1, poisson_params%dielectric_params%n_xaa_annular
704 WRITE (unit=iounit, fmt=
"(F9.2)", advance=
'NO') &
705 poisson_params%dielectric_params%xaa_annular_eps(i)
707 WRITE (unit=iounit, fmt=
'(A1,/)')
709 WRITE (unit=iounit, fmt=
"(T2,A,T51,ES30.2)") &
710 "POISSON| Relaxation parameter", poisson_params%ps_implicit_params%omega
712 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,A30)") &
713 "POISSON| Solver",
"NONE"
715 cpabort(
"Invalid Poisson solver selected")
719 IF (sum(poisson_params%periodic(1:3)) == 0)
THEN
720 WRITE (unit=iounit, fmt=
"(T2,A,T77,A4)") &
721 "POISSON| Periodicity",
"NONE"
724 IF (poisson_params%periodic(1) == 1) string = trim(string)//
"X"
725 IF (poisson_params%periodic(2) == 1) string = trim(string)//
"Y"
726 IF (poisson_params%periodic(3) == 1) string = trim(string)//
"Z"
727 WRITE (unit=iounit, fmt=
"(T2,A,T78,A3)") &
728 "POISSON| Periodicity", adjustr(string)
733 IF ((dft_control%qs_control%method_id ==
do_method_gpw) .OR. &
741 IF (any(my_cell%perd(1:3) /= poisson_params%periodic(1:3)))
THEN
742 CALL cp_warn(__location__, &
743 "The selected periodicities in the sections &CELL and &POISSON do not match")
751 IF (should_output)
THEN
752 DO igrid_level = 1, ngrid_level
759 CALL timestop(handle)
773 SUBROUTINE compute_max_radius(radius, pw_env, qs_env)
774 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: radius
775 TYPE(pw_env_type),
POINTER :: pw_env
776 TYPE(qs_environment_type),
POINTER :: qs_env
778 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_max_radius'
779 CHARACTER(LEN=8),
DIMENSION(4),
PARAMETER :: &
780 pbas = (/
"ORB ",
"AUX_FIT ",
"MAO ",
"HARRIS "/)
781 CHARACTER(LEN=8),
DIMENSION(8),
PARAMETER :: sbas = (/
"ORB ",
"AUX ",
"RI_AUX ", &
782 "MAO ",
"HARRIS ",
"RI_HXC ",
"RI_K ",
"LRI_AUX "/)
783 REAL(kind=
dp),
PARAMETER :: safety_factor = 1.015_dp
785 INTEGER :: handle, ibasis_set_type, igrid_level, igrid_zet0_s, ikind, ipgf, iset, ishell, &
786 jkind, jpgf, jset, jshell, la, lb, lgrid_level, ngrid_level, nkind, nseta, nsetb
787 INTEGER,
DIMENSION(:),
POINTER :: npgfa, npgfb, nshella, nshellb
788 INTEGER,
DIMENSION(:, :),
POINTER :: lshella, lshellb
789 REAL(kind=
dp) :: alpha, core_charge, eps_gvg, eps_rho, &
790 max_rpgf0_s, maxradius, zet0_h, zetp
791 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: zeta, zetb
792 TYPE(dft_control_type),
POINTER :: dft_control
793 TYPE(gto_basis_set_type),
POINTER :: orb_basis_set
794 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
795 TYPE(qs_kind_type),
POINTER :: qs_kind
796 TYPE(rho0_mpole_type),
POINTER :: rho0_mpole
803 CALL timeset(routinen, handle)
804 NULLIFY (dft_control, qs_kind_set, rho0_mpole)
806 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, dft_control=dft_control)
808 eps_rho = dft_control%qs_control%eps_rho_rspace
809 eps_gvg = dft_control%qs_control%eps_gvg_rspace
811 IF (dft_control%qs_control%gapw)
THEN
812 CALL get_qs_env(qs_env=qs_env, rho0_mpole=rho0_mpole)
813 cpassert(
ASSOCIATED(rho0_mpole))
815 CALL get_rho0_mpole(rho0_mpole=rho0_mpole, max_rpgf0_s=max_rpgf0_s, zet0_h=zet0_h)
817 rho0_mpole%igrid_zet0_s = igrid_zet0_s
820 ngrid_level =
SIZE(radius)
821 nkind =
SIZE(qs_kind_set)
826 DO igrid_level = 1, ngrid_level
830 IF (dft_control%qs_control%gapw)
THEN
831 IF (igrid_zet0_s == igrid_level) maxradius = max(maxradius, max_rpgf0_s)
840 alpha_core_charge=alpha, ccore_charge=core_charge)
841 IF (alpha > 0.0_dp .AND. core_charge .NE. 0.0_dp)
THEN
842 maxradius = max(maxradius,
exp_radius(0, alpha, eps_rho, core_charge, rlow=maxradius))
844 maxradius = max(maxradius,
exp_radius(1, alpha, eps_rho, core_charge, rlow=maxradius))
850 DO ibasis_set_type = 1,
SIZE(sbas)
852 qs_kind => qs_kind_set(ikind)
853 NULLIFY (orb_basis_set)
855 basis_set=orb_basis_set, basis_type=sbas(ibasis_set_type))
856 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
858 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
860 DO ipgf = 1, npgfa(iset)
861 DO ishell = 1, nshella(iset)
862 zetp = zeta(ipgf, iset)
863 la = lshella(ishell, iset)
865 IF (lgrid_level .EQ. igrid_level)
THEN
866 maxradius = max(maxradius,
exp_radius(la, zetp, eps_rho, 1.0_dp, rlow=maxradius))
874 DO ibasis_set_type = 1,
SIZE(pbas)
876 qs_kind => qs_kind_set(ikind)
877 NULLIFY (orb_basis_set)
879 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
880 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
882 npgf=npgfa, nset=nseta, zet=zeta, l=lshella, nshell=nshella)
885 qs_kind => qs_kind_set(jkind)
887 basis_set=orb_basis_set, basis_type=pbas(ibasis_set_type))
888 IF (.NOT.
ASSOCIATED(orb_basis_set)) cycle
890 npgf=npgfb, nset=nsetb, zet=zetb, l=lshellb, nshell=nshellb)
892 DO ipgf = 1, npgfa(iset)
893 DO ishell = 1, nshella(iset)
894 la = lshella(ishell, iset)
896 DO jpgf = 1, npgfb(jset)
897 DO jshell = 1, nshellb(jset)
898 zetp = zeta(ipgf, iset) + zetb(jpgf, jset)
899 lb = lshellb(jshell, jset) + la
901 IF (lgrid_level .EQ. igrid_level)
THEN
903 maxradius = max(maxradius,
exp_radius(lb, zetp, eps_rho, 2.0_dp, rlow=maxradius))
905 maxradius = max(maxradius,
exp_radius(lb + 1, zetp, eps_rho, 2.0_dp, rlow=maxradius))
907 maxradius = max(maxradius,
exp_radius(lb, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
909 maxradius = max(maxradius,
exp_radius(lb + 1, zetp, eps_gvg, 2.0_dp, rlow=maxradius))
922 maxradius = maxradius*safety_factor
923 radius(igrid_level) = maxradius
926 CALL timestop(handle)
928 END SUBROUTINE compute_max_radius
948 SUBROUTINE setup_super_ref_grid(super_ref_pw_grid, mt_super_ref_pw_grid, &
949 xc_super_ref_pw_grid, cutilev, grid_span, spherical, &
950 cell_ref, para_env, input, my_ncommensurate, uf_grid, print_section)
951 TYPE(pw_grid_type),
POINTER :: super_ref_pw_grid, mt_super_ref_pw_grid, &
953 REAL(kind=
dp),
INTENT(IN) :: cutilev
954 INTEGER,
INTENT(IN) :: grid_span
955 LOGICAL,
INTENT(in) :: spherical
956 TYPE(cell_type),
POINTER :: cell_ref
957 TYPE(mp_para_env_type),
POINTER :: para_env
958 TYPE(section_vals_type),
POINTER :: input
959 INTEGER,
INTENT(IN) :: my_ncommensurate
960 LOGICAL,
INTENT(in) :: uf_grid
961 TYPE(section_vals_type),
POINTER :: print_section
963 INTEGER :: iounit, my_val, nn(3), no(3)
965 REAL(kind=
dp) :: mt_rel_cutoff, my_cutilev
966 TYPE(cp_logger_type),
POINTER :: logger
967 TYPE(section_vals_type),
POINTER :: poisson_section
969 NULLIFY (poisson_section)
970 cpassert(.NOT.
ASSOCIATED(mt_super_ref_pw_grid))
971 cpassert(.NOT.
ASSOCIATED(xc_super_ref_pw_grid))
972 cpassert(.NOT.
ASSOCIATED(super_ref_pw_grid))
982 IF (mt_rel_cutoff > 1._dp) mt_s_grid = .true.
991 CALL pw_grid_setup(cell_ref%hmat, xc_super_ref_pw_grid, grid_span=grid_span, &
992 cutoff=4._dp*cutilev, spherical=spherical, odd=.false., fft_usage=.true., &
993 ncommensurate=my_ncommensurate, icommensurate=1, &
996 super_ref_pw_grid => xc_super_ref_pw_grid
1001 IF (
ASSOCIATED(xc_super_ref_pw_grid))
THEN
1002 cpabort(
"special grid for mt and fine xc grid not compatible")
1004 my_cutilev = cutilev*mt_rel_cutoff
1007 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1009 odd=.false., fft_usage=.true., ncommensurate=0, icommensurate=1)
1012 cpassert(all(nn > no))
1014 cutoff=my_cutilev, spherical=spherical, fft_usage=.true., &
1017 super_ref_pw_grid => mt_super_ref_pw_grid
1022 END SUBROUTINE setup_super_ref_grid
1035 SUBROUTINE setup_diel_rs_grid(diel_rs_grid, method, input, pw_grid)
1037 TYPE(realspace_grid_type),
POINTER :: diel_rs_grid
1038 INTEGER,
INTENT(IN) :: method
1039 TYPE(section_vals_type),
POINTER :: input
1040 TYPE(pw_grid_type),
POINTER :: pw_grid
1042 CHARACTER(LEN=*),
PARAMETER :: routinen =
'setup_diel_rs_grid'
1044 INTEGER :: border_points, handle
1045 TYPE(realspace_grid_desc_type),
POINTER :: rs_desc
1046 TYPE(realspace_grid_input_type) :: input_settings
1047 TYPE(section_vals_type),
POINTER :: rs_grid_section
1049 CALL timeset(routinen, handle)
1053 SELECT CASE (method)
1061 CALL init_input_type(input_settings, 2*border_points + 1, rs_grid_section, &
1064 border_points=border_points)
1065 ALLOCATE (diel_rs_grid)
1070 CALL timestop(handle)
1072 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)
...
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_setup(cell_hmat, pw_grid, grid_span, cutoff, bounds, bounds_local, npts, spherical, odd, fft_usage, ncommensurate, icommensurate, blocked, ref_grid, rs_dims, iounit)
sets up a pw_grid
subroutine, public pw_grid_create(pw_grid, pe_group, local)
Initialize a PW grid with all defaults.
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_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, 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, 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, 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_r3d_rs_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_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)