40#include "./base/base_uses.f90"
47 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'admm_dm_methods'
59 CHARACTER(len=*),
PARAMETER :: routinen =
'admm_dm_calc_rho_aux'
65 CALL timeset(routinen, handle)
68 SELECT CASE (admm_dm%method)
70 CALL map_dm_projection(qs_env)
73 CALL map_dm_blocked(qs_env)
76 cpabort(
"admm_dm_calc_rho_aux: unknown method")
82 CALL update_rho_aux(qs_env)
95 CHARACTER(LEN=*),
PARAMETER :: routinen =
'admm_dm_merge_ks_matrix'
99 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_merge
101 CALL timeset(routinen, handle)
102 NULLIFY (admm_dm, matrix_ks_merge)
106 IF (admm_dm%purify)
THEN
107 CALL revert_purify_mcweeny(qs_env, matrix_ks_merge)
109 CALL get_admm_env(qs_env%admm_env, matrix_ks_aux_fit=matrix_ks_merge)
112 SELECT CASE (admm_dm%method)
114 CALL merge_dm_projection(qs_env, matrix_ks_merge)
117 CALL merge_dm_blocked(qs_env, matrix_ks_merge)
120 cpabort(
"admm_dm_merge_ks_matrix: unknown method")
123 IF (admm_dm%purify) &
126 CALL timestop(handle)
135 SUBROUTINE map_dm_projection(qs_env)
139 LOGICAL :: s_mstruct_changed
140 REAL(kind=
dp) :: threshold
142 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux, matrix_s_mixed, rho_ao, &
144 TYPE(
dbcsr_type) :: matrix_s_aux_inv, matrix_tmp
148 NULLIFY (dft_control, admm_dm, matrix_s_aux, matrix_s_mixed, rho, rho_aux)
149 NULLIFY (rho_ao, rho_ao_aux)
151 CALL get_qs_env(qs_env, dft_control=dft_control, s_mstruct_changed=s_mstruct_changed, rho=rho)
152 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux, rho_aux_fit=rho_aux, &
153 matrix_s_aux_fit_vs_orb=matrix_s_mixed, admm_dm=admm_dm)
158 IF (s_mstruct_changed)
THEN
160 CALL dbcsr_create(matrix_s_aux_inv, template=matrix_s_aux(1)%matrix, matrix_type=
"N")
161 threshold = max(admm_dm%eps_filter, 1.0e-12_dp)
164 IF (.NOT.
ASSOCIATED(admm_dm%matrix_A))
THEN
165 ALLOCATE (admm_dm%matrix_A)
166 CALL dbcsr_create(admm_dm%matrix_A, template=matrix_s_mixed(1)%matrix, matrix_type=
"N")
168 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_s_aux_inv, matrix_s_mixed(1)%matrix, &
169 0.0_dp, admm_dm%matrix_A)
174 CALL dbcsr_create(matrix_tmp, template=admm_dm%matrix_A)
175 DO ispin = 1, dft_control%nspins
176 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, admm_dm%matrix_A, rho_ao(ispin)%matrix, &
178 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, matrix_tmp, admm_dm%matrix_A, &
179 0.0_dp, rho_ao_aux(ispin)%matrix)
183 END SUBROUTINE map_dm_projection
190 SUBROUTINE map_dm_blocked(qs_env)
193 INTEGER :: iatom, ispin, jatom
195 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block, sparse_block_aux
198 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao, rho_ao_aux
202 NULLIFY (dft_control, admm_dm, rho, rho_aux, rho_ao, rho_ao_aux)
204 CALL get_qs_env(qs_env, dft_control=dft_control, rho=rho)
205 CALL get_admm_env(qs_env%admm_env, rho_aux_fit=rho_aux, admm_dm=admm_dm)
211 DO ispin = 1, dft_control%nspins
212 CALL dbcsr_set(rho_ao_aux(ispin)%matrix, 0.0_dp)
217 IF (admm_dm%block_map(iatom, jatom) == 1)
THEN
219 row=iatom, col=jatom, block=sparse_block_aux, found=found)
221 sparse_block_aux = sparse_block
227 END SUBROUTINE map_dm_blocked
233 SUBROUTINE update_rho_aux(qs_env)
237 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r_aux
247 NULLIFY (dft_control, admm_dm, rho_aux, rho_ao_aux, rho_r_aux, rho_g_aux, tot_rho_r_aux, &
248 task_list_aux_fit, ks_env)
250 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control)
251 CALL get_admm_env(qs_env%admm_env, task_list_aux_fit=task_list_aux_fit, rho_aux_fit=rho_aux, &
258 tot_rho_r=tot_rho_r_aux)
260 DO ispin = 1, dft_control%nspins
262 matrix_p=rho_ao_aux(ispin)%matrix, &
263 rho=rho_r_aux(ispin), &
264 rho_gspace=rho_g_aux(ispin), &
265 total_rho=tot_rho_r_aux(ispin), &
266 soft_valid=.false., &
267 basis_type=
"AUX_FIT", &
268 task_list_external=task_list_aux_fit)
271 CALL qs_rho_set(rho_aux, rho_r_valid=.true., rho_g_valid=.true.)
273 END SUBROUTINE update_rho_aux
281 SUBROUTINE merge_dm_projection(qs_env, matrix_ks_merge)
283 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_merge
291 NULLIFY (admm_dm, dft_control, matrix_ks)
293 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_ks=matrix_ks)
297 CALL dbcsr_create(matrix_tmp, template=admm_dm%matrix_A, matrix_type=
"N")
299 DO ispin = 1, dft_control%nspins
300 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_ks_merge(ispin)%matrix, admm_dm%matrix_A, &
302 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, admm_dm%matrix_A, matrix_tmp, &
303 1.0_dp, matrix_ks(ispin)%matrix)
308 END SUBROUTINE merge_dm_projection
316 SUBROUTINE merge_dm_blocked(qs_env, matrix_ks_merge)
318 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_merge
320 INTEGER :: iatom, ispin, jatom
321 REAL(
dp),
DIMENSION(:, :),
POINTER :: sparse_block
327 NULLIFY (admm_dm, dft_control, matrix_ks)
329 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_ks=matrix_ks)
332 DO ispin = 1, dft_control%nspins
336 IF (admm_dm%block_map(iatom, jatom) == 0) &
337 sparse_block = 0.0_dp
340 CALL dbcsr_add(matrix_ks(ispin)%matrix, matrix_ks_merge(ispin)%matrix, 1.0_dp, 1.0_dp)
343 END SUBROUTINE merge_dm_blocked
353 CHARACTER(LEN=*),
PARAMETER :: routinen =
'purify_mcweeny'
355 INTEGER :: handle, ispin, istep, nspins, unit_nr
356 REAL(kind=
dp) :: frob_norm
358 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s_aux_fit, rho_ao_aux
359 TYPE(
dbcsr_type) :: matrix_ps, matrix_psp, matrix_test
360 TYPE(
dbcsr_type),
POINTER :: matrix_p, matrix_s
365 CALL timeset(routinen, handle)
366 NULLIFY (dft_control, admm_dm, matrix_s_aux_fit, rho_aux_fit, new_hist_entry, &
367 matrix_p, matrix_s, rho_ao_aux)
370 CALL get_qs_env(qs_env, dft_control=dft_control)
371 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit, &
372 rho_aux_fit=rho_aux_fit, admm_dm=admm_dm)
374 CALL qs_rho_get(rho_aux_fit, rho_ao=rho_ao_aux)
376 matrix_p => rho_ao_aux(1)%matrix
377 CALL dbcsr_create(matrix_ps, template=matrix_p, matrix_type=
"N")
378 CALL dbcsr_create(matrix_psp, template=matrix_p, matrix_type=
"S")
379 CALL dbcsr_create(matrix_test, template=matrix_p, matrix_type=
"S")
381 nspins = dft_control%nspins
383 matrix_p => rho_ao_aux(ispin)%matrix
384 matrix_s => matrix_s_aux_fit(1)%matrix
385 history => admm_dm%mcweeny_history(ispin)%p
386 IF (
ASSOCIATED(history)) cpabort(
"purify_dm_mcweeny: history already associated")
387 IF (nspins == 1)
CALL dbcsr_scale(matrix_p, 0.5_dp)
389 DO istep = 1, admm_dm%mcweeny_max_steps
391 ALLOCATE (new_hist_entry)
392 new_hist_entry%next => history
393 history => new_hist_entry
394 history%count = istep
395 NULLIFY (new_hist_entry)
396 CALL dbcsr_create(history%m, template=matrix_p, matrix_type=
"N")
397 CALL dbcsr_copy(history%m, matrix_p, name=
"P from McWeeny")
408 CALL dbcsr_add(matrix_test, matrix_p, 1.0_dp, -1.0_dp)
410 IF (unit_nr > 0)
WRITE (unit_nr,
'(t3,a,i5,a,f16.8)')
"McWeeny-Step", istep, &
411 ": Deviation of idempotency", frob_norm
412 IF (frob_norm < 1000_dp*admm_dm%eps_filter .AND. istep > 1)
EXIT
415 CALL dbcsr_copy(matrix_p, matrix_psp, name=
"P from McWeeny")
419 admm_dm%mcweeny_history(ispin)%p => history
420 IF (nspins == 1)
CALL dbcsr_scale(matrix_p, 2.0_dp)
427 CALL timestop(handle)
436 SUBROUTINE revert_purify_mcweeny(qs_env, matrix_ks_merge)
438 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_merge
440 CHARACTER(LEN=*),
PARAMETER :: routinen =
'revert_purify_mcweeny'
442 INTEGER :: handle, ispin, nspins, unit_nr
444 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_aux_fit, &
446 matrix_s_aux_fit_vs_orb
451 CALL timeset(routinen, handle)
453 NULLIFY (admm_dm, dft_control, matrix_ks, matrix_ks_aux_fit, &
454 matrix_s_aux_fit, matrix_s_aux_fit_vs_orb, &
455 history_next, history_curr, matrix_k)
457 CALL get_qs_env(qs_env, dft_control=dft_control, matrix_ks=matrix_ks)
458 CALL get_admm_env(qs_env%admm_env, matrix_s_aux_fit=matrix_s_aux_fit, admm_dm=admm_dm, &
459 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb, matrix_ks_aux_fit=matrix_ks_aux_fit)
461 nspins = dft_control%nspins
462 ALLOCATE (matrix_ks_merge(nspins))
465 ALLOCATE (matrix_ks_merge(ispin)%matrix)
466 matrix_k => matrix_ks_merge(ispin)%matrix
467 CALL dbcsr_copy(matrix_k, matrix_ks_aux_fit(ispin)%matrix, name=
"K")
468 history_curr => admm_dm%mcweeny_history(ispin)%p
469 NULLIFY (admm_dm%mcweeny_history(ispin)%p)
472 DO WHILE (
ASSOCIATED(history_curr))
473 IF (unit_nr > 0)
WRITE (unit_nr,
'(t3,a,i5)')
"Reverse McWeeny-Step ", history_curr%count
474 CALL reverse_mcweeny_step(matrix_k=matrix_k, &
475 matrix_s=matrix_s_aux_fit(1)%matrix, &
476 matrix_p=history_curr%m)
478 history_next => history_curr%next
479 DEALLOCATE (history_curr)
480 history_curr => history_next
481 NULLIFY (history_next)
487 CALL timestop(handle)
489 END SUBROUTINE revert_purify_mcweeny
498 SUBROUTINE reverse_mcweeny_step(matrix_k, matrix_s, matrix_p)
499 TYPE(
dbcsr_type) :: matrix_k, matrix_s, matrix_p
501 CHARACTER(LEN=*),
PARAMETER :: routinen =
'reverse_mcweeny_step'
504 TYPE(
dbcsr_type) :: matrix_ps, matrix_sp, matrix_sum, &
507 CALL timeset(routinen, handle)
508 CALL dbcsr_create(matrix_ps, template=matrix_p, matrix_type=
"N")
509 CALL dbcsr_create(matrix_sp, template=matrix_p, matrix_type=
"N")
510 CALL dbcsr_create(matrix_tmp, template=matrix_p, matrix_type=
"N")
511 CALL dbcsr_create(matrix_sum, template=matrix_p, matrix_type=
"N")
539 CALL dbcsr_copy(matrix_k, matrix_sum, name=
"K from reverse McWeeny")
546 CALL timestop(handle)
547 END SUBROUTINE reverse_mcweeny_step
Contains ADMM methods which only require the density matrix.
subroutine, public admm_dm_merge_ks_matrix(qs_env)
Entry methods: Merges auxiliary Kohn-Sham matrix into primary one.
subroutine, public admm_dm_calc_rho_aux(qs_env)
Entry methods: Calculates auxiliary density matrix from primary one.
Types and set/get functions for auxiliary density matrix methods.
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
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_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
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_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(dp) function, public dbcsr_frobenius_norm(matrix)
Compute the frobenius norm of a dbcsr matrix.
DBCSR operations in CP2K.
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
Routines useful for iterative matrix calculations.
subroutine, public invert_hotelling(matrix_inverse, matrix, threshold, use_inv_as_guess, norm_convergence, filter_eps, accelerator_order, max_iter_lanczos, eps_lanczos, silent)
invert a symmetric positive definite matrix by Hotelling's method explicit symmetrization makes this ...
Defines the basic variable types.
integer, parameter, public dp
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
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_set(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)
...
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...
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.