diff --git a/modules/geom/pymod/export_vecmat3_op.cc b/modules/geom/pymod/export_vecmat3_op.cc index 9e49c8686c52f3047686407e417c7f3d3ae1045f..b858001faac7bdaf6485c4433e6acb6b0da69cbd 100644 --- a/modules/geom/pymod/export_vecmat3_op.cc +++ b/modules/geom/pymod/export_vecmat3_op.cc @@ -39,7 +39,7 @@ Real (*Mat3Minor)(const Mat3& m, unsigned int i, unsigned int j) = &Minor; Vec3 (*Vec3Min)(const Vec3&, const Vec3&) = &Min; Vec3 (*Vec3Max)(const Vec3&, const Vec3&) = &Max; Real (*Vec3Distance2WithPBC)(const Vec3&, const Vec3&, const Vec3&) = &Distance2WithPBC; -Real (*Vec3DistanceWithPBC)(const Vec3&, const Vec3&, const Vec3&) = &DistanceWithPBC; +Real (*Vec3DistanceWithPBC)(const Vec3&, const Vec3&, const Vec3&) = &DistanceWithPBC; void export_VecMat3_op() { @@ -69,4 +69,6 @@ void export_VecMat3_op() def("DistanceWithPBC",Vec3DistanceWithPBC); def("MinDistance",MinDistance); def("MinDistanceWithPBC",MinDistanceWithPBC); + def("WrapVec3",WrapVec3); + def("WrapVec3List",WrapVec3List); } diff --git a/modules/geom/src/vecmat3_op.cc b/modules/geom/src/vecmat3_op.cc index ca7497b8c556cacc7543cf7f33cf52d27aa91223..50b5b612e939d66e6d8119ddced416ff87e52f99 100644 --- a/modules/geom/src/vecmat3_op.cc +++ b/modules/geom/src/vecmat3_op.cc @@ -227,5 +227,26 @@ Real MinDistanceWithPBC(const Vec3List& l1, const Vec3List& l2, Vec3& basis_vec) } return std::sqrt(min); } + +Vec3 WrapVec3(const Vec3& v1,const Vec3& box_center,const Vec3& basis_vec){ + Vec3 v; + Real r; + for (int i=0; i<3; i++) { + r=(v1[i]-box_center[i])/basis_vec[i]; + r=(r > 0.0) ? std::floor(r + 0.5) : std::ceil(r - 0.5); + v[i]=v1[i]-basis_vec[i]*r; + } + return v; +} + +Vec3List WrapVec3List(const Vec3List& vl, const Vec3& box_center,const Vec3& basis_vec){ + Vec3List vl_out; + vl_out.reserve(vl_out.size()); + for (Vec3List::const_iterator v1=vl.begin(),e=vl.end();v1!=e ; v1++) { + vl_out.push_back(WrapVec3(*v1,box_center,basis_vec)); + } + return vl_out; +} + } // ns diff --git a/modules/geom/src/vecmat3_op.hh b/modules/geom/src/vecmat3_op.hh index 53918c2e5571df472a3c66eadb41d8eca55a9fba..5489ea9e8f1c48f669053fafa45f14220b52384f 100644 --- a/modules/geom/src/vecmat3_op.hh +++ b/modules/geom/src/vecmat3_op.hh @@ -215,6 +215,13 @@ Real MinDistance(const Vec3List& l1, const Vec3List& l2); //! returns the minimal distance between the points in two Vec3List // with periodic boundaries in x,y,z given in basis_vec Real MinDistanceWithPBC(const Vec3List& l1, const Vec3List& l2, Vec3& basis_vec); + +//!wraps a vector in a box with periodic boundaries +Vec3 WrapVec3(const Vec3& v1,const Vec3& box_center,const Vec3& basis_vec); +//!wraps all the verctors in a Vec3List in a box with periodic boundaries +Vec3List WrapVec3List(const Vec3List& vl,const Vec3& box_center,const Vec3& basis_vec); + + } // ns #endif