ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/integrators/DLM.cpp
Revision: 1957
Committed: Tue Jan 25 17:45:23 2005 UTC (19 years, 5 months ago) by tim
File size: 4491 byte(s)
Log Message:
(1) complete section parser's error message
(2) add GhostTorsion
(3) accumulate inertial tensor from the directional atoms before calculate rigidbody's inertial tensor

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 #include "DLM.hpp"
43
44 namespace oopse {
45
46 void DLM::doRotate(StuntDouble* sd, Vector3d& ji, double dt) {
47 double dt2 = 0.5 * dt;
48 double angle;
49
50 RotMat3x3d A = sd->getA();
51 Mat3x3d I = sd->getI();
52
53 // use the angular velocities to propagate the rotation matrix a full time step
54 if (sd->isLinear()) {
55
56 int i = sd->linearAxis();
57 int j = (i+1)%3;
58 int k = (i+2)%3;
59
60 angle = dt2 * ji[j] / I(j, j);
61 rotateStep( k, i, angle, ji, A );
62
63 angle = dt * ji[k] / I(k, k);
64 rotateStep( i, j, angle, ji, A);
65
66 angle = dt2 * ji[j] / I(j, j);
67 rotateStep( k, i, angle, ji, A );
68
69 } else {
70 // rotate about the x-axis
71 angle = dt2 * ji[0] / I(0, 0);
72 rotateStep( 1, 2, angle, ji, A );
73
74 // rotate about the y-axis
75 angle = dt2 * ji[1] / I(1, 1);
76 rotateStep( 2, 0, angle, ji, A );
77
78 // rotate about the z-axis
79 angle = dt * ji[2] / I(2, 2);
80 sd->addZangle(angle);
81 rotateStep( 0, 1, angle, ji, A);
82
83 // rotate about the y-axis
84 angle = dt2 * ji[1] / I(1, 1);
85 rotateStep( 2, 0, angle, ji, A );
86
87 // rotate about the x-axis
88 angle = dt2 * ji[0] / I(0, 0);
89 rotateStep( 1, 2, angle, ji, A );
90
91 }
92
93 sd->setA( A );
94 }
95
96
97 void DLM::rotateStep(int axes1, int axes2, double angle, Vector3d& ji, RotMat3x3d& A) {
98
99 double sinAngle;
100 double cosAngle;
101 double angleSqr;
102 double angleSqrOver4;
103 double top, bottom;
104
105 RotMat3x3d tempA(A); // initialize the tempA
106 Vector3d tempJ(0.0);
107
108 RotMat3x3d rot = RotMat3x3d::identity(); // initalize rot as a unit matrix
109
110 // use a small angle aproximation for sin and cosine
111
112 //angleSqr = angle * angle;
113 //angleSqrOver4 = angleSqr / 4.0;
114 //top = 1.0 - angleSqrOver4;
115 //bottom = 1.0 + angleSqrOver4;
116
117 //cosAngle = top / bottom;
118 //sinAngle = angle / bottom;
119 cosAngle = cos(angle);
120 sinAngle = sin(angle);
121 rot(axes1, axes1) = cosAngle;
122 rot(axes2, axes2) = cosAngle;
123
124 rot(axes1, axes2) = sinAngle;
125 rot(axes2, axes1) = -sinAngle;
126
127 // rotate the momentum acoording to: ji[] = rot[][] * ji[]
128 ji = rot * ji;
129
130 // rotate the Rotation matrix acording to:
131 // A[][] = A[][] * transpose(rot[][])
132 // transpose(A[][]) = transpose(A[][]) * transpose(rot[][])
133
134 A = rot * A; //? A = A* rot.transpose();
135
136 }
137
138
139 }

Properties

Name Value
svn:executable *