(git:9111030)
Loading...
Searching...
No Matches
qs_p_env_methods.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 Utility functions for the perturbation calculations.
10!> \note
11!> - routines are programmed with spins in mind
12!> but are as of now not tested with them
13!> \par History
14!> 22-08-2002, TCH, started development
15! **************************************************************************************************
19 admm_type,&
24 USE cp_dbcsr_api, ONLY: dbcsr_add,&
29 dbcsr_set,&
47 USE cp_fm_types, ONLY: cp_fm_create,&
65 USE kinds, ONLY: default_string_length,&
66 dp
70 USE pw_env_types, ONLY: pw_env_type
71 USE pw_types, ONLY: pw_c1d_gs_type,&
81 USE qs_ks_types, ONLY: qs_ks_did_change,&
86 USE qs_mo_types, ONLY: get_mo_set,&
91 USE qs_rho0_methods, ONLY: init_rho0
96 USE qs_rho_types, ONLY: qs_rho_create,&
99 USE string_utilities, ONLY: compress
101#include "./base/base_uses.f90"
102
103 IMPLICIT NONE
104
105 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_p_env_methods'
106 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .false.
107
108 PRIVATE
110 PUBLIC :: p_preortho, p_postortho
112 PUBLIC :: p_env_finish_kpp1
113
114CONTAINS
115
116! **************************************************************************************************
117!> \brief allocates and initializes the perturbation environment (no setup)
118!> \param p_env the environment to initialize
119!> \param qs_env the qs_environment for the system
120!> \param p1_option ...
121!> \param p1_admm_option ...
122!> \param orthogonal_orbitals if the orbitals are orthogonal
123!> \param linres_control ...
124!> \par History
125!> 07.2002 created [fawzi]
126!> \author Fawzi Mohamed
127! **************************************************************************************************
128 SUBROUTINE p_env_create(p_env, qs_env, p1_option, p1_admm_option, &
129 orthogonal_orbitals, linres_control)
130
131 TYPE(qs_p_env_type) :: p_env
132 TYPE(qs_environment_type), POINTER :: qs_env
133 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
134 POINTER :: p1_option, p1_admm_option
135 LOGICAL, INTENT(in), OPTIONAL :: orthogonal_orbitals
136 TYPE(linres_control_type), OPTIONAL, POINTER :: linres_control
137
138 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_create'
139
140 INTEGER :: handle, n_ao, n_mo, n_spins, natom, spin
141 TYPE(admm_gapw_r3d_rs_type), POINTER :: admm_gapw_env
142 TYPE(admm_type), POINTER :: admm_env
143 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
144 TYPE(cp_blacs_env_type), POINTER :: blacs_env
145 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools, mo_mo_fm_pools
146 TYPE(cp_fm_type), POINTER :: qs_env_c
147 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_s_aux_fit
148 TYPE(dft_control_type), POINTER :: dft_control
149 TYPE(mp_para_env_type), POINTER :: para_env
150 TYPE(pw_env_type), POINTER :: pw_env
151 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
152
153 CALL timeset(routinen, handle)
154 NULLIFY (ao_mo_fm_pools, mo_mo_fm_pools, matrix_s, dft_control, para_env, blacs_env)
155 CALL get_qs_env(qs_env, &
156 matrix_s=matrix_s, &
157 dft_control=dft_control, &
158 para_env=para_env, &
159 blacs_env=blacs_env)
160
161 n_spins = dft_control%nspins
162
163 p_env%new_preconditioner = .true.
164
165 ALLOCATE (p_env%rho1)
166 CALL qs_rho_create(p_env%rho1)
167 ALLOCATE (p_env%rho1_xc)
168 CALL qs_rho_create(p_env%rho1_xc)
169
170 ALLOCATE (p_env%kpp1_env)
171 CALL kpp1_create(p_env%kpp1_env)
172
173 IF (PRESENT(p1_option)) THEN
174 p_env%p1 => p1_option
175 ELSE
176 CALL dbcsr_allocate_matrix_set(p_env%p1, n_spins)
177 DO spin = 1, n_spins
178 ALLOCATE (p_env%p1(spin)%matrix)
179 CALL dbcsr_copy(p_env%p1(spin)%matrix, matrix_s(1)%matrix, &
180 name="p_env%p1-"//trim(adjustl(cp_to_string(spin))))
181 CALL dbcsr_set(p_env%p1(spin)%matrix, 0.0_dp)
182 END DO
183 END IF
184
185 IF (dft_control%do_admm) THEN
186 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
187 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
188 ALLOCATE (p_env%rho1_admm)
189 CALL qs_rho_create(p_env%rho1_admm)
190 END IF
191
192 IF (PRESENT(p1_admm_option)) THEN
193 p_env%p1_admm => p1_admm_option
194 ELSE
195 CALL dbcsr_allocate_matrix_set(p_env%p1_admm, n_spins)
196 DO spin = 1, n_spins
197 ALLOCATE (p_env%p1_admm(spin)%matrix)
198 CALL dbcsr_copy(p_env%p1_admm(spin)%matrix, matrix_s_aux_fit(1)%matrix, &
199 name="p_env%p1_admm-"//trim(adjustl(cp_to_string(spin))))
200 CALL dbcsr_set(p_env%p1_admm(spin)%matrix, 0.0_dp)
201 END DO
202 END IF
203 CALL get_qs_env(qs_env, admm_env=admm_env)
204 IF (admm_env%do_gapw) THEN
205 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
206 admm_gapw_env => admm_env%admm_gapw_env
207 CALL local_rho_set_create(p_env%local_rho_set_admm)
208 CALL allocate_rho_atom_internals(p_env%local_rho_set_admm%rho_atom_set, atomic_kind_set, &
209 admm_gapw_env%admm_kind_set, dft_control, para_env)
210 END IF
211 END IF
212
213 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools, &
214 mo_mo_fm_pools=mo_mo_fm_pools)
215
216 p_env%n_mo = 0
217 p_env%n_ao = 0
218 DO spin = 1, n_spins
219 CALL get_mo_set(qs_env%mos(spin), mo_coeff=qs_env_c)
220 CALL cp_fm_get_info(qs_env_c, &
221 ncol_global=n_mo, nrow_global=n_ao)
222 p_env%n_mo(spin) = n_mo
223 p_env%n_ao(spin) = n_ao
224 END DO
225
226 p_env%orthogonal_orbitals = .false.
227 IF (PRESENT(orthogonal_orbitals)) THEN
228 p_env%orthogonal_orbitals = orthogonal_orbitals
229 END IF
230
231 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, elements=p_env%S_psi0, &
232 name="p_env%S_psi0")
233
234 ! alloc m_epsilon
235 CALL fm_pools_create_fm_vect(mo_mo_fm_pools, elements=p_env%m_epsilon, &
236 name="p_env%m_epsilon")
237
238 ! alloc Smo_inv
239 IF (.NOT. p_env%orthogonal_orbitals) THEN
240 CALL fm_pools_create_fm_vect(mo_mo_fm_pools, elements=p_env%Smo_inv, &
241 name="p_env%Smo_inv")
242 END IF
243
244 IF (.NOT. p_env%orthogonal_orbitals) THEN
245 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, &
246 elements=p_env%psi0d, &
247 name="p_env%psi0d")
248 END IF
249
250 !------------------------------!
251 ! GAPW/GAPW_XC initializations !
252 !------------------------------!
253 IF (dft_control%qs_control%gapw) THEN
254 CALL get_qs_env(qs_env, &
255 atomic_kind_set=atomic_kind_set, &
256 natom=natom, &
257 pw_env=pw_env, &
258 qs_kind_set=qs_kind_set)
259
260 CALL local_rho_set_create(p_env%local_rho_set)
261 CALL allocate_rho_atom_internals(p_env%local_rho_set%rho_atom_set, atomic_kind_set, &
262 qs_kind_set, dft_control, para_env)
263
264 CALL init_rho0(p_env%local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
265 zcore=0.0_dp)
266 CALL rho0_s_grid_create(pw_env, p_env%local_rho_set%rho0_mpole)
267 CALL hartree_local_create(p_env%hartree_local)
268 CALL init_coulomb_local(p_env%hartree_local, natom)
269 ELSE IF (dft_control%qs_control%gapw_xc) THEN
270 CALL get_qs_env(qs_env, &
271 atomic_kind_set=atomic_kind_set, &
272 qs_kind_set=qs_kind_set)
273 CALL local_rho_set_create(p_env%local_rho_set)
274 CALL allocate_rho_atom_internals(p_env%local_rho_set%rho_atom_set, atomic_kind_set, &
275 qs_kind_set, dft_control, para_env)
276 END IF
277
278 !------------------------!
279 ! LINRES initializations !
280 !------------------------!
281 IF (PRESENT(linres_control)) THEN
282
283 IF (linres_control%preconditioner_type /= ot_precond_none) THEN
284 ! Initialize the preconditioner matrix
285 IF (.NOT. ASSOCIATED(p_env%preconditioner)) THEN
286
287 ALLOCATE (p_env%preconditioner(n_spins))
288 DO spin = 1, n_spins
289 CALL init_preconditioner(p_env%preconditioner(spin), &
290 para_env=para_env, blacs_env=blacs_env)
291 END DO
292
293 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, elements=p_env%PS_psi0, &
294 name="p_env%PS_psi0")
295 END IF
296 END IF
297
298 END IF
299
300 CALL timestop(handle)
301
302 END SUBROUTINE p_env_create
303
304! **************************************************************************************************
305!> \brief checks that the intenal storage is allocated, and allocs it if needed
306!> \param p_env the environment to check
307!> \param qs_env the qs environment this p_env lives in
308!> \par History
309!> 12.2002 created [fawzi]
310!> \author Fawzi Mohamed
311!> \note
312!> private routine
313! **************************************************************************************************
314 SUBROUTINE p_env_check_i_alloc(p_env, qs_env)
315 TYPE(qs_p_env_type) :: p_env
316 TYPE(qs_environment_type), POINTER :: qs_env
317
318 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_check_i_alloc'
319
320 CHARACTER(len=25) :: name
321 INTEGER :: handle, ispin, nspins
322 LOGICAL :: gapw_xc
323 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
324 TYPE(dft_control_type), POINTER :: dft_control
325
326 CALL timeset(routinen, handle)
327
328 NULLIFY (dft_control, matrix_s)
329
330 CALL get_qs_env(qs_env, dft_control=dft_control)
331 gapw_xc = dft_control%qs_control%gapw_xc
332 IF (.NOT. ASSOCIATED(p_env%kpp1)) THEN
333 CALL get_qs_env(qs_env, matrix_s=matrix_s)
334 nspins = dft_control%nspins
335
336 CALL dbcsr_allocate_matrix_set(p_env%kpp1, nspins)
337 name = "p_env%kpp1-"
338 CALL compress(name, full=.true.)
339 DO ispin = 1, nspins
340 ALLOCATE (p_env%kpp1(ispin)%matrix)
341 CALL dbcsr_copy(p_env%kpp1(ispin)%matrix, matrix_s(1)%matrix, &
342 name=trim(name)//adjustl(cp_to_string(ispin)))
343 CALL dbcsr_set(p_env%kpp1(ispin)%matrix, 0.0_dp)
344 END DO
345
346 CALL qs_rho_rebuild(p_env%rho1, qs_env=qs_env)
347 IF (gapw_xc) THEN
348 CALL qs_rho_rebuild(p_env%rho1_xc, qs_env=qs_env)
349 END IF
350
351 END IF
352
353 IF (dft_control%do_admm .AND. .NOT. ASSOCIATED(p_env%kpp1_admm)) THEN
354 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s)
355 nspins = dft_control%nspins
356
357 CALL dbcsr_allocate_matrix_set(p_env%kpp1_admm, nspins)
358 name = "p_env%kpp1_admm-"
359 CALL compress(name, full=.true.)
360 DO ispin = 1, nspins
361 ALLOCATE (p_env%kpp1_admm(ispin)%matrix)
362 CALL dbcsr_copy(p_env%kpp1_admm(ispin)%matrix, matrix_s(1)%matrix, &
363 name=trim(name)//adjustl(cp_to_string(ispin)))
364 CALL dbcsr_set(p_env%kpp1_admm(ispin)%matrix, 0.0_dp)
365 END DO
366
367 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
368 CALL qs_rho_rebuild(p_env%rho1_admm, qs_env=qs_env, admm=.true.)
369 END IF
370
371 END IF
372
373 IF (.NOT. ASSOCIATED(p_env%rho1)) THEN
374 CALL qs_rho_rebuild(p_env%rho1, qs_env=qs_env)
375 IF (gapw_xc) THEN
376 CALL qs_rho_rebuild(p_env%rho1_xc, qs_env=qs_env)
377 END IF
378
379 IF (dft_control%do_admm) THEN
380 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
381 CALL qs_rho_rebuild(p_env%rho1_admm, qs_env=qs_env, admm=.true.)
382 END IF
383 END IF
384
385 END IF
386
387 CALL timestop(handle)
388 END SUBROUTINE p_env_check_i_alloc
389
390! **************************************************************************************************
391!> \brief ...
392!> \param p_env ...
393!> \param qs_env ...
394! **************************************************************************************************
395 SUBROUTINE p_env_update_rho(p_env, qs_env)
396 TYPE(qs_p_env_type), INTENT(IN) :: p_env
397 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
398
399 CHARACTER(LEN=*), PARAMETER :: routinen = 'p_env_update_rho'
400
401 CHARACTER(LEN=default_string_length) :: basis_type
402 INTEGER :: handle, ispin
403 TYPE(admm_type), POINTER :: admm_env
404 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho1_ao
405 TYPE(dft_control_type), POINTER :: dft_control
406 TYPE(mp_para_env_type), POINTER :: para_env
407 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
408 POINTER :: sab_aux_fit
409 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g_aux
410 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r_aux
411 TYPE(qs_ks_env_type), POINTER :: ks_env
412 TYPE(task_list_type), POINTER :: task_list
413
414 CALL timeset(routinen, handle)
415
416 CALL get_qs_env(qs_env, dft_control=dft_control)
417
418 IF (dft_control%do_admm) CALL admm_aux_response_density(qs_env, p_env%p1, p_env%p1_admm)
419
420 CALL qs_rho_get(p_env%rho1, rho_ao=rho1_ao)
421 DO ispin = 1, SIZE(rho1_ao)
422 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1(ispin)%matrix)
423 END DO
424
425 CALL qs_rho_update_rho(rho_struct=p_env%rho1, &
426 rho_xc_external=p_env%rho1_xc, &
427 local_rho_set=p_env%local_rho_set, &
428 qs_env=qs_env)
429
430 IF (dft_control%do_admm) THEN
431 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
432 NULLIFY (ks_env, rho1_ao, rho_g_aux, rho_r_aux, task_list)
433
434 CALL get_qs_env(qs_env, ks_env=ks_env, admm_env=admm_env)
435 basis_type = "AUX_FIT"
436 CALL get_admm_env(qs_env%admm_env, task_list_aux_fit=task_list)
437 IF (admm_env%do_gapw) THEN
438 basis_type = "AUX_FIT_SOFT"
439 task_list => admm_env%admm_gapw_env%task_list
440 END IF
441 CALL qs_rho_get(p_env%rho1_admm, &
442 rho_ao=rho1_ao, &
443 rho_g=rho_g_aux, &
444 rho_r=rho_r_aux)
445 DO ispin = 1, SIZE(rho1_ao)
446 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
447 CALL calculate_rho_elec(ks_env=ks_env, &
448 matrix_p=rho1_ao(ispin)%matrix, &
449 rho=rho_r_aux(ispin), &
450 rho_gspace=rho_g_aux(ispin), &
451 soft_valid=.false., &
452 basis_type=basis_type, &
453 task_list_external=task_list)
454 END DO
455 IF (admm_env%do_gapw) THEN
456 CALL get_qs_env(qs_env, para_env=para_env)
457 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
458 CALL calculate_rho_atom_coeff(qs_env, rho1_ao, &
459 rho_atom_set=p_env%local_rho_set_admm%rho_atom_set, &
460 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
461 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
462 END IF
463 END IF
464 END IF
465
466 CALL timestop(handle)
467
468 END SUBROUTINE p_env_update_rho
469
470! **************************************************************************************************
471!> \brief To be called after the value of psi0 has changed.
472!> Recalculates the quantities S_psi0 and m_epsilon.
473!> \param p_env the perturbation environment to set
474!> \param qs_env ...
475!> \par History
476!> 07.2002 created [fawzi]
477!> \author Fawzi Mohamed
478! **************************************************************************************************
479 SUBROUTINE p_env_psi0_changed(p_env, qs_env)
480
481 TYPE(qs_p_env_type) :: p_env
482 TYPE(qs_environment_type), POINTER :: qs_env
483
484 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_psi0_changed'
485
486 INTEGER :: handle, iounit, lfomo, n_spins, nmo, spin
487 LOGICAL :: was_present
488 REAL(kind=dp) :: maxocc
489 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
490 TYPE(cp_fm_type), DIMENSION(:), POINTER :: psi0
491 TYPE(cp_fm_type), POINTER :: mo_coeff
492 TYPE(cp_logger_type), POINTER :: logger
493 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
494 TYPE(dft_control_type), POINTER :: dft_control
495 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
496 TYPE(mp_para_env_type), POINTER :: para_env
497 TYPE(qs_energy_type), POINTER :: energy
498 TYPE(qs_ks_env_type), POINTER :: ks_env
499 TYPE(qs_rho_type), POINTER :: rho
500 TYPE(section_vals_type), POINTER :: input, lr_section
501
502 CALL timeset(routinen, handle)
503
504 NULLIFY (ao_mo_fm_pools, mos, psi0, matrix_s, mos, para_env, ks_env, rho, &
505 logger, input, lr_section, energy, matrix_ks, dft_control, rho_ao)
506 logger => cp_get_default_logger()
507
508 CALL get_qs_env(qs_env, &
509 ks_env=ks_env, &
510 mos=mos, &
511 matrix_s=matrix_s, &
512 matrix_ks=matrix_ks, &
513 para_env=para_env, &
514 rho=rho, &
515 input=input, &
516 energy=energy, &
517 dft_control=dft_control)
518
519 CALL qs_rho_get(rho, rho_ao=rho_ao)
520
521 n_spins = dft_control%nspins
522 CALL mpools_get(qs_env%mpools, &
523 ao_mo_fm_pools=ao_mo_fm_pools)
524 ALLOCATE (psi0(n_spins))
525 DO spin = 1, n_spins
526 CALL get_mo_set(mos(spin), mo_coeff=mo_coeff)
527 CALL cp_fm_create(psi0(spin), mo_coeff%matrix_struct)
528 CALL cp_fm_to_fm(mo_coeff, psi0(spin))
529 END DO
530
531 lr_section => section_vals_get_subs_vals(input, "PROPERTIES%LINRES")
532 ! def psi0d
533 IF (p_env%orthogonal_orbitals) THEN
534 IF (ASSOCIATED(p_env%psi0d)) THEN
535 CALL cp_fm_release(p_env%psi0d)
536 END IF
537 p_env%psi0d => psi0
538 ELSE
539
540 DO spin = 1, n_spins
541 ! m_epsilon=cholesky_decomposition(psi0^T S psi0)^-1
542 ! could be optimized by combining next two calls
543 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, &
544 psi0(spin), &
545 p_env%S_psi0(spin), &
546 ncol=p_env%n_mo(spin), alpha=1.0_dp)
547 CALL parallel_gemm(transa='T', transb='N', n=p_env%n_mo(spin), &
548 m=p_env%n_mo(spin), k=p_env%n_ao(spin), alpha=1.0_dp, &
549 matrix_a=psi0(spin), &
550 matrix_b=p_env%S_psi0(spin), &
551 beta=0.0_dp, matrix_c=p_env%m_epsilon(spin))
552 CALL cp_fm_cholesky_decompose(p_env%m_epsilon(spin), &
553 n=p_env%n_mo(spin))
554
555 ! Smo_inv= (psi0^T S psi0)^-1
556 CALL cp_fm_set_all(p_env%Smo_inv(spin), 0.0_dp, 1.0_dp)
557 ! faster using cp_fm_cholesky_invert ?
559 triangular_matrix=p_env%m_epsilon(spin), &
560 matrix_b=p_env%Smo_inv(spin), side='R', &
561 invert_tr=.true., n_rows=p_env%n_mo(spin), &
562 n_cols=p_env%n_mo(spin))
564 triangular_matrix=p_env%m_epsilon(spin), &
565 matrix_b=p_env%Smo_inv(spin), side='R', &
566 transpose_tr=.true., &
567 invert_tr=.true., n_rows=p_env%n_mo(spin), &
568 n_cols=p_env%n_mo(spin))
569
570 ! psi0d=psi0 (psi0^T S psi0)^-1
571 ! faster using cp_fm_cholesky_invert ?
572 CALL cp_fm_to_fm(psi0(spin), &
573 p_env%psi0d(spin))
575 triangular_matrix=p_env%m_epsilon(spin), &
576 matrix_b=p_env%psi0d(spin), side='R', &
577 invert_tr=.true., n_rows=p_env%n_ao(spin), &
578 n_cols=p_env%n_mo(spin))
580 triangular_matrix=p_env%m_epsilon(spin), &
581 matrix_b=p_env%psi0d(spin), side='R', &
582 transpose_tr=.true., &
583 invert_tr=.true., n_rows=p_env%n_ao(spin), &
584 n_cols=p_env%n_mo(spin))
585
586 ! updates P
587 CALL get_mo_set(mos(spin), lfomo=lfomo, &
588 nmo=nmo, maxocc=maxocc)
589 IF (lfomo > nmo) THEN
590 CALL dbcsr_set(rho_ao(spin)%matrix, 0.0_dp)
591 CALL cp_dbcsr_plus_fm_fm_t(rho_ao(spin)%matrix, &
592 matrix_v=psi0(spin), &
593 matrix_g=p_env%psi0d(spin), &
594 ncol=p_env%n_mo(spin))
595 CALL dbcsr_scale(rho_ao(spin)%matrix, alpha_scalar=maxocc)
596 ELSE
597 cpabort("symmetrized onesided smearing to do")
598 END IF
599 END DO
600
601 ! updates rho
602 CALL qs_rho_update_rho(rho_struct=rho, qs_env=qs_env)
603
604 ! tells ks_env that p changed
605 CALL qs_ks_did_change(ks_env=ks_env, rho_changed=.true.)
606
607 END IF
608
609 ! updates K (if necessary)
610 CALL qs_ks_update_qs_env(qs_env)
611 iounit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
612 extension=".linresLog")
613 IF (iounit > 0) THEN
614 CALL section_vals_get(lr_section, explicit=was_present)
615 IF (was_present) THEN
616 WRITE (unit=iounit, fmt="(/,(T3,A,T55,F25.14))") &
617 "Total energy ground state: ", energy%total
618 END IF
619 END IF
620 CALL cp_print_key_finished_output(iounit, logger, lr_section, &
621 "PRINT%PROGRAM_RUN_INFO")
622 !-----------------------------------------------------------------------|
623 ! calculates |
624 ! m_epsilon = - psi0d^T times K times psi0d |
625 ! = - [K times psi0d]^T times psi0d (because K is symmetric) |
626 !-----------------------------------------------------------------------|
627 DO spin = 1, n_spins
628 ! S_psi0 = k times psi0d
629 CALL cp_dbcsr_sm_fm_multiply(matrix_ks(spin)%matrix, &
630 p_env%psi0d(spin), &
631 p_env%S_psi0(spin), p_env%n_mo(spin))
632 ! m_epsilon = -1 times S_psi0^T times psi0d
633 CALL parallel_gemm('T', 'N', &
634 p_env%n_mo(spin), p_env%n_mo(spin), p_env%n_ao(spin), &
635 -1.0_dp, p_env%S_psi0(spin), p_env%psi0d(spin), &
636 0.0_dp, p_env%m_epsilon(spin))
637 END DO
638
639 !----------------------------------|
640 ! calculates S_psi0 = S * psi0 |
641 !----------------------------------|
642 ! calculating this reduces the mat mult without storing a full aoxao
643 ! matrix (for P). If nspin>1 you might consider calculating it on the
644 ! fly to spare some memory
645 CALL get_qs_env(qs_env, matrix_s=matrix_s)
646 DO spin = 1, n_spins
647 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, &
648 psi0(spin), &
649 p_env%S_psi0(spin), &
650 p_env%n_mo(spin))
651 END DO
652
653 ! releases psi0
654 IF (p_env%orthogonal_orbitals) THEN
655 NULLIFY (psi0)
656 ELSE
657 CALL cp_fm_release(psi0)
658 END IF
659
660 ! tells kpp1_env about the change of psi0
661 CALL kpp1_did_change(p_env%kpp1_env)
662
663 CALL timestop(handle)
664
665 END SUBROUTINE p_env_psi0_changed
666
667! **************************************************************************************************
668!> \brief does a preorthogonalization of the given matrix:
669!> v = (I-PS)v
670!> \param p_env the perturbation environment
671!> \param qs_env the qs_env that is perturbed by this p_env
672!> \param v matrix to orthogonalize
673!> \param n_cols the number of columns of C to multiply (defaults to size(v,2))
674!> \par History
675!> 02.09.2002 adapted for new qs_p_env_type (TC)
676!> \author Fawzi Mohamed
677! **************************************************************************************************
678 SUBROUTINE p_preortho(p_env, qs_env, v, n_cols)
679
680 TYPE(qs_p_env_type) :: p_env
681 TYPE(qs_environment_type), POINTER :: qs_env
682 TYPE(cp_fm_type), DIMENSION(:), INTENT(inout) :: v
683 INTEGER, DIMENSION(:), INTENT(in), OPTIONAL :: n_cols
684
685 CHARACTER(len=*), PARAMETER :: routinen = 'p_preortho'
686
687 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
688 nmo2, spin, v_cols, v_rows
689 TYPE(cp_fm_pool_type), POINTER :: maxmo_maxmo_fm_pool
690 TYPE(cp_fm_struct_type), POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
691 TYPE(cp_fm_type) :: tmp_matrix
692 TYPE(dft_control_type), POINTER :: dft_control
693
694 CALL timeset(routinen, handle)
695
696 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
697 dft_control)
698
699 CALL get_qs_env(qs_env, dft_control=dft_control)
700 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
701 n_spins = dft_control%nspins
702 maxmo_maxmo_fmstruct => fm_pool_get_el_struct(maxmo_maxmo_fm_pool)
703 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
704 cpassert(SIZE(v) >= n_spins)
705 ! alloc tmp storage
706 IF (PRESENT(n_cols)) THEN
707 max_cols = maxval(n_cols(1:n_spins))
708 ELSE
709 max_cols = 0
710 DO spin = 1, n_spins
711 CALL cp_fm_get_info(v(spin), ncol_global=v_cols)
712 max_cols = max(max_cols, v_cols)
713 END DO
714 END IF
715 IF (max_cols <= nmo2) THEN
716 CALL fm_pool_create_fm(maxmo_maxmo_fm_pool, tmp_matrix)
717 ELSE
718 CALL cp_fm_struct_create(tmp_fmstruct, nrow_global=max_cols, &
719 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
720 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
721 CALL cp_fm_struct_release(tmp_fmstruct)
722 END IF
723
724 DO spin = 1, n_spins
725
726 CALL cp_fm_get_info(v(spin), &
727 nrow_global=v_rows, ncol_global=v_cols)
728 cpassert(v_rows >= p_env%n_ao(spin))
729 cols = v_cols
730 IF (PRESENT(n_cols)) THEN
731 cpassert(n_cols(spin) <= cols)
732 cols = n_cols(spin)
733 END IF
734 cpassert(cols <= max_cols)
735
736 ! tmp_matrix = v^T (S psi0)
737 CALL parallel_gemm(transa='T', transb='N', m=cols, n=p_env%n_mo(spin), &
738 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
739 matrix_b=p_env%S_psi0(spin), beta=0.0_dp, &
740 matrix_c=tmp_matrix)
741 ! v = v - psi0d tmp_matrix^T = v - psi0d psi0^T S v
742 CALL parallel_gemm(transa='N', transb='T', m=p_env%n_ao(spin), n=cols, &
743 k=p_env%n_mo(spin), alpha=-1.0_dp, &
744 matrix_a=p_env%psi0d(spin), matrix_b=tmp_matrix, &
745 beta=1.0_dp, matrix_c=v(spin))
746
747 END DO
748
749 IF (max_cols <= nmo2) THEN
750 CALL fm_pool_give_back_fm(maxmo_maxmo_fm_pool, tmp_matrix)
751 ELSE
752 CALL cp_fm_release(tmp_matrix)
753 END IF
754
755 CALL timestop(handle)
756
757 END SUBROUTINE p_preortho
758
759! **************************************************************************************************
760!> \brief does a postorthogonalization on the given matrix vector:
761!> v = (I-SP) v
762!> \param p_env the perturbation environment
763!> \param qs_env the qs_env that is perturbed by this p_env
764!> \param v matrix to orthogonalize
765!> \param n_cols the number of columns of C to multiply (defaults to size(v,2))
766!> \par History
767!> 07.2002 created [fawzi]
768!> \author Fawzi Mohamed
769! **************************************************************************************************
770 SUBROUTINE p_postortho(p_env, qs_env, v, n_cols)
771
772 TYPE(qs_p_env_type) :: p_env
773 TYPE(qs_environment_type), POINTER :: qs_env
774 TYPE(cp_fm_type), DIMENSION(:), INTENT(inout) :: v
775 INTEGER, DIMENSION(:), INTENT(in), OPTIONAL :: n_cols
776
777 CHARACTER(len=*), PARAMETER :: routinen = 'p_postortho'
778
779 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
780 nmo2, spin, v_cols, v_rows
781 TYPE(cp_fm_pool_type), POINTER :: maxmo_maxmo_fm_pool
782 TYPE(cp_fm_struct_type), POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
783 TYPE(cp_fm_type) :: tmp_matrix
784 TYPE(dft_control_type), POINTER :: dft_control
785
786 CALL timeset(routinen, handle)
787
788 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
789 dft_control)
790
791 CALL get_qs_env(qs_env, dft_control=dft_control)
792 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
793 n_spins = dft_control%nspins
794 maxmo_maxmo_fmstruct => fm_pool_get_el_struct(maxmo_maxmo_fm_pool)
795 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
796 cpassert(SIZE(v) >= n_spins)
797 ! alloc tmp storage
798 IF (PRESENT(n_cols)) THEN
799 max_cols = maxval(n_cols(1:n_spins))
800 ELSE
801 max_cols = 0
802 DO spin = 1, n_spins
803 CALL cp_fm_get_info(v(spin), ncol_global=v_cols)
804 max_cols = max(max_cols, v_cols)
805 END DO
806 END IF
807 IF (max_cols <= nmo2) THEN
808 CALL fm_pool_create_fm(maxmo_maxmo_fm_pool, tmp_matrix)
809 ELSE
810 CALL cp_fm_struct_create(tmp_fmstruct, nrow_global=max_cols, &
811 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
812 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
813 CALL cp_fm_struct_release(tmp_fmstruct)
814 END IF
815
816 DO spin = 1, n_spins
817
818 CALL cp_fm_get_info(v(spin), &
819 nrow_global=v_rows, ncol_global=v_cols)
820 cpassert(v_rows >= p_env%n_ao(spin))
821 cols = v_cols
822 IF (PRESENT(n_cols)) THEN
823 cpassert(n_cols(spin) <= cols)
824 cols = n_cols(spin)
825 END IF
826 cpassert(cols <= max_cols)
827
828 ! tmp_matrix = v^T psi0d
829 CALL parallel_gemm(transa='T', transb='N', m=cols, n=p_env%n_mo(spin), &
830 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
831 matrix_b=p_env%psi0d(spin), beta=0.0_dp, &
832 matrix_c=tmp_matrix)
833 ! v = v - (S psi0) tmp_matrix^T = v - S psi0 psi0d^T v
834 CALL parallel_gemm(transa='N', transb='T', m=p_env%n_ao(spin), n=cols, &
835 k=p_env%n_mo(spin), alpha=-1.0_dp, &
836 matrix_a=p_env%S_psi0(spin), matrix_b=tmp_matrix, &
837 beta=1.0_dp, matrix_c=v(spin))
838
839 END DO
840
841 IF (max_cols <= nmo2) THEN
842 CALL fm_pool_give_back_fm(maxmo_maxmo_fm_pool, tmp_matrix)
843 ELSE
844 CALL cp_fm_release(tmp_matrix)
845 END IF
846
847 CALL timestop(handle)
848
849 END SUBROUTINE p_postortho
850
851! **************************************************************************************************
852!> \brief ...
853!> \param qs_env ...
854!> \param p_env ...
855! **************************************************************************************************
856 SUBROUTINE p_env_finish_kpp1(qs_env, p_env)
857 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
858 TYPE(qs_p_env_type), INTENT(IN) :: p_env
859
860 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_finish_kpp1'
861
862 INTEGER :: handle, ispin, nao, nao_aux
863 TYPE(admm_type), POINTER :: admm_env
864 TYPE(dbcsr_type) :: work_hmat
865 TYPE(dft_control_type), POINTER :: dft_control
866
867 CALL timeset(routinen, handle)
868
869 CALL get_qs_env(qs_env, dft_control=dft_control, admm_env=admm_env)
870
871 IF (dft_control%do_admm) THEN
872 CALL dbcsr_copy(work_hmat, p_env%kpp1(1)%matrix)
873
874 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
875 DO ispin = 1, SIZE(p_env%kpp1)
876 CALL cp_dbcsr_sm_fm_multiply(p_env%kpp1_admm(ispin)%matrix, admm_env%A, admm_env%work_aux_orb, &
877 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
878 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
879 admm_env%work_aux_orb, 0.0_dp, admm_env%work_orb_orb)
880 CALL dbcsr_set(work_hmat, 0.0_dp)
881 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, work_hmat, keep_sparsity=.true.)
882 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, work_hmat, 1.0_dp, 1.0_dp)
883 END DO
884
885 CALL dbcsr_release(work_hmat)
886 END IF
887
888 CALL timestop(handle)
889
890 END SUBROUTINE p_env_finish_kpp1
891
892END MODULE qs_p_env_methods
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_aux_response_density(qs_env, dm, dm_admm)
Calculate ADMM auxiliary response density.
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.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
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
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_triangular_multiply(triangular_matrix, matrix_b, side, transpose_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the pool
type(cp_fm_struct_type) function, pointer, public fm_pool_get_el_struct(pool)
returns the structure of the elements in this pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
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
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public hartree_local_create(hartree_local)
...
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public do_admm_aux_exch_func_none
integer, parameter, public ot_precond_none
objects that represent the structure of input sections and the data contained in an input section
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
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
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
types of preconditioners
subroutine, public init_preconditioner(preconditioner_env, para_env, blacs_env)
...
container for various plainwaves related things
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, 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, 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.
Define the quickstep kind type and their sub types.
module that builds the second order perturbation kernel kpp1 = delta_rho|_P delta_rho|_P E drho(P1) d...
subroutine, public kpp1_create(kpp1_env)
allocates and initializes a kpp1_env
subroutine, public kpp1_did_change(kpp1_env)
function to advise of changes either in the grids
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
Type definitiona for linear response calculations.
subroutine, public local_rho_set_create(local_rho_set)
...
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pools, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Utility functions for the perturbation calculations.
subroutine, public p_postortho(p_env, qs_env, v, n_cols)
does a postorthogonalization on the given matrix vector: v = (I-SP) v
subroutine, public p_env_psi0_changed(p_env, qs_env)
To be called after the value of psi0 has changed. Recalculates the quantities S_psi0 and m_epsilon.
subroutine, public p_env_finish_kpp1(qs_env, p_env)
...
subroutine, public p_env_create(p_env, qs_env, p1_option, p1_admm_option, orthogonal_orbitals, linres_control)
allocates and initializes the perturbation environment (no setup)
subroutine, public p_env_update_rho(p_env, qs_env)
...
subroutine, public p_preortho(p_env, qs_env, v, n_cols)
does a preorthogonalization of the given matrix: v = (I-PS)v
subroutine, public p_env_check_i_alloc(p_env, qs_env)
checks that the intenal storage is allocated, and allocs it if needed
basis types for the calculation of the perturbation of density theory.
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
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 qs_rho_create(rho)
Allocates a new instance of rho.
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
types for task lists
A subtype of the admm_env that contains the extra data needed for an ADMM GAPW calculation.
Definition admm_types.F:85
stores some data used in wavefunction fitting
Definition admm_types.F:120
Provides all information about an atomic kind.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
represent a pool of elements with the same structure
keeps the information about the structure of a full matrix
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 all the informations relevant to an mpi environment
contained for different pw related things
Provides all information about a quickstep kind.
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.