(git:b279b6b)
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 ! **************************************************************************************************
13  USE cp_control_types, ONLY: dft_control_type
14  USE cp_log_handling, ONLY: cp_to_string
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
21  USE dm_ls_scf_types, ONLY: ls_mstruct_type,&
22  ls_scf_env_type
23  USE kinds, ONLY: dp
24  USE message_passing, ONLY: mp_comm_type
25  USE pao_types, ONLY: pao_env_type
26  USE qs_environment_types, ONLY: get_qs_env,&
27  qs_environment_type
28  USE qs_rho_types, ONLY: qs_rho_get,&
29  qs_rho_type
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 
40 CONTAINS
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 
440 END 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...
Definition: dm_ls_scf_qs.F:15
subroutine, public matrix_decluster(matrix_out, matrix_in, ls_mstruct)
Reverses molecular blocking and reduction to single precision if enabled.
Definition: dm_ls_scf_qs.F:374
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...
Definition: qs_rho_types.F:18
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...
Definition: qs_rho_types.F:229