18 #include "./base/base_uses.f90"
24 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mp2_laplace'
39 TYPE(cp_fm_type),
INTENT(IN) :: fm_mat_s
40 INTEGER,
INTENT(IN) :: homo, virtual
41 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: eigenval
42 REAL(kind=
dp),
INTENT(IN) :: dajquad
44 CHARACTER(LEN=*),
PARAMETER :: routinen =
'calc_fm_mat_S_laplace'
46 INTEGER :: avirt, handle, i_global, iib, iocc, &
48 INTEGER,
DIMENSION(:),
POINTER :: col_indices
49 REAL(kind=
dp) :: laplace_transf
51 CALL timeset(routinen, handle)
55 ncol_local=ncol_local, &
56 col_indices=col_indices)
58 DO iib = 1, ncol_local
59 i_global = col_indices(iib)
61 iocc = max(1, i_global - 1)/virtual + 1
62 avirt = i_global - (iocc - 1)*virtual
64 laplace_transf = exp(0.5_dp*(eigenval(iocc) - eigenval(avirt + homo))*dajquad)
66 fm_mat_s%local_data(:, iib) = fm_mat_s%local_data(:, iib)*laplace_transf
81 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: fm_mat_q
82 REAL(kind=
dp),
INTENT(INOUT) :: erpa
83 REAL(kind=
dp),
INTENT(IN) :: tau_wjquad
85 CHARACTER(LEN=*),
PARAMETER :: routinen =
'SOS_MP2_postprocessing'
87 INTEGER :: handle, jjb, ncol_local
88 REAL(kind=
dp) :: trace_xx
90 CALL timeset(routinen, handle)
94 ncol_local=ncol_local)
98 DO jjb = 1, ncol_local
99 trace_xx = trace_xx + dot_product(fm_mat_q(1)%local_data(:, jjb), &
100 fm_mat_q(
SIZE(fm_mat_q))%local_data(:, jjb))
103 erpa = erpa - trace_xx*tau_wjquad
105 CALL timestop(handle)
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
Defines the basic variable types.
integer, parameter, public dp
Routines to calculate MP2 energy with laplace approach.
subroutine, public sos_mp2_postprocessing(fm_mat_Q, Erpa, tau_wjquad)
...
subroutine, public calc_fm_mat_s_laplace(fm_mat_S, homo, virtual, Eigenval, dajquad)
...