X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=7f9745ad29ef2f8e7dd52a52301a4f0a05ad0283;hb=bdb198c5a5fe38361d10f98e7db366b0915e56fb;hp=f2ac637e64dfeb99ba82946b70a6242175ade88f;hpb=792f14f95b47989f7f12df0ea70b54619be016ee;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index f2ac637..7f9745a 100644 --- a/moldyn.c +++ b/moldyn.c @@ -30,9 +30,10 @@ int moldyn_usage(char **argv) { printf("-M (log total momentum)\n"); printf("-D (dump total information)\n"); printf("-S (single save file)\n"); + printf("-V (rasmol file)\n"); printf("--- physics options ---\n"); printf("-T [K] (%f)\n",MOLDYN_TEMP); - printf("-t [s] (%f)\n",MOLDYN_TAU); + printf("-t [s] (%.15f)\n",MOLDYN_TAU); printf("-R (%d)\n",MOLDYN_RUNS); printf("\n"); @@ -70,9 +71,13 @@ int moldyn_parse_argv(t_moldyn *moldyn,int argc,char **argv) { moldyn->swrite=atoi(argv[++i]); strncpy(moldyn->sfb,argv[++i],64); break; - case 'T': + case 'V': + moldyn->vwrite=atoi(argv[++i]); + strncpy(moldyn->vfb,argv[++i],64); break; + case 'T': moldyn->t=atof(argv[++i]); + break; case 't': moldyn->tau=atof(argv[++i]); break; @@ -93,9 +98,12 @@ int moldyn_parse_argv(t_moldyn *moldyn,int argc,char **argv) { return 0; } -int moldyn_log_init(t_moldyn *moldyn) { +int moldyn_log_init(t_moldyn *moldyn,void *v) { moldyn->lvstat=0; + t_visual *vis; + + vis=v; if(moldyn->ewrite) { moldyn->efd=open(moldyn->efb,O_WRONLY|O_CREAT|O_TRUNC); @@ -130,8 +138,23 @@ int moldyn_log_init(t_moldyn *moldyn) { moldyn->lvstat|=MOLDYN_LVSTAT_DUMP; } - if(moldyn->dwrite) + if((moldyn->vwrite)&&(vis)) { + moldyn->visual=vis; + visual_init(vis,moldyn->vfb); moldyn->lvstat|=MOLDYN_LVSTAT_VISUAL; + } + + moldyn->lvstat|=MOLDYN_LVSTAT_INITIALIZED; + + return 0; +} + +int moldyn_shutdown(t_moldyn *moldyn) { + + if(moldyn->efd) close(moldyn->efd); + if(moldyn->mfd) close(moldyn->efd); + if(moldyn->dfd) close(moldyn->efd); + if(moldyn->visual) visual_tini(moldyn->visual); return 0; } @@ -328,7 +351,6 @@ int moldyn_integrate(t_moldyn *moldyn) { int i; unsigned int e,m,s,d,v; - unsigned char lvstat; t_3dvec p; int fd; @@ -340,7 +362,7 @@ int moldyn_integrate(t_moldyn *moldyn) { d=moldyn->dwrite; v=moldyn->vwrite; - if(!(lvstat&MOLDYN_LVSTAT_INITIALIZED)) { + if(!(moldyn->lvstat&MOLDYN_LVSTAT_INITIALIZED)) { printf("[moldyn] warning, lv system not initialized\n"); return -1; } @@ -498,7 +520,7 @@ int force_harmonic_oscillator(t_moldyn *moldyn) { d=v3_norm(&distance); if(d<=moldyn->cutoff) { v3_scale(&force,&distance, - (-sc*(1.0-(equi_dist/d)))); + -sc*(1.0-(equi_dist/d))); v3_add(&(atom[i].f),&(atom[i].f),&force); v3_sub(&(atom[j].f),&(atom[j].f),&force); } @@ -525,19 +547,19 @@ double potential_lennard_jones(t_moldyn *moldyn) { params=moldyn->pot_params; atom=moldyn->atom; count=moldyn->count; - eps=params->epsilon; + eps=params->epsilon4; 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; + eps=params->epsilon4; + sig6=6*params->sigma6; + sig12=12*params->sigma12; for(i=0;idim)); d=v3_absolute_square(&distance); if(d<=moldyn->cutoff_square) { @@ -576,11 +598,13 @@ int force_lennard_jones(t_moldyn *moldyn) { h1*=h2; /* 1/r^14 */ h1*=sig12; h2*=sig6; - d=12.0*h1-6.0*h2; + /* actually there would be a '-', * + * but f=-d/dr potential */ + d=h1+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); + v3_add(&(atom[i].f),&(atom[i].f),&force); + v3_sub(&(atom[j].f),&(atom[j].f),&force); } } }