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 3009 by gezelter, Wed Sep 20 20:13:40 2006 UTC vs.
Revision 3011 by gezelter, Thu Sep 21 14:45:08 2006 UTC

# Line 51 | Line 51
51   #include "io/DumpReader.hpp"
52   #include "primitives/Molecule.hpp"
53   #include "utils/NumericConstant.hpp"
54 < #include "math/RealSphericalHarmonic.hpp"
54 > #include "math/SphericalHarmonic.hpp"
55  
56   namespace oopse {
57  
# 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 <    RealType theta;
112 >    Vector3d vec;
113 >    RealType costheta;
114      RealType phi;
115      RealType r;
116      RealType dist;
117 <    std::map<int, RealType> QBar_lm;
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 <    RealSphericalHarmonic sphericalHarmonic;
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);
184 <            
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 = sqrt(pow(vec.x(),2)+pow(vec.y(),2)+pow(vec.z(),2));
191 <            
192 <            // Check to see if neighbor is in bond cutoff
193 <            
194 <            if (r < rCut_) {            
195 <              theta = atan2(vec.y(), vec.x());
196 <              phi = acos(vec.z()/r);
197 <              for(int m = -lNumber_; m <= lNumber_; m++){
198 <                sphericalHarmonic.setM(m);
199 <                QBar_lm[m] += sphericalHarmonic.getValueAt(theta,phi);
200 <              }
201 <              nBonds++;
202 <            }  
182 >              vec = sd->getPos() - atom->getPos();      
183 >              currentSnapshot_->wrapVector(vec);
184 >              
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 Qbar
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
215  
216          QSq_l = 0.0;
217          for (int m = -lNumber_; m <= lNumber_; m++){
218 <          QSq_l += pow(QBar_lm[m], 2);  
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)));
206    
207        // Find Third Order Invariant W_l
222  
223 <        // Make arrays for Wigner3jm
224 <        double* THRCOF = new double[mSize_];
211 <        // Variables for Wigner routine
212 <        double l_ = (double)lNumber_;
213 <        double m1Pass, m2Min, m2Max;
214 <        int error, m1, m2, m3;
215 <
216 <        RealType W_l;
217 <        RealType 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 224 | 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 <        collectHistogram(Q_l, W_l_hat);
245 >        std::cout << "Ql = " << Q_l << " Wl = " << W_l_hat << "\n";
246 >        collectHistogram(Q_l, real(W_l_hat));
247                  
248        }
249      }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines