cleaned partial lattice create + added defect feature, adabted md code +
[physik/posic.git] / mdrun.c
diff --git a/mdrun.c b/mdrun.c
index 6effe1a..d063693 100644 (file)
--- a/mdrun.c
+++ b/mdrun.c
@@ -277,66 +277,114 @@ int mdrun_parse_config(t_mdrun *mdrun) {
                                mdrun->lattice=DIAMOND;
                        if(!strncmp(word[1],"none",4))
                                mdrun->lattice=NONE;
+                       if(wcnt==3)
+                               mdrun->lc=atof(word[2]);
                }
                else if(!strncmp(word[0],"element1",8)) {
                        mdrun->element1=atoi(word[1]);
-                       mdrun->m1=pse_mass[mdrun->element1];
                }
                else if(!strncmp(word[0],"element2",8)) {
                        mdrun->element2=atoi(word[1]);
-                       mdrun->m2=pse_mass[mdrun->element2];
                }
                else if(!strncmp(word[0],"fill",6)) {
-                       fp.lx=atoi(word[2]);
-                       fp.ly=atoi(word[3]);
-                       fp.lz=atoi(word[4]);
-                       fp.lc=atof(word[5]);
-                       mdrun->lc=fp.lc;
-                       if(!strncmp(word[1],"lc",2)) {
-                               if(wcnt==8) {
-                                       fp.fill_element=atoi(word[6]);
-                                       fp.fill_brand=atoi(word[7]);
+                       // default values
+                       fp.fill_element=mdrun->element1;
+                       fp.fill_brand=0;
+                       fp.lattice=mdrun->lattice;
+                       fp.p_params.type=0;
+                       fp.d_params.type=0;
+                       // parse fill command
+                       i=1;
+                       while(i<wcnt) {
+                               if(!strncmp(word[i],"lc",2)) {
+                                       fp.lx=atoi(word[++i]);
+                                       fp.ly=atoi(word[++i]);
+                                       fp.lz=atoi(word[++i]);
+                                       fp.lc=atof(word[++i]);
+                                       mdrun->lc=fp.lc;
                                }
-                               else {
-                                       fp.fill_element=mdrun->element1;
-                                       fp.fill_brand=0;
+                               if(!strncmp(word[i],"eb",2)) {
+                                       fp.fill_element=atoi(word[++i]);
+                                       fp.fill_brand=atoi(word[++i]);
                                }
-                       }
-                       else {
-                               switch(word[6][0]) {
+                               if(word[i][0]=='p') {
+                                       i+=1;
+                                       switch(word[i][0]) {
                                        case 'i':
-                                               if(word[6][1]=='r')
-                                                       fp.p_type=PART_INSIDE_R;
+                                               if(word[i][1]=='r')
+                                               fp.p_params.type=PART_INSIDE_R;
                                                else
-                                                       fp.p_type=PART_INSIDE_D;
+                                               fp.p_params.type=PART_INSIDE_D;
                                                break;
                                        case 'o':
-                                               if(word[6][1]=='r')
-                                               fp.p_type=PART_OUTSIDE_R;
+                                               if(word[i][1]=='r')
+                                               fp.p_params.type=PART_OUTSIDE_R;
                                                else
-                                               fp.p_type=PART_OUTSIDE_D;
+                                               fp.p_params.type=PART_OUTSIDE_D;
                                                break;
                                        default:
                                                break;
+                                       }
+                                       if((fp.p_params.type==PART_INSIDE_R)||
+                                         (fp.p_params.type==PART_OUTSIDE_R)) {
+                                               fp.p_params.r=atof(word[++i]);  
+                                               fp.p_params.p.x=atof(word[++i]);
+                                               fp.p_params.p.y=atof(word[++i]);
+                                               fp.p_params.p.z=atof(word[++i]);
+                                       }
+                                       if((fp.p_params.type==PART_INSIDE_D)||
+                                          (fp.p_params.type==PART_OUTSIDE_D)) {
+                                               fp.p_params.p.x=atof(word[++i]);
+                                               fp.p_params.p.y=atof(word[++i]);
+                                               fp.p_params.p.z=atof(word[++i]);
+                                               fp.p_params.d.x=atof(word[++i]);
+                                               fp.p_params.d.y=atof(word[++i]);
+                                               fp.p_params.d.z=atof(word[++i]);
+                                       }
                                }
+                               if(word[i][0]=='d') {
+                                       switch(word[++i][0]) {
+                                               case '0':
+
+                               fp.d_params.type=DEFECT_TYPE_0D;
+                               if(!strncmp(word[i+1],"dbx",3)) {
+                                       fp.d_params.stype=DEFECT_STYPE_DB_X;
+                               }
+                               if(!strncmp(word[i+1],"dby",3)) {
+                                       fp.d_params.stype=DEFECT_STYPE_DB_Y;
+                               }
+                               if(!strncmp(word[i+1],"dbz",3)) {
+                                       fp.d_params.stype=DEFECT_STYPE_DB_Z;
+                               }
+                               if(!strncmp(word[i+1],"dbr",3)) {
+                                       fp.d_params.stype=DEFECT_STYPE_DB_R;
+                               }
+                               i+=1;
+                               fp.d_params.od=atof(word[++i]);
+                               fp.d_params.dd=atof(word[++i]);
+                               fp.d_params.element=atoi(word[++i]);
+                               fp.d_params.brand=atoi(word[++i]);
+                               // parsed in future
+               fp.d_params.attr=ATOM_ATTR_HB|ATOM_ATTR_VA;
+               fp.d_params.attr|=ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP;
+                               break;
+
+                                               case '1':
+                               fp.d_params.type=DEFECT_TYPE_1D;
+                               break;
+                                               case '2':
+                               fp.d_params.type=DEFECT_TYPE_2D;
+                               break;
+                                               case '3':
+                               fp.d_params.type=DEFECT_TYPE_3D;
+                               break;
+                                               default:
+                                                       break;
+                                       }
+
+                               }
+                               i+=1;
                        }
-                       if((fp.p_type==PART_INSIDE_R)||
-                           (fp.p_type==PART_OUTSIDE_R)) {
-                               fp.p_vals.r=atof(word[7]);      
-                               fp.p_vals.p.x=atof(word[8]);    
-                               fp.p_vals.p.y=atof(word[9]);    
-                               fp.p_vals.p.z=atof(word[10]);
-                       }
-                       if((fp.p_type==PART_INSIDE_D)||
-                           (fp.p_type==PART_OUTSIDE_D)) {
-                               fp.p_vals.p.x=atof(word[7]);    
-                               fp.p_vals.p.y=atof(word[8]);    
-                               fp.p_vals.p.z=atof(word[9]);
-                               fp.p_vals.d.x=atof(word[10]);   
-                               fp.p_vals.d.y=atof(word[11]);   
-                               fp.p_vals.d.z=atof(word[12]);
-                       }
-                       fp.lattice=mdrun->lattice;
                        add_stage(mdrun,STAGE_FILL,&fp);
                }
                else if(!strncmp(word[0],"thermal_init",12)) {
@@ -777,7 +825,7 @@ int insert_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
                                }
                        }
                }
-               add_atom(moldyn,iap->element,pse_mass[iap->element],
+               add_atom(moldyn,iap->element,
                         iap->brand,iap->attr,&r,&v);
                printf("%s atom inserted (%d/%d): %f %f %f\n",
                       ME,(iap->cnt_steps+1)*iap->ins_atoms,
@@ -846,7 +894,7 @@ int insert_mixed_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
                                        if(dmin>cmax)
                                                retry=1;
                        }
-                       add_atom(moldyn,imp->element1,pse_mass[imp->element1],
+                       add_atom(moldyn,imp->element1,
                                  imp->brand1,imp->attr1,&r,&v);
                        printf("%s (mixed) atom inserted (%d): %f %f %f\n",
                                ME,imp->amount1,r.x,r.y,r.z);
@@ -880,7 +928,7 @@ int insert_mixed_atoms(t_moldyn *moldyn,t_mdrun *mdrun) {
                                        if(dmin>cmax)
                                                retry=1;
                        }
-                       add_atom(moldyn,imp->element2,pse_mass[imp->element2],
+                       add_atom(moldyn,imp->element2,
                                  imp->brand2,imp->attr2,&r,&v);
                        printf("%s (mixed) atom inserted (%d): %f %f %f\n",
                                ME,imp->amount2,r.x,r.y,r.z);
@@ -1103,39 +1151,44 @@ int mdrun_hook(void *ptr1,void *ptr2) {
                        case STAGE_FILL:
                                stage_print("  -> fill lattice\n\n");
                                fp=stage->params;
-                               if(fp->lattice!=ZINCBLENDE) {
-                                       create_lattice(moldyn,
-                                                      fp->lattice,fp->lc,
-                                                      mdrun->element1,
-                                                      mdrun->m1,
-                                                      DEFAULT_ATOM_ATTR,0,
-                                                      fp->lx,fp->ly,fp->lz,
-                                                      NULL,fp->p_type,
-                                                      &(fp->p_vals));
-                               }
-                               else {
+                               switch(fp->lattice) {
+                                       case ZINCBLENDE:
+
                                        o.x=0.5*0.25*fp->lc;
                                        o.y=o.x;
                                        o.z=o.x;
                                        create_lattice(moldyn,
                                                       FCC,fp->lc,
                                                       mdrun->element1,
-                                                      mdrun->m1,
                                                       DEFAULT_ATOM_ATTR,0,
                                                       fp->lx,fp->ly,fp->lz,
-                                                      &o,fp->p_type,
-                                                      &(fp->p_vals));
+                                                      &o,
+                                                      &(fp->p_params),
+                                                      &(fp->d_params));
                                        o.x+=0.25*fp->lc;
                                        o.y=o.x;
                                        o.z=o.x;
                                        create_lattice(moldyn,
                                                       FCC,fp->lc,
                                                       mdrun->element2,
-                                                      mdrun->m2,
                                                       DEFAULT_ATOM_ATTR,1,
                                                       fp->lx,fp->ly,fp->lz,
-                                                      &o,fp->p_type,
-                                                      &(fp->p_vals));
+                                                      &o,
+                                                      &(fp->p_params),
+                                                      &(fp->d_params));
+                                       break;
+
+                                       default:
+
+                                       create_lattice(moldyn,
+                                                      fp->lattice,fp->lc,
+                                                      mdrun->element1,
+                                                      DEFAULT_ATOM_ATTR,0,
+                                                      fp->lx,fp->ly,fp->lz,
+                                                      NULL,
+                                                      &(fp->p_params),
+                                                      &(fp->d_params));
+                                       break;
                                }
                                moldyn_bc_check(moldyn);
                                change_stage=TRUE;