<?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=Esteves</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=Esteves"/>
	<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Especial:Contribui%C3%A7%C3%B5es/Esteves"/>
	<updated>2026-04-28T01:23:26Z</updated>
	<subtitle>Contribuições do usuário</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=C%C3%A1lculo_do_tempo_de_colis%C3%A3o_com_acelera%C3%A7%C3%A3o&amp;diff=638</id>
		<title>Cálculo do tempo de colisão com aceleração</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=C%C3%A1lculo_do_tempo_de_colis%C3%A3o_com_acelera%C3%A7%C3%A3o&amp;diff=638"/>
		<updated>2016-07-07T16:30:16Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Cálculo do tempo de colisão com aceleração */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=C%C3%A1lculo_do_tempo_de_colis%C3%A3o_com_acelera%C3%A7%C3%A3o&amp;diff=637</id>
		<title>Cálculo do tempo de colisão com aceleração</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=C%C3%A1lculo_do_tempo_de_colis%C3%A3o_com_acelera%C3%A7%C3%A3o&amp;diff=637"/>
		<updated>2016-07-07T16:30:05Z</updated>

		<summary type="html">&lt;p&gt;Esteves: Criou página com &amp;#039;== Cálculo do tempo de colisão com aceleração ==  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;,...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Cálculo do tempo de colisão com aceleração ==&lt;br /&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;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=636</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=636"/>
		<updated>2016-07-07T16:29:10Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Cálculo 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;. 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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_descontinuo.gif&amp;diff=628</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=628"/>
		<updated>2016-06-27T18:30:30Z</updated>

		<summary type="html">&lt;p&gt;Esteves: Esteves enviou uma nova versão de &amp;amp;quot;Arquivo:Pot descontinuo.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=627</id>
		<title>Arquivo:Pot desc gravidade.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=627"/>
		<updated>2016-06-27T18:26:31Z</updated>

		<summary type="html">&lt;p&gt;Esteves: Esteves enviou uma nova versão de &amp;amp;quot;Arquivo:Pot desc gravidade.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=626</id>
		<title>Arquivo:Pot desc gravidade.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=626"/>
		<updated>2016-06-27T18:26:11Z</updated>

		<summary type="html">&lt;p&gt;Esteves: Esteves enviou uma nova versão de &amp;amp;quot;Arquivo:Pot desc gravidade.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=625</id>
		<title>Arquivo:Pot desc gravidade.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=625"/>
		<updated>2016-06-27T18:24:27Z</updated>

		<summary type="html">&lt;p&gt;Esteves: Esteves enviou uma nova versão de &amp;amp;quot;Arquivo:Pot desc gravidade.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=624</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=624"/>
		<updated>2016-06-27T18:10:42Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=623</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=623"/>
		<updated>2016-06-26T22:40:53Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Cálculo 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_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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2(r_{i} + v_{i}dt + g\frac{dt^2}{2})(r_{j} + v_{j}dt + g\frac{dt^2}{2}) + r_{j}^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{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;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{2} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2r_{i}r_{j} -2r_{i}v_{j}dt -2r_{i}g\frac{dt^2}{2} -2r_{j}v_{i}dt -2v_{i}v_{j}dt^2 -2v_{i}g\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} -2v_{j}g\frac{dt^3}{2} -g^2\frac{dt^4}{2} + r_{j}^2 + v_{j}^2dt^2 + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{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;
Reajeitando os termos antes da simplificação final:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 -2r_{i}r_{j} + r_{j}^2 + v_{i}^2dt^2 -2v_{i}v_{j}dt^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{2} -g^2\frac{dt^4}{2} + 2r_{i}g\frac{dt^2}{2} -2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2v_{i}\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} + 2r_{j}g\frac{dt^2}{2} -2v_{j}\frac{dt^3}{2} + 2v_{j}\frac{dt^3}{2} + 2r_{i}(v_{i} - v_{j})dt -2r_{j}(v_{i} - 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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=622</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=622"/>
		<updated>2016-06-26T22:38:37Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Cálculo 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_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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2(r_{i} + v_{i}dt + g\frac{dt^2}{2})(r_{j} + v_{j}dt + g\frac{dt^2}{2}) + r_{j}^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{2} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2r_{i}r_{j} -2r_{i}v_{j}dt -2r_{i}g\frac{dt^2}{2} -2r_{j}v_{i}dt -2v_{i}v_{j}dt^2 -2v_{i}g\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} -2v_{j}g\frac{dt^3}{2} -g^2\frac{dt^4}{2} + r_{j}^2 + v_{j}^2dt^2 + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&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;r_{i}^2 -2r_{i}r_{j} + r_{j}^2 + v_{i}^2dt^2 -2v_{i}v_{j}dt^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{2} -g^2\frac{dt^4}{2} + 2r_{i}g\frac{dt^2}{2} -2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2v_{i}\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} + 2r_{j}g\frac{dt^2}{2} -2v_{j}\frac{dt^3}{2} + 2v_{j}\frac{dt^3}{2} + 2r_{i}(v_{i} - v_{j})dt -2r_{j}(v_{i} - v_{j})dt = \sigma^2&amp;lt;/math&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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=621</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=621"/>
		<updated>2016-06-26T22:22:08Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;|r_{i}(t+dt) - r_{j}(t+dt)| = \sigma&amp;lt;/math&amp;gt;, e que &amp;lt;math&amp;gt;r_{i}(t+dt) = r_{i} + v_{i}dt + g\frac{dt^2}{2}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;r_{j}(t+dt) = r_{j} + v_{j}dt + 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;(r_{i}(t+dt) - r_{j}(t+dt))^2 = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2(r_{i} + v_{i}dt + g\frac{dt^2}{2})(r_{j} + v_{j}dt + g\frac{dt^2}{2}) + r_{j}^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{2} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2r_{i}r_{j} -2r_{i}v_{j}dt -2r_{i}g\frac{dt^2}{2} -2r_{j}v_{i}dt -2v_{i}v_{j}dt^2 -2v_{i}g\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} -2v_{j}g\frac{dt^3}{2} -g^2\frac{dt^4}{2} + r_{j}^2 + v_{j}^2dt^2 + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&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;r_{i}^2 -2r_{i}r_{j} + r_{j}^2 + v_{i}^2dt^2 -2v_{i}v_{j}dt^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{2} -g^2\frac{dt^4}{2} + 2r_{i}g\frac{dt^2}{2} -2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2v_{i}\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} + 2r_{j}g\frac{dt^2}{2} -2v_{j}\frac{dt^3}{2} + 2v_{j}\frac{dt^3}{2} + 2r_{i}(v_{i} - v_{j})dt -2r_{j}(v_{i} - v_{j})dt = \sigma^2&amp;lt;/math&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 r = r_{i} - r_{j}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;\Delta v = v_{i} - v_{j}&amp;lt;/math&amp;gt;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(r_{i} - r_{j})^2 + (v_{i} - v_{j})^2dt^2 + 2(r_{i} - r_{j})(v_{i} - v_{j})dt -\sigma^2 = 0&amp;lt;/math&amp;gt;&amp;lt;br&amp;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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=620</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=620"/>
		<updated>2016-06-26T22:11:12Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;
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 de interação entre as colisões. No entanto, como será mostrado a seguir,  isso não é necessário e 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;|r_{i}(t+dt) - r_{j}(t+dt)| = \sigma&amp;lt;/math&amp;gt;, e que &amp;lt;math&amp;gt;r_{i}(t+dt) = r_{i} + v_{i}dt + g\frac{dt^2}{2}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;r_{j}(t+dt) = r_{j} + v_{j}dt + 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;(r_{i}(t+dt) - r_{j}(t+dt))^2 = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2(r_{i} + v_{i}dt + g\frac{dt^2}{2})(r_{j} + v_{j}dt + g\frac{dt^2}{2}) + r_{j}^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{2} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2r_{i}r_{j} -2r_{i}v_{j}dt -2r_{i}g\frac{dt^2}{2} -2r_{j}v_{i}dt -2v_{i}v_{j}dt^2 -2v_{i}g\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} -2v_{j}g\frac{dt^3}{2} -g^2\frac{dt^4}{2} + r_{j}^2 + v_{j}^2dt^2 + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&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;r_{i}^2 -2r_{i}r_{j} + r_{j}^2 + v_{i}^2dt^2 -2v_{i}v_{j}dt^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{2} -g^2\frac{dt^4}{2} + 2r_{i}g\frac{dt^2}{2} -2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2v_{i}\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} + 2r_{j}g\frac{dt^2}{2} -2v_{j}\frac{dt^3}{2} + 2v_{j}\frac{dt^3}{2} + 2r_{i}(v_{i} - v_{j})dt -2r_{j}(v_{i} - v_{j})dt = \sigma^2&amp;lt;/math&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;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(r_{i} - r_{j})^2 + (v_{i} - v_{j})^2dt^2 + 2(r_{i} - r_{j})(v_{i} - v_{j})dt -\sigma^2 = 0&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&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 sessã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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=619</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=619"/>
		<updated>2016-06-26T22:10:48Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;
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 de interação entre as colisões. No entanto, como será mostrado a seguir,  isso não é necessário e 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;|r_{i}(t+dt) - r_{j}(t+dt)| = \sigma&amp;lt;/math&amp;gt;, e que &amp;lt;math&amp;gt;r_{i}(t+dt) = r_{i} + v_{i}dt + g\frac{dt^2}{2}&amp;lt;/math&amp;gt; e &amp;lt;math&amp;gt;r_{j}(t+dt) = r_{j} + v_{j}dt + 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;(r_{i}(t+dt) - r_{j}(t+dt))^2 = \sigma^2&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2(r_{i} + v_{i}dt + g\frac{dt^2}{2})(r_{j} + v_{j}dt + g\frac{dt^2}{2}) + r_{j}^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{4} + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;r_{i}^2 + v_{i}^2dt^2 + g^2\frac{dt^4}{2} + 2r_{i}v_{i}dt + 2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2r_{i}r_{j} -2r_{i}v_{j}dt -2r_{i}g\frac{dt^2}{2} -2r_{j}v_{i}dt -2v_{i}v_{j}dt^2 -2v_{i}g\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} -2v_{j}g\frac{dt^3}{2} -g^2\frac{dt^4}{2} + r_{j}^2 + v_{j}^2dt^2 + 2r_{j}v_{j}dt + 2r_{j}g\frac{dt^2}{2} + 2v_{j}\frac{dt^3}{2}= \sigma^2&amp;lt;/math&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;r_{i}^2 -2r_{i}r_{j} + r_{j}^2 + v_{i}^2dt^2 -2v_{i}v_{j}dt^2 + v_{j}^2dt^2 + g^2\frac{dt^4}{2} -g^2\frac{dt^4}{2} + 2r_{i}g\frac{dt^2}{2} -2r_{i}g\frac{dt^2}{2} + 2v_{i}\frac{dt^3}{2} -2v_{i}\frac{dt^3}{2} -2r_{j}g\frac{dt^2}{2} + 2r_{j}g\frac{dt^2}{2} -2v_{j}\frac{dt^3}{2} + 2v_{j}\frac{dt^3}{2} + 2r_{i}(v_{i} - v_{j})dt -2r_{j}(v_{i} - v_{j})dt = \sigma^2&amp;lt;/math&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;:&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;math&amp;gt;(r_{i} - r_{j})^2 + (v_{i} - v_{j})^2dt^2 + 2(r_{i} - r_{j})(v_{i} - v_{j})dt -\sigma^2 = 0&amp;lt;/math&amp;gt;&amp;lt;br&amp;gt;&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 sessã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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=602</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=602"/>
		<updated>2016-06-20T18:42:42Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=601</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=601"/>
		<updated>2016-06-20T18:42:24Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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 - \frac{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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=600</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=600"/>
		<updated>2016-06-20T18:41:35Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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]*dt_{min} - \frac{g*dt_{min}^2}{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*dt_{min}&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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=598</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=598"/>
		<updated>2016-06-20T18:35:52Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;yy[i] = yy[i] + vy[i]*delta_t;&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;, ficando &amp;lt;math&amp;gt;vy[i] -= 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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=593</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=593"/>
		<updated>2016-06-20T17:10:47Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=588</id>
		<title>Arquivo:Pot desc gravidade.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=588"/>
		<updated>2016-06-20T14:39:34Z</updated>

		<summary type="html">&lt;p&gt;Esteves: Esteves enviou uma nova versão de &amp;amp;quot;Arquivo:Pot desc gravidade.gif&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=587</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=587"/>
		<updated>2016-06-20T14:36:15Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;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 y, no sentido negativo de y.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em y, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição (adicionar treco aqui dps da linha cima) e adicionar uma aceleração em y nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em y de -g*dt. Mais abaixo também é 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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=586</id>
		<title>Arquivo:Pot desc gravidade.gif</title>
		<link rel="alternate" type="text/html" href="http://fiscomp.if.ufrgs.br/index.php?title=Arquivo:Pot_desc_gravidade.gif&amp;diff=586"/>
		<updated>2016-06-20T14:35:01Z</updated>

		<summary type="html">&lt;p&gt;Esteves: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=585</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=585"/>
		<updated>2016-06-20T14:26:34Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;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 y, no sentido negativo de y.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em y, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição (adicionar treco aqui dps da linha cima) e adicionar uma aceleração em y nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em y de -g*dt. Mais abaixo também é possível ver uma animação de como fica o sistema com essas especificações comentadas com g = -2.&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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=584</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=584"/>
		<updated>2016-06-20T14:26:15Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;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 y, no sentido negativo de y.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em y, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição (adicionar treco aqui dps da linha cima) e adicionar uma aceleração em y nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em y de -g*dt. Mais abaixo também é possível ver uma animação de como fica o sistema com essas especificações comentadas com g = -2.&lt;br /&gt;
[[File:pot_descontinuo.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>Esteves</name></author>
	</entry>
	<entry>
		<id>http://fiscomp.if.ufrgs.br/index.php?title=DM_de_potenciais_descont%C3%ADnuos&amp;diff=583</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=583"/>
		<updated>2016-06-20T14:23:11Z</updated>

		<summary type="html">&lt;p&gt;Esteves: /* Adição do campo gravitacional */&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 &#039;&#039;&#039;&#039;&#039;INF&#039;&#039;&#039;&#039;&#039; como um número computacionalmente grande e &#039;&#039;&#039;&#039;&#039;raio&#039;&#039;&#039;&#039;&#039; 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;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 y, no sentido negativo de y.&lt;br /&gt;
&lt;br /&gt;
Como este campo só atua em y, basta modificar as linha de código acima para adicionar um termo de tempo quadrático à variação da posição (adicionar treco aqui dps da linha cima) e adicionar uma aceleração em y nesta mesma parte do programa, de modo que haverá uma atualização na velocidade em y de -g*dt. Mais acima também é possível ver uma animação de como fica o sistema com essas especificações comentadas com g = -2.&lt;/div&gt;</summary>
		<author><name>Esteves</name></author>
	</entry>
</feed>