fixed compiler warnings
[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 del_stages(t_mdrun *mdrun) {
66
67         t_list *sl;
68         t_stage *stage;
69
70         sl=&(mdrun->stage);
71
72         list_reset_f(sl);
73
74         if(sl->start==NULL)
75                 return 0;
76
77         do {
78                 stage=sl->current->data;
79                 free(stage->params);
80                 free(stage);
81         } while(list_next_f(sl)!=L_NO_NEXT_ELEMENT);
82
83         return 0;
84 }
85
86 int add_stage(t_mdrun *mdrun,u8 type,void *params) {
87
88         int psize;
89
90         t_stage *stage;
91
92         switch(type) {
93                 case STAGE_DISPLACE_ATOM:
94                         psize=sizeof(t_displace_atom_params);
95                         break;
96                 case STAGE_DEL_ATOMS:
97                         psize=sizeof(t_del_atoms_params);
98                         break;
99                 case STAGE_INSERT_ATOMS:
100                         psize=sizeof(t_insert_atoms_params);
101                         break;
102                 case STAGE_INSERT_MIXED_ATOMS:
103                         psize=sizeof(t_insert_mixed_atoms_params);
104                         break;
105                 case STAGE_CONTINUE:
106                         psize=sizeof(t_continue_params);
107                         break;
108                 case STAGE_ANNEAL:
109                         psize=sizeof(t_anneal_params);
110                         break;
111                 case STAGE_CHAATTR:
112                         psize=sizeof(t_chaattr_params);
113                         break;
114                 case STAGE_CHSATTR:
115                         psize=sizeof(t_chsattr_params);
116                         break;
117                 case STAGE_SET_TEMP:
118                         psize=sizeof(t_set_temp_params);
119                         break;
120                 case STAGE_SET_TIMESTEP:
121                         psize=sizeof(t_set_timestep_params);
122                         break;
123                 case STAGE_FILL:
124                         psize=sizeof(t_fill_params);
125                         break;
126                 case STAGE_THERMAL_INIT:
127                         psize=0;
128                         break;
129                 default:
130                         printf("%s unknown stage type: %02x\n",ME,type);
131                         return -1;
132         }
133
134         stage=malloc(sizeof(t_stage));
135         if(stage==NULL) {
136                 perror("[mdrun] malloc (add stage)");
137                 return -1;
138         }
139
140         stage->type=type;
141         stage->executed=FALSE;
142
143         stage->params=malloc(psize);
144         if(stage->params==NULL) {
145                 perror("[mdrun] malloc (stage params)");
146                 return -1;
147         }
148
149         memcpy(stage->params,params,psize);
150
151         list_add_immediate_f(&(mdrun->stage),stage);
152
153         return 0;
154 }
155
156 int mdrun_parse_config(t_mdrun *mdrun) {
157
158         int fd,ret;
159         char error[128];
160         char line[128];
161         char *wptr;
162         char word[32][64];
163         int wcnt;
164         int i,o;
165
166         t_displace_atom_params dap;
167         t_insert_atoms_params iap;
168         t_insert_mixed_atoms_params imp;
169         t_continue_params cp;
170         t_anneal_params ap;
171         t_chaattr_params cap;
172         t_chsattr_params csp;
173         t_set_temp_params stp;
174         t_set_timestep_params stsp;
175         t_fill_params fp;
176         t_del_atoms_params delp;
177
178         /* open config file */
179         fd=open(mdrun->cfile,O_RDONLY);
180         if(fd<0) {
181                 snprintf(error,128,"%s open cfile %s",ME,mdrun->cfile);
182                 perror(error);
183                 return fd;
184         }
185
186         /* read, parse, set */
187         ret=1;
188         while(ret>0) {
189
190                 /* read */
191                 ret=get_line(fd,line,128);
192
193                 /* parse */
194
195                 // ignore # lines and \n
196                 if((line[0]=='#')|(ret==1))
197                         continue;
198
199                 // reset
200                 memset(&iap,0,sizeof(t_insert_atoms_params));
201                 memset(&imp,0,sizeof(t_insert_mixed_atoms_params));
202                 memset(&cp,0,sizeof(t_continue_params));
203                 memset(&ap,0,sizeof(t_anneal_params));
204                 memset(&cap,0,sizeof(t_chaattr_params));
205                 memset(&csp,0,sizeof(t_chsattr_params));
206                 memset(&stp,0,sizeof(t_set_temp_params));
207                 memset(&stsp,0,sizeof(t_set_timestep_params));
208                 memset(&fp,0,sizeof(t_fill_params));
209                 memset(&delp,0,sizeof(t_del_atoms_params));
210
211                 // get command + args
212                 wcnt=0;
213                 while(1) {
214                         if(wcnt)
215                                 wptr=strtok(NULL," \t");
216                         else
217                                 wptr=strtok(line," \t");
218                         if(wptr==NULL)
219                                 break;
220                         strncpy(word[wcnt],wptr,64);
221                         wcnt+=1;
222                 }
223
224                 if(!strncmp(word[0],"potential",9)) {
225                         if(!strncmp(word[1],"albe",4))
226                                 mdrun->potential=MOLDYN_POTENTIAL_AM;
227                         if(!strncmp(word[1],"tersoff",7))
228                                 mdrun->potential=MOLDYN_POTENTIAL_TM;
229                         if(!strncmp(word[1],"ho",2))
230                                 mdrun->potential=MOLDYN_POTENTIAL_HO;
231                         if(!strncmp(word[1],"lj",2))
232                                 mdrun->potential=MOLDYN_POTENTIAL_LJ;
233                 }
234                 else if(!strncmp(word[0],"continue",8))
235                         strncpy(mdrun->continue_file,word[1],128);
236                 else if(!strncmp(word[0],"cutoff",6))
237                         mdrun->cutoff=atof(word[1]);
238                 else if(!strncmp(word[0],"nnd",3))
239                         mdrun->nnd=atof(word[1]);
240                 else if(!strncmp(word[0],"intalgo",7)) {
241                         if(!strncmp(word[1],"verlet",5))
242                                 mdrun->intalgo=MOLDYN_INTEGRATE_VERLET;
243                 }
244                 else if(!strncmp(word[0],"timestep",8))
245                         mdrun->timestep=atof(word[1]);
246                 else if(!strncmp(word[0],"volume",6)) {
247                         mdrun->dim.x=atof(word[1]);
248                         mdrun->dim.y=atof(word[2]);
249                         mdrun->dim.z=atof(word[3]);
250                         if(strncmp(word[4],"0",1))
251                                 mdrun->vis=TRUE;
252                 }
253                 else if(!strncmp(word[0],"pbc",3)) {
254                         if(strncmp(word[1],"0",1))
255                                 mdrun->pbcx=TRUE;
256                         else
257                                 mdrun->pbcx=FALSE;
258                         if(strncmp(word[2],"0",1))
259                                 mdrun->pbcy=TRUE;
260                         else
261                                 mdrun->pbcy=FALSE;
262                         if(strncmp(word[3],"0",1))
263                                 mdrun->pbcz=TRUE;
264                         else
265                                 mdrun->pbcz=FALSE;
266                 }
267                 else if(!strncmp(word[0],"temperature",11))
268                         mdrun->temperature=atof(word[1]);
269                 else if(!strncmp(word[0],"pressure",8))
270                         mdrun->pressure=atof(word[1]);
271                 else if(!strncmp(word[0],"lattice",7)) {
272                         if(!strncmp(word[1],"zincblende",10))
273                                 mdrun->lattice=ZINCBLENDE;
274                         if(!strncmp(word[1],"fcc",3))
275                                 mdrun->lattice=FCC;
276                         if(!strncmp(word[1],"diamond",7))
277                                 mdrun->lattice=DIAMOND;
278                         if(!strncmp(word[1],"none",4))
279                                 mdrun->lattice=NONE;
280                         if(wcnt==3)
281                                 mdrun->lc=atof(word[2]);
282                 }
283                 else if(!strncmp(word[0],"element1",8)) {
284                         mdrun->element1=atoi(word[1]);
285                 }
286                 else if(!strncmp(word[0],"element2",8)) {
287                         mdrun->element2=atoi(word[1]);
288                 }
289                 else if(!strncmp(word[0],"fill",6)) {
290                         // default values
291                         fp.fill_element=mdrun->element1;
292                         fp.fill_brand=0;
293                         fp.lattice=mdrun->lattice;
294                         fp.p_params.type=0;
295                         fp.d_params.type=0;
296                         fp.d_params.stype=0;
297                         // parse fill command
298                         i=1;
299                         while(i<wcnt) {
300                                 if(!strncmp(word[i],"lc",2)) {
301                                         fp.lx=atoi(word[++i]);
302                                         fp.ly=atoi(word[++i]);
303                                         fp.lz=atoi(word[++i]);
304                                         fp.lc=atof(word[++i]);
305                                         mdrun->lc=fp.lc;
306                                         continue;
307                                 }
308                                 if(!strncmp(word[i],"eb",2)) {
309                                         fp.fill_element=atoi(word[++i]);
310                                         fp.fill_brand=atoi(word[++i]);
311                                         continue;
312                                 }
313                                 if(word[i][0]=='p') {
314                                         i+=1;
315                                         switch(word[i][0]) {
316                                         case 'i':
317                                                 if(word[i][1]=='r')
318                                                 fp.p_params.type=PART_INSIDE_R;
319                                                 else
320                                                 fp.p_params.type=PART_INSIDE_D;
321                                                 break;
322                                         case 'o':
323                                                 if(word[i][1]=='r')
324                                                 fp.p_params.type=PART_OUTSIDE_R;
325                                                 else
326                                                 fp.p_params.type=PART_OUTSIDE_D;
327                                                 break;
328                                         default:
329                                                 break;
330                                         }
331                                         if((fp.p_params.type==PART_INSIDE_R)||
332                                           (fp.p_params.type==PART_OUTSIDE_R)) {
333                                                 fp.p_params.r=atof(word[++i]);  
334                                                 fp.p_params.p.x=atof(word[++i]);
335                                                 fp.p_params.p.y=atof(word[++i]);
336                                                 fp.p_params.p.z=atof(word[++i]);
337                                         }
338                                         if((fp.p_params.type==PART_INSIDE_D)||
339                                            (fp.p_params.type==PART_OUTSIDE_D)) {
340                                                 fp.p_params.p.x=atof(word[++i]);
341                                                 fp.p_params.p.y=atof(word[++i]);
342                                                 fp.p_params.p.z=atof(word[++i]);
343                                                 fp.p_params.d.x=atof(word[++i]);
344                                                 fp.p_params.d.y=atof(word[++i]);
345                                                 fp.p_params.d.z=atof(word[++i]);
346                                         }
347                                         continue;
348                                 }
349                                 if(word[i][0]=='d') {
350                                         switch(word[++i][0]) {
351                                                 case '0':
352
353                                 fp.d_params.type=DEFECT_TYPE_0D;
354                                 if(!strncmp(word[i+1],"dbx",3)) {
355                                         fp.d_params.stype=DEFECT_STYPE_DB_X;
356                                 }
357                                 if(!strncmp(word[i+1],"dby",3)) {
358                                         fp.d_params.stype=DEFECT_STYPE_DB_Y;
359                                 }
360                                 if(!strncmp(word[i+1],"dbz",3)) {
361                                         fp.d_params.stype=DEFECT_STYPE_DB_Z;
362                                 }
363                                 if(!strncmp(word[i+1],"dbr",3)) {
364                                         fp.d_params.stype=DEFECT_STYPE_DB_R;
365                                 }
366                                 i+=1;
367                                 fp.d_params.od=atof(word[++i]);
368                                 fp.d_params.dd=atof(word[++i]);
369                                 fp.d_params.element=atoi(word[++i]);
370                                 fp.d_params.brand=atoi(word[++i]);
371                                 // parsed in future
372                 fp.d_params.attr=ATOM_ATTR_HB|ATOM_ATTR_VA;
373                 fp.d_params.attr|=ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP;
374                                 break;
375
376                                                 case '1':
377                                 fp.d_params.type=DEFECT_TYPE_1D;
378                                 break;
379                                                 case '2':
380                                 fp.d_params.type=DEFECT_TYPE_2D;
381                                 break;
382                                                 case '3':
383                                 fp.d_params.type=DEFECT_TYPE_3D;
384                                 break;
385                                                 default:
386                                                         break;
387                                         }
388                                         continue;
389
390                                 }
391                                 i+=1;
392                         }
393                         add_stage(mdrun,STAGE_FILL,&fp);
394                 }
395                 else if(!strncmp(word[0],"thermal_init",12)) {
396                         add_stage(mdrun,STAGE_THERMAL_INIT,NULL);
397                 }
398                 else if(!strncmp(word[0],"aattr",5)) {
399                         // for aatrib line we need a special stage
400                         // containing one schedule of 0 loops ...
401                         for(i=0;i<strlen(word[1]);i++) {
402                                 switch(word[1][i]) {
403                                         case 't':
404                                                 cap.type|=CHAATTR_TOTALV;
405                                                 break;
406                                         case 'r':
407                                                 cap.type|=CHAATTR_REGION;
408                                                 break;
409                                         case 'e':
410                                                 cap.type|=CHAATTR_ELEMENT;
411                                                 break;
412                                         default:
413                                                 break;
414                                 }
415                         }
416                         i=2;
417                         if(cap.type&CHAATTR_REGION) {
418                                 cap.x0=atof(word[1]);   
419                                 cap.y0=atof(word[2]);   
420                                 cap.z0=atof(word[3]);   
421                                 cap.x1=atof(word[4]);   
422                                 cap.y1=atof(word[5]);   
423                                 cap.z1=atof(word[6]);
424                                 i+=6;
425                         }
426                         if(cap.type&CHAATTR_ELEMENT) {
427                                 cap.element=atoi(word[i]);
428                                 i+=1;
429                         }
430                         for(o=0;o<strlen(word[i]);o++) {
431                                 switch(word[i][o]) {
432                                         case 'b':
433                                                 cap.attr|=ATOM_ATTR_VB;
434                                                 break;
435                                         case 'h':
436                                                 cap.attr|=ATOM_ATTR_HB;
437                                                 break;
438                                         case 'v':
439                                                 cap.attr|=ATOM_ATTR_VA;
440                                                 break;
441                                         case 'f':
442                                                 cap.attr|=ATOM_ATTR_FP;
443                                                 break;
444                                         case '1':
445                                                 cap.attr|=ATOM_ATTR_1BP;
446                                                 break;
447                                         case '2':
448                                                 cap.attr|=ATOM_ATTR_2BP;
449                                                 break;
450                                         case '3':
451                                                 cap.attr|=ATOM_ATTR_3BP;
452                                                 break;
453                                         default:
454                                                 break;
455                                 }
456                         }
457                         add_stage(mdrun,STAGE_CHAATTR,&cap);
458                 }
459                 else if(!strncmp(word[0],"sattr",5)) {
460                         // for satrib line we need a special stage
461                         // containing one schedule of 0 loops ...
462                         csp.type=0;
463                         for(i=1;i<wcnt;i++) {
464                                 if(!strncmp(word[i],"pctrl",5)) {
465                                         csp.ptau=atof(word[++i]);
466                                         if(csp.ptau>0)
467                                                 csp.ptau=0.01/(csp.ptau*GPA);
468                                         csp.type|=CHSATTR_PCTRL;
469                                 }
470                                 if(!strncmp(word[i],"tctrl",5)) {
471                                         csp.ttau=atof(word[++i]);
472                                         csp.type|=CHSATTR_TCTRL;
473                                 }
474                                 if(!strncmp(word[i],"prelax",6)) {
475                                         csp.dp=atof(word[++i])*BAR;
476                                         csp.type|=CHSATTR_PRELAX;
477                                 }
478                                 if(!strncmp(word[i],"trelax",6)) {
479                                         csp.dt=atof(word[++i]);
480                                         csp.type|=CHSATTR_TRELAX;
481                                 }
482                                 if(!strncmp(word[i],"rsteps",6)) {
483                                         csp.rsteps=atoi(word[++i]);
484                                         csp.type|=CHSATTR_RSTEPS;
485                                 }
486                                 if(!strncmp(word[i],"avgrst",6)) {
487                                         csp.avgrst=atoi(word[++i]);
488                                         csp.type|=CHSATTR_AVGRST;
489                                 }
490                         }
491                         add_stage(mdrun,STAGE_CHSATTR,&csp);
492                 }
493                 else if(!strncmp(word[0],"prerun",6))
494                         mdrun->prerun=atoi(word[1]);
495                 else if(!strncmp(word[0],"avgskip",7))
496                         mdrun->avgskip=atoi(word[1]);
497                 else if(!strncmp(word[0],"elog",4))
498                         mdrun->elog=atoi(word[1]);
499                 else if(!strncmp(word[0],"tlog",4))
500                         mdrun->tlog=atoi(word[1]);
501                 else if(!strncmp(word[0],"plog",4))
502                         mdrun->plog=atoi(word[1]);
503                 else if(!strncmp(word[0],"vlog",4))
504                         mdrun->vlog=atoi(word[1]);
505                 else if(!strncmp(word[0],"save",4))
506                         mdrun->save=atoi(word[1]);
507                 else if(!strncmp(word[0],"visualize",9))
508                         mdrun->visualize=atoi(word[1]);
509                 else if(!strncmp(word[0],"stage",5)) {
510                         // for every stage line, add a stage
511                         if(!strncmp(word[1],"displace",8)) {
512                                 dap.nr=atoi(word[2]);   
513                                 dap.dx=atof(word[3]);
514                                 dap.dy=atof(word[4]);
515                                 dap.dz=atof(word[5]);
516                                 add_stage(mdrun,STAGE_DISPLACE_ATOM,&dap);
517                         }
518                         else if(!strncmp(word[1],"del_atoms",9)) {
519                                 delp.o.x=atof(word[2]);
520                                 delp.o.y=atof(word[3]);
521                                 delp.o.z=atof(word[4]);
522                                 delp.r=atof(word[5]);
523                                 add_stage(mdrun,STAGE_DEL_ATOMS,&delp);
524                         }
525                         else if(!strncmp(word[1],"ins_atoms",9)) {
526                                 iap.ins_steps=atoi(word[2]);
527                                 iap.ins_atoms=atoi(word[3]);
528                                 iap.element=atoi(word[4]);
529                                 iap.brand=atoi(word[5]);
530                                 for(i=0;i<strlen(word[6]);i++) {
531                                         switch(word[6][i]) {
532                                                 case 'b':
533                                                         iap.attr|=ATOM_ATTR_VB;
534                                                         break;
535                                                 case 'h':
536                                                         iap.attr|=ATOM_ATTR_HB;
537                                                         break;
538                                                 case 'v':
539                                                         iap.attr|=ATOM_ATTR_VA;
540                                                         break;
541                                                 case 'f':
542                                                         iap.attr|=ATOM_ATTR_FP;
543                                                         break;
544                                                 case '1':
545                                                         iap.attr|=ATOM_ATTR_1BP;
546                                                         break;
547                                                 case '2':
548                                                         iap.attr|=ATOM_ATTR_2BP;
549                                                         break;
550                                                 case '3':
551                                                         iap.attr|=ATOM_ATTR_3BP;
552                                                         break;
553                                                 default:
554                                                         break;
555                                         }
556                                 }
557                                 switch(word[7][0]) {
558                                         // insertion types
559                                         case 'p':
560                                                 iap.type=INS_POS;
561                                                 iap.x0=atof(word[8]);
562                                                 iap.y0=atof(word[9]);
563                                                 iap.z0=atof(word[10]);
564                                                 break;
565                                         case 'r':
566                                                 switch(word[8][0]) {
567
568                                                 case 't':
569                                                         iap.type=INS_TOTAL;
570                                                         iap.cr=atof(word[9]);
571                                                         break;
572                                                 case 'r':
573                                                         iap.type=INS_RECT;
574                                                         iap.x0=atof(word[9]);
575                                                         iap.y0=atof(word[10]);
576                                                         iap.z0=atof(word[11]);
577                                                         iap.x1=atof(word[12]);
578                                                         iap.y1=atof(word[13]);
579                                                         iap.z1=atof(word[14]);
580                                                         iap.cr=atof(word[15]);
581                                                         break;
582                                                 case 's':
583                                                         iap.type=INS_SPHERE;
584                                                         iap.x0=atof(word[9]);
585                                                         iap.y0=atof(word[10]);
586                                                         iap.z0=atof(word[11]);
587                                                         iap.x1=atof(word[12]);
588                                                         iap.cr=atof(word[13]);
589                                                         break;
590                                                 default:
591                                                         break;
592                                                 }
593                                         default:
594                                                 break;
595                                 }
596                                 add_stage(mdrun,STAGE_INSERT_ATOMS,&iap);
597                         }
598
599
600                         // HERE WE GO ...
601
602                         else if(!strncmp(word[1],"ins_m_atoms",11)) {
603                                 imp.element1=atoi(word[2]);
604                                 imp.element2=atoi(word[3]);
605                                 imp.amount1=atoi(word[4]);
606                                 imp.amount2=atoi(word[5]);
607                                 imp.brand1=atoi(word[6]);
608                                 imp.brand2=atoi(word[7]);
609                                 imp.crmin=atof(word[8]);
610                                 imp.crmax=atof(word[9]);
611                                 /* do this later ...
612                                 for(i=0;i<strlen(word[8]);i++) {
613                                         switch(word[8][i]) {
614                                                 case 'b':
615                                                         imp.attr|=ATOM_ATTR_VB;
616                                                         break;
617                                                 case 'h':
618                                                         imp.attr|=ATOM_ATTR_HB;
619                                                         break;
620                                                 case 'v':
621                                                         imp.attr|=ATOM_ATTR_VA;
622                                                         break;
623                                                 case 'f':
624                                                         imp.attr|=ATOM_ATTR_FP;
625                                                         break;
626                                                 case '1':
627                                                         imp.attr|=ATOM_ATTR_1BP;
628                                                         break;
629                                                 case '2':
630                                                         imp.attr|=ATOM_ATTR_2BP;
631                                                         break;
632                                                 case '3':
633                                                         imp.attr|=ATOM_ATTR_3BP;
634                                                         break;
635                                                 default:
636                                                         break;
637                                         }
638                                 }
639                                 */
640                                 imp.attr1=ATOM_ATTR_HB|ATOM_ATTR_VA|ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_FP;
641                                 imp.attr2=ATOM_ATTR_HB|ATOM_ATTR_VA|ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_FP;
642                                 add_stage(mdrun,STAGE_INSERT_MIXED_ATOMS,&imp);
643                         }
644
645
646
647
648
649                         else if(!strncmp(word[1],"continue",8)) {
650                                 cp.runs=atoi(word[2]);
651                                 add_stage(mdrun,STAGE_CONTINUE,&cp);
652                         }
653                         else if(!strncmp(word[1],"anneal",6)) {
654                                 ap.count=0;
655                                 ap.runs=atoi(word[2]);
656                                 ap.dt=atof(word[3]);
657                                 ap.interval=atoi(word[4]);
658                                 add_stage(mdrun,STAGE_ANNEAL,&ap);
659                         }
660                         else if(!strncmp(word[1],"set_temp",8)) {
661                                 if(word[2][0]=='c') {
662                                         stp.type=SET_TEMP_CURRENT;
663                                         stp.val=0.0;
664                                 }
665                                 else {
666                                         stp.type=SET_TEMP_VALUE;
667                                         stp.val=atof(word[2]);
668                                 }
669                                 add_stage(mdrun,STAGE_SET_TEMP,&stp);
670                         }
671                         else if(!strncmp(word[1],"set_timestep",12)) {
672                                 stsp.tau=atof(word[2]);
673                                 add_stage(mdrun,STAGE_SET_TIMESTEP,&stsp);
674                         }
675                         else {
676                                 printf("%s unknown stage type: %s\n",
677                                        ME,word[1]);
678                                 return -1;
679                         }
680                 }
681                 else {
682                         printf("%s unknown keyword '%s', skipped!\n",
683                                ME,word[0]);
684                         continue;
685                 }
686         }
687
688         /* close file */
689         close(fd);
690
691         return 0;
692 }
693
694 int check_pressure(t_moldyn *moldyn,t_mdrun *mdrun) {
695
696         double delta;
697
698         if(!(mdrun->sattr&SATTR_PRELAX)) {
699                 return TRUE;
700         }
701
702         delta=moldyn->p_avg-moldyn->p_ref;
703
704         if(delta<0)
705                 delta=-delta;
706
707         if(delta>mdrun->dp)
708                 return FALSE;
709
710         return TRUE;
711 }
712
713 int check_temperature(t_moldyn *moldyn,t_mdrun *mdrun) {
714
715         double delta;
716
717         if(!(mdrun->sattr&SATTR_TRELAX))
718                 return TRUE;
719
720         delta=moldyn->t_avg-moldyn->t_ref;
721
722         if(delta<0)
723                 delta=-delta;
724
725         if(delta>mdrun->dt)
726                 return FALSE;
727
728         return TRUE;
729 }
730
731 int displace_atom(t_moldyn *moldyn,t_mdrun *mdrun) {
732
733         t_displace_atom_params *dap;
734         t_stage *stage;
735         t_atom *atom;
736
737         stage=mdrun->stage.current->data;
738         dap=stage->params;
739
740         atom=&(moldyn->atom[dap->nr]);
741         atom->r.x+=dap->dx;
742         atom->r.y+=dap->dy;
743         atom->r.z+=dap->dz;
744
745         return 0;
746 }
747
748 int del_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
749
750         t_stage *stage;
751         t_del_atoms_params *delp;
752         int i;
753         t_3dvec dist;
754         
755         stage=mdrun->stage.current->data;
756         delp=stage->params;
757
758         for(i=0;i<moldyn->count;i++) {
759                 v3_sub(&dist,&(delp->o),&(moldyn->atom[i].r));
760 //printf("%d ----> %f %f %f = %f | %f\n",i,dist.x,dist.y,dist.z,v3_absolute_square(&dist),delp->r*delp->r);
761                 if(v3_absolute_square(&dist)<=(delp->r*delp->r)) {
762                         del_atom(moldyn,moldyn->atom[i].tag);
763                         printf("%s atom deleted: %d %d %d\n",ME,
764                                moldyn->atom[i].tag,moldyn->atom[i].element,
765                                moldyn->atom[i].brand);
766                 }
767         }
768
769         return 0;
770
771 }
772
773 int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
774
775         t_insert_atoms_params *iap;
776         t_stage *stage;
777         t_atom *atom;
778         t_3dvec r,v,dist;
779         double d,dmin,o;
780         int cnt,i;
781         double x,y,z;
782         double x0,y0,z0;
783         u8 cr_check,run;
784         
785         stage=mdrun->stage.current->data;
786         iap=stage->params;
787
788         cr_check=FALSE;
789
790         v.x=0.0; v.y=0.0; v.z=0.0;
791         x=0; y=0; z=0;
792         o=0; dmin=0;
793
794         switch(mdrun->lattice) {
795                 case CUBIC:
796                         o=0.5*mdrun->lc;
797                         break;
798                 case FCC:
799                         o=0.25*mdrun->lc;
800                         break;
801                 case DIAMOND:
802                 case ZINCBLENDE:
803                         o=0.125*mdrun->lc;
804                         break;
805                 default:
806                         break;
807         }
808
809         switch(iap->type) {
810                 case INS_TOTAL:
811                         x=moldyn->dim.x;
812                         x0=-x/2.0;
813                         y=moldyn->dim.y;
814                         y0=-y/2.0;
815                         z=moldyn->dim.z;
816                         z0=-z/2.0;
817                         cr_check=TRUE;
818                         break;
819                 case INS_RECT:
820                         x=iap->x1-iap->x0;
821                         x0=iap->x0;
822                         y=iap->y1-iap->y0;
823                         y0=iap->y0;
824                         z=iap->z1-iap->z0;
825                         z0=iap->z0;
826                         cr_check=TRUE;
827                         break;
828                 case INS_SPHERE:
829                         x=2.0*iap->x1;
830                         x0=iap->x0-iap->x1;
831                         y=x;
832                         y0=iap->y0-iap->x1;
833                         z=x;
834                         z0=iap->z0-iap->x1;
835                         cr_check=TRUE;
836                         break;
837                 case INS_POS:
838                         x0=iap->x0;
839                         y0=iap->y0;
840                         z0=iap->z0;
841                         cr_check=FALSE;
842                         break;
843                 default:
844                         printf("%s unknown insertion mode: %02x\n",
845                                ME,iap->type);
846                         return -1;
847         }
848
849         cnt=0;
850         while(cnt<iap->ins_atoms) {
851                 run=1;
852                 while(run) {
853                         if(iap->type!=INS_POS) {
854                                 r.x=rand_get_double(&(moldyn->random))*x;
855                                 r.y=rand_get_double(&(moldyn->random))*y;
856                                 r.z=rand_get_double(&(moldyn->random))*z;
857                         }
858                         else {
859                                 r.x=0.0;
860                                 r.y=0.0;
861                                 r.z=0.0;
862                         }
863                         r.x+=x0;
864                         r.y+=y0;
865                         r.z+=z0;
866                         // offset
867                         if(iap->type!=INS_TOTAL) {
868                                 r.x+=o;
869                                 r.y+=o;
870                                 r.z+=o;
871                         }
872                         run=0;
873                         if(cr_check==TRUE) {
874                                 dmin=1000;      // for sure too high!
875                                 for(i=0;i<moldyn->count;i++) {
876                                         atom=&(moldyn->atom[i]);
877                                         v3_sub(&dist,&(atom->r),&r);
878                                         check_per_bound(moldyn,&dist);
879                                         d=v3_absolute_square(&dist);
880                                         if(d<(iap->cr*iap->cr)) {
881                                                 run=1;
882                                                 break;
883                                         }
884                                         if(d<dmin)
885                                                 dmin=d;
886                                 }
887                         }
888                         if(iap->type==INS_SPHERE) {
889                                 if((r.x-iap->x0)*(r.x-iap->x0)+
890                                    (r.y-iap->y0)*(r.y-iap->y0)+
891                                    (r.z-iap->z0)*(r.z-iap->z0)>
892                                    (iap->x1*iap->x1)) {
893                                         run=1;
894                                 }
895                         }
896                 }
897                 add_atom(moldyn,iap->element,
898                          iap->brand,iap->attr,&r,&v);
899                 printf("%s atom inserted (%d/%d): %f %f %f\n",
900                        ME,(iap->cnt_steps+1)*iap->ins_atoms,
901                        iap->ins_steps*iap->ins_atoms,r.x,r.y,r.z);
902                 printf("  -> d2 = %f/%f\n",dmin,iap->cr*iap->cr);
903                 cnt+=1;
904         }
905
906         return 0;
907 }
908
909 int insert_mixed_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
910
911         t_stage *stage;
912         t_insert_mixed_atoms_params *imp;
913         t_atom *atom;
914         double x,x0,y,y0,z,z0;
915         double dmin,d,cmin,cmax;
916         u8 retry;
917         t_3dvec r,v,dist;
918         int i;
919         
920
921         stage=mdrun->stage.current->data;
922         imp=stage->params;
923
924         x=moldyn->dim.x;
925         x0=-x/2.0;
926         y=moldyn->dim.y;
927         y0=-y/2.0;
928         z=moldyn->dim.z;
929         z0=-z/2.0;
930
931         v.x=0.0;
932         v.y=0.0;
933         v.z=0.0;
934
935         cmin=imp->crmin*imp->crmin;
936         cmax=imp->crmax*imp->crmax;
937
938         while(imp->amount1|imp->amount2) {
939                 if(imp->amount1) {
940                         retry=1;
941                         while(retry) {
942                                 retry=0;
943                                 r.x=rand_get_double(&(moldyn->random))*x;
944                                 r.y=rand_get_double(&(moldyn->random))*y;
945                                 r.z=rand_get_double(&(moldyn->random))*z;
946                                 r.x+=x0;
947                                 r.y+=y0;
948                                 r.z+=z0;
949                                 dmin=1000.0;    // for sure too high!
950                                 for(i=0;i<moldyn->count;i++) {
951                                         atom=&(moldyn->atom[i]);
952                                         v3_sub(&dist,&(atom->r),&r);
953                                         check_per_bound(moldyn,&dist);
954                                         d=v3_absolute_square(&dist);
955                                         if(d<cmin) {
956                                                 retry=1;
957                                                 break;
958                                         }
959                                         if(d<dmin)
960                                                 dmin=d;
961                                 }
962                                 if(dmin!=1000.0)
963                                         if(dmin>cmax)
964                                                 retry=1;
965                         }
966                         add_atom(moldyn,imp->element1,
967                                  imp->brand1,imp->attr1,&r,&v);
968                         printf("%s (mixed) atom inserted (%d): %f %f %f\n",
969                                ME,imp->amount1,r.x,r.y,r.z);
970                         printf("  -> d2 = %f/%f/%f\n",dmin,cmin,cmax);
971                         imp->amount1-=1;
972                 }
973                 if(imp->amount2) {
974                         retry=1;
975                         while(retry) {
976                                 retry=0;
977                                 r.x=rand_get_double(&(moldyn->random))*x;
978                                 r.y=rand_get_double(&(moldyn->random))*y;
979                                 r.z=rand_get_double(&(moldyn->random))*z;
980                                 r.x+=x0;
981                                 r.y+=y0;
982                                 r.z+=z0;
983                                 dmin=1000.0;    // for sure too high!
984                                 for(i=0;i<moldyn->count;i++) {
985                                         atom=&(moldyn->atom[i]);
986                                         v3_sub(&dist,&(atom->r),&r);
987                                         check_per_bound(moldyn,&dist);
988                                         d=v3_absolute_square(&dist);
989                                         if(d<cmin) {
990                                                 retry=1;
991                                                 break;
992                                         }
993                                         if(d<dmin)
994                                                 dmin=d;
995                                 }
996                                 if(dmin!=1000.0)
997                                         if(dmin>cmax)
998                                                 retry=1;
999                         }
1000                         add_atom(moldyn,imp->element2,
1001                                  imp->brand2,imp->attr2,&r,&v);
1002                         printf("%s (mixed) atom inserted (%d): %f %f %f\n",
1003                                ME,imp->amount2,r.x,r.y,r.z);
1004                         printf("  -> d2 = %f/%f/%f\n",dmin,cmin,cmax);
1005                         imp->amount2-=1;
1006                 }
1007         }
1008
1009         return 0;
1010 }
1011
1012 int chaatr(t_moldyn *moldyn,t_mdrun *mdrun) {
1013
1014         t_stage *stage;
1015         t_chaattr_params *cap;
1016         t_atom *atom;
1017         int i;
1018
1019         stage=mdrun->stage.current->data;
1020         cap=stage->params;
1021
1022         for(i=0;i<moldyn->count;i++) {
1023                 atom=&(moldyn->atom[i]);
1024                 if(cap->type&CHAATTR_ELEMENT) {
1025                         if(cap->element!=atom->element)
1026                                 continue;
1027                 }
1028                 if(cap->type&CHAATTR_REGION) {
1029                         if(cap->x0<atom->r.x)
1030                                 continue;
1031                         if(cap->y0<atom->r.y)
1032                                 continue;
1033                         if(cap->z0<atom->r.z)
1034                                 continue;
1035                         if(cap->x1>atom->r.x)
1036                                 continue;
1037                         if(cap->y1>atom->r.y)
1038                                 continue;
1039                         if(cap->z1>atom->r.z)
1040                                 continue;
1041                 }
1042                 atom->attr=cap->attr;
1043         }
1044
1045         return 0;
1046 }
1047
1048 int chsattr(t_moldyn *moldyn,t_mdrun *mdrun) {
1049
1050         t_stage *stage;
1051         t_chsattr_params *csp;
1052
1053         stage=mdrun->stage.current->data;
1054         csp=stage->params;
1055
1056         if(csp->type&CHSATTR_PCTRL) {
1057                 if(csp->ptau>0)
1058                         set_p_scale(moldyn,P_SCALE_BERENDSEN,csp->ptau);
1059                 else
1060                         set_p_scale(moldyn,P_SCALE_NONE,1.0);
1061         }
1062         if(csp->type&CHSATTR_TCTRL) {
1063                 if(csp->ttau>0)
1064                         set_t_scale(moldyn,T_SCALE_BERENDSEN,csp->ttau);
1065                 else
1066                         set_t_scale(moldyn,T_SCALE_NONE,1.0);
1067         }
1068         if(csp->type&CHSATTR_PRELAX) {
1069                 if(csp->dp<0)
1070                         mdrun->sattr&=(~(SATTR_PRELAX));
1071                 else
1072                         mdrun->sattr|=SATTR_PRELAX;
1073                 mdrun->dp=csp->dp;
1074         }
1075         if(csp->type&CHSATTR_TRELAX) {
1076                 if(csp->dt<0)
1077                         mdrun->sattr&=(~(SATTR_TRELAX));
1078                 else
1079                         mdrun->sattr|=SATTR_TRELAX;
1080                 mdrun->dt=csp->dt;
1081         }
1082         if(csp->type&CHSATTR_AVGRST) {
1083                 if(csp->avgrst)
1084                         mdrun->sattr|=SATTR_AVGRST;
1085                 else
1086                         mdrun->sattr&=(~(SATTR_AVGRST));
1087         }
1088         if(csp->type&CHSATTR_RSTEPS) {
1089                 mdrun->relax_steps=csp->rsteps;
1090         }
1091
1092         return 0;
1093 }
1094
1095 #define stage_print(m)  if(!(stage->executed)) \
1096                                 printf("%s",m)
1097
1098 int mdrun_hook(void *ptr1,void *ptr2) {
1099
1100         t_moldyn *moldyn;
1101         t_mdrun *mdrun;
1102         t_stage *stage;
1103         t_list *sl;
1104         int steps;
1105         u8 change_stage;
1106         t_3dvec o;
1107
1108         t_insert_atoms_params *iap;
1109         t_insert_mixed_atoms_params *imp;
1110         t_continue_params *cp;
1111         t_anneal_params *ap;
1112         t_set_temp_params *stp;
1113         t_set_timestep_params *stsp;
1114         t_fill_params *fp;
1115
1116         moldyn=ptr1;
1117         mdrun=ptr2;
1118
1119         sl=&(mdrun->stage);
1120
1121         change_stage=FALSE;
1122
1123         /* return immediately if there are no more stage */
1124         if(sl->current==NULL)
1125                 return 0;
1126
1127         /* get stage description */
1128         stage=sl->current->data;
1129
1130         /* steps in next schedule */
1131         steps=mdrun->relax_steps;
1132
1133         /* check whether relaxation steps are necessary */
1134         if((check_pressure(moldyn,mdrun)==TRUE)&\
1135            (check_temperature(moldyn,mdrun)==TRUE)) {
1136         
1137                 /* be verbose */
1138                 stage_print("\n###########################\n");
1139                 stage_print("# [mdrun] executing stage #\n");
1140                 stage_print("###########################\n\n");
1141                 
1142                 /* stage specific stuff */
1143                 switch(stage->type) {
1144                         case STAGE_DISPLACE_ATOM:
1145                                 stage_print("  -> displace atom\n\n");
1146                                 displace_atom(moldyn,mdrun);
1147                                 change_stage=TRUE;
1148                                 break;
1149                         case STAGE_DEL_ATOMS:
1150                                 stage_print(" -> del atoms\n\n");
1151                                 del_atoms(moldyn,mdrun);
1152                                 change_stage=TRUE;
1153                                 break;
1154                         case STAGE_INSERT_ATOMS:
1155                                 stage_print("  -> insert atoms\n\n");
1156                                 iap=stage->params;
1157                                 if(iap->cnt_steps==iap->ins_steps) {
1158                                         change_stage=TRUE;
1159                                         break;
1160                                 }
1161                                 insert_atoms(moldyn,mdrun);
1162                                 iap->cnt_steps+=1;
1163                                 break;
1164
1165
1166
1167                         case STAGE_INSERT_MIXED_ATOMS:
1168                                 stage_print("  -> insert mixed atoms\n\n");
1169                                 imp=stage->params;
1170                                 insert_mixed_atoms(moldyn,mdrun);
1171                                 change_stage=TRUE;
1172                                 break;
1173
1174
1175
1176                         case STAGE_CONTINUE:
1177                                 stage_print("  -> continue\n\n");
1178                                 if(stage->executed==TRUE) {
1179                                         change_stage=TRUE;
1180                                         break;
1181                                 }
1182                                 cp=stage->params;
1183                                 steps=cp->runs;
1184                                 break;
1185                         case STAGE_ANNEAL:
1186                                 stage_print("  -> anneal\n\n");
1187                                 ap=stage->params;
1188                                 if(ap->count==ap->runs) {
1189                                         change_stage=TRUE;
1190                                         break;
1191                                 }
1192                                 if(moldyn->t_ref+ap->dt>=0.0)
1193                                         set_temperature(moldyn,
1194                                                         moldyn->t_ref+ap->dt);
1195                                 ap->count+=1;
1196                                 steps=ap->interval;
1197                                 break;
1198                         case STAGE_CHAATTR:
1199                                 stage_print("  -> change atom attributes\n\n");
1200                                 chaatr(moldyn,mdrun);
1201                                 change_stage=TRUE;
1202                                 break;
1203                         case STAGE_CHSATTR:
1204                                 stage_print("  -> change sys attributes\n\n");
1205                                 chsattr(moldyn,mdrun);
1206                                 change_stage=TRUE;
1207                                 break;
1208                         case STAGE_SET_TEMP:
1209                                 stage_print("  -> set temperature\n\n");
1210                                 stp=stage->params;
1211                                 if(stp->type&SET_TEMP_CURRENT) {
1212                                         set_temperature(moldyn,moldyn->t_avg);
1213                                 }
1214                                 else {
1215                                         set_temperature(moldyn,stp->val);
1216                                 }
1217                                 change_stage=TRUE;
1218                                 break;
1219                         case STAGE_SET_TIMESTEP:
1220                                 stage_print("  -> set timestep\n\n");
1221                                 stsp=stage->params;
1222                                 mdrun->timestep=stsp->tau;
1223                                 change_stage=TRUE;
1224                                 break;
1225                         case STAGE_FILL:
1226                                 stage_print("  -> fill lattice\n\n");
1227                                 fp=stage->params;
1228                                 switch(fp->lattice) {
1229                                         case ZINCBLENDE:
1230
1231                                         o.x=0.5*0.25*fp->lc;
1232                                         o.y=o.x;
1233                                         o.z=o.x;
1234                                         create_lattice(moldyn,
1235                                                        FCC,fp->lc,
1236                                                        mdrun->element1,
1237                                                        DEFAULT_ATOM_ATTR,0,
1238                                                        fp->lx,fp->ly,fp->lz,
1239                                                        &o,
1240                                                        &(fp->p_params),
1241                                                        &(fp->d_params));
1242                                         o.x+=0.25*fp->lc;
1243                                         o.y=o.x;
1244                                         o.z=o.x;
1245                                         create_lattice(moldyn,
1246                                                        FCC,fp->lc,
1247                                                        mdrun->element2,
1248                                                        DEFAULT_ATOM_ATTR,1,
1249                                                        fp->lx,fp->ly,fp->lz,
1250                                                        &o,
1251                                                        &(fp->p_params),
1252                                                        &(fp->d_params));
1253                                         break;
1254
1255                                         default:
1256
1257                                         create_lattice(moldyn,
1258                                                        fp->lattice,fp->lc,
1259                                                        fp->fill_element,
1260                                                        DEFAULT_ATOM_ATTR,
1261                                                        fp->fill_brand,
1262                                                        fp->lx,fp->ly,fp->lz,
1263                                                        NULL,
1264                                                        &(fp->p_params),
1265                                                        &(fp->d_params));
1266                                         break;
1267                                 }
1268                                 moldyn_bc_check(moldyn);
1269                                 change_stage=TRUE;
1270                                 break;
1271                         case STAGE_THERMAL_INIT:
1272                                 stage_print("  -> thermal init\n\n");
1273                                 thermal_init(moldyn,TRUE);
1274                                 change_stage=TRUE;
1275                                 break;
1276                         default:
1277                                 printf("%s unknwon stage type\n",ME);
1278                                 break;
1279                 }
1280         
1281                 /* mark as executed */
1282                 stage->executed=TRUE;
1283         
1284                 /* change state */
1285                 if(change_stage==TRUE) {
1286                         printf("%s finished stage\n",ME);
1287                         if(list_next_f(sl)==L_NO_NEXT_ELEMENT) {
1288                                 printf("%s no more stages\n",ME);
1289                                 return 0;
1290                         }
1291                         steps=0;
1292                 }
1293
1294         }
1295         else {
1296
1297                 /* averages */
1298                 if(mdrun->sattr&SATTR_AVGRST)
1299                         average_reset(moldyn);
1300
1301         }
1302
1303         /* continue simulation */
1304         moldyn_add_schedule(moldyn,steps,mdrun->timestep);
1305
1306         return 0;
1307 }
1308
1309 int main(int argc,char **argv) {
1310
1311         t_mdrun mdrun;
1312         t_moldyn moldyn;
1313         //t_3dvec o;
1314
1315         /* clear structs */
1316         memset(&mdrun,0,sizeof(t_mdrun));
1317         memset(&moldyn,0,sizeof(t_moldyn));
1318
1319         /* parse arguments */
1320         if(mdrun_parse_argv(&mdrun,argc,argv)<0)
1321                 return -1;
1322
1323         /* initialize list system */
1324         list_init_f(&(mdrun.stage));
1325
1326         /* parse config file */
1327         mdrun_parse_config(&mdrun);
1328
1329         /* reset the stage list */
1330         list_reset_f(&(mdrun.stage));
1331
1332         /* sanity check! */
1333
1334         /* prepare simulation */
1335
1336         if(mdrun.continue_file[0]) {
1337                 // read the save file
1338                 moldyn_read_save_file(&moldyn,mdrun.continue_file);
1339                 // manualaadjusting some stuff
1340                 moldyn.argc=argc;
1341                 moldyn.args=argv;
1342                 rand_init(&(moldyn.random),NULL,1);
1343                 moldyn.random.status|=RAND_STAT_VERBOSE;
1344         }
1345         else {
1346                 moldyn_init(&moldyn,argc,argv);
1347         }
1348         
1349         if(set_int_alg(&moldyn,mdrun.intalgo)<0)
1350                 return -1;
1351
1352         /* potential */
1353         set_cutoff(&moldyn,mdrun.cutoff);
1354         if(set_potential(&moldyn,mdrun.potential)<0)
1355                 return -1;
1356         switch(mdrun.potential) {
1357                 case MOLDYN_POTENTIAL_AM:
1358                         albe_mult_set_params(&moldyn,
1359                                              mdrun.element1,
1360                                              mdrun.element2);
1361                         break;
1362                 case MOLDYN_POTENTIAL_TM:
1363                         tersoff_mult_set_params(&moldyn,
1364                                                 mdrun.element1,
1365                                                 mdrun.element2);
1366                         break;
1367                 case MOLDYN_POTENTIAL_HO:
1368                         harmonic_oscillator_set_params(&moldyn,mdrun.element1);
1369                         break;
1370                 case MOLDYN_POTENTIAL_LJ:
1371                         lennard_jones_set_params(&moldyn,mdrun.element1);
1372                         break;
1373                 default:
1374                         printf("%s unknown potential: %02x\n",
1375                                ME,mdrun.potential);
1376                         return -1;
1377         }
1378
1379         /* if it is a continue run, reset schedule and skip lattice init */
1380         if(mdrun.continue_file[0]) {
1381                 memset(&(moldyn.schedule),0,sizeof(t_moldyn_schedule));
1382                 goto addsched;
1383         }
1384
1385         /* initial lattice and dimensions */
1386         set_dim(&moldyn,mdrun.dim.x,mdrun.dim.y,mdrun.dim.z,mdrun.vis);
1387         set_pbc(&moldyn,mdrun.pbcx,mdrun.pbcy,mdrun.pbcz);
1388         /* replaced by fill stage !! 
1389         switch(mdrun.lattice) {
1390                 case FCC:
1391                         create_lattice(&moldyn,FCC,mdrun.lc,mdrun.fill_element,
1392                                        mdrun.m1,DEFAULT_ATOM_ATTR,
1393                                        mdrun.fill_brand,mdrun.lx,
1394                                        mdrun.ly,mdrun.lz,NULL,0,NULL);
1395                         break;
1396                 case DIAMOND:
1397                         create_lattice(&moldyn,DIAMOND,mdrun.lc,
1398                                        mdrun.fill_element,
1399                                        mdrun.m1,DEFAULT_ATOM_ATTR,
1400                                        mdrun.fill_brand,mdrun.lx,
1401                                        mdrun.ly,mdrun.lz,NULL,0,NULL);
1402                         break;
1403                 case ZINCBLENDE:
1404                         o.x=0.5*0.25*mdrun.lc; o.y=o.x; o.z=o.x;
1405                         create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element1,
1406                                        mdrun.m1,DEFAULT_ATOM_ATTR,0,mdrun.lx,
1407                                        mdrun.ly,mdrun.lz,&o,0,NULL);
1408                         o.x+=0.25*mdrun.lc; o.y=o.x; o.z=o.x;
1409                         create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element2,
1410                                        mdrun.m2,DEFAULT_ATOM_ATTR,1,mdrun.lx,
1411                                        mdrun.ly,mdrun.lz,&o,0,NULL);
1412                         break;
1413                 case NONE:
1414                         set_nn_dist(&moldyn,mdrun.nnd);
1415                         break;
1416                 default:
1417                         printf("%s unknown lattice type: %02x\n",
1418                                ME,mdrun.lattice);
1419                         return -1;
1420         }
1421         moldyn_bc_check(&moldyn);
1422         replaced by fill stage !! */
1423
1424         /* temperature and pressure */
1425         set_temperature(&moldyn,mdrun.temperature);
1426         set_pressure(&moldyn,mdrun.pressure);
1427         /* replaced thermal_init stage
1428         thermal_init(&moldyn,TRUE);
1429         */
1430
1431 addsched:
1432         /* first schedule */
1433         moldyn_add_schedule(&moldyn,mdrun.prerun,mdrun.timestep);
1434
1435         /* log */
1436         moldyn_set_log_dir(&moldyn,mdrun.sdir);
1437         moldyn_set_report(&moldyn,"CHANGE ME","CHANGE ME TOO");
1438         if(mdrun.elog)
1439                 moldyn_set_log(&moldyn,LOG_TOTAL_ENERGY,mdrun.elog);
1440         if(mdrun.tlog)
1441                 moldyn_set_log(&moldyn,LOG_TEMPERATURE,mdrun.tlog);
1442         if(mdrun.plog)
1443                 moldyn_set_log(&moldyn,LOG_PRESSURE,mdrun.plog);
1444         if(mdrun.vlog)
1445                 moldyn_set_log(&moldyn,LOG_VOLUME,mdrun.vlog);
1446         if(mdrun.visualize)
1447                 moldyn_set_log(&moldyn,VISUAL_STEP,mdrun.visualize);
1448         if(mdrun.save)
1449                 moldyn_set_log(&moldyn,SAVE_STEP,mdrun.save);
1450         moldyn_set_log(&moldyn,CREATE_REPORT,0);
1451         set_avg_skip(&moldyn,mdrun.avgskip);
1452
1453         /* prepare the hook function */
1454         moldyn_set_schedule_hook(&moldyn,&mdrun_hook,&mdrun);
1455
1456         /* run the simulation */
1457         moldyn_integrate(&moldyn);
1458
1459         /* shutdown */
1460         moldyn_shutdown(&moldyn);
1461         del_stages(&mdrun);
1462         list_destroy_f(&(mdrun.stage));
1463
1464         return 0;
1465 }