/* cc -O2 -o alg42 alg42.c -lm Simulace Lennardovy-Jonesovy tekutiny v periodickych okrajovych podminkach s vypoctem energie metodou nejblizsiho obrazu (viz poznamka na str. 57 skript). Program podle opravene verze algoritmu 4.2, str. 47 skript. */ #include #include #include #define N 200 /* pocet atomu */ double seed=1; /* nasada pro generator nahodnych cisel */ const double d=0.4; /* polovina delky zkusebniho posunuti */ const double T=1.2; /* teplota (v redukovanych jednotkach) */ const double rho=0.8; /* hustota (v redukovanych jednotkach) */ const double k=1; /* Boltzmannova konstanta v redukovanych jednotkach */ typedef struct { double x,y,z; } vector; double rnd(void) /* nahodne cislo v intervalu [0,1) */ { seed=fmod(seed*16807e0,2147483647e0); return seed/2147483647e0; } double L; /* delka hrany simulacni bunky */ double Lh; /* L/2 */ double u(vector r1,vector r2) /* Lennarduv-Jonesuv potencial v redukovanych jednotkach */ { vector dr; double rr; /* viz algoritmus 5.2: r1 i r2 musi byt v zakladni bunce */ dr.x=Lh-fabs(Lh-fabs(r1.x-r2.x)); dr.y=Lh-fabs(Lh-fabs(r1.y-r2.y)); dr.z=Lh-fabs(Lh-fabs(r1.z-r2.z)); rr=dr.x*dr.x+dr.y*dr.y+dr.z*dr.z; /* kvadrat vzdalenosti nejblizsich sousedu */ rr*=rr*rr; return (4/rr-4)/rr; } int main(int narg,char **arg) { int i,j; vector r[N]; /* konfigurace */ double Epair[N][N]; /* tabulka parovych energii */ double Ezkus[N]; /* tabulka parovych energii zkusebni konfigurace */ double Utot,Uzkus,U; L=pow(N/rho,1./3); /* hrana simulacni bunky */ Lh=L/2; /* pocatecni konfigurace je nahodna */ for (i=0; iL) rzkus.x-=L; if (rzkus.y<0) rzkus.y+=L; else if (rzkus.y>L) rzkus.y-=L; if (rzkus.z<0) rzkus.z+=L; else if (rzkus.z>L) rzkus.z-=L; /* vypocet stare (U) a nove (Uzkus) energie */ Uzkus=U=0; /* soucet pres vsechny atomy ruzne od i */ for (j=0; j