(git:ba1d7ca)
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,&
80 USE qs_ks_types, ONLY: qs_ks_did_change,&
85 USE qs_mo_types, ONLY: get_mo_set,&
90 USE qs_rho0_methods, ONLY: init_rho0
95 USE qs_rho_types, ONLY: qs_rho_create,&
98 USE string_utilities, ONLY: compress
100#include "./base/base_uses.f90"
101
102 IMPLICIT NONE
103
104 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_p_env_methods'
105 LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .false.
106
107 PRIVATE
109 PUBLIC :: p_preortho, p_postortho
111 PUBLIC :: p_env_finish_kpp1
112
113CONTAINS
114
115! **************************************************************************************************
116!> \brief allocates and initializes the perturbation environment (no setup)
117!> \param p_env the environment to initialize
118!> \param qs_env the qs_environment for the system
119!> \param p1_option ...
120!> \param p1_admm_option ...
121!> \param orthogonal_orbitals if the orbitals are orthogonal
122!> \param linres_control ...
123!> \par History
124!> 07.2002 created [fawzi]
125!> \author Fawzi Mohamed
126! **************************************************************************************************
127 SUBROUTINE p_env_create(p_env, qs_env, p1_option, p1_admm_option, &
128 orthogonal_orbitals, linres_control)
129
130 TYPE(qs_p_env_type) :: p_env
131 TYPE(qs_environment_type), POINTER :: qs_env
132 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
133 POINTER :: p1_option, p1_admm_option
134 LOGICAL, INTENT(in), OPTIONAL :: orthogonal_orbitals
135 TYPE(linres_control_type), OPTIONAL, POINTER :: linres_control
136
137 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_create'
138
139 INTEGER :: handle, n_ao, n_mo, n_spins, natom, spin
140 TYPE(admm_gapw_r3d_rs_type), POINTER :: admm_gapw_env
141 TYPE(admm_type), POINTER :: admm_env
142 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
143 TYPE(cp_blacs_env_type), POINTER :: blacs_env
144 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools, mo_mo_fm_pools
145 TYPE(cp_fm_type), POINTER :: qs_env_c
146 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_s_aux_fit
147 TYPE(dft_control_type), POINTER :: dft_control
148 TYPE(mp_para_env_type), POINTER :: para_env
149 TYPE(pw_env_type), POINTER :: pw_env
150 TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
151
152 CALL timeset(routinen, handle)
153 NULLIFY (ao_mo_fm_pools, mo_mo_fm_pools, matrix_s, dft_control, para_env, blacs_env)
154 CALL get_qs_env(qs_env, &
155 matrix_s=matrix_s, &
156 dft_control=dft_control, &
157 para_env=para_env, &
158 blacs_env=blacs_env)
159
160 n_spins = dft_control%nspins
161
162 p_env%new_preconditioner = .true.
163
164 ALLOCATE (p_env%rho1)
165 CALL qs_rho_create(p_env%rho1)
166 ALLOCATE (p_env%rho1_xc)
167 CALL qs_rho_create(p_env%rho1_xc)
168
169 ALLOCATE (p_env%kpp1_env)
170 CALL kpp1_create(p_env%kpp1_env)
171
172 IF (PRESENT(p1_option)) THEN
173 p_env%p1 => p1_option
174 ELSE
175 CALL dbcsr_allocate_matrix_set(p_env%p1, n_spins)
176 DO spin = 1, n_spins
177 ALLOCATE (p_env%p1(spin)%matrix)
178 CALL dbcsr_copy(p_env%p1(spin)%matrix, matrix_s(1)%matrix, &
179 name="p_env%p1-"//trim(adjustl(cp_to_string(spin))))
180 CALL dbcsr_set(p_env%p1(spin)%matrix, 0.0_dp)
181 END DO
182 END IF
183
184 IF (dft_control%do_admm) THEN
185 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
186 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
187 ALLOCATE (p_env%rho1_admm)
188 CALL qs_rho_create(p_env%rho1_admm)
189 END IF
190
191 IF (PRESENT(p1_admm_option)) THEN
192 p_env%p1_admm => p1_admm_option
193 ELSE
194 CALL dbcsr_allocate_matrix_set(p_env%p1_admm, n_spins)
195 DO spin = 1, n_spins
196 ALLOCATE (p_env%p1_admm(spin)%matrix)
197 CALL dbcsr_copy(p_env%p1_admm(spin)%matrix, matrix_s_aux_fit(1)%matrix, &
198 name="p_env%p1_admm-"//trim(adjustl(cp_to_string(spin))))
199 CALL dbcsr_set(p_env%p1_admm(spin)%matrix, 0.0_dp)
200 END DO
201 END IF
202 CALL get_qs_env(qs_env, admm_env=admm_env)
203 IF (admm_env%do_gapw) THEN
204 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
205 admm_gapw_env => admm_env%admm_gapw_env
206 CALL local_rho_set_create(p_env%local_rho_set_admm)
207 CALL allocate_rho_atom_internals(p_env%local_rho_set_admm%rho_atom_set, atomic_kind_set, &
208 admm_gapw_env%admm_kind_set, dft_control, para_env)
209 END IF
210 END IF
211
212 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools, &
213 mo_mo_fm_pools=mo_mo_fm_pools)
214
215 p_env%n_mo = 0
216 p_env%n_ao = 0
217 DO spin = 1, n_spins
218 CALL get_mo_set(qs_env%mos(spin), mo_coeff=qs_env_c)
219 CALL cp_fm_get_info(qs_env_c, &
220 ncol_global=n_mo, nrow_global=n_ao)
221 p_env%n_mo(spin) = n_mo
222 p_env%n_ao(spin) = n_ao
223 END DO
224
225 p_env%orthogonal_orbitals = .false.
226 IF (PRESENT(orthogonal_orbitals)) THEN
227 p_env%orthogonal_orbitals = orthogonal_orbitals
228 END IF
229
230 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, elements=p_env%S_psi0, &
231 name="p_env%S_psi0")
232
233 ! alloc m_epsilon
234 CALL fm_pools_create_fm_vect(mo_mo_fm_pools, elements=p_env%m_epsilon, &
235 name="p_env%m_epsilon")
236
237 ! alloc Smo_inv
238 IF (.NOT. p_env%orthogonal_orbitals) THEN
239 CALL fm_pools_create_fm_vect(mo_mo_fm_pools, elements=p_env%Smo_inv, &
240 name="p_env%Smo_inv")
241 END IF
242
243 IF (.NOT. p_env%orthogonal_orbitals) THEN
244 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, &
245 elements=p_env%psi0d, &
246 name="p_env%psi0d")
247 END IF
248
249 !------------------------------!
250 ! GAPW/GAPW_XC initializations !
251 !------------------------------!
252 IF (dft_control%qs_control%gapw) THEN
253 CALL get_qs_env(qs_env, &
254 atomic_kind_set=atomic_kind_set, &
255 natom=natom, &
256 pw_env=pw_env, &
257 qs_kind_set=qs_kind_set)
258
259 CALL local_rho_set_create(p_env%local_rho_set)
260 CALL allocate_rho_atom_internals(p_env%local_rho_set%rho_atom_set, atomic_kind_set, &
261 qs_kind_set, dft_control, para_env)
262
263 CALL init_rho0(p_env%local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
264 zcore=0.0_dp)
265 CALL rho0_s_grid_create(pw_env, p_env%local_rho_set%rho0_mpole)
266 CALL hartree_local_create(p_env%hartree_local)
267 CALL init_coulomb_local(p_env%hartree_local, natom)
268 ELSE IF (dft_control%qs_control%gapw_xc) THEN
269 CALL get_qs_env(qs_env, &
270 atomic_kind_set=atomic_kind_set, &
271 qs_kind_set=qs_kind_set)
272 CALL local_rho_set_create(p_env%local_rho_set)
273 CALL allocate_rho_atom_internals(p_env%local_rho_set%rho_atom_set, atomic_kind_set, &
274 qs_kind_set, dft_control, para_env)
275 END IF
276
277 !------------------------!
278 ! LINRES initializations !
279 !------------------------!
280 IF (PRESENT(linres_control)) THEN
281
282 IF (linres_control%preconditioner_type /= ot_precond_none) THEN
283 ! Initialize the preconditioner matrix
284 IF (.NOT. ASSOCIATED(p_env%preconditioner)) THEN
285
286 ALLOCATE (p_env%preconditioner(n_spins))
287 DO spin = 1, n_spins
288 CALL init_preconditioner(p_env%preconditioner(spin), &
289 para_env=para_env, blacs_env=blacs_env)
290 END DO
291
292 CALL fm_pools_create_fm_vect(ao_mo_fm_pools, elements=p_env%PS_psi0, &
293 name="p_env%PS_psi0")
294 END IF
295 END IF
296
297 END IF
298
299 CALL timestop(handle)
300
301 END SUBROUTINE p_env_create
302
303! **************************************************************************************************
304!> \brief checks that the intenal storage is allocated, and allocs it if needed
305!> \param p_env the environment to check
306!> \param qs_env the qs environment this p_env lives in
307!> \par History
308!> 12.2002 created [fawzi]
309!> \author Fawzi Mohamed
310!> \note
311!> private routine
312! **************************************************************************************************
313 SUBROUTINE p_env_check_i_alloc(p_env, qs_env)
314 TYPE(qs_p_env_type) :: p_env
315 TYPE(qs_environment_type), POINTER :: qs_env
316
317 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_check_i_alloc'
318
319 CHARACTER(len=25) :: name
320 INTEGER :: handle, ispin, nspins
321 LOGICAL :: gapw_xc
322 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
323 TYPE(dft_control_type), POINTER :: dft_control
324
325 CALL timeset(routinen, handle)
326
327 NULLIFY (dft_control, matrix_s)
328
329 CALL get_qs_env(qs_env, dft_control=dft_control)
330 gapw_xc = dft_control%qs_control%gapw_xc
331 IF (.NOT. ASSOCIATED(p_env%kpp1)) THEN
332 CALL get_qs_env(qs_env, matrix_s=matrix_s)
333 nspins = dft_control%nspins
334
335 CALL dbcsr_allocate_matrix_set(p_env%kpp1, nspins)
336 name = "p_env%kpp1-"
337 CALL compress(name, full=.true.)
338 DO ispin = 1, nspins
339 ALLOCATE (p_env%kpp1(ispin)%matrix)
340 CALL dbcsr_copy(p_env%kpp1(ispin)%matrix, matrix_s(1)%matrix, &
341 name=trim(name)//adjustl(cp_to_string(ispin)))
342 CALL dbcsr_set(p_env%kpp1(ispin)%matrix, 0.0_dp)
343 END DO
344
345 CALL qs_rho_rebuild(p_env%rho1, qs_env=qs_env)
346 IF (gapw_xc) THEN
347 CALL qs_rho_rebuild(p_env%rho1_xc, qs_env=qs_env)
348 END IF
349
350 END IF
351
352 IF (dft_control%do_admm .AND. .NOT. ASSOCIATED(p_env%kpp1_admm)) THEN
353 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s)
354 nspins = dft_control%nspins
355
356 CALL dbcsr_allocate_matrix_set(p_env%kpp1_admm, nspins)
357 name = "p_env%kpp1_admm-"
358 CALL compress(name, full=.true.)
359 DO ispin = 1, nspins
360 ALLOCATE (p_env%kpp1_admm(ispin)%matrix)
361 CALL dbcsr_copy(p_env%kpp1_admm(ispin)%matrix, matrix_s(1)%matrix, &
362 name=trim(name)//adjustl(cp_to_string(ispin)))
363 CALL dbcsr_set(p_env%kpp1_admm(ispin)%matrix, 0.0_dp)
364 END DO
365
366 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
367 CALL qs_rho_rebuild(p_env%rho1_admm, qs_env=qs_env, admm=.true.)
368 END IF
369
370 END IF
371
372 IF (.NOT. ASSOCIATED(p_env%rho1)) THEN
373 CALL qs_rho_rebuild(p_env%rho1, qs_env=qs_env)
374 IF (gapw_xc) THEN
375 CALL qs_rho_rebuild(p_env%rho1_xc, qs_env=qs_env)
376 END IF
377
378 IF (dft_control%do_admm) THEN
379 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
380 CALL qs_rho_rebuild(p_env%rho1_admm, qs_env=qs_env, admm=.true.)
381 END IF
382 END IF
383
384 END IF
385
386 CALL timestop(handle)
387 END SUBROUTINE p_env_check_i_alloc
388
389! **************************************************************************************************
390!> \brief ...
391!> \param p_env ...
392!> \param qs_env ...
393! **************************************************************************************************
394 SUBROUTINE p_env_update_rho(p_env, qs_env)
395 TYPE(qs_p_env_type), INTENT(IN) :: p_env
396 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
397
398 CHARACTER(LEN=*), PARAMETER :: routinen = 'p_env_update_rho'
399
400 CHARACTER(LEN=default_string_length) :: basis_type
401 INTEGER :: handle, ispin
402 TYPE(admm_type), POINTER :: admm_env
403 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: rho1_ao
404 TYPE(dft_control_type), POINTER :: dft_control
405 TYPE(mp_para_env_type), POINTER :: para_env
406 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
407 POINTER :: sab_aux_fit
408 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g_aux
409 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r_aux
410 TYPE(qs_ks_env_type), POINTER :: ks_env
411 TYPE(task_list_type), POINTER :: task_list
412
413 CALL timeset(routinen, handle)
414
415 CALL get_qs_env(qs_env, dft_control=dft_control)
416
417 IF (dft_control%do_admm) CALL admm_aux_response_density(qs_env, p_env%p1, p_env%p1_admm)
418
419 CALL qs_rho_get(p_env%rho1, rho_ao=rho1_ao)
420 DO ispin = 1, SIZE(rho1_ao)
421 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1(ispin)%matrix)
422 END DO
423
424 CALL qs_rho_update_rho(rho_struct=p_env%rho1, &
425 rho_xc_external=p_env%rho1_xc, &
426 local_rho_set=p_env%local_rho_set, &
427 qs_env=qs_env)
428
429 IF (dft_control%do_admm) THEN
430 IF (qs_env%admm_env%aux_exch_func /= do_admm_aux_exch_func_none) THEN
431 NULLIFY (ks_env, rho1_ao, rho_g_aux, rho_r_aux, task_list)
432
433 CALL get_qs_env(qs_env, ks_env=ks_env, admm_env=admm_env)
434 basis_type = "AUX_FIT"
435 CALL get_admm_env(qs_env%admm_env, task_list_aux_fit=task_list)
436 IF (admm_env%do_gapw) THEN
437 basis_type = "AUX_FIT_SOFT"
438 task_list => admm_env%admm_gapw_env%task_list
439 END IF
440 CALL qs_rho_get(p_env%rho1_admm, &
441 rho_ao=rho1_ao, &
442 rho_g=rho_g_aux, &
443 rho_r=rho_r_aux)
444 DO ispin = 1, SIZE(rho1_ao)
445 CALL dbcsr_copy(rho1_ao(ispin)%matrix, p_env%p1_admm(ispin)%matrix)
446 CALL calculate_rho_elec(ks_env=ks_env, &
447 matrix_p=rho1_ao(ispin)%matrix, &
448 rho=rho_r_aux(ispin), &
449 rho_gspace=rho_g_aux(ispin), &
450 soft_valid=.false., &
451 basis_type=basis_type, &
452 task_list_external=task_list)
453 END DO
454 IF (admm_env%do_gapw) THEN
455 CALL get_qs_env(qs_env, para_env=para_env)
456 CALL get_admm_env(admm_env, sab_aux_fit=sab_aux_fit)
457 CALL calculate_rho_atom_coeff(qs_env, rho1_ao, &
458 rho_atom_set=p_env%local_rho_set_admm%rho_atom_set, &
459 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
460 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
461 END IF
462 END IF
463 END IF
464
465 CALL timestop(handle)
466
467 END SUBROUTINE p_env_update_rho
468
469! **************************************************************************************************
470!> \brief To be called after the value of psi0 has changed.
471!> Recalculates the quantities S_psi0 and m_epsilon.
472!> \param p_env the perturbation environment to set
473!> \param qs_env ...
474!> \par History
475!> 07.2002 created [fawzi]
476!> \author Fawzi Mohamed
477! **************************************************************************************************
478 SUBROUTINE p_env_psi0_changed(p_env, qs_env)
479
480 TYPE(qs_p_env_type) :: p_env
481 TYPE(qs_environment_type), POINTER :: qs_env
482
483 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_psi0_changed'
484
485 INTEGER :: handle, iounit, lfomo, n_spins, nmo, spin
486 LOGICAL :: was_present
487 REAL(kind=dp) :: maxocc
488 TYPE(cp_fm_pool_p_type), DIMENSION(:), POINTER :: ao_mo_fm_pools
489 TYPE(cp_fm_type), DIMENSION(:), POINTER :: psi0
490 TYPE(cp_fm_type), POINTER :: mo_coeff
491 TYPE(cp_logger_type), POINTER :: logger
492 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
493 TYPE(dft_control_type), POINTER :: dft_control
494 TYPE(mo_set_type), DIMENSION(:), POINTER :: mos
495 TYPE(mp_para_env_type), POINTER :: para_env
496 TYPE(qs_energy_type), POINTER :: energy
497 TYPE(qs_ks_env_type), POINTER :: ks_env
498 TYPE(qs_rho_type), POINTER :: rho
499 TYPE(section_vals_type), POINTER :: input, lr_section
500
501 CALL timeset(routinen, handle)
502
503 NULLIFY (ao_mo_fm_pools, mos, psi0, matrix_s, mos, para_env, ks_env, rho, &
504 logger, input, lr_section, energy, matrix_ks, dft_control, rho_ao)
505 logger => cp_get_default_logger()
506
507 CALL get_qs_env(qs_env, &
508 ks_env=ks_env, &
509 mos=mos, &
510 matrix_s=matrix_s, &
511 matrix_ks=matrix_ks, &
512 para_env=para_env, &
513 rho=rho, &
514 input=input, &
515 energy=energy, &
516 dft_control=dft_control)
517
518 CALL qs_rho_get(rho, rho_ao=rho_ao)
519
520 n_spins = dft_control%nspins
521 CALL mpools_get(qs_env%mpools, &
522 ao_mo_fm_pools=ao_mo_fm_pools)
523 ALLOCATE (psi0(n_spins))
524 DO spin = 1, n_spins
525 CALL get_mo_set(mos(spin), mo_coeff=mo_coeff)
526 CALL cp_fm_create(psi0(spin), mo_coeff%matrix_struct)
527 CALL cp_fm_to_fm(mo_coeff, psi0(spin))
528 END DO
529
530 lr_section => section_vals_get_subs_vals(input, "PROPERTIES%LINRES")
531 ! def psi0d
532 IF (p_env%orthogonal_orbitals) THEN
533 IF (ASSOCIATED(p_env%psi0d)) THEN
534 CALL cp_fm_release(p_env%psi0d)
535 END IF
536 p_env%psi0d => psi0
537 ELSE
538
539 DO spin = 1, n_spins
540 ! m_epsilon=cholesky_decomposition(psi0^T S psi0)^-1
541 ! could be optimized by combining next two calls
542 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, &
543 psi0(spin), &
544 p_env%S_psi0(spin), &
545 ncol=p_env%n_mo(spin), alpha=1.0_dp)
546 CALL parallel_gemm(transa='T', transb='N', n=p_env%n_mo(spin), &
547 m=p_env%n_mo(spin), k=p_env%n_ao(spin), alpha=1.0_dp, &
548 matrix_a=psi0(spin), &
549 matrix_b=p_env%S_psi0(spin), &
550 beta=0.0_dp, matrix_c=p_env%m_epsilon(spin))
551 CALL cp_fm_cholesky_decompose(p_env%m_epsilon(spin), &
552 n=p_env%n_mo(spin))
553
554 ! Smo_inv= (psi0^T S psi0)^-1
555 CALL cp_fm_set_all(p_env%Smo_inv(spin), 0.0_dp, 1.0_dp)
556 ! faster using cp_fm_cholesky_invert ?
558 triangular_matrix=p_env%m_epsilon(spin), &
559 matrix_b=p_env%Smo_inv(spin), side='R', &
560 invert_tr=.true., n_rows=p_env%n_mo(spin), &
561 n_cols=p_env%n_mo(spin))
563 triangular_matrix=p_env%m_epsilon(spin), &
564 matrix_b=p_env%Smo_inv(spin), side='R', &
565 transpose_tr=.true., &
566 invert_tr=.true., n_rows=p_env%n_mo(spin), &
567 n_cols=p_env%n_mo(spin))
568
569 ! psi0d=psi0 (psi0^T S psi0)^-1
570 ! faster using cp_fm_cholesky_invert ?
571 CALL cp_fm_to_fm(psi0(spin), &
572 p_env%psi0d(spin))
574 triangular_matrix=p_env%m_epsilon(spin), &
575 matrix_b=p_env%psi0d(spin), side='R', &
576 invert_tr=.true., n_rows=p_env%n_ao(spin), &
577 n_cols=p_env%n_mo(spin))
579 triangular_matrix=p_env%m_epsilon(spin), &
580 matrix_b=p_env%psi0d(spin), side='R', &
581 transpose_tr=.true., &
582 invert_tr=.true., n_rows=p_env%n_ao(spin), &
583 n_cols=p_env%n_mo(spin))
584
585 ! updates P
586 CALL get_mo_set(mos(spin), lfomo=lfomo, &
587 nmo=nmo, maxocc=maxocc)
588 IF (lfomo > nmo) THEN
589 CALL dbcsr_set(rho_ao(spin)%matrix, 0.0_dp)
590 CALL cp_dbcsr_plus_fm_fm_t(rho_ao(spin)%matrix, &
591 matrix_v=psi0(spin), &
592 matrix_g=p_env%psi0d(spin), &
593 ncol=p_env%n_mo(spin))
594 CALL dbcsr_scale(rho_ao(spin)%matrix, alpha_scalar=maxocc)
595 ELSE
596 cpabort("symmetrized onesided smearing to do")
597 END IF
598 END DO
599
600 ! updates rho
601 CALL qs_rho_update_rho(rho_struct=rho, qs_env=qs_env)
602
603 ! tells ks_env that p changed
604 CALL qs_ks_did_change(ks_env=ks_env, rho_changed=.true.)
605
606 END IF
607
608 ! updates K (if necessary)
609 CALL qs_ks_update_qs_env(qs_env)
610 iounit = cp_print_key_unit_nr(logger, lr_section, "PRINT%PROGRAM_RUN_INFO", &
611 extension=".linresLog")
612 IF (iounit > 0) THEN
613 CALL section_vals_get(lr_section, explicit=was_present)
614 IF (was_present) THEN
615 WRITE (unit=iounit, fmt="(/,(T3,A,T55,F25.14))") &
616 "Total energy ground state: ", energy%total
617 END IF
618 END IF
619 CALL cp_print_key_finished_output(iounit, logger, lr_section, &
620 "PRINT%PROGRAM_RUN_INFO")
621 !-----------------------------------------------------------------------|
622 ! calculates |
623 ! m_epsilon = - psi0d^T times K times psi0d |
624 ! = - [K times psi0d]^T times psi0d (because K is symmetric) |
625 !-----------------------------------------------------------------------|
626 DO spin = 1, n_spins
627 ! S_psi0 = k times psi0d
628 CALL cp_dbcsr_sm_fm_multiply(matrix_ks(spin)%matrix, &
629 p_env%psi0d(spin), &
630 p_env%S_psi0(spin), p_env%n_mo(spin))
631 ! m_epsilon = -1 times S_psi0^T times psi0d
632 CALL parallel_gemm('T', 'N', &
633 p_env%n_mo(spin), p_env%n_mo(spin), p_env%n_ao(spin), &
634 -1.0_dp, p_env%S_psi0(spin), p_env%psi0d(spin), &
635 0.0_dp, p_env%m_epsilon(spin))
636 END DO
637
638 !----------------------------------|
639 ! calculates S_psi0 = S * psi0 |
640 !----------------------------------|
641 ! calculating this reduces the mat mult without storing a full aoxao
642 ! matrix (for P). If nspin>1 you might consider calculating it on the
643 ! fly to spare some memory
644 CALL get_qs_env(qs_env, matrix_s=matrix_s)
645 DO spin = 1, n_spins
646 CALL cp_dbcsr_sm_fm_multiply(matrix_s(1)%matrix, &
647 psi0(spin), &
648 p_env%S_psi0(spin), &
649 p_env%n_mo(spin))
650 END DO
651
652 ! releases psi0
653 IF (p_env%orthogonal_orbitals) THEN
654 NULLIFY (psi0)
655 ELSE
656 CALL cp_fm_release(psi0)
657 END IF
658
659 CALL timestop(handle)
660
661 END SUBROUTINE p_env_psi0_changed
662
663! **************************************************************************************************
664!> \brief does a preorthogonalization of the given matrix:
665!> v = (I-PS)v
666!> \param p_env the perturbation environment
667!> \param qs_env the qs_env that is perturbed by this p_env
668!> \param v matrix to orthogonalize
669!> \param n_cols the number of columns of C to multiply (defaults to size(v,2))
670!> \par History
671!> 02.09.2002 adapted for new qs_p_env_type (TC)
672!> \author Fawzi Mohamed
673! **************************************************************************************************
674 SUBROUTINE p_preortho(p_env, qs_env, v, n_cols)
675
676 TYPE(qs_p_env_type) :: p_env
677 TYPE(qs_environment_type), POINTER :: qs_env
678 TYPE(cp_fm_type), DIMENSION(:), INTENT(inout) :: v
679 INTEGER, DIMENSION(:), INTENT(in), OPTIONAL :: n_cols
680
681 CHARACTER(len=*), PARAMETER :: routinen = 'p_preortho'
682
683 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
684 nmo2, spin, v_cols, v_rows
685 TYPE(cp_fm_pool_type), POINTER :: maxmo_maxmo_fm_pool
686 TYPE(cp_fm_struct_type), POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
687 TYPE(cp_fm_type) :: tmp_matrix
688 TYPE(dft_control_type), POINTER :: dft_control
689
690 CALL timeset(routinen, handle)
691
692 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
693 dft_control)
694
695 CALL get_qs_env(qs_env, dft_control=dft_control)
696 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
697 n_spins = dft_control%nspins
698 maxmo_maxmo_fmstruct => fm_pool_get_el_struct(maxmo_maxmo_fm_pool)
699 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
700 cpassert(SIZE(v) >= n_spins)
701 ! alloc tmp storage
702 IF (PRESENT(n_cols)) THEN
703 max_cols = maxval(n_cols(1:n_spins))
704 ELSE
705 max_cols = 0
706 DO spin = 1, n_spins
707 CALL cp_fm_get_info(v(spin), ncol_global=v_cols)
708 max_cols = max(max_cols, v_cols)
709 END DO
710 END IF
711 IF (max_cols <= nmo2) THEN
712 CALL fm_pool_create_fm(maxmo_maxmo_fm_pool, tmp_matrix)
713 ELSE
714 CALL cp_fm_struct_create(tmp_fmstruct, nrow_global=max_cols, &
715 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
716 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
717 CALL cp_fm_struct_release(tmp_fmstruct)
718 END IF
719
720 DO spin = 1, n_spins
721
722 CALL cp_fm_get_info(v(spin), &
723 nrow_global=v_rows, ncol_global=v_cols)
724 cpassert(v_rows >= p_env%n_ao(spin))
725 cols = v_cols
726 IF (PRESENT(n_cols)) THEN
727 cpassert(n_cols(spin) <= cols)
728 cols = n_cols(spin)
729 END IF
730 cpassert(cols <= max_cols)
731
732 ! tmp_matrix = v^T (S psi0)
733 CALL parallel_gemm(transa='T', transb='N', m=cols, n=p_env%n_mo(spin), &
734 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
735 matrix_b=p_env%S_psi0(spin), beta=0.0_dp, &
736 matrix_c=tmp_matrix)
737 ! v = v - psi0d tmp_matrix^T = v - psi0d psi0^T S v
738 CALL parallel_gemm(transa='N', transb='T', m=p_env%n_ao(spin), n=cols, &
739 k=p_env%n_mo(spin), alpha=-1.0_dp, &
740 matrix_a=p_env%psi0d(spin), matrix_b=tmp_matrix, &
741 beta=1.0_dp, matrix_c=v(spin))
742
743 END DO
744
745 IF (max_cols <= nmo2) THEN
746 CALL fm_pool_give_back_fm(maxmo_maxmo_fm_pool, tmp_matrix)
747 ELSE
748 CALL cp_fm_release(tmp_matrix)
749 END IF
750
751 CALL timestop(handle)
752
753 END SUBROUTINE p_preortho
754
755! **************************************************************************************************
756!> \brief does a postorthogonalization on the given matrix vector:
757!> v = (I-SP) v
758!> \param p_env the perturbation environment
759!> \param qs_env the qs_env that is perturbed by this p_env
760!> \param v matrix to orthogonalize
761!> \param n_cols the number of columns of C to multiply (defaults to size(v,2))
762!> \par History
763!> 07.2002 created [fawzi]
764!> \author Fawzi Mohamed
765! **************************************************************************************************
766 SUBROUTINE p_postortho(p_env, qs_env, v, n_cols)
767
768 TYPE(qs_p_env_type) :: p_env
769 TYPE(qs_environment_type), POINTER :: qs_env
770 TYPE(cp_fm_type), DIMENSION(:), INTENT(inout) :: v
771 INTEGER, DIMENSION(:), INTENT(in), OPTIONAL :: n_cols
772
773 CHARACTER(len=*), PARAMETER :: routinen = 'p_postortho'
774
775 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
776 nmo2, spin, v_cols, v_rows
777 TYPE(cp_fm_pool_type), POINTER :: maxmo_maxmo_fm_pool
778 TYPE(cp_fm_struct_type), POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
779 TYPE(cp_fm_type) :: tmp_matrix
780 TYPE(dft_control_type), POINTER :: dft_control
781
782 CALL timeset(routinen, handle)
783
784 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
785 dft_control)
786
787 CALL get_qs_env(qs_env, dft_control=dft_control)
788 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
789 n_spins = dft_control%nspins
790 maxmo_maxmo_fmstruct => fm_pool_get_el_struct(maxmo_maxmo_fm_pool)
791 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
792 cpassert(SIZE(v) >= n_spins)
793 ! alloc tmp storage
794 IF (PRESENT(n_cols)) THEN
795 max_cols = maxval(n_cols(1:n_spins))
796 ELSE
797 max_cols = 0
798 DO spin = 1, n_spins
799 CALL cp_fm_get_info(v(spin), ncol_global=v_cols)
800 max_cols = max(max_cols, v_cols)
801 END DO
802 END IF
803 IF (max_cols <= nmo2) THEN
804 CALL fm_pool_create_fm(maxmo_maxmo_fm_pool, tmp_matrix)
805 ELSE
806 CALL cp_fm_struct_create(tmp_fmstruct, nrow_global=max_cols, &
807 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
808 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
809 CALL cp_fm_struct_release(tmp_fmstruct)
810 END IF
811
812 DO spin = 1, n_spins
813
814 CALL cp_fm_get_info(v(spin), &
815 nrow_global=v_rows, ncol_global=v_cols)
816 cpassert(v_rows >= p_env%n_ao(spin))
817 cols = v_cols
818 IF (PRESENT(n_cols)) THEN
819 cpassert(n_cols(spin) <= cols)
820 cols = n_cols(spin)
821 END IF
822 cpassert(cols <= max_cols)
823
824 ! tmp_matrix = v^T psi0d
825 CALL parallel_gemm(transa='T', transb='N', m=cols, n=p_env%n_mo(spin), &
826 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
827 matrix_b=p_env%psi0d(spin), beta=0.0_dp, &
828 matrix_c=tmp_matrix)
829 ! v = v - (S psi0) tmp_matrix^T = v - S psi0 psi0d^T v
830 CALL parallel_gemm(transa='N', transb='T', m=p_env%n_ao(spin), n=cols, &
831 k=p_env%n_mo(spin), alpha=-1.0_dp, &
832 matrix_a=p_env%S_psi0(spin), matrix_b=tmp_matrix, &
833 beta=1.0_dp, matrix_c=v(spin))
834
835 END DO
836
837 IF (max_cols <= nmo2) THEN
838 CALL fm_pool_give_back_fm(maxmo_maxmo_fm_pool, tmp_matrix)
839 ELSE
840 CALL cp_fm_release(tmp_matrix)
841 END IF
842
843 CALL timestop(handle)
844
845 END SUBROUTINE p_postortho
846
847! **************************************************************************************************
848!> \brief ...
849!> \param qs_env ...
850!> \param p_env ...
851! **************************************************************************************************
852 SUBROUTINE p_env_finish_kpp1(qs_env, p_env)
853 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
854 TYPE(qs_p_env_type), INTENT(IN) :: p_env
855
856 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_finish_kpp1'
857
858 INTEGER :: handle, ispin, nao, nao_aux
859 TYPE(admm_type), POINTER :: admm_env
860 TYPE(dbcsr_type) :: work_hmat
861 TYPE(dft_control_type), POINTER :: dft_control
862
863 CALL timeset(routinen, handle)
864
865 CALL get_qs_env(qs_env, dft_control=dft_control, admm_env=admm_env)
866
867 IF (dft_control%do_admm) THEN
868 CALL dbcsr_copy(work_hmat, p_env%kpp1(1)%matrix)
869
870 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
871 DO ispin = 1, SIZE(p_env%kpp1)
872 CALL cp_dbcsr_sm_fm_multiply(p_env%kpp1_admm(ispin)%matrix, admm_env%A, admm_env%work_aux_orb, &
873 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
874 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
875 admm_env%work_aux_orb, 0.0_dp, admm_env%work_orb_orb)
876 CALL dbcsr_set(work_hmat, 0.0_dp)
877 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, work_hmat, keep_sparsity=.true.)
878 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, work_hmat, 1.0_dp, 1.0_dp)
879 END DO
880
881 CALL dbcsr_release(work_hmat)
882 END IF
883
884 CALL timestop(handle)
885
886 END SUBROUTINE p_env_finish_kpp1
887
888END 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, 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.
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
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.