(git:ed6f26b)
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-2025 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)) &
228 p_env%orthogonal_orbitals = orthogonal_orbitals
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 ELSEIF (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 ! tells kpp1_env about the change of psi0
660 CALL kpp1_did_change(p_env%kpp1_env)
661
662 CALL timestop(handle)
663
664 END SUBROUTINE p_env_psi0_changed
665
666! **************************************************************************************************
667!> \brief does a preorthogonalization of the given matrix:
668!> v = (I-PS)v
669!> \param p_env the perturbation environment
670!> \param qs_env the qs_env that is perturbed by this p_env
671!> \param v matrix to orthogonalize
672!> \param n_cols the number of columns of C to multiply (defaults to size(v,2))
673!> \par History
674!> 02.09.2002 adapted for new qs_p_env_type (TC)
675!> \author Fawzi Mohamed
676! **************************************************************************************************
677 SUBROUTINE p_preortho(p_env, qs_env, v, n_cols)
678
679 TYPE(qs_p_env_type) :: p_env
680 TYPE(qs_environment_type), POINTER :: qs_env
681 TYPE(cp_fm_type), DIMENSION(:), INTENT(inout) :: v
682 INTEGER, DIMENSION(:), INTENT(in), OPTIONAL :: n_cols
683
684 CHARACTER(len=*), PARAMETER :: routinen = 'p_preortho'
685
686 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
687 nmo2, spin, v_cols, v_rows
688 TYPE(cp_fm_pool_type), POINTER :: maxmo_maxmo_fm_pool
689 TYPE(cp_fm_struct_type), POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
690 TYPE(cp_fm_type) :: tmp_matrix
691 TYPE(dft_control_type), POINTER :: dft_control
692
693 CALL timeset(routinen, handle)
694
695 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
696 dft_control)
697
698 CALL get_qs_env(qs_env, dft_control=dft_control)
699 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
700 n_spins = dft_control%nspins
701 maxmo_maxmo_fmstruct => fm_pool_get_el_struct(maxmo_maxmo_fm_pool)
702 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
703 cpassert(SIZE(v) >= n_spins)
704 ! alloc tmp storage
705 IF (PRESENT(n_cols)) THEN
706 max_cols = maxval(n_cols(1:n_spins))
707 ELSE
708 max_cols = 0
709 DO spin = 1, n_spins
710 CALL cp_fm_get_info(v(spin), ncol_global=v_cols)
711 max_cols = max(max_cols, v_cols)
712 END DO
713 END IF
714 IF (max_cols <= nmo2) THEN
715 CALL fm_pool_create_fm(maxmo_maxmo_fm_pool, tmp_matrix)
716 ELSE
717 CALL cp_fm_struct_create(tmp_fmstruct, nrow_global=max_cols, &
718 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
719 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
720 CALL cp_fm_struct_release(tmp_fmstruct)
721 END IF
722
723 DO spin = 1, n_spins
724
725 CALL cp_fm_get_info(v(spin), &
726 nrow_global=v_rows, ncol_global=v_cols)
727 cpassert(v_rows >= p_env%n_ao(spin))
728 cols = v_cols
729 IF (PRESENT(n_cols)) THEN
730 cpassert(n_cols(spin) <= cols)
731 cols = n_cols(spin)
732 END IF
733 cpassert(cols <= max_cols)
734
735 ! tmp_matrix = v^T (S psi0)
736 CALL parallel_gemm(transa='T', transb='N', m=cols, n=p_env%n_mo(spin), &
737 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
738 matrix_b=p_env%S_psi0(spin), beta=0.0_dp, &
739 matrix_c=tmp_matrix)
740 ! v = v - psi0d tmp_matrix^T = v - psi0d psi0^T S v
741 CALL parallel_gemm(transa='N', transb='T', m=p_env%n_ao(spin), n=cols, &
742 k=p_env%n_mo(spin), alpha=-1.0_dp, &
743 matrix_a=p_env%psi0d(spin), matrix_b=tmp_matrix, &
744 beta=1.0_dp, matrix_c=v(spin))
745
746 END DO
747
748 IF (max_cols <= nmo2) THEN
749 CALL fm_pool_give_back_fm(maxmo_maxmo_fm_pool, tmp_matrix)
750 ELSE
751 CALL cp_fm_release(tmp_matrix)
752 END IF
753
754 CALL timestop(handle)
755
756 END SUBROUTINE p_preortho
757
758! **************************************************************************************************
759!> \brief does a postorthogonalization on the given matrix vector:
760!> v = (I-SP) v
761!> \param p_env the perturbation environment
762!> \param qs_env the qs_env that is perturbed by this p_env
763!> \param v matrix to orthogonalize
764!> \param n_cols the number of columns of C to multiply (defaults to size(v,2))
765!> \par History
766!> 07.2002 created [fawzi]
767!> \author Fawzi Mohamed
768! **************************************************************************************************
769 SUBROUTINE p_postortho(p_env, qs_env, v, n_cols)
770
771 TYPE(qs_p_env_type) :: p_env
772 TYPE(qs_environment_type), POINTER :: qs_env
773 TYPE(cp_fm_type), DIMENSION(:), INTENT(inout) :: v
774 INTEGER, DIMENSION(:), INTENT(in), OPTIONAL :: n_cols
775
776 CHARACTER(len=*), PARAMETER :: routinen = 'p_postortho'
777
778 INTEGER :: cols, handle, max_cols, maxnmo, n_spins, &
779 nmo2, spin, v_cols, v_rows
780 TYPE(cp_fm_pool_type), POINTER :: maxmo_maxmo_fm_pool
781 TYPE(cp_fm_struct_type), POINTER :: maxmo_maxmo_fmstruct, tmp_fmstruct
782 TYPE(cp_fm_type) :: tmp_matrix
783 TYPE(dft_control_type), POINTER :: dft_control
784
785 CALL timeset(routinen, handle)
786
787 NULLIFY (maxmo_maxmo_fm_pool, maxmo_maxmo_fmstruct, tmp_fmstruct, &
788 dft_control)
789
790 CALL get_qs_env(qs_env, dft_control=dft_control)
791 CALL mpools_get(qs_env%mpools, maxmo_maxmo_fm_pool=maxmo_maxmo_fm_pool)
792 n_spins = dft_control%nspins
793 maxmo_maxmo_fmstruct => fm_pool_get_el_struct(maxmo_maxmo_fm_pool)
794 CALL cp_fm_struct_get(maxmo_maxmo_fmstruct, nrow_global=nmo2, ncol_global=maxnmo)
795 cpassert(SIZE(v) >= n_spins)
796 ! alloc tmp storage
797 IF (PRESENT(n_cols)) THEN
798 max_cols = maxval(n_cols(1:n_spins))
799 ELSE
800 max_cols = 0
801 DO spin = 1, n_spins
802 CALL cp_fm_get_info(v(spin), ncol_global=v_cols)
803 max_cols = max(max_cols, v_cols)
804 END DO
805 END IF
806 IF (max_cols <= nmo2) THEN
807 CALL fm_pool_create_fm(maxmo_maxmo_fm_pool, tmp_matrix)
808 ELSE
809 CALL cp_fm_struct_create(tmp_fmstruct, nrow_global=max_cols, &
810 ncol_global=maxnmo, template_fmstruct=maxmo_maxmo_fmstruct)
811 CALL cp_fm_create(tmp_matrix, matrix_struct=tmp_fmstruct)
812 CALL cp_fm_struct_release(tmp_fmstruct)
813 END IF
814
815 DO spin = 1, n_spins
816
817 CALL cp_fm_get_info(v(spin), &
818 nrow_global=v_rows, ncol_global=v_cols)
819 cpassert(v_rows >= p_env%n_ao(spin))
820 cols = v_cols
821 IF (PRESENT(n_cols)) THEN
822 cpassert(n_cols(spin) <= cols)
823 cols = n_cols(spin)
824 END IF
825 cpassert(cols <= max_cols)
826
827 ! tmp_matrix = v^T psi0d
828 CALL parallel_gemm(transa='T', transb='N', m=cols, n=p_env%n_mo(spin), &
829 k=p_env%n_ao(spin), alpha=1.0_dp, matrix_a=v(spin), &
830 matrix_b=p_env%psi0d(spin), beta=0.0_dp, &
831 matrix_c=tmp_matrix)
832 ! v = v - (S psi0) tmp_matrix^T = v - S psi0 psi0d^T v
833 CALL parallel_gemm(transa='N', transb='T', m=p_env%n_ao(spin), n=cols, &
834 k=p_env%n_mo(spin), alpha=-1.0_dp, &
835 matrix_a=p_env%S_psi0(spin), matrix_b=tmp_matrix, &
836 beta=1.0_dp, matrix_c=v(spin))
837
838 END DO
839
840 IF (max_cols <= nmo2) THEN
841 CALL fm_pool_give_back_fm(maxmo_maxmo_fm_pool, tmp_matrix)
842 ELSE
843 CALL cp_fm_release(tmp_matrix)
844 END IF
845
846 CALL timestop(handle)
847
848 END SUBROUTINE p_postortho
849
850! **************************************************************************************************
851!> \brief ...
852!> \param qs_env ...
853!> \param p_env ...
854! **************************************************************************************************
855 SUBROUTINE p_env_finish_kpp1(qs_env, p_env)
856 TYPE(qs_environment_type), INTENT(IN), POINTER :: qs_env
857 TYPE(qs_p_env_type), INTENT(IN) :: p_env
858
859 CHARACTER(len=*), PARAMETER :: routinen = 'p_env_finish_kpp1'
860
861 INTEGER :: handle, ispin, nao, nao_aux
862 TYPE(admm_type), POINTER :: admm_env
863 TYPE(dbcsr_type) :: work_hmat
864 TYPE(dft_control_type), POINTER :: dft_control
865
866 CALL timeset(routinen, handle)
867
868 CALL get_qs_env(qs_env, dft_control=dft_control, admm_env=admm_env)
869
870 IF (dft_control%do_admm) THEN
871 CALL dbcsr_copy(work_hmat, p_env%kpp1(1)%matrix)
872
873 CALL cp_fm_get_info(admm_env%A, nrow_global=nao_aux, ncol_global=nao)
874 DO ispin = 1, SIZE(p_env%kpp1)
875 CALL cp_dbcsr_sm_fm_multiply(p_env%kpp1_admm(ispin)%matrix, admm_env%A, admm_env%work_aux_orb, &
876 ncol=nao, alpha=1.0_dp, beta=0.0_dp)
877 CALL parallel_gemm('T', 'N', nao, nao, nao_aux, 1.0_dp, admm_env%A, &
878 admm_env%work_aux_orb, 0.0_dp, admm_env%work_orb_orb)
879 CALL dbcsr_set(work_hmat, 0.0_dp)
880 CALL copy_fm_to_dbcsr(admm_env%work_orb_orb, work_hmat, keep_sparsity=.true.)
881 CALL dbcsr_add(p_env%kpp1(ispin)%matrix, work_hmat, 1.0_dp, 1.0_dp)
882 END DO
883
884 CALL dbcsr_release(work_hmat)
885 END IF
886
887 CALL timestop(handle)
888
889 END SUBROUTINE p_env_finish_kpp1
890
891END 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:593
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, use_sp)
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, 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, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, ecoul_1c, rho0_s_rs, rho0_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, 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)
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.