(git:374b731)
Loading...
Searching...
No Matches
pao_param_methods.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Common routines for PAO parametrizations.
10!> \author Ole Schuett
11! **************************************************************************************************
15 USE dbcsr_api, ONLY: &
16 dbcsr_add, dbcsr_complete_redistribute, dbcsr_create, dbcsr_get_block_p, dbcsr_get_info, &
17 dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, dbcsr_iterator_start, &
18 dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, dbcsr_p_type, dbcsr_release, &
19 dbcsr_reserve_diag_blocks, dbcsr_scale, dbcsr_type
23 USE kinds, ONLY: dp
25 USE pao_types, ONLY: pao_env_type
28 USE qs_rho_types, ONLY: qs_rho_get,&
30#include "./base/base_uses.f90"
31
32 IMPLICIT NONE
33
34 PRIVATE
35
36 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_param_methods'
37
39
40CONTAINS
41
42! **************************************************************************************************
43!> \brief Helper routine, calculates partial derivative dE/dU
44!> \param qs_env ...
45!> \param ls_scf_env ...
46!> \param matrix_M_diag the derivate wrt U, matrix uses pao%diag_distribution
47! **************************************************************************************************
48 SUBROUTINE pao_calc_grad_lnv_wrt_u(qs_env, ls_scf_env, matrix_M_diag)
49 TYPE(qs_environment_type), POINTER :: qs_env
50 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
51 TYPE(dbcsr_type) :: matrix_m_diag
52
53 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_grad_lnv_wrt_U'
54
55 INTEGER :: handle
56 REAL(kind=dp) :: filter_eps
57 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
58 TYPE(dbcsr_type) :: matrix_m, matrix_ma, matrix_mb, matrix_nm
59 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
60 TYPE(pao_env_type), POINTER :: pao
61
62 CALL timeset(routinen, handle)
63
64 ls_mstruct => ls_scf_env%ls_mstruct
65 pao => ls_scf_env%pao_env
66 filter_eps = ls_scf_env%eps_filter
67 CALL get_qs_env(qs_env, matrix_s=matrix_s)
68
69 CALL pao_calc_grad_lnv_wrt_ab(qs_env, ls_scf_env, matrix_ma, matrix_mb)
70
71 ! Calculation uses distr. of matrix_s, afterwards we redistribute to pao%diag_distribution.
72 CALL dbcsr_create(matrix_m, template=matrix_s(1)%matrix, matrix_type="N")
73 CALL dbcsr_reserve_diag_blocks(matrix_m)
74
75 CALL dbcsr_create(matrix_nm, template=ls_mstruct%matrix_A, matrix_type="N")
76
77 CALL dbcsr_multiply("N", "N", 1.0_dp, pao%matrix_N_inv, matrix_ma, &
78 1.0_dp, matrix_nm, filter_eps=filter_eps)
79
80 CALL dbcsr_multiply("N", "N", 1.0_dp, pao%matrix_N, matrix_mb, &
81 1.0_dp, matrix_nm, filter_eps=filter_eps)
82
83 CALL dbcsr_multiply("N", "T", 1.0_dp, matrix_nm, pao%matrix_Y, &
84 1.0_dp, matrix_m, filter_eps=filter_eps)
85
86 !---------------------------------------------------------------------------
87 ! redistribute using pao%diag_distribution
88 CALL dbcsr_create(matrix_m_diag, &
89 name="PAO matrix_M", &
90 matrix_type="N", &
91 dist=pao%diag_distribution, &
92 template=matrix_s(1)%matrix)
93 CALL dbcsr_reserve_diag_blocks(matrix_m_diag)
94 CALL dbcsr_complete_redistribute(matrix_m, matrix_m_diag)
95
96 !---------------------------------------------------------------------------
97 ! cleanup:
98 CALL dbcsr_release(matrix_m)
99 CALL dbcsr_release(matrix_ma)
100 CALL dbcsr_release(matrix_mb)
101 CALL dbcsr_release(matrix_nm)
102
103 CALL timestop(handle)
104 END SUBROUTINE pao_calc_grad_lnv_wrt_u
105
106! **************************************************************************************************
107!> \brief Takes current matrix_X and calculates the matrices A and B.
108!> \param pao ...
109!> \param qs_env ...
110!> \param ls_scf_env ...
111!> \param matrix_U_diag ...
112! **************************************************************************************************
113 SUBROUTINE pao_calc_ab_from_u(pao, qs_env, ls_scf_env, matrix_U_diag)
114 TYPE(pao_env_type), POINTER :: pao
115 TYPE(qs_environment_type), POINTER :: qs_env
116 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
117 TYPE(dbcsr_type) :: matrix_u_diag
118
119 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_AB_from_U'
120
121 INTEGER :: acol, arow, handle, iatom
122 LOGICAL :: found
123 REAL(dp), DIMENSION(:, :), POINTER :: block_a, block_b, block_n, block_n_inv, &
124 block_u, block_y
125 TYPE(dbcsr_iterator_type) :: iter
126 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
127 TYPE(dbcsr_type) :: matrix_u
128 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
129
130 CALL timeset(routinen, handle)
131 CALL get_qs_env(qs_env, matrix_s=matrix_s)
132 ls_mstruct => ls_scf_env%ls_mstruct
133
134 ! --------------------------------------------------------------------------------------------
135 ! sanity check matrix U
136 CALL pao_assert_unitary(pao, matrix_u_diag)
137
138 ! --------------------------------------------------------------------------------------------
139 ! redistribute matrix_U_diag from diag_distribution to distribution of matrix_s
140 CALL get_qs_env(qs_env, matrix_s=matrix_s)
141 CALL dbcsr_create(matrix_u, matrix_type="N", template=matrix_s(1)%matrix)
142 CALL dbcsr_reserve_diag_blocks(matrix_u)
143 CALL dbcsr_complete_redistribute(matrix_u_diag, matrix_u)
144
145 ! --------------------------------------------------------------------------------------------
146 ! calculate matrix A and B from matrix U
147 ! Multiplying diagonal matrices is a local operation.
148 ! To take advantage of this we're using an iterator instead of calling dbcsr_multiply().
149!$OMP PARALLEL DEFAULT(NONE) SHARED(pao,ls_mstruct,matrix_U) &
150!$OMP PRIVATE(iter,arow,acol,iatom,block_U,block_Y,block_A,block_B,block_N,block_N_inv,found)
151 CALL dbcsr_iterator_start(iter, matrix_u)
152 DO WHILE (dbcsr_iterator_blocks_left(iter))
153 CALL dbcsr_iterator_next_block(iter, arow, acol, block_u)
154 iatom = arow; cpassert(arow == acol)
155
156 CALL dbcsr_get_block_p(matrix=pao%matrix_Y, row=iatom, col=iatom, block=block_y, found=found)
157 cpassert(ASSOCIATED(block_y))
158
159 CALL dbcsr_get_block_p(matrix=ls_mstruct%matrix_A, row=iatom, col=iatom, block=block_a, found=found)
160 CALL dbcsr_get_block_p(matrix=pao%matrix_N_inv, row=iatom, col=iatom, block=block_n_inv, found=found)
161 cpassert(ASSOCIATED(block_a) .AND. ASSOCIATED(block_n_inv))
162
163 CALL dbcsr_get_block_p(matrix=ls_mstruct%matrix_B, row=iatom, col=iatom, block=block_b, found=found)
164 CALL dbcsr_get_block_p(matrix=pao%matrix_N, row=iatom, col=iatom, block=block_n, found=found)
165 cpassert(ASSOCIATED(block_b) .AND. ASSOCIATED(block_n))
166
167 block_a = matmul(matmul(block_n_inv, block_u), block_y)
168 block_b = matmul(matmul(block_n, block_u), block_y)
169
170 END DO
171 CALL dbcsr_iterator_stop(iter)
172!$OMP END PARALLEL
173
174 CALL dbcsr_release(matrix_u)
175
176 CALL timestop(handle)
177 END SUBROUTINE pao_calc_ab_from_u
178
179! **************************************************************************************************
180!> \brief Debugging routine, check unitaryness of U
181!> \param pao ...
182!> \param matrix_U ...
183! **************************************************************************************************
184 SUBROUTINE pao_assert_unitary(pao, matrix_U)
185 TYPE(pao_env_type), POINTER :: pao
186 TYPE(dbcsr_type) :: matrix_u
187
188 CHARACTER(len=*), PARAMETER :: routinen = 'pao_assert_unitary'
189
190 INTEGER :: acol, arow, group_handle, handle, i, &
191 iatom, m, n
192 INTEGER, DIMENSION(:), POINTER :: blk_sizes_pao, blk_sizes_pri
193 REAL(dp) :: delta_max
194 REAL(dp), DIMENSION(:, :), POINTER :: block_test, tmp1, tmp2
195 TYPE(dbcsr_iterator_type) :: iter
196 TYPE(mp_comm_type) :: group
197
198 IF (pao%check_unitary_tol < 0.0_dp) RETURN ! no checking
199
200 CALL timeset(routinen, handle)
201 delta_max = 0.0_dp
202
203 CALL dbcsr_get_info(pao%matrix_Y, row_blk_size=blk_sizes_pri, col_blk_size=blk_sizes_pao)
204
205!$OMP PARALLEL DEFAULT(NONE) SHARED(pao,matrix_U,blk_sizes_pri,blk_sizes_pao,delta_max) &
206!$OMP PRIVATE(iter,arow,acol,iatom,N,M,block_test,tmp1,tmp2)
207 CALL dbcsr_iterator_start(iter, matrix_u)
208 DO WHILE (dbcsr_iterator_blocks_left(iter))
209 CALL dbcsr_iterator_next_block(iter, arow, acol, block_test)
210 iatom = arow; cpassert(arow == acol)
211 n = blk_sizes_pri(iatom) ! size of primary basis
212 m = blk_sizes_pao(iatom) ! size of pao basis
213
214 ! we only need the upper left "PAO-corner" to be unitary
215 ALLOCATE (tmp1(n, m), tmp2(m, m))
216 tmp1 = block_test(:, 1:m)
217 tmp2 = matmul(transpose(tmp1), tmp1)
218 DO i = 1, m
219 tmp2(i, i) = tmp2(i, i) - 1.0_dp
220 END DO
221
222!$OMP ATOMIC
223 delta_max = max(delta_max, maxval(abs(tmp2)))
224
225 DEALLOCATE (tmp1, tmp2)
226 END DO
227 CALL dbcsr_iterator_stop(iter)
228!$OMP END PARALLEL
229
230 CALL dbcsr_get_info(matrix_u, group=group_handle)
231 CALL group%set_handle(group_handle)
232
233 CALL group%max(delta_max)
234 IF (pao%iw > 0) WRITE (pao%iw, *) 'PAO| checked unitaryness, max delta:', delta_max
235 IF (delta_max > pao%check_unitary_tol) &
236 cpabort("Found bad unitaryness:"//cp_to_string(delta_max))
237
238 CALL timestop(handle)
239 END SUBROUTINE pao_assert_unitary
240
241! **************************************************************************************************
242!> \brief Helper routine, calculates partial derivative dE/dA and dE/dB.
243!> As energy functional serves the definition by LNV (Li, Nunes, Vanderbilt).
244!> \param qs_env ...
245!> \param ls_scf_env ...
246!> \param matrix_Ma the derivate wrt A, matrix uses s_matrix-distribution.
247!> \param matrix_Mb the derivate wrt B, matrix uses s_matrix-distribution.
248! **************************************************************************************************
249 SUBROUTINE pao_calc_grad_lnv_wrt_ab(qs_env, ls_scf_env, matrix_Ma, matrix_Mb)
250 TYPE(qs_environment_type), POINTER :: qs_env
251 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
252 TYPE(dbcsr_type) :: matrix_ma, matrix_mb
253
254 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_grad_lnv_wrt_AB'
255
256 INTEGER :: handle, nspin
257 INTEGER, DIMENSION(:), POINTER :: pao_blk_sizes
258 REAL(kind=dp) :: filter_eps
259 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
260 TYPE(dbcsr_type) :: matrix_hb, matrix_hps, matrix_m, matrix_m1, matrix_m1_dc, matrix_m2, &
261 matrix_m2_dc, matrix_m3, matrix_m3_dc, matrix_pa, matrix_ph, matrix_php, matrix_psp, &
262 matrix_sb, matrix_sp
263 TYPE(dft_control_type), POINTER :: dft_control
264 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
265 TYPE(pao_env_type), POINTER :: pao
266 TYPE(qs_rho_type), POINTER :: rho
267
268 CALL timeset(routinen, handle)
269
270 ls_mstruct => ls_scf_env%ls_mstruct
271 pao => ls_scf_env%pao_env
272
273 CALL get_qs_env(qs_env, &
274 rho=rho, &
275 matrix_ks=matrix_ks, &
276 matrix_s=matrix_s, &
277 dft_control=dft_control)
278 CALL qs_rho_get(rho, rho_ao=rho_ao)
279 nspin = dft_control%nspins
280 filter_eps = ls_scf_env%eps_filter
281
282 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=pao_blk_sizes)
283
284 IF (nspin /= 1) cpabort("open shell not yet implemented")
285 !TODO: handle openshell case properly
286
287 ! Notation according to equation (4.6) on page 50 from:
288 ! https://dx.doi.org/10.3929%2Fethz-a-010819495
289
290 !---------------------------------------------------------------------------
291 ! calculate need products in pao basis
292 CALL dbcsr_create(matrix_ph, template=ls_scf_env%matrix_s, matrix_type="N")
293 CALL dbcsr_multiply("N", "N", 1.0_dp, ls_scf_env%matrix_p(1), ls_scf_env%matrix_ks(1), &
294 0.0_dp, matrix_ph, filter_eps=filter_eps)
295
296 CALL dbcsr_create(matrix_php, template=ls_scf_env%matrix_s, matrix_type="N")
297 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_ph, ls_scf_env%matrix_p(1), &
298 0.0_dp, matrix_php, filter_eps=filter_eps)
299
300 CALL dbcsr_create(matrix_sp, template=ls_scf_env%matrix_s, matrix_type="N")
301 CALL dbcsr_multiply("N", "N", 1.0_dp, ls_scf_env%matrix_s, ls_scf_env%matrix_p(1), &
302 0.0_dp, matrix_sp, filter_eps=filter_eps)
303
304 IF (nspin == 1) CALL dbcsr_scale(matrix_sp, 0.5_dp)
305
306 CALL dbcsr_create(matrix_hps, template=ls_scf_env%matrix_s, matrix_type="N")
307 CALL dbcsr_multiply("N", "T", 1.0_dp, ls_scf_env%matrix_ks(1), matrix_sp, &
308 0.0_dp, matrix_hps, filter_eps=filter_eps)
309
310 CALL dbcsr_create(matrix_psp, template=ls_scf_env%matrix_s, matrix_type="N")
311 CALL dbcsr_multiply("N", "N", 1.0_dp, ls_scf_env%matrix_p(1), matrix_sp, &
312 0.0_dp, matrix_psp, filter_eps=filter_eps)
313
314 !---------------------------------------------------------------------------
315 ! M1 = dE_lnv / dP_pao
316 CALL dbcsr_create(matrix_m1, template=ls_scf_env%matrix_s, matrix_type="N")
317
318 CALL dbcsr_multiply("N", "T", 3.0_dp, ls_scf_env%matrix_ks(1), matrix_sp, &
319 1.0_dp, matrix_m1, filter_eps=filter_eps)
320
321 CALL dbcsr_multiply("N", "N", 3.0_dp, matrix_sp, ls_scf_env%matrix_ks(1), &
322 1.0_dp, matrix_m1, filter_eps=filter_eps)
323
324 CALL dbcsr_multiply("N", "T", -2.0_dp, matrix_hps, matrix_sp, &
325 1.0_dp, matrix_m1, filter_eps=filter_eps)
326
327 CALL dbcsr_multiply("N", "N", -2.0_dp, matrix_sp, matrix_hps, &
328 1.0_dp, matrix_m1, filter_eps=filter_eps)
329
330 CALL dbcsr_multiply("N", "T", -2.0_dp, matrix_sp, matrix_hps, &
331 1.0_dp, matrix_m1, filter_eps=filter_eps)
332
333 ! reverse possible molecular clustering
334 CALL dbcsr_create(matrix_m1_dc, &
335 template=matrix_s(1)%matrix, &
336 row_blk_size=pao_blk_sizes, &
337 col_blk_size=pao_blk_sizes)
338 CALL matrix_decluster(matrix_m1_dc, matrix_m1, ls_mstruct)
339
340 !---------------------------------------------------------------------------
341 ! M2 = dE_lnv / dH
342 CALL dbcsr_create(matrix_m2, template=ls_scf_env%matrix_s, matrix_type="N")
343
344 CALL dbcsr_add(matrix_m2, matrix_psp, 1.0_dp, 3.0_dp)
345
346 CALL dbcsr_multiply("N", "N", -2.0_dp, matrix_psp, matrix_sp, &
347 1.0_dp, matrix_m2, filter_eps=filter_eps)
348
349 ! reverse possible molecular clustering
350 CALL dbcsr_create(matrix_m2_dc, &
351 template=matrix_s(1)%matrix, &
352 row_blk_size=pao_blk_sizes, &
353 col_blk_size=pao_blk_sizes)
354 CALL matrix_decluster(matrix_m2_dc, matrix_m2, ls_mstruct)
355
356 !---------------------------------------------------------------------------
357 ! M3 = dE_lnv / dS
358 CALL dbcsr_create(matrix_m3, template=ls_scf_env%matrix_s, matrix_type="N")
359
360 CALL dbcsr_add(matrix_m3, matrix_php, 1.0_dp, 3.0_dp)
361
362 CALL dbcsr_multiply("N", "N", -2.0_dp, matrix_php, matrix_sp, &
363 1.0_dp, matrix_m3, filter_eps=filter_eps)
364
365 CALL dbcsr_multiply("N", "T", -2.0_dp, matrix_psp, matrix_ph, &
366 1.0_dp, matrix_m3, filter_eps=filter_eps)
367
368 ! reverse possible molecular clustering
369 CALL dbcsr_create(matrix_m3_dc, &
370 template=matrix_s(1)%matrix, &
371 row_blk_size=pao_blk_sizes, &
372 col_blk_size=pao_blk_sizes)
373 CALL matrix_decluster(matrix_m3_dc, matrix_m3, ls_mstruct)
374
375 !---------------------------------------------------------------------------
376 ! assemble Ma and Mb
377 ! matrix_Ma = dE_lnv / dA = P * A * M1
378 ! matrix_Mb = dE_lnv / dB = H * B * M2 + S * B * M3
379 CALL dbcsr_create(matrix_ma, template=ls_mstruct%matrix_A, matrix_type="N")
380 CALL dbcsr_reserve_diag_blocks(matrix_ma)
381 CALL dbcsr_create(matrix_mb, template=ls_mstruct%matrix_B, matrix_type="N")
382 CALL dbcsr_reserve_diag_blocks(matrix_mb)
383
384 !---------------------------------------------------------------------------
385 ! combine M1 with matrices from primary basis
386 CALL dbcsr_create(matrix_pa, template=ls_mstruct%matrix_A, matrix_type="N")
387 CALL dbcsr_multiply("N", "N", 1.0_dp, rho_ao(1)%matrix, ls_mstruct%matrix_A, &
388 0.0_dp, matrix_pa, filter_eps=filter_eps)
389
390 ! matrix_Ma = P * A * M1
391 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_pa, matrix_m1_dc, &
392 0.0_dp, matrix_ma, filter_eps=filter_eps)
393
394 !---------------------------------------------------------------------------
395 ! combine M2 with matrices from primary basis
396 CALL dbcsr_create(matrix_hb, template=ls_mstruct%matrix_B, matrix_type="N")
397 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_ks(1)%matrix, ls_mstruct%matrix_B, &
398 0.0_dp, matrix_hb, filter_eps=filter_eps)
399
400 ! matrix_Mb = H * B * M2
401 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_hb, matrix_m2_dc, &
402 0.0_dp, matrix_mb, filter_eps=filter_eps)
403
404 !---------------------------------------------------------------------------
405 ! combine M3 with matrices from primary basis
406 CALL dbcsr_create(matrix_sb, template=ls_mstruct%matrix_B, matrix_type="N")
407 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_s(1)%matrix, ls_mstruct%matrix_B, &
408 0.0_dp, matrix_sb, filter_eps=filter_eps)
409
410 IF (nspin == 1) CALL dbcsr_scale(matrix_sb, 0.5_dp)
411
412 ! matrix_Mb += S * B * M3
413 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_sb, matrix_m3_dc, &
414 1.0_dp, matrix_mb, filter_eps=filter_eps)
415
416 IF (nspin == 1) CALL dbcsr_scale(matrix_ma, 2.0_dp)
417 IF (nspin == 1) CALL dbcsr_scale(matrix_mb, 2.0_dp)
418
419 !---------------------------------------------------------------------------
420 ! cleanup: TODO release matrices as early as possible
421 CALL dbcsr_release(matrix_ph)
422 CALL dbcsr_release(matrix_php)
423 CALL dbcsr_release(matrix_sp)
424 CALL dbcsr_release(matrix_hps)
425 CALL dbcsr_release(matrix_psp)
426 CALL dbcsr_release(matrix_m)
427 CALL dbcsr_release(matrix_m1)
428 CALL dbcsr_release(matrix_m2)
429 CALL dbcsr_release(matrix_m3)
430 CALL dbcsr_release(matrix_m1_dc)
431 CALL dbcsr_release(matrix_m2_dc)
432 CALL dbcsr_release(matrix_m3_dc)
433 CALL dbcsr_release(matrix_pa)
434 CALL dbcsr_release(matrix_hb)
435 CALL dbcsr_release(matrix_sb)
436
437 CALL timestop(handle)
438 END SUBROUTINE pao_calc_grad_lnv_wrt_ab
439
440END MODULE pao_param_methods
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
various routines to log and control the output. The idea is that decisions about where to log should ...
Routines for a linear scaling quickstep SCF run based on the density matrix, with a focus on the inte...
subroutine, public matrix_decluster(matrix_out, matrix_in, ls_mstruct)
Reverses molecular blocking and reduction to single precision if enabled.
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Interface to the message passing library MPI.
Common routines for PAO parametrizations.
subroutine, public pao_calc_grad_lnv_wrt_u(qs_env, ls_scf_env, matrix_m_diag)
Helper routine, calculates partial derivative dE/dU.
subroutine, public pao_calc_ab_from_u(pao, qs_env, ls_scf_env, matrix_u_diag)
Takes current matrix_X and calculates the matrices A and B.
subroutine, public pao_calc_grad_lnv_wrt_ab(qs_env, ls_scf_env, matrix_ma, matrix_mb)
Helper routine, calculates partial derivative dE/dA and dE/dB. As energy functional serves the defini...
Types used by the PAO machinery.
Definition pao_types.F:12
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_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, 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, rhs)
Get the QUICKSTEP environment.
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...
keeps the density in various representations, keeping track of which ones are valid.