/* []----------------------------------------[] | Vector.h | []----------------------------------------[] | | | AUTHOR: MFSomers 2005. | | USE: Vector type def... | | | []----------------------------------------[] */ // Copyright (C) 2005 M.F. Somers, Theoretical Chemistry Department, Leiden University // // This is free software; you can redistribute it and/or modify it under the terms of // the GNU Lesser General Public License as published by the Free Software Foundation. // // http://www.gnu.org/licenses/lgpl.txt #if !defined(__VECTOR_INCLUDED__) #define __VECTOR_INCLUDED__ #include "Constants.h" #include "Global.h" #include "Rand.h" /* ----------------------------------------------------------------------- */ /* the type definion of a vector */ typedef struct { double X, Y, Z; } Vector; /* ----------------------------------------------------------------------- */ /* Some basic vector operators */ inline Vector operator+( const Vector& A, const Vector& B ) { Vector C; C.X = A.X + B.X; C.Y = A.Y + B.Y; C.Z = A.Z + B.Z; return( C ); }; /* ----------------------------------------------------------------------- */ inline Vector operator-( const Vector& A, const Vector& B ) { Vector C; C.X = A.X - B.X; C.Y = A.Y - B.Y; C.Z = A.Z - B.Z; return( C ); }; /* ----------------------------------------------------------------------- */ inline Vector& operator+=( Vector& A, const Vector& B ) { A.X += B.X; A.Y += B.Y; A.Z += B.Z; return( A ); } /* ----------------------------------------------------------------------- */ inline Vector& operator-=( Vector& A, const Vector& B ) { A.X -= B.X; A.Y -= B.Y; A.Z -= B.Z; return( A ); } /* ----------------------------------------------------------------------- */ inline Vector operator*( const Vector& A, double B ) { Vector C; C.X = A.X * B; C.Y = A.Y * B; C.Z = A.Z * B; return( C ); } /* ----------------------------------------------------------------------- */ inline Vector operator*( double A, const Vector& B ) { return( B * A ); } /* ----------------------------------------------------------------------- */ inline Vector& operator*=( Vector& A, double B ) { A.X *= B; A.Y *= B; A.Z *= B; return( A ); } /* ----------------------------------------------------------------------- */ inline Vector operator/( const Vector& A, double B ) { Vector C; C.X = A.X / B; C.Y = A.Y / B; C.Z = A.Z / B; return( C ); } /* ----------------------------------------------------------------------- */ inline Vector& operator/=( Vector& A, double B ) { A.X /= B; A.Y /= B; A.Z /= B; return( A ); } /* ----------------------------------------------------------------------- */ inline double Abs( const Vector& A ) { return( sqrt( A.X*A.X + A.Y*A.Y + A.Z*A.Z ) ); } /* ----------------------------------------------------------------------- */ inline double AbsSqr( const Vector& A ) { return( A.X*A.X + A.Y*A.Y + A.Z*A.Z ); } /* ----------------------------------------------------------------------- */ inline double Dot( const Vector& A, const Vector& B ) { return( A.X*B.X + A.Y*B.Y + A.Z*B.Z ); } /* ----------------------------------------------------------------------- */ /* Now the more complicated (non-inlined) Vector functions... */ double Angle( const Vector& A, const Vector& B ); Vector Cross( const Vector& A, const Vector& B ); Vector SphericalToCartesian( double r, double theta, double phi ); void CartesianToSpherical( const Vector& V, double& r, double& theta, double& phi ); void RotateVectorAroundAxis( Vector& V, Vector RotationAxis, double Angle ); Vector MimimumSystemImageConventionVector( const Vector& V, const Vector& TheBox ); Vector ARandomNormalizedVector( void ); ostream& operator<<( ostream& out, const Vector& A ); istream& operator>>( istream& in, Vector& A ); /* ----------------------------------------------------------------------- */ #endif