<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Amorim</id>
	<title>Física Computacional - Contribuições do usuário [pt-br]</title>
	<link rel="self" type="application/atom+xml" href="http://fiscomp.if.ufrgs.br/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Amorim"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php/Especial:Contribui%C3%A7%C3%B5es/Amorim"/>
	<updated>2026-04-18T17:49:02Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=685</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=685"/>
		<updated>2016-10-13T00:44:28Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;\vec{r_i}&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;. Importante notar que na formulação da funções-exemplo foram utilizadas condições de contorno periódicas no sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela.&amp;lt;br&amp;gt;&lt;br /&gt;
Vale lembrar que campo gravitacional aqui computado gera uma força central, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Também é importante lembrar que aqui é desconsiderado a interação gravitacional entre quaisquer duas partículas, uma vez que assume-se que massas são pequenas e desprezíveis em frente a massa que forma o campo em que estão imersas.&amp;lt;br&amp;gt;&lt;br /&gt;
===Cálculo do tempo de colisão===&lt;br /&gt;
Uma preocupação que alguém pode ter com a adição de um campo gravitacional na simulação seria de que seria necessário mudar o cálculo do tempo mínimo entre as colisões. No entanto, como será mostrado a seguir, isso não é necessário e o cálculo permanece o mesmo.&amp;lt;br&amp;gt;&lt;br /&gt;
De maneira geral, sem cálculos, o que deve ser feito é abrir cada vetor de deslocamento, adicionando um termo de tempo quadrádico ligado à aceleração gravitacional do campo escolhido, e elevar ao quadrado a condição de que ocorra a colisão. A partir daí tudo que se é necessário fazer é trabalhar a álgebra, que no fim, eliminará todos os termos com a aceleração. Para verificar o cálculo completo veja na página [[Cálculo do tempo de colisão com aceleração]].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
Como este campo só atua na componente &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código da seção anterior para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de g=2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=639</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=639"/>
		<updated>2016-07-10T01:06:23Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Mudança de velocidade em uma colisão elástica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;. Importante notar que na formulação da funções-exemplo foram utilizadas condições de contorno periódicas no sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela.&amp;lt;br&amp;gt;&lt;br /&gt;
Vale lembrar que campo gravitacional aqui computado gera uma força central, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Também é importante lembrar que aqui é desconsiderado a interação gravitacional entre quaisquer duas partículas, uma vez que assume-se que massas são pequenas e desprezíveis em frente a massa que forma o campo em que estão imersas.&amp;lt;br&amp;gt;&lt;br /&gt;
===Cálculo do tempo de colisão===&lt;br /&gt;
Uma preocupação que alguém pode ter com a adição de um campo gravitacional na simulação seria de que seria necessário mudar o cálculo do tempo mínimo entre as colisões. No entanto, como será mostrado a seguir, isso não é necessário e o cálculo permanece o mesmo.&amp;lt;br&amp;gt;&lt;br /&gt;
De maneira geral, sem cálculos, o que deve ser feito é abrir cada vetor de deslocamento, adicionando um termo de tempo quadrádico ligado à aceleração gravitacional do campo escolhido, e elevar ao quadrado a condição de que ocorra a colisão. A partir daí tudo que se é necessário fazer é trabalhar a álgebra, que no fim, eliminará todos os termos com a aceleração. Para verificar o cálculo completo veja na página [[Cálculo do tempo de colisão com aceleração]].&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
Como este campo só atua na componente &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código da seção anterior para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de g=2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=635</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=635"/>
		<updated>2016-07-01T12:44:34Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;. Importante notar que na formulação da funções-exemplo foram utilizadas condições de contorno periódicas no sistema.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela.&amp;lt;br&amp;gt;&lt;br /&gt;
