31#include "./base/base_uses.f90"
37 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pao_param_methods'
54 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_grad_lnv_wrt_U'
57 REAL(kind=
dp) :: filter_eps
59 TYPE(
dbcsr_type) :: matrix_m, matrix_ma, matrix_mb, matrix_nm
63 CALL timeset(routinen, handle)
65 ls_mstruct => ls_scf_env%ls_mstruct
66 pao => ls_scf_env%pao_env
67 filter_eps = ls_scf_env%eps_filter
73 CALL dbcsr_create(matrix_m, template=matrix_s(1)%matrix, matrix_type=
"N")
76 CALL dbcsr_create(matrix_nm, template=ls_mstruct%matrix_A, matrix_type=
"N")
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)
82 1.0_dp, matrix_nm, filter_eps=filter_eps)
85 1.0_dp, matrix_m, filter_eps=filter_eps)
90 name=
"PAO matrix_M", &
92 dist=pao%diag_distribution, &
93 template=matrix_s(1)%matrix)
104 CALL timestop(handle)
120 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_AB_from_U'
122 INTEGER :: acol, arow, handle, iatom
124 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_a, block_b, block_n, block_n_inv, &
131 CALL timeset(routinen, handle)
133 ls_mstruct => ls_scf_env%ls_mstruct
137 CALL pao_assert_unitary(pao, matrix_u_diag)
142 CALL dbcsr_create(matrix_u, matrix_type=
"N", template=matrix_s(1)%matrix)
155 iatom = arow; cpassert(arow == acol)
157 CALL dbcsr_get_block_p(matrix=pao%matrix_Y, row=iatom, col=iatom, block=block_y, found=found)
158 cpassert(
ASSOCIATED(block_y))
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))
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))
168 block_a = matmul(matmul(block_n_inv, block_u), block_y)
169 block_b = matmul(matmul(block_n, block_u), block_y)
177 CALL timestop(handle)
185 SUBROUTINE pao_assert_unitary(pao, matrix_U)
189 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_assert_unitary'
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
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)
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)
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)
THEN
235 cpabort(
"Found bad unitaryness:"//
cp_to_string(delta_max))
238 CALL timestop(handle)
239 END SUBROUTINE pao_assert_unitary
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, &
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)
325 1.0_dp, matrix_m1, filter_eps=filter_eps)
328 1.0_dp, matrix_m1, filter_eps=filter_eps)
331 1.0_dp, matrix_m1, filter_eps=filter_eps)
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)
347 1.0_dp, matrix_m2, filter_eps=filter_eps)
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)
363 1.0_dp, matrix_m3, filter_eps=filter_eps)
366 1.0_dp, matrix_m3, filter_eps=filter_eps)
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")
381 CALL dbcsr_create(matrix_mb, template=ls_mstruct%matrix_B, matrix_type=
"N")
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)
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)
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)
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)
437 CALL timestop(handle)
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
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_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
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.
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, mimic, 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, sab_cneo, 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, matrix_vhxc, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
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.