X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=72a672ac500591dc39694549377cae6c4157d5b3;hb=45b27e01673a6cc5bebecb49c51d7f587917483e;hp=e96cdd4bd66e32632087321d07d12173024bec24;hpb=b040d775deb32173e6536464a3e2ad95a6a5bd55;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index e96cdd4..72a672a 100644 --- a/moldyn.c +++ b/moldyn.c @@ -9,9 +9,12 @@ #include #include +#include #include "math/math.h" #include "init/init.h" +#include "random/random.h" +#include "visual/visual.h" int create_lattice(unsigned char type,int element,double mass,double lc, @@ -63,37 +66,351 @@ int create_lattice(unsigned char type,int element,double mass,double lc, return ret; } -int thermal_init(t_atom *atom,int count,double t) { +int destroy_lattice(t_atom *atom) { + + if(atom) free(atom); + + return 0; +} + +int thermal_init(t_atom *atom,t_random *random,int count,double t) { /* * - gaussian distribution of velocities + * - zero total momentum * - velocity scaling (E = 3/2 N k T), E: kinetic energy */ int i; - double e,c,v; - - e=.0; + double v,sigma; + t_3dvec p_total,delta; + /* gaussian distribution of velocities */ + v3_zero(&p_total); for(i=0;ipotential(moldyn)); +} + +double get_total_energy(t_moldyn *moldyn) { + + double e; + + e=get_e_kin(moldyn->atom,moldyn->count); + e+=get_e_pot(moldyn); + + return e; +} + +t_3dvec get_total_p(t_atom *atom, int count) { + + t_3dvec p,p_total; + int i; + + v3_zero(&p_total); + for(i=0;iatom[0].mass)); + tau*=1.0E-9; + if(tautau) + printf("[moldyn] warning: time step (%f > %.15f)\n", + moldyn->tau,tau); + + return tau; +} + + +/* + * + * 'integration of newtons equation' - algorithms + * + */ + +/* start the integration */ + +int moldyn_integrate(t_moldyn *moldyn) { + + int i; + int write; + + write=moldyn->write; + + /* calculate initial forces */ + moldyn->force(moldyn); + + for(i=0;itime_steps;i++) { + /* integration step */ + moldyn->integrate(moldyn); + + /* check for visualiziation */ + if(!(i%write)) { + visual_atoms(moldyn->visual,i*moldyn->tau, + moldyn->atom,moldyn->count); + } + } + + return 0; +} + +/* velocity verlet */ + +int velocity_verlet(t_moldyn *moldyn) { + + int i,count; + double tau,tau_square; + t_3dvec delta; + t_atom *atom; + + atom=moldyn->atom; + count=moldyn->count; + tau=moldyn->tau; + + tau_square=tau*tau; + + for(i=0;idim)); + + /* velocities */ + v3_scale(&delta,&(atom[i].f),0.5*tau/atom[i].mass); + v3_add(&(atom[i].v),&(atom[i].v),&delta); + } + + /* forces depending on chosen potential */ + moldyn->force(moldyn); + + for(i=0;ipot_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) { + + t_lj_params *params; + t_atom *atom; + int i,j; + int count; + t_3dvec distance; + double d,help; + double u; + double eps,sig6,sig12; + + params=moldyn->pot_params; + atom=moldyn->atom; + count=moldyn->count; + eps=params->epsilon; + sig6=params->sigma6; + sig12=params->sigma12; + + u=0.0; + for(i=0;iatom; + count=moldyn->count; + params=moldyn->pot_params; + eps=params->epsilon; + sig6=params->sigma6; + sig12=params->sigma12; + + for(i=0;idim)); + d=v3_absolute_square(&distance); + if(d<=moldyn->cutoff_square) { + h1=1.0/d; /* 1/r^2 */ + d=h1*h1; /* 1/r^4 */ + h2=d*d; /* 1/r^8 */ + h1*=d; /* 1/r^6 */ + h1*=h2; /* 1/r^14 */ + h1*=sig12; + h2*=sig6; + d=12.0*h1-6.0*h2; + d*=eps; + v3_scale(&force,&distance,d); + v3_add(&(atom[j].f),&(atom[j].f),&force); + v3_sub(&(atom[i].f),&(atom[i].f),&force); + } + } + } return 0; }