(git:e7e05ae)
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 ! *****************************************************************************
16  USE cp_control_types, ONLY: dft_control_type
18  USE cp_ddapc_util, ONLY: cp_ddapc_init
19  USE input_constants, ONLY: do_ppl_analytic,&
20  do_ppl_grid,&
23  USE pw_methods, ONLY: pw_transfer
24  USE pw_types, ONLY: pw_c1d_gs_type,&
25  pw_r3d_rs_type
27  calculate_rho_core,&
29  USE qs_environment_types, ONLY: get_qs_env,&
30  qs_environment_type
31  USE qs_ks_types, ONLY: get_ks_env,&
33  qs_ks_env_type,&
36  USE qs_rho_types, ONLY: qs_rho_type
41  task_list_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 
50  PUBLIC :: qs_env_update_s_mstruct
51 !***
52 CONTAINS
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 
290 END 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....
Definition: cp_ddapc_util.F:15
subroutine, public cp_ddapc_init(qs_env)
Initialize the cp_ddapc_environment.
Definition: cp_ddapc_util.F:80
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 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)
...
Definition: qs_ks_types.F:330
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)
...
Definition: qs_ks_types.F:567
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...
Definition: qs_ks_types.F:919
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...
Definition: qs_rho_types.F:18
module that contains the definitions of the scf types
Definition: qs_scf_types.F:14
subroutine, public scf_env_did_change(scf_env)
function to be called to inform the scf_env about changes
Definition: qs_scf_types.F:198
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