ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Molecule.cpp
Revision: 1104
Committed: Tue Apr 13 16:26:03 2004 UTC (20 years, 2 months ago) by gezelter
File size: 3959 byte(s)
Log Message:
Now molecules can keep track of their own IntegrableObjects (and
RigidBodies).  Also a bug-fix so that SimInfo can keep track of
RigidBodies (which was done incorrectly before).

File Contents

# User Rev Content
1 gezelter 829 #include <stdlib.h>
2 mmeineke 426
3    
4     #include "Molecule.hpp"
5 chuckv 438 #include "simError.h"
6 mmeineke 426
7    
8    
9     Molecule::Molecule( void ){
10    
11     myAtoms = NULL;
12     myBonds = NULL;
13     myBends = NULL;
14     myTorsions = NULL;
15    
16     }
17    
18     Molecule::~Molecule( void ){
19     int i;
20    
21     if( myAtoms != NULL ){
22     for(i=0; i<nAtoms; i++) if(myAtoms[i] != NULL ) delete myAtoms[i];
23     delete[] myAtoms;
24     }
25    
26     if( myBonds != NULL ){
27     for(i=0; i<nBonds; i++) if(myBonds[i] != NULL ) delete myBonds[i];
28     delete[] myBonds;
29     }
30    
31     if( myBends != NULL ){
32     for(i=0; i<nBends; i++) if(myBends[i] != NULL ) delete myBends[i];
33     delete[] myBends;
34     }
35    
36     if( myTorsions != NULL ){
37     for(i=0; i<nTorsions; i++) if(myTorsions[i] != NULL ) delete myTorsions[i];
38     delete[] myTorsions;
39     }
40    
41     }
42    
43    
44     void Molecule::initialize( molInit &theInit ){
45    
46     nAtoms = theInit.nAtoms;
47     nMembers = nAtoms;
48     nBonds = theInit.nBonds;
49     nBends = theInit.nBends;
50     nTorsions = theInit.nTorsions;
51 gezelter 1097 nRigidBodies = theInit.nRigidBodies;
52 mmeineke 426 nOriented = theInit.nOriented;
53    
54     myAtoms = theInit.myAtoms;
55     myBonds = theInit.myBonds;
56     myBends = theInit.myBends;
57     myTorsions = theInit.myTorsions;
58 gezelter 1097 myRigidBodies = theInit.myRigidBodies;
59 gezelter 1104
60     myIntegrableObjects = theInit.myIntegrableObjects;
61 mmeineke 426
62     }
63    
64     void Molecule::calcForces( void ){
65    
66     int i;
67    
68 gezelter 1104 for(i=0; i<myRigidBodies.size(); i++) {
69 gezelter 1097 myRigidBodies[i]->updateAtoms();
70     }
71    
72 mmeineke 426 for(i=0; i<nBonds; i++){
73     myBonds[i]->calc_forces();
74     }
75    
76     for(i=0; i<nBends; i++){
77     myBends[i]->calc_forces();
78     }
79    
80     for(i=0; i<nTorsions; i++){
81     myTorsions[i]->calc_forces();
82     }
83 gezelter 1097
84     // Rigid Body forces and torques are done after the fortran force loop
85    
86 mmeineke 426 }
87    
88    
89 mmeineke 428 double Molecule::getPotential( void ){
90 mmeineke 426
91     int i;
92     double myPot = 0.0;
93    
94     for(i=0; i<nBonds; i++){
95     myPot += myBonds[i]->get_potential();
96     }
97    
98     for(i=0; i<nBends; i++){
99     myPot += myBends[i]->get_potential();
100     }
101    
102     for(i=0; i<nTorsions; i++){
103     myPot += myTorsions[i]->get_potential();
104     }
105    
106     return myPot;
107     }
108 mmeineke 435
109     void Molecule::printMe( void ){
110    
111     int i;
112    
113     for(i=0; i<nBonds; i++){
114     myBonds[i]->printMe();
115     }
116    
117     for(i=0; i<nBends; i++){
118     myBends[i]->printMe();
119     }
120    
121     for(i=0; i<nTorsions; i++){
122     myTorsions[i]->printMe();
123     }
124 gezelter 1097
125 mmeineke 435 }
126 gezelter 446
127 mmeineke 449 void Molecule::moveCOM(double delta[3]){
128 gezelter 610 double aPos[3];
129     int i, j;
130 gezelter 446
131     for(i=0; i<nAtoms; i++) {
132     if(myAtoms[i] != NULL ) {
133 gezelter 610
134     myAtoms[i]->getPos( aPos );
135    
136     for (j=0; j< 3; j++)
137     aPos[j] += delta[j];
138 gezelter 446
139 gezelter 610 myAtoms[i]->setPos( aPos );
140 gezelter 446 }
141     }
142 gezelter 1097
143 gezelter 1104 for(i=0; i<myRigidBodies.size(); i++) {
144 gezelter 1097
145     myRigidBodies[i]->getPos( aPos );
146    
147     for (j=0; j< 3; j++)
148     aPos[j] += delta[j];
149    
150     myRigidBodies[i]->setPos( aPos );
151     }
152 gezelter 446 }
153    
154 gezelter 1097 void Molecule::atoms2rigidBodies( void ) {
155     int i;
156 gezelter 1104 for (i = 0; i < myRigidBodies.size(); i++) {
157     myRigidBodies[i]->calcForcesAndTorques();
158 gezelter 1097 }
159     }
160    
161 mmeineke 449 void Molecule::getCOM( double COM[3] ) {
162 gezelter 446
163     double mass, mtot;
164 gezelter 610 double aPos[3];
165     int i, j;
166 gezelter 446
167 gezelter 610 for (j=0; j<3; j++)
168     COM[j] = 0.0;
169    
170 gezelter 446 mtot = 0.0;
171    
172     for (i=0; i < nAtoms; i++) {
173     if (myAtoms[i] != NULL) {
174    
175     mass = myAtoms[i]->getMass();
176     mtot += mass;
177 gezelter 610
178     myAtoms[i]->getPos( aPos );
179 gezelter 446
180 gezelter 610 for( j = 0; j < 3; j++)
181     COM[j] += aPos[j] * mass;
182    
183 gezelter 446 }
184     }
185    
186 gezelter 610 for (j = 0; j < 3; j++)
187     COM[j] /= mtot;
188 gezelter 446 }
189 gezelter 468
190 gezelter 475 double Molecule::getCOMvel( double COMvel[3] ) {
191 gezelter 468
192 gezelter 475 double mass, mtot;
193 gezelter 607 double aVel[3];
194     int i, j;
195 gezelter 468
196 gezelter 607
197     for (j=0; j<3; j++)
198     COMvel[j] = 0.0;
199    
200 gezelter 468 mtot = 0.0;
201    
202     for (i=0; i < nAtoms; i++) {
203     if (myAtoms[i] != NULL) {
204 mmeineke 489
205 gezelter 468 mass = myAtoms[i]->getMass();
206     mtot += mass;
207    
208 gezelter 607 myAtoms[i]->getVel(aVel);
209    
210     for (j=0; j<3; j++)
211     COMvel[j] += aVel[j]*mass;
212    
213 gezelter 468 }
214     }
215    
216 gezelter 607 for (j=0; j<3; j++)
217     COMvel[j] /= mtot;
218 gezelter 468
219 gezelter 475 return mtot;
220    
221 gezelter 468 }
222 tim 658
223     double Molecule::getTotalMass()
224     {
225     int natoms;
226     Atom** atoms;
227     double totalMass;
228    
229     natoms = getNAtoms();
230     atoms = getMyAtoms();
231     totalMass = 0;
232     for(int i =0; i < natoms; i++){
233     totalMass += atoms[i]->getMass();
234     }
235    
236     return totalMass;
237     }