ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/staticProps/AllCorr.cpp
Revision: 803
Committed: Fri Oct 10 17:10:22 2003 UTC (20 years, 10 months ago) by mmeineke
File size: 6718 byte(s)
Log Message:
removed the props directory, and moved everything over to staticProps

File Contents

# Content
1 #include <stdlib.h>
2 #include <vector>
3
4 #include "AllCorr.hpp"
5
6
7 AllCorr::AllCorr(){
8
9 pairCorrs = NULL;
10 haveFrames = false;
11 pairCorrSet = false;
12 haveLength = false;
13 haveNbins = false;
14 }
15
16 AllCorr::~AllCorr(){
17 int i;
18
19 if( pairCorrs != NULL ){
20 for(i=0; i<nPairs; i++)
21 delete pairCorrs[i];
22 delete[] pairCorrs;
23 }
24 }
25
26 void AllCorr::setMaxLength( double theLength ){
27 maxLength = theLength;
28 haveLength = true;
29 }
30
31 void AllCorr::setNbins( double theNbins ){
32 nBins = theNbins;
33 haveNbins = true;
34 }
35
36 void AllCorr::setFrames( SimInfo* theInfoArray, int theNframes,
37 DumpReader* theReader ){
38 int i;
39
40
41 infoArray = theInfoArray;
42 nFrames = theNframes;
43 reader = theReader;
44
45 nAtoms = infoArray[0].n_atoms;
46
47
48 // allocate the first frame's atom arrays
49
50 (infoArray[0].getConfiguration())->createArrays(infoArray[0].n_atoms);
51 for (i = 0; i < infoArray[0].n_atoms; i++)
52 infoArray[0].atoms[i]->setCoords();
53
54 // read in the first frame's positions
55
56 reader->readFrame( &(infoArray[0]), 0 );
57
58 if( !haveLength ){
59 maxLength = infoArray[0].getMaxCutoff();
60 haveLength = true;
61 }
62
63 haveFrames = true;
64 }
65
66 void AllCorr::setPairCorrList( vector <PairCorrList> &theList ){
67
68 int i;
69 char pair1[PCL_NAME_LENGTH];
70 char pair2[PCL_NAME_LENGTH];
71
72 if( !haveFrames ){
73 sprintf( painCave.errMsg,
74 "\n"
75 "AllCorr Error: attempt to create the pair correlations without"
76 " first setting the Frames\n" );
77 painCave.isFatal = 1;
78 simError();
79 }
80
81 if( !haveNbins ){
82 sprintf( painCave.errMsg,
83 "\n"
84 "AllCorr Error: attempt to create the pair correlations without"
85 " first setting nBins\n" );
86 painCave.isFatal = 1;
87 simError();
88 }
89
90
91 theList.sort();
92
93 nPairs = (int)theList.size();
94 pairCorrs = new PairCorrType*[nPairs];
95
96 for(i=0;i<nPairs;i++){
97
98 theList[i].getAtom1( pair1 );
99 theList[i].getAtom2( pair2 );
100
101 switch( theList[i].getType() ){
102
103 case gofr:
104 pairCorrs[i] = new GofR(pair1, pair2, nAtoms, nBins);
105 break;
106
107 default:
108
109 sprintf( painCave.errMsg,
110 "AllCorr Error: Unrecognized pair corr type in "
111 " setPairCorrList()->theList[%d]\n",
112 i );
113 painCave.isFatal = 1;
114 simError();
115 break;
116 }
117 }
118
119 pairCorrSet = true;
120 }
121
122 void AllCorr::initCorrelations( char* theOutPrefix, bool theIsSeparateOut,
123 bool theHavePairCorrs,
124 bool theHaveStaticCorrs ){
125 int i;
126 atomName* theNames = new atomNames[nAtoms];
127
128 havePairCorrs = theHavePairCorrs;
129 haveStaticCorrs = theHaveStaticCorrs;
130
131 if( havePairCorrs){
132
133 if(!pairCorrSet){
134 sprintf( painCave.errMsg,
135 "AllCorr error: Attempt to initialize pair correlations "
136 " without first setting the pair correlation list.\n" );
137 painCave.isFatal = 1;
138 simError();
139 }
140
141 for(i=0;i<nAtoms;i++){
142
143 strcpy(theNames[i].name, infoArray[0].atoms[i]->getType() );
144 }
145
146 for(i=0;i<nPairs;i++){
147 pairCorrs[i]->initCoor(maxLength, theNames );
148 }
149 }
150
151 if( haveStaticCorrs ){
152
153 // empty for now
154 }
155
156 strcpy(outPrefix, theOutPrefix);
157 isSeparateOut = theIsSeparateOut;
158 }
159
160
161 void AllCorr::calcCorrelations(){
162
163 SimInfor* currInfo;
164 int i,j,k,l;
165 double rij[3], rDist, uHatI[3], uHatJ[3];
166 double* grndOut = NULL;
167 double dSqr, ri[3], rj[3];
168 DirectionalAtom* dAtom;
169 double frameVolume;
170
171
172 for(k=0; k<nFrames; k++){
173
174 currInfo = &(infoArray[k]);
175
176 // skip the first frame, as it is already initialized
177 if( k != 0 ){
178
179 // allocate the frame's atom arrays
180
181 (currInfo->getConfiguration())->createArrays(currInfo->n_atoms);
182 for (i = 0; i < currInfo->n_atoms; i++)
183 currInfo->atoms[i]->setCoords();
184
185 // read in the frame's positions
186
187 reader->readFrame( &(infoArray[k]), 0 );
188 }
189
190 frameVolume = currInfo->boxVol;
191 this->setFrameVolume( frameVolume );
192
193 if(havePairCorrs){
194
195 // do the pair loop
196
197 for(i=0;i<(nAtoms-1);i++){
198
199 if( this->matchI(i) ){
200
201 for(j=i+1;j<nAtoms;j++){
202
203 if( this->matchJ(j) ){
204
205 // calc rdist and rij;
206
207 currInfo->atoms[i]->getPos( ri );
208 currInfo->wrapVector( ri );
209
210 currInfo->atoms[i]->getPos( rj );
211 currInfo->wrapVector( rj );
212
213 for(l=0;l<3;l++)
214 rij[l] = rj[l] - ri[l];
215
216 dSqr=0;
217 for(l=0;l<3;l++)
218 dSqr += rj[l] * rj[l];
219
220 rDist = sqrt( dSqr );
221
222 if( currInfo->atoms[i]->isDirectional() ){
223
224 dAtom = (directionalAtom*)currInfo->atoms[i];
225 dAtom->getU( uHatI );
226
227 if( currInfo->atoms[j]->isDirectional() ){
228
229 dAtom = (directionalAtom*)currInfo->atoms[j];
230 dAtom->getU( uHatJ );
231
232 this->pairCorrelate( rij, rDist, uHatI, uHatJ );
233 }
234 else{
235
236 this->pairCorrelate( rij, rDist, uHatI, grndOut );
237 }
238 }
239 else if( currInfo->atoms[j]->isDirectional() ){
240
241 dAtom = (directionalAtom*)currInfo->atoms[j];
242 dAtom->getU( uHatJ );
243
244 this->pairCorrelate( rij, rDist, grndOut, uHatJ );
245 }
246 else{
247 this->pairCorrelate( rij, rDist, grndOut, grndOut );
248 }
249 }
250 }
251 }
252 }
253 }
254
255 if( haveStaticCorrs ){
256
257 // empty for now
258
259 }
260
261 // accumulate the averages for this frame
262
263 this->accumulateFrame();
264
265 // de-allocate the frame
266
267 (currInfo->getConfiguration())->destroyArrays();
268 }
269
270 this->writeCorrs();
271 }
272
273 bool AllCorr::matchI(int i){
274
275 int k;
276 bool result;
277
278 result = false;
279
280 for(k=0;k<nPairs;k++)
281 result = (result || pairCorrs[k]->matchI(i) );
282
283 return result;
284 }
285
286 bool AllCorr::matchJ(int j){
287
288 int k;
289 bool result;
290
291 result = false;
292
293 for(k=0;k<nPairs;k++)
294 result = (result || pairCorrs[k]->matchJ(j) );
295
296 return result;
297 }
298
299 void AllCorr::pairCorrelate( double[3] Rij, double dist,
300 double[3] uHatI, double[3] uHatJ ){
301
302 int i;
303
304 for(i=0;i<nPairs;i++)
305 pairCorrs[i]->correlate( Rij, dist, uHatI, uHatj );
306 }
307
308 void AllCorr::setFrameVolume( double theVolume ){
309
310 int i;
311
312 if( havePairCorrs ){
313
314 for(i=0;i<nPairs;i++)
315 pairCorrs[i]->setFrameVolume( theVolume );
316 }
317
318 if( haveStaticCorrs ){
319
320 // empty for now
321 }
322 }
323
324 void AllCorr::accumulateFrame( void ){
325
326 int i;
327
328 if( havePairCorrs ){
329
330 for(i=0;i<nPair;i++)
331 pairCorrs[i]->accumulateFrame();
332 }
333
334 if( haveStaticCorrs ){
335
336 // empty for now
337 }
338 }
339
340 void AllCorr::writeCorrs( void ){
341 int i;
342
343 if( isSeparateOut ){
344
345 if( havePairCorrs ){
346
347 for(i=0;i<nPairs;i++)
348 pairCorrs[i]->writeCorrs( outPrefix );
349 }
350
351 if( haveStaticCorrs ){
352
353 // empty for now
354 }
355
356 }
357 else{
358
359 // empty for now
360 }
361
362 }