ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/tcProps/directorHead.c
Revision: 1073
Committed: Sat Feb 28 16:45:57 2004 UTC (20 years, 4 months ago) by mmeineke
Content type: text/plain
File size: 6487 byte(s)
Log Message:
finished the rmsd coding. hasn't been debugged

File Contents

# Content
1 #define _FILE_OFFSET_BITS 64
2
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <math.h>
6 #include <mkl_lapack64.h>
7
8
9 #include "params.h"
10 #include "tcProps.h"
11 #include "readWrite.h"
12 #include "directorHead.h"
13
14
15
16 struct directStr{
17 double uTop[3];
18 double uBottom[3];
19 double orderTop;
20 double orderBottom;
21 double time;
22 };
23
24 struct directStr* directorHead;
25
26
27 void accumDHFrame( int index, struct atomCoord *atoms );
28
29 void calcDirHeadCorr(double startTime, struct atomCoord* atoms,
30 char* outPrefix ){
31
32 // list of 'a priori' constants
33
34 const int nLipAtoms = NL_ATOMS;
35 const int nBonds = NBONDS;
36 const int nLipids = NLIPIDS;
37 const int nSSD = NSSD;
38 const int nAtoms = nLipAtoms * nLipids + nSSD;
39
40 // variables
41
42 char outName[500];
43 FILE* outFile;
44 int i, j, k;
45 int startFrame, corrFrames, framesFinished;
46 int startFound, percentComplete;
47
48 double Hmat[3][3];
49
50 framesFinished = 0;
51
52 startFound = 0;
53 startFrame = -1;
54 while( !startFound ){
55
56 startFrame++;
57
58 if(startFrame >= nFrames){
59
60 fprintf( stderr,
61 "Start Time, %G, was not found in the dump file.\n",
62 startTime );
63 exit(0);
64 }
65
66 if(startTime <= frameTimes[startFrame])
67 startFound = 1;
68
69
70 }
71
72 corrFrames = nFrames - startFrame;
73 directorHead = (struct directStr*)calloc(corrFrames,
74 sizeof(struct directStr));
75
76 for(i=startFrame; i<nFrames; i++){
77
78 percentComplete =
79 (int)( 100.0 * (double)framesFinished / (double) corrFrames );
80
81 fprintf( stdout,
82 "\rDirector head corr %3d%% complete.",
83 percentComplete );
84 fflush( stdout );
85
86 readFrame( i, atoms, Hmat );
87
88 accumDHFrame( i-startFrame, atoms );
89
90 framesFinished++;
91 }
92
93 sprintf( outName, "%s.dirHeadTop", outPrefix );
94 outFile = fopen( outName, "w" );
95 fprintf( outFile,
96 "#time\torderParam\tx\ty\tz\n");
97
98 for(i=0;i<corrFrames;i++){
99 fprintf( outFile,
100 "%6G\t%6G\t%6G\t%6G\t%6G\n",
101 directorHead[i].time,
102 directorHead[i].orderTop,
103 directorHead[i].uTop[0],
104 directorHead[i].uTop[1],
105 directorHead[i].uTop[2]);
106 }
107 fflush(outFile);
108 fclose(outFile);
109
110 sprintf( outName, "%s.dirHeadBottom", outPrefix );
111 outFile = fopen( outName, "w" );
112 fprintf( outFile,
113 "#time\torderParam\tx\ty\tz\n");
114
115 for(i=0;i<corrFrames;i++){
116 fprintf( outFile,
117 "%6G\t%6G\t%6G\t%6G\t%6G\n",
118 directorHead[i].time,
119 directorHead[i].orderBottom,
120 directorHead[i].uBottom[0],
121 directorHead[i].uBottom[1],
122 directorHead[i].uBottom[2]);
123 }
124 fflush(outFile);
125 fclose(outFile);
126
127
128 percentComplete =
129 (int)( 100.0 * (double)framesFinished / (double) corrFrames );
130
131 fprintf( stdout,
132 "\rDirector head corr %3d%% complete.\n"
133 "done.\n",
134 percentComplete );
135 fflush( stdout );
136
137 free( directorHead );
138 directorHead = NULL;
139 }
140
141
142 void accumDHFrame( int index, struct atomCoord *atoms ){
143
144 // list of 'a priori' constants
145
146 const int nLipAtoms = NL_ATOMS;
147 const int nBonds = NBONDS;
148 const int nLipids = NLIPIDS;
149 const int nSSD = NSSD;
150 const int nAtoms = nLipAtoms * nLipids + nSSD;
151 const double oneThird = 1.0 / 3.0;
152
153 int i,j,k,l,m;
154 int nTop;
155 int nBot;
156 int lWork;
157 int nfilled;
158 int ndiag;
159 int ifail;
160
161 double oTop[3][3];
162 double oBottom[3][3];
163 double matWrap[9];
164 double evals[3];
165 double work[9];
166 double *u;
167 double max;
168 int which;
169
170 char job, uplo;
171
172 job = 'V';
173 uplo = 'U';
174 nfilled = 3;
175 ndiag = 3;
176 lWork = 9;
177
178 for(i=0;i<3;i++){
179 for(j=0;j<3;j++){
180 oTop[i][j] = 0.0;
181 oBottom[i][j] = 0.0;
182 }
183 }
184
185 nTop = 0;
186 nBot = 0;
187 for(i=0;i<nLipids;i++){
188
189 k = i*nLipAtoms;
190 u = atoms[k].u;
191 if(atoms[k].pos[2] > 0){
192
193 oTop[0][0] += u[0] * u[0] - oneThird;
194 oTop[0][1] += u[0] * u[1];
195 oTop[0][2] += u[0] * u[2];
196
197 oTop[1][0] += u[1] * u[0];
198 oTop[1][1] += u[1] * u[1] - oneThird;
199 oTop[1][2] += u[1] * u[2];
200
201 oTop[2][0] += u[2] * u[0];
202 oTop[2][1] += u[2] * u[1];
203 oTop[2][2] += u[2] * u[2] - oneThird;
204
205 nTop++;
206 }
207 else{
208
209 oBottom[0][0] += u[0] * u[0] - oneThird;
210 oBottom[0][1] += u[0] * u[1];
211 oBottom[0][2] += u[0] * u[2];
212
213 oBottom[1][0] += u[1] * u[0];
214 oBottom[1][1] += u[1] * u[1] - oneThird;
215 oBottom[1][2] += u[1] * u[2];
216
217 oBottom[2][0] += u[2] * u[0];
218 oBottom[2][1] += u[2] * u[1];
219 oBottom[2][2] += u[2] * u[2] - oneThird;
220
221 nBot++;
222 }
223 }
224
225 for(i=0;i<3;i++){
226 for(j=0;j<3;j++){
227 oTop[i][j] /= (double)nTop;
228 oBottom[i][j] /= (double)nBot;
229 }
230 }
231
232 // matWrap to fortran convention
233
234 for(j=0;j<3;j++)
235 for(l=0;l<3;l++)
236 matWrap[l+3*j] = oTop[l][j];
237
238 ifail = 0;
239
240 dsyev(&job, &uplo, &nfilled, matWrap, &ndiag, evals, work, &lWork, &ifail);
241
242 if (ifail) {
243 fprintf(stderr, "dsyev screwed something up!\n");
244 exit(0);
245 }
246
247 // matWrap from fortran convention
248
249 for(j=0;j<3;j++)
250 for(l=0;l<3;l++)
251 oTop[l][j] = matWrap[l+3*j];
252
253 max = 0.0;
254 for (i=0; i<3;i++) {
255 if (fabs(evals[i]) > max) {
256 which = i;
257 max = fabs(evals[i]);
258 }
259 }
260
261 for (i = 0; i < 3; i++) {
262 directorHead[index].uTop[i] = oTop[i][which];
263 }
264
265 directorHead[index].orderTop = 1.5 * max;
266
267 // matWrap to fortran convention
268
269 for(j=0;j<3;j++)
270 for(l=0;l<3;l++)
271 matWrap[l+3*j] = oBottom[l][j];
272
273 ifail = 0;
274 dsyev(&job, &uplo, &nfilled, matWrap, &ndiag, evals, work, &lWork, &ifail);
275
276 if (ifail) {
277 fprintf(stderr, "dsyev screwed something up!\n");
278 exit(0);
279 }
280
281 // matWrap from fortran convention
282
283 for(j=0;j<3;j++)
284 for(l=0;l<3;l++)
285 oBottom[l][j] = matWrap[l+3*j];
286
287 max = 0.0;
288 for (i=0; i<3;i++) {
289 if (fabs(evals[i]) > max) {
290 which = i;
291 max = fabs(evals[i]);
292 }
293 }
294
295 for (i = 0; i < 3; i++) {
296 directorHead[index].uBottom[i] = oBottom[i][which];
297 }
298
299 directorHead[index].orderBottom = 1.5 * max;
300
301 directorHead[index].time = frameTimes[index];
302
303 // fprintf(stderr,
304 // "frame[%d] => orderTop = %6G; < %6G, %6G, %6G >\n"
305 // " orderBottom = %6G; < %6G, %6G, %6G >\n\n",
306 // index,
307 // directorHead[index].orderTop,
308 // directorHead[index].uTop[0],
309 // directorHead[index].uTop[1],
310 // directorHead[index].uTop[2],
311 // directorHead[index].orderBottom,
312 // directorHead[index].uBottom[0],
313 // directorHead[index].uBottom[1],
314 // directorHead[index].uBottom[2] );
315 }
316