(git:0de0cc2)
rt_propagation_forces.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 Routines needed for EMD
10 !> \author Florian Schiffmann (02.09)
11 ! **************************************************************************************************
12 
14  USE admm_types, ONLY: admm_type,&
16  USE atomic_kind_types, ONLY: atomic_kind_type,&
18  USE cp_control_types, ONLY: dft_control_type,&
19  rtp_control_type
23  USE cp_fm_struct, ONLY: cp_fm_struct_type
24  USE cp_fm_types, ONLY: cp_fm_create,&
25  cp_fm_release,&
26  cp_fm_type
27  USE dbcsr_api, ONLY: &
28  dbcsr_copy, dbcsr_create, dbcsr_deallocate_matrix, dbcsr_get_block_p, &
29  dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, dbcsr_iterator_start, &
30  dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, dbcsr_p_type, dbcsr_type, &
31  dbcsr_type_no_symmetry
32  USE kinds, ONLY: dp
33  USE mathconstants, ONLY: one,&
34  zero
35  USE parallel_gemm_api, ONLY: parallel_gemm
36  USE particle_types, ONLY: particle_type
37  USE qs_environment_types, ONLY: get_qs_env,&
38  qs_environment_type
39  USE qs_force_types, ONLY: add_qs_force,&
40  qs_force_type
41  USE qs_ks_types, ONLY: qs_ks_env_type
42  USE qs_neighbor_list_types, ONLY: neighbor_list_set_p_type
44  USE qs_rho_types, ONLY: qs_rho_get,&
45  qs_rho_type
46  USE rt_propagation_types, ONLY: get_rtp,&
47  rt_prop_type
48 #include "./base/base_uses.f90"
49 
50  IMPLICIT NONE
51  PRIVATE
52 
53  PUBLIC :: calc_c_mat_force, &
55 
56  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'rt_propagation_forces'
57 
58 CONTAINS
59 
60 ! **************************************************************************************************
61 !> \brief calculates the three additional force contributions needed in EMD
62 !> P_imag*C , P_imag*B*S^-1*S_der , P*S^-1*H*S_der
63 !> \param qs_env ...
64 !> \par History
65 !> 02.2014 switched to dbcsr matrices [Samuel Andermatt]
66 !> 10.2023 merge MO-based and all-atom into one routine [Guillaume Le Breton]
67 !> \author Florian Schiffmann (02.09)
68 ! **************************************************************************************************
69 
70  SUBROUTINE calc_c_mat_force(qs_env)
71  TYPE(qs_environment_type), POINTER :: qs_env
72 
73  CHARACTER(LEN=*), PARAMETER :: routinen = 'calc_c_mat_force'
74  REAL(kind=dp), PARAMETER :: one = 1.0_dp, zero = 0.0_dp
75 
76  INTEGER :: handle, i, im, ispin, re
77  INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
78  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
79  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: c_mat, rho_ao, rho_ao_im, rho_new, &
80  s_der, sinvb, sinvh, sinvh_imag
81  TYPE(dbcsr_type), POINTER :: s_inv, tmp
82  TYPE(dft_control_type), POINTER :: dft_control
83  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
84  TYPE(qs_force_type), DIMENSION(:), POINTER :: force
85  TYPE(qs_rho_type), POINTER :: rho
86  TYPE(rt_prop_type), POINTER :: rtp
87  TYPE(rtp_control_type), POINTER :: rtp_control
88 
89  CALL timeset(routinen, handle)
90  NULLIFY (rtp, particle_set, atomic_kind_set, dft_control)
91 
92  CALL get_qs_env(qs_env, &
93  rtp=rtp, &
94  rho=rho, &
95  particle_set=particle_set, &
96  atomic_kind_set=atomic_kind_set, &
97  force=force, &
98  dft_control=dft_control)
99 
100  rtp_control => dft_control%rtp_control
101  CALL get_rtp(rtp=rtp, c_mat=c_mat, s_der=s_der, s_inv=s_inv, &
102  sinvh=sinvh, sinvb=sinvb)
103 
104  CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind, kind_of=kind_of)
105 
106  NULLIFY (tmp)
107  ALLOCATE (tmp)
108  CALL dbcsr_create(tmp, template=sinvb(1)%matrix)
109 
110  IF (rtp%linear_scaling) THEN
111  CALL get_rtp(rtp=rtp, rho_new=rho_new)
112  ELSE
113  CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao, rho_ao_im=rho_ao_im)
114  END IF
115 
116  ! If SinvH has an imaginary part (the minus sign is already in SinvH_imag)
117  IF (rtp%propagate_complex_ks) CALL get_rtp(rtp=rtp, sinvh_imag=sinvh_imag)
118 
119  DO ispin = 1, SIZE(sinvh)
120  re = 2*ispin - 1
121  im = 2*ispin
122  IF (rtp%linear_scaling) THEN
123  CALL dbcsr_multiply("N", "N", one, sinvh(ispin)%matrix, rho_new(re)%matrix, zero, tmp, &
124  filter_eps=rtp%filter_eps)
125  IF (rtp%propagate_complex_ks) &
126  CALL dbcsr_multiply("N", "N", one, sinvh_imag(ispin)%matrix, rho_new(im)%matrix, one, tmp, &
127  filter_eps=rtp%filter_eps)
128  CALL dbcsr_multiply("N", "N", one, sinvb(ispin)%matrix, rho_new(im)%matrix, one, tmp, &
129  filter_eps=rtp%filter_eps)
130  CALL compute_forces(force, tmp, s_der, rho_new(im)%matrix, c_mat, kind_of, atom_of_kind)
131  ELSE
132  CALL dbcsr_multiply("N", "N", one, sinvh(ispin)%matrix, rho_ao(ispin)%matrix, zero, tmp)
133  IF (rtp%propagate_complex_ks) &
134  CALL dbcsr_multiply("N", "N", one, sinvh_imag(ispin)%matrix, rho_ao_im(ispin)%matrix, one, tmp)
135  CALL dbcsr_multiply("N", "N", one, sinvb(ispin)%matrix, rho_ao_im(ispin)%matrix, one, tmp)
136  CALL compute_forces(force, tmp, s_der, rho_ao_im(ispin)%matrix, c_mat, kind_of, atom_of_kind)
137  END IF
138  END DO
139 
140  ! recall QS forces, at this point have the other sign.
141  DO i = 1, SIZE(force)
142  force(i)%ehrenfest(:, :) = -force(i)%ehrenfest(:, :)
143  END DO
144 
145  CALL dbcsr_deallocate_matrix(tmp)
146 
147  CALL timestop(handle)
148 
149  END SUBROUTINE
150 
151 ! **************************************************************************************************
152 !> \brief ...
153 !> \param force ...
154 !> \param tmp ...
155 !> \param S_der ...
156 !> \param rho_im ...
157 !> \param C_mat ...
158 !> \param kind_of ...
159 !> \param atom_of_kind ...
160 ! **************************************************************************************************
161  SUBROUTINE compute_forces(force, tmp, S_der, rho_im, C_mat, kind_of, atom_of_kind)
162  TYPE(qs_force_type), DIMENSION(:), POINTER :: force
163  TYPE(dbcsr_type), POINTER :: tmp
164  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: s_der
165  TYPE(dbcsr_type), POINTER :: rho_im
166  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: c_mat
167  INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of, atom_of_kind
168 
169  INTEGER :: col_atom, i, ikind, kind_atom, row_atom
170  LOGICAL :: found
171  REAL(dp), DIMENSION(:), POINTER :: block_values, block_values2
172  TYPE(dbcsr_iterator_type) :: iter
173 
174  DO i = 1, 3
175  !Calculate the sum over the hadmard product
176  !S_der part
177 
178  CALL dbcsr_iterator_start(iter, tmp)
179  DO WHILE (dbcsr_iterator_blocks_left(iter))
180  CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
181  CALL dbcsr_get_block_p(s_der(i)%matrix, row_atom, col_atom, block_values2, found=found)
182  IF (found) THEN
183  ikind = kind_of(col_atom)
184  kind_atom = atom_of_kind(col_atom)
185  !The block_values are in a vector format,
186  ! so the dot_product is the sum over all elements of the hamand product, that I need
187  force(ikind)%ehrenfest(i, kind_atom) = force(ikind)%ehrenfest(i, kind_atom) + &
188  2.0_dp*dot_product(block_values, block_values2)
189  END IF
190  END DO
191  CALL dbcsr_iterator_stop(iter)
192 
193  !C_mat part
194 
195  CALL dbcsr_iterator_start(iter, rho_im)
196  DO WHILE (dbcsr_iterator_blocks_left(iter))
197  CALL dbcsr_iterator_next_block(iter, row_atom, col_atom, block_values)
198  CALL dbcsr_get_block_p(c_mat(i)%matrix, row_atom, col_atom, block_values2, found=found)
199  IF (found) THEN
200  ikind = kind_of(col_atom)
201  kind_atom = atom_of_kind(col_atom)
202  !The block_values are in a vector format, so the dot_product is
203  ! the sum over all elements of the hamand product, that I need
204  force(ikind)%ehrenfest(i, kind_atom) = force(ikind)%ehrenfest(i, kind_atom) + &
205  2.0_dp*dot_product(block_values, block_values2)
206  END IF
207  END DO
208  CALL dbcsr_iterator_stop(iter)
209  END DO
210 
211  END SUBROUTINE compute_forces
212 
213 ! **************************************************************************************************
214 !> \brief ...
215 !> \param qs_env ...
216 ! **************************************************************************************************
217  SUBROUTINE rt_admm_force(qs_env)
218  TYPE(qs_environment_type), POINTER :: qs_env
219 
220  TYPE(admm_type), POINTER :: admm_env
221  TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos, mos_admm
222  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_aux_im, ks_aux_re, matrix_s_aux_fit, &
223  matrix_s_aux_fit_vs_orb
224  TYPE(rt_prop_type), POINTER :: rtp
225 
226  CALL get_qs_env(qs_env, &
227  admm_env=admm_env, &
228  rtp=rtp)
229  CALL get_admm_env(admm_env, matrix_ks_aux_fit=ks_aux_re, &
230  matrix_ks_aux_fit_im=ks_aux_im, &
231  matrix_s_aux_fit=matrix_s_aux_fit, &
232  matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
233 
234  CALL get_rtp(rtp=rtp, mos_new=mos, admm_mos=mos_admm)
235 
236  ! currently only none option
237  CALL rt_admm_forces_none(qs_env, admm_env, ks_aux_re, ks_aux_im, &
238  matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, mos_admm, mos)
239 
240  END SUBROUTINE rt_admm_force
241 
242 ! **************************************************************************************************
243 !> \brief ...
244 !> \param qs_env ...
245 !> \param admm_env ...
246 !> \param KS_aux_re ...
247 !> \param KS_aux_im ...
248 !> \param matrix_s_aux_fit ...
249 !> \param matrix_s_aux_fit_vs_orb ...
250 !> \param mos_admm ...
251 !> \param mos ...
252 ! **************************************************************************************************
253  SUBROUTINE rt_admm_forces_none(qs_env, admm_env, KS_aux_re, KS_aux_im, matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, mos_admm, mos)
254  TYPE(qs_environment_type), POINTER :: qs_env
255  TYPE(admm_type), POINTER :: admm_env
256  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_aux_re, ks_aux_im, matrix_s_aux_fit, &
257  matrix_s_aux_fit_vs_orb
258  TYPE(cp_fm_type), DIMENSION(:), POINTER :: mos_admm, mos
259 
260  INTEGER :: im, ispin, jspin, nao, natom, naux, nmo, &
261  re
262  REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: admm_force
263  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
264  TYPE(cp_fm_struct_type), POINTER :: mstruct
265  TYPE(cp_fm_type), DIMENSION(2) :: tmp_aux_aux, tmp_aux_mo, tmp_aux_mo1, &
266  tmp_aux_nao
267  TYPE(dbcsr_type), POINTER :: matrix_w_q, matrix_w_s
268  TYPE(neighbor_list_set_p_type), DIMENSION(:), &
269  POINTER :: sab_aux_fit_asymm, sab_aux_fit_vs_orb
270  TYPE(qs_force_type), DIMENSION(:), POINTER :: force
271  TYPE(qs_ks_env_type), POINTER :: ks_env
272 
273  NULLIFY (sab_aux_fit_asymm, sab_aux_fit_vs_orb, ks_env)
274 
275  CALL get_qs_env(qs_env, ks_env=ks_env)
276  CALL get_admm_env(admm_env, sab_aux_fit_asymm=sab_aux_fit_asymm, &
277  sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
278 
279  ALLOCATE (matrix_w_s)
280  CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
281  name='W MATRIX AUX S', matrix_type=dbcsr_type_no_symmetry)
282  CALL cp_dbcsr_alloc_block_from_nbl(matrix_w_s, sab_aux_fit_asymm)
283 
284  ALLOCATE (matrix_w_q)
285  CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
286  "W MATRIX AUX Q")
287 
288  DO jspin = 1, 2
289  CALL cp_fm_create(tmp_aux_aux(jspin), admm_env%work_aux_aux%matrix_struct, name="taa")
290  CALL cp_fm_create(tmp_aux_nao(jspin), admm_env%work_aux_orb%matrix_struct, name="tao")
291  END DO
292 
293  DO ispin = 1, SIZE(ks_aux_re)
294  re = 2*ispin - 1; im = 2*ispin
295  naux = admm_env%nao_aux_fit; nmo = admm_env%nmo(ispin); nao = admm_env%nao_orb
296 
297  mstruct => admm_env%work_aux_nmo(ispin)%matrix_struct
298  DO jspin = 1, 2
299  CALL cp_fm_create(tmp_aux_mo(jspin), mstruct, name="tam")
300  CALL cp_fm_create(tmp_aux_mo1(jspin), mstruct, name="tam")
301  END DO
302 
303 ! First calculate H=KS_aux*C~, real part ends on work_aux_aux2, imaginary part ends at work_aux_aux3
304  CALL cp_dbcsr_sm_fm_multiply(ks_aux_re(ispin)%matrix, mos_admm(re), tmp_aux_mo(re), nmo, 4.0_dp, 0.0_dp)
305  CALL cp_dbcsr_sm_fm_multiply(ks_aux_re(ispin)%matrix, mos_admm(im), tmp_aux_mo(im), nmo, 4.0_dp, 0.0_dp)
306  CALL cp_dbcsr_sm_fm_multiply(ks_aux_im(ispin)%matrix, mos_admm(im), tmp_aux_mo(re), nmo, -4.0_dp, 1.0_dp)
307  CALL cp_dbcsr_sm_fm_multiply(ks_aux_im(ispin)%matrix, mos_admm(re), tmp_aux_mo(im), nmo, 4.0_dp, 1.0_dp)
308 
309 ! Next step compute S-1*H
310  CALL parallel_gemm('N', 'N', naux, nmo, naux, 1.0_dp, admm_env%S_inv, tmp_aux_mo(re), 0.0_dp, tmp_aux_mo1(re))
311  CALL parallel_gemm('N', 'N', naux, nmo, naux, 1.0_dp, admm_env%S_inv, tmp_aux_mo(im), 0.0_dp, tmp_aux_mo1(im))
312 
313 ! Here we go on with Ws=S-1*H * C^H (take care of sign of the imaginary part!!!)
314 
315  CALL parallel_gemm("N", "T", naux, nao, nmo, -1.0_dp, tmp_aux_mo1(re), mos(re), 0.0_dp, &
316  tmp_aux_nao(re))
317  CALL parallel_gemm("N", "T", naux, nao, nmo, -1.0_dp, tmp_aux_mo1(im), mos(im), 1.0_dp, &
318  tmp_aux_nao(re))
319  CALL parallel_gemm("N", "T", naux, nao, nmo, 1.0_dp, tmp_aux_mo1(re), mos(im), 0.0_dp, &
320  tmp_aux_nao(im))
321  CALL parallel_gemm("N", "T", naux, nao, nmo, -1.0_dp, tmp_aux_mo1(im), mos(re), 1.0_dp, &
322  tmp_aux_nao(im))
323 
324 ! Let's do the final bit Wq=S-1*H * C^H * A^T
325  CALL parallel_gemm('N', 'T', naux, naux, nao, -1.0_dp, tmp_aux_nao(re), admm_env%A, 0.0_dp, tmp_aux_aux(re))
326  CALL parallel_gemm('N', 'T', naux, naux, nao, -1.0_dp, tmp_aux_nao(im), admm_env%A, 0.0_dp, tmp_aux_aux(im))
327 
328  ! *** copy to sparse matrix
329  CALL copy_fm_to_dbcsr(tmp_aux_nao(re), matrix_w_q, keep_sparsity=.true.)
330 
331  ! *** copy to sparse matrix
332  CALL copy_fm_to_dbcsr(tmp_aux_aux(re), matrix_w_s, keep_sparsity=.true.)
333 
334  DO jspin = 1, 2
335  CALL cp_fm_release(tmp_aux_mo(jspin))
336  CALL cp_fm_release(tmp_aux_mo1(jspin))
337  END DO
338 
339 ! *** This can be done in one call w_total = w_alpha + w_beta
340  ! allocate force vector
341  CALL get_qs_env(qs_env=qs_env, natom=natom)
342  ALLOCATE (admm_force(3, natom))
343  admm_force = 0.0_dp
344  CALL build_overlap_force(ks_env, admm_force, &
345  basis_type_a="AUX_FIT", basis_type_b="AUX_FIT", &
346  sab_nl=sab_aux_fit_asymm, matrix_p=matrix_w_s)
347  CALL build_overlap_force(ks_env, admm_force, &
348  basis_type_a="AUX_FIT", basis_type_b="ORB", &
349  sab_nl=sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
350  ! add forces
351  CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, &
352  force=force)
353  CALL add_qs_force(admm_force, force, "overlap_admm", atomic_kind_set)
354  DEALLOCATE (admm_force)
355 
356  ! *** Deallocated weighted density matrices
357  CALL dbcsr_deallocate_matrix(matrix_w_s)
358  CALL dbcsr_deallocate_matrix(matrix_w_q)
359  END DO
360 
361  DO jspin = 1, 2
362  CALL cp_fm_release(tmp_aux_aux(jspin))
363  CALL cp_fm_release(tmp_aux_nao(jspin))
364  END DO
365 
366  END SUBROUTINE rt_admm_forces_none
367 
368 END MODULE rt_propagation_forces
Types and set/get functions for auxiliary density matrix methods.
Definition: admm_types.F:15
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Definition: admm_types.F:593
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
represent the structure of a full matrix
Definition: cp_fm_struct.F:14
represent a full matrix distributed on many processors
Definition: cp_fm_types.F:15
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Definition: cp_fm_types.F:167
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Definition of mathematical constants and functions.
Definition: mathconstants.F:16
real(kind=dp), parameter, public one
real(kind=dp), parameter, public zero
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
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 add_qs_force(force, qs_force, forcetype, atomic_kind_set)
Add force to a force_type variable.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
Definition: qs_overlap.F:19
subroutine, public build_overlap_force(ks_env, force, basis_type_a, basis_type_b, sab_nl, matrix_p, matrixkp_p)
Calculation of the force contribution from an overlap matrix over Cartesian Gaussian functions.
Definition: qs_overlap.F:784
superstucture that hold various representations of the density and keeps track of which ones are vali...
Definition: qs_rho_types.F:18
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Definition: qs_rho_types.F:229
Routines needed for EMD.
subroutine, public rt_admm_force(qs_env)
...
subroutine, public calc_c_mat_force(qs_env)
calculates the three additional force contributions needed in EMD P_imag*C , P_imag*B*S^-1*S_der ,...
Types and set_get for real time propagation depending on runtype and diagonalization method different...
subroutine, public get_rtp(rtp, exp_H_old, exp_H_new, H_last_iter, rho_old, rho_next, rho_new, mos, mos_new, mos_old, mos_next, S_inv, S_half, S_minus_half, B_mat, C_mat, propagator_matrix, mixing, mixing_factor, S_der, dt, nsteps, SinvH, SinvH_imag, SinvB, admm_mos)
...