Medidas estáticas: mudanças entre as edições
Sem resumo de edição |
Sem resumo de edição |
||
| Linha 1: | Linha 1: | ||
Em dinâmica molecular, medidas estáticas são medidas que | Em dinâmica molecular, medidas estáticas são medidas que | ||
= Psi 6= | = Psi 6= | ||
No estudo do agrupamento de pontos equidistantes em um espaço 2D, é possível provar matematicamente que o formato formado pelos pontos que maximiza a utilização do espaço é o '''padrão hexagonal'''. Para dinâmicas moleculares com potenciais de Lennard-Jones com densidade suficientemente alta (rho ~) é possível observar que o padrão formado após o relaxamento (tempo suficiente para a rede se estabilizar) é de fato o padrão hexagonal. | No estudo do agrupamento de pontos equidistantes em um espaço 2D, é possível provar matematicamente que o formato formado pelos pontos que maximiza a utilização do espaço é o '''padrão hexagonal'''. Para dinâmicas moleculares com potenciais de Lennard-Jones com densidade suficientemente alta (rho ~) é possível observar que o padrão formado após o relaxamento (tempo suficiente para a rede se estabilizar) é de fato o padrão hexagonal. | ||
| Linha 123: | Linha 123: | ||
Agora somente precisa-se realizar um algoritmo que ordene o vetor "angle" do menor para o maior ângulo, desta forma é possível calcular os <math> \theta_i </math> | Agora somente precisa-se realizar um algoritmo que ordene o vetor "angle" do menor para o maior ângulo, desta forma é possível calcular os <math> \theta_i </math> | ||
Feito o ordenamento do vetor, basta calcular a média do valor do <math> \psi_6 </math> de cada vizinho. Para isto, precisamos calcular os valores de <math> \theta_i </math> em função dos <math> \phi </math>, basta realizar a subtração do próximo vizinho no vetor pelo valor do ângulo do vizinho atual, dessa forma: <math> \theta_i = \psi_i+1 - \psi_i </math> com exceção do último vizinho, que será o ângulo dele menos o do primeiro, desta forma a implementação fica: | |||
<pre> | |||
firstAngle=angle[0]; | |||
for(j=0;j<5;j++){ | |||
angle[j]=cos(6.*(angle[j+1]-angle[j])); | |||
} | |||
angle[5]=cos(6.*(firstAngle+2*PI-angle[5])); | |||
for(j=0;j<6;j++){ | |||
psix[i]+=angle[j]/6.; | |||
/ } | |||
/ } | |||
} | |||
</pre> | |||
E então está calculado o valor de <math> \psi_6 </math>, para facilitar a implementação é recomendado que este algoritmo seja uma função dentro de seu código e desta forma retorne o valor médio do vetor "psix" utilizado. | |||
=Pair Distribution Function= | =Pair Distribution Function= | ||
Edição das 23h10min de 19 de junho de 2016
Em dinâmica molecular, medidas estáticas são medidas que
Psi 6
No estudo do agrupamento de pontos equidistantes em um espaço 2D, é possível provar matematicamente que o formato formado pelos pontos que maximiza a utilização do espaço é o padrão hexagonal. Para dinâmicas moleculares com potenciais de Lennard-Jones com densidade suficientemente alta (rho ~) é possível observar que o padrão formado após o relaxamento (tempo suficiente para a rede se estabilizar) é de fato o padrão hexagonal.
O psi 6 é uma análise de o quão hexagonal um padrão de posições está em um certo tempo da simulação. É possível associar a cada partícula um valor que varia entre -1 e 1 da hexagonalidade do padrão de posições formado por ele e seus primeiros vizinhos (conjunto de partículas mais próximas). Com essa medida é possível quantificar diferentes regiões da "caixa" em que as partículas estão localizadas e então localizar possíveis "defeitos" no padrão hexagonal.
Para um padrão hexagonal perfeito, cada partícula apresenta 6 primeiros vizinhos, cada qual posicionado simetricamente em torno dessa. Analisando a simetria, cada vizinho consecutivo deve apresentar um ângulo de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \frac{\pi}{3}} . Buscando uma relação em que esta situação seja a situação de , é possível definir que o vale:
Onde i é o índice do i-ésimo vizinho e n é o número de primeiros vizinhos. Esta relação deixa específico que o caso de 6 primeiros vizinhos e resulte em um valor de .
Implementação Computacional
Pode-se separar a implementação computacional em dois procedimentos necesssários: Encontrar os primeiros vizinhos para cada partícula e então calcular, de fato, o valor de
Encontrando vizinhos
Por definição, os primeiros vizinhos de uma partícula são aquelas partículas que estão presentes em um anel mais próximo dela, como mostra a fig.
O problema de encontrar primeiros vizinhos é um problema bastante discutido em teoria da computação e diversos métodos foram desenvolvidos para efetuar esta tarefa. Desta forma a maioria dos métodos otimizados são de difícil implementação e então não serão tratados nesse verbete. Se o leitor tiver interesse, entretanto, são recomendados as seguintes referências:
O método aqui citado é pouco otimizado, pois utiliza-se um for em , porém de implementação razoavelmente simples. O método consiste em encontrar as 6 partículas mais próximas da partícula-teste (partícula em que busca-se calcular o valor de ), desta forma o valor de resultará em um valor razoável ( >0.8 ) se os 6 vizinhos são de fato os primeiros vizinhos e estão localizados em um padrão quase-hexagonal em torno da partícula-teste.
Define-se dois vetores chamados neighborsX,neighborsY e dNeighbors, que guardarão as posições X,Y e a distância do i-ésimo vizinho. Então os valores iniciais destes vetores recebem valores altos em relação as medidas da caixa (neste exemplo utilizou-se 20 para os dois lados), da seguinte forma:
int i;
double neighborsX[6],neighborsY[6];
for(i=0;i<6;i++){
neighborsX[i]=999;
neighborsY[i]=999;
dNeighbors[i]=999;
}
Após, realizar-se-á a busca pelas 6 partículas mais próximas da partícula-teste, como queremos calcular para todas as partículas (NP) presentes na simulação, faremos um "for" em guardando as posições das duas partículas, é importante resetar os valores de dNeighbors toda vez que começa-se para outra partícula-teste. (Neste algoritmo chama-se a partícula-teste de "xOrg" (x original) e o possível vizinho de "x2") :
for(i=0;i<NP;i++){
xOrg=xx[i];
yOrg=yy[i];
for(j=0;j<6;j++){
dNeighbors[j]=999.;
}
for(j=0;j<NP;j++){
x2=xx[j];
y2=yy[j];
O próximo passo é de fato calcular a distância entre as partículas e testar se essa distância é menor que a maior distância presente no vetor dNeighbors. Isto é, o vetor dNeighbors começará com valores altos (999) e irá guardar partículas que tenham alguma distância menor que um valor presente em dNeighbors.
Também é importante ressaltar que esse algoritmo tomaria uma grande parte de tempo para sistemas com alto número de partículas, desta forma é bom setar um raio de corte para o cálculo da distância, isto é, os cálculos de se uma partícula é ou não vizinho somente serão calculados caso o possível vizinho esteja suficientemente perto da partícula-teste, suficientemente perto neste algoritmo é determinado utilizando a medida de g(r) (Explicada acima), pega-se um valor um pouco maior que o primeiro pico da g(r) e define-se como o "radiusLimit" (Raio limite) do codigo:
if(i!=j){
//Calcula distância entre partícula-teste e possível vizinho
deltaX=fabs(x2-xOrg);
deltaY=fabs(y2-yOrg);
deltaX=deltaX-rint(deltaX/Lx)*Lx;
deltaY=deltaY-rint(deltaY/Ly)*Ly;
dNew=sqrt((deltaX*deltaX)+(deltaY*deltaY));
// --- //
if(dNew<radiusLimit) // Testa se a distância é menor que o raio limite
{
//Procura-se o maior valor presente em dNeighbors e salva-se com o nome de "dOld", bem como seu indíce como "index"
dOld=0;
for(k=0;k<6;k++){
if(dNeighbors[k]>dOld){
dOld=dNeighbors[k];
index=k;
}
}
// --- //
// Testa-se se a distância do possível vizinho é menor que a maior distância presente já em dNeighbors
if(dNew<dOld){
neighborsX[index]=x2;
neighborsY[index]=y2;
dNeighbors[index]=dNew;
}
}
}
}
Portanto após esse algoritmo, temos guardadas as posições das 6 partículas mais próximas, é importante ressaltar que o "for" em partícula-teste ainda não foi fechado, e ainda dentro deste mesmo loop serão calculados os valores de .
Calculando o Psi 6
Tendo os valores de X e Y dos vizinhos da partícula-teste, podemos proceder para o cálculo do . Para este cálculo, precisamos dos ângulos que cada vizinho tem em relação a partícula-teste, isto é, setamos um referencial X-Y com a origem na partícula-teste e calculamos o ângulo que cada vizinho tem com o eixo X, este ângulo será chamado de e será dado pela seguinte relação:
Na implementação em código fica:
for(j=0;j<6;j++){ // Calculating angles
delX=neighborsX[j]-xx[i];
delY=neighborsY[j]-yy[i];
//Condições de contorno periódicas
delX=delX-rint(delX/Lx)*Lx;
delY=delY-rint(delY/Ly)*Ly;
// --- //
angle[j]=atan2(delY,delX);
if (angle[j]<0)
angle[j]=2*PI+angle[j];
psix[i]=0;
Agora somente precisa-se realizar um algoritmo que ordene o vetor "angle" do menor para o maior ângulo, desta forma é possível calcular os
Feito o ordenamento do vetor, basta calcular a média do valor do de cada vizinho. Para isto, precisamos calcular os valores de em função dos Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \phi }
, basta realizar a subtração do próximo vizinho no vetor pelo valor do ângulo do vizinho atual, dessa forma: Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \theta_i = \psi_i+1 - \psi_i }
com exceção do último vizinho, que será o ângulo dele menos o do primeiro, desta forma a implementação fica:
firstAngle=angle[0];
for(j=0;j<5;j++){
angle[j]=cos(6.*(angle[j+1]-angle[j]));
}
angle[5]=cos(6.*(firstAngle+2*PI-angle[5]));
for(j=0;j<6;j++){
psix[i]+=angle[j]/6.;
/ }
/ }
}
E então está calculado o valor de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \psi_6 } , para facilitar a implementação é recomendado que este algoritmo seja uma função dentro de seu código e desta forma retorne o valor médio do vetor "psix" utilizado.
Pair Distribution Function
A Pair Distribution Function , ou "Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle g(r)} ", é uma função que estima o quão provável é encontrar duas partículas a uma distância Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle r} dentro de um sistema de várias partículas.
Em um sistema de Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle N} partículas, o Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle g(r)} é definido como a média do número de partículas a uma distância Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle r} :
Numéricamente pode ser interpretado como a média do número de pares de partículas a uma distância entre Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle r} e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle r+\Delta r} pesado pelo volume/área desta região.
Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle g(r,\Delta r)=\frac{V_t}{N^2}\sum_{i=1}^N\sum_{j\neq i}^N\left[\frac{rect\left(\frac{r-|r_i-r_j|}{\Delta r}\right)}{V\left(r+\frac{\Delta r}{2}\right)-V\left(r-\frac{\Delta r}{2}\right)}\right] }
Onde Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle V_t} é o/a volume/área total e Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle rect} é a função retangular.
Em resumo, o Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle g(r,\Delta r)}
é a média dos histogramas do número de partículas em um bin de largura Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle \Delta r}
a uma Falhou ao verificar gramática (MathML com retorno SVG ou PNG (recomendado para navegadores modernos e ferramentas de acessibilidade): Resposta inválida ("Math extension cannot connect to Restbase.") do servidor "https://wikimedia.org/api/rest_v1/":): {\displaystyle r}
feitos para cada partícula no sistema pesado pelo volume/área deste bin.
Construção do Código
Resultados
Referências
- Frenkel, Daan and Smit, Berend (2001). Understanding Molecular Simulation. Academic Press.