Calculate atomic polarizibilities and their derivatives w.r.t. the coordination numbers and atomic partial charges.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(d4_model), | intent(in) | :: | self |
Instance of the dispersion model |
||
class(structure_type), | intent(in) | :: | mol |
Molecular structure data |
||
real(kind=wp), | intent(in) | :: | gwvec(:,:,:) |
Weighting function for the atomic reference systems |
||
real(kind=wp), | intent(in), | optional | :: | gwdcn(:,:,:) |
Derivative of the weighting function w.r.t. the coordination number |
|
real(kind=wp), | intent(in), | optional | :: | gwdq(:,:,:) |
Derivative of the weighting function w.r.t. the partial charge |
|
real(kind=wp), | intent(out) | :: | alpha(:) |
Static polarizibilities for all atoms. |
||
real(kind=wp), | intent(out), | optional | :: | dadcn(:) |
Derivative of the polarizibility w.r.t. the coordination number |
|
real(kind=wp), | intent(out), | optional | :: | dadq(:) |
Derivative of the polarizibility w.r.t. the partial charge |
subroutine get_polarizibilities(self, mol, gwvec, gwdcn, gwdq, alpha, dadcn, dadq) !DEC$ ATTRIBUTES DLLEXPORT :: get_polarizibilities !> Instance of the dispersion model class(d4_model), intent(in) :: self !> Molecular structure data class(structure_type), intent(in) :: mol !> Weighting function for the atomic reference systems real(wp), intent(in) :: gwvec(:, :, :) !> Derivative of the weighting function w.r.t. the coordination number real(wp), intent(in), optional :: gwdcn(:, :, :) !> Derivative of the weighting function w.r.t. the partial charge real(wp), intent(in), optional :: gwdq(:, :, :) !> Static polarizibilities for all atoms. real(wp), intent(out) :: alpha(:) !> Derivative of the polarizibility w.r.t. the coordination number real(wp), intent(out), optional :: dadcn(:) !> Derivative of the polarizibility w.r.t. the partial charge real(wp), intent(out), optional :: dadq(:) integer :: iat, izp, iref real(wp) :: refa, da, dadcni, dadqi if (present(gwdcn).and.present(dadcn) & & .and.present(gwdq).and.present(dadq)) then alpha(:) = 0.0_wp dadcn(:) = 0.0_wp dadq(:) = 0.0_wp !$omp parallel do default(none) schedule(runtime) & !$omp shared(alpha, dadcn, dadq, mol, self, gwvec, gwdcn, gwdq) & !$omp private(iat, izp, iref, refa, da, dadqi, dadcni) do iat = 1, mol%nat izp = mol%id(iat) da = 0.0_wp dadcni = 0.0_wp dadqi = 0.0_wp do iref = 1, self%ref(izp) refa = self%aiw(1, iref, izp) da = da + gwvec(iref, iat, 1) * refa dadcni = dadcni + gwdcn(iref, iat, 1) * refa dadqi = dadqi + gwdq(iref, iat, 1) * refa end do alpha(iat) = da dadcn(iat) = dadcni dadq(iat) = dadqi end do else alpha(:) = 0.0_wp !$omp parallel do default(none) schedule(runtime) & !$omp shared(alpha, mol, self, gwvec) private(iat, izp, iref, refa, da) do iat = 1, mol%nat izp = mol%id(iat) da = 0.0_wp do iref = 1, self%ref(izp) da = da + gwvec(iref, iat, 1) * self%aiw(1, iref, izp) end do alpha(iat) = da end do end if end subroutine get_polarizibilities