(git:da6e80d)
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-2025 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! *****************************************************************************
23 USE pw_methods, ONLY: pw_transfer
24 USE pw_types, ONLY: pw_c1d_gs_type,&
31 USE qs_ks_types, ONLY: get_ks_env,&
36 USE qs_rho_types, ONLY: qs_rho_type
42#include "./base/base_uses.f90"
43
44 IMPLICIT NONE
45 PRIVATE
46
47 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
48 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_update_s_mstruct'
49
51!***
52CONTAINS
53
54! *****************************************************************************
55!> \brief updates the s_mstruct to reflect the new overlap structure,
56!> and also updates rho_core distribution.
57!> Should be called after the atoms have moved and the new overlap
58!> has been calculated.
59!> \param qs_env the environment to update
60!> \par History
61!> 07.2002 created [fawzi]
62!> \author Fawzi Mohamed
63! **************************************************************************************************
64 SUBROUTINE qs_env_update_s_mstruct(qs_env)
65 TYPE(qs_environment_type), POINTER :: qs_env
66
67 CHARACTER(len=*), PARAMETER :: routinen = 'qs_env_update_s_mstruct'
68
69 INTEGER :: handle
70 LOGICAL :: do_ppl
71 TYPE(dft_control_type), POINTER :: dft_control
72 TYPE(pw_c1d_gs_type), POINTER :: rho_core, rho_nlcc_g
73 TYPE(pw_r3d_rs_type), POINTER :: rho_nlcc, vppl
74
75 CALL timeset(routinen, handle)
76
77 cpassert(ASSOCIATED(qs_env))
78
79 NULLIFY (dft_control)
80 CALL get_qs_env(qs_env, &
81 dft_control=dft_control)
82
83 ! *** updates rho core ***
84 NULLIFY (rho_core)
85 CALL get_qs_env(qs_env, rho_core=rho_core)
86 IF (dft_control%qs_control%gapw) THEN
87 qs_env%qs_charges%total_rho_core_rspace = qs_env%local_rho_set%rhoz_tot
88 ! Initial CNEO quantum nuclear charge density is a simple Zeff sum.
89 ! Later it will be calculated from numerical integration during SCF.
90 qs_env%qs_charges%total_rho1_hard_nuc = qs_env%local_rho_set%rhoz_cneo_tot
91 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw) THEN
92 cpassert(ASSOCIATED(rho_core))
93 CALL calculate_rho_core(rho_core, &
94 qs_env%qs_charges%total_rho_core_rspace, qs_env, only_nopaw=.true.)
95 ELSE
96 IF (ASSOCIATED(rho_core)) THEN
97 CALL rho_core%release()
98 DEALLOCATE (rho_core)
99 END IF
100 END IF
101 ! force analytic ppl calculation
102 dft_control%qs_control%do_ppl_method = do_ppl_analytic
103 ELSE IF (dft_control%qs_control%semi_empirical) THEN
104 !??
105 ELSE IF (dft_control%qs_control%dftb) THEN
106 !??
107 ELSE IF (dft_control%qs_control%xtb) THEN
108 !??
109 ELSE
110 cpassert(ASSOCIATED(rho_core))
111 CALL calculate_rho_core(rho_core, &
112 qs_env%qs_charges%total_rho_core_rspace, qs_env)
113 END IF
114
115 ! calculate local pseudopotential on grid
116 do_ppl = dft_control%qs_control%do_ppl_method == do_ppl_grid
117 IF (do_ppl) THEN
118 NULLIFY (vppl)
119 CALL get_qs_env(qs_env, vppl=vppl)
120 cpassert(ASSOCIATED(vppl))
121 CALL calculate_ppl_grid(vppl, qs_env)
122 END IF
123
124 ! compute the rho_nlcc
125 NULLIFY (rho_nlcc, rho_nlcc_g)
126 CALL get_qs_env(qs_env, rho_nlcc=rho_nlcc, rho_nlcc_g=rho_nlcc_g)
127 IF (ASSOCIATED(rho_nlcc)) THEN
128 CALL calculate_rho_nlcc(rho_nlcc, qs_env)
129 CALL pw_transfer(rho_nlcc, rho_nlcc_g)
130 END IF
131
132 ! allocates and creates the task_list
133 CALL qs_create_task_list(qs_env)
134
135 ! *** environment for ddapc ***
136 IF (ASSOCIATED(qs_env%cp_ddapc_env)) THEN
137 CALL cp_ddapc_release(qs_env%cp_ddapc_env)
138 DEALLOCATE (qs_env%cp_ddapc_env)
139 END IF
140 CALL cp_ddapc_init(qs_env)
141
142 ! *** tell ks_env ***
143 CALL qs_ks_did_change(qs_env%ks_env, s_mstruct_changed=.true.)
144
145 ! *** Updates rho structure ***
146 CALL qs_env_rebuild_rho(qs_env=qs_env)
147
148 ! *** tell scf_env ***
149 IF (ASSOCIATED(qs_env%scf_env)) THEN
150 CALL scf_env_did_change(qs_env%scf_env)
151 END IF
152
153 CALL timestop(handle)
154
155 END SUBROUTINE qs_env_update_s_mstruct
156
157! *****************************************************************************
158!> \brief ...
159!> \param qs_env ...
160! **************************************************************************************************
161 SUBROUTINE qs_create_task_list(qs_env)
162 TYPE(qs_environment_type), POINTER :: qs_env
163
164 CHARACTER(len=*), PARAMETER :: routinen = 'qs_create_task_list'
165
166 INTEGER :: handle, isub
167 LOGICAL :: skip_load_balance_distributed, soft_valid
168 TYPE(dft_control_type), POINTER :: dft_control
169 TYPE(qs_ks_env_type), POINTER :: ks_env
170 TYPE(task_list_type), POINTER :: task_list
171
172 CALL timeset(routinen, handle)
173 NULLIFY (ks_env, dft_control)
174 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
175
176 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
177 IF (.NOT. (dft_control%qs_control%semi_empirical &
178 .OR. dft_control%qs_control%xtb &
179 .OR. dft_control%qs_control%dftb)) THEN
180 ! generate task lists (non-soft)
181 IF (.NOT. dft_control%qs_control%gapw) THEN
182 CALL get_ks_env(ks_env, task_list=task_list)
183 IF (.NOT. ASSOCIATED(task_list)) THEN
184 CALL allocate_task_list(task_list)
185 CALL set_ks_env(ks_env, task_list=task_list)
186 END IF
187 CALL generate_qs_task_list(ks_env, task_list, &
188 reorder_rs_grid_ranks=.true., soft_valid=.false., &
189 skip_load_balance_distributed=skip_load_balance_distributed)
190 END IF
191 ! generate the soft task list
192 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
193 CALL get_ks_env(ks_env, task_list_soft=task_list)
194 IF (.NOT. ASSOCIATED(task_list)) THEN
195 CALL allocate_task_list(task_list)
196 CALL set_ks_env(ks_env, task_list_soft=task_list)
197 END IF
198 CALL generate_qs_task_list(ks_env, task_list, &
199 reorder_rs_grid_ranks=.true., soft_valid=.true., &
200 skip_load_balance_distributed=skip_load_balance_distributed)
201 END IF
202 END IF
203
204 IF (dft_control%qs_control%do_kg) THEN
205 soft_valid = (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
206
207 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed .OR. &
208 qs_env%kg_env%tnadd_method == kg_tnadd_embed_ri) THEN
209
210 IF (ASSOCIATED(qs_env%kg_env%subset)) THEN
211 DO isub = 1, qs_env%kg_env%nsubsets
212 IF (ASSOCIATED(qs_env%kg_env%subset(isub)%task_list)) &
213 CALL deallocate_task_list(qs_env%kg_env%subset(isub)%task_list)
214 END DO
215 ELSE
216 ALLOCATE (qs_env%kg_env%subset(qs_env%kg_env%nsubsets))
217 END IF
218
219 DO isub = 1, qs_env%kg_env%nsubsets
220 CALL allocate_task_list(qs_env%kg_env%subset(isub)%task_list)
221 ! generate the subset task list from the neighborlist
222 CALL generate_qs_task_list(ks_env, qs_env%kg_env%subset(isub)%task_list, &
223 reorder_rs_grid_ranks=.false., soft_valid=soft_valid, &
224 skip_load_balance_distributed=skip_load_balance_distributed, &
225 sab_orb_external=qs_env%kg_env%subset(isub)%sab_orb)
226 END DO
227
228 END IF
229
230 END IF
231
232 CALL timestop(handle)
233
234 END SUBROUTINE qs_create_task_list
235
236! *****************************************************************************
237!> \brief rebuilds the rho structure, making sure that everything is allocated
238!> and has the right size
239!> \param qs_env the environment in which rho should be rebuilt
240!> \param rebuild_ao if it is necessary to rebuild rho_ao. Defaults to true.
241!> \param rebuild_grids if it in necessary to rebuild rho_r and rho_g.
242!> Defaults to false.
243!> \par History
244!> 10.2002 created [fawzi]
245!> \author Fawzi Mohamed
246!> \note
247!> needs updated pw pools, s_mstruct and h.
248!> The use of p to keep the structure of h (needed for the forces)
249!> is ugly and should be removed.
250!> If necessary rho is created from scratch.
251! **************************************************************************************************
252 SUBROUTINE qs_env_rebuild_rho(qs_env, rebuild_ao, rebuild_grids)
253 TYPE(qs_environment_type), POINTER :: qs_env
254 LOGICAL, INTENT(in), OPTIONAL :: rebuild_ao, rebuild_grids
255
256 CHARACTER(len=*), PARAMETER :: routinen = 'qs_env_rebuild_rho'
257
258 INTEGER :: handle
259 LOGICAL :: do_admm, gapw_xc
260 TYPE(dft_control_type), POINTER :: dft_control
261 TYPE(qs_rho_type), POINTER :: rho, rho_external, rho_xc
262
263 NULLIFY (rho)
264 CALL timeset(routinen, handle)
265
266 CALL get_qs_env(qs_env, &
267 dft_control=dft_control, &
268 rho=rho, &
269 rho_xc=rho_xc, &
270 rho_external=rho_external)
271
272 gapw_xc = dft_control%qs_control%gapw_xc
273 do_admm = dft_control%do_admm
274 CALL qs_rho_rebuild(rho, qs_env=qs_env, &
275 rebuild_ao=rebuild_ao, rebuild_grids=rebuild_grids)
276
277 IF (gapw_xc) THEN
278 CALL qs_rho_rebuild(rho_xc, qs_env=qs_env, &
279 rebuild_ao=rebuild_ao, rebuild_grids=rebuild_grids)
280 END IF
281
282! ZMP rebuilding external density
283 IF (dft_control%apply_external_density) THEN
284 CALL qs_rho_rebuild(rho_external, qs_env=qs_env, &
285 rebuild_grids=rebuild_grids)
286 dft_control%read_external_density = .true.
287 END IF
288
289 CALL timestop(handle)
290
291 END SUBROUTINE qs_env_rebuild_rho
292
293END 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
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, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, 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_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, 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 get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, 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_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, 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)
...
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...
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....
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, reorder_rs_grid_ranks, skip_load_balance_distributed, soft_valid, basis_type, pw_env_external, sab_orb_external)
...
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
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.