48#include "./base/base_uses.f90"
56 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rt_propagation_forces'
73 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_c_mat_force'
74 REAL(kind=
dp),
PARAMETER ::
one = 1.0_dp,
zero = 0.0_dp
76 INTEGER :: handle, i, im, ispin, re
77 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: atom_of_kind, kind_of
79 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: c_mat, rho_ao, rho_ao_im, rho_new, &
80 s_der, sinvb, sinvh, sinvh_imag
89 CALL timeset(routinen, handle)
90 NULLIFY (rtp, particle_set, atomic_kind_set, dft_control)
95 particle_set=particle_set, &
96 atomic_kind_set=atomic_kind_set, &
98 dft_control=dft_control)
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)
104 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind, kind_of=kind_of)
110 IF (rtp%linear_scaling)
THEN
111 CALL get_rtp(rtp=rtp, rho_new=rho_new)
113 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao, rho_ao_im=rho_ao_im)
117 IF (rtp%propagate_complex_ks)
CALL get_rtp(rtp=rtp, sinvh_imag=sinvh_imag)
119 DO ispin = 1,
SIZE(sinvh)
122 IF (rtp%linear_scaling)
THEN
124 filter_eps=rtp%filter_eps)
125 IF (rtp%propagate_complex_ks)
THEN
127 filter_eps=rtp%filter_eps)
130 filter_eps=rtp%filter_eps)
131 CALL compute_forces(force, tmp, s_der, rho_new(im)%matrix, c_mat, kind_of, atom_of_kind)
134 IF (rtp%propagate_complex_ks)
THEN
138 CALL compute_forces(force, tmp, s_der, rho_ao_im(ispin)%matrix, c_mat, kind_of, atom_of_kind)
143 DO i = 1,
SIZE(force)
144 force(i)%ehrenfest(:, :) = -force(i)%ehrenfest(:, :)
149 CALL timestop(handle)
163 SUBROUTINE compute_forces(force, tmp, S_der, rho_im, C_mat, kind_of, atom_of_kind)
169 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: kind_of, atom_of_kind
171 INTEGER :: col_atom, i, ikind, kind_atom, row_atom
172 LOGICAL :: found, triangle
173 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_values, block_values2
180 CALL dbcsr_create(rho_im_full, template=c_mat(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
190 CALL dbcsr_get_block_p(s_der(i)%matrix, row_atom, col_atom, block_values2, found=found)
192 ikind = kind_of(col_atom)
193 kind_atom = atom_of_kind(col_atom)
196 force(ikind)%ehrenfest(i, kind_atom) = force(ikind)%ehrenfest(i, kind_atom) + &
197 2.0_dp*sum(block_values*block_values2)
207 IF (triangle .AND. row_atom > col_atom) cycle
208 CALL dbcsr_get_block_p(c_mat(i)%matrix, row_atom, col_atom, block_values2, found=found)
210 ikind = kind_of(col_atom)
211 kind_atom = atom_of_kind(col_atom)
214 force(ikind)%ehrenfest(i, kind_atom) = force(ikind)%ehrenfest(i, kind_atom) + &
215 2.0_dp*sum(block_values*block_values2)
222 END SUBROUTINE compute_forces
234 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_aux_im, ks_aux_re, matrix_s_aux_fit, &
235 matrix_s_aux_fit_vs_orb
241 CALL get_admm_env(admm_env, matrix_ks_aux_fit=ks_aux_re, &
242 matrix_ks_aux_fit_im=ks_aux_im, &
243 matrix_s_aux_fit=matrix_s_aux_fit, &
244 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
247 CALL rt_admm_forces_none(qs_env, admm_env, rtp, ks_aux_re, ks_aux_im, &
248 matrix_s_aux_fit, matrix_s_aux_fit_vs_orb)
266 SUBROUTINE rt_admm_forces_none(qs_env, admm_env, rtp, KS_aux_re, KS_aux_im, matrix_s_aux_fit, &
267 matrix_s_aux_fit_vs_orb)
271 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_aux_re, ks_aux_im, matrix_s_aux_fit, &
272 matrix_s_aux_fit_vs_orb
274 INTEGER :: ispin, nao, natom, naux
275 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: admm_force
277 TYPE(
cp_fm_type) :: tmp_aux_aux, tmp_aux_kap, tmp_aux_nao, &
280 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao, rho_ao_im, rho_new
281 TYPE(
dbcsr_type),
POINTER :: matrix_w_q, matrix_w_s, rho_im, rho_re
283 POINTER :: sab_aux_fit_asymm, sab_aux_fit_vs_orb
288 NULLIFY (sab_aux_fit_asymm, sab_aux_fit_vs_orb, ks_env, rho, rho_ao, rho_ao_im, rho_new)
290 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho, natom=natom, &
291 atomic_kind_set=atomic_kind_set, force=force)
292 CALL get_admm_env(admm_env, sab_aux_fit_asymm=sab_aux_fit_asymm, &
293 sab_aux_fit_vs_orb=sab_aux_fit_vs_orb)
294 IF (rtp%linear_scaling)
THEN
295 CALL get_rtp(rtp=rtp, rho_new=rho_new)
297 CALL qs_rho_get(rho_struct=rho, rho_ao=rho_ao, rho_ao_im=rho_ao_im)
300 naux = admm_env%nao_aux_fit; nao = admm_env%nao_orb
302 ALLOCATE (matrix_w_s)
303 CALL dbcsr_create(matrix_w_s, template=matrix_s_aux_fit(1)%matrix, &
304 name=
'W MATRIX AUX S', matrix_type=dbcsr_type_no_symmetry)
307 ALLOCATE (matrix_w_q)
308 CALL dbcsr_copy(matrix_w_q, matrix_s_aux_fit_vs_orb(1)%matrix, &
311 CALL cp_fm_create(tmp_nao_nao, admm_env%work_orb_orb%matrix_struct, name=
"too")
312 CALL cp_fm_create(tmp_aux_ap(1), admm_env%work_aux_orb%matrix_struct, name=
"tao")
313 CALL cp_fm_create(tmp_aux_ap(2), admm_env%work_aux_orb%matrix_struct, name=
"tao")
314 CALL cp_fm_create(tmp_aux_kap, admm_env%work_aux_orb%matrix_struct, name=
"tao")
315 CALL cp_fm_create(tmp_aux_nao, admm_env%work_aux_orb%matrix_struct, name=
"tao")
316 CALL cp_fm_create(tmp_aux_aux, admm_env%work_aux_aux%matrix_struct, name=
"taa")
318 ALLOCATE (admm_force(3, natom))
320 DO ispin = 1,
SIZE(ks_aux_re)
321 IF (rtp%linear_scaling)
THEN
322 rho_re => rho_new(2*ispin - 1)%matrix
323 rho_im => rho_new(2*ispin)%matrix
325 rho_re => rho_ao(ispin)%matrix
326 rho_im => rho_ao_im(ispin)%matrix
331 CALL parallel_gemm(
'N',
'N', naux, nao, nao, 1.0_dp, admm_env%A, tmp_nao_nao, 0.0_dp, tmp_aux_ap(1))
333 CALL parallel_gemm(
'N',
'N', naux, nao, nao, 1.0_dp, admm_env%A, tmp_nao_nao, 0.0_dp, tmp_aux_ap(2))
340 CALL parallel_gemm(
'N',
'N', naux, nao, naux, -2.0_dp, admm_env%S_inv, tmp_aux_kap, 0.0_dp, tmp_aux_nao)
343 CALL parallel_gemm(
'N',
'T', naux, naux, nao, -1.0_dp, tmp_aux_nao, admm_env%A, 0.0_dp, tmp_aux_aux)
353 basis_type_a=
"AUX_FIT", basis_type_b=
"AUX_FIT", &
354 sab_nl=sab_aux_fit_asymm, matrix_p=matrix_w_s)
356 basis_type_a=
"AUX_FIT", basis_type_b=
"ORB", &
357 sab_nl=sab_aux_fit_vs_orb, matrix_p=matrix_w_q)
359 CALL add_qs_force(admm_force, force,
"overlap_admm", atomic_kind_set)
363 DEALLOCATE (admm_force)
376 END SUBROUTINE rt_admm_forces_none
Types and set/get functions for auxiliary density matrix methods.
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.
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...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
character function, public dbcsr_get_matrix_type(matrix)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_release(matrix)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
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_dbcsr_to_fm(matrix, fm, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
represent a full matrix distributed on many processors
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
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, mimic, 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, matrix_vhxc, 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, xcint_weights, 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 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.
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.
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...
subroutine, public rt_admm_force(qs_env)
Force contribution from the dependence of the ADMM projection on the nuclear positions.
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
Provides all information about an atomic kind.
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.