#include "bonds.h" //// START: Bonds routines double Bonds_GetR2(int i, int j) { // get separation between particles i and j double dx, dy, dz; dx = x[i] - x[j]; dy = y[i] - y[j]; dz = z[i] - z[j]; return dx * dx + dy * dy + dz * dz; } double Bonds_GetR2_PBCs(int i, int j) { // get PBC wrapped separation between particles i and j double dx, dy, dz; dx = x[i] - x[j]; dy = y[i] - y[j]; dz = z[i] - z[j]; if(ISNOTCUBIC!=3) { if(PBCs==1){ if (dx<-halfSidex) dx+=sidex; else if (dx>halfSidex) dx-=sidex; if (dy<-halfSidey) dy+=sidey; else if (dy>halfSidey) dy-=sidey; if (dz<-halfSidez) dz+=sidez; else if (dz>halfSidez) dz-=sidez; return dx * dx + dy * dy + dz * dz; } } else { if (dz > sidez*0.5) dz -= sidez; if (dz< -sidez*0.5) dz += sidez; //deal with y, which affects x if (dy > sidey*0.5) { dx-=tilt; dy -= sidey; } if (dy< -sidey*0.5) { dx+=tilt ; dy += sidey; } //deal with x if (dx > sidex*0.5) dx -= sidex; if (dx< -sidex*0.5) dx+= sidex; return dx * dx + dy * dy + dz * dz; } ; } void Bonds_WriteBondNetwork(int f) { int i,j,k; char input[1000]; FILE *writeout; sprintf(input,"bondnetwork.f%d.matrix_bonds",f); writeout=fopen(input, "w"); for (i=0; i=BLDistroNoBins) { sprintf(errMsg,"Bonds_TickBLDistro(): interaction bondlength %lg binwidth %lg k %d nobins %d",length,binWidth,k,BLDistroNoBins); Error(errMsg); } histo[k]=histo[k]+1; (*count)=(*count)+1; } void Bonds_WriteBLDistro(char *filename, int *histo, int *count, double *meanRtn) { int i; double lengthtemp, mean; char errMsg[1000]; FILE *writeout; writeout=fopen(filename,"w"); if (writeout==NULL) { sprintf(errMsg,"Bonds_WriteBLDistro(): Error opening file %s",filename); // Always test file open Error(errMsg); } if ((*count)%2!=0) { sprintf(errMsg,"Bonds_WriteBLDistro(): total no samples %d is not even",*count); // Always test file open Error(errMsg); } (*count)=(*count)/2; fprintf(writeout,"%s\n",filename); fprintf(writeout,"bond length frequency normalized frequency (%d samples)\n",(*count)); lengthtemp=mean=0.0; for (i=0; i=0 && cnb[i]<=nB) { nbDistro[cnb[i]]++; nbDistroNoSamples++; } else { sprintf(errMsg,"Bonds_TallynbDistro(): cnb[%d] %d is less than 0 or greater than nB %d\n",i,cnb[i],nB); Error(errMsg); } if (doBinary==1) { noA=0; if (rtype[i]==1) { for (j=0; j=0 && noA<=cnb[i]) { nbDistroAA[noA]++; nbDistroNoSamplesAA++; nbDistroAB[cnb[i]-noA]++; nbDistroNoSamplesAB++; } else { sprintf(errMsg,"Bonds_TallynbDistro(): noA %d is less than 0 or greater than cnb[%d] %d \n",noA,i,cnb[i]); Error(errMsg); } } else { for (j=0; j=0 && noA<=cnb[i]) { nbDistroBA[noA]++; nbDistroNoSamplesBA++; nbDistroBB[cnb[i]-noA]++; nbDistroNoSamplesBB++; } else { sprintf(errMsg,"Bonds_TallynbDistro(): noA %d is less than 0 or greater than cnb[%d] %d \n",noA,i,cnb[i]); // Always test file open Error(errMsg); } } } } } void Bonds_WritenbDistro(char *filename, int *histo, int *count, double *meannbRtn) { int i; int mean; char errMsg[1000]; FILE *writeout; writeout=fopen(filename,"w"); if (writeout==NULL) { sprintf(errMsg,"Bonds_WritenbDistro(): Error opening file %s",filename); // Always test file open Error(errMsg); } fprintf(writeout,"%s\n",filename); fprintf(writeout,"no Bonds frequency normalized frequency (%d samples)\n",(*count)); for (i=0; i<=nB; i++) fprintf(writeout,"%d %d %.15lg\n",i,histo[i],(double)(histo[i])/(double)(*count)); mean=0; for (i=0; i<=nB; i++) { mean+=i*histo[i]; } (*meannbRtn)=(double)(mean)/(double)(*count); fprintf(writeout,"mean nB %.15lg\n",*meannbRtn); fclose(writeout); printf("d%d Written %s\n",rank,filename); } void Bonds_CheckSymmetric() { int i, j, k; //char errMsg[1000]; for (i=0; ik; --l) { S2[l] = S2[l-1]; Sr2[l] = Sr2[l-1]; } S2[k] = S[j]; Sr2[k] = Sr[j]; break; } } if (k==cnbs2){ S2[cnbs2] = S[j]; Sr2[cnbs2] = Sr[j]; } ++cnbs2; } // Now sorted the list in order of distance from i if (cnbs!=cnbs2) { printf("d%d Bonds_GetBondsV(): part %d - cnbs %d does not equal cnbs2 %d \n",rank,i,cnbs,cnbs2); exit(1); } for (j=0; jhalfSidex) rijx-=sidex; else if (rijx<-halfSidex) rijx+=sidex; if (rijy>halfSidey) rijy-=sidey; else if (rijy<-halfSidey) rijy+=sidey; if (rijz>halfSidez) rijz-=sidez; else if (rijz<-halfSidez) rijz+=sidez; if (rikx>halfSidex) rikx-=sidex; else if (rikx<-halfSidex) rikx+=sidex; if (riky>halfSidey) riky-=sidey; else if (riky<-halfSidey) riky+=sidey; if (rikz>halfSidez) rikz-=sidez; else if (rikz<-halfSidez) rikz+=sidez; if (rjkx>halfSidex) rjkx-=sidex; else if (rjkx<-halfSidex) rjkx+=sidex; if (rjky>halfSidey) rjky-=sidey; else if (rjky<-halfSidey) rjky+=sidey; if (rjkz>halfSidez) rjkz-=sidez; else if (rjkz<-halfSidez) rjkz+=sidez; } } else {//if triclinc PBC are used // printf("tilt %g\n", tilt); if (rijz<-halfSidez) rijz+=sidez; else if (rijz>halfSidez) rijz-=sidez; if (rijy<-halfSidey){ rijx+=tilt; rijy+=sidey;} else if (rijy>halfSidey) { rijx-=tilt; rijy-=sidey; } if (rijx<-halfSidex) rijx+=sidex; else if (rijx>halfSidex) rijx-=sidex; if (rikz<-halfSidez) rikz+=sidez; else if (rikz>halfSidez) rikz-=sidez; if (riky<-halfSidey){ rikx+=tilt; riky+=sidey;} else if (riky>halfSidey) { rikx-=tilt; riky-=sidey; } if (rikx<-halfSidex) rikx+=sidex; else if (rikx>halfSidex) rikx-=sidex; if (rjkz<-halfSidez) rjkz+=sidez; else if (rjkz>halfSidez) rjkz-=sidez; if (rjky<-halfSidey){ rjkx+=tilt; rjky+=sidey;} else if (rjky>halfSidey) { rjkx-=tilt; rjky-=sidey; } if (rjkx<-halfSidex) rjkx+=sidex; else if (rjkx>halfSidex) rjkx-=sidex; } x1 = rijx * rikx + rijy * riky + rijz * rikz; x1 -= rijx * rjkx + rijy * rjky + rijz * rjkz; x2 = rikx * rikx + riky * riky + rikz * rikz; x2 += rjkx * rjkx + rjky * rjky + rjkz * rjkz; x1 = x1 / x2; if (x1-fc > EPS) { // Eliminate j from S Sb[m] = 0; } } } for (l=0; lrcutBB2) { Sb[l]=0; } } else if (rtype[i]==2 || rtype[j]==2) { if (Sr2[l]>rcutAB2) { Sb[l]=0; } } } for (l=0; l0) { // loop over all particles in ic j=llist[i]; // next particle in current cell ic while (j>0) { // loop over all particles in cell ic if (PBCs == 1) dr2 = Bonds_GetR2_PBCs(i-1,j-1); else dr2 = Bonds_GetR2(i-1,j-1); if (dr2 < rcutAA2) { if (temp_cnb[i-1] < nBs && temp_cnb[j-1] < nBs) { // max number of bonds, do ith particle temp_bNums[i-1][temp_cnb[i-1]]=j-1; temp_bNums[j-1][temp_cnb[j-1]]=i-1; temp_cnb[i-1]++; temp_cnb[j-1]++; } else { // list is now full printf("d%d Bonds_GetBondsV_CellList(): nBs %d number of bonds per particle is not big enough: particle i %d or j% d has too many bonds\nThis is probably because rcutAA is too large\n",rank,nBs,i-1,j-1); exit(1); } } j=llist[j]; // loop over next particle in cell ic } jcell0=13*(ic-1); // now loop over adjacent cells to cell ic for (nabor=1;nabor<=13;nabor++) { jcell=map[jcell0+nabor]; j=head[jcell]; // head of cell for jcell while (j>0) { // loop over head of cell and all other particles in jcell if (PBCs == 1) dr2 = Bonds_GetR2_PBCs(i-1,j-1); else dr2 = Bonds_GetR2(i-1,j-1); if (dr2 < rcutAA2) { if (temp_cnb[i-1] < nBs && temp_cnb[j-1] < nBs) { // max number of bonds, do ith particle temp_bNums[i-1][temp_cnb[i-1]]=j-1; temp_bNums[j-1][temp_cnb[j-1]]=i-1; temp_cnb[i-1]++; temp_cnb[j-1]++; } else { // list is now full printf("d%d Bonds_GetBondsV_CellList(): nBs %d number of bonds per particle is not big enough: particle i %d or j% d has too many bonds\nThis is probably because rcutAA is too large\n",rank,nBs,i-1,j-1); exit(1); } } j=llist[j]; // next particle in jcell } } i=llist[i]; // next particle in ic cell } } for (i=0; ik; --l) { S2[l] = S2[l-1]; Sr2[l] = Sr2[l-1]; } S2[k] = S[j]; Sr2[k] = Sr[j]; break; } } if (k==cnbs2){ S2[cnbs2] = S[j]; Sr2[cnbs2] = Sr[j]; } ++cnbs2; } // Now sorted the list in order of distance from i if (cnbs!=cnbs2) { printf("d%d Bonds_GetBondsV_CellList(): part %d - cnbs %d does not equal cnbs2 %d \n",rank,i,cnbs,cnbs2); exit(1); } cnb[i]=0; for (j=0; jhalfSidex) rijx-=sidex; else if (rijx<-halfSidex) rijx+=sidex; if (rijy>halfSidey) rijy-=sidey; else if (rijy<-halfSidey) rijy+=sidey; if (rijz>halfSidez) rijz-=sidez; else if (rijz<-halfSidez) rijz+=sidez; if (rikx>halfSidex) rikx-=sidex; else if (rikx<-halfSidex) rikx+=sidex; if (riky>halfSidey) riky-=sidey; else if (riky<-halfSidey) riky+=sidey; if (rikz>halfSidez) rikz-=sidez; else if (rikz<-halfSidez) rikz+=sidez; if (rjkx>halfSidex) rjkx-=sidex; else if (rjkx<-halfSidex) rjkx+=sidex; if (rjky>halfSidey) rjky-=sidey; else if (rjky<-halfSidey) rjky+=sidey; if (rjkz>halfSidez) rjkz-=sidez; else if (rjkz<-halfSidez) rjkz+=sidez; } } else {//if triclinc PBC are used if (rijz<-halfSidez) rijz+=sidez; else if (rijz>halfSidez) rijz-=sidez; if (rijy<-halfSidey){ rijx+=tilt; rijy+=sidey;} else if (rijy>halfSidey) { rijx-=tilt; rijy-=sidey; } if (rijx<-halfSidex) rijx+=sidex; else if (rijx>halfSidex) rijx-=sidex; if (rikz<-halfSidez) rikz+=sidez; else if (rikz>halfSidez) rikz-=sidez; if (riky<-halfSidey){ rikx+=tilt; riky+=sidey;} else if (riky>halfSidey) { rikx-=tilt; riky-=sidey; } if (rikx<-halfSidex) rikx+=sidex; else if (rikx>halfSidex) rikx-=sidex; if (rjkz<-halfSidez) rjkz+=sidez; else if (rjkz>halfSidez) rjkz-=sidez; if (rjky<-halfSidey){ rjkx+=tilt; rjky+=sidey;} else if (rjky>halfSidey) { rjkx-=tilt; rjky-=sidey; } if (rjkx<-halfSidex) rjkx+=sidex; else if (rjkx>halfSidex) rjkx-=sidex; } x1 = rijx * rikx + rijy * riky + rijz * rikz; x1 -= rijx * rjkx + rijy * rjky + rijz * rjkz; x2 = rikx * rikx + riky * riky + rikz * rikz; x2 += rjkx * rjkx + rjky * rjky + rjkz * rjkz; x1 = x1 / x2; if (x1-fc > EPS) { // Eliminate j from S Sb[m] = 0; } } } for (l=0; lrcutBB2) { Sb[l]=0; } } else if (rtype[i]==2 || rtype[j]==2) { if (Sr2[l]>rcutAB2) { Sb[l]=0; } } } for (l=0; l