8 #include "OrthorhombicBoundary.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> 27 lattice_(Orthorhombic)
32 bravaisBasisVectors_[i][i] =
lengths_[i];
50 lattice_ = Orthorhombic;
62 lattice_ = Tetragonal;
81 void OrthorhombicBoundary::reset()
86 bravaisBasisVectors_[i][i] =
lengths_[i];
127 UTIL_THROW(
"invLengths_[i]*lengths_[i] != 1.0");
129 if (!
feq(
lengths_[i], bravaisBasisVectors_[i][i])) {
130 UTIL_THROW(
"bravaisBasisVectors_[i][i] != lengths_[i]");
133 dot = bravaisBasisVectors_[i].dot(reciprocalBasisVectors_[j]);
135 if (!
feq(dot, twoPi)) {
139 if (!
feq(dot, 0.0)) {
142 if (!
feq(bravaisBasisVectors_[i][j], 0.0)) {
143 UTIL_THROW(
"Nonzero off-diagonal element of bravaisBasisVectors_");
145 if (!
feq(reciprocalBasisVectors_[i][j], 0.0)) {
146 UTIL_THROW(
"Nonzero off-diagonal element of reciprocalBasisVectors_");
161 if (lattice == Orthorhombic) {
164 if (lattice == Tetragonal) {
171 if (lattice == Cubic) {
178 UTIL_THROW(
"Lattice must be orthorhombic, tetragonal or cubic");
180 boundary.lattice_ = lattice;
191 out << boundary.lattice_ <<
" ";
192 if (boundary.lattice_ == Orthorhombic) {
195 if (boundary.lattice_ == Tetragonal) {
199 if (boundary.lattice_ == Cubic) {
210 void send<Simp::OrthorhombicBoundary>(MPI::Comm& comm,
214 send<Vector>(comm,
lengths, dest, tag);
218 void recv<Simp::OrthorhombicBoundary>(MPI::Comm& comm,
222 recv<Vector>(comm,
lengths, source, tag);
223 data.setOrthorhombic(lengths);
227 void bcast<Simp::OrthorhombicBoundary>(MPI::Intracomm& comm,
231 int rank = comm.Get_rank();
233 lengths = data.lengths();
235 bcast<Vector>(comm,
lengths, root);
237 data.setOrthorhombic(lengths);
bool isValid()
Return true if valid, or throw Exception.
const int Dimension
Dimensionality of space.
A Vector is a Cartesian vector.
void resetRegion()
Set lengths and volume to values consistent with minima and maxima.
void setTetragonal(double a, double bc)
Set unit cell dimensions for tetragonal boundary.
void randomPosition(Random &random, Vector &r) const
Generate random position within the primary unit cell.
void setOrthorhombic(const Vector &lengths)
Set unit cell dimensions for orthorhombic boundary.
const Vector & lengths() const
Get Vector of unit cell lengths by const reference.
An orthorhombic periodic unit cell.
bool isValid()
Return true if valid, or throw Exception.
static const Vector Zero
Zero Vector = {0.0, 0.0, 0.0}.
void setCubic(double a)
Set unit cell dimensions for a cubic boundary.
Wrapper for a double precision number, for formatted ostream output.
friend std::istream & operator>>(std::istream &in, Simp::OrthorhombicBoundary &boundary)
istream extractor
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...
Vector minima_
Minimum coordinates: Require r[i] >= minima_[i].
Vector lengths_
OrthoRegion lengths: lengths_[i] = maxima_[i] - minima_[i].
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
Utility classes for scientific computation.
Vector maxima_
Maximum coordinates: Require r[i] < maxima_[i].
LatticeSystem
Enumeration of the 7 possible Bravais lattice systems.
friend std::ostream & operator<<(std::ostream &out, const Simp::OrthorhombicBoundary &boundary)
ostream inserter
static const double Pi
Trigonometric constant Pi.
OrthorhombicBoundary()
Constructor.
bool feq(double x, double y, double eps=1.0E-10)
Are two floating point numbers equal to within round-off error?
A region with orthogonal edges parallel to the x, y, and z axes.