
Enviado em 24/07/2015 - 14:37h
Estou fazendo um programa de Monte Carlo-Metropolis com implementação do Potencial de Lennard-Jones, porém a minha energia está se mantendo constante enquanto deveria variar e não consigo achar o problema do código.#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#define part 60
float randomic()
{
float f;
f=((rand()%2001/1000.0)) - 1;
return f;
}
int main(){
FILE *arq1;
FILE *arq2;
float raio, pos[part][3],d,dx,dy,dz,E0,sumE0,e,sigma,K,xalet,yalet,zalet,posant[part][3];
float dxtot,dytot,dztot,dtot,E,Etot,sumE,sumEtot,dE,B,T,r,aceita,Eeq,P[60],Prob[1000];
int lado, y,z,i,j,k,l,n,dmax,m,nn,nnn,p,q;
arq1=fopen("energia.txt","w");
arq2=fopen("probabilidade.txt","w");
raio=3.41;
lado=30;
y=0;
z=0;
e=119.8;
sigma=3.41;
K = 1.3806503*pow(10,-3);
dmax=5;
T=300;
p=0.1;
nn=0;
nnn=0;
sumE0=0;
sumE=0;
sumEtot=0;
E0=0;
E=0;
Etot=0;
pos[k][1]=0;
pos[k][2]=0;
pos[k][3]=0;
posant[k][1]=0;
posant[k][2]=0;
posant[k][3]=0;
pos[1][1]=3.41; // posição inicial de 1 a partir do centro em x
pos[1][2]=3.41; // posição inicial de 1 a partir do centro em y
pos[1][3]=3.41; // posição inicial de 1 a partir do centro em z
//colocando partÃculas na caixa
for(i=2;i<=part;i++){
pos[i][1]=pos[i-1][1] + 1.5*raio;
pos[i][2]=3.41 + 1.5*raio*y;
pos[i][3]=3.41 + 1.5*raio*z;
if(pos[i][1] > lado - raio){
y++;
pos[i][1]=3.41;
pos[i][2]=pos[i-1][2] + 1.5*raio;
}
if(pos[i][2] > lado - raio){
y=3.41;
z++;
pos[i][2]=3.41;
pos[i][3]=pos[i-1][3] + 1.5*raio;
}
//printf("%f %f %f ",pos[i][1],pos[i][2],pos[i][3]);
}
//calculando energia inicial
for(j=1;j<=part;j++){
for(k=j+1;k<=part;k++){
dx = pos[k][1] - pos[j][1];
dy = pos[k][2] - pos[j][2];
dz = pos[k][3] - pos[j][3];
dx = dx - round(dx/lado)*lado;
dy = dy - round(dy/lado)*lado;
dz = dz - round(dz/lado)*lado;
//printf("posicao[%d]=%f\n",k,pos[k][1]);
//printf("posicao[%d]=%f\n",j,pos[j][1]);
//printf("%f ",dx);
//printf("%f",dy);
//printf("%f",dz);
d = (dx*dx) + (dy*dy) + (dz*dz);
d = sqrt(d);
//printf("%f ",d);
E0=4*e*K*(pow((sigma/d),12)-pow((sigma/d),6));
//printf("%f ",E0);
sumE0=sumE0+E0;
}
}
//movimentação das partÃculas
for(n=1;n<=50000;n++){
k= 1 + ((int)rand()%(part+1)); // escolhe partÃcula aleatória
xalet=randomic();
yalet=randomic();
zalet=randomic();
//printf("%f",xalet);
posant[k][1]=pos[k][1];
posant[k][2]=pos[k][2];
posant[k][3]=pos[k][3];
pos[k][1] = pos[k][1] + xalet*dmax;
pos[k][2] = pos[k][2] + yalet*dmax;
pos[k][3] = pos[k][3] + zalet*dmax;
for(l=1;l<=3;l++){
if(pos[k][l] > lado - raio){
pos[k][l] = pos[k][l] + raio - (lado-raio)*(int)(pos[k][l]/(lado-raio));
}
if(pos[k][l] < raio){
pos[k][l] = pos[k][l] - raio + (lado-raio)*(int)(pos[k][l]/(lado-raio));
}
}
//energia depois do movimento
for(m=1;m<=part;m++){
if(m != k){
dx = posant[k][1] - pos[m][1];
dy = posant[k][1] - pos[m][2];
dz = posant[k][3] - pos[m][3];
dx = dx - round(dx/lado)*lado;
dy = dy - round(dy/lado)*lado;
dz = dz - round(dz/lado)*lado;
d = (dx*dx) + (dy*dy) + (dz*dz);
d = sqrt(d);
E = 4*e*K*(pow((sigma/d),12) - pow((sigma/d),6));
sumE=sumE+E;
dxtot = pos[k][1] - pos[m][1];
dytot = pos[k][2] - pos[m][2];
dztot = pos[k][3] - pos[m][3];
dxtot = dxtot - round(dx/lado)*lado;
dytot = dytot - round(dy/lado)*lado;
dztot = dztot - round(dz/lado)*lado;
dtot = (dxtot*dxtot) + (dytot*dytot) + (dztot*dztot);
dtot = sqrt(dtot);
Etot = 4*e*K*(pow((sigma/dtot),12) - pow((sigma/dtot),6));
sumEtot = sumEtot + Etot;
} // if k
} // if m
//diferença das energias
dE = sumEtot - sumE;
printf("ok");
if (dE < 0){ //aceita
sumE0 = sumE0 + dE;
}
if(dE > 0){ // rejeita
r = rand()%1001/1000;
B = exp((-1.0)*(dE)/(K*T));
if(B < r){ // rejeita
pos[k][1] = posant[k][1];
pos[k][2] = posant[k][2];
pos[k][3] = posant[k][3];
}
if(B > r){ //aceita
sumE0 = sumE0 + dE;
aceita++;
}
}
printf("ok1");
// equilÃbrio
if (n > 35000){
Eeq = (sumE0*sumE0);
Eeq = sqrt(sumE0);
//Eeq = Eeq/p; // energia por porção
//P[(int)Eeq] = P[(int)Eeq] + 1;
nn++;
if(nn == 1){
fprintf(arq1,"%f \n",sumE0);
nnn++;
if(nnn == 100){
printf("%d %f \n",m,sumE0);
nnn++;
nnn=0;
}
nn=0;
}
printf("ok2");
//probabilidades
for(q=1;q<=1000;q++){
Prob[q] = Prob[q]/(n-1000);
fprintf(arq2,"%d %f",q,Prob[q]);
}
} // n
}
fclose(arq1);
fclose(arq2);
return 0;
}
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









