34 use,
intrinsic :: iso_fortran_env
64 integer,
public,
parameter :: &
71 integer,
public :: exp_method
72 real(real64) :: lanczos_tol
73 real(real64) :: chebyshev_tol
74 integer,
public :: exp_order
76 logical,
public :: full_batch = .false.
85 type(namespace_t),
pointer :: namespace
86 class(mesh_t),
pointer :: mesh
88 procedure(operator_apply),
deferred :: apply
95 class(operator_t),
intent(in) :: this
96 class(batch_t),
intent(inout) :: psib
97 class(batch_t),
intent(inout) :: hpsib
103 class(hamiltonian_abst_t),
pointer :: hm
110 procedure hamiltonian_operator_constructor
117 type(exponential_t),
intent(out) :: te
118 type(namespace_t),
intent(in) :: namespace
119 logical,
optional,
intent(in) :: full_batch
178 select case (te%exp_method)
191 call parse_variable(namespace,
'TDChebyshevTol', 1e-10_real64, te%chebyshev_tol)
205 call parse_variable(namespace,
'TDLanczosTol', 1e-6_real64, te%lanczos_tol)
222 call parse_variable(namespace,
'TDExpOrder', default__tdexporder, te%exp_order)
226 message(1) =
"TDExpOrder is only relevant for TDExponentialMethod = taylor"
231 te%arnoldi_gs = option__arnoldiorthogonalization__cgs
232 if (te%exp_method == exp_lanczos)
then
247 call parse_variable(namespace,
'ArnoldiOrthogonalization', option__arnoldiorthogonalization__cgs, &
264 teo%exp_method = tei%exp_method
265 teo%lanczos_tol = tei%lanczos_tol
266 teo%exp_order = tei%exp_order
267 teo%arnoldi_gs = tei%arnoldi_gs
277 class(
mesh_t),
intent(in) :: mesh
279 integer,
intent(in) :: ist
280 integer,
intent(in) :: ik
281 complex(real64),
contiguous,
intent(inout) :: zpsi(:, :)
282 real(real64),
intent(in) :: deltat
283 logical,
optional,
intent(in) :: imag_time
286 complex(real64),
allocatable :: zpsi_inh(:, :)
292 if (hm%phase%is_allocated())
then
293 call hm%phase%apply_to_single(zpsi, mesh%np, hm%d%dim, ik, .false.)
299 safe_allocate(zpsi_inh(1:mesh%np_part, 1:hm%d%dim))
301 call wfs_elec_init(inh_psib, hm%d%dim, ist, ist, zpsi_inh, ik)
302 call te%apply_batch(namespace, mesh, hm, psib, deltat, &
303 imag_time=imag_time, inh_psib=inh_psib)
305 safe_deallocate_a(zpsi_inh)
307 call te%apply_batch(namespace, mesh, hm, psib, deltat, &
313 if (hm%phase%is_allocated())
then
314 call hm%phase%apply_to_single(zpsi, mesh%np, hm%d%dim, ik, .
true.)
338 subroutine exponential_apply_batch(te, namespace, mesh, hm, psib, deltat, psib2, deltat2, imag_time, inh_psib, op)
341 class(
mesh_t),
intent(in) :: mesh
343 class(
batch_t),
intent(inout) :: psib
344 real(real64),
intent(in) :: deltat
345 class(
batch_t),
optional,
intent(inout) :: psib2
346 real(real64),
optional,
intent(in) :: deltat2
347 logical,
optional,
intent(in) :: imag_time
348 class(
batch_t),
optional,
intent(inout) :: inh_psib
349 class(
operator_t),
target,
optional,
intent(in) :: op
351 complex(real64) :: deltat_, deltat2_
353 logical :: imag_time_
361 assert(
present(psib2) .eqv.
present(deltat2))
362 if (
present(inh_psib))
then
363 assert(inh_psib%nst == psib%nst)
366 if (
present(op))
then
376 deltat_ = -
m_zi*deltat
377 if (
present(deltat2)) deltat2_ =
m_zi*deltat2
379 deltat_ = cmplx(deltat,
m_zero, real64)
380 if (
present(deltat2)) deltat2_ = cmplx(deltat2,
m_zero, real64)
383 if (.not. hm%is_hermitian() .and. te%exp_method ==
exp_chebyshev)
then
384 write(
message(1),
'(a)')
'The Chebyshev expansion cannot be used for non-Hermitian operators.'
385 write(
message(2),
'(a)')
'Please use the Lanczos exponentiation scheme ("TDExponentialMethod = lanczos")'
386 write(
message(3),
'(a)')
'or the Taylor expansion ("TDExponentialMethod = taylor") method.'
390 select case (te%exp_method)
393 if (
present(deltat2))
then
399 if (
present(inh_psib))
then
400 if (
present(deltat2))
then
402 psib2, deltat2_, inh_psib)
410 if (
present(psib2))
then
413 call psib%copy_data_to(mesh%np, psib2)
415 psib2=psib2, deltat2=deltat2_)
416 if (
present(inh_psib))
then
418 psib2=psib2, deltat2=deltat2_)
422 if (
present(inh_psib))
then
428 if (
present(inh_psib))
then
429 write(
message(1),
'(a)')
'Chebyshev exponential ("TDExponentialMethod = chebyshev")'
430 write(
message(2),
'(a)')
'with inhomogeneous term is not implemented'
436 if (
present(psib2))
then
440 chebyshev_function =>
chebyshev_exp_t(hm%spectral_half_span, hm%spectral_middle_point, deltat)
441 if (
present(psib2))
then
442 chebyshev_function_dt2 =>
chebyshev_exp_t(hm%spectral_half_span, hm%spectral_middle_point, deltat2)
445 if (
present(psib2))
call psib%copy_data_to(mesh%np, psib2)
447 deallocate(chebyshev_function)
448 if (
present(psib2))
then
450 deallocate(chebyshev_function_dt2)
455 if (.not.
present(op))
then
456 safe_deallocate_p(op_)
464 subroutine exponential_taylor_series_batch(te, namespace, mesh, hm, psib, deltat, op, psib2, deltat2, inh_psib, phik_shift)
467 class(
mesh_t),
intent(in) :: mesh
469 class(
batch_t),
intent(inout) :: psib
470 complex(real64),
intent(in) :: deltat
472 class(
batch_t),
optional,
intent(inout) :: psib2
473 complex(real64),
optional,
intent(in) :: deltat2
474 class(
batch_t),
optional,
intent(inout) :: inh_psib
475 integer,
optional,
intent(in) :: phik_shift
477 complex(real64) :: zfact, zfact2
478 integer :: iter, denom, phik_shift_
479 logical :: zfact_is_real
480 class(
batch_t),
allocatable :: psi1b, hpsi1b
485 call psib%clone_to(psi1b)
486 call psib%clone_to(hpsi1b)
490 zfact_is_real = abs(deltat-real(deltat, real64)) <
m_epsilon
492 if (
present(psib2))
call psib%copy_data_to(mesh%np, psib2)
494 if (
present(inh_psib))
then
496 call batch_axpy(mesh%np, real(zfact, real64), inh_psib, psib)
498 if (
present(psib2))
then
499 zfact2 = zfact2*deltat2
500 call batch_axpy(mesh%np, real(zfact2, real64), inh_psib, psib2)
507 do iter = 1, te%exp_order
508 denom = iter+phik_shift_
509 if (
present(inh_psib)) denom = denom + 1
510 zfact = zfact*(-
m_zi*deltat)/denom
511 if (
present(deltat2)) zfact2 = zfact2*(-
m_zi*deltat2)/denom
512 zfact_is_real = .not. zfact_is_real
519 call op%apply(psi1b, hpsi1b)
521 if (
present(inh_psib))
then
522 call op%apply(inh_psib, hpsi1b)
524 call op%apply(psib, hpsi1b)
528 if (zfact_is_real)
then
529 call batch_axpy(mesh%np, real(zfact, real64), hpsi1b, psib)
530 if (
present(psib2))
call batch_axpy(mesh%np, real(zfact2, real64), hpsi1b, psib2)
533 if (
present(psib2))
call batch_axpy(mesh%np, zfact2, hpsi1b, psib2)
536 if (iter /= te%exp_order)
call hpsi1b%copy_data_to(mesh%np, psi1b)
542 safe_deallocate_a(psi1b)
543 safe_deallocate_a(hpsi1b)
555 class(
mesh_t),
intent(in) :: mesh
557 class(
batch_t),
intent(inout) :: psib
558 complex(real64),
intent(in) :: deltat
560 class(
batch_t),
optional,
intent(in) :: inh_psib
561 class(
batch_t),
optional,
intent(inout) :: psib2
562 complex(real64),
optional,
intent(in) :: deltat2
564 class(
batch_t),
allocatable :: tmpb, tmpb2
568 assert(
present(psib2) .eqv.
present(deltat2))
570 if (
present(inh_psib))
then
571 call inh_psib%clone_to(tmpb, copy_data=.
true.)
572 if (
present(psib2))
then
575 call inh_psib%clone_to(tmpb2, copy_data=.
true.)
577 psib2=tmpb2, deltat2=deltat2)
578 call batch_axpy(mesh%np, real(deltat, real64), tmpb, psib)
579 call batch_axpy(mesh%np, real(deltat2, real64), tmpb2, psib2)
581 safe_deallocate_a(tmpb2)
585 call batch_axpy(mesh%np, real(deltat, real64), tmpb, psib)
588 safe_deallocate_a(tmpb)
590 if (
present(psib2))
then
592 psib2=psib2, deltat2=deltat2)
618 class(
mesh_t),
intent(in) :: mesh
620 class(
batch_t),
intent(inout) :: psib
621 complex(real64),
intent(in) :: deltat
623 complex(real64) function fun(z)
625 complex(real64),
intent(in) :: z
629 class(
batch_t),
optional,
intent(inout) :: psib2
630 complex(real64),
optional,
intent(in) :: deltat2
632 integer :: iter, l, ii, ist, max_initialized
633 complex(real64),
allocatable :: hamilt(:,:,:), expo(:,:,:), expo2(:,:,:)
634 complex(real64),
allocatable :: hamilt_tmp(:,:,:)
635 real(real64),
allocatable :: beta(:), res(:), res2(:), norm(:)
636 integer,
parameter :: max_order = 200
638 integer,
parameter :: order_initial = 16
639 integer :: order_alloc
641 logical :: have_dt2, converged, breakdown
646 if (te%exp_method /= exp_lanczos)
then
647 message(1) =
"The exponential method needs to be set to Lanzcos (TDExponentialMethod=lanczos)."
655 have_dt2 =
present(psib2)
656 assert(
present(psib2) .eqv.
present(deltat2))
658 assert(psib2%nst == psib%nst)
661 safe_allocate(beta(1:psib%nst))
662 safe_allocate(res(1:psib%nst))
663 safe_allocate(norm(1:psib%nst))
668 safe_allocate(vb(1:max_order))
669 call psib%clone_to(vb(1)%p)
673 call psib%copy_data_to(mesh%np, vb(1)%p, async=.
true.)
678 if (te%full_batch) beta = norm2(beta)
681 if (all(abs(beta) <= 1.0e-12_real64))
then
682 safe_deallocate_a(beta)
683 safe_deallocate_a(res)
684 safe_deallocate_a(norm)
686 safe_deallocate_a(vb)
694 order_alloc = order_initial
695 safe_allocate(hamilt(1:order_alloc+1, 1:order_alloc+1, 1:psib%nst))
696 safe_allocate( expo(1:order_alloc+1, 1:order_alloc+1, 1:psib%nst))
698 safe_allocate(expo2(1:order_alloc+1, 1:order_alloc+1, 1:psib%nst))
699 safe_allocate(res2(1:psib%nst))
704 do iter = 1, max_order-1
706 if (iter + 1 > order_alloc)
then
707 safe_allocate(hamilt_tmp(1:2*order_alloc+1, 1:2*order_alloc+1, 1:psib%nst))
709 hamilt_tmp(1:order_alloc+1, 1:order_alloc+1, :) = hamilt(:, :, :)
710 safe_deallocate_a(hamilt)
711 call move_alloc(hamilt_tmp, hamilt)
713 order_alloc = min(2*order_alloc, max_order)
714 safe_deallocate_a(expo)
715 safe_allocate(expo(1:order_alloc+1, 1:order_alloc+1, 1:psib%nst))
717 safe_deallocate_a(expo2)
718 safe_allocate(expo2(1:order_alloc+1, 1:order_alloc+1, 1:psib%nst))
722 call psib%clone_to(vb(iter + 1)%p)
723 max_initialized = iter + 1
726 call op%apply(vb(iter)%p, vb(iter+1)%p)
729 if (hm%is_hermitian())
then
731 hamilt(1:max(iter-2, 1), iter, 1:psib%nst) =
m_zero
734 hamilt(iter-1, iter, 1:psib%nst) = hamilt(iter, iter-1, 1:psib%nst)
736 call batch_axpy(mesh%np, -hamilt(iter-1, iter, 1:psib%nst), vb(iter-1)%p, vb(iter+1)%p, a_full = .false.)
745 hamilt(iter, 1:iter-2, 1:psib%nst) =
m_zero
759 normalize = .false., overlap = hamilt(l:iter, iter, 1:psib%nst), norm = hamilt(iter + 1, iter, 1:psib%nst), &
760 gs_scheme = te%arnoldi_gs, full_batch = te%full_batch)
764 breakdown = all(abs(hamilt(iter + 1, iter, :)) < 1.0e4_real64*
m_epsilon)
776 if (iter > 3 .or. breakdown)
then
779 hm%is_hermitian(), tridiagonal=hm%is_hermitian())
780 res(ii) = abs(hamilt(iter + 1, iter, ii) * abs(expo(iter, 1, ii)))
784 hm%is_hermitian(), tridiagonal=hm%is_hermitian())
785 res2(ii) = abs(hamilt(iter + 1, iter, ii) * abs(expo2(iter, 1, ii)))
797 if (abs(hamilt(iter + 1, iter, ist)) >= 1.0e4_real64 *
m_epsilon)
then
798 norm(ist) =
m_one / abs(hamilt(iter + 1, iter, ist))
803 call batch_scal(mesh%np, norm, vb(iter+1)%p, a_full = .false.)
809 converged = all(res < te%lanczos_tol)
810 if (converged .and. have_dt2) converged = all(res2 < te%lanczos_tol)
816 if (iter == max_order)
then
817 write(
message(1),
'(a,i5,a,es9.2)')
'Lanczos exponential expansion did not converge after ', iter, &
818 ' iterations. Residual: ', maxval(res)
821 write(
message(1),
'(a,i5)')
'Debug: Lanczos exponential iterations: ', iter
828 call batch_scal(mesh%np, expo(1,1,1:psib%nst), psib, a_full = .false.)
831 call batch_axpy(mesh%np, beta(1:psib%nst)*expo(ii,1,1:psib%nst), vb(ii)%p, psib, a_full = .false.)
836 call batch_scal(mesh%np, expo2(1,1,1:psib%nst), psib2, a_full = .false.)
838 call batch_axpy(mesh%np, beta(1:psib%nst)*expo2(ii,1,1:psib%nst), vb(ii)%p, psib2, a_full = .false.)
842 do ii = 1, max_initialized
846 safe_deallocate_a(vb)
847 safe_deallocate_a(hamilt)
848 safe_deallocate_a(hamilt_tmp)
849 safe_deallocate_a(expo)
850 safe_deallocate_a(expo2)
851 safe_deallocate_a(beta)
852 safe_deallocate_a(res)
853 safe_deallocate_a(res2)
854 safe_deallocate_a(norm)
879 class(
mesh_t),
intent(in) :: mesh
881 class(
batch_t),
intent(inout) :: psib
885 integer :: j, order_needed
886 complex(real64) :: coefficient
887 complex(real64),
allocatable :: coefficients(:)
888 real(real64) :: error
889 class(
batch_t),
allocatable,
target :: psi0, psi1, psi2
890 class(
batch_t),
pointer :: psi_n, psi_n1, psi_n2
891 integer,
parameter :: max_order = 200
896 call psib%clone_to(psi0)
897 call psib%clone_to(psi1)
898 call psib%clone_to(psi2)
899 call psib%copy_data_to(mesh%np, psi0)
901 order_needed = max_order
903 error = chebyshev_function%get_error(j)
904 if (error >
m_zero .and. error < te%chebyshev_tol)
then
910 call chebyshev_function%get_coefficients(j, coefficients)
913 call batch_scal(mesh%np, coefficients(0), psib)
916 call op%apply(psi0, psi1)
917 call batch_axpy(mesh%np, -hm%spectral_middle_point, psi0, psi1)
920 call batch_axpy(mesh%np, coefficients(1), psi1, psib)
927 do j = 2, order_needed
929 call op%apply(psi_n1, psi_n)
930 call batch_axpy(mesh%np, -hm%spectral_middle_point, psi_n1, psi_n)
935 call batch_axpy(mesh%np, coefficients(j), psi_n, psib)
938 if (mod(j, 3) == 2)
then
942 else if (mod(j, 3) == 1)
then
953 if (order_needed == max_order)
then
954 write(
message(1),
'(a,i5,a,es9.2)')
'Chebyshev exponential expansion did not converge after ', j, &
955 ' iterations. Coefficient: ', coefficient
958 write(
message(1),
'(a,i5)')
'Debug: Chebyshev exponential iterations: ', j
965 safe_deallocate_a(psi0)
966 safe_deallocate_a(psi1)
967 safe_deallocate_a(psi2)
969 safe_deallocate_a(coefficients)
983 type(
grid_t),
intent(inout) :: gr
986 real(real64),
intent(in) :: deltat
987 integer,
optional,
intent(inout) :: order
990 real(real64) :: zfact
1002 do i = 1, te%exp_order
1003 zfact = zfact * deltat / i
1011 do ik = st%d%kpt%start, st%d%kpt%end
1012 do ib = st%group%block_start, st%group%block_end
1013 call batch_scal2v(gr%np, -
m_zi, hst1%group%psib(ib, ik), st1%group%psib(ib, ik), conjugate_xx = .false.)
1014 call batch_axpy(gr%np, zfact, st1%group%psib(ib, ik), st%group%psib(ib, ik))
1032 do ik = st%d%kpt%start, st%d%kpt%end
1033 do ib = st%group%block_start, st%group%block_end
1034 call batch_axpy(gr%np, deltat, st1%group%psib(ib, ik), st%group%psib(ib, ik))
1039 do i = 1, te%exp_order
1040 zfact = zfact * deltat / (i+1)
1048 do ik = st%d%kpt%start, st%d%kpt%end
1049 do ib = st%group%block_start, st%group%block_end
1050 call batch_scal2v(gr%np, -
m_zi, hst1%group%psib(ib, ik), st1%group%psib(ib, ik), conjugate_xx = .false.)
1051 call batch_axpy(gr%np, deltat * zfact, st1%group%psib(ib, ik), st%group%psib(ib, ik))
1062 if (
present(order)) order = te%exp_order*st%nik*st%nst
1070 class(
mesh_t),
intent(in) :: mesh
1072 class(
batch_t),
intent(inout) :: psib
1073 real(real64),
intent(in) :: deltat
1074 integer,
intent(in) :: k
1078 complex(real64) :: deltat_
1085 if (.not. hm%is_hermitian() .and. te%exp_method ==
exp_chebyshev)
then
1086 write(
message(1),
'(a)')
'The Chebyshev expansion for the exponential will only converge if the imaginary'
1087 write(
message(2),
'(a)')
'eigenvalues are small enough compared to the span of the real eigenvalues,'
1088 write(
message(3),
'(a)')
'i.e., for ratios smaller than about 1e-3.'
1089 write(
message(4),
'(a)')
'The Lanczos method ("TDExponentialMethod = lanczos") is guaranteed to'
1090 write(
message(5),
'(a)')
'always converge in this case.'
1094 if (
present(op))
then
1100 deltat_ = cmplx(deltat,
m_zero, real64)
1102 select case (te%exp_method)
1109 else if (k == 2)
then
1112 write(
message(1),
'(a)')
'Lanczos expansion not implemented for phi_k, k > 2'
1119 else if (k == 2)
then
1122 write(
message(1),
'(a)')
'Chebyshev expansion not implemented for phi_k, k > 2'
1126 deallocate(chebyshev_function)
1129 if (.not.
present(op))
then
1130 safe_deallocate_p(op_)
1137 type(
namespace_t),
target,
intent(in) :: namespace
1138 class(
mesh_t),
target,
intent(in) :: mesh
1145 call this%init(namespace, mesh, hm)
1152 type(
namespace_t),
target,
intent(in) :: namespace
1153 class(
mesh_t),
target,
intent(in) :: mesh
1159 this%namespace => namespace
1167 class(
batch_t),
intent(inout) :: psib
1168 class(
batch_t),
intent(inout) :: hpsib
1172 call this%hm%zapply(this%namespace, this%mesh, psib, hpsib)
batchified version of the BLAS axpy routine:
batchified scale with optional conjugation:
scale a batch by a constant or vector
subroutine, public accel_finish()
This module implements batches of mesh functions.
This module implements common operations on batches of mesh functions.
This module contains interfaces for BLAS routines You should not use these routines directly....
subroutine, public exponential_copy(teo, tei)
subroutine, public exponential_apply_all(te, namespace, gr, hm, st, deltat, order)
Note that this routine not only computes the exponential, but also an extra term if there is a inhomo...
type(hamiltonian_operator_t) function, pointer hamiltonian_operator_constructor(namespace, mesh, hm)
subroutine exponential_cheby_batch(te, namespace, mesh, hm, psib, chebyshev_function, op)
Calculates the exponential of the Hamiltonian through an expansion in Chebyshev polynomials.
subroutine exponential_lanczos_batch(te, namespace, mesh, hm, psib, deltat, op, inh_psib, psib2, deltat2)
Lanczos/Arnoldi procedure for the exponential of an operator.
subroutine exponential_apply_phi_batch(te, namespace, mesh, hm, psib, deltat, k, op)
subroutine exponential_apply_batch(te, namespace, mesh, hm, psib, deltat, psib2, deltat2, imag_time, inh_psib, op)
This routine performs the operation:
subroutine hamiltonian_operator_init(this, namespace, mesh, hm)
subroutine exponential_taylor_series_batch(te, namespace, mesh, hm, psib, deltat, op, psib2, deltat2, inh_psib, phik_shift)
subroutine, public exponential_init(te, namespace, full_batch)
subroutine, public exponential_lanczos_function_batch(te, namespace, mesh, hm, psib, deltat, fun, op, psib2, deltat2)
Compute fun(H) psib, i.e. the application of a function of the Hamiltonian to a batch.
integer, parameter, public exp_taylor
integer, parameter, public exp_chebyshev
subroutine exponential_apply_single(te, namespace, mesh, hm, zpsi, ist, ik, deltat, imag_time)
Wrapper to batchified routine for applying exponential to an array.
subroutine hamiltonian_operator_apply(this, psib, hpsib)
real(real64), parameter, public m_two
real(real64), parameter, public m_huge
real(real64), parameter, public m_zero
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
complex(real64), parameter, public m_z1
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
This module defines an abstract class for Hamiltonians.
subroutine, public zhamiltonian_elec_apply_all(hm, namespace, gr, st, hst)
pure logical function, public hamiltonian_elec_inh_term(hm)
subroutine, public zlalg_matrix_function(n, factor, a, fun_a, fun, hermitian, tridiagonal)
This routine calculates a function of a matrix by using an eigenvalue decomposition.
This module is intended to contain "only mathematical" functions and procedures.
complex(real64) pure function, public phi2(z)
Compute phi2(z) = (phi1(z)-1)/z = (exp(z) - z - 1)/z^2.
complex(real64) pure function, public exponential(z)
Wrapper for exponential.
complex(real64) pure function, public phi1(z)
Compute phi1(z) = (exp(z)-1)/z.
This module defines functions over batches of mesh functions.
subroutine, public mesh_batch_nrm2(mesh, aa, nrm2, reduce)
Calculate the norms (norm2, not the square!) of a batch of mesh functions.
subroutine, public zmesh_batch_orthogonalization(mesh, nst, psib, phib, normalize, overlap, norm, gs_scheme, full_batch)
Orthonormalizes states of phib to the orbitals of nst batches of psi.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_warning(no_lines, all_nodes, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_input_error(namespace, var, details, row, column)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
logical function, public parse_is_defined(namespace, name)
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special, dest_type, copy_data)
make a (selective) copy of a states_elec_t object
type(type_t), parameter, public type_cmplx
Class defining batches of mesh functions.
Description of the grid, containing information on derivatives, stencil, and symmetries.
The abstract Hamiltonian class defines a skeleton for specific implementations.
Describes mesh distribution to nodes.
The states_elec_t class contains all electronic wave functions.
batches of electronic states