ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Molecule.cpp
Revision: 1113
Committed: Thu Apr 15 16:18:26 2004 UTC (20 years, 2 months ago) by tim
File size: 4260 byte(s)
Log Message:
fix whole bunch of bugs :-)

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 tim 1113
62     for (int i = 0; i < myRigidBodies.size(); i++)
63     myRigidBodies[i]->calcRefCoords();
64 mmeineke 426
65     }
66    
67     void Molecule::calcForces( void ){
68    
69     int i;
70    
71 gezelter 1104 for(i=0; i<myRigidBodies.size(); i++) {
72 gezelter 1097 myRigidBodies[i]->updateAtoms();
73     }
74    
75 mmeineke 426 for(i=0; i<nBonds; i++){
76     myBonds[i]->calc_forces();
77     }
78    
79     for(i=0; i<nBends; i++){
80     myBends[i]->calc_forces();
81     }
82    
83     for(i=0; i<nTorsions; i++){
84     myTorsions[i]->calc_forces();
85     }
86 gezelter 1097
87     // Rigid Body forces and torques are done after the fortran force loop
88    
89 mmeineke 426 }
90    
91    
92 mmeineke 428 double Molecule::getPotential( void ){
93 mmeineke 426
94     int i;
95     double myPot = 0.0;
96 gezelter 1109
97     for(i=0; i<myRigidBodies.size(); i++) {
98     myRigidBodies[i]->updateAtoms();
99     }
100 mmeineke 426
101     for(i=0; i<nBonds; i++){
102     myPot += myBonds[i]->get_potential();
103     }
104    
105     for(i=0; i<nBends; i++){
106     myPot += myBends[i]->get_potential();
107     }
108    
109     for(i=0; i<nTorsions; i++){
110     myPot += myTorsions[i]->get_potential();
111     }
112    
113     return myPot;
114     }
115 mmeineke 435
116     void Molecule::printMe( void ){
117    
118     int i;
119    
120     for(i=0; i<nBonds; i++){
121     myBonds[i]->printMe();
122     }
123    
124     for(i=0; i<nBends; i++){
125     myBends[i]->printMe();
126     }
127    
128     for(i=0; i<nTorsions; i++){
129     myTorsions[i]->printMe();
130     }
131 gezelter 1097
132 mmeineke 435 }
133 gezelter 446
134 mmeineke 449 void Molecule::moveCOM(double delta[3]){
135 gezelter 610 double aPos[3];
136     int i, j;
137 gezelter 446
138 tim 1113 for(i=0; i<myIntegrableObjects.size(); i++) {
139     if(myIntegrableObjects[i] != NULL ) {
140 gezelter 610
141 tim 1113 myIntegrableObjects[i]->getPos( aPos );
142 gezelter 610
143     for (j=0; j< 3; j++)
144     aPos[j] += delta[j];
145 gezelter 446
146 tim 1113 myIntegrableObjects[i]->setPos( aPos );
147 gezelter 446 }
148     }
149 gezelter 1097
150 gezelter 1104 for(i=0; i<myRigidBodies.size(); i++) {
151 gezelter 1097
152     myRigidBodies[i]->getPos( aPos );
153    
154     for (j=0; j< 3; j++)
155     aPos[j] += delta[j];
156    
157     myRigidBodies[i]->setPos( aPos );
158     }
159 gezelter 446 }
160    
161 gezelter 1097 void Molecule::atoms2rigidBodies( void ) {
162     int i;
163 gezelter 1104 for (i = 0; i < myRigidBodies.size(); i++) {
164     myRigidBodies[i]->calcForcesAndTorques();
165 gezelter 1097 }
166     }
167    
168 mmeineke 449 void Molecule::getCOM( double COM[3] ) {
169 gezelter 446
170     double mass, mtot;
171 gezelter 610 double aPos[3];
172     int i, j;
173 gezelter 446
174 gezelter 610 for (j=0; j<3; j++)
175     COM[j] = 0.0;
176    
177 gezelter 446 mtot = 0.0;
178    
179 tim 1113 for (i=0; i < myIntegrableObjects.size(); i++) {
180     if (myIntegrableObjects[i] != NULL) {
181 gezelter 446
182 tim 1113 mass = myIntegrableObjects[i]->getMass();
183 gezelter 446 mtot += mass;
184 gezelter 610
185 tim 1113 myIntegrableObjects[i]->getPos( aPos );
186 gezelter 446
187 gezelter 610 for( j = 0; j < 3; j++)
188     COM[j] += aPos[j] * mass;
189    
190 gezelter 446 }
191     }
192    
193 gezelter 610 for (j = 0; j < 3; j++)
194     COM[j] /= mtot;
195 gezelter 446 }
196 gezelter 468
197 gezelter 475 double Molecule::getCOMvel( double COMvel[3] ) {
198 gezelter 468
199 gezelter 475 double mass, mtot;
200 gezelter 607 double aVel[3];
201     int i, j;
202 gezelter 468
203 gezelter 607
204     for (j=0; j<3; j++)
205     COMvel[j] = 0.0;
206    
207 gezelter 468 mtot = 0.0;
208    
209 tim 1113 for (i=0; i < myIntegrableObjects.size(); i++) {
210     if (myIntegrableObjects[i] != NULL) {
211 mmeineke 489
212 tim 1113 mass = myIntegrableObjects[i]->getMass();
213 gezelter 468 mtot += mass;
214    
215 tim 1113 myIntegrableObjects[i]->getVel(aVel);
216 gezelter 607
217     for (j=0; j<3; j++)
218     COMvel[j] += aVel[j]*mass;
219    
220 gezelter 468 }
221     }
222    
223 gezelter 607 for (j=0; j<3; j++)
224     COMvel[j] /= mtot;
225 gezelter 468
226 gezelter 475 return mtot;
227    
228 gezelter 468 }
229 tim 658
230     double Molecule::getTotalMass()
231     {
232 tim 1113
233 tim 658 double totalMass;
234    
235     totalMass = 0;
236 tim 1113 for(int i =0; i < myIntegrableObjects.size(); i++){
237     totalMass += myIntegrableObjects[i]->getMass();
238 tim 658 }
239    
240     return totalMass;
241     }