(git:ed6f26b)
Loading...
Searching...
No Matches
qs_gapw_densities.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
15 USE kinds, ONLY: dp
17 USE pw_env_types, ONLY: pw_env_get,&
23 USE qs_kind_types, ONLY: get_qs_kind,&
28 USE qs_rho0_types, ONLY: rho0_atom_type,&
34#include "./base/base_uses.f90"
35
36 IMPLICIT NONE
37
38 PRIVATE
39
40 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_gapw_densities'
41
42 PUBLIC :: prepare_gapw_den
43
44CONTAINS
45
46! **************************************************************************************************
47!> \brief ...
48!> \param qs_env ...
49!> \param local_rho_set ...
50!> \param do_rho0 ...
51!> \param kind_set_external can be provided to use different projectors/grids/basis than the default
52!> \param pw_env_sub ...
53! **************************************************************************************************
54 SUBROUTINE prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
55
56 TYPE(qs_environment_type), POINTER :: qs_env
57 TYPE(local_rho_type), OPTIONAL, POINTER :: local_rho_set
58 LOGICAL, INTENT(IN), OPTIONAL :: do_rho0
59 TYPE(qs_kind_type), DIMENSION(:), OPTIONAL, &
60 POINTER :: kind_set_external
61 TYPE(pw_env_type), OPTIONAL :: pw_env_sub
62
63 CHARACTER(len=*), PARAMETER :: routinen = 'prepare_gapw_den'
64
65 INTEGER :: handle, ikind, ispin, natom, nspins, &
66 output_unit
67 INTEGER, DIMENSION(:), POINTER :: atom_list
68 LOGICAL :: extern, my_do_rho0, paw_atom
69 REAL(dp) :: rho0_h_tot, tot_rs_int
70 REAL(dp), DIMENSION(:), POINTER :: rho1_h_tot, rho1_s_tot
71 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
72 TYPE(dft_control_type), POINTER :: dft_control
73 TYPE(gapw_control_type), POINTER :: gapw_control
74 TYPE(mp_para_env_type), POINTER :: para_env
75 TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: my_pools
76 TYPE(qs_charges_type), POINTER :: qs_charges
77 TYPE(qs_kind_type), DIMENSION(:), POINTER :: my_kind_set
78 TYPE(realspace_grid_desc_p_type), DIMENSION(:), &
79 POINTER :: my_rs_descs
80 TYPE(realspace_grid_type), DIMENSION(:), POINTER :: my_rs_grids
81 TYPE(rho0_atom_type), DIMENSION(:), POINTER :: rho0_atom_set
82 TYPE(rho0_mpole_type), POINTER :: rho0_mpole
83 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho_atom_set
84
85 CALL timeset(routinen, handle)
86
87 NULLIFY (atomic_kind_set)
88 NULLIFY (my_kind_set)
89 NULLIFY (dft_control)
90 NULLIFY (gapw_control)
91 NULLIFY (para_env)
92 NULLIFY (atom_list)
93 NULLIFY (rho0_mpole)
94 NULLIFY (qs_charges)
95 NULLIFY (rho1_h_tot, rho1_s_tot)
96 NULLIFY (rho_atom_set)
97 NULLIFY (rho0_atom_set)
98
99 my_do_rho0 = .true.
100 IF (PRESENT(do_rho0)) my_do_rho0 = do_rho0
101
102 output_unit = cp_logger_get_default_io_unit()
103
104 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, &
105 para_env=para_env, &
106 qs_charges=qs_charges, &
107 qs_kind_set=my_kind_set, &
108 atomic_kind_set=atomic_kind_set, &
109 rho0_mpole=rho0_mpole, &
110 rho_atom_set=rho_atom_set, &
111 rho0_atom_set=rho0_atom_set)
112
113 gapw_control => dft_control%qs_control%gapw_control
114
115 ! If TDDFPT%MGRID is defined, overwrite QS grid info accordingly
116 IF (PRESENT(local_rho_set)) THEN
117 rho_atom_set => local_rho_set%rho_atom_set
118 IF (my_do_rho0) THEN
119 rho0_mpole => local_rho_set%rho0_mpole
120 rho0_atom_set => local_rho_set%rho0_atom_set
121 END IF
122 END IF
123
124 extern = .false.
125 IF (PRESENT(kind_set_external)) THEN
126 cpassert(ASSOCIATED(kind_set_external))
127 my_kind_set => kind_set_external
128 extern = .true.
129 END IF
130
131 nspins = dft_control%nspins
132
133 rho0_h_tot = 0.0_dp
134 ALLOCATE (rho1_h_tot(1:nspins), rho1_s_tot(1:nspins))
135 rho1_h_tot = 0.0_dp
136 rho1_s_tot = 0.0_dp
137
138 DO ikind = 1, SIZE(atomic_kind_set)
139 CALL get_atomic_kind(atomic_kind_set(ikind), atom_list=atom_list, natom=natom)
140 CALL get_qs_kind(my_kind_set(ikind), paw_atom=paw_atom)
141
142 !Calculate rho1_h and rho1_s on the radial grids centered on the atomic position
143 IF (paw_atom) THEN
144 CALL calculate_rho_atom(para_env, rho_atom_set, my_kind_set(ikind), &
145 atom_list, natom, nspins, rho1_h_tot, rho1_s_tot)
146 END IF
147
148 !Calculate rho0_h and rho0_s on the radial grids centered on the atomic position
149 IF (my_do_rho0) &
150 CALL calculate_rho0_atom(gapw_control, rho_atom_set, rho0_atom_set, rho0_mpole, &
151 atom_list, natom, ikind, my_kind_set(ikind), rho0_h_tot)
152
153 END DO
154
155 !Do not mess with charges if using a non-default kind_set
156 IF (.NOT. extern) THEN
157 CALL para_env%sum(rho1_h_tot)
158 CALL para_env%sum(rho1_s_tot)
159 DO ispin = 1, nspins
160 qs_charges%total_rho1_hard(ispin) = -rho1_h_tot(ispin)
161 qs_charges%total_rho1_soft(ispin) = -rho1_s_tot(ispin)
162 END DO
163
164 IF (my_do_rho0) THEN
165 rho0_mpole%total_rho0_h = -rho0_h_tot
166
167 ! When MGRID is defined within TDDFPT
168 IF (PRESENT(pw_env_sub)) THEN
169 ! Find pool
170 NULLIFY (my_pools, my_rs_grids, my_rs_descs)
171 CALL pw_env_get(pw_env=pw_env_sub, rs_grids=my_rs_grids, &
172 rs_descs=my_rs_descs, pw_pools=my_pools)
173 ! Put the rho0_soft on the global grid
174 CALL put_rho0_on_grid(qs_env, rho0_mpole, tot_rs_int, my_pools=my_pools, &
175 my_rs_grids=my_rs_grids, my_rs_descs=my_rs_descs)
176 ELSE
177 ! Put the rho0_soft on the global grid
178 CALL put_rho0_on_grid(qs_env, rho0_mpole, tot_rs_int)
179 END IF
180
181 IF (abs(rho0_h_tot) .GE. 1.0e-5_dp) THEN
182 IF (abs(1.0_dp - abs(tot_rs_int/rho0_h_tot)) .GT. 1.0e-3_dp) THEN
183 IF (output_unit > 0) THEN
184 WRITE (output_unit, '(/,72("*"))')
185 WRITE (output_unit, '(T2,A,T66,1E20.8)') &
186 "WARNING: rho0 calculated on the local grid is :", -rho0_h_tot, &
187 " rho0 calculated on the global grid is :", tot_rs_int
188 WRITE (output_unit, '(T2,A)') &
189 " bad integration"
190 WRITE (output_unit, '(72("*"),/)')
191 END IF
192 END IF
193 END IF
194 qs_charges%total_rho0_soft_rspace = tot_rs_int
195 qs_charges%total_rho0_hard_lebedev = rho0_h_tot
196 ELSE
197 qs_charges%total_rho0_hard_lebedev = 0.0_dp
198 END IF
199 END IF
200
201 DEALLOCATE (rho1_h_tot, rho1_s_tot)
202
203 CALL timestop(handle)
204
205 END SUBROUTINE prepare_gapw_den
206
207END MODULE qs_gapw_densities
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
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 ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
container for information about total charges on the grids
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.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
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 put_rho0_on_grid(qs_env, rho0, tot_rs_int, my_pools, my_rs_grids, my_rs_descs)
...
subroutine, public calculate_rho0_atom(gapw_control, rho_atom_set, rho0_atom_set, rho0_mp, a_list, natom, ikind, qs_kind, rho0_h_tot)
...
subroutine, public calculate_rho_atom(para_env, rho_atom_set, qs_kind, atom_list, natom, nspins, tot_rho1_h, tot_rho1_s)
...
Provides all information about an atomic kind.
stores all the informations relevant to an mpi environment
contained for different pw related things
to create arrays of pools
Container for information about total charges on the grids.
Provides all information about a quickstep kind.