(git:ed6f26b)
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-2025 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! **************************************************************************************************
14 USE cp_dbcsr_api, ONLY: &
24 USE kinds, ONLY: dp
26 USE pao_types, ONLY: pao_env_type
29 USE qs_rho_types, ONLY: qs_rho_get,&
31#include "./base/base_uses.f90"
32
33 IMPLICIT NONE
34
35 PRIVATE
36
37 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pao_param_methods'
38
40
41CONTAINS
42
43! **************************************************************************************************
44!> \brief Helper routine, calculates partial derivative dE/dU
45!> \param qs_env ...
46!> \param ls_scf_env ...
47!> \param matrix_M_diag the derivate wrt U, matrix uses pao%diag_distribution
48! **************************************************************************************************
49 SUBROUTINE pao_calc_grad_lnv_wrt_u(qs_env, ls_scf_env, matrix_M_diag)
50 TYPE(qs_environment_type), POINTER :: qs_env
51 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
52 TYPE(dbcsr_type) :: matrix_m_diag
53
54 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_grad_lnv_wrt_U'
55
56 INTEGER :: handle
57 REAL(kind=dp) :: filter_eps
58 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
59 TYPE(dbcsr_type) :: matrix_m, matrix_ma, matrix_mb, matrix_nm
60 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
61 TYPE(pao_env_type), POINTER :: pao
62
63 CALL timeset(routinen, handle)
64
65 ls_mstruct => ls_scf_env%ls_mstruct
66 pao => ls_scf_env%pao_env
67 filter_eps = ls_scf_env%eps_filter
68 CALL get_qs_env(qs_env, matrix_s=matrix_s)
69
70 CALL pao_calc_grad_lnv_wrt_ab(qs_env, ls_scf_env, matrix_ma, matrix_mb)
71
72 ! Calculation uses distr. of matrix_s, afterwards we redistribute to pao%diag_distribution.
73 CALL dbcsr_create(matrix_m, template=matrix_s(1)%matrix, matrix_type="N")
74 CALL dbcsr_reserve_diag_blocks(matrix_m)
75
76 CALL dbcsr_create(matrix_nm, template=ls_mstruct%matrix_A, matrix_type="N")
77
78 CALL dbcsr_multiply("N", "N", 1.0_dp, pao%matrix_N_inv, matrix_ma, &
79 1.0_dp, matrix_nm, filter_eps=filter_eps)
80
81 CALL dbcsr_multiply("N", "N", 1.0_dp, pao%matrix_N, matrix_mb, &
82 1.0_dp, matrix_nm, filter_eps=filter_eps)
83
84 CALL dbcsr_multiply("N", "T", 1.0_dp, matrix_nm, pao%matrix_Y, &
85 1.0_dp, matrix_m, filter_eps=filter_eps)
86
87 !---------------------------------------------------------------------------
88 ! redistribute using pao%diag_distribution
89 CALL dbcsr_create(matrix_m_diag, &
90 name="PAO matrix_M", &
91 matrix_type="N", &
92 dist=pao%diag_distribution, &
93 template=matrix_s(1)%matrix)
94 CALL dbcsr_reserve_diag_blocks(matrix_m_diag)
95 CALL dbcsr_complete_redistribute(matrix_m, matrix_m_diag)
96
97 !---------------------------------------------------------------------------
98 ! cleanup:
99 CALL dbcsr_release(matrix_m)
100 CALL dbcsr_release(matrix_ma)
101 CALL dbcsr_release(matrix_mb)
102 CALL dbcsr_release(matrix_nm)
103
104 CALL timestop(handle)
105 END SUBROUTINE pao_calc_grad_lnv_wrt_u
106
107! **************************************************************************************************
108!> \brief Takes current matrix_X and calculates the matrices A and B.
109!> \param pao ...
110!> \param qs_env ...
111!> \param ls_scf_env ...
112!> \param matrix_U_diag ...
113! **************************************************************************************************
114 SUBROUTINE pao_calc_ab_from_u(pao, qs_env, ls_scf_env, matrix_U_diag)
115 TYPE(pao_env_type), POINTER :: pao
116 TYPE(qs_environment_type), POINTER :: qs_env
117 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
118 TYPE(dbcsr_type) :: matrix_u_diag
119
120 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_AB_from_U'
121
122 INTEGER :: acol, arow, handle, iatom
123 LOGICAL :: found
124 REAL(dp), DIMENSION(:, :), POINTER :: block_a, block_b, block_n, block_n_inv, &
125 block_u, block_y
126 TYPE(dbcsr_iterator_type) :: iter
127 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s
128 TYPE(dbcsr_type) :: matrix_u
129 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
130
131 CALL timeset(routinen, handle)
132 CALL get_qs_env(qs_env, matrix_s=matrix_s)
133 ls_mstruct => ls_scf_env%ls_mstruct
134
135 ! --------------------------------------------------------------------------------------------
136 ! sanity check matrix U
137 CALL pao_assert_unitary(pao, matrix_u_diag)
138
139 ! --------------------------------------------------------------------------------------------
140 ! redistribute matrix_U_diag from diag_distribution to distribution of matrix_s
141 CALL get_qs_env(qs_env, matrix_s=matrix_s)
142 CALL dbcsr_create(matrix_u, matrix_type="N", template=matrix_s(1)%matrix)
143 CALL dbcsr_reserve_diag_blocks(matrix_u)
144 CALL dbcsr_complete_redistribute(matrix_u_diag, matrix_u)
145
146 ! --------------------------------------------------------------------------------------------
147 ! calculate matrix A and B from matrix U
148 ! Multiplying diagonal matrices is a local operation.
149 ! To take advantage of this we're using an iterator instead of calling dbcsr_multiply().
150!$OMP PARALLEL DEFAULT(NONE) SHARED(pao,ls_mstruct,matrix_U) &
151!$OMP PRIVATE(iter,arow,acol,iatom,block_U,block_Y,block_A,block_B,block_N,block_N_inv,found)
152 CALL dbcsr_iterator_start(iter, matrix_u)
153 DO WHILE (dbcsr_iterator_blocks_left(iter))
154 CALL dbcsr_iterator_next_block(iter, arow, acol, block_u)
155 iatom = arow; cpassert(arow == acol)
156
157 CALL dbcsr_get_block_p(matrix=pao%matrix_Y, row=iatom, col=iatom, block=block_y, found=found)
158 cpassert(ASSOCIATED(block_y))
159
160 CALL dbcsr_get_block_p(matrix=ls_mstruct%matrix_A, row=iatom, col=iatom, block=block_a, found=found)
161 CALL dbcsr_get_block_p(matrix=pao%matrix_N_inv, row=iatom, col=iatom, block=block_n_inv, found=found)
162 cpassert(ASSOCIATED(block_a) .AND. ASSOCIATED(block_n_inv))
163
164 CALL dbcsr_get_block_p(matrix=ls_mstruct%matrix_B, row=iatom, col=iatom, block=block_b, found=found)
165 CALL dbcsr_get_block_p(matrix=pao%matrix_N, row=iatom, col=iatom, block=block_n, found=found)
166 cpassert(ASSOCIATED(block_b) .AND. ASSOCIATED(block_n))
167
168 block_a = matmul(matmul(block_n_inv, block_u), block_y)
169 block_b = matmul(matmul(block_n, block_u), block_y)
170
171 END DO
172 CALL dbcsr_iterator_stop(iter)
173!$OMP END PARALLEL
174
175 CALL dbcsr_release(matrix_u)
176
177 CALL timestop(handle)
178 END SUBROUTINE pao_calc_ab_from_u
179
180! **************************************************************************************************
181!> \brief Debugging routine, check unitaryness of U
182!> \param pao ...
183!> \param matrix_U ...
184! **************************************************************************************************
185 SUBROUTINE pao_assert_unitary(pao, matrix_U)
186 TYPE(pao_env_type), POINTER :: pao
187 TYPE(dbcsr_type) :: matrix_u
188
189 CHARACTER(len=*), PARAMETER :: routinen = 'pao_assert_unitary'
190
191 INTEGER :: acol, arow, handle, i, 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)
231
232 CALL group%max(delta_max)
233 IF (pao%iw > 0) WRITE (pao%iw, *) 'PAO| checked unitaryness, max delta:', delta_max
234 IF (delta_max > pao%check_unitary_tol) &
235 cpabort("Found bad unitaryness:"//cp_to_string(delta_max))
236
237 CALL timestop(handle)
238 END SUBROUTINE pao_assert_unitary
239
240! **************************************************************************************************
241!> \brief Helper routine, calculates partial derivative dE/dA and dE/dB.
242!> As energy functional serves the definition by LNV (Li, Nunes, Vanderbilt).
243!> \param qs_env ...
244!> \param ls_scf_env ...
245!> \param matrix_Ma the derivate wrt A, matrix uses s_matrix-distribution.
246!> \param matrix_Mb the derivate wrt B, matrix uses s_matrix-distribution.
247! **************************************************************************************************
248 SUBROUTINE pao_calc_grad_lnv_wrt_ab(qs_env, ls_scf_env, matrix_Ma, matrix_Mb)
249 TYPE(qs_environment_type), POINTER :: qs_env
250 TYPE(ls_scf_env_type), TARGET :: ls_scf_env
251 TYPE(dbcsr_type) :: matrix_ma, matrix_mb
252
253 CHARACTER(len=*), PARAMETER :: routinen = 'pao_calc_grad_lnv_wrt_AB'
254
255 INTEGER :: handle, nspin
256 INTEGER, DIMENSION(:), POINTER :: pao_blk_sizes
257 REAL(kind=dp) :: filter_eps
258 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_ks, matrix_s, rho_ao
259 TYPE(dbcsr_type) :: matrix_hb, matrix_hps, matrix_m, matrix_m1, matrix_m1_dc, matrix_m2, &
260 matrix_m2_dc, matrix_m3, matrix_m3_dc, matrix_pa, matrix_ph, matrix_php, matrix_psp, &
261 matrix_sb, matrix_sp
262 TYPE(dft_control_type), POINTER :: dft_control
263 TYPE(ls_mstruct_type), POINTER :: ls_mstruct
264 TYPE(pao_env_type), POINTER :: pao
265 TYPE(qs_rho_type), POINTER :: rho
266
267 CALL timeset(routinen, handle)
268
269 ls_mstruct => ls_scf_env%ls_mstruct
270 pao => ls_scf_env%pao_env
271
272 CALL get_qs_env(qs_env, &
273 rho=rho, &
274 matrix_ks=matrix_ks, &
275 matrix_s=matrix_s, &
276 dft_control=dft_control)
277 CALL qs_rho_get(rho, rho_ao=rho_ao)
278 nspin = dft_control%nspins
279 filter_eps = ls_scf_env%eps_filter
280
281 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=pao_blk_sizes)
282
283 IF (nspin /= 1) cpabort("open shell not yet implemented")
284 !TODO: handle openshell case properly
285
286 ! Notation according to equation (4.6) on page 50 from:
287 ! https://dx.doi.org/10.3929%2Fethz-a-010819495
288
289 !---------------------------------------------------------------------------
290 ! calculate need products in pao basis
291 CALL dbcsr_create(matrix_ph, template=ls_scf_env%matrix_s, matrix_type="N")
292 CALL dbcsr_multiply("N", "N", 1.0_dp, ls_scf_env%matrix_p(1), ls_scf_env%matrix_ks(1), &
293 0.0_dp, matrix_ph, filter_eps=filter_eps)
294
295 CALL dbcsr_create(matrix_php, template=ls_scf_env%matrix_s, matrix_type="N")
296 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_ph, ls_scf_env%matrix_p(1), &
297 0.0_dp, matrix_php, filter_eps=filter_eps)
298
299 CALL dbcsr_create(matrix_sp, template=ls_scf_env%matrix_s, matrix_type="N")
300 CALL dbcsr_multiply("N", "N", 1.0_dp, ls_scf_env%matrix_s, ls_scf_env%matrix_p(1), &
301 0.0_dp, matrix_sp, filter_eps=filter_eps)
302
303 IF (nspin == 1) CALL dbcsr_scale(matrix_sp, 0.5_dp)
304
305 CALL dbcsr_create(matrix_hps, template=ls_scf_env%matrix_s, matrix_type="N")
306 CALL dbcsr_multiply("N", "T", 1.0_dp, ls_scf_env%matrix_ks(1), matrix_sp, &
307 0.0_dp, matrix_hps, filter_eps=filter_eps)
308
309 CALL dbcsr_create(matrix_psp, template=ls_scf_env%matrix_s, matrix_type="N")
310 CALL dbcsr_multiply("N", "N", 1.0_dp, ls_scf_env%matrix_p(1), matrix_sp, &
311 0.0_dp, matrix_psp, filter_eps=filter_eps)
312
313 !---------------------------------------------------------------------------
314 ! M1 = dE_lnv / dP_pao
315 CALL dbcsr_create(matrix_m1, template=ls_scf_env%matrix_s, matrix_type="N")
316
317 CALL dbcsr_multiply("N", "T", 3.0_dp, ls_scf_env%matrix_ks(1), matrix_sp, &
318 1.0_dp, matrix_m1, filter_eps=filter_eps)
319
320 CALL dbcsr_multiply("N", "N", 3.0_dp, matrix_sp, ls_scf_env%matrix_ks(1), &
321 1.0_dp, matrix_m1, filter_eps=filter_eps)
322
323 CALL dbcsr_multiply("N", "T", -2.0_dp, matrix_hps, matrix_sp, &
324 1.0_dp, matrix_m1, filter_eps=filter_eps)
325
326 CALL dbcsr_multiply("N", "N", -2.0_dp, matrix_sp, matrix_hps, &
327 1.0_dp, matrix_m1, filter_eps=filter_eps)
328
329 CALL dbcsr_multiply("N", "T", -2.0_dp, matrix_sp, matrix_hps, &
330 1.0_dp, matrix_m1, filter_eps=filter_eps)
331
332 ! reverse possible molecular clustering
333 CALL dbcsr_create(matrix_m1_dc, &
334 template=matrix_s(1)%matrix, &
335 row_blk_size=pao_blk_sizes, &
336 col_blk_size=pao_blk_sizes)
337 CALL matrix_decluster(matrix_m1_dc, matrix_m1, ls_mstruct)
338
339 !---------------------------------------------------------------------------
340 ! M2 = dE_lnv / dH
341 CALL dbcsr_create(matrix_m2, template=ls_scf_env%matrix_s, matrix_type="N")
342
343 CALL dbcsr_add(matrix_m2, matrix_psp, 1.0_dp, 3.0_dp)
344
345 CALL dbcsr_multiply("N", "N", -2.0_dp, matrix_psp, matrix_sp, &
346 1.0_dp, matrix_m2, filter_eps=filter_eps)
347
348 ! reverse possible molecular clustering
349 CALL dbcsr_create(matrix_m2_dc, &
350 template=matrix_s(1)%matrix, &
351 row_blk_size=pao_blk_sizes, &
352 col_blk_size=pao_blk_sizes)
353 CALL matrix_decluster(matrix_m2_dc, matrix_m2, ls_mstruct)
354
355 !---------------------------------------------------------------------------
356 ! M3 = dE_lnv / dS
357 CALL dbcsr_create(matrix_m3, template=ls_scf_env%matrix_s, matrix_type="N")
358
359 CALL dbcsr_add(matrix_m3, matrix_php, 1.0_dp, 3.0_dp)
360
361 CALL dbcsr_multiply("N", "N", -2.0_dp, matrix_php, matrix_sp, &
362 1.0_dp, matrix_m3, filter_eps=filter_eps)
363
364 CALL dbcsr_multiply("N", "T", -2.0_dp, matrix_psp, matrix_ph, &
365 1.0_dp, matrix_m3, filter_eps=filter_eps)
366
367 ! reverse possible molecular clustering
368 CALL dbcsr_create(matrix_m3_dc, &
369 template=matrix_s(1)%matrix, &
370 row_blk_size=pao_blk_sizes, &
371 col_blk_size=pao_blk_sizes)
372 CALL matrix_decluster(matrix_m3_dc, matrix_m3, ls_mstruct)
373
374 !---------------------------------------------------------------------------
375 ! assemble Ma and Mb
376 ! matrix_Ma = dE_lnv / dA = P * A * M1
377 ! matrix_Mb = dE_lnv / dB = H * B * M2 + S * B * M3
378 CALL dbcsr_create(matrix_ma, template=ls_mstruct%matrix_A, matrix_type="N")
379 CALL dbcsr_reserve_diag_blocks(matrix_ma)
380 CALL dbcsr_create(matrix_mb, template=ls_mstruct%matrix_B, matrix_type="N")
381 CALL dbcsr_reserve_diag_blocks(matrix_mb)
382
383 !---------------------------------------------------------------------------
384 ! combine M1 with matrices from primary basis
385 CALL dbcsr_create(matrix_pa, template=ls_mstruct%matrix_A, matrix_type="N")
386 CALL dbcsr_multiply("N", "N", 1.0_dp, rho_ao(1)%matrix, ls_mstruct%matrix_A, &
387 0.0_dp, matrix_pa, filter_eps=filter_eps)
388
389 ! matrix_Ma = P * A * M1
390 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_pa, matrix_m1_dc, &
391 0.0_dp, matrix_ma, filter_eps=filter_eps)
392
393 !---------------------------------------------------------------------------
394 ! combine M2 with matrices from primary basis
395 CALL dbcsr_create(matrix_hb, template=ls_mstruct%matrix_B, matrix_type="N")
396 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_ks(1)%matrix, ls_mstruct%matrix_B, &
397 0.0_dp, matrix_hb, filter_eps=filter_eps)
398
399 ! matrix_Mb = H * B * M2
400 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_hb, matrix_m2_dc, &
401 0.0_dp, matrix_mb, filter_eps=filter_eps)
402
403 !---------------------------------------------------------------------------
404 ! combine M3 with matrices from primary basis
405 CALL dbcsr_create(matrix_sb, template=ls_mstruct%matrix_B, matrix_type="N")
406 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_s(1)%matrix, ls_mstruct%matrix_B, &
407 0.0_dp, matrix_sb, filter_eps=filter_eps)
408
409 IF (nspin == 1) CALL dbcsr_scale(matrix_sb, 0.5_dp)
410
411 ! matrix_Mb += S * B * M3
412 CALL dbcsr_multiply("N", "N", 1.0_dp, matrix_sb, matrix_m3_dc, &
413 1.0_dp, matrix_mb, filter_eps=filter_eps)
414
415 IF (nspin == 1) CALL dbcsr_scale(matrix_ma, 2.0_dp)
416 IF (nspin == 1) CALL dbcsr_scale(matrix_mb, 2.0_dp)
417
418 !---------------------------------------------------------------------------
419 ! cleanup: TODO release matrices as early as possible
420 CALL dbcsr_release(matrix_ph)
421 CALL dbcsr_release(matrix_php)
422 CALL dbcsr_release(matrix_sp)
423 CALL dbcsr_release(matrix_hps)
424 CALL dbcsr_release(matrix_psp)
425 CALL dbcsr_release(matrix_m)
426 CALL dbcsr_release(matrix_m1)
427 CALL dbcsr_release(matrix_m2)
428 CALL dbcsr_release(matrix_m3)
429 CALL dbcsr_release(matrix_m1_dc)
430 CALL dbcsr_release(matrix_m2_dc)
431 CALL dbcsr_release(matrix_m3_dc)
432 CALL dbcsr_release(matrix_pa)
433 CALL dbcsr_release(matrix_hb)
434 CALL dbcsr_release(matrix_sb)
435
436 CALL timestop(handle)
437 END SUBROUTINE pao_calc_grad_lnv_wrt_ab
438
439END MODULE pao_param_methods
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_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
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_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.
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.