X-Git-Url: https://www.hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=d52fcd3868c2481e70cbc804b5a9cdf92542708d;hb=180ff86ae35ca0ea6ee857e92e56120e65315d17;hp=505f4960a18037b6d043ddf0d7596625660b328a;hpb=7aface2e184e527132819f17b0fa18a6e1ba4bc3;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index 505f496..d52fcd3 100644 --- a/moldyn.c +++ b/moldyn.c @@ -41,8 +41,9 @@ int moldyn_init(t_moldyn *moldyn,int argc,char **argv) { int moldyn_shutdown(t_moldyn *moldyn) { - link_cell_shutdown(moldyn); + printf("[moldyn] shutdown\n"); moldyn_log_shutdown(moldyn); + link_cell_shutdown(moldyn); rand_close(&(moldyn->random)); free(moldyn->atom); @@ -92,6 +93,13 @@ int set_dim(t_moldyn *moldyn,double x,double y,double z,u8 visualize) { return 0; } +int set_nn_dist(t_moldyn *moldyn,double dist) { + + moldyn->nnd=dist; + + return 0; +} + int set_pbc(t_moldyn *moldyn,u8 x,u8 y,u8 z) { if(x) @@ -170,9 +178,10 @@ int moldyn_set_log(t_moldyn *moldyn,u8 type,char *fb,int timer) { int moldyn_log_shutdown(t_moldyn *moldyn) { + printf("[moldyn] log shutdown\n"); if(moldyn->efd) close(moldyn->efd); if(moldyn->mfd) close(moldyn->mfd); - if(moldyn->visual) visual_tini(moldyn->visual); + if(&(moldyn->vis)) visual_tini(&(moldyn->vis)); return 0; } @@ -183,17 +192,15 @@ int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass, int count; int ret; t_3dvec origin; - t_atom *atom; count=a*b*c; - atom=moldyn->atom; if(type==FCC) count*=4; if(type==DIAMOND) count*=8; - atom=malloc(count*sizeof(t_atom)); - if(atom==NULL) { + moldyn->atom=malloc(count*sizeof(t_atom)); + if(moldyn->atom==NULL) { perror("malloc (atoms)"); return -1; } @@ -202,10 +209,10 @@ int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass, switch(type) { case FCC: - ret=fcc_init(a,b,c,lc,atom,&origin); + ret=fcc_init(a,b,c,lc,moldyn->atom,&origin); break; case DIAMOND: - ret=diamond_init(a,b,c,lc,atom,&origin); + ret=diamond_init(a,b,c,lc,moldyn->atom,&origin); break; default: printf("unknown lattice type (%02x)\n",type); @@ -221,12 +228,13 @@ int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass, } moldyn->count=count; + printf("[moldyn] created lattice with %d atoms\n",count); while(count) { - atom[count-1].element=element; - atom[count-1].mass=mass; - atom[count-1].attr=attr; - atom[count-1].bnum=bnum; + moldyn->atom[count-1].element=element; + moldyn->atom[count-1].mass=mass; + moldyn->atom[count-1].attr=attr; + moldyn->atom[count-1].bnum=bnum; count-=1; } @@ -251,11 +259,12 @@ int add_atom(t_moldyn *moldyn,int element,double mass,u8 bnum,u8 attr, moldyn->atom=ptr; atom=moldyn->atom; - atom->r=*r; - atom->v=*v; - atom->element=element; - atom->bnum=bnum; - atom->attr=attr; + atom[count-1].r=*r; + atom[count-1].v=*v; + atom[count-1].element=element; + atom[count-1].mass=mass; + atom[count-1].bnum=bnum; + atom[count-1].attr=attr; return 0; } @@ -310,15 +319,15 @@ int thermal_init(t_moldyn *moldyn) { } /* velocity scaling */ - scale_velocity(moldyn); + scale_velocity(moldyn,VSCALE_INIT_EQUI); return 0; } -int scale_velocity(t_moldyn *moldyn) { +int scale_velocity(t_moldyn *moldyn,u8 type) { int i; - double e,c; + double e,scale; t_atom *atom; atom=moldyn->atom; @@ -326,12 +335,15 @@ int scale_velocity(t_moldyn *moldyn) { /* * - velocity scaling (E = 3/2 N k T), E: kinetic energy */ + e=0.0; for(i=0;icount;i++) e+=0.5*atom[i].mass*v3_absolute_square(&(atom[i].v)); - c=sqrt((2.0*e)/(3.0*moldyn->count*K_BOLTZMANN*moldyn->t)); + scale=(1.5*moldyn->count*K_BOLTZMANN*moldyn->t)/e; + if(type&VSCALE_INIT_EQUI) scale*=2.0; /* equipartition theorem */ + scale=sqrt(scale); for(i=0;icount;i++) - v3_scale(&(atom[i].v),&(atom[i].v),(1.0/c)); + v3_scale(&(atom[i].v),&(atom[i].v),scale); return 0; } @@ -382,15 +394,19 @@ t_3dvec get_total_p(t_moldyn *moldyn) { return p_total; } -double estimate_time_step(t_moldyn *moldyn,double nn_dist,double t) { +double estimate_time_step(t_moldyn *moldyn,double nn_dist) { double tau; - tau=0.05*nn_dist/(sqrt(3.0*K_BOLTZMANN*t/moldyn->atom[0].mass)); - tau*=1.0E-9; - if(tautau) - printf("[moldyn] warning: time step (%f > %.15f)\n", - moldyn->tau,tau); + /* nn_dist is the nearest neighbour distance */ + + if(moldyn->t==5.0) { + printf("[moldyn] i do not estimate timesteps below %f K!\n", + MOLDYN_CRITICAL_EST_TEMP); + return 23.42; + } + + tau=(0.05*nn_dist*moldyn->atom[0].mass)/sqrt(3.0*K_BOLTZMANN*moldyn->t); return tau; } @@ -582,11 +598,13 @@ int moldyn_integrate(t_moldyn *moldyn) { unsigned int e,m,s,v; t_3dvec p; t_moldyn_schedule *schedule; - + t_atom *atom; int fd; char fb[128]; + double ds; schedule=&(moldyn->schedule); + atom=moldyn->atom; /* initialize linked cell method */ link_cell_init(moldyn); @@ -604,6 +622,17 @@ int moldyn_integrate(t_moldyn *moldyn) { /* calculate initial forces */ potential_force_calc(moldyn); + /* do some checks before we actually start calculating bullshit */ + if(moldyn->cutoff>0.5*moldyn->dim.x) + printf("[moldyn] warning: cutoff > 0.5 x dim.x\n"); + if(moldyn->cutoff>0.5*moldyn->dim.y) + printf("[moldyn] warning: cutoff > 0.5 x dim.y\n"); + if(moldyn->cutoff>0.5*moldyn->dim.z) + printf("[moldyn] warning: cutoff > 0.5 x dim.z\n"); + ds=0.5*atom[0].f.x*moldyn->tau_square/atom[0].mass; + if(ds>0.05*moldyn->nnd) + printf("[moldyn] warning: forces too high / tau too small!\n"); + /* zero absolute time */ moldyn->time=0.0; @@ -695,7 +724,7 @@ int velocity_verlet(t_moldyn *moldyn) { v3_add(&(atom[i].r),&(atom[i].r),&delta); v3_scale(&delta,&(atom[i].f),0.5*tau_square/atom[i].mass); v3_add(&(atom[i].r),&(atom[i].r),&delta); - v3_per_bound(&(atom[i].r),&(moldyn->dim)); + check_per_bound(moldyn,&(atom[i].r)); /* velocities */ v3_scale(&delta,&(atom[i].f),0.5*tau/atom[i].mass); @@ -755,7 +784,7 @@ int potential_force_calc(t_moldyn *moldyn) { /* 2 body pair potential/force */ if(atom[i].attr&(ATOM_ATTR_2BP|ATOM_ATTR_3BP)) { - + link_cell_neighbour_index(moldyn, (atom[i].r.x+moldyn->dim.x/2)/lc->x, (atom[i].r.y+moldyn->dim.y/2)/lc->y, @@ -889,7 +918,6 @@ int harmonic_oscillator(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { v3_sub(&distance,&(ai->r),&(aj->r)); - v3_per_bound(&distance,&(moldyn->dim)); if(bc) check_per_bound(moldyn,&distance); d=v3_norm(&distance); if(d<=moldyn->cutoff) { @@ -933,7 +961,7 @@ int lennard_jones(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { d=+h1-h2; d*=eps; v3_scale(&force,&distance,d); - v3_add(&(ai->f),&(aj->f),&force); + v3_add(&(ai->f),&(ai->f),&force); } return 0;