X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=72a672ac500591dc39694549377cae6c4157d5b3;hb=45b27e01673a6cc5bebecb49c51d7f587917483e;hp=3d669d223401ddd8fe9277e9ea07654186e7018e;hpb=83775c491117faa149281d0302fc8b8064d6b080;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index 3d669d2..72a672a 100644 --- a/moldyn.c +++ b/moldyn.c @@ -177,6 +177,19 @@ t_3dvec get_total_p(t_atom *atom, int count) { return p_total; } +double estimate_time_step(t_moldyn *moldyn,double nn_dist,double t) { + + 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); + + return tau; +} + /* * @@ -189,6 +202,9 @@ t_3dvec get_total_p(t_atom *atom, int count) { int moldyn_integrate(t_moldyn *moldyn) { int i; + int write; + + write=moldyn->write; /* calculate initial forces */ moldyn->force(moldyn); @@ -198,8 +214,7 @@ int moldyn_integrate(t_moldyn *moldyn) { moldyn->integrate(moldyn); /* check for visualiziation */ - // to be continued ... - if(!(i%1)) { + if(!(i%write)) { visual_atoms(moldyn->visual,i*moldyn->tau, moldyn->atom,moldyn->count); } @@ -233,7 +248,7 @@ int velocity_verlet(t_moldyn *moldyn) { /* velocities */ v3_scale(&delta,&(atom[i].f),0.5*tau/atom[i].mass); - v3_add(&(atom[i].r),&(atom[i].r),&delta); + v3_add(&(atom[i].v),&(atom[i].v),&delta); } /* forces depending on chosen potential */ @@ -255,6 +270,72 @@ int velocity_verlet(t_moldyn *moldyn) { * */ +/* harmonic oscillator potential and force */ + +double potential_harmonic_oscillator(t_moldyn *moldyn) { + + t_ho_params *params; + t_atom *atom; + int i,j; + int count; + t_3dvec distance; + double d,u; + double sc,equi_dist; + + params=moldyn->pot_params; + atom=moldyn->atom; + sc=params->spring_constant; + equi_dist=params->equilibrium_distance; + count=moldyn->count; + + u=0.0; + for(i=0;iatom; + count=moldyn->count; + params=moldyn->pot_params; + sc=params->spring_constant; + equi_dist=params->equilibrium_distance; + + for(i=0;idim)); + d=v3_norm(&distance); + if(d<=moldyn->cutoff) { + v3_scale(&force,&distance, + (-sc*(1.0-(equi_dist/d)))); + v3_add(&(atom[i].f),&(atom[i].f),&force); + v3_sub(&(atom[j].f),&(atom[j].f),&force); + } + } + } + + return 0; +} + + /* lennard jones potential & force for one sort of atoms */ double potential_lennard_jones(t_moldyn *moldyn) {