ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/ripple/readh.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: 9909 byte(s)
Log Message:
this is the ripple codes

File Contents

# Content
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #include<math.h>
5
6 // Structures to store our data:
7
8 // coords holds the data for a single tethered dipole:
9 struct coords{
10 double pos[3]; // cartesian coords
11 double theta; // orientational angle relative to z axis
12 double phi; // orientational angle in x-y plane
13 double mu; // dipole strength
14 char name[30]; // an identifier for the type of atom
15 };
16
17 // state holds the current "configuration" of the entire system
18 struct system {
19 int nAtoms; // Number of Atoms in this configuration
20 struct coords *r; // The set of coordinates for all atoms
21 double beta; // beta = 1 /(kb*T)
22 double strength; // strength of the dipoles (Debye)
23 double z0; // default z axis position
24 double theta0; // default theta angle
25 double kz; // force constant for z displacement
26 double ktheta; // force constant for theta displacement
27 int nCycles; // How many cycles to do in total
28 int iCycle; // How many cycles have we done?
29 int nMoves; // How many MC moves in each cycle
30 int nSample; // How many cycles between samples
31 double Hmat[2][2]; // The information about the size of the per. box
32 double HmatI[2][2]; // The inverse box
33 double energy; // The current Energy
34 double dtheta; // maximum size of a theta move
35 double deltaz; // maximum size of a z move
36 double deltaphi; // maximum size of a phi move
37 int nAttempts; // number of MC moves that have been attempted
38 int nAccepts; // number of MC moves that have been accepted
39 int nx; // number of unit cells in x direction
40 int ny; // number of unit cells in y direction
41 struct system *next; // Next frame in the linked list
42 };
43
44 char *program_name; /* the name of the program */
45
46 // Function prototypes:
47
48 int main(argc, argv)
49 int argc;
50 char *argv[];
51 {
52 FILE *in_file;
53 char in_name[500];
54 char *eof_test, *foo;
55 char read_buffer[1000];
56 int lineCount = 0;
57 double uxi, uyi, uzi, p1;
58 double aLat, bLat;
59 int cells;
60 int i, j, nloops;
61 int newx, newy, newindex, index;
62 int new_i, new_j, new_index;
63 int N, nframes;
64 double freq_x, freq_y, zero_freq_x, zero_freq_y, freq;
65 double maxfreqx, maxfreqy, maxfreq, dfreq;
66 double dx, dy, dx1, dy1, xTemp, yTemp, pt1x, pt1y, pt2x, pt2y;
67 int whichbinx, whichbiny, minwhichbinx, minwhichbiny, maxwhichbinx, maxwhichbiny, n;
68 double hist[500][500], averdh2[500][500];
69 int nbins, nx, ny;
70 int *samples;
71 double *bin;
72 double dh2;
73
74 int done;
75 char current_flag;
76
77 program_name = argv[0];
78 if (argc >= 2)
79 strcpy(in_name, argv[1]);
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 in_file = fopen(in_name, "r");
103 if(in_file == NULL){
104 printf("Cannot open file \"%s\" for reading.\n", in_name);
105 exit(8);
106 }
107
108 nframes = 0;
109 n = 0;
110
111 // start reading the first frame
112
113 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
114 lineCount++;
115
116 state = (struct system *) malloc(sizeof(struct system));
117 state->next = NULL;
118 state->strength = 10.0;
119
120 dh2 = 0.0;
121 for(i = 0; i < 500; i++){
122 for(j = 0; j < 500; j++){
123 averdh2[i][j] = 0.0;
124 }
125 }
126
127 while(eof_test != NULL){
128
129 nframes++;
130 (void)sscanf(read_buffer, "%d", &state->nAtoms);
131 N = 2 * state->nAtoms;
132
133 state->r = (struct coords *)calloc(N, sizeof(struct coords));
134
135 // read and the comment line and grab the time and box dimensions
136
137 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
138 lineCount++;
139 if(eof_test == NULL){
140 printf("error in reading file at line: %d\n", lineCount);
141 exit(8);
142 }
143
144 foo = strtok( read_buffer, " ,;\t\n" );
145 (void)sscanf( read_buffer, "%d", &state->iCycle );
146
147 foo = strtok(NULL, " ,;\t\0");
148 if(foo == NULL){
149 printf("error in reading file at line: %d\n", lineCount);
150 exit(8);
151 }
152 (void)sscanf(foo, "%d", &state->nx);
153
154 nx = state->nx;
155
156 foo = strtok(NULL, " ,;\t\0");
157 if(foo == NULL){
158 printf("error in reading file at line: %d\n", lineCount);
159 exit(8);
160 }
161 (void)sscanf(foo, "%d", &state->ny);
162
163 ny = state->ny;
164
165 foo = strtok(NULL, " ,;\t\0");
166 if(foo == NULL){
167 printf("error in reading file at line: %d\n", lineCount);
168 exit(8);
169 }
170 (void)sscanf(foo, "%lf",&state->Hmat[0][0]);
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[1][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[0][1]);
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[1][1]);
192
193
194 // Length of the two box vectors:
195
196 dx = sqrt(pow(state->Hmat[0][0], 2) + pow(state->Hmat[1][0], 2));
197 dy = sqrt(pow(state->Hmat[0][1], 2) + pow(state->Hmat[1][1], 2));
198
199 aLat = dx / (double)(state->nx);
200 bLat = dy / (double)(state->ny);
201
202
203 // FFT stuff depends on nx and ny, so delay allocation until we have
204 // that information
205
206 for (i=0;i<state->nAtoms;i++){
207
208 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
209 lineCount++;
210 if(eof_test == NULL){
211 printf("error in reading file at line: %d\n", lineCount);
212 exit(8);
213 }
214
215 foo = strtok(read_buffer, " ,;\t\0");
216 (void)strcpy(state->r[i].name, foo); //copy the atom name
217
218 // next we grab the positions
219
220 foo = strtok(NULL, " ,;\t\0");
221 if(foo == NULL){
222 printf("error in reading postition x from %s\n"
223 "natoms = %d, line = %d\n",
224 in_name, state->nAtoms, lineCount );
225 exit(8);
226 }
227 (void)sscanf( foo, "%lf", &state->r[i].pos[0] );
228
229 foo = strtok(NULL, " ,;\t\0");
230 if(foo == NULL){
231 printf("error in reading postition y from %s\n"
232 "natoms = %d, line = %d\n",
233 in_name, state->nAtoms, lineCount );
234 exit(8);
235 }
236 (void)sscanf( foo, "%lf", &state->r[i].pos[1] );
237
238 foo = strtok(NULL, " ,;\t\0");
239 if(foo == NULL){
240 printf("error in reading postition z from %s\n"
241 "natoms = %d, line = %d\n",
242 in_name, state->nAtoms, lineCount );
243 exit(8);
244 }
245 (void)sscanf( foo, "%lf", &state->r[i].pos[2] );
246
247 foo = strtok(NULL, " ,;\t\0");
248 if(foo == NULL){
249 printf("error in reading angle phi from %s\n"
250 "natoms = %d, line = %d\n",
251 in_name, state->nAtoms, lineCount );
252 exit(8);
253 }
254 (void)sscanf( foo, "%lf", &state->r[i].phi );
255
256 foo = strtok(NULL, " ,;\t\0");
257 if(foo == NULL){
258 printf("error in reading unit vector x from %s\n"
259 "natoms = %d, line = %d\n",
260 in_name, state->nAtoms, lineCount );
261 exit(8);
262 }
263 (void)sscanf( foo, "%lf", &uxi );
264
265 foo = strtok(NULL, " ,;\t\0");
266 if(foo == NULL){
267 printf("error in reading unit vector y from %s\n"
268 "natoms = %d, line = %d\n",
269 in_name, state->nAtoms, lineCount );
270 exit(8);
271 }
272 (void)sscanf( foo, "%lf", &uyi );
273
274 foo = strtok(NULL, " ,;\t\0");
275 if(foo == NULL){
276 printf("error in reading unit vector z from %s\n"
277 "natoms = %d, line = %d\n",
278 in_name, state->nAtoms, lineCount );
279 exit(8);
280 }
281 (void)sscanf( foo, "%lf", &uzi );
282
283 state->r[i].theta = acos(uzi);
284
285 // The one parameter not stored in the dump file is the dipole strength
286 state->r[i].mu = state->strength;
287 }
288
289 minwhichbinx = 0;
290 minwhichbiny = 0;
291 maxwhichbinx = 0;
292 maxwhichbiny = 0;
293
294 for(i = 0; i< (state->nAtoms - 1); i++){
295 for(j = i + 1; j < state->nAtoms; j++){
296
297 dx = state->r[j].pos[0] - state->r[i].pos[0];
298 dy = state->r[j].pos[1] - state->r[i].pos[1];
299
300 whichbinx = (int) (dx * 2 / aLat) + 2 * state->nx;
301 whichbiny = (int) (dy * 2 / bLat) + 2 * state->ny;
302
303 maxwhichbinx = ((maxwhichbinx > whichbinx) ? maxwhichbinx : whichbinx);
304 maxwhichbiny = ((maxwhichbiny > whichbiny) ? maxwhichbiny : whichbiny);
305
306 minwhichbinx = ((minwhichbinx < whichbinx) ? minwhichbinx : whichbinx);
307 minwhichbiny = ((minwhichbiny < whichbiny) ? minwhichbiny : whichbiny);
308
309 dh2 = pow((state->r[j].pos[2] - state->r[i].pos[2]), 2);
310
311 hist[whichbinx][whichbiny] += dh2;
312 }
313 n++;
314 }
315
316
317 temp_state = state->next;
318 state->next = NULL;
319
320 if (temp_state != NULL) {
321 free(temp_state->r);
322 free(temp_state);
323 }
324
325 // Make a new frame
326
327 temp_state = (struct system *) malloc(sizeof(struct system));
328 temp_state->next = state;
329 state = temp_state;
330 eof_test = fgets(read_buffer, sizeof(read_buffer), in_file);
331 lineCount++;
332 }
333
334 for(whichbinx = minwhichbinx; whichbinx < (maxwhichbinx + 1); whichbinx++){
335 for(whichbiny = minwhichbiny; whichbiny < (maxwhichbiny + 1); whichbiny++){
336 averdh2[whichbinx][whichbiny] = hist[whichbinx][whichbiny] / (double)n;
337 }
338 }
339
340 for(whichbinx = minwhichbinx; whichbinx < (maxwhichbinx + 1); whichbinx++){
341 for(whichbiny = minwhichbiny; whichbiny < (maxwhichbiny + 1); whichbiny++){
342 printf("%lf\t", averdh2[whichbinx][whichbiny]);
343 }
344 printf("\n");
345 }
346
347 return 1;
348
349 }