(git:98357aa)
Loading...
Searching...
No Matches
qs_linres_kernel.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief linres kernel functions
10!> \par History
11!> created from qs_linres_methods
12!> \author JGH
13! **************************************************************************************************
15 USE admm_types, ONLY: admm_type,&
20 USE cp_dbcsr_api, ONLY: dbcsr_add,&
29 USE cp_fm_types, ONLY: cp_fm_get_info,&
36 USE hfx_ri, ONLY: hfx_ri_update_ks
37 USE hfx_types, ONLY: hfx_type
52 USE kinds, ONLY: default_string_length,&
53 dp
59 USE mulliken, ONLY: ao_charges
61 USE pw_env_types, ONLY: pw_env_get,&
63 USE pw_methods, ONLY: pw_axpy,&
64 pw_copy,&
65 pw_scale,&
70 USE pw_types, ONLY: pw_c1d_gs_type,&
74 USE qs_fxc, ONLY: qs_fxc_analytic,&
77 USE qs_integrate_potential, ONLY: integrate_v_rspace,&
78 integrate_v_rspace_diagonal,&
79 integrate_v_rspace_one_center
80 USE qs_kind_types, ONLY: get_qs_kind,&
84 USE qs_ks_atom, ONLY: update_ks_atom
92 USE qs_rho_types, ONLY: qs_rho_get,&
96 USE xc, ONLY: xc_calc_2nd_deriv,&
105 USE xtb_types, ONLY: get_xtb_atom_param,&
107#include "./base/base_uses.f90"
108
109 IMPLICIT NONE
110
111 PRIVATE
112
113 ! *** Public subroutines ***
114 PUBLIC :: apply_xc_admm
115 PUBLIC :: apply_hfx
116 PUBLIC :: apply_op_2
117 PUBLIC :: hfx_matrix
118
119 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_linres_kernel'
120
121! **************************************************************************************************
122
123CONTAINS
124
125! **************************************************************************************************
126!> \brief ...
127!> \param qs_env ...
128!> \param p_env ...
129!> \param c0 ...
130!> \param Av ...
131! **************************************************************************************************
132 SUBROUTINE apply_op_2(qs_env, p_env, c0, Av)
133 !
134 TYPE(qs_environment_type), POINTER :: qs_env
135 TYPE(qs_p_env_type) :: p_env
136 TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: c0
137 TYPE(cp_fm_type), DIMENSION(:), INTENT(INOUT) :: av
138
139 INTEGER :: ispin, ncol
140 TYPE(dft_control_type), POINTER :: dft_control
141
142 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
143 IF (dft_control%qs_control%semi_empirical) THEN
144 cpabort("Linear response not available with SE methods")
145 ELSE IF (dft_control%qs_control%dftb) THEN
146 cpabort("Linear response not available with DFTB")
147 ELSE IF (dft_control%qs_control%xtb) THEN
148 CALL apply_op_2_xtb(qs_env, p_env)
149 ELSE
150 CALL apply_op_2_dft(qs_env, p_env)
151 CALL apply_hfx(qs_env, p_env)
152 CALL apply_xc_admm(qs_env, p_env)
153 IF (dft_control%do_admm) CALL p_env_finish_kpp1(qs_env, p_env)
154 END IF
155
156 DO ispin = 1, SIZE(c0)
157 CALL cp_fm_get_info(c0(ispin), ncol_global=ncol)
158 CALL cp_dbcsr_sm_fm_multiply(p_env%kpp1(ispin)%matrix, &
159 c0(ispin), &
160 av(ispin), &
161 ncol=ncol, alpha=1.0_dp, beta=1.0_dp)
162 END DO
163
164 END SUBROUTINE apply_op_2
165
166! **************************************************************************************************
167!> \brief ...
168!> \param qs_env ...
169!> \param p_env ...
170! **************************************************************************************************
171 SUBROUTINE apply_op_2_dft(qs_env, p_env)
172 TYPE(qs_environment_type), POINTER :: qs_env
173 TYPE(qs_p_env_type) :: p_env
174
175 CHARACTER(len=*), PARAMETER :: routinen = 'apply_op_2_dft'
176
177 INTEGER :: handle, ikind, ispin, nkind, ns, nspins
178 LOGICAL :: deriv2_analytic, gapw, gapw_xc, &
179 lr_triplet, lrigpw
180 REAL(kind=dp) :: alpha, ekin_mol, energy_hartree, &
181 energy_hartree_1c
182 TYPE(admm_type), POINTER :: admm_env
183 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
184 TYPE(cp_logger_type), POINTER :: logger
185 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: k1mat, matrix_s, rho1_ao, rho_ao
186 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ksmat, psmat
187 TYPE(dft_control_type), POINTER :: dft_control
188 TYPE(kg_environment_type), POINTER :: kg_env
189 TYPE(linres_control_type), POINTER :: linres_control
190 TYPE(lri_density_type), POINTER :: lri_density
191 TYPE(lri_environment_type), POINTER :: lri_env
192 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
193 TYPE(mp_para_env_type), POINTER :: para_env
194 TYPE(pw_c1d_gs_type) :: rho1_tot_gspace, v_hartree_gspace
195 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_g
196 TYPE(pw_env_type), POINTER :: pw_env
197 TYPE(pw_poisson_type), POINTER :: poisson_env
198 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
199 TYPE(pw_r3d_rs_type) :: v_hartree_rspace
200 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_r, rho_r, tau1_r, v_rspace_new, &
201 v_xc, v_xc_tau
202 TYPE(pw_r3d_rs_type), POINTER :: weights
203 TYPE(qs_kpp1_env_type), POINTER :: kpp1_env
204 TYPE(qs_ks_env_type), POINTER :: ks_env
205 TYPE(qs_rho_type), POINTER :: rho, rho0, rho1, rho1_xc, rho1a, &
206 rho_aux, rho_xc
207 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
208 TYPE(section_vals_type), POINTER :: input, xc_section, xc_section_aux
209
210 CALL timeset(routinen, handle)
211
212 NULLIFY (auxbas_pw_pool, pw_env, v_rspace_new, para_env, rho1_r, &
213 v_xc, rho1_ao, rho_ao, poisson_env, input, rho, dft_control, &
214 logger, rho1_g, v_xc_tau)
215 logger => cp_get_default_logger()
216
217 energy_hartree = 0.0_dp
218 energy_hartree_1c = 0.0_dp
219
220 cpassert(ASSOCIATED(p_env%kpp1))
221 cpassert(ASSOCIATED(p_env%kpp1_env))
222 kpp1_env => p_env%kpp1_env
223
224 CALL get_qs_env(qs_env=qs_env, &
225 ks_env=ks_env, &
226 pw_env=pw_env, &
227 input=input, &
228 admm_env=admm_env, &
229 para_env=para_env, &
230 rho=rho, &
231 rho_xc=rho_xc, &
232 linres_control=linres_control, &
233 dft_control=dft_control)
234
235 gapw = dft_control%qs_control%gapw
236 gapw_xc = dft_control%qs_control%gapw_xc
237 lr_triplet = linres_control%lr_triplet
238
239 rho1 => p_env%rho1
240 rho1_xc => p_env%rho1_xc
241 cpassert(ASSOCIATED(rho1))
242 IF (gapw_xc) THEN
243 cpassert(ASSOCIATED(rho1_xc))
244 END IF
245
246 CALL qs_rho_get(rho, rho_ao=rho_ao, rho_r=rho_r)
247 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
248
249 nspins = SIZE(p_env%kpp1)
250 lrigpw = dft_control%qs_control%lrigpw
251 IF (lrigpw) THEN
252 CALL get_qs_env(qs_env, &
253 lri_env=lri_env, &
254 lri_density=lri_density, &
255 atomic_kind_set=atomic_kind_set)
256 END IF
257
258 IF (.NOT. ASSOCIATED(kpp1_env%v_ao)) THEN
259 CALL get_qs_env(qs_env, matrix_s=matrix_s)
260 CALL dbcsr_allocate_matrix_set(kpp1_env%v_ao, nspins)
261 DO ispin = 1, nspins
262 ALLOCATE (kpp1_env%v_ao(ispin)%matrix)
263 CALL dbcsr_copy(kpp1_env%v_ao(ispin)%matrix, matrix_s(1)%matrix, &
264 name="kpp1%v_ao-"//adjustl(cp_to_string(ispin)))
265 END DO
266 END IF
267
268 IF (dft_control%do_admm) THEN
269 xc_section => admm_env%xc_section_primary
270 ELSE
271 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
272 END IF
273
274 ! gets the tmp grids
275 cpassert(ASSOCIATED(pw_env))
276 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
277 poisson_env=poisson_env)
278 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
279 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
280
281 IF (gapw .OR. gapw_xc) THEN
282 CALL prepare_gapw_den(qs_env, p_env%local_rho_set, do_rho0=(.NOT. gapw_xc))
283 END IF
284
285 ! *** calculate the hartree potential on the total density ***
286 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
287
288 CALL qs_rho_get(rho1, rho_g=rho1_g)
289 CALL pw_copy(rho1_g(1), rho1_tot_gspace)
290 DO ispin = 2, nspins
291 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
292 END DO
293 IF (gapw) THEN
294 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
295 IF (ASSOCIATED(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs)) THEN
296 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho1_tot_gspace)
297 END IF
298 END IF
299
300 IF (.NOT. (nspins == 1 .AND. lr_triplet)) THEN
301 CALL pw_poisson_solve(poisson_env, rho1_tot_gspace, &
302 energy_hartree, &
303 v_hartree_gspace)
304 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
305 END IF
306
307 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
308
309 ! *** calculate the xc potential ***
310 NULLIFY (rho1a)
311 IF (gapw_xc) THEN
312 rho0 => rho_xc
313 rho1a => rho1_xc
314 ELSE
315 rho0 => rho
316 rho1a => rho1
317 END IF
318
319 deriv2_analytic = section_get_lval(xc_section, "2ND_DERIV_ANALYTICAL")
320 NULLIFY (v_xc_tau)
321 IF (deriv2_analytic) THEN
322 CALL qs_rho_get(rho1a, rho_r=rho1_r, tau_r=tau1_r)
323 CALL get_qs_env(qs_env, xcint_weights=weights)
324 CALL qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, weights, auxbas_pw_pool, &
325 lr_triplet, v_xc, v_xc_tau)
326 IF (gapw .OR. gapw_xc) THEN
327 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
328 rho1_atom_set => p_env%local_rho_set%rho_atom_set
329 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, &
330 do_triplet=lr_triplet)
331 END IF
332 ELSE
333 CALL qs_fxc_fdiff(ks_env, rho0, rho1a, xc_section, 6, lr_triplet, v_xc, v_xc_tau)
334 cpassert((.NOT. gapw) .AND. (.NOT. gapw_xc))
335 END IF
336
337 v_rspace_new => v_xc
338 NULLIFY (v_xc)
339
340 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
341 DO ispin = 1, nspins
342 CALL pw_scale(v_rspace_new(ispin), v_rspace_new(ispin)%pw_grid%dvol)
343 IF (ASSOCIATED(v_xc_tau)) CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
344 END DO
345
346 ! ADMM Correction
347 IF (dft_control%do_admm) THEN
348 IF (admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
349 IF (.NOT. ASSOCIATED(kpp1_env%deriv_set_admm)) THEN
350 cpassert(.NOT. lr_triplet)
351 CALL get_qs_env(qs_env, xcint_weights=weights)
352 xc_section_aux => admm_env%xc_section_aux
353 CALL get_admm_env(qs_env%admm_env, rho_aux_fit=rho_aux)
354 CALL qs_rho_get(rho_aux, rho_r=rho_r)
355 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
356 CALL xc_prep_2nd_deriv(kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm, &
357 rho_r, auxbas_pw_pool, weights, &
358 xc_section=xc_section_aux)
359 END IF
360 END IF
361 END IF
362
363 !-------------------------------!
364 ! Add both hartree and xc terms !
365 !-------------------------------!
366 DO ispin = 1, nspins
367 CALL dbcsr_set(kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
368
369 IF (gapw_xc) THEN
370 ! XC and Hartree are integrated separatedly
371 ! XC uses the soft basis set only
372
373 IF (nspins == 1) THEN
374
375 IF (.NOT. (lr_triplet)) THEN
376 CALL pw_scale(v_rspace_new(1), 2.0_dp)
377 IF (ASSOCIATED(v_xc_tau)) CALL pw_scale(v_xc_tau(1), 2.0_dp)
378 END IF
379 CALL qs_rho_get(rho1, rho_ao=rho1_ao)
380 ! remove kpp1_env%v_ao and work directly on k_p_p1 ?
381 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
382 pmat=rho1_ao(ispin), &
383 hmat=kpp1_env%v_ao(ispin), &
384 qs_env=qs_env, &
385 calculate_forces=.false., gapw=gapw_xc)
386
387 IF (ASSOCIATED(v_xc_tau)) THEN
388 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
389 pmat=rho1_ao(ispin), &
390 hmat=kpp1_env%v_ao(ispin), &
391 qs_env=qs_env, &
392 compute_tau=.true., &
393 calculate_forces=.false., gapw=gapw_xc)
394 END IF
395
396 ! add hartree only for SINGLETS
397 IF (.NOT. lr_triplet) THEN
398 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1), 2.0_dp, 0.0_dp)
399
400 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
401 pmat=rho_ao(ispin), &
402 hmat=kpp1_env%v_ao(ispin), &
403 qs_env=qs_env, &
404 calculate_forces=.false., gapw=gapw)
405 END IF
406 ELSE
407 ! remove kpp1_env%v_ao and work directly on k_p_p1 ?
408 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
409 pmat=rho_ao(ispin), &
410 hmat=kpp1_env%v_ao(ispin), &
411 qs_env=qs_env, &
412 calculate_forces=.false., gapw=gapw_xc)
413
414 IF (ASSOCIATED(v_xc_tau)) THEN
415 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
416 pmat=rho_ao(ispin), &
417 hmat=kpp1_env%v_ao(ispin), &
418 qs_env=qs_env, &
419 compute_tau=.true., &
420 calculate_forces=.false., gapw=gapw_xc)
421 END IF
422
423 CALL pw_copy(v_hartree_rspace, v_rspace_new(ispin))
424 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
425 pmat=rho_ao(ispin), &
426 hmat=kpp1_env%v_ao(ispin), &
427 qs_env=qs_env, &
428 calculate_forces=.false., gapw=gapw)
429 END IF
430
431 ELSE
432
433 IF (nspins == 1) THEN
434 IF (.NOT. (lr_triplet)) THEN
435 CALL pw_scale(v_rspace_new(1), 2.0_dp)
436 IF (ASSOCIATED(v_xc_tau)) CALL pw_scale(v_xc_tau(1), 2.0_dp)
437 END IF
438 ! add hartree only for SINGLETS
439 !IF (res_etype == tddfpt_singlet) THEN
440 IF (.NOT. lr_triplet) THEN
441 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1), 2.0_dp)
442 END IF
443 ELSE
444 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin), 1.0_dp)
445 END IF
446
447 IF (lrigpw) THEN
448 IF (ASSOCIATED(v_xc_tau)) THEN
449 cpabort("metaGGA-functionals not supported with LRI!")
450 END IF
451
452 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
453 CALL get_qs_env(qs_env, nkind=nkind)
454 DO ikind = 1, nkind
455 lri_v_int(ikind)%v_int = 0.0_dp
456 END DO
457 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
458 lri_v_int, .false., "LRI_AUX")
459 DO ikind = 1, nkind
460 CALL para_env%sum(lri_v_int(ikind)%v_int)
461 END DO
462 ALLOCATE (k1mat(1))
463 k1mat(1)%matrix => kpp1_env%v_ao(ispin)%matrix
464 IF (lri_env%exact_1c_terms) THEN
465 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
466 rho_ao(ispin)%matrix, qs_env, .false., "ORB")
467 END IF
468 CALL calculate_lri_ks_matrix(lri_env, lri_v_int, k1mat, atomic_kind_set)
469 DEALLOCATE (k1mat)
470 ELSE
471 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
472 pmat=rho_ao(ispin), &
473 hmat=kpp1_env%v_ao(ispin), &
474 qs_env=qs_env, &
475 calculate_forces=.false., gapw=gapw)
476
477 IF (ASSOCIATED(v_xc_tau)) THEN
478 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
479 pmat=rho_ao(ispin), &
480 hmat=kpp1_env%v_ao(ispin), &
481 qs_env=qs_env, &
482 compute_tau=.true., &
483 calculate_forces=.false., gapw=gapw)
484 END IF
485 END IF
486
487 END IF
488
489 CALL dbcsr_copy(p_env%kpp1(ispin)%matrix, kpp1_env%v_ao(ispin)%matrix)
490 END DO
491
492 IF (gapw) THEN
493 IF (.NOT. ((nspins == 1 .AND. lr_triplet))) THEN
494 CALL vh_1c_gg_integrals(qs_env, energy_hartree_1c, &
495 p_env%hartree_local%ecoul_1c, &
496 p_env%local_rho_set, &
497 para_env, tddft=.true., core_2nd=.true.)
498
499 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, &
500 calculate_forces=.false., &
501 local_rho_set=p_env%local_rho_set)
502 END IF
503 ! *** Add single atom contributions to the KS matrix ***
504 ! remap pointer
505 ns = SIZE(p_env%kpp1)
506 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
507 ns = SIZE(rho_ao)
508 psmat(1:ns, 1:1) => rho_ao(1:ns)
509 CALL update_ks_atom(qs_env, ksmat, psmat, forces=.false., tddft=.true., &
510 rho_atom_external=p_env%local_rho_set%rho_atom_set)
511 ELSE IF (gapw_xc) THEN
512 ns = SIZE(p_env%kpp1)
513 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
514 ns = SIZE(rho_ao)
515 psmat(1:ns, 1:1) => rho_ao(1:ns)
516 CALL update_ks_atom(qs_env, ksmat, psmat, forces=.false., tddft=.true., &
517 rho_atom_external=p_env%local_rho_set%rho_atom_set)
518 END IF
519
520 ! KG embedding, contribution of kinetic energy functional to kernel
521 IF (dft_control%qs_control%do_kg .AND. .NOT. (lr_triplet .OR. gapw .OR. gapw_xc)) THEN
522 IF (qs_env%kg_env%tnadd_method == kg_tnadd_embed) THEN
523
524 CALL qs_rho_get(rho1, rho_ao=rho1_ao)
525 alpha = 1.0_dp
526
527 ekin_mol = 0.0_dp
528 CALL get_qs_env(qs_env, kg_env=kg_env)
529 CALL kg_ekin_subset(qs_env=qs_env, &
530 ks_matrix=p_env%kpp1, &
531 ekin_mol=ekin_mol, &
532 calc_force=.false., &
533 do_kernel=.true., &
534 pmat_ext=rho1_ao)
535 END IF
536 END IF
537
538 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
539 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
540 DO ispin = 1, nspins
541 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
542 END DO
543 DEALLOCATE (v_rspace_new)
544 IF (ASSOCIATED(v_xc_tau)) THEN
545 DO ispin = 1, nspins
546 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
547 END DO
548 DEALLOCATE (v_xc_tau)
549 END IF
550
551 CALL timestop(handle)
552
553 END SUBROUTINE apply_op_2_dft
554
555! **************************************************************************************************
556!> \brief ...
557!> \param qs_env ...
558!> \param p_env ...
559! **************************************************************************************************
560 SUBROUTINE apply_op_2_xtb(qs_env, p_env)
561 TYPE(qs_environment_type), POINTER :: qs_env
562 TYPE(qs_p_env_type) :: p_env
563
564 CHARACTER(len=*), PARAMETER :: routinen = 'apply_op_2_xtb'
565
566 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
567 na, natom, natorb, nkind, ns, nsgf, &
568 nspins
569 INTEGER, DIMENSION(25) :: lao
570 INTEGER, DIMENSION(5) :: occ
571 LOGICAL :: lr_triplet
572 REAL(dp), ALLOCATABLE, DIMENSION(:) :: mcharge, mcharge1
573 REAL(dp), ALLOCATABLE, DIMENSION(:, :) :: aocg, aocg1, charges, charges1
574 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
575 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: pmat, rho_ao
576 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_p, matrix_p1, matrix_s
577 TYPE(dft_control_type), POINTER :: dft_control
578 TYPE(linres_control_type), POINTER :: linres_control
579 TYPE(mp_para_env_type), POINTER :: para_env
580 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
581 TYPE(pw_env_type), POINTER :: pw_env
582 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
583 TYPE(qs_kpp1_env_type), POINTER :: kpp1_env
584 TYPE(qs_rho_type), POINTER :: rho, rho1
585 TYPE(xtb_atom_type), POINTER :: xtb_kind
586
587 CALL timeset(routinen, handle)
588
589 cpassert(ASSOCIATED(p_env%kpp1_env))
590 cpassert(ASSOCIATED(p_env%kpp1))
591 kpp1_env => p_env%kpp1_env
592
593 rho1 => p_env%rho1
594 cpassert(ASSOCIATED(rho1))
595
596 CALL get_qs_env(qs_env=qs_env, &
597 pw_env=pw_env, &
598 para_env=para_env, &
599 rho=rho, &
600 linres_control=linres_control, &
601 dft_control=dft_control)
602
603 CALL qs_rho_get(rho, rho_ao=rho_ao)
604
605 lr_triplet = linres_control%lr_triplet
606 cpassert(.NOT. lr_triplet)
607
608 nspins = SIZE(p_env%kpp1)
609
610 DO ispin = 1, nspins
611 CALL dbcsr_set(p_env%kpp1(ispin)%matrix, 0.0_dp)
612 END DO
613
614 IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
615 ! Mulliken charges
616 CALL get_qs_env(qs_env, particle_set=particle_set, matrix_s_kp=matrix_s)
617 natom = SIZE(particle_set)
618 CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
619 CALL qs_rho_get(rho1, rho_ao_kp=matrix_p1)
620 ALLOCATE (mcharge(natom), charges(natom, 5))
621 ALLOCATE (mcharge1(natom), charges1(natom, 5))
622 charges = 0.0_dp
623 charges1 = 0.0_dp
624 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
625 nkind = SIZE(atomic_kind_set)
626 CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
627 ALLOCATE (aocg(nsgf, natom))
628 aocg = 0.0_dp
629 ALLOCATE (aocg1(nsgf, natom))
630 aocg1 = 0.0_dp
631 CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
632 CALL ao_charges(matrix_p1, matrix_s, aocg1, para_env)
633 IF (nspins == 2) aocg1 = 0.5_dp*aocg1
634 DO ikind = 1, nkind
635 CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
636 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
637 CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, occupation=occ)
638 DO iatom = 1, na
639 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
640 charges(atom_a, :) = real(occ(:), kind=dp)
641 DO is = 1, natorb
642 ns = lao(is) + 1
643 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
644 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
645 END DO
646 END DO
647 END DO
648 DEALLOCATE (aocg, aocg1)
649 DO iatom = 1, natom
650 mcharge(iatom) = sum(charges(iatom, :))
651 mcharge1(iatom) = sum(charges1(iatom, :))
652 END DO
653 ! Coulomb Kernel
654 pmat => matrix_p1(:, 1)
655 CALL xtb_coulomb_hessian(qs_env, p_env%kpp1, charges1, mcharge1, mcharge, pmat)
656 !
657 DEALLOCATE (charges, mcharge, charges1, mcharge1)
658 END IF
659
660 CALL timestop(handle)
661
662 END SUBROUTINE apply_op_2_xtb
663
664! **************************************************************************************************
665!> \brief Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
666!> \param qs_env ...
667!> \param p_env ...
668!> \par History
669!> * 11.2019 adapted from tddfpt_apply_hfx
670! **************************************************************************************************
671 SUBROUTINE apply_hfx(qs_env, p_env)
672 TYPE(qs_environment_type), POINTER :: qs_env
673 TYPE(qs_p_env_type) :: p_env
674
675 CHARACTER(LEN=*), PARAMETER :: routinen = 'apply_hfx'
676
677 INTEGER :: handle, ispin, nspins
678 LOGICAL :: do_hfx
679 REAL(kind=dp) :: alpha
680 TYPE(cp_logger_type), POINTER :: logger
681 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: h1_mat, matrix_s, rho1_ao, work
682 TYPE(dft_control_type), POINTER :: dft_control
683 TYPE(section_vals_type), POINTER :: hfx_section, input
684
685 CALL timeset(routinen, handle)
686
687 logger => cp_get_default_logger()
688
689 CALL get_qs_env(qs_env=qs_env, &
690 input=input, &
691 matrix_s=matrix_s, &
692 dft_control=dft_control)
693 nspins = dft_control%nspins
694
695 hfx_section => section_vals_get_subs_vals(input, "DFT%XC%HF")
696 CALL section_vals_get(hfx_section, explicit=do_hfx)
697
698 IF (do_hfx) THEN
699
700 IF (dft_control%do_admm) THEN
701 IF (dft_control%admm_control%purification_method /= do_admm_purify_none) THEN
702 cpabort("ADMM: Linear Response needs purification_method=none")
703 END IF
704 IF (dft_control%admm_control%scaling_model /= do_admm_exch_scaling_none) THEN
705 cpabort("ADMM: Linear Response needs scaling_model=none")
706 END IF
707 IF (dft_control%admm_control%method /= do_admm_basis_projection) THEN
708 cpabort("ADMM: Linear Response needs admm_method=basis_projection")
709 END IF
710 !
711 rho1_ao => p_env%p1_admm
712 h1_mat => p_env%kpp1_admm
713 ELSE
714 rho1_ao => p_env%p1
715 h1_mat => p_env%kpp1
716 END IF
717
718 NULLIFY (work)
719 CALL dbcsr_allocate_matrix_set(work, nspins)
720 DO ispin = 1, nspins
721 ALLOCATE (work(ispin)%matrix)
722 CALL dbcsr_create(work(ispin)%matrix, template=h1_mat(ispin)%matrix)
723 CALL dbcsr_copy(work(ispin)%matrix, h1_mat(ispin)%matrix)
724 CALL dbcsr_set(work(ispin)%matrix, 0.0_dp)
725 END DO
726
727 CALL hfx_matrix(work, rho1_ao, qs_env, hfx_section)
728
729 alpha = 2.0_dp
730 IF (nspins == 2) alpha = 1.0_dp
731
732 DO ispin = 1, nspins
733 CALL dbcsr_add(h1_mat(ispin)%matrix, work(ispin)%matrix, 1.0_dp, alpha)
734 END DO
735
737
738 END IF
739
740 CALL timestop(handle)
741
742 END SUBROUTINE apply_hfx
743
744! **************************************************************************************************
745!> \brief Add the hfx contributions to the Hamiltonian
746!>
747!> \param matrix_ks ...
748!> \param rho_ao ...
749!> \param qs_env ...
750!> \param hfx_sections ...
751!> \param external_x_data ...
752!> \param ex ...
753!> \note
754!> Simplified version of subroutine hfx_ks_matrix()
755! **************************************************************************************************
756 SUBROUTINE hfx_matrix(matrix_ks, rho_ao, qs_env, hfx_sections, external_x_data, ex)
757 TYPE(dbcsr_p_type), DIMENSION(:), TARGET :: matrix_ks, rho_ao
758 TYPE(qs_environment_type), POINTER :: qs_env
759 TYPE(section_vals_type), POINTER :: hfx_sections
760 TYPE(hfx_type), DIMENSION(:, :), OPTIONAL, TARGET :: external_x_data
761 REAL(kind=dp), OPTIONAL :: ex
762
763 CHARACTER(LEN=*), PARAMETER :: routinen = 'hfx_matrix'
764
765 INTEGER :: handle, irep, ispin, mspin, n_rep_hf, &
766 nspins
767 LOGICAL :: distribute_fock_matrix, &
768 hfx_treat_lsd_in_core, &
769 s_mstruct_changed
770 REAL(kind=dp) :: eh1, ehfx
771 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_ks_kp, rho_ao_kp
772 TYPE(dft_control_type), POINTER :: dft_control
773 TYPE(hfx_type), DIMENSION(:, :), POINTER :: x_data
774 TYPE(mp_para_env_type), POINTER :: para_env
775
776 CALL timeset(routinen, handle)
777
778 NULLIFY (dft_control, para_env, matrix_ks_kp, rho_ao_kp, x_data)
779
780 CALL get_qs_env(qs_env=qs_env, &
781 dft_control=dft_control, &
782 para_env=para_env, &
783 s_mstruct_changed=s_mstruct_changed, &
784 x_data=x_data)
785
786 IF (PRESENT(external_x_data)) x_data => external_x_data
787
788 cpassert(dft_control%nimages == 1)
789 nspins = dft_control%nspins
790
791 CALL section_vals_get(hfx_sections, n_repetition=n_rep_hf)
792 CALL section_vals_val_get(hfx_sections, "TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
793 i_rep_section=1)
794
795 CALL section_vals_get(hfx_sections, n_repetition=n_rep_hf)
796 distribute_fock_matrix = .true.
797
798 mspin = 1
799 IF (hfx_treat_lsd_in_core) mspin = nspins
800
801 matrix_ks_kp(1:nspins, 1:1) => matrix_ks(1:nspins)
802 rho_ao_kp(1:nspins, 1:1) => rho_ao(1:nspins)
803
804 DO irep = 1, n_rep_hf
805 ehfx = 0.0_dp
806
807 IF (x_data(irep, 1)%do_hfx_ri) THEN
808 CALL hfx_ri_update_ks(qs_env, x_data(irep, 1)%ri_data, matrix_ks_kp, ehfx, &
809 rho_ao=rho_ao_kp, geometry_did_change=s_mstruct_changed, &
810 nspins=nspins, hf_fraction=x_data(irep, 1)%general_parameter%fraction)
811
812 ELSE
813
814 DO ispin = 1, mspin
815 CALL integrate_four_center(qs_env, x_data, matrix_ks_kp, eh1, rho_ao_kp, hfx_sections, para_env, &
816 s_mstruct_changed, irep, distribute_fock_matrix, ispin=ispin)
817 ehfx = ehfx + eh1
818 END DO
819
820 END IF
821 END DO
822
823 ! Export energy
824 IF (PRESENT(ex)) ex = ehfx
825
826 CALL timestop(handle)
827
828 END SUBROUTINE hfx_matrix
829
830! **************************************************************************************************
831!> \brief ...
832!> \param qs_env ...
833!> \param p_env ...
834! **************************************************************************************************
835 SUBROUTINE apply_xc_admm(qs_env, p_env)
836 TYPE(qs_environment_type), POINTER :: qs_env
837 TYPE(qs_p_env_type) :: p_env
838
839 CHARACTER(len=*), PARAMETER :: routinen = 'apply_xc_admm'
840
841 CHARACTER(LEN=default_string_length) :: basis_type
842 INTEGER :: handle, ispin, ns, nspins
843 INTEGER, DIMENSION(2, 3) :: bo
844 LOGICAL :: gapw, lsd
845 REAL(kind=dp) :: alpha
846 TYPE(admm_type), POINTER :: admm_env
847 TYPE(dbcsr_p_type) :: xcmat
848 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
849 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ksmat, psmat
850 TYPE(dft_control_type), POINTER :: dft_control
851 TYPE(linres_control_type), POINTER :: linres_control
852 TYPE(mp_para_env_type), POINTER :: para_env
853 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
854 POINTER :: sab_aux_fit
855 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho1_aux_g
856 TYPE(pw_env_type), POINTER :: pw_env
857 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
858 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho1_aux_r, tau_pw, v_xc, v_xc_tau
859 TYPE(pw_r3d_rs_type), POINTER :: weights
860 TYPE(rho_atom_type), DIMENSION(:), POINTER :: rho1_atom_set, rho_atom_set
861 TYPE(section_vals_type), POINTER :: xc_fun_section, xc_section
862 TYPE(task_list_type), POINTER :: task_list
863 TYPE(xc_rho_cflags_type) :: needs
864 TYPE(xc_rho_set_type) :: rho1_set
865
866 CALL timeset(routinen, handle)
867
868 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
869
870 IF (dft_control%do_admm) THEN
871 IF (qs_env%admm_env%aux_exch_func == do_admm_aux_exch_func_none) THEN
872 ! nothing to do
873 ELSE
874 CALL get_qs_env(qs_env=qs_env, linres_control=linres_control)
875 cpassert(.NOT. dft_control%qs_control%lrigpw)
876 cpassert(.NOT. linres_control%lr_triplet)
877
878 nspins = dft_control%nspins
879
880 ! AUX basis contribution
881 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
882 cpassert(ASSOCIATED(pw_env))
883 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
884 NULLIFY (tau_pw)
885 ! calculate the xc potential
886 lsd = (nspins == 2)
887 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s)
888 ALLOCATE (xcmat%matrix)
889 CALL dbcsr_create(xcmat%matrix, template=matrix_s(1)%matrix)
890
891 CALL get_qs_env(qs_env, admm_env=admm_env)
892 gapw = admm_env%do_gapw
893
894 NULLIFY (weights)
895 CALL get_qs_env(qs_env=qs_env, xcint_weights=weights)
896
897 CALL qs_rho_get(p_env%rho1_admm, rho_r=rho1_aux_r, rho_g=rho1_aux_g)
898 xc_section => admm_env%xc_section_aux
899 bo = rho1_aux_r(1)%pw_grid%bounds_local
900 ! create the place where to store the argument for the functionals
901 CALL xc_rho_set_create(rho1_set, bo, &
902 rho_cutoff=section_get_rval(xc_section, "DENSITY_CUTOFF"), &
903 drho_cutoff=section_get_rval(xc_section, "GRADIENT_CUTOFF"), &
904 tau_cutoff=section_get_rval(xc_section, "TAU_CUTOFF"))
905
906 xc_fun_section => section_vals_get_subs_vals(xc_section, "XC_FUNCTIONAL")
907 needs = xc_functionals_get_needs(xc_fun_section, lsd, .true.)
908
909 ! calculate the arguments needed by the functionals
910 CALL xc_rho_set_update(rho1_set, rho1_aux_r, rho1_aux_g, tau_pw, needs, &
911 section_get_ival(xc_section, "XC_GRID%XC_DERIV"), &
912 section_get_ival(xc_section, "XC_GRID%XC_SMOOTH_RHO"), &
913 auxbas_pw_pool)
914 CALL xc_calc_2nd_deriv(v_xc, v_xc_tau, p_env%kpp1_env%deriv_set_admm, p_env%kpp1_env%rho_set_admm, &
915 rho1_aux_r, rho1_aux_g, tau_pw, auxbas_pw_pool, weights, gapw=.false., &
916 xc_section=xc_section)
917 IF (ASSOCIATED(v_xc_tau)) THEN
918 cpabort("Meta-GGA ADMM functionals not yet supported!")
919 END IF
920 CALL xc_rho_set_release(rho1_set)
921
922 basis_type = "AUX_FIT"
923 CALL get_qs_env(qs_env, para_env=para_env)
924 CALL get_admm_env(admm_env, task_list_aux_fit=task_list)
925 IF (admm_env%do_gapw) THEN
926 CALL prepare_gapw_den(qs_env, local_rho_set=p_env%local_rho_set_admm, &
927 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
928 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
929 rho1_atom_set => p_env%local_rho_set_admm%rho_atom_set
930 CALL calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, &
931 kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
932 basis_type = "AUX_FIT_SOFT"
933 task_list => admm_env%admm_gapw_env%task_list
934 END IF
935
936 alpha = 1.0_dp
937 IF (nspins == 1) alpha = 2.0_dp
938
939 DO ispin = 1, nspins
940 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
941 CALL dbcsr_copy(xcmat%matrix, matrix_s(1)%matrix)
942 CALL dbcsr_set(xcmat%matrix, 0.0_dp)
943 CALL integrate_v_rspace(v_rspace=v_xc(ispin), hmat=xcmat, qs_env=qs_env, &
944 calculate_forces=.false., basis_type=basis_type, &
945 task_list_external=task_list)
946 CALL dbcsr_add(p_env%kpp1_admm(ispin)%matrix, xcmat%matrix, 1.0_dp, alpha)
947 END DO
948
949 IF (admm_env%do_gapw) THEN
950 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
951 ns = SIZE(p_env%kpp1_admm)
952 ksmat(1:ns, 1:1) => p_env%kpp1_admm(1:ns)
953 psmat(1:ns, 1:1) => p_env%p1_admm(1:ns)
954 CALL update_ks_atom(qs_env, ksmat, psmat, forces=.false., tddft=.true., &
955 rho_atom_external=p_env%local_rho_set_admm%rho_atom_set, &
956 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
957 oce_external=admm_env%admm_gapw_env%oce, &
958 sab_external=sab_aux_fit)
959 END IF
960
961 DO ispin = 1, nspins
962 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
963 END DO
964 DEALLOCATE (v_xc)
965 CALL dbcsr_deallocate_matrix(xcmat%matrix)
966
967 END IF
968 END IF
969
970 CALL timestop(handle)
971
972 END SUBROUTINE apply_xc_admm
973
974END MODULE qs_linres_kernel
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:599
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
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
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
Routines to calculate HFX energy and potential.
subroutine, public integrate_four_center(qs_env, x_data, ks_matrix, ehfx, rho_ao, hfx_section, para_env, geometry_did_change, irep, distribute_fock_matrix, ispin, nspins)
computes four center integrals for a full basis set and updates the Kohn-Sham-Matrix and energy....
RI-methods for HFX.
Definition hfx_ri.F:12
subroutine, public hfx_ri_update_ks(qs_env, ri_data, ks_matrix, ehfx, mos, rho_ao, geometry_did_change, nspins, hf_fraction)
...
Definition hfx_ri.F:1041
Types and set/get functions for HFX.
Definition hfx_types.F:16
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_admm_purify_none
integer, parameter, public kg_tnadd_embed
integer, parameter, public do_admm_basis_projection
integer, parameter, public do_admm_aux_exch_func_none
integer, parameter, public do_admm_exch_scaling_none
objects that represent the structure of input sections and the data contained in an input section
real(kind=dp) function, public section_get_rval(section_vals, keyword_name)
...
integer function, public section_get_ival(section_vals, keyword_name)
...
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
logical function, public section_get_lval(section_vals, keyword_name)
...
Routines for a Kim-Gordon-like partitioning into molecular subunits.
subroutine, public kg_ekin_subset(qs_env, ks_matrix, ekin_mol, calc_force, do_kernel, pmat_ext)
Calculates the subsystem Hohenberg-Kohn kinetic energy and the forces.
Types needed for a Kim-Gordon-like partitioning into molecular subunits.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
routines that build the Kohn-Sham matrix for the LRIGPW and xc parts
subroutine, public calculate_lri_ks_matrix(lri_env, lri_v_int, h_matrix, atomic_kind_set, cell_to_index)
update of LRIGPW KS matrix
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Definition mulliken.F:13
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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.
https://en.wikipedia.org/wiki/Finite_difference_coefficient
Definition qs_fxc.F:27
subroutine, public qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, weights, auxbas_pw_pool, is_triplet, v_xc, v_xc_tau, spinflip)
...
Definition qs_fxc.F:96
subroutine, public qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau)
...
Definition qs_fxc.F:165
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
Integrate single or product functions over a potential on a RS grid.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
basis types for the calculation of the perturbation of density theory.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
Definition qs_ks_atom.F:12
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
Definition qs_ks_atom.F:110
linres kernel functions
subroutine, public apply_op_2(qs_env, p_env, c0, av)
...
subroutine, public apply_xc_admm(qs_env, p_env)
...
subroutine, public hfx_matrix(matrix_ks, rho_ao, qs_env, hfx_sections, external_x_data, ex)
Add the hfx contributions to the Hamiltonian.
subroutine, public apply_hfx(qs_env, p_env)
Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
Type definitiona for linear response calculations.
Define the neighbor list data types and the corresponding functionality.
Utility functions for the perturbation calculations.
subroutine, public p_env_finish_kpp1(qs_env, p_env)
...
basis types for the calculation of the perturbation of density theory.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
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 that build the integrals of the Vxc potential calculated for the atomic density in the basis...
Definition qs_vxc_atom.F:12
subroutine, public calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, do_tddfpt2, do_triplet, do_sf, kind_set_external)
...
types for task lists
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
contains the structure
contains the structure
subroutine, public xc_rho_set_create(rho_set, local_bounds, rho_cutoff, drho_cutoff, tau_cutoff)
allocates and does (minimal) initialization of a rho_set
subroutine, public xc_rho_set_release(rho_set, pw_pool)
releases the given rho_set
subroutine, public xc_rho_set_update(rho_set, rho_r, rho_g, tau, needs, xc_deriv_method_id, xc_rho_smooth_id, pw_pool, spinflip)
updates the given rho set with the density given by rho_r (and rho_g). The rho set will contain the c...
Exchange and Correlation functional calculations.
Definition xc.F:17
subroutine, public xc_prep_2nd_deriv(deriv_set, rho_set, rho_r, pw_pool, weights, xc_section, tau_r)
Prepare objects for the calculation of the 2nd derivatives of the density functional....
Definition xc.F:5539
subroutine, public xc_calc_2nd_deriv(v_xc, v_xc_tau, deriv_set, rho_set, rho1_r, rho1_g, tau1_r, pw_pool, weights, xc_section, gapw, vxg, do_excitations, do_sf, do_triplet, compute_virial, virial_xc)
Caller routine to calculate the second order potential in the direction of rho1_r.
Definition xc.F:928
Calculation of Coulomb Hessian contributions in xTB.
Definition xtb_ehess.F:12
subroutine, public xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge, matrix_p1)
...
Definition xtb_ehess.F:79
Definition of the xTB parameter types.
Definition xtb_types.F:20
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, wall, hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
Definition xtb_types.F:203
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores some data used in construction of Kohn-Sham matrix
Definition hfx_types.F:514
Contains all the info needed for KG runs...
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
environment that keeps the informations and temporary val to build the kpp1 kernel matrix
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
General settings for linear response calculations.
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...
keeps the density in various representations, keeping track of which ones are valid.
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation