int count;
atom=moldyn->atom;
- count=(moldyn->count)++;
+ count=(moldyn->count)++; // asshole style!
ptr=realloc(atom,(count+1)*sizeof(t_atom));
if(!ptr) {
moldyn->atom=ptr;
atom=moldyn->atom;
+
+ /* initialize new atom */
+ memset(&(atom[count]),0,sizeof(t_atom));
atom[count].r=*r;
atom[count].v=*v;
atom[count].element=element;
return moldyn->p;
}
+int average_reset(t_moldyn *moldyn) {
+
+ printf("[moldyn] average reset\n");
+
+ /* update skip value */
+ moldyn->avg_skip=moldyn->total_steps;
+
+ /* kinetic energy */
+ moldyn->k_sum=0.0;
+ moldyn->k2_sum=0.0;
+
+ /* potential energy */
+ moldyn->v_sum=0.0;
+ moldyn->v2_sum=0.0;
+
+ /* temperature */
+ moldyn->t_sum=0.0;
+
+ /* virial */
+ moldyn->virial_sum=0.0;
+ moldyn->gv_sum=0.0;
+
+ /* pressure */
+ moldyn->p_sum=0.0;
+ moldyn->gp_sum=0.0;
+
+ return 0;
+}
+
int average_and_fluctuation_calc(t_moldyn *moldyn) {
+ int denom;
+
if(moldyn->total_steps<moldyn->avg_skip)
return 0;
- int denom=moldyn->total_steps+1-moldyn->avg_skip;
+ denom=moldyn->total_steps+1-moldyn->avg_skip;
/* assume up to date energies, temperature, pressure etc */
double thermodynamic_pressure_calc(t_moldyn *moldyn) {
- t_3dvec dim,*tp;
+ t_3dvec dim;
+ //t_3dvec *tp;
double u_up,u_down,dv;
double scale,p;
t_atom *store;
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);
-
+
#ifdef STATIC_LISTS
p=0;
while(lc->subcell[i+j*nx+k*nx*ny][p]!=0)
count2=27;
a=nx*ny;
+ if(i>=nx||j>=ny||k>=nz)
+ printf("[moldyn] WARNING: lcni %d/%d %d/%d %d/%d\n",
+ i,nx,j,ny,k,nz);
+
cell[0]=lc->subcell[i+j*nx+k*a];
for(ci=-1;ci<=1;ci++) {
bx=0;
for(i=0;i<lc->cells;i++) {
#ifdef STATIC_LISTS
- //printf(" ---> %d free %p\n",i,lc->subcell[i]);
free(lc->subcell[i]);
#else
//printf(" ---> %d free %p\n",i,lc->subcell[i].start);
/* some stupid checks before we actually start calculating bullshit */
if(moldyn->cutoff>0.5*moldyn->dim.x)
- printf("[moldyn] warning: cutoff > 0.5 x dim.x\n");
+ printf("[moldyn] WARNING: cutoff > 0.5 x dim.x\n");
if(moldyn->cutoff>0.5*moldyn->dim.y)
- printf("[moldyn] warning: cutoff > 0.5 x dim.y\n");
+ printf("[moldyn] WARNING: cutoff > 0.5 x dim.y\n");
if(moldyn->cutoff>0.5*moldyn->dim.z)
- printf("[moldyn] warning: cutoff > 0.5 x dim.z\n");
+ printf("[moldyn] WARNING: cutoff > 0.5 x dim.z\n");
ds=0.5*atom[0].f.x*moldyn->tau_square/atom[0].mass;
if(ds>0.05*moldyn->nnd)
- printf("[moldyn] warning: forces too high / tau too small!\n");
+ printf("[moldyn] WARNING: forces too high / tau too small!\n");
/* zero absolute time */
moldyn->time=0.0;
/* get current time */
gettimeofday(&t2,NULL);
- printf("\rsched:%d, steps:%d, T:%3.1f/%3.1f P:%4.1f/%4.1f V:%6.1f (%d)",
- sched->count,i,
- moldyn->t,moldyn->t_avg,
- moldyn->p_avg/BAR,moldyn->gp_avg/BAR,
- moldyn->volume,
- (int)(t2.tv_sec-t1.tv_sec));
- fflush(stdout);
+printf("\rsched:%d, steps:%d/%d, T:%3.1f/%3.1f P:%4.1f/%4.1f V:%6.1f (%d)",
+ sched->count,i,moldyn->total_steps,
+ moldyn->t,moldyn->t_avg,
+ moldyn->p_avg/BAR,moldyn->gp_avg/BAR,
+ moldyn->volume,
+ (int)(t2.tv_sec-t1.tv_sec));
+
+ fflush(stdout);
/* copy over time */
t1=t2;
/* check for hooks */
if(sched->hook) {
- printf("\n ## schedule hook %d/%d start ##\n",
- sched->count+1,sched->total_sched-1);
+ printf("\n ## schedule hook %d start ##\n",
+ sched->count);
sched->hook(moldyn,sched->hook_params);
printf(" ## schedule hook end ##\n");
}
v3_add(&(atom[i].v),&(atom[i].v),&delta);
}
+ /* criticial check */
+ moldyn_bc_check(moldyn);
+
/* neighbour list update */
link_cell_update(moldyn);
}
#endif
- /* calculate global virial */
+ /* some postprocessing */
for(i=0;i<count;i++) {
- moldyn->gvir.xx+=moldyn->atom[i].r.x*moldyn->atom[i].f.x;
- moldyn->gvir.yy+=moldyn->atom[i].r.y*moldyn->atom[i].f.y;
- moldyn->gvir.zz+=moldyn->atom[i].r.z*moldyn->atom[i].f.z;
- moldyn->gvir.xy+=moldyn->atom[i].r.y*moldyn->atom[i].f.x;
- moldyn->gvir.xz+=moldyn->atom[i].r.z*moldyn->atom[i].f.x;
- moldyn->gvir.yz+=moldyn->atom[i].r.z*moldyn->atom[i].f.y;
+ /* calculate global virial */
+ moldyn->gvir.xx+=itom[i].r.x*itom[i].f.x;
+ moldyn->gvir.yy+=itom[i].r.y*itom[i].f.y;
+ moldyn->gvir.zz+=itom[i].r.z*itom[i].f.z;
+ moldyn->gvir.xy+=itom[i].r.y*itom[i].f.x;
+ moldyn->gvir.xz+=itom[i].r.z*itom[i].f.x;
+ moldyn->gvir.yz+=itom[i].r.z*itom[i].f.y;
+
+ /* check forces regarding the given timestep */
+ if(v3_norm(&(itom[i].f))>\
+ 0.1*moldyn->nnd*itom[i].mass/moldyn->tau_square)
+ printf("[moldyn] WARNING: pfc (high force: atom %d)\n",
+ i);
}
return 0;
}
size=sizeof(t_moldyn);
- cnt=read(fd,moldyn,size);
- if(cnt!=size) {
- perror("[moldyn] load save file read (moldyn)");
- return cnt;
+
+ while(size) {
+ cnt=read(fd,moldyn,size);
+ if(cnt<0) {
+ perror("[moldyn] load save file read (moldyn)");
+ return cnt;
+ }
+ size-=cnt;
}
size=moldyn->count*sizeof(t_atom);
return -1;
}
- cnt=read(fd,moldyn->atom,size);
- if(cnt!=size) {
- perror("[moldyn] load save file read (atoms)");
- return cnt;
+ while(size) {
+ cnt=read(fd,moldyn->atom,size);
+ if(cnt<0) {
+ perror("[moldyn] load save file read (atoms)");
+ return cnt;
+ }
+ size-=cnt;
}
// hooks etc ...
t_list *this;
unsigned char bc;
t_3dvec dist;
- double d,norm;
+ double d;
+ //double norm;
int o,s;
unsigned char ibrand;
lc=&(moldyn->lc);
- slots=(int)(moldyn->cutoff/dr);
+ slots=moldyn->cutoff/dr;
o=2*slots;
+ if(slots*dr<=moldyn->cutoff)
+ printf("[moldyn] WARNING: pcc (low #slots)\n");
+
printf("[moldyn] pair correlation calc info:\n");
printf(" time: %f\n",moldyn->time);
printf(" count: %d\n",moldyn->count);
jtom=this->current->data;
#endif
-
- if(jtom==&(itom[i]))
- continue;
-
- /* only count pairs once */
- if(itom[i].tag>jtom->tag)
+ /* only count pairs once,
+ * skip same atoms */
+ if(itom[i].tag>=jtom->tag)
continue;
/*
if(bc) check_per_bound(moldyn,&dist);
d=v3_absolute_square(&dist);
- /* ignore if greater cutoff */
- if(d>moldyn->cutoff_square)
+ /* ignore if greater or equal cutoff */
+ if(d>=moldyn->cutoff_square)
continue;
/* fill the slots */
d=sqrt(d);
s=(int)(d/dr);
+ /* should never happen but it does 8) -
+ * related to -ffloat-store problem! */
+ if(s>=slots) {
+ printf("[moldyn] WARNING: pcc (%d/%d)",
+ s,slots);
+ printf("\n");
+ s=slots-1;
+ }
+
if(ibrand!=jtom->brand) {
/* mixed */
stat[s]+=1;
/* type b - type b bonds */
stat[s+o]+=1;
}
-
#ifdef STATIC_LISTS
}
#else