19 |
|
inline double roundMe( double x ){ |
20 |
|
return ( x >= 0 ) ? floor( x + 0.5 ) : ceil( x - 0.5 ); |
21 |
|
} |
22 |
+ |
inline double min( double a, double b ){ |
23 |
+ |
return (a < b ) ? a : b; |
24 |
+ |
} |
25 |
+ |
inline double max( double a, double b ){ |
26 |
+ |
return (a > b ) ? a : b; |
27 |
+ |
} |
28 |
|
|
29 |
+ |
|
30 |
|
// coords holds the data for a single tethered dipole: |
31 |
|
struct coords{ |
32 |
|
double pos[3]; // cartesian coords |
102 |
|
double *x, *y, *z; |
103 |
|
double dh2, dh, sumh2, sumh, averh2, averh, t, delta, gamma, hi, proj; |
104 |
|
double *corrhist, *h2hist; |
105 |
< |
double vrhist[100][500]; |
106 |
< |
double sum_vrhist[1000], ave_vrhist[1000]; |
107 |
< |
int vrsamp[1000][1000]; |
105 |
> |
double vrhist[1000]; |
106 |
> |
double sum_vrhist[1000]; |
107 |
> |
int vrsamp[1000]; |
108 |
|
int *ophist; |
109 |
|
double d[2], hcorr; |
110 |
< |
double hsum, hsum_temp, h2sum, have, h2ave, fluc, bigL, smallA, areaPerMolecule, area, h, h2; |
110 |
> |
double hsum, hsum_frame, h2sum, have, h2ave, h_ave_frame; |
111 |
> |
double fluc, bigL, smallA, areaPerMolecule, area, h, h2; |
112 |
|
int nbins, nbins2, opbin, whichbinx, whichbiny, whichbin2, n1, n2, n3, n4, m, selfx, selfy; |
113 |
|
|
114 |
|
int which; |
115 |
+ |
int highestAtom; |
116 |
+ |
double highestZ; |
117 |
|
double omat[3][3]; |
118 |
+ |
double myPerp[3]; |
119 |
+ |
double myDir[3]; |
120 |
+ |
double myVec[2]; |
121 |
+ |
double lperp; |
122 |
+ |
double ldir; |
123 |
+ |
double dot; |
124 |
+ |
double maxProj, maxProjOut; |
125 |
+ |
double avgHeightAtProj; |
126 |
|
double wrapMat[9]; |
127 |
|
double onethird, ordvals[5000]; |
128 |
< |
double max; |
128 |
> |
double maxEval; |
129 |
|
double director[3][1000], vr[3][1000]; |
130 |
|
double sum_director[3], ave_director[3], sum_vr[3], ave_vr[3]; |
131 |
|
double orderpar[1000]; |
137 |
|
int lwork; |
138 |
|
double* work; |
139 |
|
int ifail; |
140 |
< |
int done; |
140 |
> |
int done, lastData, firstData; |
141 |
|
char current_flag; |
142 |
|
|
143 |
|
lineCount = 0; |
180 |
|
ifail = 0; |
181 |
|
|
182 |
|
nbins = 30; |
183 |
< |
nbins2 = 30; |
183 |
> |
nbins2 = 100; |
184 |
|
binmin = 0.0; |
185 |
|
binmax = 1.0; |
186 |
|
delr = (binmax - binmin) / (double) nbins2; |
203 |
|
|
204 |
|
for(i = 0; i < 1000; i++){ |
205 |
|
sum_vrhist[i] = 0.0; |
188 |
– |
ave_vrhist[i] = 0.0; |
206 |
|
} |
207 |
|
|
208 |
|
for(i = 0; i < 3; i++){ |
219 |
|
} |
220 |
|
} |
221 |
|
|
222 |
< |
for (i = 0; i < 100; i++) { |
223 |
< |
for (j = 0; j < 500; j++) { |
207 |
< |
vrhist[i][j] = 0.0; |
208 |
< |
} |
222 |
> |
for (i = 0; i < 1000; i++) { |
223 |
> |
vrhist[i] = 0.0; |
224 |
|
} |
225 |
|
|
226 |
|
for(i = 0; i < nbins2; i++){ |
262 |
|
|
263 |
|
while(eof_test != NULL){ |
264 |
|
|
265 |
+ |
highestAtom = -1; |
266 |
+ |
highestZ = 0.0; |
267 |
+ |
|
268 |
|
nframes++; |
269 |
|
(void)sscanf(read_buffer, "%d", &state->nAtoms); |
270 |
|
N = 2 * state->nAtoms; |
390 |
|
exit(8); |
391 |
|
} |
392 |
|
(void)sscanf( foo, "%lf", &state->r[i].pos[2] ); |
393 |
+ |
if (state->r[i].pos[2] > highestZ) { |
394 |
+ |
highestAtom = i; |
395 |
+ |
highestZ = state->r[i].pos[2]; |
396 |
+ |
} |
397 |
|
|
398 |
|
foo = strtok(NULL, " ,;\t\0"); |
399 |
|
if(foo == NULL){ |
437 |
|
state->r[i].mu = state->strength; |
438 |
|
} |
439 |
|
|
440 |
< |
hsum_temp = 0.0; |
440 |
> |
hsum_frame = 0.0; |
441 |
|
for (i = 0; i < state->nAtoms; i++) { |
442 |
|
|
443 |
|
h = state->r[i].pos[2]; |
444 |
|
h2 = pow(h,2); |
445 |
< |
|
446 |
< |
hsum_temp += h; |
445 |
> |
|
446 |
> |
hsum_frame += h; |
447 |
|
hsum += h; |
448 |
|
h2sum += h2; |
449 |
< |
|
449 |
> |
|
450 |
|
n1++; |
451 |
|
} |
452 |
|
|
453 |
+ |
h_ave_frame = hsum_frame / (double) state->nAtoms; |
454 |
+ |
|
455 |
|
for(i = 0; i < state->nAtoms; i++){ |
456 |
|
|
457 |
|
omat[0][0] += ux[i] * ux[i] - onethird; |
475 |
|
// temp_array = dsyev_ctof(omat, nfilled, nfilled); |
476 |
|
|
477 |
|
for(j=0;j<3;j++) |
478 |
< |
for(i=0;i<3;i++) |
479 |
< |
wrapMat[i+j*3] = omat[i][j]; |
478 |
> |
for(i=0;i<3;i++) |
479 |
> |
wrapMat[i+j*3] = omat[i][j]; |
480 |
|
|
481 |
|
ifail = 0; |
482 |
|
dsyev(&job, &uplo, &nfilled, wrapMat, &ndiag, evals, work, &lwork, &ifail); |
483 |
< |
|
483 |
> |
|
484 |
|
for(j=0;j<3;j++) |
485 |
< |
for(i=0;i<3;i++) |
486 |
< |
omat[i][j] = wrapMat[i+j*3]; |
487 |
< |
|
485 |
> |
for(i=0;i<3;i++) |
486 |
> |
omat[i][j] = wrapMat[i+j*3]; |
487 |
> |
|
488 |
|
//dsyev_ftoc2(temp_array, omat, nfilled, nfilled); |
489 |
< |
|
489 |
> |
|
490 |
|
//free(temp_array); |
491 |
|
|
492 |
< |
max = 0.0; |
492 |
> |
maxEval = 0.0; |
493 |
|
for(j = 0; j < 3; j++){ |
494 |
< |
if(fabs(evals[j]) > max){ |
494 |
> |
if(fabs(evals[j]) > maxEval){ |
495 |
|
which = j; |
496 |
< |
max = fabs(evals[j]); |
496 |
> |
maxEval = fabs(evals[j]); |
497 |
|
} |
498 |
|
} |
475 |
– |
|
476 |
– |
director[0][nframes-1] = omat[0][which]; |
477 |
– |
director[1][nframes-1] = omat[1][which]; |
478 |
– |
director[2][nframes-1] = omat[2][which]; |
479 |
– |
|
480 |
– |
vr[0][nframes-1] = fabs(director[1][nframes-1]); |
481 |
– |
vr[1][nframes-1] = fabs(-director[0][nframes-1]); |
482 |
– |
vr[2][nframes-1] = 0; |
483 |
– |
|
484 |
– |
orderpar[nframes-1] = 1.5 * max; |
499 |
|
|
500 |
+ |
orderpar[nframes-1] = 1.5 * maxEval; |
501 |
|
opbin = (int) (orderpar[nframes-1] / delr); |
502 |
|
if(opbin < nbins2) ophist[opbin] += 1; |
503 |
|
|
504 |
< |
for(i = 0; i < state->nAtoms; i++){ |
505 |
< |
proj = vr[0][nframes-1] * state->r[i].pos[0] + vr[1][nframes-1] * state->r[i].pos[1]; |
506 |
< |
hi = state->r[i].pos[2] - hsum_temp / (double) state->nAtoms; |
504 |
> |
for(i = 0; i < 3; i++){ |
505 |
> |
myDir[i] = 0.0; |
506 |
> |
myPerp[i] = 0.0; |
507 |
> |
} |
508 |
> |
|
509 |
> |
myDir[0] = omat[0][which]; |
510 |
> |
myDir[1] = omat[1][which]; |
511 |
> |
myDir[2] = omat[2][which]; |
512 |
|
|
513 |
< |
whichbin2 = (int) ((proj / (vr[0][nframes-1] * dx + vr[1][nframes-1] * dy)) * nbins2); |
514 |
< |
vrhist[whichbin2][nframes-1] += hi; |
515 |
< |
vrsamp[whichbin2][nframes-1]++; |
513 |
> |
if (myDir[0] < 0.0) { |
514 |
> |
myDir[0] = -myDir[0]; |
515 |
> |
myDir[1] = -myDir[1]; |
516 |
|
} |
517 |
+ |
|
518 |
+ |
ldir = sqrt(myDir[0]*myDir[0] + myDir[1]*myDir[1] + myDir[2]*myDir[2]); |
519 |
+ |
|
520 |
+ |
myDir[0] /= ldir; |
521 |
+ |
myDir[1] /= ldir; |
522 |
+ |
myDir[2] /= ldir; |
523 |
+ |
|
524 |
+ |
//printf("%f\t%f\t%f\n", myDir[0], myDir[1], myDir[2]); |
525 |
+ |
|
526 |
+ |
director[0][nframes-1] = myDir[0]; |
527 |
+ |
director[1][nframes-1] = myDir[1]; |
528 |
+ |
director[2][nframes-1] = myDir[2]; |
529 |
+ |
|
530 |
+ |
//printf("%f\t%f\t%f\n", director[0][nframes-1], director[1][nframes-1], director[2][nframes-1]); |
531 |
+ |
|
532 |
+ |
myPerp[0] = myDir[1]; |
533 |
+ |
myPerp[1] = -myDir[0]; |
534 |
+ |
myPerp[2] = 0.0; |
535 |
+ |
|
536 |
+ |
if (myPerp[0] < 0.0) { |
537 |
+ |
myPerp[0] = -myPerp[0]; |
538 |
+ |
myPerp[1] = -myPerp[1]; |
539 |
+ |
} |
540 |
+ |
|
541 |
+ |
lperp = sqrt(myPerp[0]*myPerp[0] + myPerp[1]*myPerp[1] + myPerp[2]*myPerp[2]); |
542 |
+ |
|
543 |
+ |
myPerp[0] /= lperp; |
544 |
+ |
myPerp[1] /= lperp; |
545 |
+ |
myPerp[2] /= lperp; |
546 |
+ |
|
547 |
+ |
vr[0][nframes-1] = myPerp[0]; |
548 |
+ |
vr[1][nframes-1] = myPerp[1]; |
549 |
+ |
vr[2][nframes-1] = myPerp[2]; |
550 |
+ |
|
551 |
+ |
maxProj = 0.5 * sqrt(dx*dx + dy*dy); |
552 |
+ |
//maxProj = myPerp[0]*dx + myPerp[1]*dy; |
553 |
+ |
// for now, assume highest atom is atom 0 |
554 |
+ |
highestAtom = 0; |
555 |
+ |
|
556 |
+ |
for(i = 0; i < state->nAtoms; i++){ |
557 |
+ |
|
558 |
+ |
// difference vector from highest point: |
559 |
+ |
myVec[0] = state->r[i].pos[0] - state->r[highestAtom].pos[0]; |
560 |
+ |
myVec[1] = state->r[i].pos[1] - state->r[highestAtom].pos[1]; |
561 |
+ |
// wrapped in periodic boundary conditions: |
562 |
+ |
wrapVector(myVec, state->Hmat, state->HmatI); |
563 |
+ |
|
564 |
+ |
// then projected onto myPerp: |
565 |
+ |
proj = myPerp[0]*myVec[0] + myPerp[1]*myVec[1]; |
566 |
+ |
// and binned: |
567 |
+ |
|
568 |
+ |
whichbin2 = (int) (((1.0 + (proj/maxProj)) / 2.0) * (double) nbins2); |
569 |
+ |
// printf( "proj/maxProj = %f\twhichbin2 = %d\n", proj/maxProj, whichbin2); |
570 |
+ |
|
571 |
+ |
hi = state->r[i].pos[2] - h_ave_frame; |
572 |
+ |
// for(i = 0; i < nbins2; i++) printf("%f\t%d\n", vrhist[i], vrsamp[i]); |
573 |
+ |
vrhist[whichbin2] += hi; |
574 |
+ |
vrsamp[whichbin2] ++; |
575 |
+ |
} |
576 |
|
|
577 |
|
for(i = 0; i < state->nAtoms; i++){ |
578 |
|
for(j = 0; j < state->nAtoms; j++){ |
650 |
|
ave_orderpar = sum_orderpar / (double) nframes; |
651 |
|
ave2_orderpar = sum2_orderpar / (double) nframes; |
652 |
|
err_orderpar = ave2_orderpar - pow(ave_orderpar, 2); |
653 |
+ |
|
654 |
+ |
for(i = 0; i < 3; i++){ |
655 |
+ |
sum_director[i] = 0.0; |
656 |
+ |
ave_director[i] = 0.0; |
657 |
+ |
sum_vr[i] = 0.0; |
658 |
+ |
ave_vr[i] = 0.0; |
659 |
+ |
} |
660 |
|
|
661 |
|
for(i = 0; i < nframes; i++){ |
662 |
|
sum_director[0] += director[0][i]; |
680 |
|
printf("# error = %lf\n", err_orderpar); |
681 |
|
printf("# director axis is ( %lf\t%lf\t%lf )\n", |
682 |
|
ave_director[0], ave_director[1], ave_director[2]); |
683 |
< |
printf("# vr axis is ( %lf\t%lf\t%lf )\n", ave_vr[0], ave_vr[1], ave_vr[2]); |
683 |
> |
printf("# vr axis is ( %lf\t%lf\t%lf )\n", ave_vr[0], ave_vr[1], ave_vr[2]); |
684 |
|
|
599 |
– |
for(i = 0; i < nbins2; i++){ |
600 |
– |
for(j = 0; j < nframes; j++){ |
601 |
– |
sum_vrhist[i] += vrhist[i][j]; |
602 |
– |
} |
603 |
– |
} |
604 |
– |
|
685 |
|
dx = sqrt(pow(state->Hmat[0][0], 2) + pow(state->Hmat[1][0], 2)); |
686 |
|
dy = sqrt(pow(state->Hmat[0][1], 2) + pow(state->Hmat[1][1], 2)); |
687 |
|
|
697 |
|
|
698 |
|
printf("# first gamma estimate = %lf\n", gamma); |
699 |
|
|
700 |
< |
printf("# \n"); |
700 |
> |
firstData = -1; |
701 |
> |
lastData = -1; |
702 |
> |
|
703 |
> |
for (i=0; i< nbins2; i++) { |
704 |
> |
if (vrsamp[i] > 0) { |
705 |
> |
if (firstData == -1) firstData = i; |
706 |
> |
lastData = i; |
707 |
> |
} |
708 |
> |
} |
709 |
> |
|
710 |
> |
maxProj = 0.5*sqrt(dx*dx + dy*dy); |
711 |
> |
maxProjOut = 2.0*maxProj*(double)(lastData - firstData)/(double)nbins2; |
712 |
|
|
713 |
< |
for(i = 0; i < nbins2; i++){ |
714 |
< |
ave_vrhist[i] = sum_vrhist[i] / (double) nframes; |
715 |
< |
printf("%lf\t%lf\n", (double) i * (ave_vr[0] * dx + ave_vr[1] * dy) / (double) nbins2, |
716 |
< |
ave_vrhist[i]); |
713 |
> |
printf("# maximum projection = %lf\n", maxProjOut); |
714 |
> |
printf("# \n"); |
715 |
> |
|
716 |
> |
for (i = firstData ; i < lastData; i++) { |
717 |
> |
//proj = maxProj * ((double)i / (double)nbins2); |
718 |
> |
|
719 |
> |
proj = maxProj*( (2.0 * (double)i / (double)nbins2) -1.0); |
720 |
> |
|
721 |
> |
if (vrsamp[i] > 0) { |
722 |
> |
avgHeightAtProj = vrhist[i]/(double)vrsamp[i]; |
723 |
> |
} else { |
724 |
> |
avgHeightAtProj = 0.0; |
725 |
> |
} |
726 |
> |
printf("%lf\t%lf\n", proj, avgHeightAtProj); |
727 |
|
} |
728 |
|
|
729 |
|
selfx = (int) ((double)nbins / 2.0); |