32#include "./base/base_uses.f90"
38 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pao_param_equi'
52 IF (pao%precondition)
THEN
53 cpabort(
"PAO preconditioning not supported for selected parametrization.")
75 INTEGER,
INTENT(IN) :: ikind
76 INTEGER,
INTENT(OUT) :: nparams
78 INTEGER :: pao_basis_size, pri_basis_size
82 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
84 basis_set=basis_set, &
85 pao_basis_size=pao_basis_size)
86 pri_basis_size = basis_set%nsgf
88 nparams = pao_basis_size*pri_basis_size
101 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_param_initguess_equi'
103 INTEGER :: acol, arow, handle, i, iatom, m, n
104 INTEGER,
DIMENSION(:),
POINTER :: blk_sizes_pao, blk_sizes_pri
106 REAL(
dp),
DIMENSION(:),
POINTER :: h_evals
107 REAL(
dp),
DIMENSION(:, :),
POINTER :: a, block_h0, block_n, block_n_inv, &
108 block_x, h, h_evecs, v0
111 CALL timeset(routinen, handle)
113 CALL dbcsr_get_info(pao%matrix_Y, row_blk_size=blk_sizes_pri, col_blk_size=blk_sizes_pao)
121 iatom = arow; cpassert(arow == acol)
123 CALL dbcsr_get_block_p(matrix=pao%matrix_H0, row=iatom, col=iatom, block=block_h0, found=found)
124 CALL dbcsr_get_block_p(matrix=pao%matrix_N_diag, row=iatom, col=iatom, block=block_n, found=found)
125 CALL dbcsr_get_block_p(matrix=pao%matrix_N_inv_diag, row=iatom, col=iatom, block=block_n_inv, found=found)
126 cpassert(
ASSOCIATED(block_h0) .AND.
ASSOCIATED(block_n) .AND.
ASSOCIATED(block_n_inv))
128 n = blk_sizes_pri(iatom)
129 m = blk_sizes_pao(iatom)
136 h = matmul(matmul(block_n, block_h0 + v0), block_n)
139 ALLOCATE (h_evecs(n, n), h_evals(n))
145 a = matmul(block_n_inv, h_evecs(:, 1:m))
149 a(:, i) = a(:, i)/norm2(a(:, i))
152 block_x = reshape(a, [n*m, 1])
153 DEALLOCATE (h, v0, a, h_evecs, h_evals)
159 CALL timestop(handle)
175 LOGICAL,
INTENT(IN) :: gradient
176 REAL(
dp),
INTENT(INOUT),
OPTIONAL :: penalty
178 CHARACTER(len=*),
PARAMETER :: routinen =
'pao_calc_AB_equi'
180 INTEGER :: acol, arow, handle, i, iatom, j, k, m, n
182 REAL(
dp) :: denom, penalty_sum, w
183 REAL(
dp),
DIMENSION(:),
POINTER :: anna_evals
184 REAL(
dp),
DIMENSION(:, :),
POINTER :: anna, anna_evecs, anna_inv, block_a, &
185 block_b, block_g, block_ma, block_mb, &
186 block_n, block_x, d, g, m1, m2, m3, &
191 TYPE(
dbcsr_type) :: matrix_g_nondiag, matrix_ma, matrix_mb, &
196 CALL timeset(routinen, handle)
197 ls_mstruct => ls_scf_env%ls_mstruct
205 CALL dbcsr_get_info(matrix=matrix_s(1)%matrix, distribution=main_dist)
207 name=
"PAO matrix_X_nondiag", &
209 template=pao%matrix_X)
216 name=
"PAO matrix_G_nondiag", &
218 template=pao%matrix_G)
233 iatom = arow; cpassert(arow == acol)
234 CALL dbcsr_get_block_p(matrix=ls_mstruct%matrix_A, row=iatom, col=iatom, block=block_a, found=found)
235 cpassert(
ASSOCIATED(block_a))
236 CALL dbcsr_get_block_p(matrix=ls_mstruct%matrix_B, row=iatom, col=iatom, block=block_b, found=found)
237 cpassert(
ASSOCIATED(block_b))
238 CALL dbcsr_get_block_p(matrix=pao%matrix_N, row=iatom, col=iatom, block=block_n, found=found)
239 cpassert(
ASSOCIATED(block_n))
243 block_a = reshape(block_x, [n, m])
246 IF (
PRESENT(penalty))
THEN
248 w = 1.0_dp - sum(block_a(:, i)**2)
249 penalty_sum = penalty_sum + pao%penalty_strength*w**2
253 ALLOCATE (nn(n, n), anna(m, m))
254 nn = matmul(block_n, block_n)
255 anna = matmul(matmul(transpose(block_a), nn), block_a)
258 ALLOCATE (anna_evecs(m, m), anna_evals(m))
259 anna_evecs(:, :) = anna
261 IF (minval(abs(anna_evals)) < 1e-10_dp) cpabort(
"PAO basis singualar.")
264 ALLOCATE (anna_inv(m, m))
265 anna_inv(:, :) = 0.0_dp
267 w = 1.0_dp/anna_evals(k)
270 anna_inv(i, j) = anna_inv(i, j) + w*anna_evecs(i, k)*anna_evecs(j, k)
276 block_b = matmul(matmul(nn, block_a), anna_inv)
280 CALL dbcsr_get_block_p(matrix=matrix_g_nondiag, row=iatom, col=iatom, block=block_g, found=found)
281 cpassert(
ASSOCIATED(block_g))
282 CALL dbcsr_get_block_p(matrix=matrix_ma, row=iatom, col=iatom, block=block_ma, found=found)
283 CALL dbcsr_get_block_p(matrix=matrix_mb, row=iatom, col=iatom, block=block_mb, found=found)
289 IF (
PRESENT(penalty))
THEN
291 w = 1.0_dp - sum(block_a(:, i)**2)
292 g(:, i) = -4.0_dp*pao%penalty_strength*w*block_a(:, i)
296 IF (
ASSOCIATED(block_ma))
THEN
300 IF (
ASSOCIATED(block_mb))
THEN
301 g = g + matmul(matmul(nn, block_mb), anna_inv)
304 ALLOCATE (d(m, m), m1(m, m), m2(m, m), m3(m, m), m4(m, m), m5(m, m))
308 denom = anna_evals(i) - anna_evals(j)
310 d(i, i) = -1.0_dp/anna_evals(i)**2
311 ELSE IF (abs(denom) > 1e-10_dp)
THEN
312 d(i, j) = (1.0_dp/anna_evals(i) - 1.0_dp/anna_evals(j))/denom
319 m1 = matmul(matmul(transpose(block_a), nn), block_mb)
320 m2 = matmul(matmul(transpose(anna_evecs), m1), anna_evecs)
322 m4 = matmul(matmul(anna_evecs, m3), transpose(anna_evecs))
323 m5 = 0.5_dp*(m4 + transpose(m4))
324 g = g + 2.0_dp*matmul(matmul(nn, block_a), m5)
326 DEALLOCATE (d, m1, m2, m3, m4, m5)
329 block_g = reshape(g, [n*m, 1])
333 DEALLOCATE (nn, anna, anna_evecs, anna_evals, anna_inv)
339 IF (
PRESENT(penalty))
THEN
341 CALL group%sum(penalty_sum)
342 penalty = penalty_sum
354 CALL timestop(handle)
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_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_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Defines the basic variable types.
integer, parameter, public dp
Collection of simple mathematical functions and subroutines.
subroutine, public diamat_all(a, eigval, dac)
Diagonalize the symmetric n by n matrix a using the LAPACK library. Only the upper triangle of matrix...
Interface to the message passing library MPI.
Equivariant parametrization.
subroutine, public pao_param_count_equi(qs_env, ikind, nparams)
Returns the number of parameters for given atomic kind.
subroutine, public pao_param_finalize_equi()
Finalize equivariant parametrization.
subroutine, public pao_param_initguess_equi(pao, qs_env)
Fills matrix_X with an initial guess.
subroutine, public pao_param_init_equi(pao)
Initialize equivariant parametrization.
subroutine, public pao_calc_ab_equi(pao, qs_env, ls_scf_env, gradient, penalty)
Takes current matrix_X and calculates the matrices A and B.
Common routines for PAO parametrizations.
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...
Factory routines for potentials used e.g. by pao_param_exp and pao_ml.
subroutine, public pao_guess_initial_potential(qs_env, iatom, block_v)
Makes an educated guess for the initial potential based on positions of neighboring atoms.
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.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Provides all information about a quickstep kind.