ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/utils/MoLocator.cpp
(Generate patch)

Comparing trunk/OOPSE/utils/MoLocator.cpp (file contents):
Revision 501 by mmeineke, Tue Apr 15 21:20:35 2003 UTC vs.
Revision 538 by mmeineke, Sat May 17 16:57:08 2003 UTC

# Line 1 | Line 1
1 + #include <iostream>
2 +
3 + #include <cstdlib>
4 + #include <cmath>
5 +
6 + #include "simError.h"
7 +
8   #include "MoLocator.hpp"
9 +
10 +
11 + MoLocator::MoLocator( MoleculeStamp* theStamp ){
12 +
13 +  myStamp = theStamp;
14 +  nAtoms = myStamp->getNAtoms();
15 +
16 +  myCoords = NULL;
17 +  
18 +  calcRefCoords();
19 + }
20 +
21 + MoLocator::~MoLocator(){
22 +  
23 +  if( myCoords != NULL ) delete[] myCoords;
24 + }
25 +
26 + void MoLocator::placeMol( double pos[3], double A[3][3], Atom** atomArray,
27 +                          int atomIndex ){
28 +  
29 +  int i,j,k;
30 +  double r[3];
31 +  double ux, uy, uz, u, uSqr;
32 +  
33 +  AtomStamp* currAtom;
34 +  DirectionalAtom* dAtom;
35 +  
36 +  for(i=0; i<nAtoms; i++){
37 +    
38 +    currAtom = myStamp->getAtom( i );
39 +    j = atomIndex+i;
40 +
41 +    if( currAtom->haveOrientation()){
42 +      
43 +      dAtom = new DirectionalAtom( j );
44 +      atomArray[j] = dAtom;
45 +      
46 +      ux = currAtom->getOrntX();
47 +      uy = currAtom->getOrntY();
48 +      uz = currAtom->getOrntZ();
49 +      
50 +      uSqr = (ux * ux) + (uy * uy) + (uz * uz);
51 +      
52 +      u = sqrt( uSqr );
53 +      ux = ux / u;
54 +      uy = uy / u;
55 +      uz = uz / u;
56 +      
57 +      dAtom->setSUx( ux );
58 +      dAtom->setSUy( uy );
59 +      dAtom->setSUz( uz );
60 +      
61 +      dAtom->setA( A );
62 +      
63 +      dAtom->setJx( 0.0 );
64 +      dAtom->setJy( 0.0 );
65 +      dAtom->setJz( 0.0 );
66 +      
67 +    }
68 +    else{
69 +      atomArray[j] = new GeneralAtom( j );
70 +    }
71 +    
72 +    atomArray[j]->setType( currAtom->getType() );
73 +    
74 +    for(k=0; k<3; k++) r[k] = myCoords[(i*3)+k];
75 +
76 +    rotMe( r, A );
77 +
78 +    for(k=0; k<3; k++) r[k] += pos[k];
79 +
80 +    atomArray[j]->setX( r[0] );
81 +    atomArray[j]->setY( r[1] );
82 +    atomArray[j]->setZ( r[2] );
83 +
84 +    atomArray[j]->set_vx( 0.0 );
85 +    atomArray[j]->set_vy( 0.0 );
86 +    atomArray[j]->set_vz( 0.0 );
87 +  }
88 + }
89 +
90 + void MoLocator::calcRefCoords( void ){
91 +
92 +  int i,j,k;
93 +  AtomStamp* currAtom;
94 +  double centerX, centerY, centerZ;
95 +  double smallX, smallY, smallZ;
96 +  double bigX, bigY, bigZ;
97 +  double dx, dy, dz;
98 +  double dsqr;
99 +
100 +  
101 +  centerX = 0.0;
102 +  centerY = 0.0;
103 +  centerZ = 0.0;
104 +
105 +  for(i=0; i<nAtoms; i++){
106 +    
107 +    currAtom = myStamp->getAtom(i);
108 +    if( !currAtom->havePosition() ){
109 +      sprintf( painCave.errMsg,
110 +               "MoLocator error.\n"
111 +               "  Component %s, atom %s does not have a position specified.\n"
112 +               "  This means MoLocator cannot initalize it's position.\n",
113 +               myStamp->getID(),
114 +               currAtom->getType() );
115 +      painCave.isFatal = 1;
116 +      simError();
117 +    }
118 +
119 +    
120 +    centerX += currAtom->getPosX();
121 +    centerY += currAtom->getPosY();
122 +    centerZ += currAtom->getPosZ();
123 +  }
124 +
125 +  centerX /= nAtoms;
126 +  centerY /= nAtoms;
127 +  centerZ /= nAtoms;
128 +  
129 +  myCoords = new double[nAtoms*3];
130 +
131 +  j = 0;
132 +  for(i=0; i<nAtoms; i++){
133 +    
134 +    currAtom = myStamp->getAtom(i);
135 +    j = i*3;
136 +    
137 +    myCoords[j]   = currAtom->getPosX() - centerX;
138 +    myCoords[j+1] = currAtom->getPosY() - centerY;
139 +    myCoords[j+2] = currAtom->getPosZ() - centerZ;
140 +  }
141 +  
142 +  smallX = myCoords[0];
143 +  smallY = myCoords[1];
144 +  smallZ = myCoords[2];
145 +
146 +  bigX = myCoords[0];
147 +  bigY = myCoords[1];
148 +  bigZ = myCoords[2];
149 +
150 +  j=0;
151 +  for(i=1; i<nAtoms; i++){
152 +    j= i*3;
153 +    
154 +    if( myCoords[j]   < smallX ) smallX = myCoords[j];
155 +    if( myCoords[j+1] < smallY ) smallY = myCoords[j+1];
156 +    if( myCoords[j+2] < smallZ ) smallZ = myCoords[j+2];
157 +
158 +    if( myCoords[j]   > bigX ) bigX = myCoords[j];
159 +    if( myCoords[j+1] > bigY ) bigY = myCoords[j+1];
160 +    if( myCoords[j+2] > bigZ ) bigZ = myCoords[j+2];
161 +  }
162 +
163 +
164 +  dx = bigX - smallX;
165 +  dy = bigY - smallY;
166 +  dz = bigZ - smallZ;
167 +
168 +  dsqr = (dx * dx) + (dy * dy) + (dz * dz);
169 +  maxLength = sqrt( dsqr );
170 + }
171 +
172 + void MoLocator::rotMe( double r[3], double A[3][3] ){
173 +
174 +  double rt[3];
175 +  int i,j;
176 +
177 +  for(i=0; i<3; i++) rt[i] = r[i];
178 +
179 +  for(i=0; i<3; i++){
180 +    r[i] = 0.0;
181 +    for(j=0; j<3; j++){
182 +      r[i] += A[i][j] * rt[j];
183 +    }
184 +  }
185 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines