#include "potentials/tersoff.h"
#endif
+/* pse */
+#define PSE_MASS
+#include "pse.h"
+#undef PSE_MASS
+
#define ME "[mdrun]"
/*
case STAGE_CHSATTR:
psize=sizeof(t_chsattr_params);
break;
+ case STAGE_SET_TEMP:
+ psize=sizeof(t_set_temp_params);
+ break;
+ case STAGE_SET_TIMESTEP:
+ psize=sizeof(t_set_timestep_params);
+ break;
default:
printf("%s unknown stage type: %02x\n",ME,type);
return -1;
t_anneal_params ap;
t_chaattr_params cap;
t_chsattr_params csp;
+ t_set_temp_params stp;
+ t_set_timestep_params stsp;
/* open config file */
fd=open(mdrun->cfile,O_RDONLY);
memset(&ap,0,sizeof(t_anneal_params));
memset(&cap,0,sizeof(t_chaattr_params));
memset(&csp,0,sizeof(t_chsattr_params));
+ memset(&stp,0,sizeof(t_set_temp_params));
+ memset(&stsp,0,sizeof(t_set_timestep_params));
// get command + args
wcnt=0;
mdrun->ly=atoi(word[3]);
mdrun->lz=atoi(word[4]);
mdrun->lc=atof(word[5]);
+ if(wcnt==8) {
+ mdrun->fill_element=atoi(word[6]);
+ mdrun->fill_brand=atoi(word[7]);
+ }
+ else {
+ mdrun->fill_element=mdrun->element1;
+ mdrun->fill_brand=0;
+ }
}
else if(!strncmp(word[0],"aattr",5)) {
// for aatrib line we need a special stage
imp.amount2=atoi(word[5]);
imp.brand1=atoi(word[6]);
imp.brand2=atoi(word[7]);
- imp.cr=atof(word[8]);
+ imp.crmin=atof(word[8]);
+ imp.crmax=atof(word[9]);
/* do this later ...
for(i=0;i<strlen(word[8]);i++) {
switch(word[8][i]) {
}
}
*/
- imp.attr1=ATOM_ATTR_HB|ATOM_ATTR_VA|ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP;
- imp.attr2=ATOM_ATTR_HB|ATOM_ATTR_VA|ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP;
+ imp.attr1=ATOM_ATTR_HB|ATOM_ATTR_VA|ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_FP;
+ imp.attr2=ATOM_ATTR_HB|ATOM_ATTR_VA|ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_FP;
add_stage(mdrun,STAGE_INSERT_MIXED_ATOMS,&imp);
}
ap.count=0;
ap.runs=atoi(word[2]);
ap.dt=atof(word[3]);
+ ap.interval=atoi(word[4]);
add_stage(mdrun,STAGE_ANNEAL,&ap);
}
+ else if(!strncmp(word[1],"set_temp",8)) {
+ if(word[2][0]=='c') {
+ stp.type=SET_TEMP_CURRENT;
+ stp.val=0.0;
+ }
+ else {
+ stp.type=SET_TEMP_VALUE;
+ stp.val=atof(word[2]);
+ }
+ add_stage(mdrun,STAGE_SET_TEMP,&stp);
+ }
+ else if(!strncmp(word[1],"set_timestep",12)) {
+ stsp.tau=atof(word[2]);
+ add_stage(mdrun,STAGE_SET_TIMESTEP,&stsp);
+ }
else {
printf("%s unknown stage type: %s\n",
ME,word[1]);
t_insert_mixed_atoms_params *imp;
t_atom *atom;
double x,x0,y,y0,z,z0;
- double dmin,d,c;
+ double dmin,d,cmin,cmax;
u8 retry;
t_3dvec r,v,dist;
int i;
v.y=0.0;
v.z=0.0;
- c=imp->cr*imp->cr;
+ cmin=imp->crmin*imp->crmin;
+ cmax=imp->crmax*imp->crmax;
while(imp->amount1|imp->amount2) {
if(imp->amount1) {
v3_sub(&dist,&(atom->r),&r);
check_per_bound(moldyn,&dist);
d=v3_absolute_square(&dist);
- if(d<c) {
+ if(d<cmin) {
retry=1;
break;
}
if(d<dmin)
dmin=d;
-
}
+ if(dmin!=1000.0)
+ if(dmin>cmax)
+ retry=1;
}
add_atom(moldyn,imp->element1,pse_mass[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);
- printf(" -> d2 = %f/%f\n",dmin,c);
+ printf(" -> d2 = %f/%f/%f\n",dmin,cmin,cmax);
imp->amount1-=1;
}
if(imp->amount2) {
v3_sub(&dist,&(atom->r),&r);
check_per_bound(moldyn,&dist);
d=v3_absolute_square(&dist);
- if(d<c) {
+ if(d<cmin) {
retry=1;
break;
}
if(d<dmin)
dmin=d;
-
}
+ if(dmin!=1000.0)
+ if(dmin>cmax)
+ retry=1;
}
add_atom(moldyn,imp->element2,pse_mass[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);
- printf(" -> d2 = %f/%f\n",dmin,c);
+ printf(" -> d2 = %f/%f/%f\n",dmin,cmin,cmax);
imp->amount2-=1;
}
}
t_stage *stage;
t_list *sl;
int steps;
- double tau;
u8 change_stage;
t_insert_atoms_params *iap;
t_insert_mixed_atoms_params *imp;
t_continue_params *cp;
t_anneal_params *ap;
+ t_set_temp_params *stp;
+ t_set_timestep_params *stsp;
moldyn=ptr1;
mdrun=ptr2;
/* get stage description */
stage=sl->current->data;
- /* default steps and tau values */
+ /* steps in next schedule */
steps=mdrun->relax_steps;
- tau=mdrun->timestep;
/* check whether relaxation steps are necessary */
if((check_pressure(moldyn,mdrun)==TRUE)&\
stage_print(" -> insert mixed atoms\n\n");
imp=stage->params;
insert_mixed_atoms(moldyn,mdrun);
+ change_stage=TRUE;
break;
set_temperature(moldyn,
moldyn->t_ref+ap->dt);
ap->count+=1;
+ steps=ap->interval;
break;
case STAGE_CHAATTR:
- stage_print(" -> chaattr\n\n");
+ stage_print(" -> change atom attributes\n\n");
chaatr(moldyn,mdrun);
change_stage=TRUE;
break;
case STAGE_CHSATTR:
- stage_print(" -> chsattr\n\n");
+ stage_print(" -> change sys attributes\n\n");
chsattr(moldyn,mdrun);
change_stage=TRUE;
break;
+ case STAGE_SET_TEMP:
+ stage_print(" -> set temperature\n\n");
+ stp=stage->params;
+ if(stp->type&SET_TEMP_CURRENT) {
+ set_temperature(moldyn,moldyn->t_avg);
+ }
+ else {
+ set_temperature(moldyn,stp->val);
+ }
+ change_stage=TRUE;
+ break;
+ case STAGE_SET_TIMESTEP:
+ stage_print(" -> set timestep\n\n");
+ stsp=stage->params;
+ mdrun->timestep=stsp->tau;
+ change_stage=TRUE;
+ break;
default:
printf("%s unknwon stage type\n",ME);
break;
return 0;
}
steps=0;
- tau=mdrun->timestep;
}
}
}
/* continue simulation */
- moldyn_add_schedule(moldyn,steps,tau);
+ moldyn_add_schedule(moldyn,steps,mdrun->timestep);
return 0;
}
set_pbc(&moldyn,mdrun.pbcx,mdrun.pbcy,mdrun.pbcz);
switch(mdrun.lattice) {
case FCC:
- create_lattice(&moldyn,FCC,mdrun.lc,mdrun.element1,
- mdrun.m1,DEFAULT_ATOM_ATTR,0,mdrun.lx,
+ create_lattice(&moldyn,FCC,mdrun.lc,mdrun.fill_element,
+ mdrun.m1,DEFAULT_ATOM_ATTR,
+ mdrun.fill_brand,mdrun.lx,
mdrun.ly,mdrun.lz,NULL);
break;
case DIAMOND:
- create_lattice(&moldyn,DIAMOND,mdrun.lc,mdrun.element1,
- mdrun.m1,DEFAULT_ATOM_ATTR,0,mdrun.lx,
+ create_lattice(&moldyn,DIAMOND,mdrun.lc,
+ mdrun.fill_element,
+ mdrun.m1,DEFAULT_ATOM_ATTR,
+ mdrun.fill_brand,mdrun.lx,
mdrun.ly,mdrun.lz,NULL);
break;
case ZINCBLENDE:
mdrun.ly,mdrun.lz,&o);
break;
case NONE:
+ set_nn_dist(&moldyn,mdrun.nnd);
break;
default:
printf("%s unknown lattice type: %02x\n",