X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=sic.c;h=dea4d4bf3367e894a22a8860625be55881217650;hb=a32468230b319b32819f1b20fd28aa9659574d45;hp=406ad537ea11953e3ed4671583192f9874a9b454;hpb=17f108864d7423f253a4a84949cae2e35d90b4c7;p=physik%2Fposic.git diff --git a/sic.c b/sic.c index 406ad53..dea4d4b 100644 --- a/sic.c +++ b/sic.c @@ -68,14 +68,36 @@ int insert_atoms(t_moldyn *moldyn) { r.x=(-0.5+0.25+0.125)*ALBE_LC_SI; r.y=(-0.5+0.25+0.125)*ALBE_LC_SI; r.z=(-0.5+0.25)*ALBE_LC_SI; - md->atom[4372].r.x=(-0.5+0.125+0.125)*ALBE_LC_SI; - md->atom[4372].r.y=(-0.5+0.125+0.125)*ALBE_LC_SI; + moldyn->atom[4372].r.x=(-0.5+0.125+0.125)*ALBE_LC_SI; + moldyn->atom[4372].r.y=(-0.5+0.125+0.125)*ALBE_LC_SI; +#endif +#ifdef INS_001DB + // 001 dumbbell + r.x=(-0.5+0.25)*ALBE_LC_SI; + r.y=(-0.5+0.25)*ALBE_LC_SI; + r.z=(-0.1)*ALBE_LC_SI; + moldyn->atom[4372].r.z=(-0.4)*ALBE_LC_SI; +#endif +#ifdef INS_USER + // 001 dumbbell + r.x=INS_UX*ALBE_LC_SI; + r.y=INS_UY*ALBE_LC_SI; + r.z=INS_UZ*ALBE_LC_SI; #endif #ifdef INS_RAND // random +#ifdef INS_DYNAMIC_LEN + r.x=(rand_get_double(&(moldyn->random))-0.5)*\ + moldyn->dim.x; + r.y=(rand_get_double(&(moldyn->random))-0.5)*\ + moldyn->dim.y; + r.z=(rand_get_double(&(moldyn->random))-0.5)*\ + moldyn->dim.z; +#else r.x=(rand_get_double(&(moldyn->random))-0.5)*INS_LENX; r.y=(rand_get_double(&(moldyn->random))-0.5)*INS_LENY; r.z=(rand_get_double(&(moldyn->random))-0.5)*INS_LENZ; +#endif #endif // offset r.x+=INS_OFFSET; @@ -117,6 +139,7 @@ int sic_hook(void *moldyn,void *hook_params) { int steps; double tau; double dt; + double dp; hp=hook_params; md=moldyn; @@ -126,58 +149,89 @@ int sic_hook(void *moldyn,void *hook_params) { /* switch on t scaling */ if(md->schedule.count==0) - set_pt_scale(md,0,0,T_SCALE_BERENDSEN,100.0); + set_pt_scale(md,P_SCALE_BERENDSEN,P_SCALE_TAU, + T_SCALE_BERENDSEN,T_SCALE_TAU); /* my lousy state machine ! */ /* switch to insert state immediately */ if(hp->state==STATE_PRERUN) hp->state=STATE_INSERT; - - /* act according to state */ + switch(hp->state) { case STATE_INSERT: - /* assigne values */ - steps=INS_RELAX; - tau=INS_TAU; - /* check temperature */ - dt=md->t_avg-md->t_ref; - if(dt<0) - dt=-dt; - if(dt>INS_DELTA_TC) - break; - /* insert atoms */ - hp->insert_count+=1; - printf(" ### insert atoms (%d/%d) ###\n", - hp->insert_count*INS_ATOMS,INS_RUNS*INS_ATOMS); - insert_atoms(md); - /* change state after last insertion */ - if(hp->insert_count==INS_RUNS) - hp->state=STATE_POSTRUN; + goto insert; break; case STATE_POSTRUN: - /* assigne values */ - steps=POST_RELAX; - tau=POST_TAU; - /* check temperature */ - dt=md->t_avg-md->t_ref; - if(dt<0) - dt=-dt; - if(dt>POST_DELTA_TC) - break; - /* decrease temperature */ - hp->postrun_count+=1; - printf(" ### postrun (%d/%d) ###\n", - hp->postrun_count,POST_RUNS); - set_temperature(md,md->t_ref-POST_DT); - if(hp->postrun_count==POST_RUNS) - return 0; + goto postrun; break; default: - printf("[hook] FATAL (default case!?!)\n"); - break; + printf("[sic hook] unknown state\n"); + return -1; } + /* act according to state */ + +insert: + + /* assigne values */ + steps=INS_RELAX; + tau=INS_TAU; + + /* check temperature */ + dt=md->t_avg-md->t_ref; + dp=md->p_avg-md->p_ref; + if(dt<0) + dt=-dt; + if(dp<0) + dp=-dp; + if((dt>INS_DELTA_TC)|(dp>INS_DELTA_PC)) + goto addsched; + + /* immediately go on if no job is to be done */ + if(hp->insert_count==INS_RUNS) { + printf(" --- leaving insert state ---\n"); + hp->state=STATE_POSTRUN; + goto postrun; + } + + /* else -> insert atoms */ + hp->insert_count+=1; + printf(" ### insert atoms (%d/%d) ###\n", + hp->insert_count*INS_ATOMS,INS_RUNS*INS_ATOMS); + insert_atoms(md); + goto addsched; + +postrun: + + /* assigne values */ + steps=POST_RELAX; + tau=POST_TAU; + + /* check temperature */ + dt=md->t_avg-md->t_ref; + dp=md->p_avg-md->p_ref; + if(dt<0) + dt=-dt; + if(dp<0) + dp=-dp; + if((dt>POST_DELTA_TC)|(dp>POST_DELTA_PC)) + goto addsched; + + /* immediately return if no job is to be done */ + if(hp->postrun_count==POST_RUNS) { + printf(" --- leaving post run state ---\n"); + return 0; + } + + /* postrun action */ + hp->postrun_count+=1; + printf(" ### postrun (%d/%d) ###\n", + hp->postrun_count,POST_RUNS); + set_temperature(md,md->t_ref-POST_DT); + +addsched: + /* reset the average counters */ average_reset(md); @@ -379,7 +433,7 @@ int main(int argc,char **argv) { 0,LCNTX,LCNTY,LCNTZ,&r); r.x+=0.25*ALBE_LC_SIC; r.y=r.x; r.z=r.x; create_lattice(&md,FCC,ALBE_LC_SIC,C,M_C, - ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB, + ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB|ATOM_ATTR_VB, 1,LCNTX,LCNTY,LCNTZ,&r); #else r.x=0.5*0.25*TM_LC_SIC; r.y=r.x; r.z=r.x; @@ -430,14 +484,14 @@ int main(int argc,char **argv) { /* set temperature & pressure */ set_temperature(&md,atof(argv[2])+273.0); - set_pressure(&md,BAR); + set_pressure(&md,0.0); /* set amount of steps to skip before average calc */ set_avg_skip(&md,AVG_SKIP); /* set p/t scaling */ //set_pt_scale(&md,0,0,T_SCALE_BERENDSEN,100.0); - //set_pt_scale(&md,P_SCALE_BERENDSEN,0.001, + //set_pt_scale(&md,P_SCALE_BERENDSEN,0.01/(100*GPA), // T_SCALE_BERENDSEN,100.0); //set_pt_scale(&md,0,0,T_SCALE_DIRECT,1.0); //set_pt_scale(&md,P_SCALE_BERENDSEN,0.001,0,0); @@ -462,7 +516,8 @@ int main(int argc,char **argv) { moldyn_set_log(&md,LOG_TOTAL_ENERGY,LOG_E); moldyn_set_log(&md,LOG_TEMPERATURE,LOG_T); moldyn_set_log(&md,LOG_PRESSURE,LOG_P); - moldyn_set_log(&md,VISUAL_STEP,LOG_V); + moldyn_set_log(&md,LOG_VOLUME,LOG_V); + moldyn_set_log(&md,VISUAL_STEP,LOG_A); moldyn_set_log(&md,SAVE_STEP,LOG_S); moldyn_set_log(&md,CREATE_REPORT,0);