(git:374b731)
Loading...
Searching...
No Matches
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,&
24 USE cp_fm_types, ONLY: cp_fm_create,&
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
39 USE qs_force_types, ONLY: add_qs_force,&
44 USE qs_rho_types, ONLY: qs_rho_get,&
46 USE rt_propagation_types, ONLY: get_rtp,&
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
58CONTAINS
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
368END 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
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
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Definition of mathematical constants and functions.
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...
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...
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)
...
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
keeps the information about the structure of a full matrix
represent a full matrix
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.