ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/ripple/read2d.c
Revision: 1185
Committed: Fri May 21 20:07:10 2004 UTC (20 years, 1 month ago) by xsun
Content type: text/plain
File size: 14852 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    
7     // Structures to store our data:
8    
9     // coords holds the data for a single tethered dipole:
10     struct coords{
11     double pos[3]; // cartesian coords
12     double theta; // orientational angle relative to z axis
13     double phi; // orientational angle in x-y plane
14     double mu; // dipole strength
15     char name[30]; // an identifier for the type of atom
16     };
17    
18     // state holds the current "configuration" of the entire system
19     struct system {
20     int nAtoms; // Number of Atoms in this configuration
21     struct coords *r; // The set of coordinates for all atoms
22     double beta; // beta = 1 /(kb*T)
23     double strength; // strength of the dipoles (Debye)
24     double z0; // default z axis position
25     double theta0; // default theta angle
26     double kz; // force constant for z displacement
27     double ktheta; // force constant for theta displacement
28     int nCycles; // How many cycles to do in total
29     int iCycle; // How many cycles have we done?
30     int nMoves; // How many MC moves in each cycle
31     int nSample; // How many cycles between samples
32     double Hmat[2][2]; // The information about the size of the per. box
33     double HmatI[2][2]; // The inverse box
34     double energy; // The current Energy
35     double dtheta; // maximum size of a theta move
36     double deltaz; // maximum size of a z move
37     double deltaphi; // maximum size of a phi move
38     int nAttempts; // number of MC moves that have been attempted
39     int nAccepts; // number of MC moves that have been accepted
40     int nx; // number of unit cells in x direction
41     int ny; // number of unit cells in y direction
42     struct system *next; // Next frame in the linked list
43     };
44    
45     char *program_name;
46    
47     int main(argc, argv)
48     int argc;
49     char *argv[];
50     {
51     FILE *in_file;
52     char in_name[500];
53     char *eof_test, *foo;
54     char read_buffer[1000];
55     int lineCount = 0;
56     double *mag, *newmag;
57     int *present_in_old;
58     double uxi, uyi, uzi, p1;
59     double aLat, bLat;
60     int cells;
61     double sumZ, sumUx, sumUy, sumUz, sumP;
62     double interpsum, value;
63     int ninterp, px, py, newp;
64     int i, j, nloops;
65     int newx, newy, newindex, index;
66     int new_i, new_j, new_index;
67     int N, nframes;
68     double freq_x, freq_y, zero_freq_x, zero_freq_y, freq;
69     double maxfreqx, maxfreqy, maxfreq, dfreq;
70     double dx, dy, dx1, dy1, pt1x, pt1y, pt2x, pt2y;
71     int whichbin;
72     int nbins, nx, ny;
73     int *samples;
74     double *bin;
75    
76     int done;
77     char current_flag;
78    
79     program_name = argv[0];
80    
81     for(i = 1; i < argc; i++){
82     if(argv[i][0] == '-'){
83     done = 0;
84     j = 1;
85     current_flag = argv[i][j];
86     while( (current_flag != '\0') && ( !done ) ){
87     switch(current_flag){
88     case 'i':
89     i++;
90     strcpy( in_name, argv[i] );
91     done = 1;
92     break;
93     }
94     }
95     }
96     }
97    
98     struct system* state;
99     struct system* temp_state;
100     struct coords* r;
101    
102     FFTW_COMPLEX *in, *out;
103     fftwnd_plan p;
104    
105     nbins = 50;
106     bin = (double *) malloc(sizeof(double) * nbins);
107     samples = (int *) malloc(sizeof(int) * nbins);
108     for (i=0; i < nbins; i++) {
109     bin[i] = 0.0;
110     samples[i] = 0;
111     }
112    
113     in_file = fopen(in_name, "r");
114     if(in_file == NULL){
115     printf("Cannot open file \"%s\" for reading.\n", in_name);
116     exit(8);
117     }
118    
119     nframes = 0;
120    
121     // start reading the first frame
122    
123     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
124     lineCount++;
125    
126     state = (struct system *) malloc(sizeof(struct system));
127     state->next = NULL;
128     state->strength = 10.0;
129    
130    
131     while(eof_test != NULL){
132    
133     nframes++;
134     (void)sscanf(read_buffer, "%d", &state->nAtoms);
135     N = 2 * state->nAtoms;
136    
137     state->r = (struct coords *)calloc(N, sizeof(struct coords));
138     mag = (double *) malloc(sizeof(double) * N);
139     newmag = (double *) malloc(sizeof(double) * N);
140     present_in_old = (int *) malloc(sizeof(int) * N);
141    
142     // read and the comment line and grab the time and box dimensions
143    
144     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
145     lineCount++;
146     if(eof_test == NULL){
147     printf("error in reading file at line: %d\n", lineCount);
148     exit(8);
149     }
150    
151     foo = strtok( read_buffer, " ,;\t\n" );
152     (void)sscanf( read_buffer, "%d", &state->iCycle );
153    
154     foo = strtok(NULL, " ,;\t\0");
155     if(foo == NULL){
156     printf("error in reading file at line: %d\n", lineCount);
157     exit(8);
158     }
159     (void)sscanf(foo, "%d", &state->nx);
160    
161     nx = state->nx;
162    
163     foo = strtok(NULL, " ,;\t\0");
164     if(foo == NULL){
165     printf("error in reading file at line: %d\n", lineCount);
166     exit(8);
167     }
168     (void)sscanf(foo, "%d", &state->ny);
169    
170     ny = state->ny;
171    
172     foo = strtok(NULL, " ,;\t\0");
173     if(foo == NULL){
174     printf("error in reading file at line: %d\n", lineCount);
175     exit(8);
176     }
177     (void)sscanf(foo, "%lf",&state->Hmat[0][0]);
178    
179     foo = strtok(NULL, " ,;\t\0");
180     if(foo == NULL){
181     printf("error in reading file at line: %d\n", lineCount);
182     exit(8);
183     }
184     (void)sscanf(foo, "%lf",&state->Hmat[1][0]);
185    
186     foo = strtok(NULL, " ,;\t\0");
187     if(foo == NULL){
188     printf("error in reading file at line: %d\n", lineCount);
189     exit(8);
190     }
191     (void)sscanf(foo, "%lf",&state->Hmat[0][1]);
192    
193     foo = strtok(NULL, " ,;\t\0");
194     if(foo == NULL){
195     printf("error in reading file at line: %d\n", lineCount);
196     exit(8);
197     }
198     (void)sscanf(foo, "%lf",&state->Hmat[1][1]);
199    
200     // Length of the two box vectors:
201    
202     dx = sqrt(pow(state->Hmat[0][0], 2) + pow(state->Hmat[1][0], 2));
203     dy = sqrt(pow(state->Hmat[0][1], 2) + pow(state->Hmat[1][1], 2));
204    
205     aLat = dx / (double)(state->nx);
206     bLat = dy / (double)(state->ny);
207    
208    
209     // FFT stuff depends on nx and ny, so delay allocation until we have
210     // that information
211    
212     in = fftw_malloc(sizeof(FFTW_COMPLEX) * N);
213     out = fftw_malloc(sizeof(FFTW_COMPLEX) * N);
214     p = fftw2d_create_plan(2*state->nx,
215     2*state->ny,
216     FFTW_FORWARD,
217     FFTW_ESTIMATE);
218    
219    
220     for (i = 0; i < N; i++) {
221     present_in_old[i] = 0;
222     }
223    
224     for (i=0;i<2*state->nx;i=i+2){
225     for(j=0;j<2*state->ny;j++){
226     newy = j;
227     if ((j % 2) == 0) {
228     newx = i;
229     } else {
230     newx = i + 1;
231     }
232     newindex = newx*2*state->ny + newy;
233    
234     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
235     lineCount++;
236     if(eof_test == NULL){
237     printf("error in reading file at line: %d\n", lineCount);
238     exit(8);
239     }
240    
241     foo = strtok(read_buffer, " ,;\t\0");
242     (void)strcpy(state->r[newindex].name, foo); //copy the atom name
243    
244     // next we grab the positions
245    
246     foo = strtok(NULL, " ,;\t\0");
247     if(foo == NULL){
248     printf("error in reading postition x from %s\n"
249     "natoms = %d, line = %d\n",
250     in_name, state->nAtoms, lineCount );
251     exit(8);
252     }
253     (void)sscanf( foo, "%lf", &state->r[newindex].pos[0] );
254    
255     foo = strtok(NULL, " ,;\t\0");
256     if(foo == NULL){
257     printf("error in reading postition y from %s\n"
258     "natoms = %d, line = %d\n",
259     in_name, state->nAtoms, lineCount );
260     exit(8);
261     }
262     (void)sscanf( foo, "%lf", &state->r[newindex].pos[1] );
263    
264     foo = strtok(NULL, " ,;\t\0");
265     if(foo == NULL){
266     printf("error in reading postition z from %s\n"
267     "natoms = %d, line = %d\n",
268     in_name, state->nAtoms, lineCount );
269     exit(8);
270     }
271     (void)sscanf( foo, "%lf", &state->r[newindex].pos[2] );
272    
273     foo = strtok(NULL, " ,;\t\0");
274     if(foo == NULL){
275     printf("error in reading angle phi from %s\n"
276     "natoms = %d, line = %d\n",
277     in_name, state->nAtoms, lineCount );
278     exit(8);
279     }
280     (void)sscanf( foo, "%lf", &state->r[newindex].phi );
281    
282     foo = strtok(NULL, " ,;\t\0");
283     if(foo == NULL){
284     printf("error in reading unit vector x from %s\n"
285     "natoms = %d, line = %d\n",
286     in_name, state->nAtoms, lineCount );
287     exit(8);
288     }
289     (void)sscanf( foo, "%lf", &uxi );
290    
291     foo = strtok(NULL, " ,;\t\0");
292     if(foo == NULL){
293     printf("error in reading unit vector y from %s\n"
294     "natoms = %d, line = %d\n",
295     in_name, state->nAtoms, lineCount );
296     exit(8);
297     }
298     (void)sscanf( foo, "%lf", &uyi );
299    
300     foo = strtok(NULL, " ,;\t\0");
301     if(foo == NULL){
302     printf("error in reading unit vector z from %s\n"
303     "natoms = %d, line = %d\n",
304     in_name, state->nAtoms, lineCount );
305     exit(8);
306     }
307     (void)sscanf( foo, "%lf", &uzi );
308    
309     state->r[newindex].theta = acos(uzi);
310    
311     // The one parameter not stored in the dump file is the dipole strength
312     state->r[newindex].mu = state->strength;
313    
314     present_in_old[newindex] = 1;
315     }
316     }
317    
318    
319     for (i=0; i< 2*state->nx; i++) {
320     for(j=0; j< 2*state->ny; j++) {
321     newindex = i*2*state->ny + j;
322     mag[newindex] = 0.0;
323     newmag[newindex] = 0.0;
324     }
325     }
326    
327     for (i=0; i< 2*state->nx; i++) {
328     for(j=0; j< 2*state->ny; j++) {
329     newindex = i*2*state->ny + j;
330     if (present_in_old[newindex] == 0) {
331     // interpolate from surrounding points:
332    
333     interpsum = 0.0;
334     ninterp = 0;
335    
336     //point1 = bottom;
337    
338     px = i - 1;
339     py = j;
340     newp = px*2*state->ny + py;
341     if (px >= 0) {
342     interpsum += state->r[newp].pos[2];
343     ninterp++;
344     state->r[newindex].pos[1] = state->r[newp].pos[1];
345     }
346    
347     //point2 = top;
348    
349     px = i + 1;
350     py = j;
351     newp = px*2*state->ny + py;
352     if (px < 2*state->nx) {
353     interpsum += state->r[newp].pos[2];
354     ninterp++;
355     state->r[newindex].pos[1] = state->r[newp].pos[1];
356     }
357    
358     //point3 = left;
359    
360     px = i;
361     py = j - 1;
362     newp = px*2*state->ny + py;
363     if (py >= 0) {
364     interpsum += state->r[newp].pos[2];
365     ninterp++;
366     state->r[newindex].pos[0] = state->r[newp].pos[0];
367     }
368    
369     //point4 = right;
370    
371     px = i;
372     py = j + 1;
373     newp = px*2*state->ny + py;
374     if (py < 2*state->ny) {
375     interpsum += state->r[newp].pos[2];
376     ninterp++;
377     state->r[newindex].pos[0] = state->r[newp].pos[0];
378     }
379    
380     value = interpsum / (double)ninterp;
381    
382     state->r[newindex].pos[2] = value;
383     }
384     }
385     }
386    
387    
388    
389    
390    
391     for (i=0; i < 2*state->nx; i++) {
392     for (j=0; j < 2*state->ny; j++) {
393     newindex = i*2*state->ny + j;
394    
395     c_re(in[newindex]) = state->r[newindex].pos[2];
396     c_im(in[newindex]) = 0.0;
397     }
398     }
399    
400    
401     fftwnd(p, 1, in, 1, 0, out, 1, 0);
402    
403     for (i=0; i< 2*state->nx; i++) {
404     for(j=0; j< 2*state->ny; j++) {
405     newindex = i*2*state->ny + j;
406     mag[newindex] += sqrt(pow(c_re(out[newindex]),2) + pow(c_im(out[newindex]),2));
407     }
408     }
409    
410    
411     temp_state = state->next;
412     state->next = NULL;
413    
414     if (temp_state != NULL) {
415     free(temp_state->r);
416     free(temp_state);
417     }
418    
419    
420     fftwnd_destroy_plan(p);
421     fftw_free(out);
422     fftw_free(in);
423    
424     free(present_in_old);
425    
426     // Make a new frame
427    
428     temp_state = (struct system *) malloc(sizeof(struct system));
429     temp_state->next = state;
430     state = temp_state;
431     eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
432     lineCount++;
433    
434     }
435    
436    
437     // This stuff is for printing out the FFT results directly for matlab:
438    
439     for (i=0; i < 2*nx; i++) {
440     for(j=0; j< 2*ny; j++) {
441     newindex = i*2*ny + j;
442     printf("%lf\t", mag[newindex]/(double)nframes);
443     }
444     printf("\n");
445     }
446    
447    
448     // This stuff is for stitching the four quadrants together:
449    
450     /* for (i=0; i< (2*nx/2); i++) { */
451     /* for(j=0; j< (2*ny/2); j++) { */
452     /* index = i*2*ny + j; */
453     /* new_i = i + (2*nx/2); */
454     /* new_j = j + (2*ny/2); */
455     /* new_index = new_i*2*ny + new_j; */
456     /* newmag[new_index] = mag[index]; */
457     /* } */
458     /* } */
459    
460     /* for (i=(2*nx/2); i< 2*nx; i++) { */
461     /* for(j=0; j< (2*ny/2); j++) { */
462     /* index = i*2*ny + j; */
463     /* new_i = i - (2*nx/2); */
464     /* new_j = j + (2*ny/2); */
465     /* new_index = new_i*2*ny + new_j; */
466     /* newmag[new_index] = mag[index]; */
467     /* } */
468     /* } */
469    
470     /* for (i=0; i< (2*nx/2); i++) { */
471     /* for(j=(2*ny/2); j< 2*ny; j++) { */
472     /* index = i*2*ny + j; */
473     /* new_i = i + (2*nx/2); */
474     /* new_j = j - (2*ny/2); */
475     /* new_index = new_i*2*ny + new_j; */
476     /* newmag[new_index] = mag[index]; */
477     /* } */
478     /* } */
479    
480     /* for (i=(2*nx/2); i< 2*nx; i++) { */
481     /* for(j=(2*ny/2); j< 2*ny; j++) { */
482     /* index = i*2*ny + j; */
483     /* new_i = i - (2*nx/2); */
484     /* new_j = j - (2*ny/2); */
485     /* new_index = new_i*2*ny + new_j; */
486     /* newmag[new_index] = mag[index]; */
487     /* } */
488     /* } */
489    
490     /* maxfreqx = 2.0 / aLat; */
491     /* maxfreqy = 2.0 / bLat; */
492    
493     /* // printf("%lf\t%lf\t%lf\t%lf\n", dx, dy, maxfreqx, maxfreqy); */
494    
495     /* maxfreq = sqrt(maxfreqx*maxfreqx + maxfreqy*maxfreqy); */
496     /* dfreq = maxfreq/(double)(nbins-1); */
497    
498     /* //printf("%lf\n", dfreq); */
499    
500     /* zero_freq_x = nx; */
501     /* zero_freq_y = ny; */
502    
503     /* for (i=0; i< 2*nx; i++) { */
504     /* for(j=0; j< 2*ny; j++) { */
505    
506     /* freq_x = (double)(i - zero_freq_x)*maxfreqx / nx; */
507     /* freq_y = (double)(j - zero_freq_y)*maxfreqy / ny; */
508    
509     /* freq = sqrt(freq_x*freq_x + freq_y*freq_y); */
510    
511     /* whichbin = (int) (freq / dfreq); */
512     /* newindex = i*2*ny + j; */
513     /* // printf("%d %d %lf %lf\n", whichbin, newindex, freq, dfreq); */
514     /* bin[whichbin] += mag[newindex]; */
515     /* samples[whichbin]++; */
516     /* } */
517     /* } */
518    
519    
520    
521    
522     /* for (i = 0; i < nbins; i++) { */
523     /* if (samples[i] > 0) { */
524     /* printf("%lf\t%lf\n", i*dfreq, bin[i]/(double)samples[i]); */
525     /* } */
526     /* } */
527    
528     // This stuff is for printing out the FFT results directly:
529    
530     /* for (i=0; i < 2*nx; i++) { */
531     /* for(j=0; j< 2*ny; j++) { */
532     /* newindex = i*2*ny + j; */
533     /* printf("%lf\t", mag[newindex]/(double)nframes); */
534     /* } */
535     /* printf("\n"); */
536     /* } */
537    
538     fclose(in_file);
539     free(newmag);
540     free(mag);
541     free(samples);
542     free(bin);
543     free(state);
544     return(0);
545     }
546    
547     /* } */
548     /* for(i=0;i<120;i++) printf("%f\t%f\n", c_re(out[i]), c_im(out[i])); */
549     /* fftw_destroy_plan(p); */
550     /* fftw_free(in); */
551     /* fftw_free(out); */
552     /* averZ = sumZ / (double)nloops; */
553     /* averUx = sumUx / (double)nloops; */
554     /* averUy = sumUy / (double)nloops; */
555     /* averUz = sumUz / (double)nloops; */
556     /* averP = 1.5*sumP / (double)nloops-0.5; */
557     /* averTheta = acos(averUz); */
558     /* printf("nloops=%d\n",nloops); */
559     /* printf("sumZ=%f\n",sumZ); */
560     /* printf("average height is : %f\n",averZ); */
561     /* printf("average ux is : %f\n",averUx); */
562     /* printf("average uy is : %f\n",averUy); */
563     /* printf("average uz is : %f\n",averUz); */
564     /* printf("average angle is : %f\n",averTheta); */
565     /* printf("average p is : %f\n",averP); */
566    
567    
568     /* return 0; */
569     /* }*/