8 #include "MonoclinicBoundary.h" 9 #include <util/space/Vector.h> 10 #include <util/space/Dimension.h> 11 #include <util/random/Random.h> 12 #include <util/math/Constants.h> 13 #include <util/math/feq.h> 14 #include <util/format/Dbl.h> 24 : lattice_(Monoclinic)
35 bravaisBasisVectors_[i][i] = l_[i];
37 reciprocalBasisVectors_[i][i] = twoPi / l_[i];
70 void MonoclinicBoundary::reset()
76 halfL_[i] = 0.5*l_[i];
78 bravaisBasisVectors_[i][i] = l_[i];
79 reciprocalBasisVectors_[i][i] = twoPi/l_[i];
81 bravaisBasisVectors_[1][2] = d_;
82 reciprocalBasisVectors_[2][1] = -twoPi*d_/(l_[1]*l_[2]);
84 volume_ = l_[0] * l_[1] * l_[2];
85 e_ = sqrt(l_[1]*l_[1] + d_*d_);
90 lengths_[2] = l_[2] / sqrt(1.0 + c3_*c3_);
92 minLength_ = lengths_[0];
94 if (lengths_[i] < minLength_) {
95 minLength_ = lengths_[i];
110 Rg[i] = random.
uniform(0.0, 1.0);
124 if (maxima_[i] <= minima_[i]) {
127 if (!
feq(l_[i], maxima_[i] - minima_[i])) {
128 UTIL_THROW(
"l_[i] != maxima_[i] - minima_[i]");
130 if (!
feq(halfL_[i], 0.5*l_[i])) {
133 if (!
feq(minima_[i], 0.0)) {
136 if (!
feq(l_[i]*invL_[i], 1.0)) {
140 dot = bravaisBasisVectors_[i].dot(reciprocalBasisVectors_[j]);
142 if (!
feq(dot, twoPi)) {
146 if (!
feq(dot, 0.0)) {
152 if (!
feq(volume_, l_[0]*l_[1]*l_[2])) {
165 if (lattice != Monoclinic) {
180 out << boundary.lattice_ <<
" ";
181 out << boundary.l_ <<
" ";
190 using namespace Simp;
193 void send<MonoclinicBoundary>(MPI::Comm& comm,
196 send<Vector>(comm, data.l_, dest, tag);
197 send<double>(comm, data.d_, dest, tag + 386);
201 void recv<MonoclinicBoundary>(MPI::Comm& comm,
206 recv<Vector>(comm, l, source, tag);
207 recv<double>(comm, d, source, tag + 386);
208 data.setMonoclinic(l, d);
212 void bcast<MonoclinicBoundary>(MPI::Intracomm& comm,
217 int rank = comm.Get_rank();
222 bcast<Vector>(comm, l, root);
223 bcast<double>(comm, d, root);
225 data.setMonoclinic(l, d);
const int Dimension
Dimensionality of space.
friend std::ostream & operator<<(std::ostream &out, const MonoclinicBoundary &boundary)
ostream inserter
A Vector is a Cartesian vector.
static const Vector Zero
Zero Vector = {0.0, 0.0, 0.0}.
void transformGenToCart(const Vector &Rg, Vector &Rc) const
Transform Vector of generalized coordinates to Cartesian coordinates.
void setOrthorhombic(const Vector &lengths)
Invalid function for monoclinic - throws Exception.
File containing preprocessor macros for error handling.
Classes used by all simpatico molecular simulations.
double uniform()
Return a random floating point number x, uniformly distributed in the range 0 <= x < 1...
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
MonoclinicBoundary()
Constructor.
Utility classes for scientific computation.
friend std::istream & operator>>(std::istream &in, MonoclinicBoundary &boundary)
istream extractor
void setMonoclinic(const Vector &lengths, const double d)
Set unit cell dimensions for orthorhombic boundary.
LatticeSystem
Enumeration of the 7 possible Bravais lattice systems.
A monoclinic periodic unit cell.
static const double Pi
Trigonometric constant Pi.
void randomPosition(Random &random, Vector &r) const
Generate random Cartesian position within the primary unit cell.
bool isValid()
Return true if valid, or throw Exception.
const Vector & lengths() const
Get Vector of distances between faces of primitive cell.
bool feq(double x, double y, double eps=1.0E-10)
Are two floating point numbers equal to within round-off error?