ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/ripple/readerr.c
Revision: 1185
Committed: Fri May 21 20:07:10 2004 UTC (20 years, 3 months ago) by xsun
Content type: text/plain
File size: 22612 byte(s)
Log Message:
this is the ripple codes

File Contents

# User Rev Content
1 xsun 1185 #include<stdio.h>
2     #include<string.h>
3     #include<stdlib.h>
4     #include<math.h>
5     #include<fftw.h>
6     #include<mkl_lapack64.h>
7    
8     //extern void dsyev(char *jobz, char *uplo, int *n, double *a, int *lda,
9     // double *w, double *work, int *lwork,int *info);
10    
11     //void direct(double rcut, double box, int n, int nstep, int maxbin);
12    
13     //double* dsyev_ctof(double **in, int rows, int cols);
14    
15     //void dsyev_ftoc2(double *in, double **out, int rows, int cols);
16    
17     // Structures to store our data:
18    
19     inline double roundMe( double x ){
20     return ( x >= 0 ) ? floor( x + 0.5 ) : ceil( x - 0.5 );
21     }
22    
23     // coords holds the data for a single tethered dipole:
24     struct coords{
25     double pos[3]; // cartesian coords
26     double theta; // orientational angle relative to z axis
27     double phi; // orientational angle in x-y plane
28     double mu; // dipole strength
29     char name[30]; // an identifier for the type of atom
30     };
31    
32     // state holds the current "configuration" of the entire system
33     struct system {
34     int nAtoms; // Number of Atoms in this configuration
35     struct coords *r; // The set of coordinates for all atoms
36     double beta; // beta = 1 /(kb*T)
37     double strength; // strength of the dipoles (Debye)
38     double z0; // default z axis position
39     double theta0; // default theta angle
40     double kz; // force constant for z displacement
41     double ktheta; // force constant for theta displacement
42     int nCycles; // How many cycles to do in total
43     int iCycle; // How many cycles have we done?
44     int nMoves; // How many MC moves in each cycle
45     int nSample; // How many cycles between samples
46     double Hmat[2][2]; // The information about the size of the per. box
47     double HmatI[2][2]; // The inverse box
48     double energy; // The current Energy
49     double dtheta; // maximum size of a theta move
50     double deltaz; // maximum size of a z move
51     double deltaphi; // maximum size of a phi move
52     int nAttempts; // number of MC moves that have been attempted
53     int nAccepts; // number of MC moves that have been accepted
54     int nx; // number of unit cells in x direction
55     int ny; // number of unit cells in y direction
56     struct system *next; // Next frame in the linked list
57     };
58    
59     char *program_name; /* the name of the program */
60    
61     // Function prototypes:
62     void usage(void);
63     void invertMat2(double a[2][2], double b[2][2]);
64     void wrapVector( double thePos[2], double Hmat[2][2], double HmatI[2][2]);
65    
66     int main(argc, argv)
67     int argc;
68     char *argv[];
69     {
70     FILE *in_file;
71     char in_name[500];
72     char *eof_test, *foo;
73     char read_buffer[1000];
74     //int lineCount = 0;
75     int lineCount;
76     int nAtoms;
77     double *mag, *newmag;
78     int *present_in_old;
79     double *ux, *uy, *uz, p1;
80     double aLat, bLat;
81     int cells;
82     double sumZ, sumUx, sumUy, sumUz, sumP;
83     double interpsum, value;
84     int ninterp, px, py, newp;
85     int i, j, k, l, nloops;
86     int newx, newy, newindex, index;
87     int new_i, new_j, new_index;
88     int N, nframes;
89     double freq_x, freq_y, zero_freq_x, zero_freq_y, freq;
90     double maxfreqx, maxfreqy, maxfreq, dfreq;
91     double dx, dy, dx1, dy1, xTemp, yTemp, pt1x, pt1y, pt2x, pt2y;
92     int nx, ny;
93     int *samples;
94     double *bin, binmin, binmax, delr;
95     double *x, *y, *z;
96     double dh2, dh, sumh2, sumh, averh2, averh, t, delta, gamma, hi, proj;
97     double *corrhist, *h2hist;
98     double vrhist[100][500];
99     double sum_vrhist[1000], ave_vrhist[1000];
100     int vrsamp[1000][1000];
101     int *ophist;
102     double d[2], hcorr;
103     double hsum, hsum_temp, h2sum, have, h2ave, fluc, bigL, smallA, areaPerMolecule, area, h, h2;
104     int nbins, nbins2, opbin, whichbinx, whichbiny, whichbin2, n1, n2, n3, n4, m, selfx, selfy;
105    
106     int which;
107     double omat[3][3];
108     double wrapMat[9];
109     double onethird, ordvals[5000];
110     double max;
111     double director[3][1000], vr[3][1000];
112     double sum_director[3], ave_director[3], sum_vr[3], ave_vr[3];
113     double orderpar[1000];
114     double sum_orderpar, ave_orderpar;
115     char job, uplo;
116     int ndiag;
117     int nfilled;
118     double evals[100];
119     int lwork;
120     double* work;
121     int ifail;
122     int done;
123     char current_flag;
124    
125     lineCount = 0;
126    
127     program_name = argv[0];
128     if (argc >= 2)
129     strcpy(in_name, argv[1]);
130     /*
131     for(i = 1; i < argc; i++){
132     if(argv[i][0] == '-'){
133     done = 0;
134     j = 1;
135     current_flag = argv[i][j];
136     while( (current_flag != '\0') && ( !done ) ){
137     switch(current_flag){
138     case 'i':
139     i++;
140     strcpy( in_name, argv[i] );
141     done = 1;
142     break;
143     }
144     }
145     }
146     }
147     */
148    
149     struct system* state;
150     struct system* temp_state;
151     struct coords* r;
152    
153     lwork = 9;
154    
155     work = (double *) malloc(lwork * sizeof(double));
156    
157     onethird = 1.0 / 3.0;
158     ndiag = 3;
159     nfilled = 3;
160     job = 'V';
161     uplo = 'U';
162     ifail = 0;
163    
164     nbins = 30;
165     nbins2 = 30;
166     binmin = 0.0;
167     binmax = 1.0;
168     delr = (binmax - binmin) / (double) nbins2;
169     corrhist = (double *) calloc(nbins*nbins, sizeof(double));
170     h2hist = (double *) calloc(nbins*nbins, sizeof(double));
171     ophist = (int *) calloc(nbins2, sizeof(int));
172     hsum = 0.0;
173     h2sum = 0.0;
174     sum_orderpar = 0.0;
175     ave_orderpar = 0.0;
176    
177     for(i = 0; i < 3; i++){
178     for(j = 0; j < 1000; j++){
179     director[i][j] = 0.0;
180     vr[i][j] = 0.0;
181     }
182     }
183    
184     for(i = 0; i < 1000; i++){
185     sum_vrhist[i] = 0.0;
186     ave_vrhist[i] = 0.0;
187     }
188    
189     for(i = 0; i < 3; i++){
190     sum_director[i] = 0.0;
191     ave_director[i] = 0.0;
192     sum_vr[i] = 0.0;
193     ave_vr[i] = 0.0;
194     }
195    
196     for (i = 0; i < nbins; i++) {
197     for (j = 0; j < nbins; j++) {
198     corrhist[nbins * i + j] = 0.0;
199     h2hist[nbins * i + j] = 0.0;
200     }
201     }
202    
203     for (i = 0; i < 100; i++) {
204     for (j = 0; j < 500; j++) {
205     vrhist[i][j] = 0.0;
206     }
207     }
208    
209     for(i = 0; i < nbins2; i++){
210     ophist[i] = 0;
211     }
212    
213     t = 300;
214    
215     in_file = fopen(in_name, "r");
216     if(in_file == NULL){
217     printf("Cannot open file \"%s\" for reading.\n", in_name);
218     exit(8);
219     }
220    
221     nframes = 0;
222     n1 = 0;
223     n2 = 0;
224     n3 = 0;
225     n4 = 0;
226    
227     // start reading the first frame
228    
229     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
230     nAtoms = atoi(read_buffer);
231     ux = (double *) calloc(nAtoms, sizeof(double));
232     uy = (double *) calloc(nAtoms, sizeof(double));
233     uz = (double *) calloc(nAtoms, sizeof(double));
234     lineCount++;
235    
236     for(i = 0; i < nAtoms; i++){
237     ux[i] = 0.0;
238     uy[i] = 0.0;
239     uz[i] = 0.0;
240     }
241    
242     state = (struct system *) malloc(sizeof(struct system));
243     state->next = NULL;
244     state->strength = 7.0;
245    
246     while(eof_test != NULL){
247    
248     nframes++;
249     (void)sscanf(read_buffer, "%d", &state->nAtoms);
250     N = 2 * state->nAtoms;
251    
252     state->r = (struct coords *)calloc(N, sizeof(struct coords));
253    
254     for(i = 0; i < 3; i++){
255     for(j = 0; j < 3; j++){
256     omat[i][j] = 0.0;
257     }
258     }
259    
260     // read and the comment line and grab the time and box dimensions
261    
262     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
263     lineCount++;
264     if(eof_test == NULL){
265     printf("error in reading file at line: %d\n", lineCount);
266     exit(8);
267     }
268    
269     foo = strtok( read_buffer, " ,;\t\n" );
270     (void)sscanf( read_buffer, "%d", &state->iCycle );
271    
272     foo = strtok(NULL, " ,;\t\0");
273     if(foo == NULL){
274     printf("error in reading file at line: %d\n", lineCount);
275     exit(8);
276     }
277     (void)sscanf(foo, "%d", &state->nx);
278    
279     nx = state->nx;
280    
281     foo = strtok(NULL, " ,;\t\0");
282     if(foo == NULL){
283     printf("error in reading file at line: %d\n", lineCount);
284     exit(8);
285     }
286     (void)sscanf(foo, "%d", &state->ny);
287    
288     ny = state->ny;
289    
290     foo = strtok(NULL, " ,;\t\0");
291     if(foo == NULL){
292     printf("error in reading file at line: %d\n", lineCount);
293     exit(8);
294     }
295     (void)sscanf(foo, "%lf",&state->Hmat[0][0]);
296    
297     foo = strtok(NULL, " ,;\t\0");
298     if(foo == NULL){
299     printf("error in reading file at line: %d\n", lineCount);
300     exit(8);
301     }
302     (void)sscanf(foo, "%lf",&state->Hmat[1][0]);
303    
304     foo = strtok(NULL, " ,;\t\0");
305     if(foo == NULL){
306     printf("error in reading file at line: %d\n", lineCount);
307     exit(8);
308     }
309     (void)sscanf(foo, "%lf",&state->Hmat[0][1]);
310    
311     foo = strtok(NULL, " ,;\t\0");
312     if(foo == NULL){
313     printf("error in reading file at line: %d\n", lineCount);
314     exit(8);
315     }
316     (void)sscanf(foo, "%lf",&state->Hmat[1][1]);
317    
318     //Find HmatI:
319    
320     invertMat2(state->Hmat, state->HmatI);
321    
322     // Length of the two box vectors:
323    
324     dx = sqrt(pow(state->Hmat[0][0], 2) + pow(state->Hmat[1][0], 2));
325     dy = sqrt(pow(state->Hmat[0][1], 2) + pow(state->Hmat[1][1], 2));
326    
327     aLat = dx / (double)(state->nx);
328     bLat = dy / (double)(state->ny);
329    
330     // FFT stuff depends on nx and ny, so delay allocation until we have
331     // that information
332    
333     for (i=0;i<state->nAtoms;i++){
334    
335     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
336     lineCount++;
337     if(eof_test == NULL){
338     printf("error in reading file at line: %d\n", lineCount);
339     exit(8);
340     }
341    
342     foo = strtok(read_buffer, " ,;\t\0");
343     (void)strcpy(state->r[i].name, foo); //copy the atom name
344    
345     // next we grab the positions
346    
347     foo = strtok(NULL, " ,;\t\0");
348     if(foo == NULL){
349     printf("error in reading postition x from %s\n"
350     "natoms = %d, line = %d\n",
351     in_name, state->nAtoms, lineCount );
352     exit(8);
353     }
354     (void)sscanf( foo, "%lf", &state->r[i].pos[0] );
355    
356     foo = strtok(NULL, " ,;\t\0");
357     if(foo == NULL){
358     printf("error in reading postition y from %s\n"
359     "natoms = %d, line = %d\n",
360     in_name, state->nAtoms, lineCount );
361     exit(8);
362     }
363     (void)sscanf( foo, "%lf", &state->r[i].pos[1] );
364    
365     foo = strtok(NULL, " ,;\t\0");
366     if(foo == NULL){
367     printf("error in reading postition z from %s\n"
368     "natoms = %d, line = %d\n",
369     in_name, state->nAtoms, lineCount );
370     exit(8);
371     }
372     (void)sscanf( foo, "%lf", &state->r[i].pos[2] );
373    
374     foo = strtok(NULL, " ,;\t\0");
375     if(foo == NULL){
376     printf("error in reading angle phi from %s\n"
377     "natoms = %d, line = %d\n",
378     in_name, state->nAtoms, lineCount );
379     exit(8);
380     }
381     (void)sscanf( foo, "%lf", &state->r[i].phi );
382    
383     foo = strtok(NULL, " ,;\t\0");
384     if(foo == NULL){
385     printf("error in reading unit vector x from %s\n"
386     "natoms = %d, line = %d\n",
387     in_name, state->nAtoms, lineCount );
388     exit(8);
389     }
390     (void)sscanf( foo, "%lf", &ux[i] );
391    
392     foo = strtok(NULL, " ,;\t\0");
393     if(foo == NULL){
394     printf("error in reading unit vector y from %s\n"
395     "natoms = %d, line = %d\n",
396     in_name, state->nAtoms, lineCount );
397     exit(8);
398     }
399     (void)sscanf( foo, "%lf", &uy[i] );
400    
401     foo = strtok(NULL, " ,;\t\0");
402     if(foo == NULL){
403     printf("error in reading unit vector z from %s\n"
404     "natoms = %d, line = %d\n",
405     in_name, state->nAtoms, lineCount );
406     exit(8);
407     }
408     (void)sscanf( foo, "%lf", &uz[i] );
409    
410     state->r[i].theta = acos(uz[i]);
411    
412     // The one parameter not stored in the dump file is the dipole strength
413     state->r[i].mu = state->strength;
414     }
415    
416     hsum_temp = 0.0;
417     for (i = 0; i < state->nAtoms; i++) {
418    
419     h = state->r[i].pos[2];
420     h2 = pow(h,2);
421    
422     hsum_temp += h;
423     hsum += h;
424     h2sum += h2;
425    
426     n1++;
427     }
428    
429     for(i = 0; i < state->nAtoms; i++){
430    
431     omat[0][0] += ux[i] * ux[i] - onethird;
432     omat[0][1] += ux[i] * uy[i];
433     omat[0][2] += ux[i] * uz[i];
434     omat[1][0] += uy[i] * ux[i];
435     omat[1][1] += uy[i] * uy[i] - onethird;
436     omat[1][2] += uy[i] * uz[i];
437     omat[2][0] += uz[i] * ux[i];
438     omat[2][1] += uz[i] * uy[i];
439     omat[2][2] += uz[i] * uz[i] - onethird;
440    
441     }
442    
443     for(i = 0; i < 3; i++){
444     for(j = 0; j < 3; j++){
445     omat[i][j] /= (double) state->nAtoms;
446     }
447     }
448    
449     // temp_array = dsyev_ctof(omat, nfilled, nfilled);
450    
451     for(j=0;j<3;j++)
452     for(i=0;i<3;i++)
453     wrapMat[i+j*3] = omat[i][j];
454    
455     ifail = 0;
456     dsyev(&job, &uplo, &nfilled, wrapMat, &ndiag, evals, work, &lwork, &ifail);
457    
458     for(j=0;j<3;j++)
459     for(i=0;i<3;i++)
460     omat[i][j] = wrapMat[i+j*3];
461    
462     //dsyev_ftoc2(temp_array, omat, nfilled, nfilled);
463    
464     //free(temp_array);
465    
466     max = 0.0;
467     for(j = 0; j < 3; j++){
468     if(fabs(evals[j]) > max){
469     which = j;
470     max = fabs(evals[j]);
471     }
472     }
473    
474     director[0][nframes-1] = omat[0][which];
475     director[1][nframes-1] = omat[1][which];
476     director[2][nframes-1] = omat[2][which];
477    
478     vr[0][nframes-1] = fabs(director[1][nframes-1]);
479     vr[1][nframes-1] = fabs(-director[0][nframes-1]);
480     vr[2][nframes-1] = 0;
481    
482     orderpar[nframes-1] = 1.5 * max;
483     printf("%d\t%lf\n", state->iCycle, orderpar[nframes-1]);
484    
485     opbin = (int) (orderpar[nframes-1] / delr);
486     if(opbin < nbins2) ophist[opbin] += 1;
487    
488     /* for(i = 0; i < state->nAtoms; i++){ */
489     /* proj = vr[0][nframes-1] * state->r[i].pos[0] + vr[1][nframes-1] * state->r[i].pos[1]; */
490     /* hi = state->r[i].pos[2] - hsum_temp / (double) state->nAtoms; */
491    
492     /* whichbin2 = (int) ((proj / (vr[0][nframes-1] * dx + vr[1][nframes-1] * dy)) * nbins2); */
493     /* vrhist[whichbin2][nframes-1] += hi; */
494     /* vrsamp[whichbin2][nframes-1]++; */
495     /* } */
496    
497     /* for(i = 0; i < state->nAtoms; i++){ */
498     /* for(j = 0; j < state->nAtoms; j++){ */
499    
500     /* d[0] = state->r[j].pos[0] - state->r[i].pos[0]; */
501     /* d[1] = state->r[j].pos[1] - state->r[i].pos[1]; */
502    
503     /* wrapVector(d, state->Hmat, state->HmatI); */
504    
505     /* whichbinx = (int) ((nbins-1) * (dx/2.0 + d[0]) / dx); */
506     /* whichbiny = (int) ((nbins-1) * (dy/2.0 + d[1]) / dy); */
507    
508     /* //if (i == j) { */
509     /* //printf("whichbinx = %i, whichbiny = %i\n", whichbinx, whichbiny); */
510     /* //} */
511    
512     /* //printf("d0 = %lf, d1 = %lf\n", d[0], d[1]); */
513     /* //printf("wx = %d, wy = %d\n", whichbinx, whichbiny); */
514    
515     /* if (whichbinx >= nbins || whichbiny >= nbins) { */
516     /* printf("off by one error\n"); */
517     /* printf("whichbinx = %i, whichbiny = %i\n", whichbinx, whichbiny); */
518     /* exit(0); */
519     /* } */
520     /* if (whichbinx < 0 || whichbiny < 0) { */
521     /* printf("off by one error\n"); */
522     /* printf("whichbinx = %i, whichbiny = %i\n", whichbinx, whichbiny); */
523     /* exit(0); */
524     /* } */
525    
526     /* hcorr = state->r[j].pos[2] * state->r[i].pos[2]; */
527    
528     /* corrhist[nbins * whichbinx + whichbiny] += hcorr; */
529    
530     /* dh = state->r[j].pos[2] - state->r[i].pos[2]; */
531     /* dh2 = pow(dh, 2); */
532    
533     /* h2hist[nbins * whichbinx + whichbiny] += dh2; */
534    
535     /* n2++; */
536     /* } */
537     /* } */
538    
539     temp_state = state->next;
540     state->next = NULL;
541    
542     if (temp_state != NULL) {
543     free(temp_state->r);
544     free(temp_state);
545     }
546    
547     // Make a new frame
548    
549     temp_state = (struct system *) malloc(sizeof(struct system));
550     temp_state->next = state;
551     state = temp_state;
552     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
553     lineCount++;
554     }
555    
556    
557     /* have = hsum / (double) n1; */
558     /* h2ave = h2sum / (double) n1; */
559     /* fluc = h2ave - pow(have, 2); */
560    
561     /* printf("# <h> = %lf\n", have); */
562     /* printf("# <h2> = %lf\n", h2ave); */
563     /* printf("# sigma(h) = %lf\n", sqrt(h2ave - have * have)); */
564     /* printf("# fluctuation = %lf\n", fluc); */
565    
566     /* for(i = 0; i < nframes; i++){ */
567     /* sum_orderpar += orderpar[i]; */
568     /* } */
569     /* ave_orderpar = sum_orderpar / (double) nframes; */
570    
571     /* for(i = 0; i < nframes; i++){ */
572     /* sum_director[0] += director[0][i]; */
573     /* sum_director[1] += director[1][i]; */
574     /* sum_director[2] += director[2][i]; */
575     /* } */
576     /* ave_director[0] = sum_director[0] / (double) nframes; */
577     /* ave_director[1] = sum_director[1] / (double) nframes; */
578     /* ave_director[2] = sum_director[2] / (double) nframes; */
579    
580     /* for(i = 0; i < nframes; i++){ */
581     /* sum_vr[0] += vr[0][i]; */
582     /* sum_vr[1] += vr[1][i]; */
583     /* sum_vr[2] += vr[2][i]; */
584     /* } */
585     /* ave_vr[0] = sum_vr[0] / (double) nframes; */
586     /* ave_vr[1] = sum_vr[1] / (double) nframes; */
587     /* ave_vr[2] = sum_vr[2] / (double) nframes; */
588    
589     /* printf("# orderparameter = %lf\n", ave_orderpar); */
590     /* printf("# director axis is ( %lf\t%lf\t%lf )\n", */
591     /* ave_director[0], ave_director[1], ave_director[2]); */
592     /* printf("# vr axis is ( %lf\t%lf\t%lf )\n", ave_vr[0], ave_vr[1], ave_vr[2]); */
593    
594     /* for(i = 0; i < nbins2; i++){ */
595     /* for(j = 0; j < nframes; j++){ */
596     /* sum_vrhist[i] += vrhist[i][j]; */
597     /* } */
598     /* } */
599    
600     /* dx = sqrt(pow(state->Hmat[0][0], 2) + pow(state->Hmat[1][0], 2)); */
601     /* dy = sqrt(pow(state->Hmat[0][1], 2) + pow(state->Hmat[1][1], 2)); */
602    
603     /* area = dx * dy; */
604    
605     /* bigL = sqrt(area); */
606    
607     /* areaPerMolecule = area / (double) state->nAtoms; */
608    
609     /* smallA = sqrt(areaPerMolecule); */
610    
611     /* gamma = t * log(bigL / smallA) / (2.0 * M_PI * fluc); */
612    
613     /* printf("# first gamma estimate = %lf\n", gamma); */
614    
615     /* printf("# \n"); */
616    
617     /* for(i = 0; i < nbins2; i++){ */
618     /* ave_vrhist[i] = sum_vrhist[i] / (double) nframes; */
619     /* printf("%lf\t%lf\n", (double) i * (ave_vr[0] * dx + ave_vr[1] * dy) / (double) nbins2, */
620     /* ave_vrhist[i]); */
621     /* } */
622    
623     /* selfx = (int) ((double)nbins / 2.0); */
624     /* selfy = (int) ((double)nbins / 2.0); */
625    
626     /* for (i = 0; i < nbins; i++) { */
627     /* for (j = 0; j < nbins; j++) { */
628     /* printf("%lf\t", h2hist[nbins * i + j] / (double) n2); */
629     /* } */
630     /* printf("\n"); */
631     /* } */
632    
633     free(work);
634     free(corrhist);
635     free(h2hist);
636     free(ux);
637     free(uy);
638     free(uz);
639     return 1;
640    
641     }
642    
643     double matDet2(double a[2][2]) {
644    
645     double determinant;
646    
647     determinant = (a[0][0] * a[1][1]) - (a[0][1] * a[1][0]);
648    
649     return determinant;
650     }
651    
652    
653     void invertMat2(double a[2][2], double b[2][2]) {
654    
655     double determinant;
656    
657     determinant = matDet2( a );
658    
659     if (determinant == 0.0) {
660     printf("Can't invert a matrix with a zero determinant!\n");
661     }
662    
663     b[0][0] = a[1][1] / determinant;
664     b[0][1] = -a[0][1] / determinant;
665     b[1][0] = -a[1][0] / determinant;
666     b[1][1] = a[0][0] / determinant;
667     }
668    
669     void matVecMul2(double m[2][2], double inVec[2], double outVec[2]) {
670     double a0, a1, a2;
671    
672     a0 = inVec[0]; a1 = inVec[1];
673    
674     outVec[0] = m[0][0]*a0 + m[0][1]*a1;
675     outVec[1] = m[1][0]*a0 + m[1][1]*a1;
676     }
677    
678     void wrapVector( double thePos[2], double Hmat[2][2], double HmatInv[2][2]){
679    
680     int i;
681     double scaled[2];
682    
683     // calc the scaled coordinates.
684    
685     matVecMul2(HmatInv, thePos, scaled);
686    
687     for(i=0; i<2; i++)
688     scaled[i] -= roundMe(scaled[i]);
689    
690     // calc the wrapped real coordinates from the wrapped scaled coordinates
691    
692     matVecMul2(Hmat, scaled, thePos);
693    
694     }
695    
696     /* double* dsyev_ctof(double **in, int rows, int cols) */
697     /* { */
698     /* double *out; */
699     /* int i, j; */
700    
701     /* out = (double *) calloc(rows * cols, sizeof(double)); */
702    
703     /* if (!out){ */
704     /* printf("Fail to allocate memory\n"); */
705     /* exit(1); */
706     /* } */
707    
708     /* for (i = 0; i < rows; i++) */
709     /* for (j = 0; j < cols; j++) */
710     /* out[i+j*cols] = in[i][j]; */
711    
712     /* return(out); */
713     /* } */
714    
715     /* void dsyev_ftoc2(double *in, double **out, int rows, int cols) */
716     /* { */
717     /* int i, j; */
718    
719     /* for (i = 0; i < rows; i++) */
720     /* for (j = 0; j < cols; j++) */
721     /* out[i][j] = in[i+j*cols]; */
722     /* } */
723     /* void direct(double rcut, double box, int n, int nstep, int maxbin){ */
724    
725     /* int bin, maxbin, nbins, i, j, k, n, bind, which; */
726     /* int hist[maxbin], histd[maxbin], startstep; */
727     /* int nstep, stopstep, ndiag, nfilled, ifail, lwork; */
728     /* double delr, rijsp, rxij, ryij, rzij, rij; */
729     /* double delrd, rijsqd, rijd, orderpar[1000], nideal; */
730     /* double omat[3][3], evals[100], cons, rlower; */
731     /* double rcut, box, dens, director[3][1000], rupper; */
732     /* double rx[1000][1000], ry[1000][1000], rz[1000][1000]; */
733     /* double ux[1000][1000], uy[1000][1000], uz[1000][1000]; */
734     /* double vx[1000][1000], vy[1000][1000], vz[1000][1000]; */
735     /* double jx[1000][1000], jy[1000][1000], jz[1000][1000]; */
736     /* double grd[5000], gr[5000], max, binmin, binmax; */
737     /* double onethird, ordvals[5000]; */
738     /* char job, uplo; */
739     /* int ndiag; */
740     /* int nfilled; */
741     /* double omat[3][3]; */
742     /* double evals[100]; */
743     /* double work[]; */
744     /* int lwork; */
745     /* int ifail; */
746    
747     /* lwork = 9; */
748     /* work = (double *)calloc(lwork, sizeof(double)); */
749    
750     /* onethird = 1.0 / 3.0; */
751     /* ndiag = 3; */
752     /* nfilled = 3; */
753     /* job = 'V'; */
754     /* uplo = 'U'; */
755     /* ifail = 0; */
756    
757     /* binmin = 0.0; */
758     /* binmax = 1.0; */
759     /* delr = (binmax - binmin) / (double) maxbin; */
760    
761     /* for(i = 0; i < maxbin; i++){ */
762    
763     /* ordvals(i) = 0.0; */
764     /* hist(i) = 0.0; */
765    
766     /* } */
767    
768     /* for(i = 0; i < stopstep; i++){ */
769    
770     /* for(j = 0; j < 3; j++){ */
771     /* for(k = 0; k < 3; k++){ */
772     /* omat[j][k] = 0.0; */
773     /* } */
774     /* } */
775    
776     /* for(j = 0; j < n; j++){ */
777    
778     /* omat[1][1] = omat[1][1] + ux[j][i] * ux[j][i] - onethird; */
779     /* omat[1][2] = omat[1][2] + ux[j][i] * uy[j][i]; */
780     /* omat[1][3] = omat[1][3] + ux[j][i] * uz[j][i]; */
781     /* omat[2][1] = omat[2][1] + uy[j][i] * ux[j][i]; */
782     /* omat[2][2] = omat[2][2] + uy[j][i] * uy[j][i] - onethird; */
783     /* omat[2][3] = omat[2][3] + uy[j][i] * uz[j][i]; */
784     /* omat[3][1] = omat[3][1] + uz[j][i] * ux[j][i]; */
785     /* omat[3][2] = omat[3][2] + uz[j][i] * uy[j][i]; */
786     /* omat[3][3] = omat[3][3] + uz[j][i] * uz[j][i] - onethird; */
787    
788     /* } */
789    
790    
791     /* for(j = 0; j < 3; j++){ */
792     /* for(k = 0; k < 3; k++){ */
793     /* omat[j][k] = omat[j][k] / (double) n; */
794     /* } */
795     /* } */
796    
797     /* dsyev_(job, uplo, nfilled, omat, ndiag, evals, work, lwork, ifail); */
798    
799     /* max = 0.0; */
800     /* for(j = 0; j < 3; j++){ */
801     /* if(fabs(evals(j)) > max){ */
802     /* which = j; */
803     /* max = fabs(evals(j)); */
804     /* } */
805     /* } */
806    
807     /* director[1][i] = omat[1][which]; */
808     /* director[2][i] = omat[2][which]; */
809     /* director[3][i] = omat[3][which]; */
810    
811     /* orderpar(i) = 1.5 * max; */
812    
813     /* bin = (int) (orderpar(i) / delr) + 1; */
814    
815     /* if(bin < maxbin) */
816     /* hist(bin) = hist(bin) + 1; */
817     /* } */
818    
819     /* cons = 1.0; */
820     /* for(bin = 0; bin < maxbin; bin++){ */
821    
822     /* rlower = (double) (bin - 1) * delr; */
823     /* rupper = rlower + delr; */
824     /* ordvals(bin) = rlower + (delr / 2.0); */
825     /* nideal = cons * (pow(rupper, 3) - pow(rlower, 3)); */
826     /* gr(bin) = (double) (hist(bin)) / (double) nstep /nideal; */
827    
828     /* } */
829     /* } */