pthread_mutex_init(&emutex,NULL);
#endif
+#ifdef CONSTRAINT_110_5832
+ printf("\n\n\nWARNING! WARNING! WARNING!\n\n\n");
+ printf("\n\n\n!! -- constraints enabled -- !!\n\n\n");
+#endif
+#ifdef CONSTRAINT_11X_5832
+ printf("\n\n\nWARNING! WARNING! WARNING!\n\n\n");
+ printf("\n\n\n!! -- constraints enabled -- !!\n\n\n");
+#endif
return 0;
}
switch(type) {
case MOLDYN_POTENTIAL_TM:
- moldyn->func1b=tersoff_mult_1bp;
+ //moldyn->func1b=tersoff_mult_1bp;
moldyn->func3b_j1=tersoff_mult_3bp_j1;
moldyn->func3b_k1=tersoff_mult_3bp_k1;
moldyn->func3b_j2=tersoff_mult_3bp_j2;
int create_lattice(t_moldyn *moldyn,u8 type,double lc,int element,
u8 attr,u8 brand,int a,int b,int c,t_3dvec *origin,
- t_part_params *p_params,t_defect_params *d_params) {
+ t_part_params *p_params,t_defect_params *d_params,
+ t_offset_params *o_params) {
int new,count;
int ret;
switch(type) {
case CUBIC:
+ if(o_params->use)
+ v3_add(&orig,&orig,&(o_params->o));
set_nn_dist(moldyn,lc);
ret=cubic_init(a,b,c,lc,atom,&orig,p_params,d_params);
strcpy(name,"cubic");
case FCC:
if(!origin)
v3_scale(&orig,&orig,0.5);
+ if(o_params->use)
+ v3_add(&orig,&orig,&(o_params->o));
set_nn_dist(moldyn,0.5*sqrt(2.0)*lc);
ret=fcc_init(a,b,c,lc,atom,&orig,p_params,d_params);
strcpy(name,"fcc");
case DIAMOND:
if(!origin)
v3_scale(&orig,&orig,0.25);
+ if(o_params->use)
+ v3_add(&orig,&orig,&(o_params->o));
set_nn_dist(moldyn,0.25*sqrt(3.0)*lc);
ret=diamond_init(a,b,c,lc,atom,&orig,p_params,d_params);
strcpy(name,"diamond");
t_atom *new,*old;
int cnt;
+#if defined LOWMEM_LISTS || defined PTHREADS
+ void *ptr;
+#endif
old=moldyn->atom;
free(old);
+#ifdef LOWMEM_LISTS
+ ptr=realloc(moldyn->lc.subcell->list,moldyn->count*sizeof(int));
+ if(!ptr) {
+ perror("[moldyn] list realloc (del atom)");
+ return -1;
+ }
+ moldyn->lc.subcell->list=ptr;
+ // update lists
+ link_cell_update(moldyn);
+#endif
+
+#ifdef PTHREADS
+ ptr=realloc(amutex,moldyn->count*sizeof(pthread_mutex_t));
+ if(!ptr) {
+ perror("[moldyn] mutex realloc (add atom)");
+ return -1;
+ }
+ amutex=ptr;
+ pthread_mutex_destroy(&(amutex[moldyn->count+1]));
+#endif
+
+
return 0;
}
temperature_calc(moldyn);
virial_sum(moldyn);
pressure_calc(moldyn);
- /*
+#ifdef PDEBUG
thermodynamic_pressure_calc(moldyn);
printf("\n\nDEBUG: numeric pressure calc: %f\n\n",
moldyn->tp/BAR);
- */
+#endif
/* calculate fluctuations + averages */
average_and_fluctuation_calc(moldyn);
if(e) {
if(!(moldyn->total_steps%e))
dprintf(moldyn->efd,
- "%f %f %f %f\n",
+ "%f %f %f %f %f %f\n",
moldyn->time,moldyn->ekin/energy_scale,
moldyn->energy/energy_scale,
- get_total_energy(moldyn)/energy_scale);
+ get_total_energy(moldyn)/energy_scale,
+ moldyn->ekin/EV,moldyn->energy/EV);
}
if(m) {
if(!(moldyn->total_steps%m)) {
}
/* display progress */
+#ifndef PDEBUG
if(!(i%10)) {
+#endif
/* get current time */
gettimeofday(&t2,NULL);
printf("sched:%d, steps:%d/%d, T:%4.1f/%4.1f P:%4.1f/%4.1f V:%6.1f (%d)\n",
sched->count,i,moldyn->total_steps,
moldyn->t,moldyn->t_avg,
+#ifndef PDEBUG
moldyn->p/BAR,moldyn->p_avg/BAR,
- //moldyn->p/BAR,(moldyn->p-2.0*moldyn->ekin/(3.0*moldyn->volume))/BAR,
+#else
+ moldyn->p/BAR,(moldyn->p-2.0*moldyn->ekin/(3.0*moldyn->volume))/BAR,
+#endif
moldyn->volume,
(int)(t2.tv_sec-t1.tv_sec));
/* copy over time */
t1=t2;
+#ifndef PDEBUG
}
+#endif
/* increase absolute time */
moldyn->time+=moldyn->tau;
}
+ /* writing a final save file! */
+ if(s) {
+ snprintf(dir,128,"%s/s-final.save",moldyn->vlsdir);
+ fd=open(dir,O_WRONLY|O_TRUNC|O_CREAT,S_IRUSR|S_IWUSR);
+ if(fd<0) perror("[moldyn] save fd open");
+ else {
+ write(fd,moldyn,sizeof(t_moldyn));
+ write(fd,moldyn->atom,
+ moldyn->count*sizeof(t_atom));
+ }
+ close(fd);
+ }
+ /* writing a final visual file! */
+ if(a)
+ visual_atoms(moldyn);
+
return 0;
}
double tau,tau_square,h;
t_3dvec delta;
t_atom *atom;
+#ifdef CONSTRAINT_11X_5832
+ double xt,yt,zt;
+ double xtt,ytt,ztt;
+#endif
atom=moldyn->atom;
count=moldyn->count;
tau=moldyn->tau;
tau_square=moldyn->tau_square;
+#ifdef CONSTRAINT_110_5832
+ if(count==5833) {
+ atom[5832].f.x=0.5*(atom[5832].f.x-atom[5832].f.y);
+ atom[5832].f.y=-atom[5832].f.x;
+ }
+#endif
+#ifdef CONSTRAINT_11X_5832
+ if(count==5833) {
+ // second trafo
+ xt=atom[5832].f.x;
+ yt=atom[5832].f.y*cos(-0.16935129)-atom[5832].f.z*sin(-0.16935129);
+ zt=atom[5832].f.y*sin(-0.16935129)+atom[5832].f.z*cos(-0.16935129);
+ // first trafo
+ xtt=xt*cos(M_PI/4.0)-yt*sin(M_PI/4.0);
+ ytt=xt*sin(M_PI/4.0)+yt*sin(M_PI/4.0);
+ ztt=zt;
+ // apply constraints
+ ytt=0.0;
+ // first trafo backwards
+ xt=xtt*cos(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ yt=-xtt*sin(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ zt=ztt;
+ // second trafo backwards
+ atom[5832].f.x=xt;
+ atom[5832].f.y=yt*cos(-0.16935129)+zt*sin(-0.16935129);
+ atom[5832].f.z=-yt*sin(-0.16935129)+zt*cos(-0.16935129);
+ }
+#endif
for(i=0;i<count;i++) {
/* check whether fixed atom */
if(atom[i].attr&ATOM_ATTR_FP)
/* new positions */
h=0.5/atom[i].mass;
v3_scale(&delta,&(atom[i].v),tau);
+#ifdef CONSTRAINT_110_5832
+ if(i==5832) {
+ delta.y=-delta.x;
+ }
+#endif
+#ifdef JHDVHJDV
+#ifdef CONSTRAINT_11X_5832
+ if(i==5833) {
+ // second trafo
+ xt=delta.x;
+ yt=delta.y*cos(-0.16935129)-delta.z*sin(-0.16935129);
+ zt=delta.y*sin(-0.16935129)+delta.z*cos(-0.16935129);
+ // first trafo
+ xtt=xt*cos(M_PI/4.0)-yt*sin(M_PI/4.0);
+ ytt=xt*sin(M_PI/4.0)+yt*sin(M_PI/4.0);
+ ztt=zt;
+ // apply constraints
+ ytt=0.0;
+ // first trafo backwards
+ xt=xtt*cos(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ yt=-xtt*sin(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ zt=ztt;
+ // second trafo backwards
+ delta.x=xt;
+ delta.y=yt*cos(-0.16935129)+zt*sin(-0.16935129);
+ delta.z=-yt*sin(-0.16935129)+zt*cos(-0.16935129);
+ }
+#endif
+#endif
+#ifndef QUENCH
v3_add(&(atom[i].r),&(atom[i].r),&delta);
+#endif
v3_scale(&delta,&(atom[i].f),h*tau_square);
+#ifdef CONSTRAINT_110_5832
+ if(i==5832) {
+ delta.y=-delta.x;
+ }
+#endif
+#ifdef GHDJHBSJBSD
+#ifdef CONSTRAINT_11X_5832
+ if(i==5833) {
+ // second trafo
+ xt=delta.x;
+ yt=delta.y*cos(-0.16935129)-delta.z*sin(-0.16935129);
+ zt=delta.y*sin(-0.16935129)+delta.z*cos(-0.16935129);
+ // first trafo
+ xtt=xt*cos(M_PI/4.0)-yt*sin(M_PI/4.0);
+ ytt=xt*sin(M_PI/4.0)+yt*sin(M_PI/4.0);
+ ztt=zt;
+ // apply constraints
+ ytt=0.0;
+ // first trafo backwards
+ xt=xtt*cos(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ yt=-xtt*sin(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ zt=ztt;
+ // second trafo backwards
+ delta.x=xt;
+ delta.y=yt*cos(-0.16935129)+zt*sin(-0.16935129);
+ delta.z=-yt*sin(-0.16935129)+zt*cos(-0.16935129);
+ }
+#endif
+#endif
v3_add(&(atom[i].r),&(atom[i].r),&delta);
+ //check_per_bound_and_care_for_pbc(moldyn,&(atom[i]));
check_per_bound(moldyn,&(atom[i].r));
/* velocities [actually v(t+tau/2)] */
/* forces depending on chosen potential */
#ifndef ALBE_FAST
- potential_force_calc(moldyn);
+ // if albe, use albe force calc routine
+ //if(moldyn->func3b_j1==albe_mult_3bp_j1)
+ // albe_potential_force_calc(moldyn);
+ //else
+ potential_force_calc(moldyn);
#else
albe_potential_force_calc(moldyn);
#endif
+#ifdef CONSTRAINT_110_5832
+ if(count==5833) {
+ atom[5832].f.x=0.5*(atom[5832].f.x-atom[5832].f.y);
+ atom[5832].f.y=-atom[5832].f.x;
+ }
+#endif
+#ifdef CONSTRAINT_11X_5832
+ if(count==5833) {
+ // second trafo
+ xt=atom[5832].f.x;
+ yt=atom[5832].f.y*cos(-0.16935129)-atom[5832].f.z*sin(-0.16935129);
+ zt=atom[5832].f.y*sin(-0.16935129)+atom[5832].f.z*cos(-0.16935129);
+ // first trafo
+ xtt=xt*cos(M_PI/4.0)-yt*sin(M_PI/4.0);
+ ytt=xt*sin(M_PI/4.0)+yt*sin(M_PI/4.0);
+ ztt=zt;
+ // apply constraints
+ ytt=0.0;
+ // first trafo backwards
+ xt=xtt*cos(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ yt=-xtt*sin(M_PI/4.0)+ytt*sin(M_PI/4.0);
+ zt=ztt;
+ // second trafo backwards
+ atom[5832].f.x=xt;
+ atom[5832].f.y=yt*cos(-0.16935129)+zt*sin(-0.16935129);
+ atom[5832].f.z=-yt*sin(-0.16935129)+zt*cos(-0.16935129);
+ }
+#endif
for(i=0;i<count;i++) {
/* check whether fixed atom */
if(atom[i].attr&ATOM_ATTR_FP)
return 0;
}
+int check_per_bound_and_care_for_pbc(t_moldyn *moldyn,t_atom *a) {
+
+ double x,y,z;
+ t_3dvec *dim;
+
+ dim=&(moldyn->dim);
+
+ x=dim->x/2;
+ y=dim->y/2;
+ z=dim->z/2;
+
+ if(moldyn->status&MOLDYN_STAT_PBX) {
+ if(a->r.x>=x) {
+ a->pbc[0]+=1;
+ a->r.x-=dim->x;
+ }
+ else if(-a->r.x>x) {
+ a->pbc[0]-=1;
+ a->r.x+=dim->x;
+ }
+ }
+ if(moldyn->status&MOLDYN_STAT_PBY) {
+ if(a->r.y>=y) {
+ a->pbc[1]+=1;
+ a->r.y-=dim->y;
+ }
+ else if(-a->r.y>y) {
+ a->pbc[1]-=1;
+ a->r.y+=dim->y;
+ }
+ }
+ if(moldyn->status&MOLDYN_STAT_PBZ) {
+ if(a->r.z>=z) {
+ a->pbc[2]+=1;
+ a->r.z-=dim->z;
+ }
+ else if(-a->r.z>z) {
+ a->pbc[2]-=1;
+ a->r.z+=dim->z;
+ }
+ }
+
+ return 0;
+}
+
/*
* debugging / critical check functions
*/
if(fsize!=sizeof(t_moldyn)+size) {
corr=fsize-sizeof(t_moldyn)-size;
printf("[moldyn] WARNING: lsf (illegal file size)\n");
- printf(" moifying offset:\n");
+ printf(" modifying offset:\n");
printf(" - current pos: %d\n",sizeof(t_moldyn));
printf(" - atom size: %d\n",size);
printf(" - file size: %d\n",fsize);
int i;
t_atom *atom;
t_3dvec dist;
+ t_3dvec final_r;
double d2;
int a_cnt;
int b_cnt;
for(i=0;i<moldyn->count;i++) {
- v3_sub(&dist,&(atom[i].r),&(atom[i].r_0));
- check_per_bound(moldyn,&dist);
+ /* care for pb crossing */
+ final_r.x=atom[i].r.x+atom[i].pbc[0]*moldyn->dim.x;
+ final_r.y=atom[i].r.y+atom[i].pbc[1]*moldyn->dim.y;
+ final_r.z=atom[i].r.z+atom[i].pbc[2]*moldyn->dim.z;
+ /* calculate distance */
+ v3_sub(&dist,&final_r,&(atom[i].r_0));
d2=v3_absolute_square(&dist);
if(atom[i].brand) {
return 0;
}
+int calculate_msd(t_moldyn *moldyn,double *msd) {
+
+ int i;
+ t_atom *atom;
+ t_3dvec dist;
+ t_3dvec final_r;
+ double d2;
+ int a_cnt;
+ int b_cnt;
+
+ atom=moldyn->atom;
+ msd[0]=0;
+ msd[1]=0;
+ msd[2]=0;
+ a_cnt=0;
+ b_cnt=0;
+
+ for(i=0;i<moldyn->count;i++) {
+
+ /* care for pb crossing */
+ if(atom[i].pbc[0]|atom[i].pbc[1]|atom[i].pbc[2]) {
+ printf("[moldyn] msd pb crossings for atom %d\n",i);
+ printf(" x: %d y: %d z: %d\n",
+ atom[i].pbc[0],atom[i].pbc[1],atom[i].pbc[2]);
+ }
+ final_r.x=atom[i].r.x+atom[i].pbc[0]*moldyn->dim.x;
+ final_r.y=atom[i].r.y+atom[i].pbc[1]*moldyn->dim.y;
+ final_r.z=atom[i].r.z+atom[i].pbc[2]*moldyn->dim.z;
+ /* calculate distance */
+ v3_sub(&dist,&final_r,&(atom[i].r_0));
+ d2=v3_absolute_square(&dist);
+
+ if(atom[i].brand) {
+ b_cnt+=1;
+ msd[1]+=d2;
+ }
+ else {
+ a_cnt+=1;
+ msd[0]+=d2;
+ }
+
+ msd[2]+=d2;
+ }
+
+ msd[0]/=a_cnt;
+ msd[1]/=b_cnt;
+ msd[2]/=moldyn->count;
+
+ return 0;
+}
+
int bonding_analyze(t_moldyn *moldyn,double *cnt) {
return 0;
ba=data;
/* increase total bond counter
- * ... double counting!
*/
- ba->tcnt+=2;
+ ba->tcnt+=1;
if(itom->brand==0)
ba->acnt[jtom->tag]+=1;
int bond_analyze(t_moldyn *moldyn,double *quality) {
- // by now: # bonds of type 'a-4b' and 'b-4a' / # bonds total
-
- int qcnt;
- int ccnt,cset;
+ int qcnt4;
+ int qcnt3;
+ int ccnt4;
+ int ccnt3;
+ int bcnt;
t_ba ba;
int i;
t_atom *atom;
memset(ba.bcnt,0,moldyn->count*sizeof(int));
ba.tcnt=0;
- qcnt=0;
- ccnt=0;
- cset=0;
+ qcnt4=0; qcnt3=0;
+ ccnt4=0; ccnt3=0;
+ bcnt=0;
atom=moldyn->atom;
for(i=0;i<moldyn->count;i++) {
if(atom[i].brand==0) {
if((ba.acnt[i]==0)&(ba.bcnt[i]==4))
- qcnt+=4;
+ qcnt4+=4;
+ if((ba.acnt[i]==0)&(ba.bcnt[i]==3))
+ qcnt3+=3;
}
else {
if((ba.acnt[i]==4)&(ba.bcnt[i]==0)) {
- qcnt+=4;
- ccnt+=1;
+ qcnt4+=4;
+ ccnt4+=1;
+ }
+ if((ba.acnt[i]==3)&(ba.bcnt[i]==0)) {
+ qcnt3+=4;
+ ccnt3+=1;
}
- cset+=1;
+ bcnt+=1;
}
}
- printf("[moldyn] bond analyze: c_cnt=%d | set=%d\n",ccnt,cset);
- printf("[moldyn] bond analyze: q_cnt=%d | tot=%d\n",qcnt,ba.tcnt);
-
if(quality) {
- quality[0]=1.0*ccnt/cset;
- quality[1]=1.0*qcnt/ba.tcnt;
+ quality[0]=1.0*ccnt4/bcnt;
+ quality[1]=1.0*ccnt3/bcnt;
}
else {
- printf("[moldyn] bond analyze: c_bnd_q=%f\n",1.0*qcnt/ba.tcnt);
- printf("[moldyn] bond analyze: tot_q=%f\n",1.0*qcnt/ba.tcnt);
+ printf("[moldyn] bond analyze: %f %f\n",
+ 1.0*ccnt4/bcnt,1.0*ccnt3/bcnt);
}
return 0;