#include #include #include void PolymerStep(int N, double *PositionsX, double *PositionsY, double Size, double k, double a, double *pR); void PrintStep(int N, double *PositionsX, double *PositionsY); int main(int argc, char **argv) { int i; /* loop variable */ int N; /* number of monomers */ int Nrounds; /* number of rounds */ double koverT; /* k/T */ double aoverT; /* a/T */ double Size; /* size of simulation box */ double R; /* total distance square */ double *PositionsX; /* x positions of monomers */ double *PositionsY; /* y positions of monomers */ FILE *gfp; /* file pointer to gnuplot */ /* interpret command line arguments */ if (argc!=6) { fprintf(stderr,"polymer usage: polymer \n"); return(1); } N=atoi(argv[1]); Nrounds=atoi(argv[2]); koverT=atof(argv[3]); aoverT=atof(argv[4]); Size=atof(argv[5]); /* get memory for configuration */ PositionsX=(double *)malloc(2*N*sizeof(double)); if (!PositionsX) { fprintf(stderr,"Not enough memory !\n"); return(2); } PositionsY=PositionsX+N; /* initialize positions */ R=0.0; for(i=0;iSize || fabs(PositionsY[n]+dY)>Size) return; /* calculate energy in original position and subtract energy in new position */ if (fabs(PositionsX[n])<1.0 && fabs(PositionsY[n])<1.0) dE=aoverT; else dE=0.0; if (fabs(PositionsX[n]+dX)<1.0 && fabs(PositionsY[n]+dY)<1.0) dE-=aoverT; if (n>0) { dl=sqrt((PositionsX[n]-PositionsX[n-1])*(PositionsX[n]-PositionsX[n-1])+ (PositionsY[n]-PositionsY[n-1])*(PositionsY[n]-PositionsY[n-1]))-1.0; dE-=koverT/2.0*dl*dl; dl=sqrt((PositionsX[n]+dX-PositionsX[n-1])*(PositionsX[n]+dX-PositionsX[n-1])+ (PositionsY[n]+dY-PositionsY[n-1])*(PositionsY[n]+dY-PositionsY[n-1]))-1.0; dE+=koverT/2.0*dl*dl; } if (n