#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;
return 0;
}
+int set_pressure(t_moldyn *moldyn,double p_ref) {
+
+ moldyn->p_ref=p_ref;
+
+ return 0;
+}
+
int set_pt_scale(t_moldyn *moldyn,u8 ptype,double ptc,u8 ttype,double ttc) {
moldyn->pt_scale=(ptype|ttype);
moldyn->dim.y=y;
moldyn->dim.z=z;
+ moldyn->volume=x*y*z;
+
if(visualize) {
moldyn->vis.dim.x=x;
moldyn->vis.dim.y=y;
moldyn->vis.dim.z=z;
}
- printf("[moldyn] dimensions in A:\n");
+ printf("[moldyn] dimensions in A and A^2 respectively:\n");
printf(" x: %f\n",moldyn->dim.x);
printf(" y: %f\n",moldyn->dim.y);
printf(" z: %f\n",moldyn->dim.z);
+ printf(" volume: %f\n",moldyn->volume);
printf(" visualize simulation box: %s\n",visualize?"on":"off");
return 0;
count+=1;
}
}
- if(count!=0) moldyn->t=(2.0*e)/(3.0*count*K_BOLTZMANN);
+ if(count!=0) moldyn->t=e/(1.5*count*K_BOLTZMANN);
else return 0; /* no atoms involved in scaling! */
/* (temporary) hack for e,t = 0 */
return 0;
}
+int scale_volume(t_moldyn *moldyn) {
+
+ t_atom *atom;
+ t_3dvec *dim,*vdim;
+ double virial,scale;
+ t_linkcell *lc;
+ int i;
+
+ atom=moldyn->atom;
+ dim=&(moldyn->dim);
+ vdim=&(moldyn->vis.dim);
+ lc=&(moldyn->lc);
+
+ for(i=0;i<moldyn->count;i++)
+ virial+=v3_norm(&(atom[i].virial));
+
+printf("%f\n",virial);
+ /* get pressure from virial */
+ moldyn->p=moldyn->count*K_BOLTZMANN*moldyn->t-ONE_THIRD*virial;
+ moldyn->p/=moldyn->volume;
+printf("%f\n",moldyn->p/(ATM));
+
+ /* scale factor */
+ if(moldyn->pt_scale&P_SCALE_BERENDSEN)
+ scale=3*sqrt(1-(moldyn->p_ref-moldyn->p)/moldyn->p_tc);
+ else
+ /* should actually never be used */
+ scale=pow(moldyn->p/moldyn->p_ref,1.0/3.0);
+
+printf("scale = %f\n",scale);
+ /* actual scaling */
+ dim->x*=scale;
+ dim->y*=scale;
+ dim->z*=scale;
+ if(vdim->x) vdim->x=dim->x;
+ if(vdim->y) vdim->y=dim->y;
+ if(vdim->z) vdim->z=dim->z;
+ moldyn->volume*=(scale*scale*scale);
+
+ /* check whether we need a new linkcell init */
+ if((dim->x/moldyn->cutoff!=lc->nx)||
+ (dim->y/moldyn->cutoff!=lc->ny)||
+ (dim->z/moldyn->cutoff!=lc->nx)) {
+ link_cell_shutdown(moldyn);
+ link_cell_init(moldyn);
+ }
+
+ return 0;
+
+}
+
double get_e_kin(t_moldyn *moldyn) {
int i;
t_linkcell *lc;
int i;
- int fd;
-
- fd=open("/dev/null",O_WRONLY);
lc=&(moldyn->lc);
printf("[moldyn] initializing linked cells (%d)\n",lc->cells);
for(i=0;i<lc->cells;i++)
- //list_init(&(lc->subcell[i]),1);
- list_init(&(lc->subcell[i]),fd);
+ list_init_f(&(lc->subcell[i]));
link_cell_update(moldyn);
nz=lc->nz;
for(i=0;i<lc->cells;i++)
- list_destroy(&(moldyn->lc.subcell[i]));
+ list_destroy_f(&(moldyn->lc.subcell[i]));
for(count=0;count<moldyn->count;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]));
+ list_add_immediate_f(&(moldyn->lc.subcell[i+j*nx+k*nx*ny]),
+ &(atom[count]));
}
return 0;
lc=&(moldyn->lc);
for(i=0;i<lc->nx*lc->ny*lc->nz;i++)
- list_shutdown(&(moldyn->lc.subcell[i]));
+ list_destroy_f(&(moldyn->lc.subcell[i]));
+
+ free(lc->subcell);
return 0;
}
/* p/t scaling */
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) {
/* reset energy */
moldyn->energy=0.0;
-
+
/* get energy and force of every atom */
for(i=0;i<count;i++) {
/* reset force */
v3_zero(&(itom[i].f));
+ /* reset viral of atom i */
+ v3_zero(&(itom[i].virial));
+
/* single particle potential/force */
if(itom[i].attr&ATOM_ATTR_1BP)
moldyn->func1b(moldyn,&(itom[i]));
for(j=0;j<27;j++) {
this=&(neighbour_i[j]);
- list_reset(this);
+ list_reset_f(this);
if(this->start==NULL)
continue;
for(k=0;k<27;k++) {
that=&(neighbour_i2[k]);
- list_reset(that);
+ list_reset_f(that);
if(that->start==NULL)
continue;
ktom,
bc_ik|bc_ij);
- } while(list_next(that)!=\
+ } while(list_next_f(that)!=\
L_NO_NEXT_ELEMENT);
}
jtom,bc_ij);
}
- } while(list_next(this)!=L_NO_NEXT_ELEMENT);
+ } while(list_next_f(this)!=L_NO_NEXT_ELEMENT);
}
v3_scale(&temp2,&temp2,tmp*B*exp(-mu*d_jk)*f_c_jk*0.5);
v3_add(&(ai->f),&(ai->f),&temp2); /* -1 skipped in f_a calc ^ */
/* scaled with 0.5 ^ */
+
}
return 0;
printf("FATAL: atom %d: x: %.20f (%.20f)\n",
i,atom[i].r.x,dim->x/2);
printf("diagnostic:\n");
+ printf("-----------\natom.r.x:\n");
for(j=0;j<8;j++) {
memcpy(&byte,(u8 *)(&(atom[i].r.x))+j,1);
for(k=0;k<8;k++)
((byte)&(1<<k))?1:0,
(k==7)?'\n':'|');
}
- printf("---------------\n");
+ printf("---------------\nx=dim.x/2:\n");
for(j=0;j<8;j++) {
memcpy(&byte,(u8 *)(&x)+j,1);
for(k=0;k<8;k++)
((byte)&(1<<k))?1:0,
(k==7)?'\n':'|');
}
- if(atom[i].r.x==x) printf("hier gleich!\n");
- else printf("hier NICHT gleich!\n");
+ if(atom[i].r.x==x) printf("the same!\n");
+ else printf("different!\n");
}
if(atom[i].r.y>=dim->y/2||-atom[i].r.y>dim->y/2)
printf("FATAL: atom %d: y: %.20f (%.20f)\n",
return 0;
}
+/*
+ * lattice creation functions
+ */
+
+/* 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.x<x) {
+ r.y=o.y;
+ while(r.y<y) {
+ r.z=o.z;
+ while(r.z<z) {
+ v3_copy(&(atom[count].r),&r);
+ atom[count].element=1;
+ count+=1;
+ for(i=0;i<3;i++) {
+ v3_add(&n,&r,&basis[i]);
+ if((n.x<x+o.x)&&
+ (n.y<y+o.y)&&
+ (n.z<z+o.z)) {
+ v3_copy(&(atom[count].r),&n);
+ count+=1;
+ }
+ }
+ r.z+=lc;
+ }
+ r.y+=lc;
+ }
+ r.x+=lc;
+ }
+
+ /* coordinate transformation */
+ help[0]=x/2.0;
+ help[1]=y/2.0;
+ help[2]=z/2.0;
+ v3_set(&n,help);
+ for(i=0;i<count;i++)
+ v3_sub(&(atom[i].r),&(atom[i].r),&n);
+
+ return count;
+}
+
+int diamond_init(int a,int b,int c,double lc,t_atom *atom,t_3dvec *origin) {
+
+ int count;
+ t_3dvec o;
+
+ count=fcc_init(a,b,c,lc,atom,origin);
+
+ o.x=0.25*lc;
+ o.y=0.25*lc;
+ o.z=0.25*lc;
+
+ if(origin) v3_add(&o,&o,origin);
+
+ count+=fcc_init(a,b,c,lc,&atom[count],&o);
+
+ return count;
+}