X-Git-Url: https://hackdaworld.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=moldyn.c;h=3424d4946b18e4f74185554bb71cb9c7e58893c3;hb=2a902b8d09fd57bc20681448774e2f93894f10aa;hp=707fe032e2e51f87a13800e717f33a461f5e85b7;hpb=c38fe34069adb9697683235f8b1e2311a3122e8f;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index 707fe03..3424d49 100644 --- a/moldyn.c +++ b/moldyn.c @@ -456,8 +456,8 @@ int link_cell_init(t_moldyn *moldyn) { printf("initializing linked cells (%d)\n",lc->cells); for(i=0;icells;i++) - list_init(&(lc->subcell[i]),1); - //list_init(&(lc->subcell[i]),lc->listfd); + //list_init(&(lc->subcell[i]),1); + list_init(&(lc->subcell[i])); link_cell_update(moldyn); @@ -512,7 +512,6 @@ int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,t_list *cell) { cell[0]=lc->subcell[i+j*nx+k*a]; - printf("%d\n",i+j*nx+k*a); for(ci=-1;ci<=1;ci++) { bx=0; x=i+ci; @@ -535,16 +534,11 @@ int link_cell_neighbour_index(t_moldyn *moldyn,int i,int j,int k,t_list *cell) { bz=1; } if(!(ci|cj|ck)) continue; - printf(" %d %d %d \n",x,y,z); if(bx|by|bz) { cell[--count2]=lc->subcell[x+y*nx+z*a]; - printf("%d\n",x+y*nx+z*a); - printf("--- %d\n",count2); } else { cell[count1++]=lc->subcell[x+y*nx+z*a]; - printf("%d\n",x+y*nx+z*a); - printf("--- %d\n",count1); } } } @@ -585,6 +579,9 @@ int moldyn_integrate(t_moldyn *moldyn) { int fd; char fb[128]; + /* initialize linked cell method */ + link_cell_init(moldyn); + /* logging & visualization */ e=moldyn->ewrite; m=moldyn->mwrite; @@ -606,9 +603,6 @@ int moldyn_integrate(t_moldyn *moldyn) { for(i=0;itime_steps;i++) { - /* neighbour list update */ - link_cell_update(moldyn); - /* integration step */ moldyn->integrate(moldyn); @@ -686,8 +680,15 @@ int velocity_verlet(t_moldyn *moldyn) { v3_add(&(atom[i].v),&(atom[i].v),&delta); } + /* neighbour list update */ +printf("list update ...\n"); + link_cell_update(moldyn); +printf("done\n"); + /* forces depending on chosen potential */ +printf("calc potential/force ...\n"); moldyn->potential_force_function(moldyn); +printf("done\n"); for(i=0;iequilibrium_distance; count=moldyn->count; + /* reset energy counter */ u=0.0; + for(i=0;idim.x/2))/lc->x; nj=(atom[i].r.y+(moldyn->dim.y/2))/lc->y; nk=(atom[i].r.z+(moldyn->dim.z/2))/lc->z; - printf("%d %d %d\n",ni,nj,nk); c=link_cell_neighbour_index(moldyn,ni,nj,nk,neighbour); - /* processing cell of atom i */ + /* + * processing cell of atom i + * => no need to check for empty list (1 element at minimum) + */ this=&(neighbour[0]); - list_reset(this); /* list has 1 element at minimum */ + list_reset(this); do { btom=this->current->data; if(btom==&(atom[i])) continue; v3_sub(&distance,&(atom[i].r),&(btom->r)); d=v3_norm(&distance); - u+=(0.5*sc*(d-equi_dist)*(d-equi_dist)); - v3_scale(&force,&distance,-sc*(1.0-(equi_dist/d))); - v3_add(&(atom[i].f),&(atom[i].f),&force); + if(d<=moldyn->cutoff) { + u+=(0.5*sc*(d-equi_dist)*(d-equi_dist)); + v3_scale(&force,&distance, + -sc*(1.0-(equi_dist/d))); + v3_add(&(atom[i].f),&(atom[i].f),&force); + } } while(list_next(this)!=L_NO_NEXT_ELEMENT); - /* neighbours not doing boundary condition overflow */ + /* + * direct neighbour cells + * => no boundary condition check necessary + */ for(j=1;j check boundary conditions + */ for(j=c;j<27;j++) { this=&(neighbour[j]); list_reset(this); /* check boundary conditions */ @@ -796,7 +813,7 @@ int harmonic_oscillator(t_moldyn *moldyn) { } } - moldyn->energy=u; + moldyn->energy=0.5*u; return 0; } @@ -824,18 +841,18 @@ int lennard_jones(t_moldyn *moldyn) { sig6=params->sigma6; sig12=params->sigma12; + /* reset energy counter */ u=0.0; + for(i=0;idim.x/2))/lc->x; nj=(atom[i].r.y+(moldyn->dim.y/2))/lc->y; nk=(atom[i].r.z+(moldyn->dim.z/2))/lc->z; - printf("hier atom = %08x\n",&(atom[i])); c=link_cell_neighbour_index(moldyn,ni,nj,nk,neighbour); - printf("da atom = %08x\n",&(atom[i])); - printf("da atom = %08x\n",&(moldyn->atom[i])); - - printf("c = %d (%d %d %d)\n",c,ni,nj,nk); /* processing cell of atom i */ this=&(neighbour[0]); @@ -844,23 +861,23 @@ int lennard_jones(t_moldyn *moldyn) { btom=this->current->data; if(btom==&(atom[i])) continue; - puts("foo"); v3_sub(&distance,&(atom[i].r),&(btom->r)); - puts("foo"); - d=1.0/v3_absolute_square(&distance); /* 1/r^2 */ - h1=d*d; /* 1/r^4 */ - h2*=d; /* 1/r^6 */ - h1=h2*h2; /* 1/r^12 */ - u+=eps*(sig12*h1-sig6*h2); - h2*=d; /* 1/r^8 */ - h1*=d; /* 1/r^14 */ - h2*=6*sig6; - h1*=12*sig12; - d=-h1+h2; - d*=eps; - v3_scale(&force,&distance,d); - v3_add(&(atom[i].f),&(atom[i].f),&force); - printf("test!!\n"); + d=v3_absolute_square(&distance); /* 1/r^2 */ + if(d<=moldyn->cutoff_square) { + d=1.0/d; /* 1/r^2 */ + h2=d*d; /* 1/r^4 */ + h2*=d; /* 1/r^6 */ + h1=h2*h2; /* 1/r^12 */ + u+=eps*(sig12*h1-sig6*h2); + h2*=d; /* 1/r^8 */ + h1*=d; /* 1/r^14 */ + h2*=6*sig6; + h1*=12*sig12; + d=+h1-h2; + d*=eps; + v3_scale(&force,&distance,d); + v3_add(&(atom[i].f),&(atom[i].f),&force); + } } while(list_next(this)!=L_NO_NEXT_ELEMENT); /* neighbours not doing boundary condition overflow */ @@ -870,13 +887,12 @@ int lennard_jones(t_moldyn *moldyn) { if(this->start!=NULL) { do { - printf("in bound: %d\n",j); btom=this->current->data; v3_sub(&distance,&(atom[i].r),&(btom->r)); d=v3_absolute_square(&distance); /* r^2 */ if(d<=moldyn->cutoff_square) { d=1.0/d; /* 1/r^2 */ - h1=d*d; /* 1/r^4 */ + h2=d*d; /* 1/r^4 */ h2*=d; /* 1/r^6 */ h1=h2*h2; /* 1/r^12 */ u+=eps*(sig12*h1-sig6*h2); @@ -884,7 +900,7 @@ int lennard_jones(t_moldyn *moldyn) { h1*=d; /* 1/r^14 */ h2*=6*sig6; h1*=12*sig12; - d=-h1+h2; + d=+h1-h2; d*=eps; v3_scale(&force,&distance,d); v3_add(&(atom[i].f),&(atom[i].f), @@ -902,14 +918,13 @@ int lennard_jones(t_moldyn *moldyn) { if(this->start!=NULL) { do { - printf("out bound: %d\n",j); btom=this->current->data; v3_sub(&distance,&(atom[i].r),&(btom->r)); v3_per_bound(&distance,&(moldyn->dim)); d=v3_absolute_square(&distance); /* r^2 */ if(d<=moldyn->cutoff_square) { d=1.0/d; /* 1/r^2 */ - h1=d*d; /* 1/r^4 */ + h2=d*d; /* 1/r^4 */ h2*=d; /* 1/r^6 */ h1=h2*h2; /* 1/r^12 */ u+=eps*(sig12*h1-sig6*h2); @@ -917,7 +932,7 @@ int lennard_jones(t_moldyn *moldyn) { h1*=d; /* 1/r^14 */ h2*=6*sig6; h1*=12*sig12; - d=-h1+h2; + d=+h1-h2; d*=eps; v3_scale(&force,&distance,d); v3_add(&(atom[i].f),&(atom[i].f), @@ -929,8 +944,275 @@ int lennard_jones(t_moldyn *moldyn) { } } - moldyn->energy=u; + moldyn->energy=0.5*u; return 0; } +/* tersoff potential & force for 2 sorts of atoms */ + +int tersoff(t_moldyn *moldyn) { + + t_tersoff_params *params; + t_atom *atom,*btom,*ktom; + t_linkcell *lc; + t_list *this,*thisk,neighbour[27],neighbourk[27]; + int i,j,k,c,ck; + int count; + double u; + int ni,nj,nk; + int ki,kj,kk; + + + params=moldyn->pot_params; + atom=moldyn->atom; + lc=&(moldyn->lc); + count=moldyn->count; + + /* reset enrgy counter */ + u=0.0; + + for(i=0;idim.x/2))/lc->x; + nj=(atom[i].r.y+(moldyn->dim.y/2))/lc->y; + nk=(atom[i].r.z+(moldyn->dim.z/2))/lc->z; + c=link_cell_neighbour_index(moldyn,ni,nj,nk,neighbour); + + /* + * processing cell of atom i + * => no need to check for empty list (1 element at minimum) + */ + this=&(neighbour[0]); + list_reset(this); + do { + btom=this->current->data; + if(btom==&(atom[i])) + continue; + + /* 2 body stuff */ + + /* determine cell neighbours of btom */ + ki=(btom->r.x+(moldyn->dim.x/2))/lc->x; + kj=(btom->r.y+(moldyn->dim.y/2))/lc->y; + kk=(btom->r.z+(moldyn->dim.z/2))/lc->z; + ck=link_cell_neighbour_index(moldyn,ki,kj,kk, + neighbourk); + + /* cell of btom */ + thisk=&(neighbourk[0]); + list_reset(thisk); + do { + ktom=thisk->current->data; + if(ktom==btom) + continue; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (1) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + /* direct neighbours of btom cell */ + for(k=1;kstart!=NULL) { + + do { + ktom=thisk->current->data; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (2) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + } + } + + /* indirect neighbours of btom cell */ + for(k=ck;k<27;k++) { + thisk=&(neighbourk[k]); + list_reset(thisk); + if(thisk->start!=NULL) { + + do { + ktom=thisk->current->data; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + } + } + + + } while(list_next(this)!=L_NO_NEXT_ELEMENT); + + /* + * direct neighbour cells of atom i + */ + for(j=1;jstart!=NULL) { + + do { + btom=this->current->data; + + /* 2 body stuff */ + + + /* determine cell neighbours of btom */ + ki=(btom->r.x+(moldyn->dim.x/2))/lc->x; + kj=(btom->r.y+(moldyn->dim.y/2))/lc->y; + kk=(btom->r.z+(moldyn->dim.z/2))/lc->z; + ck=link_cell_neighbour_index(moldyn,ki,kj,kk, + neighbourk); + + /* cell of btom */ + thisk=&(neighbourk[0]); + list_reset(thisk); + do { + ktom=thisk->current->data; + if(ktom==btom) + continue; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (1) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + /* direct neighbours of btom cell */ + for(k=1;kstart!=NULL) { + + do { + ktom=thisk->current->data; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (2) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + } + } + + /* indirect neighbours of btom cell */ + for(k=ck;k<27;k++) { + thisk=&(neighbourk[k]); + list_reset(thisk); + if(thisk->start!=NULL) { + + do { + ktom=thisk->current->data; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (3) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + } + } + + + } while(list_next(this)!=L_NO_NEXT_ELEMENT); + + } + } + + /* + * indirect neighbour cells of atom i + */ + for(j=c;j<27;j++) { + this=&(neighbour[j]); + list_reset(this); + if(this->start!=NULL) { + + do { + btom=this->current->data; + + /* 2 body stuff */ + + + /* determine cell neighbours of btom */ + ki=(btom->r.x+(moldyn->dim.x/2))/lc->x; + kj=(btom->r.y+(moldyn->dim.y/2))/lc->y; + kk=(btom->r.z+(moldyn->dim.z/2))/lc->z; + ck=link_cell_neighbour_index(moldyn,ki,kj,kk, + neighbourk); + + /* cell of btom */ + thisk=&(neighbourk[0]); + list_reset(thisk); + do { + ktom=thisk->current->data; + if(ktom==btom) + continue; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (1) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + /* direct neighbours of btom cell */ + for(k=1;kstart!=NULL) { + + do { + ktom=thisk->current->data; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (2) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + } + } + + /* indirect neighbours of btom cell */ + for(k=ck;k<27;k++) { + thisk=&(neighbourk[k]); + list_reset(thisk); + if(thisk->start!=NULL) { + + do { + ktom=thisk->current->data; + if(ktom==&(atom[i])) + continue; + + /* 3 body stuff (3) */ + + } while(list_next(thisk)!=L_NO_NEXT_ELEMENT); + + } + } + + + } while(list_next(this)!=L_NO_NEXT_ELEMENT); + + } + } + + } + + moldyn->energy=0.5*u; + + return 0; +} +