(git:374b731)
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-2024 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 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw) THEN
89 cpassert(ASSOCIATED(rho_core))
90 CALL calculate_rho_core(rho_core, &
91 qs_env%qs_charges%total_rho_core_rspace, qs_env, only_nopaw=.true.)
92 ELSE
93 IF (ASSOCIATED(rho_core)) THEN
94 CALL rho_core%release()
95 DEALLOCATE (rho_core)
96 END IF
97 END IF
98 ! force analytic ppl calculation
99 dft_control%qs_control%do_ppl_method = do_ppl_analytic
100 ELSE IF (dft_control%qs_control%semi_empirical) THEN
101 !??
102 ELSE IF (dft_control%qs_control%dftb) THEN
103 !??
104 ELSE IF (dft_control%qs_control%xtb) THEN
105 !??
106 ELSE
107 cpassert(ASSOCIATED(rho_core))
108 CALL calculate_rho_core(rho_core, &
109 qs_env%qs_charges%total_rho_core_rspace, qs_env)
110 END IF
111
112 ! calculate local pseudopotential on grid
113 do_ppl = dft_control%qs_control%do_ppl_method == do_ppl_grid
114 IF (do_ppl) THEN
115 NULLIFY (vppl)
116 CALL get_qs_env(qs_env, vppl=vppl)
117 cpassert(ASSOCIATED(vppl))
118 CALL calculate_ppl_grid(vppl, qs_env)
119 END IF
120
121 ! compute the rho_nlcc
122 NULLIFY (rho_nlcc, rho_nlcc_g)
123 CALL get_qs_env(qs_env, rho_nlcc=rho_nlcc, rho_nlcc_g=rho_nlcc_g)
124 IF (ASSOCIATED(rho_nlcc)) THEN
125 CALL calculate_rho_nlcc(rho_nlcc, qs_env)
126 CALL pw_transfer(rho_nlcc, rho_nlcc_g)
127 END IF
128
129 ! allocates and creates the task_list
130 CALL qs_create_task_list(qs_env)
131
132 ! *** environment for ddapc ***
133 IF (ASSOCIATED(qs_env%cp_ddapc_env)) THEN
134 CALL cp_ddapc_release(qs_env%cp_ddapc_env)
135 DEALLOCATE (qs_env%cp_ddapc_env)
136 END IF
137 CALL cp_ddapc_init(qs_env)
138
139 ! *** tell ks_env ***
140 CALL qs_ks_did_change(qs_env%ks_env, s_mstruct_changed=.true.)
141
142 ! *** Updates rho structure ***
143 CALL qs_env_rebuild_rho(qs_env=qs_env)
144
145 ! *** tell scf_env ***
146 IF (ASSOCIATED(qs_env%scf_env)) THEN
147 CALL scf_env_did_change(qs_env%scf_env)
148 END IF
149
150 CALL timestop(handle)
151
152 END SUBROUTINE qs_env_update_s_mstruct
153
154! *****************************************************************************
155!> \brief ...
156!> \param qs_env ...
157! **************************************************************************************************
158 SUBROUTINE qs_create_task_list(qs_env)
159 TYPE(qs_environment_type), POINTER :: qs_env
160
161 CHARACTER(len=*), PARAMETER :: routinen = 'qs_create_task_list'
162
163 INTEGER :: handle, isub
164 LOGICAL :: skip_load_balance_distributed, soft_valid
165 TYPE(dft_control_type), POINTER :: dft_control
166 TYPE(qs_ks_env_type), POINTER :: ks_env
167 TYPE(task_list_type), POINTER :: task_list
168
169 CALL timeset(routinen, handle)
170 NULLIFY (ks_env, dft_control)
171 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
172
173 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
174 IF (.NOT. (dft_control%qs_control%semi_empirical &
175 .OR. dft_control%qs_control%xtb &
176 .OR. dft_control%qs_control%dftb)) THEN
177 ! generate task lists (non-soft)
178 IF (.NOT. dft_control%qs_control%gapw) THEN
179 CALL get_ks_env(ks_env, task_list=task_list)
180 IF (.NOT. ASSOCIATED(task_list)) THEN
181 CALL allocate_task_list(task_list)
182 CALL set_ks_env(ks_env, task_list=task_list)
183 END IF
184 CALL generate_qs_task_list(ks_env, task_list, &
185 reorder_rs_grid_ranks=.true., soft_valid=.false., &
186 skip_load_balance_distributed=skip_load_balance_distributed)
187 END IF
188 ! generate the soft task list
189 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
190 CALL get_ks_env(ks_env, task_list_soft=task_list)
191 IF (.NOT. ASSOCIATED(task_list)) THEN
192 CALL allocate_task_list(task_list)
193 CALL set_ks_env(ks_env, task_list_soft=task_list)
194 END IF
195 CALL generate_qs_task_list(ks_env, task_list, &
196 reorder_rs_grid_ranks=.true., soft_valid=.true., &
197 skip_load_balance_distributed=skip_load_balance_distributed)
198 END IF
199 END IF
200
201 IF (dft_control%qs_control%do_kg) THEN
202 soft_valid = (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
203
204 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed .OR. &
205 qs_env%kg_env%tnadd_method == kg_tnadd_embed_ri) THEN
206
207 IF (ASSOCIATED(qs_env%kg_env%subset)) THEN
208 DO isub = 1, qs_env%kg_env%nsubsets
209 IF (ASSOCIATED(qs_env%kg_env%subset(isub)%task_list)) &
210 CALL deallocate_task_list(qs_env%kg_env%subset(isub)%task_list)
211 END DO
212 ELSE
213 ALLOCATE (qs_env%kg_env%subset(qs_env%kg_env%nsubsets))
214 END IF
215
216 DO isub = 1, qs_env%kg_env%nsubsets
217 CALL allocate_task_list(qs_env%kg_env%subset(isub)%task_list)
218 ! generate the subset task list from the neighborlist
219 CALL generate_qs_task_list(ks_env, qs_env%kg_env%subset(isub)%task_list, &
220 reorder_rs_grid_ranks=.false., soft_valid=soft_valid, &
221 skip_load_balance_distributed=skip_load_balance_distributed, &
222 sab_orb_external=qs_env%kg_env%subset(isub)%sab_orb)
223 END DO
224
225 END IF
226
227 END IF
228
229 CALL timestop(handle)
230
231 END SUBROUTINE qs_create_task_list
232
233! *****************************************************************************
234!> \brief rebuilds the rho structure, making sure that everything is allocated
235!> and has the right size
236!> \param qs_env the environment in which rho should be rebuilt
237!> \param rebuild_ao if it is necessary to rebuild rho_ao. Defaults to true.
238!> \param rebuild_grids if it in necessary to rebuild rho_r and rho_g.
239!> Defaults to false.
240!> \par History
241!> 10.2002 created [fawzi]
242!> \author Fawzi Mohamed
243!> \note
244!> needs updated pw pools, s_mstruct and h.
245!> The use of p to keep the structure of h (needed for the forces)
246!> is ugly and should be removed.
247!> If necessary rho is created from scratch.
248! **************************************************************************************************
249 SUBROUTINE qs_env_rebuild_rho(qs_env, rebuild_ao, rebuild_grids)
250 TYPE(qs_environment_type), POINTER :: qs_env
251 LOGICAL, INTENT(in), OPTIONAL :: rebuild_ao, rebuild_grids
252
253 CHARACTER(len=*), PARAMETER :: routinen = 'qs_env_rebuild_rho'
254
255 INTEGER :: handle
256 LOGICAL :: do_admm, gapw_xc
257 TYPE(dft_control_type), POINTER :: dft_control
258 TYPE(qs_rho_type), POINTER :: rho, rho_external, rho_xc
259
260 NULLIFY (rho)
261 CALL timeset(routinen, handle)
262
263 CALL get_qs_env(qs_env, &
264 dft_control=dft_control, &
265 rho=rho, &
266 rho_xc=rho_xc, &
267 rho_external=rho_external)
268
269 gapw_xc = dft_control%qs_control%gapw_xc
270 do_admm = dft_control%do_admm
271 CALL qs_rho_rebuild(rho, qs_env=qs_env, &
272 rebuild_ao=rebuild_ao, rebuild_grids=rebuild_grids)
273
274 IF (gapw_xc) THEN
275 CALL qs_rho_rebuild(rho_xc, qs_env=qs_env, &
276 rebuild_ao=rebuild_ao, rebuild_grids=rebuild_grids)
277 END IF
278
279! ZMP rebuilding external density
280 IF (dft_control%apply_external_density) THEN
281 CALL qs_rho_rebuild(rho_external, qs_env=qs_env, &
282 rebuild_grids=rebuild_grids)
283 dft_control%read_external_density = .true.
284 END IF
285
286 CALL timestop(handle)
287
288 END SUBROUTINE qs_env_rebuild_rho
289
290END 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_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.
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_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, 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_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, 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.