21#ifndef VOTCA_XTP_EWALDPERIODICDIPOLEOPERATOR_H
22#define VOTCA_XTP_EWALDPERIODICDIPOLEOPERATOR_H
300class EwaldPeriodicDipoleOperator;
313struct traits<
votca::xtp::EwaldPeriodicDipoleOperator>
314 :
public Eigen::internal::traits<Eigen::MatrixXd> {};
322 :
public Eigen::EigenBase<EwaldPeriodicDipoleOperator> {
369 std::vector<Index> ids,
double alpha_ewald,
404 operator bool()
const {
return row_ <
xpr_.size_; }
420 template <
typename Vtype>
421 Eigen::Product<EwaldPeriodicDipoleOperator, Vtype, Eigen::AliasFreeProduct>
424 Eigen::AliasFreeProduct>(*
this, x.derived());
435 Eigen::VectorXd
multiply(
const Eigen::VectorXd& v)
const;
442 Eigen::VectorXd
RawMultiply(
const Eigen::VectorXd& v)
const;
451 Eigen::VectorXd& result)
const;
505template <
typename Vtype>
506struct generic_product_impl<
votca::xtp::EwaldPeriodicDipoleOperator, Vtype,
507 DenseShape, DenseShape, GemvProduct>
508 : generic_product_impl_base<
509 votca::xtp::EwaldPeriodicDipoleOperator, Vtype,
510 generic_product_impl<votca::xtp::EwaldPeriodicDipoleOperator,
513 typename Product<votca::xtp::EwaldPeriodicDipoleOperator, Vtype>::Scalar
516 template <
typename Dest>
519 const Vtype& v,
const Scalar& alpha) {
520 assert(alpha ==
Scalar(1) &&
"scaling is not implemented");
521 EIGEN_ONLY_USED_FOR_DEBUG(alpha);
522 Eigen::VectorXd temp = op.
multiply(v);
523 dst = temp.cast<
Scalar>();
InnerIterator & operator++()
const EwaldPeriodicDipoleOperator & xpr_
InnerIterator(const EwaldPeriodicDipoleOperator &xpr, const Index &id)
std::pair< Index, Index > LocateSite(Index i) const
votca::Index StorageIndex
EwaldRealSpaceInteractor intra_interactor_
Eigen::Product< EwaldPeriodicDipoleOperator, Vtype, Eigen::AliasFreeProduct > operator*(const Eigen::MatrixBase< Vtype > &x) const
Eigen::Matrix3d self_field_matrix_
double operator()(Index i, Index j) const
const EwaldRealSpaceSum & real_sum_
EwaldRegistry & registry_
void AddIntraSegmentCoupling(const Eigen::VectorXd &v, Eigen::VectorXd &result) const
RawMultiplyTimings timings_
Eigen::VectorXd RawMultiply(const Eigen::VectorXd &v) const
EwaldPeriodicDipoleOperator(EwaldRegistry ®istry, const EwaldRealSpaceSum &real_sum, const EwaldReciprocalSpaceSum &recip_sum, const EwaldShapeCorrection &shape, std::vector< Index > ids, double alpha_ewald, double thole_a)
const EwaldShapeCorrection & shape_
Eigen::VectorXd baseline_
const RawMultiplyTimings & Timings() const
std::vector< Index > ids_
const EwaldReciprocalSpaceSum & recip_sum_
std::vector< Index > offsets_
Eigen::VectorXd multiply(const Eigen::VectorXd &v) const
Provides a means for comparing floating point numbers.
Product< votca::xtp::EwaldPeriodicDipoleOperator, Vtype >::Scalar Scalar
static void scaleAndAddTo(Dest &dst, const votca::xtp::EwaldPeriodicDipoleOperator &op, const Vtype &v, const Scalar &alpha)