Vale lembrar que campo gravitacional aqui computado gera uma força central, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Também é importante lembrar que aqui é desconsiderado a interação gravitacional entre quaisquer duas partículas, uma vez que assume-se que massas são pequenas e desprezíveis em frente a massa que forma o campo em que estão imersas.&amp;lt;br&amp;gt;&lt;br /&gt;
===Cálculo do tempo de colisão===&lt;br /&gt;
Uma preocupação que alguém pode ter com a adição de um campo gravitacional na simulação seria de que seria necessário mudar o calculo do tempo mínimo entre as colisões. No entanto, como será mostrado a seguir, isso não é necessário e o cálculo permanece o mesmo.&amp;lt;br&amp;gt;&lt;br /&gt;
Tendo em mãos a condição para que ocorra uma colisão: &amp;lt;math&amp;gt;|\vec{r}_{i}(t+dt) - \vec{r}_{j}(t+dt)| = \sigma&amp;lt;/math&amp;gt;, e que &amp;lt;math&amp;gt;\vec{r}_{i}(t+dt) = \vec{r}_{i} + \vec{v}_{i}dt + \vec{g}\frac{dt^2}{2}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\vec{r}_{j}(t+dt) = \vec{r}_{j} + \vec{v}_{j}dt + \vec{g}\frac{dt^2}{2}&amp;lt;/math&amp;gt;, podemos elevar os dois lados da equação da condição ao quadrado, retirar o módulo uma vez que o resultado será sempre positivo, obtendo:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(\vec{r}_{i}(t+dt) - \vec{r}_{j}(t+dt))^2 = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{i}^2 + \vec{v}_{i}^2dt^2 + \vec{g}^2\frac{dt^4}{4} + 2\vec{r}_{i}\vec{v}_{i}dt + 2\vec{r}_{i}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{i}\frac{dt^3}{2} -2(\vec{r}_{i} + \vec{v}_{i}dt + \vec{g}\frac{dt^2}{2})(\vec{r}_{j} + \vec{v}_{j}dt + \vec{g}\frac{dt^2}{2}) + \vec{r}_{j}^2 + \vec{v}_{j}^2dt^2 + \vec{g}^2\frac{dt^4}{4} + 2\vec{r}_{j}\vec{v}_{j}dt + 2\vec{r}_{j}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{i}^2 + \vec{v}_{i}^2dt^2 + \vec{g}^2\frac{dt^4}{2} + 2\vec{r}_{i}\vec{v}_{i}dt + 2\vec{r}_{i}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{i}\frac{dt^3}{2} -2\vec{r}_{i}\vec{r}_{j} -2\vec{r}_{i}\vec{v}_{j}dt -2\vec{r}_{i}\vec{g}\frac{dt^2}{2} -2\vec{r}_{j}\vec{v}_{i}dt -2\vec{v}_{i}\vec{v}_{j}dt^2 -2\vec{v}_{i}\vec{g}\frac{dt^3}{2} -2\vec{r}_{j}\vec{g}\frac{dt^2}{2} -2\vec{v}_{j}\vec{g}\frac{dt^3}{2} -\vec{g}^2\frac{dt^4}{2} + \vec{r}_{j}^2 + \vec{v}_{j}^2dt^2 + 2\vec{r}_{j}\vec{v}_{j}dt + 2\vec{r}_{j}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{j}\vec{g}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Reajeitando os termos antes da simplificação final:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{i}^2 -2\vec{r}_{i}\vec{r}_{j} + \vec{r}_{j}^2 + \vec{v}_{i}^2dt^2 -2\vec{v}_{i}\vec{v}_{j}dt^2 + \vec{v}_{j}^2dt^2 + \vec{g}^2\frac{dt^4}{2} -\vec{g}^2\frac{dt^4}{2} + 2\vec{r}_{i}\vec{g}\frac{dt^2}{2} -2\vec{r}_{i}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{i}\frac{dt^3}{2} -2\vec{v}_{i}\vec{g}\frac{dt^3}{2} -2\vec{r}_{j}\vec{g}\frac{dt^2}{2} + 2\vec{r}_{j}\vec{g}\frac{dt^2}{2} -2\vec{v}_{j}\vec{g}\frac{dt^3}{2} + 2\vec{v}_{j}\vec{g}\frac{dt^3}{2} + 2\vec{r}_{i}(\vec{v}_{i} - \vec{v}_{j})dt -2\vec{r}_{j}(\vec{v}_{i} - \vec{v}_{j})dt = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Ao simplificar obtemos a mesma equação quadrática para se calcular o &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, onde ficou definido &amp;lt;math&amp;gt;\Delta \vec{r} = \vec{r}_{i} - \vec{r}_{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta \vec{v} = \vec{v}_{i} - \vec{v}_{j}&amp;lt;/math&amp;gt; na seção anterior:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(\vec{r}_{i} - \vec{r}_{j})^2 + (\vec{v}_{i} - \vec{v}_{j})^2dt^2 + 2(\vec{r}_{i} - \vec{r}_{j})(\vec{v}_{i} - \vec{v}_{j})dt -\sigma^2 = 0&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
Como este campo só atua na componente &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código da seção anterior para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de g=2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=634</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=634"/>
		<updated>2016-07-01T12:42:44Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Importante notar também que na formulação da função exemplo acima foram utilizadas condições de contorno periódicas no sistema. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela.&amp;lt;br&amp;gt;&lt;br /&gt;
Vale lembrar que campo gravitacional aqui computado gera uma força central, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
Também é importante lembrar que aqui é desconsiderado a interação gravitacional entre quaisquer duas partículas, uma vez que assume-se que massas são pequenas e desprezíveis em frente a massa que forma o campo em que estão imersas.&amp;lt;br&amp;gt;&lt;br /&gt;
===Cálculo do tempo de colisão===&lt;br /&gt;
Uma preocupação que alguém pode ter com a adição de um campo gravitacional na simulação seria de que seria necessário mudar o calculo do tempo mínimo entre as colisões. No entanto, como será mostrado a seguir, isso não é necessário e o cálculo permanece o mesmo.&amp;lt;br&amp;gt;&lt;br /&gt;
Tendo em mãos a condição para que ocorra uma colisão: &amp;lt;math&amp;gt;|\vec{r}_{i}(t+dt) - \vec{r}_{j}(t+dt)| = \sigma&amp;lt;/math&amp;gt;, e que &amp;lt;math&amp;gt;\vec{r}_{i}(t+dt) = \vec{r}_{i} + \vec{v}_{i}dt + \vec{g}\frac{dt^2}{2}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\vec{r}_{j}(t+dt) = \vec{r}_{j} + \vec{v}_{j}dt + \vec{g}\frac{dt^2}{2}&amp;lt;/math&amp;gt;, podemos elevar os dois lados da equação da condição ao quadrado, retirar o módulo uma vez que o resultado será sempre positivo, obtendo:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(\vec{r}_{i}(t+dt) - \vec{r}_{j}(t+dt))^2 = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{i}^2 + \vec{v}_{i}^2dt^2 + \vec{g}^2\frac{dt^4}{4} + 2\vec{r}_{i}\vec{v}_{i}dt + 2\vec{r}_{i}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{i}\frac{dt^3}{2} -2(\vec{r}_{i} + \vec{v}_{i}dt + \vec{g}\frac{dt^2}{2})(\vec{r}_{j} + \vec{v}_{j}dt + \vec{g}\frac{dt^2}{2}) + \vec{r}_{j}^2 + \vec{v}_{j}^2dt^2 + \vec{g}^2\frac{dt^4}{4} + 2\vec{r}_{j}\vec{v}_{j}dt + 2\vec{r}_{j}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{i}^2 + \vec{v}_{i}^2dt^2 + \vec{g}^2\frac{dt^4}{2} + 2\vec{r}_{i}\vec{v}_{i}dt + 2\vec{r}_{i}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{i}\frac{dt^3}{2} -2\vec{r}_{i}\vec{r}_{j} -2\vec{r}_{i}\vec{v}_{j}dt -2\vec{r}_{i}\vec{g}\frac{dt^2}{2} -2\vec{r}_{j}\vec{v}_{i}dt -2\vec{v}_{i}\vec{v}_{j}dt^2 -2\vec{v}_{i}\vec{g}\frac{dt^3}{2} -2\vec{r}_{j}\vec{g}\frac{dt^2}{2} -2\vec{v}_{j}\vec{g}\frac{dt^3}{2} -\vec{g}^2\frac{dt^4}{2} + \vec{r}_{j}^2 + \vec{v}_{j}^2dt^2 + 2\vec{r}_{j}\vec{v}_{j}dt + 2\vec{r}_{j}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{j}\vec{g}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Reajeitando os termos antes da simplificação final:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;\vec{r}_{i}^2 -2\vec{r}_{i}\vec{r}_{j} + \vec{r}_{j}^2 + \vec{v}_{i}^2dt^2 -2\vec{v}_{i}\vec{v}_{j}dt^2 + \vec{v}_{j}^2dt^2 + \vec{g}^2\frac{dt^4}{2} -\vec{g}^2\frac{dt^4}{2} + 2\vec{r}_{i}\vec{g}\frac{dt^2}{2} -2\vec{r}_{i}\vec{g}\frac{dt^2}{2} + 2\vec{v}_{i}\frac{dt^3}{2} -2\vec{v}_{i}\vec{g}\frac{dt^3}{2} -2\vec{r}_{j}\vec{g}\frac{dt^2}{2} + 2\vec{r}_{j}\vec{g}\frac{dt^2}{2} -2\vec{v}_{j}\vec{g}\frac{dt^3}{2} + 2\vec{v}_{j}\vec{g}\frac{dt^3}{2} + 2\vec{r}_{i}(\vec{v}_{i} - \vec{v}_{j})dt -2\vec{r}_{j}(\vec{v}_{i} - \vec{v}_{j})dt = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Ao simplificar obtemos a mesma equação quadrática para se calcular o &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, onde ficou definido &amp;lt;math&amp;gt;\Delta \vec{r} = \vec{r}_{i} - \vec{r}_{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta \vec{v} = \vec{v}_{i} - \vec{v}_{j}&amp;lt;/math&amp;gt; na seção anterior:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(\vec{r}_{i} - \vec{r}_{j})^2 + (\vec{v}_{i} - \vec{v}_{j})^2dt^2 + 2(\vec{r}_{i} - \vec{r}_{j})(\vec{v}_{i} - \vec{v}_{j})dt -\sigma^2 = 0&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementação ===&lt;br /&gt;
Como este campo só atua na componente &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código da seção anterior para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de g=2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=618</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=618"/>
		<updated>2016-06-21T18:41:48Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Evento dirigido */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=617</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=617"/>
		<updated>2016-06-21T18:41:27Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=616</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=616"/>
		<updated>2016-06-21T14:38:41Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA I&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA J&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=615</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=615"/>
		<updated>2016-06-21T14:38:09Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt_ij(double *xx, double *yy, double *vx, double *vy, double *dt_ij, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
//dt_ij é um vetor que armazena os menores valor de dt_ij para cada i&lt;br /&gt;
//colide é um vetor que armazena o valor de j correspondente a partícula que i colide no menor tempo dt_ij&lt;br /&gt;
&lt;br /&gt;
  double delta_t_ij = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t_ij = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t_ij &amp;lt; dt_ij[i]){&lt;br /&gt;
	dt_ij[i] = delta_t_ij;&lt;br /&gt;
  	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double dt_min){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*dt_min;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*dt_min;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=614</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=614"/>
		<updated>2016-06-21T14:28:22Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, cuja soma denotamos por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=613</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=613"/>
		<updated>2016-06-21T13:51:00Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as colisões. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=612</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=612"/>
		<updated>2016-06-21T13:50:25Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=611</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=611"/>
		<updated>2016-06-21T13:50:13Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=610</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=610"/>
		<updated>2016-06-21T13:49:56Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=609</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=609"/>
		<updated>2016-06-21T13:49:30Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=608</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=608"/>
		<updated>2016-06-21T13:48:18Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Otimização básica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é uma operação de ordem &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e em todo passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; I, J &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; I &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; J &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=607</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=607"/>
		<updated>2016-06-21T13:46:04Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Evento dirigido */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:fluxogram.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Fluxogram.png&amp;diff=606</id>
		<title>Arquivo:Fluxogram.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Fluxogram.png&amp;diff=606"/>
		<updated>2016-06-21T13:45:10Z</updated>

		<summary type="html">&lt;p&gt;Amorim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Flux.png&amp;diff=605</id>
		<title>Arquivo:Flux.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Flux.png&amp;diff=605"/>
		<updated>2016-06-21T13:43:26Z</updated>

		<summary type="html">&lt;p&gt;Amorim: Amorim enviou uma nova versão de &amp;amp;quot;Arquivo:Flux.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Flux.png&amp;diff=604</id>
		<title>Arquivo:Flux.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Flux.png&amp;diff=604"/>
		<updated>2016-06-21T13:41:57Z</updated>

		<summary type="html">&lt;p&gt;Amorim: Amorim enviou uma nova versão de &amp;amp;quot;Arquivo:Flux.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=603</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=603"/>
		<updated>2016-06-21T13:41:29Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Evento dirigido */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;I, J&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yy[i] = yy[i] + vy[i]*delta_t - g*delta_t*delta_t/2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
E também adiciona-se uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;, ficando:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vy[i] -= g*delta_t&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=595</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=595"/>
		<updated>2016-06-20T18:32:59Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica: &amp;lt;math&amp;gt;inserir linha&amp;lt;/math&amp;gt; e adicionar uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;. Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=594</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=594"/>
		<updated>2016-06-20T18:31:53Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Após alterar as velocidades basta avançar o sistema em &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;. Segue um exemplo de função.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void pos(double *xx, double *yy, double *vx, double *vy, double delta_t){&lt;br /&gt;
&lt;br /&gt;
  int i;&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; (NP); i++){&lt;br /&gt;
    xx[i] = xx[i] + vx[i]*delta_t;&lt;br /&gt;
    yy[i] = yy[i] + vy[i]*delta_t;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;br /&gt;
A adição de um campo gravitacional uniforme nesta simulação é bastante simples, basta definir uma nova variável, a qual aqui será chamada de g, e atribuir um valor de sua escolha a ela. Vale lembrar que a força gravitacional aqui computada gera um campo uniforme, ou seja, é radial em relação a cada partícula do sistema, de modo que só há força atuando na direção &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, no sentido negativo de &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt;, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição assim a linha de código fica: &amp;lt;math&amp;gt;inserir linha&amp;lt;/math&amp;gt; e adicionar uma aceleração em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em &amp;lt;math&amp;gt;y&amp;lt;/math&amp;gt; de &amp;lt;math&amp;gt;-g*dt_{min}&amp;lt;/math&amp;gt;. Mais abaixo é possível ver uma animação de como fica o sistema com essas mudanças feitas.&lt;br /&gt;
[[File:pot_desc_gravidade.gif|400px|thumb|Plot exemplo de resultado de simulação com um campo gravitacional uniforme de -2. O par de partículas destacadas em vermelho são as que colidiram.]]&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=582</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=582"/>
		<updated>2016-06-20T14:09:02Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|400px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=581</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=581"/>
		<updated>2016-06-20T14:08:46Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|375px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=580</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=580"/>
		<updated>2016-06-20T14:08:09Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|300px|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=579</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=579"/>
		<updated>2016-06-20T14:06:43Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:pot_descontinuo.gif|thumb|Plot exemplo de resultado de simulação. O par de partículas destacadas em vermelho são as colisoras.]]&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_descontinuo.gif&amp;diff=578</id>
		<title>Arquivo:Pot descontinuo.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_descontinuo.gif&amp;diff=578"/>
		<updated>2016-06-20T14:06:36Z</updated>

		<summary type="html">&lt;p&gt;Amorim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=571</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=571"/>
		<updated>2016-06-20T13:55:06Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Seguindo o fluxograma apresentado e utilizando as funções disponíveis chega-se, por exemplo, na animação ao lado, que mostra o decorrer da simulação conforme ocorrem as simulações.&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=568</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=568"/>
		<updated>2016-06-20T13:32:49Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Implementação computacional */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
Segue a implementação computacional, na linguagem de programação C, a função utilizada para o cálculo de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void calc_dt(double *xx, double *yy, double *vx, double *vy, double *deltat, int *colide, int i, int j){&lt;br /&gt;
&lt;br /&gt;
  double delta_t = INF;&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
  double sigma = 2*raio;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
  &lt;br /&gt;
  d = pow(drdv, 2) - dvdv*(drdr - pow(sigma, 2));&lt;br /&gt;
&lt;br /&gt;
  if(d &amp;gt; 0 &amp;amp;&amp;amp; drdv &amp;lt; 0){&lt;br /&gt;
    delta_t = (-1)*(drdv + sqrt(d))/(dvdv);&lt;br /&gt;
      if(delta_t &amp;lt; deltat[i]){&lt;br /&gt;
	deltat[i] = delta_t;&lt;br /&gt;
	colide[i] = j;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Onde foram definidos '''''INF''''' como um número computacionalmente grande e '''''raio''''' como o raio das partículas, em particular consideramos os raios de todas como iguais. Para realizar a troca de velocidades do par de partículas que colidem de forma a ser coerente com uma colisão elástica, confeccionou-se a função abaixo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void switch_veloc(double *xx, double *yy, double *vx, double *vy, int i, int j, double *Jx, double *Jy){&lt;br /&gt;
&lt;br /&gt;
  double dx, dy, dvx, dvy;&lt;br /&gt;
  double drdr, dvdv, drdv;&lt;br /&gt;
  double deltavx, deltavy;&lt;br /&gt;
  double sigma = 2*raio, sigma2 = pow(sigma,2), d;&lt;br /&gt;
  double X, Y;&lt;br /&gt;
	&lt;br /&gt;
  X = xx[i] - xx[j];&lt;br /&gt;
  dx = fmod(X, Lx) - rint(fmod(X, Lx)/Lx)*Lx;&lt;br /&gt;
  Y = yy[i] - yy[j];&lt;br /&gt;
  dy = fmod(Y, Ly) - rint(fmod(Y, Ly)/Ly)*Ly;&lt;br /&gt;
&lt;br /&gt;
  dvx = vx[i] - vx[j];&lt;br /&gt;
  dvy = vy[i] - vy[j];&lt;br /&gt;
  &lt;br /&gt;
  drdv = dx*dvx + dy*dvy;&lt;br /&gt;
  drdr = dx*dx + dy*dy;&lt;br /&gt;
  dvdv = dvx*dvx + dvy*dvy;&lt;br /&gt;
&lt;br /&gt;
  Jx[i] = drdv*dx/sigma2;&lt;br /&gt;
  Jy[i] = drdv*dy/sigma2;&lt;br /&gt;
&lt;br /&gt;
  deltavx = Jx[i];&lt;br /&gt;
  deltavy = Jy[i];&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA i&lt;br /&gt;
  vx[i] -= deltavx;&lt;br /&gt;
  vy[i] -= deltavy;&lt;br /&gt;
&lt;br /&gt;
  //TROCA VELOCIDADES DA PARTICULA j&lt;br /&gt;
  vx[j] += deltavx;&lt;br /&gt;
  vy[j] += deltavy;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=561</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=561"/>
		<updated>2016-06-20T13:02:38Z</updated>

		<summary type="html">&lt;p&gt;Amorim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=551</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=551"/>
		<updated>2016-06-19T01:40:26Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Evento dirigido */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=550</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=550"/>
		<updated>2016-06-19T01:39:20Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Otimização básica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
[[File:flux.png|thumb|Fluxograma de um programa simples usando o método de evento dirigido com a otimização aqui explicitada.]]&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Flux.png&amp;diff=549</id>
		<title>Arquivo:Flux.png</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Flux.png&amp;diff=549"/>
		<updated>2016-06-19T01:37:33Z</updated>

		<summary type="html">&lt;p&gt;Amorim: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=548</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=548"/>
		<updated>2016-06-19T00:41:17Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Otimização básica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
Dado uma simulação de &amp;lt;math&amp;gt; N &amp;lt;/math&amp;gt; partículas, determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; é da ordem de &amp;lt;math&amp;gt; N^2 &amp;lt;/math&amp;gt;, ou seja, evitar fazer esse processo todo passo de tempo economiza grande parte do tempo computacional. Uma forma simples de fazer isso é determinar e armazenar o menor &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; para cada partícula &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; e o índice &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt; antes do loop temporal e a cada passo de tempo determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; a partir dos &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; armazenados. Assim, a cada passo de tempo seria necessário apenas atualizar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; das partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; e das que colidiriam com &amp;lt;math&amp;gt; i &amp;lt;/math&amp;gt; ou &amp;lt;math&amp;gt; j &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=547</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=547"/>
		<updated>2016-06-19T00:25:04Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Mudança de velocidade em uma colisão elástica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt;, sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \vec{J} = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma^2(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;.&lt;br /&gt;
Assim, a variação de velocidades pode ser determinada por:&lt;br /&gt;
:&amp;lt;math&amp;gt; \Delta \vec{v_i} = -\frac{\vec{J}}{m_i} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v_j} = \frac{\vec{J}}{m_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=546</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=546"/>
		<updated>2016-06-19T00:11:42Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Mudança de velocidade em uma colisão elástica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; J_i = \frac{2m_im_j(\Delta \vec{r} . \Delta \vec{v})}{\sigma(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=545</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=545"/>
		<updated>2016-06-19T00:11:18Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Evento dirigido */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; J_i = \frac{(2m_im_j\Delta \vec{r} . \Delta \vec{v})}{\sigma(m_i + m_j)}\Delta \vec{r} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=544</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=544"/>
		<updated>2016-06-19T00:10:04Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Mudança de velocidade em uma colisão elástica */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
Para fazer a mudança de velocidades temos que considerar o caso de colisão elástica entre as partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; sendo impulso dado por:&lt;br /&gt;
:&amp;lt;math&amp;gt; J_i = \frac{}{} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=543</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=543"/>
		<updated>2016-06-19T00:04:25Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Otimização */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Otimização básica===&lt;br /&gt;
&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=542</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=542"/>
		<updated>2016-06-18T23:53:06Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Otimização===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=541</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=541"/>
		<updated>2016-06-18T23:52:51Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Otimização===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=540</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=540"/>
		<updated>2016-06-18T23:52:18Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Otimização===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=539</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=539"/>
		<updated>2016-06-18T23:52:07Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Com isso, consegue-se determinar o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; encontrando o menor valor de &amp;lt;math&amp;gt; dt{col} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Otimização===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=538</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=538"/>
		<updated>2016-06-18T23:48:25Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Evento dirigido */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. Consegue-se então determinar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; que representa o tempo que o par de partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; levariam para colidir. Com isso, o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; será o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Otimização===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=537</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=537"/>
		<updated>2016-06-18T23:46:42Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{ij}) - \vec{r_j}(t + dt_{ij})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{ij}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{ij} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. Consegue-se então determinar o valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt; que representa o tempo que o par de partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; levariam para colidir. Com isso, o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; será o menor valor de &amp;lt;math&amp;gt; dt_{ij} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=536</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=536"/>
		<updated>2016-06-18T23:44:25Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{col}) - \vec{r_j}(t + dt_{col})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{col} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. Consegue-se então determinar o valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt; que representa o tempo que o par de partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; levariam para colidir. Com isso, o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; será o menor valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=535</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=535"/>
		<updated>2016-06-18T23:43:33Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{col}) - \vec{r_j}(t + dt_{col})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{col} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Consegue-se então determinar o valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt; que representa, em palavras, o tempo que o par de partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; levaria para colidir. Com isso, o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; será o menor valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=534</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=534"/>
		<updated>2016-06-18T23:42:44Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{col}) - \vec{r_j}(t + dt_{col})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{col} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
O valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt; representa, em palavras, o tempo que o par de partículas &amp;lt;math&amp;gt; i, j &amp;lt;/math&amp;gt; levaria para colidir. Com isso, o valor de &amp;lt;math&amp;gt; dt_{min} &amp;lt;/math&amp;gt; será o menor valor de &amp;lt;math&amp;gt; dt_{col} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=533</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=533"/>
		<updated>2016-06-18T23:38:54Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{col}) - \vec{r_j}(t + dt_{col})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{col} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=532</id>
		<title>DM de potenciais descontínuos</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=532"/>
		<updated>2016-06-18T22:56:02Z</updated>

		<summary type="html">&lt;p&gt;Amorim: /* Determinação do tempo de colisão */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dinâmica molecular de potenciais descontínuos é uma abordagem computacional utilizada para determinar o movimento de partículas duras que só interagem por forças de contato. Assim, fica evidente a diferença entre o potencial Lennard-Jones pois este se baseia em uma interação de curto alcance, como é mostrado em [[DM: um primeiro programa]]. Para entender como as colisões ocorrem, conhecer a forma do potencial a ser estudado é vital. Como estamos considerando corpos rígidos, ou seja, que não sofrem deformação, percebe-se que a força de contato entre as partículas será infinita e o tempo de interação zero, o que torna impossível a descrição do problema a partir de uma integração de movimento simples. O método utilizado, a ser explicitado aqui, que resolve este problema é o evento dirigido.&lt;br /&gt;
==Evento dirigido==&lt;br /&gt;
A ideia do método para resolver o problema do força infinita é, ao invés de avançar o sistema em pequenos passos de tempo &amp;lt;math&amp;gt;dt&amp;lt;/math&amp;gt;, avançar a simulação conforme as colisões forem ocorrendo. Para isso deve-se encontrar o par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; que colidirá no menor intervalo de tempo entre todas as partículas, denotaremos tal intervalo por &amp;lt;math&amp;gt;dt_{min}&amp;lt;/math&amp;gt;, e, então, avançar o sistema. Neste ponto teremos dois objetos colados, portanto aqui deve ser feita a mudança de velocidades de tal forma a respeitar uma colisão elástica.&lt;br /&gt;
===Determinação do tempo de colisão===&lt;br /&gt;
Os objetos a serem usados para o cálculo do tempo de colisão entre um par de partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt; serão discos de raio &amp;lt;math&amp;gt;\sigma_i&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\sigma_j&amp;lt;/math&amp;gt;, de distância denotada por &amp;lt;math&amp;gt;\sigma&amp;lt;/math&amp;gt;. Portanto, segue que a condição de colisão é: &lt;br /&gt;
:&amp;lt;math&amp;gt;|\vec{r_i}(t + dt_{col}) - \vec{r_j}(t + dt_{col})| = \sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
Com &amp;lt;math&amp;gt;r_i&amp;lt;/math&amp;gt; sendo o vetor posição da partícula &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; o tempo de colisão entre as partículas &amp;lt;math&amp;gt;i, j&amp;lt;/math&amp;gt;. &amp;lt;br&amp;gt; Tal condição nos leva a determinação de &amp;lt;math&amp;gt;dt_{col}&amp;lt;/math&amp;gt; a partir da expressão:&lt;br /&gt;
:&amp;lt;math&amp;gt;&lt;br /&gt;
dt_{col} =&lt;br /&gt;
  \begin{cases}&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } d &amp;lt; 0 \\&lt;br /&gt;
    \infty &amp;amp; \quad \text{se } \Delta r . \Delta v &amp;gt; 0 \\&lt;br /&gt;
    -\frac{\Delta \vec{r} . \Delta \vec{v} + \sqrt{d}}{\Delta \vec{v} . \Delta \vec{v}} &amp;amp; \quad \text{nos demais casos}&lt;br /&gt;
  \end{cases}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
Onde &amp;lt;math&amp;gt; d \equiv (\Delta \vec{r} . \Delta \vec{v})^2 - (\Delta \vec{v} . \Delta \vec{v})(\Delta \vec{r} . \Delta \vec{r} - \sigma^2) &amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt; \Delta \vec{r} = \vec{r_i} - \vec{r_j} &amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt; \Delta \vec{v} = \vec{v_i} - \vec{v_j} &amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Mudança de velocidade em uma colisão elástica===&lt;br /&gt;
===Implementação computacional===&lt;br /&gt;
==Figurinhas sensacionais==&lt;br /&gt;
==Adição do campo gravitacional==&lt;/div&gt;</summary>
		<author><name>Amorim</name></author>
	</entry>
</feed>