ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/applications/staticProps/BondOrderParameter.cpp
(Generate patch)

Comparing trunk/OOPSE-4/src/applications/staticProps/BondOrderParameter.cpp (file contents):
Revision 3010 by gezelter, Wed Sep 20 22:16:23 2006 UTC vs.
Revision 3011 by gezelter, Thu Sep 21 14:45:08 2006 UTC

# Line 104 | Line 104 | namespace oopse {
104      Molecule* mol;
105      Atom* atom;
106      RigidBody* rb;
107 +    int myIndex;
108      SimInfo::MoleculeIterator mi;
109      Molecule::RigidBodyIterator rbIter;
110      Molecule::AtomIterator ai;
111      StuntDouble* sd;
112 +    Vector3d vec;
113      RealType costheta;
114      RealType phi;
115      RealType r;
# Line 115 | Line 117 | namespace oopse {
117      std::map<int, ComplexType> QBar_lm;
118      RealType QSq_l;
119      RealType Q_l;
120 +    ComplexType W_l;
121 +    ComplexType W_l_hat;
122      int nBonds;
123      SphericalHarmonic sphericalHarmonic;
124      int i, j;
125 <  
125 >    // Make arrays for Wigner3jm
126 >    double* THRCOF = new double[mSize_];
127 >    // Variables for Wigner routine
128 >    double l_ = (double)lNumber_;
129 >    double m1Pass, m2Min, m2Max;
130 >    int error, m1, m2, m3;
131 >
132      // Set the l for the spherical harmonic, it doesn't change
133      sphericalHarmonic.setL(lNumber_);
134  
125
135      DumpReader reader(info_, dumpFilename_);    
136      int nFrames = reader.getNFrames();
137      frameCounter_ = 0;
# Line 151 | Line 160 | namespace oopse {
160        for (sd = seleMan_.beginSelected(i); sd != NULL;
161             sd = seleMan_.nextSelected(i)) {
162  
163 +        myIndex = sd->getGlobalIndex();
164 +
165          // For this central atom, zero out nBonds and QBar_lm
166  
167          nBonds = 0;
# Line 166 | Line 177 | namespace oopse {
177            for (atom = mol->beginAtom(ai); atom != NULL;
178                 atom = mol->nextAtom(ai)) {
179  
180 +            if (atom->getGlobalIndex() != myIndex) {
181  
182 <            Vector3d vec = sd->getPos() - atom->getPos();      
183 <            currentSnapshot_->wrapVector(vec);
172 <            
173 <            // Calculate "bonds" and build Q_lm(r) where
174 <            //      Q_lm = Y_lm(theta(r),phi(r))                
175 <            // The spherical harmonics are wrt any arbitrary coordinate
176 <            // system, we choose standard spherical coordinates
177 <            
178 <            r = sqrt(pow(vec.x(),2)+pow(vec.y(),2)+pow(vec.z(),2));
179 <            
180 <            // Check to see if neighbor is in bond cutoff
181 <            
182 <            if (r < rCut_) {            
183 <              costheta = vec.z() / r;
184 <              phi = atan2(vec.y(), vec.x());
182 >              vec = sd->getPos() - atom->getPos();      
183 >              currentSnapshot_->wrapVector(vec);
184                
185 <              for(int m = -lNumber_; m <= lNumber_; m++){
186 <                sphericalHarmonic.setM(m);
187 <                QBar_lm[m] += sphericalHarmonic.getValueAt(costheta,phi);
188 <              }
189 <              nBonds++;
190 <            }  
185 >              // Calculate "bonds" and build Q_lm(r) where
186 >              //      Q_lm = Y_lm(theta(r),phi(r))                
187 >              // The spherical harmonics are wrt any arbitrary coordinate
188 >              // system, we choose standard spherical coordinates
189 >              
190 >              r = vec.length();
191 >              
192 >              // Check to see if neighbor is in bond cutoff
193 >              
194 >              if (r < rCut_) {
195 >                costheta = vec.z() / r;
196 >                phi = atan2(vec.y(), vec.x());
197 >                
198 >                for(int m = -lNumber_; m <= lNumber_; m++){
199 >                  sphericalHarmonic.setM(m);
200 >                  QBar_lm[m] += sphericalHarmonic.getValueAt(costheta,phi);
201 >                }
202 >                nBonds++;
203 >              }  
204 >            }
205            }
206          }
207          
208          // Normalize Qbar2
209          for (int m = -lNumber_;m <= lNumber_; m++){
210            QBar_lm[m] /= nBonds;
211 +          std::cout << "m = " << m << " QBLM = " << QBar_lm[m] << "\n";
212          }
213  
214          // Find second order invariant Q_l
# Line 203 | Line 217 | namespace oopse {
217          for (int m = -lNumber_; m <= lNumber_; m++){
218            QSq_l += norm(QBar_lm[m]);
219          }
220 +        std::cout << "qsq_l = " << QSq_l << "\n";
221          Q_l = sqrt(QSq_l*(4.0 * NumericConstant::PI / (2.0*(RealType)lNumber_ + 1)));
207    
208        // Find Third Order Invariant W_l
222  
223 <        // Make arrays for Wigner3jm
224 <        double* THRCOF = new double[mSize_];
212 <        // Variables for Wigner routine
213 <        double l_ = (double)lNumber_;
214 <        double m1Pass, m2Min, m2Max;
215 <        int error, m1, m2, m3;
216 <
217 <        ComplexType W_l;
218 <        ComplexType W_l_hat;
223 >        // Find Third Order Invariant W_l
224 >        
225          W_l = 0.0;
226          for (int m1 = -lNumber_; m1 <= lNumber_; m1++) {
227            // Zero work array
# Line 225 | Line 231 | namespace oopse {
231            // Get Wigner coefficients
232            m1Pass = (double)m1;
233            Wigner3jm(&l_, &l_, &l_, &m1Pass, &m2Min, &m2Max, THRCOF, &mSize_, &error);
234 <          for (int m_index = 1; i < (int)(m2Max - m2Min-1.0); m_index++) {
234 >          for (int m_index = 1; m_index < (int)(m2Max - m2Min-1.0); m_index++) {
235              m2 = floor(m2Min) + m_index - 1;
236              m3 = -m1-m2;
237              W_l += THRCOF[m_index]*QBar_lm[m1+lNumber_]*QBar_lm[m2+lNumber_]*QBar_lm[m3+lNumber_];
238            }
239          }
240 <
240 >        
241          W_l_hat = W_l / pow(QSq_l, 1.5);
242 <
242 >        
243          // accumulate histogram data for Q_l and W_l_hat:
244  
245 +        std::cout << "Ql = " << Q_l << " Wl = " << W_l_hat << "\n";
246          collectHistogram(Q_l, real(W_l_hat));
247                  
248        }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines