101 pp_type, ref_functional, &
102 s6, s8, a1, a2, sr6, &
103 para_env, error, calc_scaling)
105 REAL(kind=
dp),
DIMENSION(:, :, :, :, :), &
106 INTENT(INOUT) :: c6ab
107 INTEGER,
DIMENSION(:),
INTENT(INOUT) :: maxci
108 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: r0ab
109 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT) :: rcov, r2r4
110 INTEGER,
INTENT(IN) :: pp_type
111 CHARACTER(LEN=*),
INTENT(IN) :: ref_functional
112 REAL(kind=
dp),
INTENT(INOUT) :: s6, s8, a1, a2, sr6
114 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: error
115 LOGICAL,
INTENT(IN),
OPTIONAL :: calc_scaling
117#if defined(__S_DFTD3)
119 CHARACTER(LEN=*),
PARAMETER :: routinen =
'dftd3_param_from_library'
121 CHARACTER(LEN=default_string_length) :: func_name
122 INTEGER :: handle, i, iz, jref, jz, nelem, nref
123 LOGICAL :: do_calc_scaling
124 REAL(kind=
dp) :: c6_val, r4r2, rcov_val
125 REAL(kind=
dp),
DIMENSION(94) :: r2r4_tmp, rcov_tmp
126 TYPE(d3_param) :: d3params
127 TYPE(error_type),
ALLOCATABLE :: lib_error
129 CALL timeset(routinen, handle)
131 CALL init_reference_c6()
134 nelem = min(94,
SIZE(maxci))
138 maxci(iz) = number_of_references(iz)
141 IF (para_env%is_source())
THEN
143 rcov_val = get_covalent_rad(iz)
144 rcov_tmp(iz) = rcov_val
146 r4r2 = get_r4r2_val(iz)
153 IF (r2r4_tmp(iz) > 0.0_dp .AND. r2r4_tmp(jz) > 0.0_dp)
THEN
154 r0ab(iz, jz) = get_vdw_rad(iz, jz)
164 c6_val = get_c6(i, jref, iz, jz)
165 c6ab(iz, jz, i, jref, 1) = c6_val
166 c6ab(iz, jz, i, jref, 2) = reference_cn(i, iz)
167 c6ab(iz, jz, i, jref, 3) = reference_cn(jref, jz)
174 CALL para_env%bcast(r2r4_tmp)
175 CALL para_env%bcast(r0ab)
176 CALL para_env%bcast(rcov_tmp)
178 IF (.NOT. para_env%is_source())
THEN
184 c6_val = get_c6(i, jref, iz, jz)
185 c6ab(iz, jz, i, jref, 1) = c6_val
186 c6ab(iz, jz, i, jref, 2) = reference_cn(i, iz)
187 c6ab(iz, jz, i, jref, 3) = reference_cn(jref, jz)
194 r2r4(:nelem) = r2r4_tmp(:nelem)
195 rcov(:nelem) = rcov_tmp(:nelem)
197 func_name = ref_functional
198 d3params = d3_param()
200 IF (para_env%is_source())
THEN
201 SELECT CASE (pp_type)
203 CALL get_zero_damping(d3params, func_name, lib_error)
205 CALL get_rational_damping(d3params, func_name, lib_error)
207 d3params = d3_param()
209 IF (
ALLOCATED(lib_error))
THEN
210 IF (
PRESENT(error))
THEN
211 error =
"Functional '"//trim(ref_functional)//
"' not found in s-dftd3 library"
217 CALL para_env%bcast(func_name)
218 CALL para_env%bcast(d3params%s6)
219 CALL para_env%bcast(d3params%s8)
220 CALL para_env%bcast(d3params%a1)
221 CALL para_env%bcast(d3params%a2)
222 CALL para_env%bcast(d3params%rs6)
224 IF (
PRESENT(error)) error =
""
226 do_calc_scaling = .true.
227 IF (
PRESENT(calc_scaling)) do_calc_scaling = calc_scaling
229 IF (do_calc_scaling)
THEN
237 CALL timestop(handle)
246 mark_used(ref_functional)
254 mark_used(calc_scaling)
255 cpabort(
"s-dftd3 library not compiled in")
subroutine, public dftd3_param_from_library(c6ab, maxci, r0ab, rcov, r2r4, pp_type, ref_functional, s6, s8, a1, a2, sr6, para_env, error, calc_scaling)
...