X-Git-Url: https://www.hackdaworld.org/gitweb/?a=blobdiff_plain;f=moldyn.c;h=551e07a89ea47bde8a3ad8439308f9a94a6f93e8;hb=72ce33393b80034e6407f506de88652895ffab23;hp=b6fa8d3df41dbf12e89c0596463a6cba4207255b;hpb=88ea16029cc07a837977f737f4536fa3e881dcee;p=physik%2Fposic.git diff --git a/moldyn.c b/moldyn.c index b6fa8d3..551e07a 100644 --- a/moldyn.c +++ b/moldyn.c @@ -17,20 +17,8 @@ #include "moldyn.h" -#include "math/math.h" -#include "init/init.h" -#include "random/random.h" -#include "visual/visual.h" -#include "list/list.h" - - int moldyn_init(t_moldyn *moldyn,int argc,char **argv) { - //int ret; - - //ret=moldyn_parse_argv(moldyn,argc,argv); - //if(ret<0) return ret; - memset(moldyn,0,sizeof(t_moldyn)); rand_init(&(moldyn->random),NULL,1); @@ -108,7 +96,7 @@ int set_dim(t_moldyn *moldyn,double x,double y,double z,u8 visualize) { moldyn->vis.dim.z=z; } - printf("[moldyn] dimensions in A and A^2 respectively:\n"); + printf("[moldyn] dimensions in A and A^3 respectively:\n"); printf(" x: %f\n",moldyn->dim.x); printf(" y: %f\n",moldyn->dim.y); printf(" z: %f\n",moldyn->dim.z); @@ -237,6 +225,10 @@ int moldyn_log_shutdown(t_moldyn *moldyn) { return 0; } +/* + * creating lattice functions + */ + int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass, u8 attr,u8 bnum,int a,int b,int c) { @@ -295,6 +287,90 @@ int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,double mass, return ret; } +/* fcc lattice init */ +int fcc_init(int a,int b,int c,double lc,t_atom *atom,t_3dvec *origin) { + + int count; + int i,j; + t_3dvec o,r,n; + t_3dvec basis[3]; + double help[3]; + double x,y,z; + + x=a*lc; + y=b*lc; + z=c*lc; + + if(origin) v3_copy(&o,origin); + else v3_zero(&o); + + /* construct the basis */ + for(i=0;i<3;i++) { + for(j=0;j<3;j++) { + if(i!=j) help[j]=0.5*lc; + else help[j]=.0; + } + v3_set(&basis[i],help); + } + + v3_zero(&r); + count=0; + + /* fill up the room */ + r.x=o.x; + while(r.xlc); @@ -571,8 +644,7 @@ int link_cell_init(t_moldyn *moldyn) { printf("[moldyn] initializing linked cells (%d)\n",lc->cells); for(i=0;icells;i++) - //list_init(&(lc->subcell[i]),1); - list_init(&(lc->subcell[i]),fd); + list_init_f(&(lc->subcell[i])); link_cell_update(moldyn); @@ -582,26 +654,30 @@ int link_cell_init(t_moldyn *moldyn) { int link_cell_update(t_moldyn *moldyn) { int count,i,j,k; - int nx,ny,nz; + int nx,ny; t_atom *atom; t_linkcell *lc; + double x,y,z; atom=moldyn->atom; lc=&(moldyn->lc); nx=lc->nx; ny=lc->ny; - nz=lc->nz; + + x=moldyn->dim.x/2; + y=moldyn->dim.y/2; + z=moldyn->dim.z/2; for(i=0;icells;i++) - list_destroy(&(moldyn->lc.subcell[i])); + list_destroy_f(&(lc->subcell[i])); for(count=0;countcount;count++) { - i=(atom[count].r.x+(moldyn->dim.x/2))/lc->x; - j=(atom[count].r.y+(moldyn->dim.y/2))/lc->y; - k=(atom[count].r.z+(moldyn->dim.z/2))/lc->z; - list_add_immediate_ptr(&(moldyn->lc.subcell[i+j*nx+k*nx*ny]), - &(atom[count])); + i=((atom[count].r.x+(moldyn->dim.x/2))/lc->x); + j=((atom[count].r.y+(moldyn->dim.y/2))/lc->y); + k=((atom[count].r.z+(moldyn->dim.z/2))/lc->z); + list_add_immediate_f(&(moldyn->lc.subcell[i+j*nx+k*nx*ny]), + &(atom[count])); } return 0; @@ -671,7 +747,9 @@ int link_cell_shutdown(t_moldyn *moldyn) { lc=&(moldyn->lc); for(i=0;inx*lc->ny*lc->nz;i++) - list_shutdown(&(moldyn->lc.subcell[i])); + list_destroy_f(&(moldyn->lc.subcell[i])); + + free(lc->subcell); return 0; } @@ -786,11 +864,7 @@ int moldyn_integrate(t_moldyn *moldyn) { if(moldyn->pt_scale&(T_SCALE_BERENDSEN|T_SCALE_DIRECT)) scale_velocity(moldyn,FALSE); if(moldyn->pt_scale&(P_SCALE_BERENDSEN|P_SCALE_DIRECT)) -{ -printf("going to do p scale ...\n"); scale_volume(moldyn); -printf("done\n"); -} /* check for log & visualization */ if(e) { @@ -869,16 +943,13 @@ int velocity_verlet(t_moldyn *moldyn) { v3_add(&(atom[i].r),&(atom[i].r),&delta); v3_scale(&delta,&(atom[i].f),0.5*tau_square/atom[i].mass); v3_add(&(atom[i].r),&(atom[i].r),&delta); -//if(i==5) printf("v: %f %f %f\n",atom[i].r.x,(atom[i].r.x+moldyn->dim.x/2)/moldyn->lc.x,2*atom[i].r.x/moldyn->dim.x); check_per_bound(moldyn,&(atom[i].r)); -//if(i==5) printf("n: %f %f %f\n",atom[i].r.x,(atom[i].r.x+moldyn->dim.x/2)/moldyn->lc.x,2*atom[i].r.x/moldyn->dim.x); /* velocities */ v3_scale(&delta,&(atom[i].f),0.5*tau/atom[i].mass); v3_add(&(atom[i].v),&(atom[i].v),&delta); } -//moldyn_bc_check(moldyn); /* neighbour list update */ link_cell_update(moldyn); @@ -930,6 +1001,9 @@ int potential_force_calc(t_moldyn *moldyn) { /* reset viral of atom i */ v3_zero(&(itom[i].virial)); + /* reset site energy */ + itom[i].e=0.0; + /* single particle potential/force */ if(itom[i].attr&ATOM_ATTR_1BP) moldyn->func1b(moldyn,&(itom[i])); @@ -950,7 +1024,7 @@ int potential_force_calc(t_moldyn *moldyn) { for(j=0;j<27;j++) { this=&(neighbour_i[j]); - list_reset(this); + list_reset_f(this); if(this->start==NULL) continue; @@ -985,7 +1059,7 @@ int potential_force_calc(t_moldyn *moldyn) { for(k=0;k<27;k++) { that=&(neighbour_i2[k]); - list_reset(that); + list_reset_f(that); if(that->start==NULL) continue; @@ -1011,7 +1085,7 @@ int potential_force_calc(t_moldyn *moldyn) { ktom, bc_ik|bc_ij); - } while(list_next(that)!=\ + } while(list_next_f(that)!=\ L_NO_NEXT_ELEMENT); } @@ -1023,7 +1097,7 @@ int potential_force_calc(t_moldyn *moldyn) { jtom,bc_ij); } - } while(list_next(this)!=L_NO_NEXT_ELEMENT); + } while(list_next_f(this)!=L_NO_NEXT_ELEMENT); } @@ -1036,7 +1110,7 @@ int potential_force_calc(t_moldyn *moldyn) { * periodic boundayr checking */ -int check_per_bound(t_moldyn *moldyn,t_3dvec *a) { +inline int check_per_bound(t_moldyn *moldyn,t_3dvec *a) { double x,y,z; t_3dvec *dim; @@ -1755,4 +1829,3 @@ x=dim->x/2; return 0; } -