51 RPYMobility::RPYMobility(
const std::vector<RealType>& radii,
53 N_(radii.size()), eta_(viscosity), a_(radii) {
54 std::size_t n3 = 3 * N_;
62 for (std::size_t i = 0; i < N_; ++i) {
63 for (std::size_t j = 0; j < N_; ++j) {
65 (i == j) ? RPY::muTT_self(a_[i], eta_)
66 :
RPY::muTT(positions[i] - positions[j], a_[i], a_[j],
70 M_.setSubMatrix(3 * i, 3 * j, block);
84 CholeskyDecomposition(R_, S_);
93 RealType dmax = R_.diagonals().abs().max();
94 RealType eps = std::sqrt(dmax) * std::numeric_limits<RealType>::epsilon();
95 for (std::size_t k = 0; k < 3 * N_; ++k)
96 if (!(S_(k, k) > eps)) spd_ =
false;
102 const std::vector<Vector3d>& positions,
103 const std::vector<Vector3d>& ambient,
const Mat3x3d& E)
const {
104 std::vector<Vector3d> vEff(ambient);
105 for (std::size_t i = 0; i < N_; ++i) {
106 for (std::size_t j = 0; j < N_; ++j) {
107 if (i == j)
continue;
116 const std::vector<Vector3d>& vEff,
117 const std::vector<Vector3d>& vel)
const {
123 for (std::size_t i = 0; i < N_; ++i)
124 for (
int p = 0; p < 3; ++p)
125 dv[3 * i + p] = vEff[i][p] - vel[i][p];
129 std::vector<Vector3d> f(N_, V3Zero);
130 for (std::size_t i = 0; i < N_; ++i)
131 for (
int p = 0; p < 3; ++p)
132 f[i][p] = fv[3 * i + p];
145 for (std::size_t k = 0; k < 3 * N_; ++k)
149 RealType scale = std::sqrt(2.0 * kT / dt);
151 std::vector<Vector3d> f(N_, V3Zero);
152 for (std::size_t i = 0; i < N_; ++i)
153 for (
int p = 0; p < 3; ++p)
154 f[i][p] = scale * fv[3 * i + p];
LAPACK-backed fast paths for the dynamic, double-precision dense routines, dispatched by overload.
Pairwise Rotne-Prager-Yamakawa mobility blocks for a bead model.
Mat3x3d muTT(const Vector3d &rij, RealType ai, RealType aj, RealType eta)
translation-translation, carries 1/eta
Vector3d muTD_dot_E(const Vector3d &rij, RealType ai, RealType aj, const Mat3x3d &E)
mu_td_ij : E -> translational disturbance velocity at bead i = hat1 (E rhat) + hat3 (rhat ....
Per-molecule translation-only RPY mobility / resistance assembly.
Rectangular matrix class with contiguous flat storage.
Rectangular matrix class with contiguous flat storage.
Dynamically-sized vector class.
std::vector< Vector3d > randomForce(const std::vector< RealType > &Z, RealType kT, RealType dt) const
FDT random force: sqrt(2 kT / dt) * S * Z, with Z a 3N vector of independent standard normal draws (r...
std::vector< Vector3d > dragForce(const std::vector< Vector3d > &vEff, const std::vector< Vector3d > &vel) const
Hydrodynamic drag: f_i = sum_j R_ij ( vEff_j - vel_j ).
bool update(const std::vector< Vector3d > &positions)
(Re)build M, R = M^{-1}, and S = chol(R) from current bead positions. Positions must be the unwrapped...
std::vector< Vector3d > effectiveAmbient(const std::vector< Vector3d > &positions, const std::vector< Vector3d > &ambient, const Mat3x3d &E) const
vinf_eff_i = ambient_i + sum{j!=i} mu_td_ij : E (E symmetric traceless)
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.
bool invertMatrix(MatrixType &A, MatrixType &AI)
Invert input square matrix A into matrix AI.