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) &
235 cpabort(
"Found bad unitaryness:"//
cp_to_string(delta_max))
237 CALL timestop(handle)
238 END SUBROUTINE pao_assert_unitary
253 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_grad_lnv_wrt_AB'
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, &
267 CALL timeset(routinen, handle)
269 ls_mstruct => ls_scf_env%ls_mstruct
270 pao => ls_scf_env%pao_env
274 matrix_ks=matrix_ks, &
276 dft_control=dft_control)
278 nspin = dft_control%nspins
279 filter_eps = ls_scf_env%eps_filter
281 CALL dbcsr_get_info(ls_mstruct%matrix_A, col_blk_size=pao_blk_sizes)
283 IF (nspin /= 1) cpabort(
"open shell not yet implemented")
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)
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)
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)
303 IF (nspin == 1)
CALL dbcsr_scale(matrix_sp, 0.5_dp)
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)
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)
315 CALL dbcsr_create(matrix_m1, template=ls_scf_env%matrix_s, matrix_type=
"N")
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)
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)
324 1.0_dp, matrix_m1, filter_eps=filter_eps)
327 1.0_dp, matrix_m1, filter_eps=filter_eps)
330 1.0_dp, matrix_m1, filter_eps=filter_eps)
334 template=matrix_s(1)%matrix, &
335 row_blk_size=pao_blk_sizes, &
336 col_blk_size=pao_blk_sizes)
341 CALL dbcsr_create(matrix_m2, template=ls_scf_env%matrix_s, matrix_type=
"N")
343 CALL dbcsr_add(matrix_m2, matrix_psp, 1.0_dp, 3.0_dp)
346 1.0_dp, matrix_m2, filter_eps=filter_eps)
350 template=matrix_s(1)%matrix, &
351 row_blk_size=pao_blk_sizes, &
352 col_blk_size=pao_blk_sizes)
357 CALL dbcsr_create(matrix_m3, template=ls_scf_env%matrix_s, matrix_type=
"N")
359 CALL dbcsr_add(matrix_m3, matrix_php, 1.0_dp, 3.0_dp)
362 1.0_dp, matrix_m3, filter_eps=filter_eps)
365 1.0_dp, matrix_m3, filter_eps=filter_eps)
369 template=matrix_s(1)%matrix, &
370 row_blk_size=pao_blk_sizes, &
371 col_blk_size=pao_blk_sizes)
378 CALL dbcsr_create(matrix_ma, template=ls_mstruct%matrix_A, matrix_type=
"N")
380 CALL dbcsr_create(matrix_mb, template=ls_mstruct%matrix_B, matrix_type=
"N")
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)
391 0.0_dp, matrix_ma, filter_eps=filter_eps)
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)
401 0.0_dp, matrix_mb, filter_eps=filter_eps)
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)
409 IF (nspin == 1)
CALL dbcsr_scale(matrix_sb, 0.5_dp)
413 1.0_dp, matrix_mb, filter_eps=filter_eps)
415 IF (nspin == 1)
CALL dbcsr_scale(matrix_ma, 2.0_dp)
416 IF (nspin == 1)
CALL dbcsr_scale(matrix_mb, 2.0_dp)
436 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)
...
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.
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_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.