1 #ifndef SIMP_MONOCLINIC_BOUNDARY_H 2 #define SIMP_MONOCLINIC_BOUNDARY_H 11 #include <util/crystal/LatticeSystem.h> 12 #include <util/containers/FSArray.h> 13 #include <util/space/Vector.h> 14 #include <util/space/IntVector.h> 15 #include <util/space/Dimension.h> 21 class MonoclinicBoundaryTest;
26 template <
class T>
void send(MPI::Comm& comm, T& data,
int dest,
int tag);
27 template <
class T>
void recv(MPI::Comm& comm, T& data,
int source,
int tag);
28 template <
class T>
void bcast(MPI::Intracomm& comm, T& data,
int root);
75 template <
class Archive>
76 void serialize(Archive& ar,
const unsigned int version);
239 double length(
int i)
const;
333 friend class ::MonoclinicBoundaryTest;
336 friend std::istream&
operator >> (std::istream& in,
340 friend std::ostream&
operator << (std::ostream& out,
348 int source,
int tag);
373 {
return lengths_[i]; }
385 {
return bravaisBasisVectors_[i]; }
391 {
return reciprocalBasisVectors_[i]; }
397 {
return minLength_; }
404 if(r[0] >= maxima_[0]) {
406 assert(r[0] < maxima_[0]);
408 if (r[0] < minima_[0]) {
410 assert(r[0] >= minima_[0]);
412 if(r[1] >= maxima_[1]) {
415 assert(r[1] < l_[1]);
417 if (r[1] < minima_[1]) {
420 assert(r[1] >= minima_[1]);
422 double u2 = r[2] + c3_*r[1];
423 if(u2 >= maxima_[2]) {
425 assert(r[2] + c3_*r[1] >= minima_[2]);
427 if (u2 < minima_[2]) {
429 assert(r[2] + c3_*r[1] >= minima_[2]);
438 if (r[0] >= maxima_[0]) {
441 assert(r[0] < maxima_[0]);
443 if (r[0] < minima_[0]) {
446 assert(r[0] >= minima_[0]);
448 if (r[1] >= maxima_[1]) {
452 assert(r[1] < l_[1]);
454 if (r[1] < minima_[1]) {
458 assert(r[1] >= minima_[1]);
460 double u2 = r[2] + c3_*r[1];
461 if (u2 >= maxima_[2]) {
464 assert(r[2] + c3_*r[1] < maxima_[2]);
466 if (u2 < minima_[2]) {
469 assert(r[2] + c3_*r[1] >= minima_[2]);
537 double dx = r1[0] - r2[0];
538 if ( fabs(dx) > halfL_[0] ) {
546 assert(fabs(dx) <= halfL_[0]);
551 double dy = r1[1] - r2[1];
552 double dz = r1[2] - r2[2];
553 double u2 = dz + c3_*dy;
554 if ( fabs(dy) > halfL_[1] ) {
564 assert(fabs(dy) <= halfL_[1]);
569 if ( fabs(u2) > halfL_[2]) {
577 assert(fabs(dz + c3_*dy) <= halfL_[2]);
581 return dx*dx+dy*dy+dz*dz;
592 double dx = r1[0] - r2[0];
593 if ( fabs(dx) > halfL_[0] ) {
599 assert(fabs(dx) <= halfL_[0]);
602 double dy = r1[1] - r2[1];
603 double dz = r1[2] - r2[2];
604 double u2 = dz + c3_*dy;
605 if ( fabs(dy) > halfL_[1] ) {
613 assert(fabs(dy) <= halfL_[1]);
616 if ( fabs(u2) > halfL_[2]) {
622 assert(fabs(dz+c3_*dy) <= halfL_[2]);
625 return dx*dx+dy*dy+dz*dz;
636 double dx = r1[0] - r2[0];
637 if (fabs(dx) > halfL_[0]) {
643 assert(fabs(dx) <= halfL_[0]);
646 double dy = r1[1] - r2[1];
647 double dz = r1[2] - r2[2];
648 double u2 = dz + c3_*dy;
650 if (fabs(dy) > halfL_[1]) {
658 assert(fabs(dy) <= halfL_[1]);
661 if (fabs(u2) > halfL_[2]) {
667 assert(fabs(dz+c3_*dy) <= halfL_[2]);
674 return (dx*dx + dy*dy + dz*dz);
709 Rg[0] = Rc[0] * invL_[0];
710 Rg[1] = Rc[1] * invL_[1];
711 Rg[2] = (Rc[2] + c3_ *Rc[1]) * invL_[2];
723 Rc[2] = Rg[2]*l_[2] + Rg[1]*d_;
729 template <
class Archive>
void 734 if (Archive::is_loading()) {
744 #include <util/mpi/MpiTraits.h> 749 using namespace Simp;
763 int source,
int tag);
784 #endif // ifdef UTIL_MPI 785 #endif // ifndef UTIL_MONOCLINIC_BOUNDARY_H const int Dimension
Dimensionality of space.
friend std::ostream & operator<<(std::ostream &out, const MonoclinicBoundary &boundary)
ostream inserter
A Vector is a Cartesian vector.
void applyShift(Vector &r, int i, int t) const
Shift Cartesian Vector r by multiple t of a Bravais lattice vector.
const Vector & bravaisBasisVector(int i) const
Return Bravais lattice vector i.
void recv(MPI::Comm &comm, T &data, int source, int tag)
Receive a single T value.
static bool hasType
Is the MPI type initialized?
void serialize(Archive &ar, const unsigned int version)
Serialize to/from an archive.
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.
void send(MPI::Comm &comm, T &data, int dest, int tag)
Send a single T value.
void bcast< MonoclinicBoundary >(MPI::Intracomm &comm, MonoclinicBoundary &data, int root)
Broadcast an MonoclinicBoundary via MPI.
double length(int i) const
Get distance across primitive cell along reciprocal basis vector i.
A fixed capacity (static) contiguous array with a variable logical size.
void shift(Vector &r) const
Shift Vector r to its image within the primary unit cell.
void bcast(MPI::Intracomm &comm, T &data, int root)
Broadcast a single T value.
MonoclinicBoundary()
Constructor.
Utility classes for scientific computation.
void recv< MonoclinicBoundary >(MPI::Comm &comm, MonoclinicBoundary &data, int source, int tag)
Receive an MonoclinicBoundary via MPI.
void transformCartToGen(const Vector &Rc, Vector &Rg) const
Transform Vector of Cartesian coordinates to generalized coordinates.
friend std::istream & operator>>(std::istream &in, MonoclinicBoundary &boundary)
istream extractor
void send< MonoclinicBoundary >(MPI::Comm &comm, MonoclinicBoundary &data, int dest, int tag)
Send an MonoclinicBoundary via MPI.
void setMonoclinic(const Vector &lengths, const double d)
Set unit cell dimensions for orthorhombic boundary.
LatticeSystem
Enumeration of the 7 possible Bravais lattice systems.
void shiftGen(Vector &r) const
Shift generalized Vector r to its primary image.
A monoclinic periodic unit cell.
static MPI::Datatype type
MPI Datatype.
void randomPosition(Random &random, Vector &r) const
Generate random Cartesian position within the primary unit cell.
This file contains templates for global functions send<T>, recv<T> and bcast<T>.
bool isValid()
Return true if valid, or throw Exception.
An IntVector is an integer Cartesian vector.
const Vector & lengths() const
Get Vector of distances between faces of primitive cell.
double distanceSq(const Vector &r1, const Vector &r2) const
Return square distance between r1 and r2, with minimum image convention.
const Vector & reciprocalBasisVector(int i) const
Return reciprocal lattice basis vector i.
LatticeSystem latticeSystem()
Return actual lattice system.
double minLength() const
Get minimum length across primitive unit cell.
double volume() const
Return unit cell volume.