X-Git-Url: https://hackdaworld.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=moldyn.c;h=aec87f66dc31fd845a73e9466de17fa95dc9e021;hb=390cbe35b27e4fb6766827a5e6b85903142e8a65;hp=08901c783452a006b638787351b735e20e2a56c3;hpb=3961d57b84198e336085fd79263fec40837066a0;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index 08901c7..aec87f6 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,10 +214,11 @@ int moldyn_integrate(t_moldyn *moldyn) { moldyn->integrate(moldyn); /* check for visualiziation */ - // to be continued ... - if(!(i%100)) + if(!(i%write)) { visual_atoms(moldyn->visual,i*moldyn->tau, moldyn->atom,moldyn->count); + printf("finished %d / %d\n",i,moldyn->time_steps); + } } return 0; @@ -232,7 +249,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 */ @@ -254,6 +271,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) { @@ -321,7 +404,7 @@ int force_lennard_jones(t_moldyn *moldyn) { h1*=h2; /* 1/r^14 */ h1*=sig12; h2*=sig6; - d=-12.0*h1+6.0*h2; + d=12.0*h1-6.0*h2; d*=eps; v3_scale(&force,&distance,d); v3_add(&(atom[j].f),&(atom[j].f),&force);