--- trunk/src/math/Vector.hpp 2004/10/14 23:28:09 76 +++ trunk/src/math/Vector.hpp 2005/03/01 20:10:14 385 @@ -1,28 +1,44 @@ -/* - * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project - * - * Contact: oopse@oopse.org - * - * This program 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; either version 2.1 - * of the License, or (at your option) any later version. - * All we ask is that proper credit is given for our work, which includes - * - but is not limited to - adding the above copyright notice to the beginning - * of your source code files, and to any copyright notice that you may distribute - * with programs based on this work. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + /* + * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved. * + * The University of Notre Dame grants you ("Licensee") a + * non-exclusive, royalty free, license to use, modify and + * redistribute this software in source and binary code form, provided + * that the following conditions are met: + * + * 1. Acknowledgement of the program authors must be made in any + * publication of scientific results based in part on use of the + * program. An acceptable form of acknowledgement is citation of + * the article in which the program was described (Matthew + * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher + * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented + * Parallel Simulation Engine for Molecular Dynamics," + * J. Comput. Chem. 26, pp. 252-271 (2005)) + * + * 2. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 3. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * This software is provided "AS IS," without a warranty of any + * kind. All express or implied conditions, representations and + * warranties, including any implied warranty of merchantability, + * fitness for a particular purpose or non-infringement, are hereby + * excluded. The University of Notre Dame and its licensors shall not + * be liable for any damages suffered by licensee as a result of + * using, modifying or distributing the software or its + * derivatives. In no event will the University of Notre Dame or its + * licensors be liable for any lost revenue, profit or data, or for + * direct, indirect, special, consequential, incidental or punitive + * damages, however caused and regardless of the theory of liability, + * arising out of the use of or inability to use software, even if the + * University of Notre Dame has been advised of the possibility of + * such damages. */ - + /** * @file Vector.hpp * @author Teng Lin @@ -36,10 +52,10 @@ #include #include #include - +#include namespace oopse { - const double epsilon = 0.000001; + static const double epsilon = 0.000001; template inline bool equal(T e1, T e2) { @@ -55,6 +71,7 @@ namespace oopse { inline bool equal(double e1, double e2) { return fabs(e1 - e2) < epsilon; } + /** * @class Vector Vector.hpp "math/Vector.hpp" @@ -64,10 +81,13 @@ namespace oopse { class Vector{ public: + typedef Real ElemType; + typedef Real* ElemPoinerType; + /** default constructor */ inline Vector(){ for (unsigned int i = 0; i < Dim; i++) - data_[i] = 0.0; + this->data_[i] = 0; } /** Constructs and initializes a Vector from a vector */ @@ -81,15 +101,21 @@ namespace oopse { return *this; for (unsigned int i = 0; i < Dim; i++) - data_[i] = v[i]; + this->data_[i] = v[i]; return *this; } + + template + inline Vector(const T& s){ + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] = s; + } /** Constructs and initializes a Vector from an array */ - inline Vector( double* v) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] = v[i]; + inline Vector( Real* v) { + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] = v[i]; } /** @@ -97,9 +123,9 @@ namespace oopse { * @return reference of ith element * @param i index */ - inline double& operator[](unsigned int i) { + inline Real& operator[](unsigned int i) { assert( i < Dim); - return data_[i]; + return this->data_[i]; } /** @@ -107,9 +133,9 @@ namespace oopse { * @return reference of ith element * @param i index */ - inline double& operator()(unsigned int i) { + inline Real& operator()(unsigned int i) { assert( i < Dim); - return data_[i]; + return this->data_[i]; } /** @@ -117,9 +143,9 @@ namespace oopse { * @return reference of ith element * @param i index */ - inline const double& operator[](unsigned int i) const { + inline const Real& operator[](unsigned int i) const { assert( i < Dim); - return data_[i]; + return this->data_[i]; } /** @@ -127,11 +153,23 @@ namespace oopse { * @return reference of ith element * @param i index */ - inline const double& operator()(unsigned int i) const { + inline const Real& operator()(unsigned int i) const { assert( i < Dim); - return data_[i]; + return this->data_[i]; } + /** Copy the internal data to an array*/ + void getArray(Real* array) { + for (unsigned int i = 0; i < Dim; i ++) { + array[i] = this->data_[i]; + } + } + + /** Returns the pointer of internal array */ + Real* getArrayPointer() { + return this->data_; + } + /** * Tests if this vetor is equal to other vector * @return true if equal, otherwise return false @@ -140,7 +178,7 @@ namespace oopse { inline bool operator ==(const Vector& v) { for (unsigned int i = 0; i < Dim; i ++) { - if (!equal(data_[i], v[i])) { + if (!equal(this->data_[i], v[i])) { return false; } } @@ -159,9 +197,8 @@ namespace oopse { /** Negates the value of this vector in place. */ inline void negate() { - data_[0] = -data_[0]; - data_[1] = -data_[1]; - data_[2] = -data_[2]; + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] = -this->data_[i]; } /** @@ -170,7 +207,7 @@ namespace oopse { */ inline void negate(const Vector& v1) { for (unsigned int i = 0; i < Dim; i++) - data_[i] = -v1.data_[i]; + this->data_[i] = -v1.data_[i]; } @@ -179,9 +216,9 @@ namespace oopse { * @param v1 the other vector */ inline void add( const Vector& v1 ) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] += v1.data_[i]; - } + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] += v1.data_[i]; + } /** * Sets the value of this vector to the sum of v1 and v2 (*this = v1 + v2). @@ -189,8 +226,8 @@ namespace oopse { * @param v2 the second vector */ inline void add( const Vector& v1, const Vector& v2 ) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] = v1.data_[i] + v2.data_[i]; + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] = v1.data_[i] + v2.data_[i]; } /** @@ -199,7 +236,7 @@ namespace oopse { */ inline void sub( const Vector& v1 ) { for (unsigned int i = 0; i < Dim; i++) - data_[i] -= v1.data_[i]; + this->data_[i] -= v1.data_[i]; } /** @@ -209,36 +246,36 @@ namespace oopse { */ inline void sub( const Vector& v1, const Vector &v2 ){ for (unsigned int i = 0; i < Dim; i++) - data_[i] = v1.data_[i] - v2.data_[i]; + this->data_[i] = v1.data_[i] - v2.data_[i]; } /** * Sets the value of this vector to the scalar multiplication of itself (*this *= s). * @param s the scalar value */ - inline void mul( double s ) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] *= s; + inline void mul( Real s ) { + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] *= s; } /** * Sets the value of this vector to the scalar multiplication of vector v1 * (*this = s * v1). + * @param v1 the vector * @param s the scalar value - * @param v1 the vector */ - inline void mul( double s, const Vector& v1 ) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] = s * v1.data_[i]; + inline void mul( const Vector& v1, Real s) { + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] = s * v1.data_[i]; } /** * Sets the value of this vector to the scalar division of itself (*this /= s ). * @param s the scalar value */ - inline void div( double s) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] /= s; + inline void div( Real s) { + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] /= s; } /** @@ -246,9 +283,9 @@ namespace oopse { * @param v1 the source vector * @param s the scalar value */ - inline void div( const Vector& v1, double s ) { - for (unsigned int i = 0; i < Dim; i++) - data_[i] = v1.data_[i] / s; + inline void div( const Vector& v1, Real s ) { + for (unsigned int i = 0; i < Dim; i++) + this->data_[i] = v1.data_[i] / s; } /** @see #add */ @@ -264,13 +301,13 @@ namespace oopse { } /** @see #mul */ - inline Vector& operator *=( double s) { + inline Vector& operator *=( Real s) { mul(s); return *this; } /** @see #div */ - inline Vector& operator /=( double s ) { + inline Vector& operator /=( Real s ) { div(s); return *this; } @@ -279,36 +316,49 @@ namespace oopse { * Returns the length of this vector. * @return the length of this vector */ - inline double length() { - return sqrt(lengthSquared()); + inline Real length() { + return sqrt(lengthSquare()); } /** * Returns the squared length of this vector. * @return the squared length of this vector */ - inline double lengthSquared() { + inline Real lengthSquare() { return dot(*this, *this); } /** Normalizes this vector in place */ inline void normalize() { - double len; + Real len; len = length(); + + //if (len < oopse:epsilon) + // throw(); + *this /= len; } + + /** + * Tests if this vector is normalized + * @return true if this vector is normalized, otherwise return false + */ + inline bool isNormalized() { + return equal(lengthSquare(), 1.0); + } protected: - double data_[3]; + Real data_[Dim]; }; /** unary minus*/ template inline Vector operator -(const Vector& v1){ - Vector tmp(v1); - return tmp.negate(); + Vector tmp(v1); + tmp.negate(); + return tmp; } /** @@ -345,9 +395,9 @@ namespace oopse { * @param s the scalar value */ template - Vector operator * ( const Vector& v1, double s) { + Vector operator * ( const Vector& v1, Real s) { Vector result; - result.mul(s, v1); + result.mul(v1,s); return result; } @@ -358,9 +408,9 @@ namespace oopse { * @param v1 the source vector */ template - Vector operator * ( double s, const Vector& v1 ) { + Vector operator * ( Real s, const Vector& v1 ) { Vector result; - result.mul(s, v1); + result.mul(v1, s); return result; } @@ -371,33 +421,13 @@ namespace oopse { * @param s the scalar value */ template - Vector operator / ( const Vector& v1, double s) { + Vector operator / ( const Vector& v1, Real s) { Vector result; result.div( v1,s); return result; } /** - * Returns the value of division of a vector by a scalar. - * @return the vaule of scalar division of this vector - * @param s the scalar value - * @param v1 the source vector - */ - template - inline Vector operator /( double s, const Vector& v1 ) { - Vector result; - result.div( v1,s); - return result; - } - - /** fuzzy comparson */ - template - inline bool epsilonEqual( const Vector& v1, const Vector& v2 ) { - - } - - - /** * Returns the dot product of two Vectors * @param v1 first vector * @param v2 second vector @@ -405,13 +435,13 @@ namespace oopse { */ template inline Real dot( const Vector& v1, const Vector& v2 ) { - Real tmp; - tmp = 0; + Real tmp; + tmp = 0; - for (unsigned int i = 0; i < Dim; i++) - tmp += v1[i] + v2[i]; - - return tmp; + for (unsigned int i = 0; i < Dim; i++) + tmp += v1[i] * v2[i]; + + return tmp; } /** @@ -442,8 +472,19 @@ namespace oopse { * Write to an output stream */ template - std::ostream &operator<< ( std::ostream& o, const Vector& v1 ) { + std::ostream &operator<< ( std::ostream& o, const Vector& v) { + + o << "[ "; + for (unsigned int i = 0 ; i< Dim; i++) { + o << v[i]; + + if (i != Dim -1) { + o<< ", "; + } + } + + o << " ]"; return o; }