mdrun iinit. untested + not working by now!
[physik/posic.git] / mdrun.c
1 /*
2  * mdrun.c - main code to run a md simulation
3  *
4  * author: Frank Zirkelbach <frank.zirkelbach@physik.uni-augsburg.de>
5  *
6  */
7
8 #include "mdrun.h"
9
10 /* potential */
11 #include "potentials/harmonic_oscillator.h"
12 #include "potentials/lennard_jones.h"
13 #include "potentials/albe.h"
14 #ifdef TERSOFF_ORIG
15 #include "potentials/tersoff_orig.h"
16 #else
17 #include "potentials/tersoff.h"
18 #endif
19
20 #define ME      "[mdrun]"
21
22 /*
23  * parse function
24  */
25
26 int mdrun_usage(void) {
27
28         printf("%s usage:\n",ME);
29
30         return 0;
31 }
32
33 int mdrun_parse_argv(t_mdrun *mdrun,int argc,char **argv) {
34
35         int i;
36
37         for(i=1;i<argc;i++) {
38
39                 if(argv[i][0]!='-') {
40                         printf("%s unknown switch: %s\n",ME,argv[i]);
41                         return -1;
42                 }
43
44                 switch(argv[i][1]) {
45                         case 'c':
46                                 strncpy(mdrun->cfile,argv[++i],128);
47                                 break;
48                         case 's':
49                                 strncpy(mdrun->sdir,argv[++i],128);
50                                 break;
51                         case 'h':
52                                 mdrun_usage();
53                                 break;
54                         default:
55                                 printf("%s unknown option: %s\n",ME,argv[i]);
56                                 mdrun_usage();
57                                 return -1;
58                 }
59
60         }
61
62         return 0;
63 }
64
65 int mdrun_parse_config(t_mdrun *mdrun) {
66
67         int fd,ret;
68         char error[128];
69         char line[128];
70         char *wptr;
71         char word[16][32];
72         int wcnt;
73
74         /* open config file */
75         fd=open(mdrun->cfile,O_RDONLY);
76         if(fd<0) {
77                 snprintf(error,128,"%s open cfile %s",ME,mdrun->cfile);
78                 perror(error);
79                 return fd;
80         }
81
82         /* read, parse, set */
83         ret=1;
84         while(ret>0) {
85
86                 /* read */
87                 ret=get_line(fd,line,128);
88
89                 /* parse */
90
91                 // ignore # lines and \n
92                 if((line[0]=='#')|(ret==1))
93                         continue;
94
95                 // get command + args
96                 wcnt=0;
97                 while(1) {
98                         if(wcnt)
99                                 wptr=strtok(NULL," \t");
100                         else
101                                 wptr=strtok(line," \t");
102                         if(wptr==NULL)
103                                 break;
104                         strncpy(word[wcnt],wptr,32);
105                         wcnt+=1;
106                 }
107
108                 if(!strncmp(word[0],"potential",9)) {
109                         if(!strncmp(word[1],"albe",4))
110                                 mdrun->potential=MOLDYN_POTENTIAL_AM;
111                         if(!strncmp(word[1],"tersoff",7))
112                                 mdrun->potential=MOLDYN_POTENTIAL_TM;
113                         if(!strncmp(word[1],"ho",2))
114                                 mdrun->potential=MOLDYN_POTENTIAL_HO;
115                         if(!strncmp(word[1],"lj",2))
116                                 mdrun->potential=MOLDYN_POTENTIAL_LJ;
117                 }
118                 else if(!strncmp(word[0],"cutoff",6))
119                         mdrun->cutoff=atof(word[1]);
120                 else if(!strncmp(word[0],"intalgo",7)) {
121                         if(!strncmp(word[1],"verlet",5))
122                                 mdrun->intalgo=MOLDYN_INTEGRATE_VERLET;
123                 }
124                 else if(!strncmp(word[0],"timestep",8))
125                         mdrun->timestep=atof(word[1]);
126                 else if(!strncmp(word[0],"volume",6)) {
127                         mdrun->dim.x=atof(word[1]);
128                         mdrun->dim.y=atof(word[2]);
129                         mdrun->dim.z=atof(word[3]);
130                         if(strncmp(word[4],"0",1))
131                                 mdrun->vis=TRUE;
132                 }
133                 else if(!strncmp(word[0],"pbc",3)) {
134                         if(strncmp(word[1],"0",1))
135                                 mdrun->pbcx=TRUE;
136                         else
137                                 mdrun->pbcx=FALSE;
138                         if(strncmp(word[2],"0",1))
139                                 mdrun->pbcy=TRUE;
140                         else
141                                 mdrun->pbcy=FALSE;
142                         if(strncmp(word[3],"0",1))
143                                 mdrun->pbcz=TRUE;
144                         else
145                                 mdrun->pbcz=FALSE;
146                 }
147                 else if(!strncmp(word[0],"temperature",11))
148                         mdrun->temperature=atof(word[1]);
149                 else if(!strncmp(word[0],"pressure",8))
150                         mdrun->pressure=atof(word[1]);
151                 else if(!strncmp(word[0],"lattice",7)) {
152                         if(!strncmp(word[1],"zincblende",10))
153                                 mdrun->lattice=ZINCBLENDE;
154                         if(!strncmp(word[1],"fcc",3))
155                                 mdrun->lattice=FCC;
156                         if(!strncmp(word[1],"diamond",7))
157                                 mdrun->lattice=DIAMOND;
158                 }
159                 else if(!strncmp(word[0],"element1",8)) {
160                         mdrun->element1=atoi(word[1]);
161                         switch(mdrun->element1) {
162                                 case SI:
163                                         mdrun->m1=M_SI;
164                                         break;
165                                 case C:
166                                         mdrun->m1=M_C;
167                                         break;
168                                 default:
169                                         printf("%s unknown element1: %s|%d\n",
170                                                ME,word[1],mdrun->element1);
171                                         return -1;
172                         }
173                 }
174                 else if(!strncmp(word[0],"element2",8)) {
175                         mdrun->element2=atoi(word[1]);
176                         switch(mdrun->element2) {
177                                 case SI:
178                                         mdrun->m2=M_SI;
179                                         break;
180                                 case C:
181                                         mdrun->m2=M_C;
182                                         break;
183                                 default:
184                                         printf("%s unknown element2: %s|%d\n",
185                                                ME,word[1],mdrun->element2);
186                                         return -1;
187                         }
188                 }
189                 else if(!strncmp(word[0],"filllc",6)) {
190                         mdrun->lx=atoi(word[1]);
191                         mdrun->ly=atoi(word[2]);
192                         mdrun->lz=atoi(word[3]);
193                 }
194                 else if(!strncmp(word[0],"aattrib",7)) {
195                         // for aatrib line we need a special stage
196                         // containing one schedule of 0 loops ...
197                         printf("%s aattrib: %s\n",ME,word[1]);
198                 }
199                 else if(!strncmp(word[0],"eattrib",7)) {
200                         mdrun->p_tau=atof(word[1]);
201                         mdrun->t_tau=atof(word[2]);
202                 }
203                 else if(!strncmp(word[0],"prerun",6))
204                         mdrun->prerun=atoi(word[1]);
205                 else if(!strncmp(word[0],"avgskip",7))
206                         mdrun->avgskip=atoi(word[1]);
207                 else if(!strncmp(word[0],"elog",4))
208                         mdrun->elog=atoi(word[1]);
209                 else if(!strncmp(word[0],"tlog",4))
210                         mdrun->tlog=atoi(word[1]);
211                 else if(!strncmp(word[0],"plog",4))
212                         mdrun->plog=atoi(word[1]);
213                 else if(!strncmp(word[0],"vlog",4))
214                         mdrun->vlog=atoi(word[1]);
215                 else if(!strncmp(word[0],"save",4))
216                         mdrun->save=atoi(word[1]);
217                 else if(!strncmp(word[0],"visualize",9))
218                         mdrun->visualize=atoi(word[1]);
219                 else if(!strncmp(word[0],"stage",5)) {
220                         // for every stage line, add a stage
221                         printf("%s stage: %s\n",ME,word[1]);
222                 }
223                 else {
224                         printf("%s unknown command %s, skipped!\n",ME,wptr);
225                         continue;
226                 }
227         }
228
229         return 0;
230 }
231
232 int main(int argc,char **argv) {
233
234         t_mdrun mdrun;
235         t_moldyn moldyn;
236         t_3dvec o;
237
238         /* clear mdrun struct */
239         memset(&mdrun,0,sizeof(t_mdrun));
240
241         /* parse arguments */
242         if(mdrun_parse_argv(&mdrun,argc,argv)<0)
243                 return -1;
244
245         /* parse config file */
246         mdrun_parse_config(&mdrun);
247
248         /* sanity check! */
249
250         /* prepare simulation */
251         moldyn_init(&moldyn,argc,argv);
252         if(set_int_alg(&moldyn,mdrun.intalgo)<0)
253                 return -1;
254         set_cutoff(&moldyn,mdrun.cutoff);
255         if(set_potential(&moldyn,mdrun.potential)<0)
256                 return -1;
257         switch(mdrun.potential) {
258                 case MOLDYN_POTENTIAL_AM:
259                         albe_mult_set_params(&moldyn,
260                                              mdrun.element1,
261                                              mdrun.element2);
262                         break;
263                 case MOLDYN_POTENTIAL_TM:
264                         tersoff_mult_set_params(&moldyn,
265                                                 mdrun.element1,
266                                                 mdrun.element2);
267                         break;
268                 case MOLDYN_POTENTIAL_HO:
269                         harmonic_oscillator_set_params(&moldyn,mdrun.element1);
270                         break;
271                 case MOLDYN_POTENTIAL_LJ:
272                         lennard_jones_set_params(&moldyn,mdrun.element1);
273                         break;
274                 default:
275                         printf("%s unknown potential: %02x\n",
276                                ME,mdrun.potential);
277                         return -1;
278         }
279         set_dim(&moldyn,mdrun.dim.x,mdrun.dim.y,mdrun.dim.z,mdrun.vis);
280         set_pbc(&moldyn,mdrun.pbcx,mdrun.pbcy,mdrun.pbcz);
281         switch(mdrun.lattice) {
282                 case FCC:
283                         create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element1,
284                                        mdrun.m1,0,0,mdrun.lx,
285                                        mdrun.ly,mdrun.lz,NULL);
286                         break;
287                 case DIAMOND:
288                         create_lattice(&moldyn,DIAMOND,mdrun.lc,mdrun.element1,
289                                        mdrun.m1,0,0,mdrun.lx,
290                                        mdrun.ly,mdrun.lz,NULL);
291                         break;
292                 case ZINCBLENDE:
293                         o.x=0.5*0.25*mdrun.lc; o.y=o.x; o.z=o.x;
294                         create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element1,
295                                        mdrun.m1,0,0,mdrun.lx,
296                                        mdrun.ly,mdrun.lz,&o);
297                         o.x+=0.25*mdrun.lc; o.y=o.x; o.z=o.x;
298                         create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element2,
299                                        mdrun.m2,0,0,mdrun.lx,
300                                        mdrun.ly,mdrun.lz,&o);
301                         break;
302                 default:
303                         printf("%s unknown lattice type: %02x\n",
304                                ME,mdrun.lattice);
305                         return -1;
306         }
307         moldyn_bc_check(&moldyn);
308         set_temperature(&moldyn,mdrun.temperature);
309         set_pressure(&moldyn,mdrun.pressure);
310         thermal_init(&moldyn,TRUE);
311         moldyn_add_schedule(&moldyn,mdrun.prerun,mdrun.timestep);
312         moldyn_set_log_dir(&moldyn,mdrun.sdir);
313         moldyn_set_report(&moldyn,"CHANGE ME","CHANGE ME TOO");
314         if(mdrun.elog)
315                 moldyn_set_log(&moldyn,LOG_TOTAL_ENERGY,mdrun.elog);
316         if(mdrun.tlog)
317                 moldyn_set_log(&moldyn,LOG_TEMPERATURE,mdrun.tlog);
318         if(mdrun.plog)
319                 moldyn_set_log(&moldyn,LOG_PRESSURE,mdrun.plog);
320         if(mdrun.vlog)
321                 moldyn_set_log(&moldyn,LOG_VOLUME,mdrun.vlog);
322         if(mdrun.visualize)
323                 moldyn_set_log(&moldyn,VISUAL_STEP,mdrun.visualize);
324         if(mdrun.save)
325                 moldyn_set_log(&moldyn,SAVE_STEP,mdrun.save);
326         moldyn_set_log(&moldyn,CREATE_REPORT,0);
327         set_avg_skip(&moldyn,mdrun.avgskip);
328
329         /* prepare the hook function */
330
331         /* run the simulation */
332         moldyn_integrate(&moldyn);
333
334         /* shutdown */
335         moldyn_shutdown(&moldyn);
336
337         return 0;
338 }