ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/staticProps/GofRtheta.cpp
Revision: 885
Committed: Fri Dec 19 15:12:23 2003 UTC (20 years, 6 months ago) by mmeineke
File size: 3096 byte(s)
Log Message:
working on adding GofRtheta and GofRomega

File Contents

# Content
1 #include <iostream>
2 #include <fstream>
3
4 #include <cstring>
5 #include <cmath>
6
7 #include "simError.h"
8 #include "PairCorrType.hpp"
9
10 using namespace std;
11
12 GofRtheta::GofRtheta( char* key1, char* key2, int theNatoms, int theNbins ):
13 PairCorrType( key1, key2, theNatoms, theNbins )
14 {
15 int i, j;
16
17 strcpy( corrType, "GofRtheta" );
18
19 currCosHist = new int*[nBins];
20 currGofRtheta = new double*[nBins];
21 avgGofRtheta = new double*[nBins];
22
23 for(i=0;i<nBins;i++){
24 currCosHist[i] = new int[nBins];
25 currGofRtheta[i] = new double[nBins];
26 avgGofRtheta[i] = new double[nBins];
27
28 for(j=0;j<nBins;j++){
29 currCosHist[i][j] = 0;
30 currGofRtheta[i][j] = 0.0;
31 avgGofRtheta[i][j] = 0.0;
32 }
33 }
34
35 nFrames = 0;
36 }
37
38 GofRtheta::~GofRtheta(){
39
40 int i;
41
42 for(i=0;i<nBins;i++){
43 delete[] currCosHist[i];
44 delete[] currGofRtheta[i];
45 delete[] avgGofRtheta[i];
46 }
47
48 delete[] currCosHist;
49 delete[] currGofRtheta;
50 delete[] avgGofRtheta;
51 }
52
53 void GofRtheta::correlate( double Rij[3], double dist,
54 double uHatI[3], double uHatJ[3] ){
55 int binR, binTheta, i;
56 double dot, cosTheta;
57 double halfNbins;
58
59 if( correlateMe ){
60
61 if( uHatI != NULL ){
62
63 dot= 0.0;
64 for(i=0;i<3;i++)
65 dot += Rij[i] * uHatI[i];
66
67 cosTheta = dot / dist;
68
69 binR = (int)( dist / delR );
70 if( binR < nBins ){
71
72 halfNbins = (nBins-1) * 0.5;
73 binTheta = (int)( (cosTheta * halfNbins) + halfNbins );
74
75 currCosHist[binR][binTheta] += 1;
76 }
77 }
78 else{
79
80 sprintf( painCave.errMsg,
81 "GofRtheta error: atom \"%s\" does not have a "
82 "directional component\n",
83 atom1
84 );
85 painCave.isFatal = 1;
86 simError();
87 }
88 }
89 }
90
91 void GofRtheta::accumulateFrame( void ){
92 int i,j;
93 double rLower, rUpper, volSlice;
94 double nIdeal;
95
96 nFrames++;
97
98 for(i=0;i<nBins;i++){
99
100 rLower = i * delR;
101 rUpper = rLower + delR;
102
103 volSlice = ( rUpper * rUpper * rUpper ) - ( rLower * rLower * rLower );
104 nIdeal = volSlice * pairConstant;
105
106 for(j=0;j<nBins;j++){
107
108 currGofRtheta[i][j] = (currCosHist[i][j] / nIdeal);
109 currCosHist[i][j] = 0;
110
111 avgGofRtheta[i][j] += currGofRtheta[i][j];
112 }
113 }
114 }
115
116
117 void GofRtheta::writeCorr( char* outPrefix ){
118
119 double rValue, cosValue, deltaCos, corrValue;
120 double rLower, rUpper, volSlice;
121 double nIdeal;
122 int i, j;
123 char outName[200];
124
125 sprintf( outName,
126 "%s-%s-%s.GofRtheta",
127 outPrefix,
128 atom1,
129 atom2 );
130 ofstream outStream( outName );
131
132 if( !outStream ){
133
134 sprintf( painCave.errMsg,
135 "Error opening \"%s\" for output.\n",
136 outName );
137 painCave.isFatal = 1;
138 simError();
139 }
140
141 outStream << "#rValue; cosValue; corrValue\n";
142
143
144 deltaCos = 2.0 / nBins;
145 for(i=0;i<nBins;i++){
146
147 rValue = ( i + 0.5 ) * delR;
148
149 for(j=0;j<nBins;j++){
150
151 cosValue = -1 + (j * deltaCos);
152
153 corrValue = avgGofRtheta[i][j] / nFrames;
154
155 outStream << rValue << "; " << cosValue << "; " << corrValue << "\n";
156 }
157 }
158
159 outStream.close();
160 }