ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/math/DynamicRectMatrix.hpp
Revision: 3520
Committed: Mon Sep 7 16:31:51 2009 UTC (15 years, 7 months ago) by cli2
File size: 18815 byte(s)
Log Message:
Added new restraint infrastructure
Added MolecularRestraints
Added ObjectRestraints
Added RestraintStamp
Updated thermodynamic integration to use ObjectRestraints
Added Quaternion mathematics for twist swing decompositions
Significantly updated RestWriter and RestReader to use dump-like files
Added selections for x, y, and z coordinates of atoms
Removed monolithic Restraints class
Fixed a few bugs in gradients of Euler angles in DirectionalAtom and RigidBody
Added some rotational capabilities to prinicpalAxisCalculator

File Contents

# Content
1 /*
2 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 *
4 * The University of Notre Dame grants you ("Licensee") a
5 * non-exclusive, royalty free, license to use, modify and
6 * redistribute this software in source and binary code form, provided
7 * that the following conditions are met:
8 *
9 * 1. Acknowledgement of the program authors must be made in any
10 * publication of scientific results based in part on use of the
11 * program. An acceptable form of acknowledgement is citation of
12 * the article in which the program was described (Matthew
13 * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 * Parallel Simulation Engine for Molecular Dynamics,"
16 * J. Comput. Chem. 26, pp. 252-271 (2005))
17 *
18 * 2. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * 3. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the
24 * distribution.
25 *
26 * This software is provided "AS IS," without a warranty of any
27 * kind. All express or implied conditions, representations and
28 * warranties, including any implied warranty of merchantability,
29 * fitness for a particular purpose or non-infringement, are hereby
30 * excluded. The University of Notre Dame and its licensors shall not
31 * be liable for any damages suffered by licensee as a result of
32 * using, modifying or distributing the software or its
33 * derivatives. In no event will the University of Notre Dame or its
34 * licensors be liable for any lost revenue, profit or data, or for
35 * direct, indirect, special, consequential, incidental or punitive
36 * damages, however caused and regardless of the theory of liability,
37 * arising out of the use of or inability to use software, even if the
38 * University of Notre Dame has been advised of the possibility of
39 * such damages.
40 */
41
42 /**
43 * @file DynamicRectMatrix.hpp
44 * @author Teng Lin
45 * @date 10/11/2004
46 * @version 1.0
47 */
48
49 #ifndef MATH_DYNAMICRECTMATRIX_HPP
50 #define MATH_DYNAMICRECTMATRIX_HPP
51 #include <math.h>
52 #include <cmath>
53 #include "math/DynamicVector.hpp"
54
55 namespace oopse {
56
57 /**
58 * @class DynamicRectMatrix DynamicRectMatrix.hpp "math/DynamicRectMatrix.hpp"
59 * @brief rectangular matrix class
60 */
61 template<typename Real>
62 class DynamicRectMatrix {
63 public:
64 typedef Real ElemType;
65 typedef Real* ElemPoinerType;
66 typedef DynamicRectMatrix<Real> SelfType;
67
68 /** default constructor */
69 DynamicRectMatrix(){
70 nrow_ = 0;
71 ncol_ = 0;
72 data_ = NULL;
73 }
74
75 DynamicRectMatrix(int nrow, int ncol) {
76 allocate(nrow, ncol);
77
78 for (unsigned int i = 0; i < nrow_; i++)
79 for (unsigned int j = 0; j < ncol_; j++)
80 this->data_[i][j] = 0.0;
81 }
82
83 /** Constructs and initializes every element of this matrix to a scalar */
84 DynamicRectMatrix(int nrow, int ncol, Real s) {
85 allocate(nrow, ncol);
86 for (unsigned int i = 0; i < nrow_; i++)
87 for (unsigned int j = 0; j < ncol_; j++)
88 this->data_[i][j] = s;
89 }
90
91 DynamicRectMatrix(int nrow, int ncol, Real* array) {
92 allocate(nrow, ncol);
93 for (unsigned int i = 0; i < nrow_; i++)
94 for (unsigned int j = 0; j < ncol_; j++)
95 this->data_[i][j] = array[i * nrow_ + j];
96 }
97
98 /** copy constructor */
99 DynamicRectMatrix(const SelfType& m) {
100 allocate(m.getNRow(), m.getNCol());
101
102 for (unsigned int i = 0; i < nrow_; i++)
103 for (unsigned int j = 0; j < ncol_; j++)
104 this->data_[i][j] = m.data_[i][j];
105 }
106
107 /** destructor*/
108 ~DynamicRectMatrix() { deallocate();}
109
110 /** copy assignment operator */
111 DynamicRectMatrix<Real> operator =(const DynamicRectMatrix<Real> m) {
112 if (this == &m)
113 return *this;
114 if (nrow_ != m.getNRow() || ncol_ != m.getNCol()) {
115 deallocate();
116 allocate(m.getNRow(), m.getNCol());
117 }
118
119 for (unsigned int i = 0; i < nrow_; i++)
120 for (unsigned int j = 0; j < ncol_; j++)
121 this->data_[i][j] = m.data_[i][j];
122 return *this;
123 }
124
125 /**
126 * Return the reference of a single element of this matrix.
127 * @return the reference of a single element of this matrix
128 * @param i row index
129 * @param j Column index
130 */
131 Real& operator()(unsigned int i, unsigned int j) {
132 return this->data_[i][j];
133 }
134
135 /**
136 * Return the value of a single element of this matrix.
137 * @return the value of a single element of this matrix
138 * @param i row index
139 * @param j Column index
140 */
141 Real operator()(unsigned int i, unsigned int j) const {
142
143 return this->data_[i][j];
144 }
145
146 /**
147 * Copy the internal data to an array
148 * @param array the pointer of destination array
149 */
150 void getArray(Real* array) {
151 for (unsigned int i = 0; i < nrow_; i++) {
152 for (unsigned int j = 0; j < ncol_; j++) {
153 array[i * nrow_ + j] = this->data_[i][j];
154 }
155 }
156 }
157
158 /**
159 * Returns a row of this matrix as a vector.
160 * @return a row of this matrix as a vector
161 * @param row the row index
162 */
163 DynamicVector<Real> getRow(unsigned int row) {
164 DynamicVector<Real> v;
165
166 for (unsigned int i = 0; i < ncol_; i++)
167 v[i] = this->data_[row][i];
168
169 return v;
170 }
171
172 /**
173 * Sets a row of this matrix
174 * @param row the row index
175 * @param v the vector to be set
176 */
177 void setRow(unsigned int row, const DynamicVector<Real>& v) {
178 assert(v.size() == nrow_);
179 for (unsigned int i = 0; i < ncol_; i++)
180 this->data_[row][i] = v[i];
181 }
182
183 /**
184 * Returns a column of this matrix as a vector.
185 * @return a column of this matrix as a vector
186 * @param col the column index
187 */
188 DynamicVector<Real> getColumn(unsigned int col) {
189 DynamicVector<Real> v(ncol_);
190
191 for (unsigned int j = 0; j < nrow_; j++)
192 v[j] = this->data_[j][col];
193
194 return v;
195 }
196
197 /**
198 * Sets a column of this matrix
199 * @param col the column index
200 * @param v the vector to be set
201 */
202 void setColumn(unsigned int col, const DynamicVector<Real>& v){
203
204 for (unsigned int j = 0; j < nrow_; j++)
205 this->data_[j][col] = v[j];
206 }
207
208 /**
209 * swap two rows of this matrix
210 * @param i the first row
211 * @param j the second row
212 */
213 void swapRow(unsigned int i, unsigned int j){
214 assert(i < nrow_ && j < nrow_);
215
216 for (unsigned int k = 0; k < ncol_; k++)
217 std::swap(this->data_[i][k], this->data_[j][k]);
218 }
219
220 /**
221 * swap two Columns of this matrix
222 * @param i the first Column
223 * @param j the second Column
224 */
225 void swapColumn(unsigned int i, unsigned int j){
226 assert(i < ncol_ && j < ncol_);
227
228 for (unsigned int k = 0; k < nrow_; k++)
229 std::swap(this->data_[k][i], this->data_[k][j]);
230 }
231
232 /**
233 * Tests if this matrix is identical to matrix m
234 * @return true if this matrix is equal to the matrix m, return false otherwise
235 * @m matrix to be compared
236 *
237 * @todo replace operator == by template function equal
238 */
239 bool operator ==(const DynamicRectMatrix<Real> m) {
240 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
241 for (unsigned int i = 0; i < nrow_; i++)
242 for (unsigned int j = 0; j < ncol_; j++)
243 if (!equal(this->data_[i][j], m.data_[i][j]))
244 return false;
245
246 return true;
247 }
248
249 /**
250 * Tests if this matrix is not equal to matrix m
251 * @return true if this matrix is not equal to the matrix m, return false otherwise
252 * @m matrix to be compared
253 */
254 bool operator !=(const DynamicRectMatrix<Real> m) {
255 return !(*this == m);
256 }
257
258 /** Negates the value of this matrix in place. */
259 inline void negate() {
260 for (unsigned int i = 0; i < nrow_; i++)
261 for (unsigned int j = 0; j < ncol_; j++)
262 this->data_[i][j] = -this->data_[i][j];
263 }
264
265 /**
266 * Sets the value of this matrix to the negation of matrix m.
267 * @param m the source matrix
268 */
269 inline void negate(const DynamicRectMatrix<Real> m) {
270 for (unsigned int i = 0; i < nrow_; i++)
271 for (unsigned int j = 0; j < ncol_; j++)
272 this->data_[i][j] = -m.data_[i][j];
273 }
274
275 /**
276 * Sets the value of this matrix to the sum of itself and m (*this += m).
277 * @param m the other matrix
278 */
279 inline void add( const DynamicRectMatrix<Real> m ) {
280 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
281 for (unsigned int i = 0; i < nrow_; i++)
282 for (unsigned int j = 0; j < ncol_; j++)
283 this->data_[i][j] += m.data_[i][j];
284 }
285
286 /**
287 * Sets the value of this matrix to the sum of m1 and m2 (*this = m1 + m2).
288 * @param m1 the first matrix
289 * @param m2 the second matrix
290 */
291 inline void add( const DynamicRectMatrix<Real> m1, const DynamicRectMatrix<Real> m2 ) {
292 assert(m1.getNRow() == m2.getNRow() && m1.getNCol() == m2.getNCol());
293 for (unsigned int i = 0; i < nrow_; i++)
294 for (unsigned int j = 0; j < ncol_; j++)
295 this->data_[i][j] = m1.data_[i][j] + m2.data_[i][j];
296 }
297
298 /**
299 * Sets the value of this matrix to the difference of itself and m (*this -= m).
300 * @param m the other matrix
301 */
302 inline void sub( const DynamicRectMatrix<Real> m ) {
303 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
304 for (unsigned int i = 0; i < nrow_; i++)
305 for (unsigned int j = 0; j < ncol_; j++)
306 this->data_[i][j] -= m.data_[i][j];
307 }
308
309 /**
310 * Sets the value of this matrix to the difference of matrix m1 and m2 (*this = m1 - m2).
311 * @param m1 the first matrix
312 * @param m2 the second matrix
313 */
314 inline void sub( const DynamicRectMatrix<Real> m1, const DynamicRectMatrix<Real> m2){
315 assert(m1.getNRow() == m2.getNRow() && m1.getNCol() == m2.getNCol());
316 for (unsigned int i = 0; i < nrow_; i++)
317 for (unsigned int j = 0; j < ncol_; j++)
318 this->data_[i][j] = m1.data_[i][j] - m2.data_[i][j];
319 }
320
321 /**
322 * Sets the value of this matrix to the scalar multiplication of itself (*this *= s).
323 * @param s the scalar value
324 */
325 inline void mul( Real s ) {
326 for (unsigned int i = 0; i < nrow_; i++)
327 for (unsigned int j = 0; j < ncol_; j++)
328 this->data_[i][j] *= s;
329 }
330
331 /**
332 * Sets the value of this matrix to the scalar multiplication of matrix m (*this = s * m).
333 * @param s the scalar value
334 * @param m the matrix
335 */
336 inline void mul( Real s, const DynamicRectMatrix<Real> m ) {
337 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
338 for (unsigned int i = 0; i < nrow_; i++)
339 for (unsigned int j = 0; j < ncol_; j++)
340 this->data_[i][j] = s * m.data_[i][j];
341 }
342
343 /**
344 * Sets the value of this matrix to the scalar division of itself (*this /= s ).
345 * @param s the scalar value
346 */
347 inline void div( Real s) {
348 for (unsigned int i = 0; i < nrow_; i++)
349 for (unsigned int j = 0; j < ncol_; j++)
350 this->data_[i][j] /= s;
351 }
352
353 /**
354 * Sets the value of this matrix to the scalar division of matrix m (*this = m /s).
355 * @param s the scalar value
356 * @param m the matrix
357 */
358 inline void div( Real s, const DynamicRectMatrix<Real> m ) {
359 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
360 for (unsigned int i = 0; i < nrow_; i++)
361 for (unsigned int j = 0; j < ncol_; j++)
362 this->data_[i][j] = m.data_[i][j] / s;
363 }
364
365 /**
366 * Multiples a scalar into every element of this matrix.
367 * @param s the scalar value
368 */
369 DynamicRectMatrix<Real> operator *=(const Real s) {
370 this->mul(s);
371 return *this;
372 }
373
374 /**
375 * Divides every element of this matrix by a scalar.
376 * @param s the scalar value
377 */
378 DynamicRectMatrix<Real> operator /=(const Real s) {
379 this->div(s);
380 return *this;
381 }
382
383 /**
384 * Sets the value of this matrix to the sum of the other matrix and itself (*this += m).
385 * @param m the other matrix
386 */
387 DynamicRectMatrix<Real> operator += (const DynamicRectMatrix<Real> m) {
388 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
389 add(m);
390 return *this;
391 }
392
393 /**
394 * Sets the value of this matrix to the differerence of itself and the other matrix (*this -= m)
395 * @param m the other matrix
396 */
397 DynamicRectMatrix<Real> operator -= (const DynamicRectMatrix<Real> m){
398 assert(nrow_ == m.getNRow() && ncol_ == m.getNCol());
399 sub(m);
400 return *this;
401 }
402
403 /** Return the transpose of this matrix */
404 DynamicRectMatrix<Real> transpose() const{
405 DynamicRectMatrix<Real> result(ncol_,nrow_);
406
407 for (unsigned int i = 0; i < nrow_; i++)
408 for (unsigned int j = 0; j < ncol_; j++)
409 result(j, i) = this->data_[i][j];
410
411 return result;
412 }
413
414 unsigned int getNRow() const {return nrow_;}
415 unsigned int getNCol() const {return ncol_;}
416
417 template<class MatrixType>
418 void setSubMatrix(unsigned int beginRow, unsigned int beginCol, const MatrixType& m) {
419 assert(beginRow + m.getNRow() -1 <= nrow_);
420 assert(beginCol + m.getNCol() -1 <= ncol_);
421
422 for (unsigned int i = 0; i < m.getNRow(); ++i)
423 for (unsigned int j = 0; j < m.getNCol(); ++j)
424 this->data_[beginRow+i][beginCol+j] = m(i, j);
425 }
426
427 template<class MatrixType>
428 void getSubMatrix(unsigned int beginRow, unsigned int beginCol, MatrixType& m) {
429 assert(beginRow + m.getNRow() -1 <= nrow_);
430 assert(beginCol + m.getNCol() - 1 <= ncol_);
431
432 for (unsigned int i = 0; i < m.getNRow(); ++i)
433 for (unsigned int j = 0; j < m.getNCol(); ++j)
434 m(i, j) = this->data_[beginRow+i][beginCol+j];
435 }
436
437 protected:
438 Real** data_;
439 unsigned int nrow_;
440 unsigned int ncol_;
441 private:
442 void allocate(int nrow, int ncol) {
443 nrow_ = nrow;
444 ncol_ = ncol;
445 data_ = new Real*[nrow_];
446 for (int i = 0; i < nrow_; ++i)
447 data_[i] = new Real[ncol_];
448 }
449
450 void deallocate() {
451 for (int i = 0; i < nrow_; ++i)
452 delete data_[i];
453 delete []data_;
454
455 nrow_ = 0;
456 ncol_ = 0;
457 data_ = NULL;
458 }
459
460 };
461
462 /** Negate the value of every element of this matrix. */
463 template<typename Real>
464 inline DynamicRectMatrix<Real> operator -(const DynamicRectMatrix<Real> m) {
465 DynamicRectMatrix<Real> result(m);
466
467 result.negate();
468
469 return result;
470 }
471
472 /**
473 * Return the sum of two matrixes (m1 + m2).
474 * @return the sum of two matrixes
475 * @param m1 the first matrix
476 * @param m2 the second matrix
477 */
478 template<typename Real>
479 inline DynamicRectMatrix<Real> operator + (const DynamicRectMatrix<Real> m1,const DynamicRectMatrix<Real> m2) {
480
481 DynamicRectMatrix<Real> result(m1.getNRow(), m1.getNCol());
482
483 result.add(m1, m2);
484
485 return result;
486 }
487
488 /**
489 * Return the difference of two matrixes (m1 - m2).
490 * @return the sum of two matrixes
491 * @param m1 the first matrix
492 * @param m2 the second matrix
493 */
494 template<typename Real>
495 inline DynamicRectMatrix<Real> operator - (const DynamicRectMatrix<Real> m1, const DynamicRectMatrix<Real> m2) {
496 DynamicRectMatrix<Real> result(m1.getNRow(), m1.getNCol());
497
498 result.sub(m1, m2);
499
500 return result;
501 }
502
503 /**
504 * Return the multiplication of scalra and matrix (m * s).
505 * @return the multiplication of a scalra and a matrix
506 * @param m the matrix
507 * @param s the scalar
508 */
509 template<typename Real>
510 inline DynamicRectMatrix<Real> operator *(const DynamicRectMatrix<Real> m, Real s) {
511 DynamicRectMatrix<Real> result(m.getNRow(), m.getNCol());
512
513 result.mul(s, m);
514
515 return result;
516 }
517
518 /**
519 * Return the multiplication of a scalra and a matrix (s * m).
520 * @return the multiplication of a scalra and a matrix
521 * @param s the scalar
522 * @param m the matrix
523 */
524 template<typename Real>
525 inline DynamicRectMatrix<Real> operator *(Real s, const DynamicRectMatrix<Real> m) {
526 DynamicRectMatrix<Real> result(m.getNRow(), m.getNCol());
527
528 result.mul(s, m);
529
530 return result;
531 }
532
533 /**
534 * Return the multiplication of two matrixes (m1 * m2).
535 * @return the multiplication of two matrixes
536 * @param m1 the first matrix
537 * @param m2 the second matrix
538 */
539 template<typename Real>
540 inline DynamicRectMatrix<Real> operator *(const DynamicRectMatrix<Real>& m1, const DynamicRectMatrix<Real>& m2) {
541 assert(m1.getNCol() == m2.getNRow());
542 unsigned int sameDim = m1.getNCol();
543 int nrow = m1.getNRow();
544 int ncol = m2.getNCol();
545 DynamicRectMatrix<Real> result(nrow, ncol );
546 for (unsigned int i = 0; i < nrow; i++)
547 for (unsigned int j = 0; j < ncol; j++)
548 for (unsigned int k = 0; k < sameDim; k++)
549 result(i, j) += m1(i, k) * m2(k, j);
550
551 return result;
552 }
553
554 /**
555 * Return the multiplication of a matrix and a vector (m * v).
556 * @return the multiplication of a matrix and a vector
557 * @param m the matrix
558 * @param v the vector
559 */
560 template<typename Real>
561 inline DynamicVector<Real> operator *(const DynamicRectMatrix<Real> m, const DynamicVector<Real>& v) {
562 int nrow = m.getNRow();
563 int ncol = m.getNCol();
564 assert(ncol = v.size());
565 DynamicVector<Real> result(nrow);
566
567 for (unsigned int i = 0; i < nrow ; i++)
568 for (unsigned int j = 0; j < ncol ; j++)
569 result[i] += m(i, j) * v[j];
570
571 return result;
572 }
573
574 /**
575 * Return the scalar division of matrix (m / s).
576 * @return the scalar division of matrix
577 * @param m the matrix
578 * @param s the scalar
579 */
580 template<typename Real>
581 inline DynamicRectMatrix<Real> operator /(const DynamicRectMatrix<Real> m, Real s) {
582 DynamicRectMatrix<Real> result(m.getNRow(), m.getNCol());
583
584 result.div(s, m);
585
586 return result;
587 }
588
589 /**
590 * Write to an output stream
591 */
592 template<typename Real>
593 std::ostream &operator<< ( std::ostream& o, const DynamicRectMatrix<Real> m) {
594 for (unsigned int i = 0; i < m.getNRow() ; i++) {
595 o << "(";
596 for (unsigned int j = 0; j < m.getNCol() ; j++) {
597 o << m(i, j);
598 if (j != m.getNCol() -1)
599 o << "\t";
600 }
601 o << ")" << std::endl;
602 }
603 return o;
604 }
605 }
606 #endif //MATH_RECTMATRIX_HPP
607

Properties

Name Value
svn:executable *