(git:8917686)
Loading...
Searching...
No Matches
qs_update_s_mstruct.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! *****************************************************************************
9!> \brief qs_environment methods that use many other modules
10!> \par History
11!> 09.2002 created [fawzi]
12!> - local atom distribution (25.06.2003,MK)
13!> \author Fawzi Mohamed
14! *****************************************************************************
26 USE kinds, ONLY: default_string_length,&
27 dp
28 USE pw_methods, ONLY: pw_transfer
29 USE pw_types, ONLY: pw_c1d_gs_type,&
36 USE qs_ks_types, ONLY: get_ks_env,&
41 USE qs_rho_types, ONLY: qs_rho_type
52#include "./base/base_uses.f90"
53
54 IMPLICIT NONE
55 PRIVATE
56
57 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
58 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_update_s_mstruct'
59
61!***
62CONTAINS
63
64! *****************************************************************************
65!> \brief updates the s_mstruct to reflect the new overlap structure,
66!> and also updates rho_core distribution.
67!> Should be called after the atoms have moved and the new overlap
68!> has been calculated.
69!> \param qs_env the environment to update
70!> \par History
71!> 07.2002 created [fawzi]
72!> \author Fawzi Mohamed
73! **************************************************************************************************
74 SUBROUTINE qs_env_update_s_mstruct(qs_env)
75 TYPE(qs_environment_type), POINTER :: qs_env
76
77 CHARACTER(len=*), PARAMETER :: routinen = 'qs_env_update_s_mstruct'
78
79 INTEGER :: handle, nk
80 LOGICAL :: do_ppl
81 REAL(kind=dp) :: wtot
82 REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: cw
83 TYPE(dft_control_type), POINTER :: dft_control
84 TYPE(pw_c1d_gs_type), POINTER :: rho_core, rho_nlcc_g
85 TYPE(pw_r3d_rs_type), POINTER :: rho_nlcc, vppl, xcint_weights
86
87 CALL timeset(routinen, handle)
88
89 cpassert(ASSOCIATED(qs_env))
90
91 NULLIFY (dft_control)
92 CALL get_qs_env(qs_env, &
93 dft_control=dft_control)
94
95 ! *** updates rho core ***
96 NULLIFY (rho_core)
97 CALL get_qs_env(qs_env, rho_core=rho_core)
98 IF (dft_control%qs_control%gapw) THEN
99 qs_env%qs_charges%total_rho_core_rspace = qs_env%local_rho_set%rhoz_tot
100 ! Initial CNEO quantum nuclear charge density is a simple Zeff sum.
101 ! Later it will be calculated from numerical integration during SCF.
102 qs_env%qs_charges%total_rho1_hard_nuc = qs_env%local_rho_set%rhoz_cneo_tot
103 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw) THEN
104 cpassert(ASSOCIATED(rho_core))
105 CALL calculate_rho_core(rho_core, &
106 qs_env%qs_charges%total_rho_core_rspace, qs_env, only_nopaw=.true.)
107 ELSE
108 IF (ASSOCIATED(rho_core)) THEN
109 CALL rho_core%release()
110 DEALLOCATE (rho_core)
111 END IF
112 END IF
113 ! force analytic ppl calculation
114 dft_control%qs_control%do_ppl_method = do_ppl_analytic
115 ELSE IF (dft_control%qs_control%semi_empirical) THEN
116 !??
117 ELSE IF (dft_control%qs_control%dftb) THEN
118 !??
119 ELSE IF (dft_control%qs_control%xtb) THEN
120 !??
121 ELSE
122 cpassert(ASSOCIATED(rho_core))
123 CALL calculate_rho_core(rho_core, &
124 qs_env%qs_charges%total_rho_core_rspace, qs_env)
125 END IF
126
127 ! calculate local pseudopotential on grid
128 do_ppl = dft_control%qs_control%do_ppl_method == do_ppl_grid
129 IF (do_ppl) THEN
130 NULLIFY (vppl)
131 CALL get_qs_env(qs_env, vppl=vppl)
132 cpassert(ASSOCIATED(vppl))
133 CALL calculate_ppl_grid(vppl, qs_env)
134 END IF
135
136 ! compute the rho_nlcc
137 NULLIFY (rho_nlcc, rho_nlcc_g)
138 CALL get_qs_env(qs_env, rho_nlcc=rho_nlcc, rho_nlcc_g=rho_nlcc_g)
139 IF (ASSOCIATED(rho_nlcc)) THEN
140 CALL calculate_rho_nlcc(rho_nlcc, qs_env)
141 CALL pw_transfer(rho_nlcc, rho_nlcc_g)
142 END IF
143
144 ! compute the xcint_weights
145 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
146 IF (dft_control%qs_control%gapw_control%accurate_xcint) THEN
147 CALL get_qs_env(qs_env, xcint_weights=xcint_weights, nkind=nk)
148 ALLOCATE (cw(nk))
149 cw = 1.0_dp
150 CALL calculate_rho_core(xcint_weights, wtot, qs_env, &
151 dft_control%qs_control%gapw_control%aw, cw)
152 xcint_weights%array = 1.0_dp + xcint_weights%array
153 DEALLOCATE (cw)
154 END IF
155 END IF
156
157 ! allocates and creates the task_list
158 CALL qs_create_task_list(qs_env)
159
160 ! *** environment for ddapc ***
161 IF (ASSOCIATED(qs_env%cp_ddapc_env)) THEN
162 CALL cp_ddapc_release(qs_env%cp_ddapc_env)
163 DEALLOCATE (qs_env%cp_ddapc_env)
164 END IF
165 CALL cp_ddapc_init(qs_env)
166
167 ! *** tell ks_env ***
168 CALL qs_ks_did_change(qs_env%ks_env, s_mstruct_changed=.true.)
169
170 ! *** Updates rho structure ***
171 CALL qs_env_rebuild_rho(qs_env=qs_env)
172
173 ! *** tell scf_env ***
174 IF (ASSOCIATED(qs_env%scf_env)) THEN
175 CALL scf_env_did_change(qs_env%scf_env)
176 END IF
177
178 CALL timestop(handle)
179
180 END SUBROUTINE qs_env_update_s_mstruct
181
182! *****************************************************************************
183!> \brief ...
184!> \param qs_env ...
185! **************************************************************************************************
186 SUBROUTINE qs_create_task_list(qs_env)
187 TYPE(qs_environment_type), POINTER :: qs_env
188
189 CHARACTER(len=*), PARAMETER :: routinen = 'qs_create_task_list'
190
191 CHARACTER(LEN=default_string_length) :: basis_type
192 INTEGER :: handle, isub
193 LOGICAL :: composite_direct_ao, composite_reference, native_grid_diagnostics, &
194 paw_one_center, skip_load_balance_distributed, soft_valid
195 TYPE(dft_control_type), POINTER :: dft_control
196 TYPE(qs_ks_env_type), POINTER :: ks_env
197 TYPE(section_vals_type), POINTER :: gauxc_section, input, xc_section
198 TYPE(task_list_type), POINTER :: task_list
199
200 CALL timeset(routinen, handle)
201 NULLIFY (ks_env, dft_control, gauxc_section, input, xc_section)
202 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, input=input)
203
204 soft_valid = (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
205 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
206 composite_reference = native_skala_gapw_composite_reference(xc_section)
207 composite_direct_ao = composite_reference .AND. &
209 paw_one_center = skala_gapw_representation(xc_section) == skala_gapw_paw_one_center
210 native_grid_diagnostics = .false.
211 gauxc_section => get_gauxc_section(xc_section)
212 IF (ASSOCIATED(gauxc_section)) THEN
213 CALL section_vals_val_get(gauxc_section, "NATIVE_GRID_DIAGNOSTICS", &
214 l_val=native_grid_diagnostics)
215 END IF
216 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
217 IF (.NOT. (dft_control%qs_control%semi_empirical &
218 .OR. dft_control%qs_control%xtb &
219 .OR. dft_control%qs_control%dftb)) THEN
220 ! generate task lists (non-soft)
221 IF (.NOT. dft_control%qs_control%gapw .OR. composite_direct_ao .OR. &
222 ((composite_reference .OR. paw_one_center) .AND. native_grid_diagnostics)) THEN
223 CALL get_ks_env(ks_env, task_list=task_list)
224 IF (.NOT. ASSOCIATED(task_list)) THEN
225 CALL allocate_task_list(task_list)
226 CALL set_ks_env(ks_env, task_list=task_list)
227 END IF
228 CALL generate_qs_task_list(ks_env, task_list, basis_type="ORB", &
229 reorder_rs_grid_ranks=.true., &
230 skip_load_balance_distributed=skip_load_balance_distributed)
231 END IF
232 ! generate the soft task list
233 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
234 CALL get_ks_env(ks_env, task_list_soft=task_list)
235 IF (.NOT. ASSOCIATED(task_list)) THEN
236 CALL allocate_task_list(task_list)
237 CALL set_ks_env(ks_env, task_list_soft=task_list)
238 END IF
239 CALL generate_qs_task_list(ks_env, task_list, basis_type="ORB_SOFT", &
240 reorder_rs_grid_ranks=.true., &
241 skip_load_balance_distributed=skip_load_balance_distributed)
242 END IF
243 END IF
244
245 IF (dft_control%qs_control%do_kg) THEN
246
247 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed .OR. &
248 qs_env%kg_env%tnadd_method == kg_tnadd_embed_ri) THEN
249
250 IF (ASSOCIATED(qs_env%kg_env%subset)) THEN
251 DO isub = 1, qs_env%kg_env%nsubsets
252 IF (ASSOCIATED(qs_env%kg_env%subset(isub)%task_list)) THEN
253 CALL deallocate_task_list(qs_env%kg_env%subset(isub)%task_list)
254 END IF
255 END DO
256 ELSE
257 ALLOCATE (qs_env%kg_env%subset(qs_env%kg_env%nsubsets))
258 END IF
259
260 IF (soft_valid) THEN
261 basis_type = "ORB_SOFT"
262 ELSE
263 basis_type = "ORB"
264 END IF
265
266 DO isub = 1, qs_env%kg_env%nsubsets
267 CALL allocate_task_list(qs_env%kg_env%subset(isub)%task_list)
268 ! generate the subset task list from the neighborlist
269 CALL generate_qs_task_list(ks_env, qs_env%kg_env%subset(isub)%task_list, &
270 basis_type=basis_type, &
271 reorder_rs_grid_ranks=.false., &
272 skip_load_balance_distributed=skip_load_balance_distributed, &
273 sab_orb_external=qs_env%kg_env%subset(isub)%sab_orb)
274 END DO
275
276 END IF
277
278 END IF
279
280 CALL timestop(handle)
281
282 END SUBROUTINE qs_create_task_list
283
284! *****************************************************************************
285!> \brief rebuilds the rho structure, making sure that everything is allocated
286!> and has the right size
287!> \param qs_env the environment in which rho should be rebuilt
288!> \param rebuild_ao if it is necessary to rebuild rho_ao. Defaults to true.
289!> \param rebuild_grids if it in necessary to rebuild rho_r and rho_g.
290!> Defaults to false.
291!> \par History
292!> 10.2002 created [fawzi]
293!> \author Fawzi Mohamed
294!> \note
295!> needs updated pw pools, s_mstruct and h.
296!> The use of p to keep the structure of h (needed for the forces)
297!> is ugly and should be removed.
298!> If necessary rho is created from scratch.
299! **************************************************************************************************
300 SUBROUTINE qs_env_rebuild_rho(qs_env, rebuild_ao, rebuild_grids)
301 TYPE(qs_environment_type), POINTER :: qs_env
302 LOGICAL, INTENT(in), OPTIONAL :: rebuild_ao, rebuild_grids
303
304 CHARACTER(len=*), PARAMETER :: routinen = 'qs_env_rebuild_rho'
305
306 INTEGER :: handle
307 LOGICAL :: do_admm, gapw_xc
308 TYPE(dft_control_type), POINTER :: dft_control
309 TYPE(qs_rho_type), POINTER :: rho, rho_external, rho_xc
310
311 NULLIFY (rho)
312 CALL timeset(routinen, handle)
313
314 CALL get_qs_env(qs_env, &
315 dft_control=dft_control, &
316 rho=rho, &
317 rho_xc=rho_xc, &
318 rho_external=rho_external)
319
320 gapw_xc = dft_control%qs_control%gapw_xc
321 do_admm = dft_control%do_admm
322 CALL qs_rho_rebuild(rho, qs_env=qs_env, &
323 rebuild_ao=rebuild_ao, rebuild_grids=rebuild_grids)
324
325 IF (gapw_xc) THEN
326 CALL qs_rho_rebuild(rho_xc, qs_env=qs_env, &
327 rebuild_ao=rebuild_ao, rebuild_grids=rebuild_grids)
328 END IF
329
330! ZMP rebuilding external density
331 IF (dft_control%apply_external_density) THEN
332 CALL qs_rho_rebuild(rho_external, qs_env=qs_env, &
333 rebuild_grids=rebuild_grids)
334 dft_control%read_external_density = .true.
335 END IF
336
337 CALL timestop(handle)
338
339 END SUBROUTINE qs_env_rebuild_rho
340
341END MODULE qs_update_s_mstruct
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
contains information regarding the decoupling/recoupling method of Bloechl
subroutine, public cp_ddapc_release(cp_ddapc_env)
...
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
subroutine, public cp_ddapc_init(qs_env)
Initialize the cp_ddapc_environment.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public kg_tnadd_embed_ri
integer, parameter, public kg_tnadd_embed
integer, parameter, public do_ppl_grid
integer, parameter, public do_ppl_analytic
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_nlcc(rho_nlcc, qs_env)
computes the density of the non-linear core correction on the grid
subroutine, public calculate_ppl_grid(vppl, qs_env)
computes the local pseudopotential (without erf term) on the grid
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, mimic, 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, matrix_vhxc, 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, xcint_weights, 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.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
module that contains the definitions of the scf types
subroutine, public scf_env_did_change(scf_env)
function to be called to inform the scf_env about changes
qs_environment methods that use many other modules
subroutine, public qs_env_update_s_mstruct(qs_env)
updates the s_mstruct to reflect the new overlap structure, and also updates rho_core distribution....
Experimental CP2K-native GPW real-space-grid path for SKALA TorchScript models.
logical function, public native_skala_gapw_composite_direct_ao(xc_section)
Return true if the GAPW composite reference uses direct full-ORB collocation.
integer function, public skala_gapw_representation(xc_section)
Return the pseudopotential GAPW representation selected for an active model.
type(section_vals_type) function, pointer, public get_gauxc_section(xc_section)
Return the first GAUXC functional subsection, if present.
logical function, public native_skala_gapw_composite_reference(xc_section)
Return true if native SKALA should use the full GAPW ORB density on one common grid.
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, basis_type, reorder_rs_grid_ranks, skip_load_balance_distributed, pw_env_external, sab_orb_external, ext_kpoints)
...
types for task lists
subroutine, public deallocate_task_list(task_list)
deallocates the components and the object itself
subroutine, public allocate_task_list(task_list)
allocates and initialised the components of the task_list_type
input constants for xc
integer, parameter, public skala_gapw_paw_one_center
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.