--- trunk/src/math/SquareMatrix.hpp 2006/05/17 21:51:42 963 +++ trunk/src/math/SquareMatrix.hpp 2013/06/16 15:15:42 1879 @@ -6,19 +6,10 @@ * 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 + * 1. 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 + * 2. 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. @@ -37,6 +28,16 @@ * 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. + * + * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your + * research, please cite the appropriate papers when you publish your + * work. Good starting points are: + * + * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005). + * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006). + * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008). + * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010). + * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011). */ /** @@ -51,13 +52,13 @@ #include "math/RectMatrix.hpp" #include "utils/NumericConstant.hpp" -namespace oopse { +namespace OpenMD { /** * @class SquareMatrix SquareMatrix.hpp "math/SquareMatrix.hpp" * @brief A square matrix class - * @template Real the element type - * @template Dim the dimension of the square matrix + * \tparam Real the element type + * \tparam Dim the dimension of the square matrix */ template class SquareMatrix : public RectMatrix { @@ -124,7 +125,7 @@ namespace oopse { Real det; return det; } - + /** Returns the trace of this matrix. */ Real trace() const { Real tmp = 0; @@ -134,7 +135,26 @@ namespace oopse { return tmp; } + + /** + * Returns the tensor contraction (double dot product) of two rank 2 + * tensors (or Matrices) + * @param t1 first tensor + * @param t2 second tensor + * @return the tensor contraction (double dot product) of t1 and t2 + */ + Real doubleDot( const SquareMatrix& t1, const SquareMatrix& t2 ) { + Real tmp; + tmp = 0; + + for (unsigned int i = 0; i < Dim; i++) + for (unsigned int j =0; j < Dim; j++) + tmp += t1[i][j] * t2[i][j]; + + return tmp; + } + /** Tests if this matrix is symmetrix. */ bool isSymmetric() const { for (unsigned int i = 0; i < Dim - 1; i++) @@ -162,6 +182,19 @@ namespace oopse { return false; return true; + } + + /** + * Returns a column vector that contains the elements from the + * diagonal of m in the order R(0) = m(0,0), R(1) = m(1,1), and so + * on. + */ + Vector diagonals() const { + Vector result; + for (unsigned int i = 0; i < Dim; i++) { + result(i) = this->data_[i][i]; + } + return result; } /** Tests if this matrix is the unit matrix. */ @@ -199,7 +232,7 @@ namespace oopse { * @return true if success, otherwise return false * @param a symmetric matrix whose eigenvectors are to be computed. On return, the matrix is * overwritten - * @param w will contain the eigenvalues of the matrix On return of this function + * @param d will contain the eigenvalues of the matrix On return of this function * @param v the columns of this matrix will contain the eigenvectors. The eigenvectors are * normalized and mutually orthogonal. */ @@ -338,6 +371,10 @@ namespace oopse { //// this is NEVER called if ( i >= VTK_MAX_ROTATIONS ) { std::cout << "vtkMath::Jacobi: Error extracting eigenfunctions" << std::endl; + if (n > 4) { + delete[] b; + delete[] z; + } return 0; }