ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/dp/read.c
Revision: 585
Committed: Wed Jul 9 15:52:32 2003 UTC (20 years, 11 months ago) by xsun
Content type: text/plain
File size: 8330 byte(s)
Log Message:
*** empty log message ***

File Contents

# Content
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<math.h>
5 #include<fftw.h>
6
7 int main()
8 {
9 FILE *inFile;
10 char *endptr, s[100000];
11 double *x, *y, *z;
12 double *mag, *newmag;
13 int *present_in_old;
14 double ux, uy, uz, p1;
15 double sumZ, sumUx, sumUy, sumUz, sumP;
16 double interpsum, value;
17 int ninterp, px, py, newp;
18 int i, j, nsites, nloops, xlat, ylat;
19 int newx, newy, newindex, index;
20 int new_i, new_j, new_index;
21 int N, nframes;
22 double freq_x, freq_y, zero_freq_x, zero_freq_y, freq;
23 double maxfreqx, maxfreqy, maxfreq, dfreq;
24 double dx, dy, pt1x, pt1y, pt2x, pt2y;
25 int whichbin;
26 int nbins;
27 int *samples;
28 double *bin;
29
30 FFTW_COMPLEX *in, *out;
31 fftwnd_plan p;
32
33 nbins = 200;
34
35 inFile = fopen("./dp_file","r");
36 if (inFile == NULL) {
37 printf("Error opening file\n");
38 exit(-1);
39 }
40
41 fgets(s, 500, inFile);
42 nsites = atoi(s);
43 N = 2*nsites;
44 fscanf(inFile,"%s",s);
45 xlat=atoi(s);
46 fscanf(inFile,"%s",s);
47 ylat=atoi(s);
48
49
50 //sanity check:
51 if (2*nsites != xlat * ylat) {
52 printf("Lattice Mismatch: nsites = %d, xlat = %d, ylat = %d\n", nsites, xlat, ylat);
53 exit(-1);
54 }
55
56 rewind(inFile);
57
58 in = fftw_malloc(sizeof(FFTW_COMPLEX) * N);
59 out = fftw_malloc(sizeof(FFTW_COMPLEX) * N);
60 p = fftw2d_create_plan(xlat, ylat, FFTW_FORWARD, FFTW_ESTIMATE);
61
62 x = (double *) malloc(sizeof(double) * N);
63 y = (double *) malloc(sizeof(double) * N);
64 z = (double *) malloc(sizeof(double) * N);
65 mag = (double *) malloc(sizeof(double) * N);
66 newmag = (double *) malloc(sizeof(double) * N);
67 present_in_old = (int *) malloc(sizeof(int) * N);
68
69 bin = (double *) malloc(sizeof(double) * nbins);
70 samples = (int *) malloc(sizeof(int) * nbins);
71
72
73
74 for (i=0; i< xlat; i++) {
75 for(j=0; j< ylat; j++) {
76 newindex = i*ylat + j;
77 mag[newindex] = 0.0;
78 newmag[newindex] = 0.0;
79 }
80 }
81
82 sumZ = 0.0;
83 sumUx = 0.0;
84 sumUy = 0.0;
85 sumUz = 0.0;
86 sumP = 0.0;
87
88 nloops = 0;
89 nframes = 0;
90
91 while(!feof(inFile))
92 {
93 nframes++;
94 fgets(s, 500, inFile);
95 nsites = atoi(s);
96 fscanf(inFile,"%s",s);
97 xlat=atoi(s);
98 fscanf(inFile,"%s",s);
99 ylat=atoi(s);
100
101 //sanity check:
102 if (2*nsites != xlat * ylat) {
103 printf("Lattice Mismatch: nsites = %d, xlat = %d, ylat = %d\n", nsites, xlat, ylat);
104 exit(-1);
105 }
106
107 for (i = 0; i < N; i++ ) {
108 present_in_old[i] = 0;
109 }
110
111 for (i=0;i<xlat;i=i+2)
112 {
113 for(j=0;j<ylat;j++)
114 {
115
116 newy = j;
117 if ((j % 2) == 0) {
118 newx = i;
119 } else {
120 newx = i + 1;
121 }
122 newindex = newx*ylat + newy;
123
124 fscanf(inFile,"%s",s);
125 fscanf(inFile,"%s",s);
126 x[newindex]=strtod(s,&endptr);
127 fscanf(inFile,"%s",s);
128 y[newindex]=strtod(s,&endptr);
129 fscanf(inFile,"%s",s);
130 z[newindex] = strtod(s,&endptr);
131 present_in_old[newindex] = 1;
132 // printf("z=%f\t",z[newindex]);
133 fscanf(inFile,"%s",s);
134 fscanf(inFile,"%s",s);
135 ux=strtod(s,&endptr);
136 fscanf(inFile,"%s",s);
137 uy=strtod(s,&endptr);
138 fscanf(inFile,"%s",s);
139 uz=strtod(s,&endptr);
140 // p1 = uz * uz;
141 // sumZ = sumZ + z[i];
142 // sumUx = sumUx + ux;
143 // sumUy = sumUy + uy;
144 // sumUz = sumUz + uz;
145 // sumP = sumP + p1;
146 nloops += 1;
147 fgets(s, 500, inFile);
148 }
149 }
150
151 for (i=0; i< xlat; i++) {
152 for(j=0; j< ylat; j++) {
153 newindex = i*ylat + j;
154 if (present_in_old[newindex] == 0) {
155 // interpolate from surrounding points:
156
157 interpsum = 0.0;
158 ninterp = 0;
159
160 //point1 = bottom;
161
162 px = i - 1;
163 py = j;
164 newp = px*ylat + py;
165 if (px >= 0) {
166 interpsum += z[newp];
167 ninterp++;
168 y[newindex] = y[newp];
169 }
170 if (px < 0) {
171 interpsum += z[newp+xlat*ylat];
172 ninterp++;
173 y[newindex] = y[newp+xlat*ylat];
174 }
175
176 //point2 = top;
177
178 px = i + 1;
179 py = j;
180 newp = px*ylat + py;
181 if (px < xlat) {
182 interpsum += z[newp];
183 ninterp++;
184 y[newindex] = y[newp];
185 }
186 if (px == xlat) {
187 interpsum += z[newp-xlat*ylat];
188 ninterp++;
189 y[newindex] = y[newp-xlat*ylat];
190 }
191
192 //point3 = left;
193
194 px = i;
195 py = j - 1;
196 newp = px*ylat + py;
197 if (py >= 0) {
198 interpsum += z[newp];
199 ninterp++;
200 x[newindex] = x[newp];
201 }
202 if (py < 0) {
203 interpsum += z[newp+ylat];
204 ninterp++;
205 x[newindex] = x[newp+ylat];
206 }
207
208 //point4 = right;
209
210 px = i;
211 py = j + 1;
212 newp = px*ylat + py;
213 if (py < ylat) {
214 interpsum += z[newp];
215 ninterp++;
216 x[newindex] = x[newp];
217 }
218 if (py == ylat) {
219 interpsum += z[newp-ylat];
220 ninterp++;
221 x[newindex] = x[newp-ylat];
222 }
223
224 value = interpsum / (double)ninterp;
225
226 z[newindex] = value;
227
228 }
229 }
230 }
231
232 for (i=0; i < xlat; i++) {
233 for (j=0; j < ylat; j++) {
234 newindex = i*ylat + j;
235 c_re(in[newindex]) = z[newindex];
236 c_im(in[newindex]) = 0.0;
237 }
238 }
239
240 fftwnd(p, 1, in, 1, 0, out, 1, 0);
241 for (i=0; i< xlat; i++) {
242 for(j=0; j< ylat; j++) {
243 newindex = i*ylat + j;
244 mag[newindex] += sqrt(pow(c_re(out[newindex]),2) + pow(c_im(out[newindex]),2));
245 }
246 }
247
248 }
249
250 for (i=0; i< (xlat/2); i++) {
251 for(j=0; j< (ylat/2); j++) {
252 index = i*ylat + j;
253 new_i = i + (xlat/2);
254 new_j = j + (ylat/2);
255 new_index = new_i*ylat + new_j;
256 newmag[new_index] = mag[index];
257 }
258 }
259
260 for (i=(xlat/2); i< xlat; i++) {
261 for(j=0; j< (ylat/2); j++) {
262 index = i*ylat + j;
263 new_i = i - (xlat/2);
264 new_j = j + (ylat/2);
265 new_index = new_i*ylat + new_j;
266 newmag[new_index] = mag[index];
267 }
268 }
269
270 for (i=0; i< (xlat/2); i++) {
271 for(j=(ylat/2); j< ylat; j++) {
272 index = i*ylat + j;
273 new_i = i + (xlat/2);
274 new_j = j - (ylat/2);
275 new_index = new_i*ylat + new_j;
276 newmag[new_index] = mag[index];
277 }
278 }
279
280 for (i=(xlat/2); i< xlat; i++) {
281 for(j=(ylat/2); j< ylat; j++) {
282 index = i*ylat + j;
283 new_i = i - (xlat/2);
284 new_j = j - (ylat/2);
285 new_index = new_i*ylat + new_j;
286 newmag[new_index] = mag[index];
287 }
288 }
289
290 pt1x = x[0];
291 pt1y = y[0];
292 pt2x = x[ylat + 1];
293 pt2y = y[ylat + 1];
294
295 dx = pt2x - pt1x;
296 dy = pt2y - pt1y;
297
298 maxfreqx = 1.0/dx;
299 maxfreqy = 1.0/dy;
300
301
302 maxfreq = sqrt(maxfreqx*maxfreqx + maxfreqy*maxfreqy);
303 dfreq = maxfreq/(double)nbins;
304
305 for (i=0; i < nbins; i++) {
306 bin[i] = 0.0;
307 samples[i] = 0;
308 }
309
310 zero_freq_x = xlat/2;
311 zero_freq_y = ylat/2;
312
313 for (i=0; i< xlat; i++) {
314 for(j=0; j< ylat; j++) {
315
316 freq_x = (double)(i - zero_freq_x)*maxfreqx/(double)xlat;
317 freq_y = (double)(j - zero_freq_y)*maxfreqy/(double)ylat;
318
319 freq = sqrt(freq_x*freq_x + freq_y*freq_y);
320
321 whichbin = (int) (freq / dfreq);
322 newindex = i*ylat + j;
323 bin[whichbin] += newmag[newindex];
324 samples[whichbin]++;
325
326 //newindex = i*ylat + j;
327 //printf("%lf\t", newmag[newindex]/(double)nframes);
328 }
329 //printf("\n");
330 }
331
332
333
334 for (i = 0; i < nbins; i++) {
335
336 if (samples[i] > 0) {
337 printf("%lf\t%lf\n", i*dfreq, bin[i]/(double)samples[i]);
338 }
339 }
340
341
342 free(samples);
343 free(bin);
344 free(x);
345 free(y);
346 free(z);
347 free(mag);
348 free(newmag);
349 free(present_in_old);
350 fftwnd_destroy_plan(p);
351 fftw_free(in);
352 fftw_free(out);
353 return(0);
354 }
355
356 /* } */
357 /* for(i=0;i<120;i++) printf("%f\t%f\n", c_re(out[i]), c_im(out[i])); */
358 /* fftw_destroy_plan(p); */
359 /* fftw_free(in); */
360 /* fftw_free(out); */
361 /* averZ = sumZ / (double)nloops; */
362 /* averUx = sumUx / (double)nloops; */
363 /* averUy = sumUy / (double)nloops; */
364 /* averUz = sumUz / (double)nloops; */
365 /* averP = 1.5*sumP / (double)nloops-0.5; */
366 /* averTheta = acos(averUz); */
367 /* printf("nloops=%d\n",nloops); */
368 /* printf("sumZ=%f\n",sumZ); */
369 /* printf("average height is : %f\n",averZ); */
370 /* printf("average ux is : %f\n",averUx); */
371 /* printf("average uy is : %f\n",averUy); */
372 /* printf("average uz is : %f\n",averUz); */
373 /* printf("average angle is : %f\n",averTheta); */
374 /* printf("average p is : %f\n",averP); */
375
376 /* fclose(inFile); */
377 /* return 0; */
378 /* } */