81#include "../base/base_uses.f90"
87 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'rt_propagation_methods'
111 CHARACTER(len=*),
PARAMETER :: routinen =
'propagation_step'
113 INTEGER :: aspc_order, handle, i, im, re, unit_nr
115 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: delta_mos, mos_new
117 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: delta_p, h_last_iter, ks_mix, ks_mix_im, &
118 matrix_ks, matrix_ks_im, matrix_s, &
122 CALL timeset(routinen, handle)
125 IF (logger%para_env%is_source())
THEN
131 NULLIFY (cell, delta_p, rho_new, delta_mos, mos_new)
132 NULLIFY (ks_mix, ks_mix_im)
134 CALL get_qs_env(qs_env, cell=cell, matrix_s=matrix_s, dft_control=dft_control)
136 IF (rtp%iter == 1)
THEN
139 IF (rtp_control%fixed_ions)
CALL set_ks_env(qs_env%ks_env, s_mstruct_changed=.false.)
144 IF (dft_control%apply_efield_field)
THEN
145 IF (any(cell%perd(1:3) /= 0)) &
146 cpabort(
"Length gauge (efield) and periodicity are not compatible")
148 ELSE IF (rtp_control%velocity_gauge)
THEN
149 IF (dft_control%apply_vector_potential) &
155 IF (.NOT. rtp_control%fixed_ions)
THEN
158 rtp%delta_iter = 100.0_dp
159 rtp%mixing_factor = 1.0_dp
161 aspc_order = rtp_control%aspc_order
162 CALL aspc_extrapolate(rtp, matrix_s, aspc_order)
163 IF (rtp%linear_scaling)
THEN
170 IF (.NOT. rtp_control%fixed_ions)
THEN
173 rtp%converged = .false.
175 IF (rtp%linear_scaling)
THEN
177 CALL get_rtp(rtp=rtp, rho_new=rho_new)
180 DO i = 1,
SIZE(rho_new)
182 CALL dbcsr_create(delta_p(i)%matrix, template=rho_new(i)%matrix)
183 CALL dbcsr_copy(delta_p(i)%matrix, rho_new(i)%matrix)
187 CALL get_rtp(rtp=rtp, mos_new=mos_new)
188 ALLOCATE (delta_mos(
SIZE(mos_new)))
189 DO i = 1,
SIZE(mos_new)
191 matrix_struct=mos_new(i)%matrix_struct, &
198 matrix_ks=matrix_ks, &
199 matrix_ks_im=matrix_ks_im)
201 CALL get_rtp(rtp=rtp, h_last_iter=h_last_iter)
203 IF (unit_nr > 0)
THEN
204 WRITE (unit_nr,
'(t3,a,2f16.8)')
"Mixing the Hamiltonians to improve robustness, mixing factor: ", rtp%mixing_factor
208 DO i = 1,
SIZE(matrix_ks)
210 CALL dbcsr_create(ks_mix(i)%matrix, template=matrix_ks(1)%matrix)
212 CALL dbcsr_create(ks_mix_im(i)%matrix, template=matrix_ks(1)%matrix, matrix_type=dbcsr_type_antisymmetric)
214 DO i = 1,
SIZE(matrix_ks)
217 CALL dbcsr_add(ks_mix(i)%matrix, matrix_ks(i)%matrix, 0.0_dp, rtp%mixing_factor)
218 CALL dbcsr_add(ks_mix(i)%matrix, h_last_iter(re)%matrix, 1.0_dp, 1.0_dp - rtp%mixing_factor)
219 IF (rtp%propagate_complex_ks)
THEN
220 CALL dbcsr_add(ks_mix_im(i)%matrix, matrix_ks_im(i)%matrix, 0.0_dp, rtp%mixing_factor)
221 CALL dbcsr_add(ks_mix_im(i)%matrix, h_last_iter(im)%matrix, 1.0_dp, 1.0_dp - rtp%mixing_factor)
224 CALL calc_sinvh(rtp, ks_mix, ks_mix_im, rtp_control)
225 DO i = 1,
SIZE(matrix_ks)
228 CALL dbcsr_copy(h_last_iter(re)%matrix, ks_mix(i)%matrix)
229 IF (rtp%propagate_complex_ks)
THEN
230 CALL dbcsr_copy(h_last_iter(im)%matrix, ks_mix_im(i)%matrix)
236 CALL calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
237 DO i = 1,
SIZE(matrix_ks)
240 CALL dbcsr_copy(h_last_iter(re)%matrix, matrix_ks(i)%matrix)
241 IF (rtp%propagate_complex_ks)
THEN
242 CALL dbcsr_copy(h_last_iter(im)%matrix, matrix_ks_im(i)%matrix)
247 CALL compute_propagator_matrix(rtp, rtp_control%propagator)
249 SELECT CASE (rtp_control%mat_exp)
251 IF (rtp%linear_scaling)
THEN
265 CALL step_finalize(qs_env, rtp_control, delta_mos, delta_p)
266 IF (rtp%linear_scaling)
THEN
272 CALL timestop(handle)
288 SUBROUTINE step_finalize(qs_env, rtp_control, delta_mos, delta_P)
291 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: delta_mos
294 CHARACTER(len=*),
PARAMETER :: routinen =
'step_finalize'
296 INTEGER :: handle, i, ihist
297 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos_new, mos_old
298 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: exp_h_new, exp_h_old, matrix_ks, &
299 matrix_ks_im, rho_new, rho_old, s_mat
303 CALL timeset(routinen, handle)
305 CALL get_qs_env(qs_env=qs_env, rtp=rtp, matrix_s=s_mat, &
306 matrix_ks=matrix_ks, matrix_ks_im=matrix_ks_im, energy=energy)
307 CALL get_rtp(rtp=rtp, exp_h_old=exp_h_old, exp_h_new=exp_h_new)
309 IF (rtp_control%sc_check_start .LT. rtp%iter)
THEN
310 rtp%delta_iter_old = rtp%delta_iter
311 IF (rtp%linear_scaling)
THEN
314 CALL rt_convergence(rtp, s_mat(1)%matrix, delta_mos, rtp%delta_iter)
316 rtp%converged = (rtp%delta_iter .LT. rtp_control%eps_ener)
321 IF (rtp_control%sc_check_start .LT. rtp%iter + 1)
THEN
322 IF (rtp%delta_iter/rtp%delta_iter_old > 0.9)
THEN
323 rtp%mixing_factor = max(rtp%mixing_factor/2.0_dp, 0.125_dp)
329 IF (rtp%converged)
THEN
330 IF (rtp%linear_scaling)
THEN
331 CALL get_rtp(rtp=rtp, rho_old=rho_old, rho_new=rho_new)
332 CALL purify_mcweeny_complex_nonorth(rho_new, s_mat, rtp%filter_eps, rtp%filter_eps_small, &
333 rtp_control%mcweeny_max_iter, rtp_control%mcweeny_eps)
336 DO i = 1,
SIZE(rho_new)
337 CALL dbcsr_copy(rho_old(i)%matrix, rho_new(i)%matrix)
340 CALL get_rtp(rtp=rtp, mos_old=mos_old, mos_new=mos_new)
341 DO i = 1,
SIZE(mos_new)
345 IF (rtp_control%propagator ==
do_em)
CALL calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
346 DO i = 1,
SIZE(exp_h_new)
347 CALL dbcsr_copy(exp_h_old(i)%matrix, exp_h_new(i)%matrix)
349 ihist = mod(rtp%istep, rtp_control%aspc_order) + 1
350 IF (rtp_control%fixed_ions)
THEN
357 rtp%energy_new = energy%total
359 CALL timestop(handle)
361 END SUBROUTINE step_finalize
370 SUBROUTINE compute_propagator_matrix(rtp, propagator)
372 INTEGER :: propagator
374 CHARACTER(len=*),
PARAMETER :: routinen =
'compute_propagator_matrix'
377 REAL(kind=
dp) :: dt, prefac
378 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: exp_h_new, exp_h_old, propagator_matrix
380 CALL timeset(routinen, handle)
381 CALL get_rtp(rtp=rtp, exp_h_new=exp_h_new, exp_h_old=exp_h_old, &
382 propagator_matrix=propagator_matrix, dt=dt)
386 DO i = 1,
SIZE(exp_h_new)
387 CALL dbcsr_add(propagator_matrix(i)%matrix, exp_h_new(i)%matrix, 0.0_dp, prefac)
388 IF (propagator ==
do_em) &
389 CALL dbcsr_add(propagator_matrix(i)%matrix, exp_h_old(i)%matrix, 1.0_dp, prefac)
392 CALL timestop(handle)
394 END SUBROUTINE compute_propagator_matrix
406 SUBROUTINE calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
408 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_im
411 CHARACTER(len=*),
PARAMETER :: routinen =
'calc_SinvH'
412 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
414 INTEGER :: handle, im, ispin, re
415 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: exp_h, sinvb, sinvh, sinvh_imag
419 CALL timeset(routinen, handle)
420 CALL get_rtp(rtp=rtp, s_inv=s_inv, exp_h_new=exp_h)
421 DO ispin = 1,
SIZE(matrix_ks)
427 CALL dbcsr_create(matrix_ks_nosym, template=matrix_ks(1)%matrix, matrix_type=
"N")
430 DO ispin = 1,
SIZE(matrix_ks)
434 CALL dbcsr_multiply(
"N",
"N", one, s_inv, matrix_ks_nosym, zero, exp_h(im)%matrix, &
435 filter_eps=rtp%filter_eps)
436 IF (.NOT. rtp_control%fixed_ions)
THEN
437 CALL get_rtp(rtp=rtp, sinvh=sinvh)
438 CALL dbcsr_copy(sinvh(ispin)%matrix, exp_h(im)%matrix)
443 IF (rtp%propagate_complex_ks)
THEN
444 DO ispin = 1,
SIZE(matrix_ks)
450 CALL dbcsr_multiply(
"N",
"N", -one, s_inv, matrix_ks_nosym, zero, exp_h(re)%matrix, &
451 filter_eps=rtp%filter_eps)
452 IF (.NOT. rtp_control%fixed_ions)
THEN
453 CALL get_rtp(rtp=rtp, sinvh_imag=sinvh_imag)
455 CALL dbcsr_copy(sinvh_imag(ispin)%matrix, exp_h(re)%matrix)
460 IF (.NOT. rtp_control%fixed_ions)
THEN
461 CALL get_rtp(rtp=rtp, b_mat=b_mat, sinvb=sinvb)
463 CALL dbcsr_multiply(
"N",
"N", one, s_inv, b_mat, zero, matrix_ks_nosym, filter_eps=rtp%filter_eps)
464 DO ispin = 1,
SIZE(matrix_ks)
468 CALL dbcsr_add(exp_h(re)%matrix, matrix_ks_nosym, 1.0_dp, 1.0_dp)
470 CALL dbcsr_copy(sinvb(ispin)%matrix, matrix_ks_nosym)
476 CALL timestop(handle)
493 CHARACTER(len=*),
PARAMETER :: routinen =
's_matrices_create'
494 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
497 TYPE(
dbcsr_type),
POINTER :: s_half, s_inv, s_minus_half
499 CALL timeset(routinen, handle)
501 CALL get_rtp(rtp=rtp, s_inv=s_inv)
503 IF (rtp%linear_scaling)
THEN
504 CALL get_rtp(rtp=rtp, s_half=s_half, s_minus_half=s_minus_half)
506 rtp%newton_schulz_order, rtp%lanzcos_threshold, rtp%lanzcos_max_iter)
507 CALL dbcsr_multiply(
"N",
"N", one, s_minus_half, s_minus_half, zero, s_inv, &
508 filter_eps=rtp%filter_eps)
512 blacs_env=rtp%ao_ao_fmstruct%context)
514 blacs_env=rtp%ao_ao_fmstruct%context, uplo_to_full=.true.)
517 CALL timestop(handle)
528 SUBROUTINE complex_frobenius_norm(frob_norm, mat_re, mat_im)
530 REAL(kind=
dp),
INTENT(out) :: frob_norm
533 CHARACTER(len=*),
PARAMETER :: routinen =
'complex_frobenius_norm'
534 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
536 INTEGER :: col_atom, handle, row_atom
538 REAL(
dp),
DIMENSION(:, :),
POINTER :: block_values, block_values2
542 CALL timeset(routinen, handle)
557 block_values = block_values2*block_values2
561 block_values = block_values + block_values2*block_values2
563 block_values = sqrt(block_values)
570 CALL timestop(handle)
572 END SUBROUTINE complex_frobenius_norm
585 SUBROUTINE purify_mcweeny_complex_nonorth(P, s_mat, eps, eps_small, max_iter, threshold)
588 REAL(kind=
dp),
INTENT(in) :: eps, eps_small
589 INTEGER,
INTENT(in) :: max_iter
590 REAL(kind=
dp),
INTENT(in) :: threshold
592 CHARACTER(len=*),
PARAMETER :: routinen =
'purify_mcweeny_complex_nonorth'
593 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
595 INTEGER :: handle, i, im,
imax, ispin, re, unit_nr
596 REAL(kind=
dp) :: frob_norm
598 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ps, psp, tmp
600 CALL timeset(routinen, handle)
603 IF (logger%para_env%is_source())
THEN
609 NULLIFY (tmp, ps, psp)
621 IF (
SIZE(p) == 2)
THEN
625 DO ispin = 1,
SIZE(p)/2
628 imax = max(max_iter, 1)
630 CALL dbcsr_multiply(
"N",
"N", one, p(re)%matrix, s_mat(1)%matrix, &
631 zero, ps(re)%matrix, filter_eps=eps_small)
632 CALL dbcsr_multiply(
"N",
"N", one, p(im)%matrix, s_mat(1)%matrix, &
633 zero, ps(im)%matrix, filter_eps=eps_small)
635 p(re)%matrix, p(im)%matrix, zero, psp(re)%matrix, psp(im)%matrix, &
636 filter_eps=eps_small)
637 CALL dbcsr_copy(tmp(re)%matrix, psp(re)%matrix)
638 CALL dbcsr_copy(tmp(im)%matrix, psp(im)%matrix)
639 CALL dbcsr_add(tmp(re)%matrix, p(re)%matrix, 1.0_dp, -1.0_dp)
640 CALL dbcsr_add(tmp(im)%matrix, p(im)%matrix, 1.0_dp, -1.0_dp)
641 CALL complex_frobenius_norm(frob_norm, tmp(re)%matrix, tmp(im)%matrix)
642 IF (unit_nr .GT. 0)
WRITE (unit_nr,
'(t3,a,2f16.8)')
"Deviation from idempotency: ", frob_norm
643 IF (frob_norm .GT. threshold .AND. max_iter > 0)
THEN
647 psp(re)%matrix, psp(im)%matrix, 3.0_dp, p(re)%matrix, p(im)%matrix, &
648 filter_eps=eps_small)
653 CALL dbcsr_add(p(re)%matrix, tmp(re)%matrix, one/2, one/2)
655 CALL dbcsr_add(p(im)%matrix, tmp(im)%matrix, one/2, -one/2)
662 CALL dbcsr_add(p(re)%matrix, tmp(re)%matrix, one/2, one/2)
664 CALL dbcsr_add(p(im)%matrix, tmp(im)%matrix, one/2, -one/2)
666 IF (
SIZE(p) == 2)
THEN
674 CALL timestop(handle)
676 END SUBROUTINE purify_mcweeny_complex_nonorth
684 SUBROUTINE aspc_extrapolate(rtp, matrix_s, aspc_order)
687 INTEGER,
INTENT(in) :: aspc_order
689 CHARACTER(len=*),
PARAMETER :: routinen =
'aspc_extrapolate'
690 COMPLEX(KIND=dp),
PARAMETER :: cone = (1.0_dp, 0.0_dp), &
691 czero = (0.0_dp, 0.0_dp)
692 REAL(kind=
dp),
PARAMETER :: one = 1.0_dp, zero = 0.0_dp
694 INTEGER :: handle, i, iaspc, icol_local, ihist, &
695 imat, k, kdbl, n, naspc, ncol_local, &
697 REAL(kind=
dp) :: alpha
701 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos_new
702 TYPE(
cp_fm_type),
DIMENSION(:, :),
POINTER :: mo_hist
703 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_new, s_hist
704 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_hist
707 CALL timeset(routinen, handle)
711 IF (rtp%linear_scaling)
THEN
712 CALL get_rtp(rtp=rtp, rho_new=rho_new)
714 CALL get_rtp(rtp=rtp, mos_new=mos_new)
717 naspc = min(rtp%istep, aspc_order)
718 IF (rtp%linear_scaling)
THEN
720 rho_hist => rtp%history%rho_history
723 alpha = (-1.0_dp)**(iaspc + 1)*real(iaspc, kind=
dp)* &
725 ihist = mod(rtp%istep - iaspc, aspc_order) + 1
727 CALL dbcsr_add(rho_new(imat)%matrix, rho_hist(imat, ihist)%matrix, zero, alpha)
729 CALL dbcsr_add(rho_new(imat)%matrix, rho_hist(imat, ihist)%matrix, one, alpha)
734 mo_hist => rtp%history%mo_history
738 alpha = (-1.0_dp)**(iaspc + 1)*real(iaspc, kind=
dp)* &
740 ihist = mod(rtp%istep - iaspc, aspc_order) + 1
749 mo_hist => rtp%history%mo_history
750 s_hist => rtp%history%s_history
751 DO i = 1,
SIZE(mos_new)/2
752 NULLIFY (matrix_struct, matrix_struct_new)
755 mos_new(2*i)%matrix_struct, &
756 mos_new(2*i)%matrix_struct%context, &
770 ncol_local=ncol_local)
773 template_fmstruct=mos_new(2*i)%matrix_struct, &
784 DO icol_local = 1, ncol_local
785 fm_tmp%local_data(:, icol_local) = mos_new(2*i - 1)%local_data(:, icol_local)
786 fm_tmp%local_data(:, icol_local + ncol_local) = mos_new(2*i)%local_data(:, icol_local)
791 DO icol_local = 1, ncol_local
792 cfm_tmp%local_data(:, icol_local) = cmplx(fm_tmp1%local_data(:, icol_local), &
793 fm_tmp1%local_data(:, icol_local + ncol_local),
dp)
794 cfm_tmp1%local_data(:, icol_local) = cmplx(mos_new(2*i - 1)%local_data(:, icol_local), &
795 mos_new(2*i)%local_data(:, icol_local),
dp)
797 CALL parallel_gemm(
'C',
'N', k, k, n, cone, cfm_tmp1, cfm_tmp, czero, csc)
800 DO icol_local = 1, ncol_local
801 mos_new(2*i - 1)%local_data(:, icol_local) = real(cfm_tmp1%local_data(:, icol_local),
dp)
802 mos_new(2*i)%local_data(:, icol_local) = aimag(cfm_tmp1%local_data(:, icol_local))
816 CALL timestop(handle)
818 END SUBROUTINE aspc_extrapolate
830 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: mos
838 IF (rtp%linear_scaling)
THEN
840 CALL dbcsr_copy(rtp%history%rho_history(i, ihist)%matrix, rho(i)%matrix)
844 CALL cp_fm_to_fm(mos(i), rtp%history%mo_history(i, ihist))
846 IF (
PRESENT(s_mat))
THEN
847 IF (
ASSOCIATED(rtp%history%s_history(ihist)%matrix))
THEN
851 ALLOCATE (rtp%history%s_history(ihist)%matrix)
852 CALL dbcsr_copy(rtp%history%s_history(ihist)%matrix, s_mat(1)%matrix)
static int imax(int x, int y)
Returns the larger of two given integers (missing from the C standard)
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public kuhne2007
integer, save, public kolafa2004
Handles all functions related to the CELL.
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_triangular_multiply(triangular_matrix, matrix_b, side, transa_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
Multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
various cholesky decomposition related routines
subroutine, public cp_cfm_cholesky_decompose(matrix, n, info_out)
Used to replace a symmetric positive definite matrix M with its Cholesky decomposition U: M = U^T * U...
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
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_desymmetrize(matrix_a, matrix_b)
...
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_init_p(matrix)
...
subroutine, public dbcsr_filter(matrix, eps)
...
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)
...
Interface to (sca)lapack for the Cholesky based procedures.
subroutine, public cp_dbcsr_cholesky_decompose(matrix, n, para_env, blacs_env)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_dbcsr_cholesky_invert(matrix, n, para_env, blacs_env, uplo_to_full)
used to replace the cholesky decomposition by the inverse
real(dp) function, public dbcsr_frobenius_norm(matrix)
Compute the frobenius norm of a dbcsr matrix.
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
basic linear algebra operations for full matrices
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_double(fmstruct, struct, context, col, row)
creates a struct with twice the number of blocks on each core. If matrix A has to be multiplied with ...
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
all routins needed for a nonperiodic electric field
subroutine, public efield_potential_lengh_gauge(qs_env)
Replace the original implementation of the electric-electronic interaction in the length gauge....
Routines useful for iterative matrix calculations.
subroutine, public matrix_sqrt_newton_schulz(matrix_sqrt, matrix_sqrt_inv, matrix, threshold, order, eps_lanczos, max_iter_lanczos, symmetrize, converged, iounit)
compute the sqrt of a matrix via the sign function and the corresponding Newton-Schulz iterations the...
Defines the basic variable types.
integer, parameter, public dp
Routines for calculating a complex matrix exponential with dbcsr matrices. Based on the code in matri...
subroutine, public cp_complex_dbcsr_gemm_3(transa, transb, alpha, a_re, a_im, b_re, b_im, beta, c_re, c_im, filter_eps)
Convenience function. Computes the matrix multiplications needed for the multiplication of complex sp...
Collection of simple mathematical functions and subroutines.
elemental real(kind=dp) function, public binomial(n, k)
The binomial coefficient n over k for 0 <= k <= n is calculated, otherwise zero is returned.
basic linear algebra operations for full matrixes
Utility subroutine for qs energy calculation.
subroutine, public qs_energies_init(qs_env, calc_forces)
Refactoring of qs_energies_scf. Driver routine for the initial setup and calculations for a qs energy...
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.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
Routines for calculating a complex matrix exponential.
subroutine, public propagate_exp(rtp, rtp_control)
performs propagations if explicit matrix exponentials are used ETRS: exp(i*H(t+dt)*dt/2)*exp(i*H(t)*d...
subroutine, public propagate_bch(rtp, rtp_control)
Propagation using the Baker-Campbell-Hausdorff expansion, currently only works for rtp.
subroutine, public propagate_exp_density(rtp, rtp_control)
Propagation of the density matrix instead of the atomic orbitals via a matrix exponential.
subroutine, public propagate_arnoldi(rtp, rtp_control)
computes U_prop*MOs using arnoldi subspace algorithm
Routines for propagating the orbitals.
subroutine, public calc_sinvh(rtp, matrix_ks, matrix_ks_im, rtp_control)
computes S_inv*H, if needed Sinv*B and S_inv*H_imag and store these quantities to the
subroutine, public propagation_step(qs_env, rtp, rtp_control)
performs a single propagation step a(t+Dt)=U(t+Dt,t)*a(0) and calculates the new exponential
subroutine, public put_data_to_history(rtp, mos, rho, s_mat, ihist)
...
subroutine, public s_matrices_create(s_mat, rtp)
calculates the needed overlap-like matrices depending on the way the exponential is calculated,...
Routine for the real time propagation output.
subroutine, public report_density_occupation(filter_eps, rho)
Reports the sparsity pattern of the complex density matrix.
subroutine, public rt_convergence(rtp, matrix_s, delta_mos, delta_eps)
computes the convergence criterion for RTP and EMD
subroutine, public rt_convergence_density(rtp, delta_p, delta_eps)
computes the convergence criterion for RTP and EMD based on the density matrix
Types and set_get for real time propagation depending on runtype and diagonalization method different...
subroutine, public get_rtp(rtp, exp_h_old, exp_h_new, h_last_iter, rho_old, rho_next, rho_new, mos, mos_new, mos_old, mos_next, s_inv, s_half, s_minus_half, b_mat, c_mat, propagator_matrix, mixing, mixing_factor, s_der, dt, nsteps, sinvh, sinvh_imag, sinvb, admm_mos)
...
subroutine, public calc_update_rho_sparse(qs_env)
Copies the density matrix back into the qs_envrhorho_ao.
subroutine, public calc_s_derivs(qs_env)
Calculates dS/dR respectily the velocity weighted derivatves only needed for ehrenfest MD.
subroutine, public calc_update_rho(qs_env)
calculates the density from the complex MOs and passes the density to qs_env.
Routines to perform the RTP in the velocity gauge.
subroutine, public velocity_gauge_ks_matrix(qs_env, subtract_nl_term)
...
subroutine, public update_vector_potential(qs_env, dft_control)
Update the vector potential in the case where a time-dependant electric field is apply.
Type defining parameters related to the simulation cell.
Represent a complex full matrix.
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...