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
30 #include "./base/base_uses.f90"
36 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pao_param_methods'
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
53 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_grad_lnv_wrt_U'
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
62 CALL timeset(routinen, handle)
64 ls_mstruct => ls_scf_env%ls_mstruct
65 pao => ls_scf_env%pao_env
66 filter_eps = ls_scf_env%eps_filter
72 CALL dbcsr_create(matrix_m, template=matrix_s(1)%matrix, matrix_type=
"N")
73 CALL dbcsr_reserve_diag_blocks(matrix_m)
75 CALL dbcsr_create(matrix_nm, template=ls_mstruct%matrix_A, matrix_type=
"N")
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)
80 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, pao%matrix_N, matrix_mb, &
81 1.0_dp, matrix_nm, filter_eps=filter_eps)
83 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, matrix_nm, pao%matrix_Y, &
84 1.0_dp, matrix_m, filter_eps=filter_eps)
88 CALL dbcsr_create(matrix_m_diag, &
89 name=
"PAO matrix_M", &
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)
98 CALL dbcsr_release(matrix_m)
99 CALL dbcsr_release(matrix_ma)
100 CALL dbcsr_release(matrix_mb)
101 CALL dbcsr_release(matrix_nm)
103 CALL timestop(handle)
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
119 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_AB_from_U'
121 INTEGER :: acol, arow, handle, iatom
123 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_a, block_b, block_n, block_n_inv, &
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
130 CALL timeset(routinen, handle)
132 ls_mstruct => ls_scf_env%ls_mstruct
136 CALL pao_assert_unitary(pao, matrix_u_diag)
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)
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)
156 CALL dbcsr_get_block_p(matrix=pao%matrix_Y, row=iatom, col=iatom, block=block_y, found=found)
157 cpassert(
ASSOCIATED(block_y))
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))
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))
167 block_a = matmul(matmul(block_n_inv, block_u), block_y)
168 block_b = matmul(matmul(block_n, block_u), block_y)
171 CALL dbcsr_iterator_stop(iter)
174 CALL dbcsr_release(matrix_u)
176 CALL timestop(handle)
184 SUBROUTINE pao_assert_unitary(pao, matrix_U)
185 TYPE(pao_env_type),
POINTER :: pao
186 TYPE(dbcsr_type) :: matrix_u
188 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_assert_unitary'
190 INTEGER :: acol, arow, group_handle, handle, i, &
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
198 IF (pao%check_unitary_tol < 0.0_dp)
RETURN
200 CALL timeset(routinen, handle)
203 CALL dbcsr_get_info(pao%matrix_Y, row_blk_size=blk_sizes_pri, col_blk_size=blk_sizes_pao)
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)
212 m = blk_sizes_pao(iatom)
215 ALLOCATE (tmp1(n, m), tmp2(m, m))
216 tmp1 = block_test(:, 1:m)
217 tmp2 = matmul(transpose(tmp1), tmp1)
219 tmp2(i, i) = tmp2(i, i) - 1.0_dp
223 delta_max = max(delta_max, maxval(abs(tmp2)))
225 DEALLOCATE (tmp1, tmp2)
227 CALL dbcsr_iterator_stop(iter)
230 CALL dbcsr_get_info(matrix_u, group=group_handle)
231 CALL group%set_handle(group_handle)
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))
238 CALL timestop(handle)
239 END SUBROUTINE pao_assert_unitary
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
254 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_grad_lnv_wrt_AB'
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, &
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
268 CALL timeset(routinen, handle)
270 ls_mstruct => ls_scf_env%ls_mstruct
271 pao => ls_scf_env%pao_env
275 matrix_ks=matrix_ks, &
277 dft_control=dft_control)
279 nspin = dft_control%nspins
280 filter_eps = ls_scf_env%eps_filter
282 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=pao_blk_sizes)
284 IF (nspin /= 1) cpabort(
"open shell not yet implemented")
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)
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)
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)
304 IF (nspin == 1)
CALL dbcsr_scale(matrix_sp, 0.5_dp)
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)
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)
316 CALL dbcsr_create(matrix_m1, template=ls_scf_env%matrix_s, matrix_type=
"N")
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)
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)
324 CALL dbcsr_multiply(
"N",
"T", -2.0_dp, matrix_hps, matrix_sp, &
325 1.0_dp, matrix_m1, filter_eps=filter_eps)
327 CALL dbcsr_multiply(
"N",
"N", -2.0_dp, matrix_sp, matrix_hps, &
328 1.0_dp, matrix_m1, filter_eps=filter_eps)
330 CALL dbcsr_multiply(
"N",
"T", -2.0_dp, matrix_sp, matrix_hps, &
331 1.0_dp, matrix_m1, filter_eps=filter_eps)
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)
342 CALL dbcsr_create(matrix_m2, template=ls_scf_env%matrix_s, matrix_type=
"N")
344 CALL dbcsr_add(matrix_m2, matrix_psp, 1.0_dp, 3.0_dp)
346 CALL dbcsr_multiply(
"N",
"N", -2.0_dp, matrix_psp, matrix_sp, &
347 1.0_dp, matrix_m2, filter_eps=filter_eps)
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)
358 CALL dbcsr_create(matrix_m3, template=ls_scf_env%matrix_s, matrix_type=
"N")
360 CALL dbcsr_add(matrix_m3, matrix_php, 1.0_dp, 3.0_dp)
362 CALL dbcsr_multiply(
"N",
"N", -2.0_dp, matrix_php, matrix_sp, &
363 1.0_dp, matrix_m3, filter_eps=filter_eps)
365 CALL dbcsr_multiply(
"N",
"T", -2.0_dp, matrix_psp, matrix_ph, &
366 1.0_dp, matrix_m3, filter_eps=filter_eps)
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)
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)
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)
391 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_pa, matrix_m1_dc, &
392 0.0_dp, matrix_ma, filter_eps=filter_eps)
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)
401 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_hb, matrix_m2_dc, &
402 0.0_dp, matrix_mb, filter_eps=filter_eps)
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)
410 IF (nspin == 1)
CALL dbcsr_scale(matrix_sb, 0.5_dp)
413 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_sb, matrix_m3_dc, &
414 1.0_dp, matrix_mb, filter_eps=filter_eps)
416 IF (nspin == 1)
CALL dbcsr_scale(matrix_ma, 2.0_dp)
417 IF (nspin == 1)
CALL dbcsr_scale(matrix_mb, 2.0_dp)
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)
437 CALL timestop(handle)
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.
integer, parameter, public dp
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.
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...