X-Git-Url: https://www.hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=881f0b698565fe7495ee151ecca63239d32e74cf;hb=c0ddf2bdd8067456f39f6b63fe2261624ebde6b7;hp=817a72788b45f2572258873aaa8ca64cace0397f;hpb=f3e4193447ac49a8953515910d4b4e6ce2c7608b;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index 817a727..881f0b6 100644 --- a/moldyn.c +++ b/moldyn.c @@ -16,6 +16,7 @@ #include #include "moldyn.h" +#include "report/report.h" int moldyn_init(t_moldyn *moldyn,int argc,char **argv) { @@ -343,7 +344,10 @@ int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass, switch(type) { case CUBIC: - ret=cubic_init(a,b,c,lc,atom,NULL); + origin.x=0.5*lc; + origin.y=0.5*lc; + origin.z=0.5*lc; + ret=cubic_init(a,b,c,lc,atom,&origin); break; case FCC: ret=fcc_init(a,b,c,lc,atom,NULL); @@ -398,8 +402,8 @@ int cubic_init(int a,int b,int c,double lc,t_atom *atom,t_3dvec *origin) { for(i=0;iatom; - - double_ekin=0; - for(i=0;icount;i++) - double_ekin+=atom[i].mass*v3_absolute_square(&(atom[i].v)); + /* assume up to date kinetic energy, which is 3/2 N k_B T */ - /* kinetic energy = 3/2 N k_B T */ - moldyn->t=double_ekin/(3.0*K_BOLTZMANN*moldyn->count); + moldyn->t=(2.0*moldyn->ekin)/(3.0*K_BOLTZMANN*moldyn->count); return moldyn->t; } @@ -682,16 +677,21 @@ double pressure_calc(t_moldyn *moldyn) { double v; t_virial *virial; + /* + * P = 1/(3V) sum_i ( p_i^2 / 2m + f_i r_i ) + * + * virial = f_i r_i + */ + v=0.0; for(i=0;icount;i++) { virial=&(moldyn->atom[i].virial); v+=(virial->xx+virial->yy+virial->zz); } - v*=ONE_THIRD; -printf("kieck mal: %f %f %f\n",v,moldyn->count*K_BOLTZMANN*moldyn->t,v/moldyn->count); - moldyn->p=moldyn->count*K_BOLTZMANN*moldyn->t+v; - moldyn->p/=moldyn->volume; + /* assume up to date kinetic energy */ + moldyn->p=2.0*moldyn->ekin+v; + moldyn->p/=(3.0*moldyn->volume); return moldyn->p; } @@ -1152,8 +1152,10 @@ int moldyn_integrate(t_moldyn *moldyn) { /* energy scaling factor */ energy_scale=moldyn->count*EV; +printf("debug: %f\n",moldyn->atom[0].f.x); /* calculate initial forces */ potential_force_calc(moldyn); +printf("debug: %f\n",moldyn->atom[0].f.x); /* some stupid checks before we actually start calculating bullshit */ if(moldyn->cutoff>0.5*moldyn->dim.x) @@ -1196,6 +1198,7 @@ int moldyn_integrate(t_moldyn *moldyn) { if(moldyn->pt_scale&(P_SCALE_BERENDSEN|P_SCALE_DIRECT)) scale_volume(moldyn); + update_e_kin(moldyn); temperature_calc(moldyn); pressure_calc(moldyn); //thermodynamic_pressure_calc(moldyn); @@ -1203,7 +1206,6 @@ int moldyn_integrate(t_moldyn *moldyn) { /* check for log & visualization */ if(e) { if(!(i%e)) - update_e_kin(moldyn); dprintf(moldyn->efd, "%f %f %f %f\n", moldyn->time,moldyn->ekin/energy_scale, @@ -1235,8 +1237,8 @@ int moldyn_integrate(t_moldyn *moldyn) { if(!(i%v)) { visual_atoms(&(moldyn->vis),moldyn->time, moldyn->atom,moldyn->count); - printf("\rsched: %d, steps: %d, debug: %f | %f", - sched->count,i,moldyn->p/ATM,moldyn->debug/ATM); + printf("\rsched: %d, steps: %d, debug: %f", + sched->count,i,moldyn->p/ATM); fflush(stdout); } } @@ -1580,7 +1582,7 @@ int lennard_jones(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) { d*=eps; v3_scale(&force,&distance,d); v3_add(&(aj->f),&(aj->f),&force); - v3_scale(&force,&distance,-1.0*d); /* f = - grad E */ + v3_scale(&force,&force,-1.0); /* f = - grad E */ v3_add(&(ai->f),&(ai->f),&force); virial_calc(ai,&force,&distance); virial_calc(aj,&force,&distance); /* f and d signe switched */