S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m...

96
S´ erie 7, Simula¸c˜ao de Part ´ ıculas Cl´ assicas Grupo 20, Turno 2 Andr´ e Patr´ ıcio (67898) Bavieche Samgi (67901) MEFT, F´ ısica Computacional 20 de Dezembro de 2010 Resumo Simulamos neste trabalho um sistema de N part´ ıculas em interac¸c˜ ao grav´ ıtica e electroes- atica. Usamos uma abordagem lenta, mas que ´ e o kernel de v´ arios m´ etodos num´ ericos para simula¸c˜ ao de part´ ıculas, a saber, a aborgadem ’all-pairs’ calculation. Implementamos a simula¸c˜ ao em C++ e usamos a biblioteca gr´ afica OpenGl e, para me- lhoria da performance, introduzimos um pouco de processamento paralelo com OPENMP. Andr´ e Patr´ ıcio Bavieche Samgi 1

Transcript of S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m...

Page 1: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Serie 7, Simulacao de Partıculas Classicas

Grupo 20, Turno 2Andre Patrıcio (67898)Bavieche Samgi (67901)

MEFT, Fısica Computacional

20 de Dezembro de 2010

Resumo

Simulamos neste trabalho um sistema de N partıculas em interaccao gravıtica e electroes-tatica. Usamos uma abordagem lenta, mas que e o kernel de varios metodos numericos parasimulacao de partıculas, a saber, a aborgadem ’all-pairs’ calculation.

Implementamos a simulacao em C++ e usamos a biblioteca grafica OpenGl e, para me-lhoria da performance, introduzimos um pouco de processamento paralelo com OPENMP.

Andre Patrıcio Bavieche Samgi

1

Page 2: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Introducao

Simular um sistema de N corpos traduz-se numericamente na aproximacao da evolucao continuado sistema, em que cada corpo interage com os restantes, por um numero finito de passos deintegracao.

Exemplos familiares sao as simulacoes em Astrofısica e Fısica de Partıculas em que cadacorpo representa uma galaxia, uma estrela ou uma partıcula. Este tipo de simulacoes surge aindanoutros problemas computacionais como na simulacao de fluidos, em estudos de ADN, etc.

A abordagem ’all-pairs’ para a simulacao de N-corpos e uma tecnica de forca bruta, que emcada iteracao calcula as interaccoes entre cada par de corpos do sistema. Apesar de simples,esta tecnica, por ter esta faceta de globalizacao nos calculos, em que cada corpo e visto damesma forma, nao e muito usada na simulacao de grandes sistemas dada a sua complexidadecomputacional O(N2). Em geral, esta tecnica e usada como o nucleo computacional de outrastecnicas, em que apenas se consideram interaccoes a pequenas distancias ou em que se consideramaproximacoes mais sim ples do campo a longas distancias. Alguns destes algoritmos sao, porexemplo, o metodo de Barnes-Hut, o SPH, o PIC e os metodos ’particle-mesh’.

Vemos, portanto, que o objetivo de aumentar a performance do nucleo computacional daabordagem ’all-pairs’ nao e um objectivo perdido pois este aumento ira acelerar substancialmentequalquer um dos outros metodos de aproximacao usados. Para este fim, poderao usar-se tecnicasde processamento paralelo em GPU’s como a programacao em CUDA muito eficiente ou maistecnicas mais modestas de paralelizacao em CPU’s como a programacao em OPENMP.

Neste trabalho, simulamos um conjunto de N partıculas em interaccao gravıtica e electroes-tatica, com um programa escrito em C++ e com ciclos de iteracao optimizados em OPENMP.Para visualizacao da evolucao dinamica do sistema a 3D usamos a biblioteca grafica OPENGL.

2

Page 3: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

1 Problema

Dadas N partıculas com massas mi e cargas qi, com uma posicao inicial ~xi e velocidade inicialcvi, o campo ~Fij que a partıcula i sofre devido a interaccao da partıcula j e dada por:

~Fij =Gmimj − kqiqj|| ~rij ||2

· ~rij|| ~rij ||

(1)

onde ~rij = ~xj − ~xi e a distancia entre as partıculas i e j, G e a constante de GravitacaoUniversal e k = 1

4πε0a constante de Coulomb.

A forca total que actua na partıcula i devido as restantes N-1 partıculas e dada por:

~Fi =∑

1 ≤ j < Ni 6= j

~Fij =∑

1 ≤ j < Ni 6= j

(Gmimj − kqiqj) ·~rij

|| ~rij ||3(2)

Uma lacuna no modelo e que a forca entre duas partıculas cresce indefinidamente a medidaque elas se aproximam, o que e uma situacao indesejavel para integrar numericamente o sistema.Esta lacuna e colmatada com uma regularizacao do denominador com uma constante r0 de formaa que o numerador possa anular o campo quando o aplicamos a partıcula que o originou, vindopara a forca:

~Fi =∑

1≤j<N

~Fij =∑

1≤j<N

(Gmimj − kqiqj) ~rij

(|| ~rij ||2 + r20)3/2(3)

e para a aceleracao vem

~ai =∑

1≤j<N

1

mi· (Gmimj − kqiqj) ~rij

(|| ~rij ||2 + r20)3/2(4)

Devemos salientar que em todo este trabalho se fara uma analise nao relativista do movimentodas partıculas.

2 Implementacao

Foram implementados dois conjuntos de ficheiros, sendo que num destes optamos por uma aborda-gem mais ’orientada por objectos’, logo mais modular, com implementacao de classes de Campo,e no outro priveligiamos a performance. Passamos a descrever os dois conjuntos de ficheiros numaordem inversa aquela em que foi criada, ou seja, comecamos por descrever a implementacao daimplementacao com classes de Campo Gravıtico e Electroestatico e tomamos a segunda opcaocomo uma pequena alteracao da primeira. Comparamos, depois, a performance das duas opcoes,na proxima seccao.

Devemos salientar que nao aprofundaremos em muito a explicacao da totalidade do codigofonte e, em particular, do desenho grafico em opengl por nao ser de muita relevancia. Apresen-taremos, no entanto, todos os elementos necessarios a compreensao da simulacao.

2.1 Classe Particle

Comecamos por definir( G ) e implementar( H) a classe fundamental de todo este trabalho, aclasse-mae Particle, um tipo nao abstracto, o que significa que e possıvel instanciar objectos destaclasse com caracterısticas variaveis.

A classe implementada e um template, o que significa que podemos instanciar objectos daclasse que efectuam calculos com qualquer dos tipos T standard do C++( int, float, double ). Eeste tipo de implementacao que permtie mais tarde a utilizacao do programa em dupla ou simplesprecisao.

Cada partıcula tem as seguintes propriedades como dados-membro:

3

Page 4: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

• massa

• carga

• tamanho

• cor( grafica em formato RGB )

• posicao

• velocidade

Possui ainda as respetivas funcoes get, set e ainda um metodo para obter a energia cineticaclassica da partıcula.

Deve-se referir que a implementacao foi maioritariamente feita com funcoes virtuais de formaa permitir outras implementacoes dos metodos nas classes filhas que a seguir referimos.

Definimos e implementamos 4 classes-filhas da classe Particle:

• Electrao

• Protao

• Neutrao

• JPsi

Nestas classes-filhas usamos polimorfismo para nao permitir a modificacao das propriedadesfundamentais de cada partıcula, como a massa, a carga, o tamanho e a cor. Foram usadasunidades naturais de modo a evitar ambiguidades e colocamos G=k=1;

A implementacao das classes derivadas pode ver-se no ficheiro (I).

4

Page 5: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

2.2 Classe Campo

Implementamos uma classe geral e abstracta Campo, que se pode usar para definir classes-derivadas. Esta classe e classes derivadas descritas a seguir sao todas templates.

Esta classe tem os metodos e membros basicos de qualquer campo, ou seja, permite actualizaro campo, definir as partıculas geradoras do campo e obter estas mesmas partıculas. As partıculassao internamente representadas por um STL vector em que cada elemento e um ponteiro parauma partıcula.

Possui tambem um array(C Style) 2D, field, para armazenamento do campo na posicao decada partıcula e um metodo getField que permite obter o campo total correspondente ao sistemade partıculas, discretizado nas posicoes das mesmas.

Recomenda-se a leitura do codigo-fonte no apendice (J). Definimos e implementamos duas

classes derivadas da classe Campo, a classe CampoGravitico e a classe CampoElectrico. Podıamoster elaborado mais um nıvel de heranca, com a implementacao de uma classe representativa doscampos que variam com o inverso da distancia euclidiana, mas preferimos nao o fazer por nao serabsolutamente necessario e por a reducao do codigo nao ser muito significativa.

Ambas estas classes se caracterizam por definirem o metodo puramente virtual da classemae updateField que em conjunto com o metodo privado bodyBodyInteraction actualiza o campodiscreto. Caracterizam-se ainda por introduzirem nos calculos um factor de regularizacao docampo, descrito na seccao ( 1 ).

Apesar de presente nos anexos, mostramos o codigo usado para calcular a interaccao entreduas partıculas para o caso do campo Gravıtico( para o campo electrico tudo seria identico ):

template<class T>

void CampoGravitico<T>::bodyBodyInteraction( const int i, const int j,\

const T softFactorSquared )

{

/**Parte relativa a interacoes que variam com o quadrado da distancia**/

const T *r0 = Campo<T>::particles[ i ]->getPosition();

const T *rExt = Campo<T>::particles[ j ]->getPosition();

//Posicao relativa em relacao ao body0

const T r[3] = { rExt[0] - r0[0],\

rExt[1] - r0[1],\

rExt[2] - r0[2] };

//Quadrado da distancia com factor de rectificacao do campo

const T dist = sqrt( r[0]*r[0] + r[1]*r[1] + r[2]*r[2] + softFactorSquared );

//Calculo do quociente H = 1.0/( r^3 + soft^3 )

const T invDist = 1.0/dist;

const T invDistCube = invDist*invDist*invDist;

//Calcula (m_0,q_0)*(m_ext,q_ext)*G/( r^3 + soft^3 )

const T sG =

( Campo<T>::particles[ j ]->getMass() )*( Campo<T>::particles[ i ]->getMass() )

*G*invDistCube;

/**Actualiza campo**/

Campo<T>::field[ i ][ 0 ] += r[0]*sG;

Campo<T>::field[ i ][ 1 ] += r[1]*sG;

Campo<T>::field[ i ][ 2 ] += r[2]*sG;

}

Devemos ainda salientar que nos metodos updateField usamos directivas de processamentoparalelo nos ciclos de iteracaopara aumento da eficiencia:

5

Page 6: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

#pragma omp parallel for

Pode-se visualizar o codigo fonte da classe CampoGravitico no ficheiro (L) e da classe Cam-poElectrico no ficheiro (K).

2.3 Classe NParticleSystem

O objectivo desta classe e a gestao do sistema de partıculas, nomeadamente a gestao da actu-alizacao do seu estado dinamico e a randomizacao do estado dinamico das partıculas quandosolicitado.

Em particular, esta classe contem um metodo update que quando chamado integra o estadodinamico do sistema, chamando a funcao privada integrateNbodySystem.

Esta ultima funcao actualiza o campo electrico e gravitico das particulas, dois dados-membrodesta classe, e para cada partıcula altera o seu estado dinamico usando a lei de Newton comdiferencas finitas:

template <class T>

void NParticleSystem<T>::integrateNbodySystem( const T timeStep )

{

const T timeFactor = timeStep*dampFactor;

//Actualiza campos electrico e gravitico

electricField->updateField();

graviticField->updateField();

//Obtem os dois campos

const T** elecField = electricField->getField();

const T** gravField = graviticField->getField();

//Para cada particula do sistema, actualiza a sua posicao

#pragma omp parallel for

for ( unsigned int i = 0; i<numberOfBodies;++i)

{

const T invMassFactor = timeFactor/( particles[ i ]->getMass() );

//Antigas velocidades e posicoes

const T *pos = particles[ i ]->getPosition();

const T *vel = particles[ i ]->getVelocity();

//Novas velocidades

particles[ i ]->setVelocity(

vel[ 0 ]+( elecField[ i ][ 0 ]+gravField[ i ][ 0 ] )*invMassFactor,\

vel[ 1 ]+( elecField[ i ][ 1 ]+gravField[ i ][ 1 ] )*invMassFactor,\

vel[ 2 ]+( elecField[ i ][ 2 ]+gravField[ i ][ 2 ] )*invMassFactor );

//Nova posicao = antiga posicao + nova_velocidade*deltaTime

particles[ i ]->setPosition(

pos[ 0 ]+vel[ 0 ]*timeStep,\

pos[ 1 ]+vel[ 1 ]*timeStep,\

pos[ 2 ]+vel[ 2 ]*timeStep );

}

}

A classe permite ainda definir os factores de regulacao do campo softFactor, de amortecimento davelocidade dampFactor (maior → menor amortecimento ) e de intervalo de tempo timeStep para asdiferencas finitas.

A sua definicao apresenta-se no anexo (M) e a implementacao em (N).

6

Page 7: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

2.4 Classe NBodyDemo

Pretende-se com esta classe a gestao e interligacao entre o sistema de partıculas atras gerido pela classeNParticleSystem e o desenho grafico e visualizacao do sistema de partıculas.

Em particular, possui metodos para reiniciar estado dinamico do sistema de partıculas, selecionarmodos de demonstracao, desenhar partıculas do sistema no ecra, actualizar parametros e imprimir dadospara ficheiro externo.

A sua definicao e implementacao mostra-se no ficheiro (E), ficheiro onde esta definida a funcao maine as funcoes de callback e desenho grafico em openGl( nao do sistema de partıculas ).

Neste mesmo ficheiro definimos os parametros necessarios ao programa e a controlar pelo utilizador,modos de demonstracao e visualizacao do sistema de partıculas, que explicaremos mais adiante.

2.5 Classe ParticleRenderer

Com esta classe fazemos a gestao do desenho grafico das partıculas. em particular das texturas e modosde visualizacao.

As partıculas sao desenhadas com o modo de profundidade e com a iluminacao activada, de forma amelhorar a visualizacao em 3D.

Existem 3 modos de visualizacao das partıculas:

• PARTICLE SPHERES - representa cada partıcula como uma esfera de raio e cor iguais aos especi-ficados na respectiva classe;

• PARTICLE POINTS - cada partıcula e representada por um ponto no ecra, rodeado por um espectrocolorido( a purpura ) de dimensao variavel;

• PARTICLE SPRITES - mostra-se cada partıcula como um ponto quadrado a branco de tamanhovariavel.

cuja seleccao pelo utilizador explicaremos mais a frente. Deve notar-se que para efeitos de performancese devem seleccionar um dos ultimos dois modos, sendo o ultimo ideal para identificacao de todas aspartıculas no espaco, mesmo aquelas que ’escaparam’ para muito longe.

A sua definicao encontra-se em (O) e a implementacao em (P).

2.6 Classe ParamListGL

Reutilizamos a classe definida e implementada pela NVIDIA CORPORATION para apresentacao do menucom os parametros da simulacao.

2.7 Classe ioManager

Finalmente, criamos uma classe para gerir todas as funcionalidades de input/output para ficheiro e dalinha de comando. Explicaremos as funcionalidades desta classe na seccao (3).

A definicao e implementacao da classe encontram-se em (F).

2.8 Implementacao sem classe Campo

A implementacao sem a classe Campo, que optimiza os tempos de calculo como veremos, pode fazer-sede forma quase identica a usada com a classe, bastando praticamente realizar os calculos das interaccoesentre partıculas na classe NParticleSystem em vez de o fazer nas classes derivadas da Campo. Assim,precisamos de um vector forca para cada partıcula e para maior performance criamos ponteiros para osvectores de cada partıcula na propria classe NParticleSystem.

Estas alteracoes podem ver-se nos anexos (V), (W), (T) e (U).

7

Page 8: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

3 Descricao Geral do Programa e sua Utilizacao

Descrevemos aqui os elementos necessarios a utilizacao correcta do programa. Para indicacoes sobre aforma de instalar as funcionalidades do OpenGl em Windows e Linux, consultar o apendice (??).

3.1 Compilacao e Linkagem

Comecemos pela compilacao e linkagem (em Linux ).

Para gerar o ficheiro executavel, Project, devemos compilar cada um dos .cpp existentes, nParticle.cppe paramgl.cpp e linkar os ficheiros .o resultantes. Como utilizamos a bilioteca grafica OpenGl( e respectivasextensoes ) e usamos OPENMP, podemos proceder como segue:

g++ -o Project nParticle.cpp paramgl.cpp -lGL -lGLU -lglut -lGLEW -fopenmp

3.2 Chamada do executavel

Temos varias opcoes na linha de comando, que a escolha help anula todas as restantes:

Formato Descricao

-n=<num bodies> selecciona o numero de partıculas da simulacao

-fp64 simulacao em dupla precisao( simples por defeito )

-inFile=”<fileName>” incializa posicoes e velocidades das partıculas do ficheiro”fileName”( de acordo com numero de partıculas especificado)

-outFile=”<fileName>” especifica nome do ficheiro de output(default = ”NParticleData.txt”).

Tabela 1: Opcoes de linha de comando.

Por exemplo, se quisermos ver o menu de ajuda podemos correr o programa como segue:

./Projecto ... -help

Querendo simular 1500 partıculas em dupla precisao, inicializando-as a partir do ficheiro”input.txt”e fazendo o output para o ficheiro ”output,txt”, devemos correr na forma:

./Projecto -n=1500 -fp64 -inFile="input.txt" -outFile="output.txt"

De notar que o ficheiro de input devera ter pelo menos 1500 partıculas e ser escrito no formatoseguinte:

<time>

<xPos> <yPos> <zPos> <xVel> <yVel> <zVel> <parTicleSpec>...

<xPos> <yPos> <zPos> <xVel> <yVel> <zVel> <parTicleSpec>

onde <time> e o instante de tempo em que foi ’tirada a fotografia’ do sistema, e <particleSpec>um especificador de qual a partıcula a criar, havendo a correspondencia

• ’e’, ’E’, dafault - cria um electrao;

• ’p’, P’ - cria um protao;

• ’n’, ’N’ - cria um neutrao;

• ’j, ’J’ - cria um JPsi;

Note-se que a escrita para o ficheiro de output e feita no mesmo formato que o aceite parainicializar as partıculas.

8

Page 9: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

3.3 Simulacao do Sistema

Comecemos por apresentar uma imagem de uma simulacao com 2000 partıculas de forma aapresentar os principais elementos visiveis pelo utilizador.

Figura 1: Imagem da simulacao para 2000 partıculas.

A legenda da imagem mostra-se de seguida:

• 1 - menu com parametros da simulacao;

• 2 - referencial de apoio ao utilizador;

• 3 - informacoes sobre a simulacao;

• 4 - partıculas.

Durante a simulacao do sistema temos varias opcoes de interaccao com o programa. Descre-vemos de seguida cada uma das varias interaccoes possıveis.

3.3.1 Manipulacao da tela

Com o rato e possıvel rodar e transladar a camara de forma a melhorar a experienia de visualizacaodo utiizador. Pode-se tambem fazer zoom com uma combinacao de teclas e do rato.

Mostram-se a seguir as combinacoes possıveis:

3.3.2 Interaccoes com o teclado

O teclado permite um grande numero de interaccoes, as quais resumimos de seguida:

9

Page 10: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Combinacao Descricao

Tecla esq. do rato roda a simulacao

Tecla central do rato translada a simulacaoSHIFT+tecla do rato

Tecla esq. rato + central faz zoom de acordo com o sentido do movimentoTecla esq. rato + CTRL (default = ”NParticleData.txt”).

Tabela 2: Combinacoes para manipulacao da tela.

Tecla Descricao

’a’, ’A’ Mostra/esconde o referencial de apoio ao utilizador.

’d’, ’D’ Desactiva as opcoes do ecra(continua os calculos).

’f’, ’F’ Alterna entre modo windowed/fullscreen.

’i’, ’I’ Mostra/esconde informacoes do sistema.

’o’, ’O’ Imprime na linha de comando os parametros actuais.

’p’, ’P’ Imprime estado das partıculas no ficheiro de output.

’ESC’, ’q’, ’Q’ Termina simulacao.

’s’, ’S’ Mostra/esconde menu com os parametros.

’ ’ ( espaco ) Faz pausa na simulacao.

’+ ’ Altera modo de visualizacao das partıculas.

’[’ Seleciona demonstracao anterior.

’]’ Seleciona demonstracao seguinte.

’1’ Usa parametros actuais e coloca partıculas em modo ’SHELL’.

’2’ Usa parametros actuais e coloca partıculas em modo ’RANDOM’.

’3’ Usa parametros actuais e coloca partıculas em modo ’EXPAND’.

’4’ Usa parametros actuais e coloca partıculas em modo’STATIONARY’.

Tabela 3: Interaccoes com o teclado.

3.3.3 Modos de demonstracao

Como visivel na tabela de interaccoes com o teclado, existem varias demonstracoes ja predefinidasque pretendem mostrar varios modos de evolucao do sistema, sendo definidas com posicoes evelocidades aleatorias.

Cada uma destas demonstracoes foi elaborada por uma escolha adequada dos parametros decontrole disponiveis no menu, cabendo ao utilizador a manipulacao dos parametros de acordocom o que pretende efectuar.

3.3.4 Modos de criacao default das particulas

Para alem disso, existem ainda 4 modos de criacao de partıculas. Ao escolher cada um dos modos,sao usados os parametros actuais do menu e faz-se um reset nas posicoes das partıculas de acordocom o modo escolhido.

Resumem-se de seguida as caracterısticas de cada modo:

10

Page 11: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Modo de criacao DescricaoSHELL( tecla ’1’ ) Cria partıculas em rotacao em torno de um eixo de rotacao.RANDOM( tecla ’2’ ) Cria partıculas com posicoes e velocidades aleatorias.EXPAND ( tecla ’3’ ) Cria partıculas em expansao a partir de um ponto.STATIONARY( tecla ’4’ ) Cria partıculas sem velocidade inicial.

Tabela 4: Modos de criacao das partıculas.

4 Realizacao do Vıdeo

O vıdeo foi realizado recorrendo ao programa CamStudio que permite a gravacao do nossoambiente de trabalho tanto em modo fullscreen como seleccionando a parte que nos interessapara o efeito da gravacao. A instalacao deste e bastante simples e gratuita bastando para talaceder ao site :http : //camstudio.org/ (caso use Windows XP ou Vista). Para capturar umvideo basta clicar no botao vermelho para comecar e no botao azul para parar.

No nosso trabalho, decidimos explicar tanto o processo de criacao de partıculas como a execu-cao do mesmo e todas as caracteristicas que este poderia ter. Assim o vıdeo criado subdivide-senas seguintes seccoes:

• apresentacao das varias partıculas ;

• comparacao dos raios das partıculas;

• interaccao entre electrao e protao;

• interaccao entre as 4 partıculas do programa;

• interaccao entre 3 electroes e 3 protoes;

• interaccao entre 500 partıculas;

• caracterısticas do programa;

• modos de execucao e apresentacao.

Esta divisao deveu-se tanto para responder ao que era pedido na serie mas tambem para expli-car a futuros utilizadores de maneira simples a construcao de partıculas novas e para demonstraras capacidades que o programa tinha.

11

Page 12: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

5 Testes Efectuados e Resultados

Alınea 1

O teste que foi realizado nesta alınea encontra-se exposto em anexo na pasta s7g20c1 e tem osficheiros .txt que apresentam os valores do campo gravitacional e electrico de cada uma das 6partıculas

Alınea 2

Para esta alınea, pretendia-se apenas que se confirmasse o comportamento de uma partıcula numcampo constante que foi definido no programa (C).

Figura 2: Movimento de uma partıcula com aceleracao consntante

Esta figura demonstra que se e aplicado um campo constante, o movimento e dado por umaarco parabolico o que vai de encontro ao esperado.

12

Page 13: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Alınea 3

Esta alınea serviu de confirmacao do bom funcionamento ja testado da simulacao para o caso de6 partıculas, 3 electroes e 3 protoes. Escolheram-se as condicoes iniciais, velocidades nulas, das 3particulas de forma a que os electroes ficassem a orbitar aproximadamente cada um em torno deum protao. Apresenta-se de seguida o grafico que confirma este comportamento desejado:

Figura 3: Movimento de 6 partıculas

Alınea 4

Para esta alınea, alguns testes e informacoes sobre a simulacao encontram-se expostos num vıdeoelaborado pelo grupo que pode ser visto em http://www.youtube.com/watch?v=eaWOP2Qe9u0.Mais poermenores podem ser encontrados na seccao 4.

Consideracoes Suplementares

Realizamos ainda algumas comparacoes qualitativas entre a operacao do programa para o casode corrermos a versao da simulacao sem classes de Campo Gravitico e Electrico e de corrermosna versao sem estas classes.

Verificamos que a versao sem classes de Campo foi sem duvida superior em desempenhoconseguindo com ela simular 2000 partıculas sem efeitos de latencia observaveis. Para o caso daversao com classes de Campo este efeito ja foi bastante consideravel.

Verificamos tambem que o facto de nao utilizarmos tanto o menu de parametros, o textode informacao bem como o facto de nao usarmos o estilo de desenho das partıculas PARTI-CLE SPHERES aumentou bastante o desempenho da simulacao, sendo mais notorio este efeitopara um pequeno numero de partıculas.1

1Efectuamos estes testes ao programa num Asus N61Vn, com processador Intel R© CoreTM2 Quad Q9000 2,0GHz(FSB 1066MHz), que ja permite visualizar os efeitos beneficos do processamento paralelo.

13

Page 14: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Referencias

[1] P.J.Deitel and H.M.Deitel, C++ How to Program( Prentice Hall India ).

14

Page 15: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

A Instalacao de OpenGl em Windows e Linux

A.1 Instalacao em Windows

Para instalar o OpenGL comecamos por instalar o Glew que pode ser obtido nos packages do Blo-odShed Dev-C++ (Tools→Check for Updates/Packages), e colocar na pasta Windows e Windows\system32.

Fizemos, depois, o download de http://chortle.ccsu.edu/Bloodshed/glutming.zip, ex-traımos os ficheiros para uma pasta conveniente( desktop, p.e. ), copiamos o ficheiro glut.h paraas pastas C:\ Dev-Cpp\ include\ GL e C:\ Windows\ system32, os ficheiros da pasta lib para apasta C:\ Dev-Cpp\ lib e, finalmente, os ficheiros da pasta include\ Gl para a pasta C:\ Dev-Cpp\include\ GL.

Criamos, a seguir, um projecto vazio no BloodShed Devc++ e na seccao Project→ProjectoOptions→Parameters adicionamos as bibliotecas seguintes:

• libglaux.a

• libgle.a

• libglfw.a

• libglib-2.0.dll.a

• libglu32.a

• libglui.a

• libglut32.a

• libfreeglut.a

• libgdi32.a

• libgdiplus.a

• libopengl32.a

• libopenglut.a

• glew32.lib

• glew32s.lib

A.2 Instalacao em Linux

Neste sistema operativo, fomos a linha de comandos e digitamos:

sudo apt-get install libglu1-mesa-dev freeglut3-dev mesa-common-dev

Colocamos a nossa password e deixamos instalar os pacotes .Para compilar, digitamos o que se encontra 3.1.

15

Page 16: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

B g20s7c1.cpp

12 #include <iostream>3 using std : : c in ;4 using std : : cout ;5 using std : : c e r r ;6 using std : : endl ;7 #include <fstream>8 using std : : i f s t r e am ;9 using std : : i o s ;

10 #include <c s t d l i b>11 #include <cmath>12 #include <ctime>13 #include <vector>14 using std : : vec to r ;1516 #include ” . . / . . / Simulacao/ComCampo/ ioManager . h”17 #include ” . . / . . / Simulacao/ComCampo/CampoGravitico . h”18 #include ” . . / . . / Simulacao/ComCampo/CampoElectrico . h”192021 /∗∗ u t i l i t y func t i on ∗∗/22 template <typename T>23 void randomizeBodies ( vector< Par t i c l e<T>∗ >& pa r t i c l e s ,\24 const f loat c l u s t e r S c a l e ,\25 const f loat v e l o c i t y S c a l e )26 {27 // I n i c i a l i z a origem da sequencia de pseudo−a l e a t o r i o s28 std : : srand ( std : : time ( NULL ) ) ;29 const f loat auxRandMax = RANDMAX∗ 0 . 5 ;30 const f loat s c a l e = c l u s t e r S c a l e ∗ std : : max<f loat>( 5 . 0 f , ( f loat ) p a r t i c l e s . s i z e ( )

/(1024 .0 f ) ) ;3132 f loat v s c a l e = v e l o c i t y S c a l e ∗ s c a l e ;3334 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )35 {36 i−−;37 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a38 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;39 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;40 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;41 T point [ 3 ] = {x , y , z } ;4243 //Posicao da pa r t i c u l a4445 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\46 po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\47 po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;4849 //Velocidade da pa r t i c u l a50 T vx = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;51 T vy = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;52 T vz = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;53 const T ve l [ 3 ] = {vx , vy , vz } ;5455 //Veloc idades das p a r t i c u l a s56 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ 0 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\57 ve l [ 1 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\58 ve l [ 2 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ) ;59 }60 }616263 //Cria p a r t i c u l a s ’ d e f a u l t ’ que vao compor o sis tema64 template<typename T>65 void66 c r e a t eDe f a u l tPa r t i c l e s ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )67 {68 const int numBodies = p a r t i c l e s . s i z e ( ) ;69 f loat c l u s t e r S c a l e = 6 .0 f ;

16

Page 17: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 f loat v e l o c i t y S c a l e = 0 .0 f ;7172 for ( int i = 0 ; i<numBodies /9 ; i++ )73 p a r t i c l e s [ i ] = new JPsi<T>() ;74 for ( int i = numBodies /9 ; i<numBodies ∗3/10 ; i++ )75 p a r t i c l e s [ i ] = new Neutrao<T>() ;76 for ( int i = numBodies ∗3/10 ; i<numBodies ∗6/10 ; i++ )77 p a r t i c l e s [ i ] = new Protao<T>() ;78 for ( int i = numBodies ∗6/10 ; i<numBodies ; i++ )79 p a r t i c l e s [ i ] = new Electrao<T>() ;808182 i f ( numBodies <= 10)83 {84 c l u s t e r S c a l e = 0 .60 f ;85 v e l o c i t y S c a l e = 0 .01 f ;86 }87 else i f ( numBodies <= 300)88 {89 c l u s t e r S c a l e = 1 .50 f ;90 v e l o c i t y S c a l e = 0 .10 f ;91 }92 else i f ( numBodies <= 600)93 {94 c l u s t e r S c a l e = 2 .00 f ;95 v e l o c i t y S c a l e = 0 .50 f ;96 }97 else98 {99 c l u s t e r S c a l e = 5 .0 f ;

100 v e l o c i t y S c a l e = 1 .00 f ;101 }102103104 randomizeBodies<T>( p a r t i c l e s , c l u s t e r S c a l e , v e l o c i t y S c a l e ) ;105 }106107108 //Tenta l e r pos i coes das p a r t i c u l a s de um f i c h e i r o109 template<typename T>110 bool111 r eadF i l e ( vector< Par t i c l e<T>∗ >& pa r t i c l e s , char∗ inFileName )112 {113 i f s t r e am in ( inFileName , i o s : : in ) ;114 i f ( ! in )115 {116 c e r r << ”\n∗∗∗ERROR: F i l e ” << inFileName << ” could not be opened ∗∗∗\n” ;117 return fa lse ;118 }119120 int i = 0 ;121 const int numBodies = p a r t i c l e s . s i z e ( ) ;122 char ∗pType = new char [ numBodies ] ;123 f loat ∗∗pos = new float ∗ [ numBodies ] ;124 for ( int i = numBodies ; i ; )125 pos[−− i ] = new float [ 3 ] ;126127 while ( ( in>> pos [ i ] [ 0 ] >> pos [ i ] [ 1 ] >> pos [ i ] [ 2 ] >> pType [ i ] )128 && i<numBodies )129 ++i ;130131 i f ( i<numBodies )132 {133 c e r r << ”∗∗∗ERROR: F i l e \”” << inFileName << ”\” does not have proper e n t r i e s ∗∗∗\n” ;134 return fa lse ;135 }136 else137 {138 while ( i )139 {140 −− i ;141 switch ( pType [ i ] )142 {

17

Page 18: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

143 case ’P ’ :144 case ’ p ’ : p a r t i c l e s [ i ] = new Protao<T>() ;145 break ;146 case ’N ’ :147 case ’ n ’ : p a r t i c l e s [ i ] = new Neutrao<T>() ;148 break ;149 case ’ J ’ :150 case ’ j ’ : p a r t i c l e s [ i ] = new JPsi<T>() ;151 break ;152 case ’ e ’ :153 case ’E ’ :154 default : p a r t i c l e s [ i ] = new Electrao<T>() ;155 break ;156 }157 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( pos [ i ] ) ;158 }159 }160161 in . c l o s e ( ) ;162 return true ;163 }164165166 // I n i c i a l i z a p a r t i c u l a s167 template<typename T>168 void169 i n i t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& myPart ic les , char∗ inFileName )170 {171 //Tenta l e r es tado dinamico das p a r t i c u l a s de um po s s i v e l f i c h e i r o indicado172 bool input = readF i l e ( myPart ic les , inFileName ) ;173174 //Se f o i indicado f i c h e i r o e a l e i t u r a do es tado dinamico das175 // pa r t i c u l a s f o i bem sucedida , apresenta mensagem de confirmacao176 i f ( input )177 {178 cout << ”>> Pa r t i c l e s i n i t i a l z e d from f i l e \””179 << inFileName << ”\”\n” ;180 }181 //Senao , c r i a p a r t i c u l a s por d e f e i t o182 else183 {184 c r e a t eDe f a u l tPa r t i c l e s ( myPart i c l e s ) ;185 cout << ”\nDefault p a r t i c l e s c r ea ted \n” ;186 }187 }188189190 //Pede numero de p a r t i c u l a s191 void192 askNumPartic les ( int& num )193 {194 cout << ”\nQual o numero de p a r t i c u l a s ?\n” ;195 c in >> num;196 }197198 //Pede nome do f i c h e i r o de l e i t u r a199 void200 ask InputF i l e ( char∗ f i leName )201 {202 cout << ”\nQual o f i c h e i r o de l e i t u r a ?\n” ;203 c in >> f i leName ;204 }205206207208 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗209 ∗ MAIN ∗210 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/211 int212 main ( )213 {214 int numBodies = 6 ;215 char inFileName [ 2 5 6 ] ;

18

Page 19: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

216217 askNumPartic les ( numBodies ) ;218 ask InputF i l e ( inFileName ) ;219220 vector< Par t i c l e<f loat>∗ > myPart i c l e s ( numBodies ) ;221 i n i t P a r t i c l e s <f loat>(myPart ic les , inFileName ) ;222223 CampoElectrico<f loat> ∗ e l e c = new CampoElectrico<f loat>(myPart ic les , 1e−8, NULL ) ;224 CampoGravitico<f loat> ∗grav = new CampoGravitico<f loat>(myPart ic les , 1e−8, NULL ) ;225226 e l e c−>updateFie ld ( ) ;227 grav−>updateFie ld ( ) ;228229 e l e c−>pr in tToFi l e ( ” e l e c t r i c F i e l d . txt ” ) ;230 grav−>pr in tToFi l e ( ” g r a v i t i c F i e l d . txt ” ) ;231232 cout << ”\n>> Output f e i t o para os f i c h e i r o s \” e l e c t r i c F i e l d . txt \” e \” g r a v i t i c F i e l d . txt

\”\n” ;233234 delete e l e c ;235 delete grav ;236 e l e c =0;237 grav=0;238 return EXIT SUCCESS ;239 }

19

Page 20: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

C g20s7c2.cpp

12 #include <iostream>3 using std : : c in ;4 using std : : cout ;5 using std : : c e r r ;6 using std : : endl ;7 #include <iomanip>8 using std : : s e t p r e c i s i o n ;9 using std : : f i x e d ;

10 using std : : r i g h t ;11 #include <fstream>12 using std : : i f s t r e am ;13 using std : : i o s ;14 #include <c s t d l i b>15 #include <cmath>16 #include <ctime>17 #include <vector>18 using std : : vec to r ;1920 #include ” . . / . . / Simulacao/ComCampo/ ioManager . h”21 #include ” . . / . . / Simulacao/ComCampo/NPartic leSystem . h”2223 /∗∗ u t i l i t y func t i on ∗∗/24 template <typename T>25 void randomizeBodies ( vector< Par t i c l e<T>∗ >& pa r t i c l e s ,\26 const f loat c l u s t e r S c a l e ,\27 const f loat v e l o c i t y S c a l e )28 {29 // I n i c i a l i z a origem da sequencia de pseudo−a l e a t o r i o s30 std : : srand ( std : : time ( NULL ) ) ;31 const f loat auxRandMax = RANDMAX∗ 0 . 5 ;32 const f loat s c a l e = c l u s t e r S c a l e ∗ std : : max<f loat>( 5 . 0 f , ( f loat ) p a r t i c l e s . s i z e ( )

/(1024 .0 f ) ) ;3334 f loat v s c a l e = v e l o c i t y S c a l e ∗ s c a l e ;3536 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )37 {38 i−−;39 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a40 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;41 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;42 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;43 T point [ 3 ] = {x , y , z } ;4445 //Posicao da pa r t i c u l a4647 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\48 po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\49 po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;5051 //Velocidade da pa r t i c u l a52 T vx = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;53 T vy = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;54 T vz = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;55 const T ve l [ 3 ] = {vx , vy , vz } ;5657 //Veloc idades das p a r t i c u l a s58 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ 0 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\59 ve l [ 1 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\60 ve l [ 2 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ) ;61 }62 }636465 //Cria p a r t i c u l a s ’ d e f a u l t ’ que vao compor o sis tema66 template<typename T>67 void68 c r e a t eDe f a u l tPa r t i c l e s ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )69 {

20

Page 21: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 const int numBodies = p a r t i c l e s . s i z e ( ) ;71 f loat c l u s t e r S c a l e = 6 .0 f ;72 f loat v e l o c i t y S c a l e = 0 .0 f ;7374 for ( int i = 0 ; i<numBodies /9 ; i++ )75 p a r t i c l e s [ i ] = new JPsi<T>() ;76 for ( int i = numBodies /9 ; i<numBodies ∗3/10 ; i++ )77 p a r t i c l e s [ i ] = new Neutrao<T>() ;78 for ( int i = numBodies ∗3/10 ; i<numBodies ∗6/10 ; i++ )79 p a r t i c l e s [ i ] = new Protao<T>() ;80 for ( int i = numBodies ∗6/10 ; i<numBodies ; i++ )81 p a r t i c l e s [ i ] = new Electrao<T>() ;828384 i f ( numBodies <= 10)85 {86 c l u s t e r S c a l e = 0 .60 f ;87 v e l o c i t y S c a l e = 0 .01 f ;88 }89 else i f ( numBodies <= 300)90 {91 c l u s t e r S c a l e = 1 .50 f ;92 v e l o c i t y S c a l e = 0 .10 f ;93 }94 else i f ( numBodies <= 600)95 {96 c l u s t e r S c a l e = 2 .00 f ;97 v e l o c i t y S c a l e = 0 .50 f ;98 }99 else

100 {101 c l u s t e r S c a l e = 5 .0 f ;102 v e l o c i t y S c a l e = 1 .00 f ;103 }104105106 randomizeBodies<T>( p a r t i c l e s , c l u s t e r S c a l e , v e l o c i t y S c a l e ) ;107 }108109110 //Tenta l e r pos i coes das p a r t i c u l a s de um f i c h e i r o111 template<typename T>112 bool113 r eadF i l e ( vector< Par t i c l e<T>∗ >& pa r t i c l e s , const char∗ inFileName )114 {115 std : : i f s t r e am input ( inFileName , std : : i o s : : in ) ;116 i f ( ! input )117 {118 c e r r << ”∗∗∗ERROR: F i l e \”” << inFileName << ”\” could not be opened ∗∗∗\n” ;119 return fa lse ;120 }121122 int i = 0 ;123 const int numBodies = p a r t i c l e s . s i z e ( ) ;124 f loat ∗∗pos = new float ∗ [ numBodies ] ;125 f loat ∗∗ ve l = new float ∗ [ numBodies ] ;126 char ∗pType = new char [ numBodies ] ;127128 for ( int i = numBodies ; i ; )129 {130 −− i ;131 pos [ i ] = new float [ 3 ] ;132 ve l [ i ] = new float [ 3 ] ;133 }134135 while ( ( input>> pos [ i ] [ 0 ] >> pos [ i ] [ 1 ] >> pos [ i ] [ 2 ]136 >> ve l [ i ] [ 0 ] >> ve l [ i ] [ 1 ] >> ve l [ i ] [ 2 ]137 >> pType [ i ] )138 && i<numBodies )139 ++i ;140141 i f ( i<numBodies )142 {

21

Page 22: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

143 c e r r << ”∗∗∗ERROR: F i l e \”” << inFileName << ”\” does not have proper e n t r i e s ∗∗∗\n” ;144 return fa lse ;145 }146 else147 {148 while ( i )149 {150 −− i ;151 switch ( pType [ i ] )152 {153 case ’P ’ :154 case ’ p ’ : p a r t i c l e s [ i ] = new Protao<T>() ;155 break ;156 case ’N ’ :157 case ’ n ’ : p a r t i c l e s [ i ] = new Neutrao<T>() ;158 break ;159 case ’ J ’ :160 case ’ j ’ : p a r t i c l e s [ i ] = new JPsi<T>() ;161 break ;162 case ’ e ’ :163 case ’E ’ :164 default : p a r t i c l e s [ i ] = new Electrao<T>() ;165 break ;166 }167 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( pos [ i ] ) ;168 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ i ] ) ;169 }170 }171172 input . c l o s e ( ) ;173 return true ;174 }175176177 // I n i c i a l i z a p a r t i c u l a s178 template<typename T>179 void180 i n i t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& myPart ic les , const char∗ inFileName )181 {182 //Tenta l e r es tado dinamico das p a r t i c u l a s de um po s s i v e l f i c h e i r o indicado183 bool input = readF i l e ( myPart ic les , inFileName ) ;184185 //Se f o i indicado f i c h e i r o e a l e i t u r a do es tado dinamico das186 // pa r t i c u l a s f o i bem sucedida , apresenta mensagem de confirmacao187 i f ( input )188 {189 cout << ”\n>> Pa r t i c l e s i n i t i a l z e d from f i l e \””190 << inFileName << ”\”\n” ;191 }192 //Senao , c r i a p a r t i c u l a s por d e f e i t o193 else194 {195 c r e a t eDe f a u l tPa r t i c l e s ( myPart i c l e s ) ;196 cout << ”\nDefault p a r t i c l e s c r ea ted \n” ;197 }198 }199200201 //Pede numero de p a r t i c u l a s202 void203 askNumPartic les ( int& num )204 {205 cout << ”\nQual o numero de p a r t i c u l a s ?\n” ;206 c in >> num;207 }208209 //Pede nome do f i c h e i r o de e s c r i t a210 void211 askOutputName ( char∗ f i leName )212 {213 cout << ”\nQual o f i c h e i r o de output ?\n” ;214 c in >> f i leName ;215 }

22

Page 23: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

216217 //Pede tempo f i n a l dos c a l c u l o s218 template<typename T>219 void220 askFinalTime ( T& f ina lTime )221 {222 cout << ”\nQual o tempo f i n a l dos c a l c u l o s ?\n” ;223 c in >> f ina lTime ;224 }225226 //Pede s t ep de tempo227 template<typename T>228 void229 askTimeStep ( T& step )230 {231 cout << ”\nQual o passo de tempo dos c a l c u l o s ?\n” ;232 c in >> s tep ;233 }234235 template<typename T>236 void237 pr in tToFi l e ( o f stream &output , vector< Par t i c l e<T>∗ >& pa r t i c l e s , const f loat time )238 {239 output << f i x e d << r i g h t << s e t p r e c i s i o n ( 7 ) ;240 output << setw ( 14 ) << time << ” ” ;241 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )242 {243 −− i ;244 const T ∗pos = p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;245 output << setw ( 14 ) << pos [ 0 ] << ” ”246 << setw ( 14 ) << pos [ 1 ] << ” ”247 << setw ( 14 ) << pos [ 2 ] << ” ” ;248 }249250 output << endl ;251 }252253 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗254 ∗ MAIN ∗255 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/256 int257 main ( )258 {259 int numBodies = 1 ;260 f loat f ina lTime = 0 ;261 f loat t imeStep = 1e−4;262 char outFileName [256]= ”output . txt ” ;263264 askOutputName ( outFileName ) ;265 askFinalTime ( f ina lTime ) ;266 askTimeStep ( timeStep ) ;267268269 vector< Par t i c l e<f loat>∗ > myPart i c l e s ( numBodies ) ;270 i n i t P a r t i c l e s <f loat>(myPart ic les , ”input . txt ” ) ;271272 ofstream output ( outFileName , i o s : : out ) ;273 i f ( ! output )274 {275 c e r r << ”\n∗∗∗ERROR: Output F i l e ” << outFileName << ” could not be opened ∗∗∗\n” ;276 e x i t ( 0 ) ;277 }278279 const f loat f i e l dCons tan t [ 3 ] = { 0 . 0 , 0 . 001 , 0 . 0 } ;280 NParticleSystem<f loat> ∗ system = new NParticleSystem<f loat>( myPart ic les , 0 . 1 , 1 . 0 ,

f i e l dCons tan t ) ;281282 for ( f loat t = 0 . 0 ; t<f ina lTime ; t+=timeStep )283 {284 system−>update ( timeStep ) ;285 pr in tToFi l e ( output , myPart ic les , t ) ;286 }287

23

Page 24: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

288289 cout << ”\n>> Output f e i t o para o f i c h e i r o ” << outFileName << ” !\n\n” ;290291 delete system ;292 system = 0 ;293 output . c l o s e ( ) ;294 return EXIT SUCCESS ;295 }

24

Page 25: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

D g20s7c3.cpp

12 #include <iostream>3 using std : : c in ;4 using std : : cout ;5 using std : : c e r r ;6 using std : : endl ;7 #include <iomanip>8 using std : : s e t p r e c i s i o n ;9 using std : : f i x e d ;

10 using std : : r i g h t ;11 #include <fstream>12 using std : : i f s t r e am ;13 using std : : i o s ;14 #include <c s t d l i b>15 #include <cmath>16 #include <ctime>17 #include <vector>18 using std : : vec to r ;1920 #include ” . . / . . / Simulacao/ComCampo/ ioManager . h”21 #include ” . . / . . / Simulacao/ComCampo/NPartic leSystem . h”2223 /∗∗ u t i l i t y func t i on ∗∗/24 template <typename T>25 void randomizeBodies ( vector< Par t i c l e<T>∗ >& pa r t i c l e s ,\26 const f loat c l u s t e r S c a l e ,\27 const f loat v e l o c i t y S c a l e )28 {29 // I n i c i a l i z a origem da sequencia de pseudo−a l e a t o r i o s30 std : : srand ( std : : time ( NULL ) ) ;31 const f loat auxRandMax = RANDMAX∗ 0 . 5 ;32 const f loat s c a l e = c l u s t e r S c a l e ∗ std : : max<f loat>( 5 . 0 f , ( f loat ) p a r t i c l e s . s i z e ( )

/(1024 .0 f ) ) ;3334 f loat v s c a l e = v e l o c i t y S c a l e ∗ s c a l e ;3536 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )37 {38 i−−;39 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a40 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;41 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;42 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;43 T point [ 3 ] = {x , y , z } ;4445 //Posicao da pa r t i c u l a4647 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\48 po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\49 po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;5051 //Velocidade da pa r t i c u l a52 T vx = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;53 T vy = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;54 T vz = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;55 const T ve l [ 3 ] = {vx , vy , vz } ;5657 //Veloc idades das p a r t i c u l a s58 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ 0 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\59 ve l [ 1 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\60 ve l [ 2 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ) ;61 }62 }636465 //Cria p a r t i c u l a s ’ d e f a u l t ’ que vao compor o sis tema66 template<typename T>67 void68 c r e a t eDe f a u l tPa r t i c l e s ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )69 {

25

Page 26: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 const int numBodies = p a r t i c l e s . s i z e ( ) ;71 f loat c l u s t e r S c a l e = 6 .0 f ;72 f loat v e l o c i t y S c a l e = 0 .0 f ;7374 for ( int i = 0 ; i<numBodies /9 ; i++ )75 p a r t i c l e s [ i ] = new JPsi<T>() ;76 for ( int i = numBodies /9 ; i<numBodies ∗3/10 ; i++ )77 p a r t i c l e s [ i ] = new Neutrao<T>() ;78 for ( int i = numBodies ∗3/10 ; i<numBodies ∗6/10 ; i++ )79 p a r t i c l e s [ i ] = new Protao<T>() ;80 for ( int i = numBodies ∗6/10 ; i<numBodies ; i++ )81 p a r t i c l e s [ i ] = new Electrao<T>() ;828384 i f ( numBodies <= 10)85 {86 c l u s t e r S c a l e = 0 .60 f ;87 v e l o c i t y S c a l e = 0 .01 f ;88 }89 else i f ( numBodies <= 300)90 {91 c l u s t e r S c a l e = 1 .50 f ;92 v e l o c i t y S c a l e = 0 .10 f ;93 }94 else i f ( numBodies <= 600)95 {96 c l u s t e r S c a l e = 2 .00 f ;97 v e l o c i t y S c a l e = 0 .50 f ;98 }99 else

100 {101 c l u s t e r S c a l e = 5 .0 f ;102 v e l o c i t y S c a l e = 1 .00 f ;103 }104105106 randomizeBodies<T>( p a r t i c l e s , c l u s t e r S c a l e , v e l o c i t y S c a l e ) ;107 }108109110 //Tenta l e r pos i coes das p a r t i c u l a s de um f i c h e i r o111 template<typename T>112 bool113 r eadF i l e ( vector< Par t i c l e<T>∗ >& pa r t i c l e s , const char∗ inFileName )114 {115 std : : i f s t r e am input ( inFileName , std : : i o s : : in ) ;116 i f ( ! input )117 {118 c e r r << ”∗∗∗ERROR: F i l e \”” << inFileName << ”\” could not be opened ∗∗∗\n” ;119 return fa lse ;120 }121122 int i = 0 ;123 const int numBodies = p a r t i c l e s . s i z e ( ) ;124 f loat ∗∗pos = new float ∗ [ numBodies ] ;125 f loat ∗∗ ve l = new float ∗ [ numBodies ] ;126 char ∗pType = new char [ numBodies ] ;127128 for ( int i = numBodies ; i ; )129 {130 −− i ;131 pos [ i ] = new float [ 3 ] ;132 ve l [ i ] = new float [ 3 ] ;133 }134135 while ( ( input>> pos [ i ] [ 0 ] >> pos [ i ] [ 1 ] >> pos [ i ] [ 2 ]136 >> ve l [ i ] [ 0 ] >> ve l [ i ] [ 1 ] >> ve l [ i ] [ 2 ]137 >> pType [ i ] )138 && i<numBodies )139 ++i ;140141 i f ( i<numBodies )142 {

26

Page 27: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

143 c e r r << ”∗∗∗ERROR: F i l e \”” << inFileName << ”\” does not have proper e n t r i e s ∗∗∗\n” ;144 return fa lse ;145 }146 else147 {148 while ( i )149 {150 −− i ;151 switch ( pType [ i ] )152 {153 case ’P ’ :154 case ’ p ’ : p a r t i c l e s [ i ] = new Protao<T>() ;155 break ;156 case ’N ’ :157 case ’ n ’ : p a r t i c l e s [ i ] = new Neutrao<T>() ;158 break ;159 case ’ J ’ :160 case ’ j ’ : p a r t i c l e s [ i ] = new JPsi<T>() ;161 break ;162 case ’ e ’ :163 case ’E ’ :164 default : p a r t i c l e s [ i ] = new Electrao<T>() ;165 break ;166 }167 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( pos [ i ] ) ;168 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ i ] ) ;169 }170 }171172 input . c l o s e ( ) ;173 return true ;174 }175176177 // I n i c i a l i z a p a r t i c u l a s178 template<typename T>179 void180 i n i t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& myPart ic les , const char∗ inFileName )181 {182 //Tenta l e r es tado dinamico das p a r t i c u l a s de um po s s i v e l f i c h e i r o indicado183 bool input = readF i l e ( myPart ic les , inFileName ) ;184185 //Se f o i indicado f i c h e i r o e a l e i t u r a do es tado dinamico das186 // pa r t i c u l a s f o i bem sucedida , apresenta mensagem de confirmacao187 i f ( input )188 {189 cout << ”>> Pa r t i c l e s i n i t i a l z e d from f i l e \””190 << inFileName << ”\”\n” ;191 }192 //Senao , c r i a p a r t i c u l a s por d e f e i t o193 else194 {195 c r e a t eDe f a u l tPa r t i c l e s ( myPart i c l e s ) ;196 cout << ”\nDefault p a r t i c l e s c r ea ted \n” ;197 }198 }199200201 //Pede numero de p a r t i c u l a s202 void203 askNumPartic les ( int& num )204 {205 cout << ”\nQual o numero de p a r t i c u l a s ?\n” ;206 c in >> num;207 }208209 //Pede nome do f i c h e i r o de e s c r i t a210 void211 askOutputName ( char∗ f i leName )212 {213 cout << ”\nQual o f i c h e i r o de output ?\n” ;214 c in >> f i leName ;215 }

27

Page 28: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

216217 //Pede tempo f i n a l dos c a l c u l o s218 template<typename T>219 void220 askFinalTime ( T& f ina lTime )221 {222 cout << ”\nQual o tempo f i n a l dos c a l c u l o s ?\n” ;223 c in >> f ina lTime ;224 }225226 //Pede s t ep de tempo227 template<typename T>228 void229 askTimeStep ( T& step )230 {231 cout << ”\nQual o passo de tempo dos c a l c u l o s ?\n” ;232 c in >> s tep ;233 }234235 template<typename T>236 void237 pr in tToFi l e ( o f stream &output , vector< Par t i c l e<T>∗ >& pa r t i c l e s , const f loat time )238 {239 output << f i x e d << r i g h t << s e t p r e c i s i o n ( 7 ) ;240 output << setw ( 14 ) << time << ” ” ;241 for ( int i = 0 ; i<p a r t i c l e s . s i z e ( ) ; ++i )242 {243 const T ∗pos = p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;244 output << setw ( 14 ) << pos [ 0 ] << ” ”245 << setw ( 14 ) << pos [ 1 ] << ” ”246 << setw ( 14 ) << pos [ 2 ] << ” ” ;247 }248249 output << endl ;250 }251252 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗253 ∗ MAIN ∗254 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/255 int256 main ( )257 {258 int numBodies = 6 ;259 f loat f ina lTime = 0 ;260 f loat t imeStep = 1e−4;261 char outFileName [256]= ”output . txt ” ;262263 askOutputName ( outFileName ) ;264 askFinalTime ( f ina lTime ) ;265 askTimeStep ( timeStep ) ;266267268 vector< Par t i c l e<f loat>∗ > myPart i c l e s ( numBodies ) ;269 i n i t P a r t i c l e s <f loat>(myPart ic les , ”input . txt ” ) ;270271 ofstream output ( outFileName , i o s : : out ) ;272 i f ( ! output )273 {274 c e r r << ”\n∗∗∗ERROR: Output F i l e ” << outFileName << ” cout ld not be opened ∗∗∗\n” ;275 e x i t ( 0 ) ;276 }277278279 NParticleSystem<f loat> ∗ system = new NParticleSystem<f loat>( myPart ic les , 0 . 1 , 1 . 0 , NULL

) ;280281 for ( f loat t = 0 . 0 ; t<f ina lTime ; t+=timeStep )282 {283 system−>update ( timeStep ) ;284 pr in tToFi l e ( output , myPart ic les , t ) ;285 }286287

28

Page 29: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

288 cout << ”\n>> Output f e i t o para o f i c h e i r o ” << outFileName << ” !\n” ;289290 delete system ;291 system = 0 ;292 output . c l o s e ( ) ;293 return EXIT SUCCESS ;294 }

29

Page 30: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

E Codigo nParticle.cpp

1 #include <a s s e r t . h>2 #include <c s t d l i b>3 #include <vector>4 using std : : vec to r ;56 #include ”ioManager . h”7 #include ”NPartic leSystem . h”8 #include ”Par t i c l eRendere r . h”9 #include ”paramgl . h”

101112 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗13 ∗ ALGUMAS VARIAVEIS ∗14 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/1516 //Estado do rato17 int xMouse = 0 , yMouse = 0 ;18 int buttonState = 0 ;1920 //Movimentacao da camara21 f loat camera trans [ ] = {0 , 0 , −50};22 f loat camera rot [ ] = {0 , 0 , 0} ;23 f loat camera t rans l ag [ ] = {0 , 0 , −50};24 f loat camera ro t l ag [ ] = {0 , 0 , 0} ;25 const double i n e r t i a = 1 − 0 . 8 ;262728 //Modo de e x i b i c ao das p a r t i c u l a s29 DisplayMode displayMode = PARTICLE SPHERES;303132 //Visua l i zacao da t e l a33 bool disp layEnabled = true ;34 bool bPause = true ;35 bool bFu l l s c r e en = fa l se ;36 bool showReferenceFrame = true ;37 bool showInformation = true ;38 bool fp64 = true ;3940 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗41 ∗ Parametros da Demonstracao ∗42 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/43 struct NBodyParams44 {45 f loat m pointSize ; //Raio das p a r t i c u l a s46 f loat m damping ; //Amortecimento47 f loat m soften ing ; //Factor de suav izacao48 f loat m timestep ; //Escala de tempo49 f loat m clu s t e rSca l e ; //Escala do c l u s t e r50 f loat m ve loc i t ySca l e ; //Escala de v e l o c i dade s51 f loat m x , m y , m z ; //Posicao i n i c i a l da camera5253 //Imprime os va l o r e s54 void pr in t ( ) const55 {56 cout << ”# Demo parameters =\n” ;57 cout << std : : s e t p r e c i s i o n ( 4 )58 << std : : f i x e d59 << std : : r i g h t ;6061 cout << ”{ ” << endl62 << m pointSize << endl63 << m damping << endl64 << m softening<< endl65 << m timestep << endl66 << m c lu s t e rSca l e << endl67 << m ve loc i t ySca l e << endl68 << m x << ” , ” << m y << ” , ” << m z << endl69 << ”} ” << endl << endl ;70 }

30

Page 31: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 } ;727374 //Parametros de demonstracao75 NBodyParams demoParams [ ] =76 {77 { 0 .010 f , 1 . 0 f , 0 .40 f , 0 .00020 f , 0 .010 f , 0 .1000 f , 0 , 0 , −1.0 f } ,78 { 0 .8 f , 0 . 9 f , 0 . 1 f , 0 .0016 f , 3 .68 f , 20 .000 f , 0 , −2, −30} ,79 { 0 .07 f , 0 . 9 f , 1 . 0 f , 0 .00006 f , 2 .16 f , 100 .0 f , 0 , 0 , −15.0 f } ,80 { 0 .07 f , 0 . 9 f , 1 . 0 f , 0 .00006 f , 1 .16 f , 100 .0 f , 0 , 0 , −15.0 f } ,81 { 2 .00 f , 0 . 9 f , 1 .20 f , 0 .03000 f , 16 .00 f , 0 .0000 f , 0 , 0 , −100} ,82 { 2 .00 f , 0 . 9 f , 1 .00 f , 0 .001000 f , 16 .00 f , 0 .5000 f , 0 , 0 , −120} ,83 { 2 .00 f , 0 . 9 f , 2 .00 f , 0 .020000 f , 16 .00 f , 0 .0010 f , 0 , 0 , −100} ,84 } ;858687 //Vector de demonstracoes d i s p on i v e i s88 int numDemos = s izeof (demoParams ) / s izeof (NBodyParams) ;89 int activeDemo = 0 ;9091 NBodyParams activeParams = demoParams [ activeDemo ] ;929394 //Menu de u t i l i z a c a o da simulacao95 ParamListGL ∗ paraml i s t ; // parameter l i s t96 bool showSl ide r s = true ; // show/hide menu s l i d d e r s979899 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗

100 ∗ Classe de Demonstracao ∗101 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/102 template <class T>103 class NBodyDemo104 {105 public :106 //Cria a c l a s s e de demonstracao107 stat ic void Create ( )108 {109 m s ing le ton = new NBodyDemo ;110 }111112 //Destro i a c l a s s e de demonstracao113 stat ic void Destroy ( )114 {115 m singleton−>˜NBodyDemo( ) ;116 }117118 // I n i c i a l i z a demonstracao119 stat ic void i n i t ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )120 {121 m singleton−> i n i t ( p a r t i c l e s ) ;122 }123124 //Faz r e s e t na demonstracao , em par t i cu l a r , pos i coes e v e l o c i dade s125 stat ic void r e s e t ( const NBodyConfig c on f i g )126 {127 m singleton−> r e s e t ( c on f i g ) ;128 }129130 // Se l ecc iona demonstracao131 stat ic void selectDemo ( const int index )132 {133 m singleton−> se lectDemo ( index , true ) ;134 }135136 //Actua l i za parametros de correcao do campo e de amortecimento137 stat ic void updateParams ( )138 {139 m singleton−>bodySystem−>s e t So f t en i ng ( activeParams . m so f ten ing ) ;140 m singleton−>bodySystem−>setDamping ( activeParams . m damping ) ;141 }142143 //Actua l i za es tado dinamico do sis tema de N pa r t i c u l a s

31

Page 32: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144 stat ic void updateSimulat ion ( )145 {146 m singleton−> updateSimulat ion ( ) ;147 }148149 //Mostra apresentacao do sis tema de N pa r t i c u l a s150 stat ic void d i sp l ay ( )151 {152 m singleton−>renderer−>s e tPo in tS i z e ( activeParams . m pointSize ) ;153154 //Mostra as p a r t i c u l a s155 m singleton−>renderer−>d i sp l ay ( displayMode ) ;156 }157158 //Retorna o tempo t o t a l da simulacao159 stat ic const f loat getSimulationTime ( )160 {161 return m singleton−> getSimulat ionTime ( ) ;162 }163164 //Faz o s e t no tempo da simulacao165 stat ic void setSimulat ionTime ( f loat time )166 {167 m singleton−> setS imulat ionTime ( time ) ;168 }169170 //Retorna o numero de p a r t i c u l a s da simulacao171 stat ic const int getNumberOfBodies ( )172 {173 return m singleton−>bodySystem−>getNumberOfBodies ( ) ;174 }175176 //Imprime informacao sobre p a r t i c u l a s num f i c h e i r o177 stat ic void pr in tToFi l e ( )178 {179 ioManager : : p r in tToFi l e ( m sing leton−>bodySystem−>g e tP a r t i c l e s ( ) , m sing leton−>

getSimulat ionTime ( ) ) ;180 }181 private :182 stat ic NBodyDemo ∗m sing le ton ;183184 NParticleSystem<T> ∗bodySystem ;185186 Part i c l eRenderer<T> ∗ r ende re r ;187188 f loat s imulationTime ;189190 private :191 //Destructor192 ˜NBodyDemo( )193 {194 delete bodySystem ;195 bodySystem = 0 ;196 delete r ende re r ;197 rendere r = 0 ;198 cout << ”>> NBodyDemo de s t ru c t i on order conf irmed !\n” ;199 }200201 // I n i c i a l i z a c l a s s e de demonstracao202 void i n i t ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )203 {204 bodySystem = new NParticleSystem<T>( p a r t i c l e s ,\205 activeParams . m softening ,\206 activeParams . m damping ) ;207208 //Cria e i n i c i a l i z a in s t anc i a da c l a s s e Part ic l eRenderer209 rendere r = new Part i c l eRenderer<T>( p a r t i c l e s ) ;210 selectDemo ( 0 , fa l se ) ;211 simulationTime = 0 ;212 r e s e tRende re r ( ) ;213 }214215

32

Page 33: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

216 //Faz o r e s e t de acordo com as con f i guracoes e x i s t e n t e s217 void r e s e t ( const NBodyConfig c on f i g )218 {219 bodySystem−>randomizeBodies ( con f i g , activeParams . m c lus t e rSca l e ,\220 activeParams . m ve l o c i t ySca l e ) ;221 }222223 //Faz r e s e t nos parametros de render i zacao224 void r e s e tRende re r ( )225 {226 const f loat c o l o r [ 4 ] = { 0 .8 f , 0 . 0 f , 0 . 6 f , 1 . 0 f } ;227228 renderer−>setBaseColor ( c o l o r ) ;229 renderer−>s e tPo in tS i z e ( activeParams . m pointSize ) ;230 }231232233 // Se l ecc iona modo de demonstracao234 void se lectDemo ( const int index , bool r e s )235 {236 //Testa ind i c e de chamada237 a s s e r t ( index < numDemos ) ;238239 activeParams = demoParams [ index ] ;240 updateParams ( ) ;241242 i f ( r e s )243 {244 r e s e t ( NBODY CONFIG SHELL ) ;245 camera trans [0 ]= camera t rans l ag [0 ]= activeParams .m x ;246 camera trans [1 ]= camera t rans l ag [1 ]= activeParams .m y ;247 camera trans [2 ]= camera t rans l ag [2 ]= activeParams . m z ;248 }249 else250 setCenterOfMass ( ) ;251252 }253254 //Coloca o r e f e r e n c i a l no centro de massa255 void256 setCenterOfMass ( )257 {258 vector< Par t i c l e<T>∗ > p a r t i c l e s = bodySystem−>g e tP a r t i c l e s ( ) ;259 T x=0;260 T y=0;261 T z=0;262 T tota lMass = 0 ;263264 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )265 {266 −− i ;267 const T∗ pos = p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;268 const T mass = p a r t i c l e s [ i ]−>getMass ( ) ;269270 x+=mass∗pos [ 0 ] ;271 y+=mass∗pos [ 1 ] ;272 z+=mass∗pos [ 2 ] ;273 tota lMass += mass ;274 }275276 x/=tota lMass ;277 y/=tota lMass ;278 z/=tota lMass ;279280 camera trans [0 ]= camera t rans l ag [0]=−x ;281 camera trans [1 ]= camera t rans l ag [1 ]=y ;282 camera trans [2]−=( f loat ) z ;283 camera t rans l ag [2 ]= camera trans [ 2 ] ;284 }285286 //Actua l i za a duracao da simulacao287 void updateSimulat ion ( )288 {

33

Page 34: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

289 bodySystem−>update ( activeParams . m timestep ) ;290 simulationTime += activeParams . m timestep ;291 }292293 //Retorna a duracao da simulacao294 const f loat getSimulat ionTime ( ) const295 {296 return s imulationTime ;297 }298299 //Faz s e t na duracao da simulacao300 void setS imulat ionTime ( const f loat time )301 {302 simulationTime = time ;303 }304 } ;305306 //Ponte iros para c l a s s e de simulacao307 template <> NBodyDemo<double> ∗NBodyDemo<double> : : m s ing l e ton = 0 ;308 template <> NBodyDemo<f loat > ∗NBodyDemo<f loat > : : m s ing l e ton = 0 ;309310311312 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗313 ∗ Funcoes de Actua l i zacao de Parametros e da Demonstracao ∗314 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/315 void selectDemo ( int activeDemo )316 {317 i f ( fp64 )318 NBodyDemo<double> : : selectDemo ( activeDemo ) ;319 else320 NBodyDemo<f loat > : : selectDemo ( activeDemo ) ;321 }322323 void updateSimulat ion ( )324 {325 i f ( fp64 )326 NBodyDemo<double> : : updateSimulat ion ( ) ;327 else328 NBodyDemo<f loat > : : updateSimulat ion ( ) ;329 }330331 void di sp layNPart i c l eSystem ( )332 {333 i f ( fp64 )334 NBodyDemo<double> : : d i sp l ay ( ) ;335 else336 NBodyDemo<f loat > : : d i sp l ay ( ) ;337 }338339340 void updateParams ( )341 {342 i f ( fp64 )343 NBodyDemo<double> : : updateParams ( ) ;344 else345 NBodyDemo<f loat > : : updateParams ( ) ;346 }347348349 //Mostra r e f e r e n c i a l de apoio a v i s u a l i z a c a o350 void351 showFrameOfReference ( )352 {353 glPushMatrix ( ) ;354 g lD i s ab l e (GL LIGHTING) ;355 gluLookAt ( −60.0 , −30.0 ,−100.0 ,356 −60.0 , −30.0 , 0 . 0 ,357 0 . 0 , 1 . 0 , 0 . 0 ) ;358359 glLineWidth ( 2 . 0 ) ;360361 //Desenha r e f e r e n c i a l f i x o

34

Page 35: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

362 g lBeg in (GL LINES) ;363364 //Eixo 1365 g lCo l o r 3 f ( 0 . 0 , 0 . 0 0 , 1 . 0 0 ) ;366 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , 0 . 0 f ) ;367 g lVer t ex3 f (−8.0 f , 0 . 0 f , 0 . 0 f ) ;368369 g lVer t ex3 f (−8.0 f , 0 . 0 f , 0 . 0 f ) ;370 g lVer t ex3 f (−7.5 f , 0 . 5 f , 0 . 0 f ) ;371 g lVer t ex3 f (−8.0 f , 0 . 0 f , 0 . 0 f ) ;372 g lVer t ex3 f (−7.5 f , −0.5 f , 0 . 0 f ) ;373374 //Eixo 2375 g lCo l o r 3 f ( 1 . 0 , 0 . 8 0 , 0 . 0 0 ) ;376 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , 0 . 0 f ) ;377 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , −8.0 f ) ;378379 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , −8.0 f ) ;380 g lVer t ex3 f ( 0 . 0 f , 0 . 5 f , −7.5 f ) ;381 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , −8.0 f ) ;382 g lVer t ex3 f ( 0 . 0 f , −0.5 f , −7.5 f ) ;383384 //Eixo 3385 g lCo l o r 3 f ( 1 . 0 , 0 . 0 0 , 1 . 0 0 ) ;386 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , 0 . 0 f ) ;387 g lVer t ex3 f ( 0 . 0 f , 8 . 0 f , 0 . 0 f ) ;388389 g lVer t ex3 f ( 0 . 0 f , 8 . 0 f , 0 . 0 f ) ;390 g lVer t ex3 f ( 0 . 0 f , 7 . 5 f , −0.5 f ) ;391 g lVer t ex3 f ( 0 . 0 f , 8 . 0 f , 0 . 0 f ) ;392 g lVer t ex3 f ( 0 . 0 f , 7 . 5 f , 0 . 5 f ) ;393394 glEnd ( ) ; //Fim do r e f e r e n c i a l movel395396 //Roda em sen t i do inver so e i xo s ( o lho f i x o )397 g lRota t e f (− camera ro t l ag [ 0 ] , 1 . 0 , 0 . 0 , 0 . 0 ) ;398 g lRota t e f ( camera ro t l ag [ 1 ] , 0 . 0 , 1 . 0 , 0 . 0 ) ;399 g lRota t e f (− camera ro t l ag [ 2 ] , 0 . 0 , 0 . 0 , 1 . 0 ) ;400401 //Desenha r e f e r e n c i a l f i x o402 g lBeg in (GL LINES) ;403404 //Eixo 1405 g lCo l o r 3 f ( 1 . 0 , 0 . 0 0 , 0 . 0 0 ) ;406 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , 0 . 0 f ) ;407 g lVer t ex3 f (−8.0 f , 0 . 0 f , 0 . 0 f ) ;408409 g lVer t ex3 f (−8.0 f , 0 . 0 f , 0 . 0 f ) ;410 g lVer t ex3 f (−7.5 f , 0 . 5 f , 0 . 0 f ) ;411 g lVer t ex3 f (−8.0 f , 0 . 0 f , 0 . 0 f ) ;412 g lVer t ex3 f (−7.5 f , −0.5 f , 0 . 0 f ) ;413414 //Eixo 2415 g lCo l o r 3 f ( 0 . 0 , 0 . 5 , 0 . 0 0 ) ;416 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , 0 . 0 f ) ;417 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , −8.0 f ) ;418419 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , −8.0 f ) ;420 g lVer t ex3 f ( 0 . 0 f , 0 . 5 f , −7.5 f ) ;421 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , −8.0 f ) ;422 g lVer t ex3 f ( 0 . 0 f , −0.5 f , −7.5 f ) ;423424 //Eixo 3425 g lCo l o r 3 f ( 1 . 0 , 1 . 0 0 , 1 . 0 0 ) ;426 g lVer t ex3 f ( 0 . 0 f , 0 . 0 f , 0 . 0 f ) ;427 g lVer t ex3 f ( 0 . 0 f , 8 . 0 f , 0 . 0 f ) ;428429 g lVer t ex3 f ( 0 . 0 f , 8 . 0 f , 0 . 0 f ) ;430 g lVer t ex3 f ( 0 . 0 f , 7 . 5 f , −0.5 f ) ;431 g lVer t ex3 f ( 0 . 0 f , 8 . 0 f , 0 . 0 f ) ;432 g lVer t ex3 f ( 0 . 0 f , 7 . 5 f , 0 . 5 f ) ;433434 glEnd ( ) ; //Fim do r e f e r e n c i a l movel

35

Page 36: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

435 glPopMatrix ( ) ;436 }437438 //Mostra informacao da simulacao439 void440 showInfoMessages ( )441 {442 g lD i s ab l e (GL LIGHTING) ;443444 char msg0 [ 2 5 6 ] ;445 f loat time ;446 int numBodies ;447448 i f ( ! fp64 )449 {450 time = NBodyDemo<f loat > : : getSimulationTime ( ) ;451 numBodies = NBodyDemo<f loat > : : getNumberOfBodies ( ) ;452 }453 else454 {455 time = NBodyDemo<double> : : getSimulationTime ( ) ;456 numBodies = NBodyDemo<double> : : getNumberOfBodies ( ) ;457 }458459 i f ( ! bFu l l s c r e en )460 {461 s p r i n t f ( msg0 ,462 ”Pa r t i c l e System Simulat ion ( %d p a r t i c l e s ) | Elapsed Time : %.5 l f ” ,463 numBodies , time ) ;464 glutSetWindowTitle (msg0 ) ;465 }466 else467 {468 beginWinCoords ( ) ;469 char msg1 [ 2 5 6 ] ;470471 s p r i n t f (msg0 , ”Pa r t i c l e S imulat ion | %d p a r t i c l e s ” , numBodies ) ;472 s p r i n t f (msg1 , ”Elapsed Time : %.5 l f ” , time ) ;473474 glBlendFunc (GL ONE MINUS DST COLOR, GL ZERO) ; // in v e r t co l o r475 glEnable (GL BLEND) ;476 g lCo l o r 3 f ( 1 . 0 f , 1 . 0 f , 1 . 0 f ) ;477 g lP r i n t ( glutGet (GLUTWINDOWWIDTH)−400, 24 , msg0 , GLUT BITMAP TIMES ROMAN 24) ;478 g lCo l o r 3 f ( 0 . 45 f , 0 .75 f , 0 . 0 f ) ;479 g lP r i n t ( glutGet (GLUTWINDOWWIDTH)−400, 48 , msg1 , GLUT BITMAP TIMES ROMAN 24) ;480 g lD i s ab l e (GL BLEND) ;481 endWinCoords ( ) ;482 }483 }484485 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗486 ∗ Funcoes de Ca l l back ∗487 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/488 void d i sp l ay ( )489 {490 //Sem pausa ac t i vada continua491 //a a c t u a l i z a r as con f i guracoes das p a r t i c u l a s492 i f ( ! bPause )493 updateSimulat ion ( ) ;494495 g lC l ea r (GL COLOR BUFFER BIT | GL DEPTH BUFFER BIT) ;496 i f ( d i sp layEnabled )497 {498 //Transformacoes no modelo de v i s u a l i z a c a o499 glMatrixMode (GLMODELVIEW) ;500 g lLoadIdent i ty ( ) ;501502 //Efectua as t r an s l a coe s e ro tacoes nece s sa r i a s ( c a l c u l o s )503 for ( int c = 0 ; c < 3 ; ++c )504 {505 camera t rans l ag [ c ]+=( camera trans [ c ] − camera t rans l ag [ c ] ) ∗ i n e r t i a ;506 camera ro t l ag [ c ] +=( camera rot [ c ] − camera ro t l ag [ c ] ) ∗ i n e r t i a ;507 }

36

Page 37: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

508509 //Mostra e i xo s de or ientacao e s pa c i a l510 i f ( showReferenceFrame )511 showFrameOfReference ( ) ;512513 //Mostra informacao do sis tema514 i f ( showInformation )515 showInfoMessages ( ) ;516517 //Mostra os s l i d e r s518 i f ( showSl ide r s )519 {520 g lD i s ab l e (GL LIGHTING) ;521 paraml i s t−>Render (0 , 0 ) ; //Desenha l i s t a de parametros522 }523524 //Translacoes e ro tacoes525 g lT r an s l a t e f ( camera t rans l ag [ 0 ] , camera t rans l ag [ 1 ] , camera t rans l ag [ 2 ] ) ;526 g lRota t e f ( camera ro t l ag [ 0 ] , 1 . 0 , 0 . 0 , 0 . 0 ) ;527 g lRota t e f ( camera ro t l ag [ 1 ] , 0 . 0 , 1 . 0 , 0 . 0 ) ;528 g lRota t e f ( camera ro t l ag [ 2 ] , 0 . 0 , 0 . 0 , 1 . 0 ) ;529530 //Mostra s is tema de N pa r t i c u l a s531 d i sp layNPart i c l eSystem ( ) ;532533 //Alterna os b u f f e r s de desenho e de apresentacao para534 // apresentar uma nova imagem do sis tema535 glutSwapBuf fers ( ) ;536 }537 }538539 //Funcao a executar na ausencia de c a l l b a c k s540 void i d l e (void )541 {542 g lutPostRed i sp lay ( ) ;543 }544545 //Funcao de reshape da j n e l a546 void reshapeWindow ( int w, int h)547 {548 // Espec i f i c a s is tema de coordenadas de projecao549 glMatrixMode (GL PROJECTION) ;550 // I n i c i a l i z a s is tema de coordenadas de projecao com a iden t i dade551 g lLoadIdent i ty ( ) ;552553 //Evi ta d i v i s ao por zero554 i f ( h==0 )555 h=1;556 // Espec i f i c a a projecao em per sp e c t i v a557 g luPe r spe c t i v e ( 4 5 . 0 , ( f loat ) w / ( f loat ) h , 0 . 005 , 100000 .0) ;558559 // Espec i f i c a s is tema de coordenadas do modelo560 glMatrixMode (GLMODELVIEW) ;561 // I n i c i a l i z a s is tema de coordenadas do modelo com a iden t i dade562 g lLoadIdent i ty ( ) ;563564 // Espec i f i c a o tamanho da v iewport565 glViewport (0 , 0 , w, h) ;566 }567568569 // Funcao c a l l b a c k chamada para g e r i r c l i k s no rato570 void rato ( int button , int s tate , int x , int y )571 {572 i f ( d i sp layEnabled )573 {574 //Reage a c l i c k na l i s t a de parametros575 i f ( showSl ide r s && ( paraml i s t−>Mouse (x , y , button , s t a t e ) ) )576 updateParams ( ) ;577578 int mods ;579580 i f ( s t a t e == GLUTDOWN)

37

Page 38: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

581 buttonState |= 1<<button ;582 else i f ( s t a t e == GLUT UP)583 buttonState = 0 ;584585 mods = g lutGetMod i f i e r s ( ) ;586587 //SHIFT + c l i c k no mouse t rans l ada cena588 i f (mods & GLUT ACTIVE SHIFT)589 {590 buttonState = 2 ;591 }592 //CTRL + c l i c k no mouse f a z zoom na cena593 else i f (mods & GLUT ACTIVE CTRL)594 {595 buttonState = 3 ;596 }597598 //Guarda pos icao i n i c i a l do c l i c k599 xMouse = x ; yMouse = y ;600601 g lutPostRed i sp lay ( ) ;602 }603 }604605 //Reaccao a movimento do rato : x e y pos icao do ponte i ro na t e l a606 void607 movimento ( int x , int y )608 {609 i f ( d i sp layEnabled )610 {611 //Chama funcao de reaccao a movimento da l i s t a de parametros612 i f ( showSl ide r s && paraml i s t−>Motion (x , y ) )613 {614 updateParams ( ) ;615 g lutPostRed i sp lay ( ) ;616 return ;617 }618619 //Deslocamentos fora dos s l i d e r s620 double dx = x − xMouse ; //Deslocamento ho r i z on t a l do rato621 double dy = y − yMouse ; //Deslocamento v e r t i c a l do rato622623 //Botao esquerdo + meio ou CTRL + botao do rato624 //para f a z e r zoom625 i f ( buttonState == 3)626 camera trans [ 2 ] += (dy / 100 .0 ) ∗ 0 .5 ∗ f abs ( camera trans [ 2 ] ) ;627 //Botao do meio ou SHIFT + botao do rato628 //para t rans l adar t e l a na v e r t i c a l / ho r i z on t a l629 else i f ( buttonState & 2)630 {631 camera trans [ 0 ] += dx∗ f abs ( camera trans [ 2 ] ) / 1 0 0 . 0 ;632 camera trans [ 1 ] −= dy∗ f abs ( camera trans [ 2 ] ) / 1 0 0 . 0 ;633 }634 //Botao esquerdo para ro tacoes635 else i f ( buttonState & 1)636 {637 camera rot [ 0 ] += dy / 5 . 0 ;638 camera rot [ 1 ] += dx / 5 . 0 ;639 }640641 //Guarda pos icao para ca l c u l o po s t e r i o r do deslocamento642 xMouse = x ; yMouse = y ;643644 g lutPostRed i sp lay ( ) ;645 }646 }647648 //Reaccao ao t e c l ado649 void t e c l ado (unsigned char key , int /∗x∗/ , int /∗y∗/ )650 {651 switch ( key )652 {653 case ’ a ’ :

38

Page 39: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

654 case ’A ’ :655 showReferenceFrame = ! showReferenceFrame ;656 break ;657 case ’ d ’ :658 case ’D ’ :659 disp layEnabled = ! disp layEnabled ;660 break ;661 case ’ f ’ :662 case ’F ’ :663 bFu l l s c r e en = ! bFu l l s c r e en ;664 i f ( bFu l l s c r e en )665 g lu tFu l l S c r e en ( ) ;666 else667 glutReshapeWindow ( 800 , 500 ) ;668 break ;669 case ’ i ’ :670 case ’ I ’ :671 showInformation = ! showInformation ;672 break ;673 case ’ o ’ :674 case ’O ’ :675 activeParams . p r i n t ( ) ;676 break ;677 case ’ p ’ :678 case ’P ’ :679 i f ( ! fp64 )680 NBodyDemo<f loat > : : p r in tToFi l e ( ) ;681 else682 NBodyDemo<double> : : p r in tToFi l e ( ) ;683 break ;684 case 27 : // escape685 case ’ q ’ :686 case ’Q ’ :687 cout << ”\n∗∗∗ SIMULATION TERMINATED SUCCESSFULLY∗∗∗\n\n\n” ;688 i f ( ! fp64 )689 NBodyDemo<f loat > : : Destroy ( ) ;690 else691 NBodyDemo<double> : : Destroy ( ) ;692 e x i t (0 ) ;693 case ’ s ’ : // s − mostra/esconde s l i d e r s694 case ’ S ’ :695 showSl ide r s = ! showSl ide r s ;696 break ;697 break ;698 case ’ ’ : //Espaco − f a z pausa699 bPause = ! bPause ;700 break ;701 break ;702 case ’+ ’ :703 displayMode = (DisplayMode ) ( ( displayMode + 1)%PARTICLE NUM MODES) ;704 break ;705 case ’ [ ’ :706 activeDemo = ( activeDemo == 0) ? numDemos − 1 : ( activeDemo − 1) % numDemos ;707 selectDemo ( activeDemo ) ;708 i f ( ! fp64 )709 NBodyDemo<f loat > : : setSimulat ionTime (0) ;710 else711 NBodyDemo<double> : : setSimulat ionTime (0 ) ;712 break ;713 case ’ ] ’ :714 activeDemo = ( activeDemo + 1) % numDemos ;715 selectDemo ( activeDemo ) ;716 i f ( ! fp64 )717 NBodyDemo<f loat > : : setSimulat ionTime (0) ;718 else719 NBodyDemo<double> : : setSimulat ionTime (0 ) ;720 break ;721 case ’ 1 ’ :722 i f ( fp64 )723 {724 NBodyDemo<double> : : r e s e t (NBODY CONFIG SHELL) ;725 NBodyDemo<double> : : setSimulat ionTime (0 ) ;726 }

39

Page 40: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

727 else728 {729 NBodyDemo<f loat > : : r e s e t (NBODY CONFIG SHELL) ;730 NBodyDemo<f loat > : : setSimulat ionTime (0) ;731 }732 break ;733 case ’ 2 ’ :734 i f ( fp64 )735 {736 NBodyDemo<double> : : r e s e t (NBODYCONFIGRANDOM) ;737 NBodyDemo<double> : : setSimulat ionTime (0 ) ;738 }739 else740 {741 NBodyDemo<f loat > : : r e s e t (NBODYCONFIGRANDOM) ;742 NBodyDemo<f loat > : : setSimulat ionTime (0) ;743 }744 break ;745 case ’ 3 ’ :746 i f ( fp64 )747 {748 NBodyDemo<double> : : r e s e t (NBODY CONFIG EXPAND) ;749 NBodyDemo<double> : : setSimulat ionTime (0 ) ;750 }751 else752 {753 NBodyDemo<f loat > : : r e s e t (NBODY CONFIG EXPAND) ;754 NBodyDemo<f loat > : : setSimulat ionTime (0) ;755 }756 break ;757 case ’ 4 ’ :758 i f ( fp64 )759 {760 NBodyDemo<double> : : r e s e t (NBODY CONFIG STATIONARY) ;761 NBodyDemo<double> : : setSimulat ionTime (0 ) ;762 }763 else764 {765 NBodyDemo<f loat > : : r e s e t (NBODY CONFIG STATIONARY) ;766 NBodyDemo<f loat > : : setSimulat ionTime (0) ;767 }768 break ;769 }770771 g lutPostRed i sp lay ( ) ;772 }773774775 //Reaccao a t e c l a s e s p e c i a i s do t e c l ado ( F# e se t a s )776 void e s p e c i a l ( int key , int x , int y )777 {778 paraml i s t−>Spe c i a l ( key , x , y ) ;779 g lutPostRed i sp lay ( ) ;780 }781782783784 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗785 ∗ Funcoes de I n i c i a l i z a c a o ∗786 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/787 //Deteccao de erros do OpenGL788 void checkGLErrors ( const char ∗ s )789 {790 GLenum e r r o r ;791 while ( ( e r r o r = glGetError ( ) ) != GL NO ERROR) {792 f p r i n t f ( s tde r r , ”%s : e r r o r − %s \n” , s , (char ∗) g luEr ro rS t r i ng ( e r r o r ) ) ;793 }794 }795796 // In i c i a e de f i ne o es tado i n c i a l do OpenGl , antes de qua lquer desenho797 void initGL ( int ∗argc , char∗∗ argv )798 {799 // Espec i f i c a coe s de b r i l h o e cor

40

Page 41: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

800 const GLfloat MatSpec [ ] = { 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 } ;801 const GLfloat MatShininess [ ] = {45 . 0} ;802803 // F i r s t i n i t i a l i z e OpenGL contex t804 g l u t I n i t ( argc , argv ) ;805 g lut In i tDisp layMode (GLUT RGB | GLUTDEPTH | GLUTDOUBLE) ;806 glutInitWindowSize (820 , 500) ;807808 glutCreateWindow ( ””) ;809810 glShadeModel (GL SMOOTH) ;811 glEnable (GL DEPTH TEST) ;812813 g lMa t e r i a l f v (GL FRONT AND BACK, GL SPECULAR, MatSpec ) ;814 g lMa t e r i a l f v (GL FRONT AND BACK, GL SHININESS , MatShininess ) ;815816 glEnable (GL LIGHTING) ;817 glEnable (GL LIGHT0) ;818 glEnable (GL COLOR MATERIAL ) ;819820 i f ( bFu l l s c r e en )821 g lu tFu l l S c r e en ( ) ;822823 GLenum e r r = g l ewIn i t ( ) ;824825 i f (GLEWOK != e r r )826 {827 cout << ”GLEW Error : %s \n” << g lewGetErrorStr ing ( e r r ) ;828 e x i t (−1) ;829 }830 else i f ( ! g lewIsSupported ( ”GL VERSION 2 0 ”831 ”GL VERSION 1 5 ”832 ”GL ARB multitexture ”833 ”GL ARB vertex buf fer object ”) )834 {835 f p r i n t f ( s tde r r , ”Required OpenGL ext en s i on s miss ing . ”) ;836 e x i t (−1) ;837 }838 else839 {840 #i f de f ined (WIN32)841 wglSwapIntervalEXT (0) ;842 #e l i f de f ined (LINUX)843 glxSwapIntervalSGI (0 ) ;844 #endif845 }846847 glEnable (GL DEPTH TEST) ;848 g lC l ea rCo lo r ( 0 . 0 , 0 . 0 , 0 . 0 , 1 . 0 ) ;849850 checkGLErrors ( ”initGL ”) ;851 }852853854 // C r i a l i s t a de parametros855 void i n i tParamete r s ( )856 {857 //Cria a l i s t a858 paraml i s t = new ParamListGL ( ”Parametros ”) ;859 paraml i s t−>SetBarColorInner ( 0 . 0 f , 0 . 5 f , 0 . 8 f ) ;860861 //Adiciona parametros862863 // Point S i ze864 paraml i s t−>AddParam(new Param<f loat>(”Esca la r a i o s : ” , activeParams . m pointSize ,865 0 .0001 f , 10 .0 f , 0 .0005 f , &activeParams . m pointSize ) ) ;866867 // Ve loc i t y Damping868 paraml i s t−>AddParam(new Param<f loat>(”Amort . Veloc idade : ” , activeParams . m damping ,869 0 .000 f , 1 . 0 f , . 001 f , &(activeParams . m damping ) ) ) ;870 // So f t en ing Factor871 paraml i s t−>AddParam(new Param<f loat>(”Factor suav izacao : ” , activeParams . m softening ,872 0 .0001 f , 3 . 0 f , . 001 f , &(activeParams . m so f ten ing ) ) ) ;

41

Page 42: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

873 // Time s t ep s i z e874 paraml i s t−>AddParam(new Param<f loat>(” I n t e r va l o Tempo : ” , activeParams . m timestep ,875 1 .0 e−5, 1 . 0 f , 1 . 0 e−5f , &(activeParams . m timestep ) ) ) ;876 // Clus t e r s c a l e ( only a f f e c t s s t a r t i n g con f i gu ra t i on877 paraml i s t−>AddParam(new Param<f loat>(”Tamanho do Clus te r : ” , activeParams . m c lus t e rSca l e ,878 0 .001 f , 20 .0 f , 0 .001 f , &(activeParams . m c lu s t e rSca l e ) ) ) ;879880 // Ve loc i t y s c a l e ( only a f f e c t s s t a r t i n g con f i gu ra t i on )881 paraml i s t−>AddParam(new Param<f loat>(”Esca la Ve loc idades : ” , activeParams . m ve loc i tySca l e

,882 0 .0000 f , 100 .0 f , 0 .005 f , &activeParams . m ve l o c i t ySca l e ) ) ;883 }884885886887 //Cria p a r t i c u l a s ’ d e f a u l t ’ que vao compor o sis tema888 template<typename T>889 void890 c r e a t eDe f a u l tPa r t i c l e s ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )891 {892 const int numBodies = p a r t i c l e s . s i z e ( ) ;893894 for ( int i = 0 ; i<numBodies /9 ; i++ )895 p a r t i c l e s [ i ] = new JPsi<T>() ;896 for ( int i = numBodies /9 ; i<numBodies ∗3/10 ; i++ )897 p a r t i c l e s [ i ] = new Neutrao<T>() ;898 for ( int i = numBodies ∗3/10 ; i<numBodies ∗6/10 ; i++ )899 p a r t i c l e s [ i ] = new Protao<T>() ;900 for ( int i = numBodies ∗6/10 ; i<numBodies ; i++ )901 p a r t i c l e s [ i ] = new Electrao<T>() ;902903 i f ( numBodies <= 10)904 {905 activeParams . m c lu s t e rSca l e = 0 .60 f ;906 activeParams . m ve l o c i t ySca l e = 0.01 f ;907 activeParams . m pointSize = 1 . 8 ;908 }909 else i f ( numBodies <= 100)910 {911 activeParams . m c lu s t e rSca l e = 1 .20 f ;912 activeParams . m ve l o c i t ySca l e = 0.05 f ;913 activeParams . m pointSize = 1 . 3 ;914 }915 else i f ( numBodies <= 300)916 {917 activeParams . m c lu s t e rSca l e = 1 .50 f ;918 activeParams . m ve l o c i t ySca l e = 0.10 f ;919 activeParams . m pointSize = 1 . 0 ;920 }921 else i f ( numBodies <= 600)922 {923 activeParams . m c lu s t e rSca l e = 2 .00 f ;924 activeParams . m ve l o c i t ySca l e = 0.50 f ;925 activeParams . m pointSize = 0 . 7 ;926 }927 else i f ( numBodies <= 1000)928 {929 activeParams . m c lu s t e rSca l e = 5 .0 f ;930 activeParams . m ve l o c i t ySca l e = 1.00 f ;931 activeParams . m pointSize = 0 . 4 ;932 }933 }934935936 template<typename T>937 void938 in i tDemoPar t i c l e s ( )939 {940 vector< Par t i c l e<T>∗ > myPart i c l e s ( ioManager : : getNumberOfBodies ( ) ) ;941942 //Tenta l e r es tado dinamico das p a r t i c u l a s de um po s s i v e l f i c h e i r o indicado943 bool input = ioManager : : getFileName ( ioManager : : READ FILE ) &&944 ioManager : : i n i tPa r t i c l e sF r omF i l e ( myPart i c l e s ) ;

42

Page 43: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

945946 //Se f o i indicado f i c h e i r o e a l e i t u r a do es tado dinamico das947 // pa r t i c u l a s f o i bem sucedida , apresenta mensagem de confirmacao948 i f ( input )949 {950 cout << ”>> Demo p a r t i c l e s i n i t i a l z e d from f i l e \””951 << ioManager : : getFileName ( ioManager : : READ FILE )952 << ”\”\n” ;953 }954 //Senao , c r i a p a r t i c u l a s por d e f e i t o955 else956 c r e a t eDe f a u l tPa r t i c l e s ( myPart i c l e s ) ;957958 //Cria e i n i c i a l i z a a c l a s s e de simulacao959 NBodyDemo<T> : : Create ( ) ;960 cout << ”>> Demo created !\n” ;961 NBodyDemo<T> : : i n i t ( myPart ic l e s ) ;962 cout << ”>> Demo i n i t i a l i z e d with p a r t i c l e s !\n” ;963964 //Se nao conseguiu l e r es tado dinamico de um f i c h e i r o ,965 // f a z r e s e t no es tado dinamico das p a r t i c u l a s de modo semi−a l e a t o r i o966 i f ( ! input )967 {968 NBodyDemo<T> : : r e s e t ( NBODY CONFIG SHELL ) ;969 cout << ”>> Defau l t p a r t i c l e s c r ea ted in s h e l l mode ! ! \ n” ;970 }971 }972973 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗974 ∗ MAIN ∗975 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/976 int977 main ( int argc , char∗∗ argv )978 {979 //Gerir a l i nha de comando980 ioManager : : Create ( ) ;981 ioManager : : i n i t ( argc , ( const char∗∗) argv ) ;982 ioManager : : checkCmdEntries ( ) ;983 fp64 = ioManager : : ge tDoub lePrec i s i on ( ) ;984985 // I n i c i a l i z a r o openg l986 initGL(&argc , argv ) ;987 in i tParamete r s ( ) ;988 cout << ”\n>> GL i n i t i a l i z e d !\n” ;989990 // I n i c i a l i z a p a r t i c u l a s e c r i a o demo991 i f ( ! fp64 )992 in i tDemoPart i c l e s<f loat >() ;993 else994 in i tDemoPart i c l e s<double>() ;995996997 cout << ”\n∗∗∗ AND BEGINS THE SIMULATION ∗∗∗\n\n\n” ;998999 //Mecanismos de c a l l b a c k

1000 glutDisplayFunc ( d i sp l ay ) ;1001 glutReshapeFunc ( reshapeWindow ) ;1002 glutMouseFunc ( rato ) ;1003 glutMotionFunc (movimento ) ;1004 glutKeyboardFunc ( t e c l ado ) ;1005 g lutSpec ia lFunc ( e s p e c i a l ) ;1006 g lut Id l eFunc ( i d l e ) ;10071008 glutMainLoop ( ) ;10091010 return EXIT SUCCESS ;1011 }

43

Page 44: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

F Codigo ioManager.h

1 #ifndef CMDMANAGERH2 #define CMDMANAGERH345 #include ”Pa r t i c l e s . h”6 #include <iostream>7 using std : : cout ;8 using std : : endl ;9 #include <iomanip>

10 using std : : setw ;11 #include <fstream>12 #include <c s t r i ng>1314 class ioManager15 {16 public :17 //Cria a c l a s s e de demonstracao18 stat ic void Create ( )19 {20 ioManagerPtr = new ioManager ;21 }2223 //Destro i a c l a s s e de demonstracao24 stat ic void Destroy ( )25 {26 ioManagerPtr−>˜ioManager ( ) ;27 }2829 // I n i c i a l i z a demonstracao30 stat ic void i n i t ( const int argc , const char∗∗ argv )31 {32 ioManagerPtr−> i n i t ( argc , argv ) ;33 }343536 stat ic void checkCmdEntries ( )37 {38 ioManagerPtr−> checkCmdEntries ( ) ;39 }4041 stat ic const int getNumberOfBodies ( )42 {43 return ioManagerPtr−> getNumberOfBodies ( ) ;44 }4546 stat ic const bool getDoub lePrec i s i on ( )47 {48 return ioManagerPtr−> ge tDoub l ePrec i s i on ( ) ;49 }505152 enum f i l eMode53 {54 READ FILE,55 WRITE FILE56 } ;5758 stat ic char∗ getFileName ( f i l eMode modo )59 {60 return ioManagerPtr−> getFileName ( modo ) ;61 }6263 template<typename T>64 stat ic bool i n i tPa r t i c l e sF r omF i l e ( vector< Par t i c l e<T>∗ >& pa r t i c l e s )65 {66 return ioManagerPtr−> i n i tPa r t i c l e sF r omF i l e ( p a r t i c l e s ) ;67 }6869 template<typename T>70 stat ic void pr in tToFi l e ( const vector< Par t i c l e<T>∗ >& pa r t i c l e s , const f loat time )

44

Page 45: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 {72 ioManagerPtr−> pr in tToF i l e ( p a r t i c l e s , time ) ;73 }747576 private :77 stat ic ioManager ∗ ioManagerPtr ;7879 int argc ;80 char∗∗ argv ;8182 //Parametros i n s e r i d o s pe lo user83 char∗ f i l e I n ;84 char∗ f i l eOu t ;8586 int nBodies ;87 bool fp64 ;88 private :89 //Destructor90 ˜ ioManager ( )91 {92 for ( int i = argc ; i ; )93 {94 −− i ;95 delete [ ] argv [ i ] ;96 }97 delete [ ] argv ;98 argv = 0 ;99 cout << ”>> ioManager d e s t ru c t i on order conf irmed !\n” ;

100 }101102 // I n i c i a l i z a c l a s s e de gerenc ia de input e output103 void i n i t ( const int argcounter , const char∗∗ argvec to r )104 {105 argc = argcounter ;106 argv = new char ∗ [ argc ] ;107 for ( int i = argc ; i ; )108 {109 −− i ;110 int l en = std : : s t r l e n ( a rgvec to r [ i ] ) ;111 argv [ i ] = new char [ l en ] ;112 std : : s t r cpy ( argv [ i ] , a rgvec to r [ i ] ) ;113 }114115 //Nomes por d e f e i t o116 f i l e I n = new char [ 256 ] ;117 f i l eOu t = new char [ 256 ] ;118 std : : s t r cpy ( f i l e I n , ”NPartic leData . txt ” ) ;119 std : : s t r cpy ( f i l eOut , ”NPartic leData . txt ” ) ;120121 fp64 = fa l se ;122 nBodies = 6 ;123 }124125 // I n i c i a l i z e algumas condicoes do programa lendo a l i nha de comando126 void127 checkCmdEntries ( )128 {129 i f ( checkCmdLineFlag ( argc , ( const char∗∗) argv , ”he lp ”) )130 {131 showHelp ( ) ;132 e x i t ( 0 ) ;133 }134135 fp64 = checkCmdLineFlag ( argc , ( const char∗∗) argv , ”fp64 ”) ;136 checkCmdLineFlag ( argc , ( const char∗∗) argv , ”n” , ( int ∗) &nBodies ) ;137 i f ( ! checkCmdLineFlag ( argc , ( const char∗∗) argv , ” i nF i l e ” ,NULL, ( char∗) f i l e I n ) )138 f i l e I n = NULL;139140 checkCmdLineFlag ( argc , ( const char∗∗) argv , ”ou tF i l e ” ,NULL, ( char∗) f i l eOu t ) ;141142 std : : cout << ”\n−− ”143 << ( fp64 ? ”Double ” : ”S ing l e ” )

45

Page 46: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144 << ” p r e c i s i o n f l o a t i n g po int s imu la t i on \n\n” ;145 }146147148149 // Ver i f i c a entrada da l i nha de comando150 bool151 checkCmdLineFlag ( const int argc , const char∗∗ argv , const char∗ f l a g , int∗ r e f = NULL,

char∗ r e f S=NULL)152 {153 for ( int arg = argc −1; arg ; arg−− )154 {155 const int l en = s t r l e n ( argv [ arg ] ) ;156157 char ∗ sentence = new char [ l en ] ;158 s t r cpy ( sentence , argv [ arg ] ) ;159160 i f ( sentence [ 0 ]== ’− ’ )161 {162 char ∗ tokenPtr = s t r t ok ( &sentence [ 1 ] , ”=” ) ;163 i f ( strcmp ( tokenPtr , f l a g )==0 )164 {165 tokenPtr = s t r t ok ( NULL, ”=” ) ;166 i f ( r e f !=NULL )167 {168 i f ( s s c an f ( tokenPtr , ”%d” , r e f ) )169 return true ;170 else171 return fa lse ;172 }173 else i f ( r e f S !=NULL )174 {175 i f ( ! tokenPtr )176 return fa lse ;177178 int l en = s t r l e n ( tokenPtr ) ;179 i f ( ! l en )180 return fa lse ;181182 for ( int i= l en +1; i ; )183 {184 −− i ;185 r e f S [ i ]= tokenPtr [ i ] ;186 }187 return true ;188 }189190 return true ;191 }192 }193 }194195 return fa lse ;196 }197198 //Menu de ajuda199 void200 showHelp ( ) const201 {202 cout << ”\nRun \”nbody \” fo l l owed by the arguments :\n” ;203 cout << ” −n=<numBodies> ( run n−body s imu la t i on with numBodies p a r t i c l e s ) \n” ;204 cout << ” −fp64 ( use double p r e c i s i o n va lue s f o r s imu la t i on ) \n” ;205 cout << ” − i nF i l e=\”<f i leName>\” ( i n i t i a l i z e p a r t i c l e s pos . and ve l . from f i l e ) \n” ;206 cout << ” −outF i l e=\”<f i leName >\”( s p e c i f y output f i l e name( d e f au l t : \”NPartic leData .

txt \”) \n\n” ;207 }208209 const bool ge tDoub l ePrec i s i on ( ) const210 {211 return fp64 ;212 }213214 const int getNumberOfBodies ( ) const

46

Page 47: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

215 {216 return nBodies ;217 }218219 char∗ getFileName ( f i l eMode modo ) const220 {221 i f ( modo == READ FILE )222 return f i l e I n ;223 else224 return f i l eOu t ;225 }226227228 template<typename T>229 bool230 i n i tPa r t i c l e sF r omF i l e ( vector<Par t i c l e<T>∗>& pa r t i c l e s )231 {232 std : : i f s t r e am input ( f i l e I n , std : : i o s : : in ) ;233 i f ( ! input )234 {235 c e r r << ”∗∗∗ERROR: F i l e \”” << f i l e I n << ”\” could not be opened ∗∗∗\n” ;236 return fa lse ;237 }238239 int i = 0 ;240 const int numBodies = p a r t i c l e s . s i z e ( ) ;241 f loat pos [ numBodies ] [ 3 ] ;242 f loat ve l [ numBodies ] [ 3 ] ;243 f loat time ;244 char pType [ numBodies ] ;245246 input >> time ;247 while ( ( input>> pos [ i ] [ 0 ] >> pos [ i ] [ 1 ] >> pos [ i ] [ 2 ]248 >> ve l [ i ] [ 0 ] >> ve l [ i ] [ 1 ] >> ve l [ i ] [ 2 ]249 >> pType [ i ] )250 && i<numBodies )251 ++i ;252253 i f ( i<numBodies )254 {255 c e r r << ”∗∗∗ERROR: F i l e \”” << f i l e I n << ”\” does not have proper e n t r i e s ∗∗∗\n” ;256 return fa lse ;257 }258 else259 {260 while ( i )261 {262 −− i ;263 switch ( pType [ i ] )264 {265 case ’ e ’ :266 case ’E ’ : p a r t i c l e s [ i ] = new Electrao<T>() ;267 break ;268 case ’P ’ :269 case ’ p ’ : p a r t i c l e s [ i ] = new Protao<T>() ;270 break ;271 case ’N ’ :272 case ’ n ’ : p a r t i c l e s [ i ] = new Neutrao<T>() ;273 break ;274 case ’ J ’ :275 case ’ j ’ : p a r t i c l e s [ i ] = new JPsi<T>() ;276 break ;277 }278 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( pos [ i ] [ 0 ] , pos [ i ] [ 1 ] , pos [ i ] [ 2 ] ) ;279 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ i ] [ 0 ] , v e l [ i ] [ 1 ] , v e l [ i ] [ 2 ] ) ;280 }281 }282283 input . c l o s e ( ) ;284 return true ;285 }286287 template<typename T>

47

Page 48: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

288 void pr in tToF i l e ( const vector< Par t i c l e<T>∗ >& pa r t i c l e s , const f loat time )289 {290 std : : o f s tream output ( f i l eOut , std : : i o s : : out ) ;291 i f ( ! output )292 {293 std : : c e r r << ”∗∗∗ ERROR: F i l e \”” << f i l eOu t << ”\” could not be opened .\n” ;294 return ;295 }296297 //Formatacao298 output << std : : f i x e d << std : : showpoint << std : : showpos << std : : l e f t ;299300 //Time output301 output << setw (5) << time << endl ;302 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )303 {304 −− i ;305 const T ∗pos = ( const T∗) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;306 const T ∗ ve l = ( const T∗) p a r t i c l e s [ i ]−>ge tVe l o c i t y ( ) ;307308 output << std : : s e t p r e c i s i o n ( 8 )309 << setw (14) << pos [ 0 ] << ” ”310 << setw (14) << pos [ 1 ] << ” ”311 << setw (14) << pos [ 2 ] << ” ”312 << setw (14) << ve l [ 0 ] << ” ”313 << setw (14) << ve l [ 1 ] << ” ”314 << setw (14) << ve l [ 2 ] ;315316 i f ( dynamic cast<Electrao<T>∗>( p a r t i c l e s [ i ] ) != 0 )317 output << ’E ’ << endl ;318 else i f ( dynamic cast<Protao<T>∗ >( p a r t i c l e s [ i ] ) != 0 )319 output << ’P ’ << endl ;320 else i f ( dynamic cast<Neutrao<T>∗ >( p a r t i c l e s [ i ] ) != 0 )321 output << ’N ’ << endl ;322 else i f ( dynamic cast<JPsi<T>∗ >( p a r t i c l e s [ i ] ) != 0 )323 output << ’ J ’ << endl ;324 }325326 cout << ”# Pa r t i c l e p o s i t i o n s wr i t t en to f i l e \”” << f i l eOu t << ”\””327 << endl << endl ;328 output . c l o s e ( ) ;329 }330331 } ;332333 ioManager ∗ ioManager : : ioManagerPtr = 0 ;334335 #endif

48

Page 49: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

G Codigo Particle.h

1 #ifndef PARTICLE H2 #define PARTICLE H34 template<class T>5 class Pa r t i c l e6 {7 public :8 //Defau l t cons t ruc tor para i n i c i a l i z a c a o dos9 //parametros que se qu i s e r

10 Pa r t i c l e ( const T m = 1.0 , const T c = 1 . 0 , const T s = 1 .0 ,\11 const T∗ const pos = NULL, const T∗ const ve l = NULL,\12 const T∗ const a c e l = NULL ) ;13 //Destructor14 ˜ Pa r t i c l e ( ) ;1516 /∗∗Set op t ions ∗∗/17 // Cara c t e r i s t i c a s da pa r t i c u l a18 virtual void setMass ( const T m ) ;19 virtual void setCharge ( const T c ) ;20 virtual void s e t S i z e ( const T s ) ;21 virtual void s e tCo lo r ( const f loat [ 3 ] ) ;22 virtual void s e tCo lo r ( const float , const float , const f loat ) ;2324 //Dados dinamicos da pa r t i c u l a25 virtual void s e tPo s i t i o n ( const T, const T, const T ) ;26 virtual void s e tPo s i t i o n ( const T∗ const pos ) ;2728 virtual void s e tVe l o c i t y ( const T, const T, const T ) ;29 virtual void s e tVe l o c i t y ( const T∗ const ve l ) ;3031 virtual void s e tForce ( const T, const T, const T ) ;32 virtual void s e tForce ( const T∗ const f o r c e ) ;3334 /∗∗Get op t ions ∗∗/35 // Cara c t e r i s t i c a s da pa r t i c u l a36 virtual const T getMass ( ) const ;37 virtual const T getCharge ( ) const ;38 virtual const T ge tS i z e ( ) const ;39 virtual const f loat ∗ getColor ( ) const ;4041 //Dados dinamicos da pa r t i c u l a42 virtual T∗ const ge tPo s i t i on ( ) const ;43 virtual T∗ const ge tVe l o c i t y ( ) const ;44 virtual T∗ const getForce ( ) const ;45 protected :46 //Posicao da pa r t i c u l a47 T po s i t i o n [ 3 ] ;4849 //Velocidade da pa r t i c u l a50 T v e l o c i t y [ 3 ] ;5152 //Aceleracao exerc ida sobre a pa r t i c u l a53 T f o r c e [ 3 ] ;5455 //Propriedades da pa r t i c u l a56 T mass ;57 T charge ;58 T s i z e ;5960 f loat rgbColor [ 3 ] ; // ( R, G B )61 } ;6263 // Fiche i ro de implementacao do template64 #include ”Par t i c l e Imp l . h”6566 #endif

49

Page 50: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

H Codigo ParticleImpl.h

1 #ifndef PARTICLEIMPL H2 #define PARTICLEIMPL H34 template<class T>5 Par t i c l e<T> : : P a r t i c l e ( const T m , const T c , const T s ,\6 const T∗ const pos ,\7 const T∗ const vel ,\8 const T∗const a c e l )9 : mass ( m ) ,

10 charge ( c ) ,11 s i z e ( s )12 {13 s e tPo s i t i o n ( pos ) ;14 s e tVe l o c i t y ( ve l ) ;15 se tForce ( a c e l ) ;16 s e tCo lo r ( 1 . 0 , 0 . 0 , 0 . 0 ) ;17 }1819 template<class T>20 Pa r t i c l e<T> : :˜ P a r t i c l e ( )21 {22 delete [ ] p o s i t i o n ;23 delete [ ] v e l o c i t y ;24 delete [ ] f o r c e ;25 }2627 template<class T>28 void Par t i c l e<T> : : setMass ( const T m )29 {30 mass = m;31 }3233 template<class T>34 void Par t i c l e<T> : : setCharge ( const T c )35 {36 charge = c ;37 }3839 template<class T>40 void Par t i c l e<T> : : s e t S i z e ( const T s )41 {42 s i z e = s ;43 }4445 template<class T>46 void Par t i c l e<T> : : s e tCo lo r ( const f loat c o l o r [ 3 ] )47 {48 rgbColor [ 0 ]= co l o r [ 0 ] ;49 rgbColor [ 1 ]= co l o r [ 1 ] ;50 rgbColor [ 2 ]= co l o r [ 2 ] ;51 }525354 template<class T>55 void Par t i c l e<T> : : s e tCo lo r ( const f loat r , const f loat g , const f loat b )56 {57 rgbColor [ 0 ] = r ;58 rgbColor [ 1 ] = g ;59 rgbColor [ 2 ] = b ;60 }6162 template<class T>63 void Par t i c l e<T> : : s e tPo s i t i o n ( const T px , const T py , const T pz )64 {65 po s i t i o n [ 0 ]=px ;66 po s i t i o n [ 1 ]=py ;67 po s i t i o n [ 2 ]=pz ;68 }6970 template<class T>

50

Page 51: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 void Par t i c l e<T> : : s e tPo s i t i o n ( const T∗ const pos )72 {73 i f ( pos != NULL )74 {75 po s i t i o n [ 0 ]=pos [ 0 ] ;76 po s i t i o n [ 1 ]=pos [ 1 ] ;77 po s i t i o n [ 2 ]=pos [ 2 ] ;78 }79 else80 po s i t i o n [0 ]= po s i t i o n [1 ]= po s i t i o n [ 2 ]=0 . 0 ;81 }8283 template<class T>84 void Par t i c l e<T> : : s e tVe l o c i t y ( const T vx , const T vy , const T vz )85 {86 v e l o c i t y [ 0 ] = vx ;87 v e l o c i t y [ 1 ] = vy ;88 v e l o c i t y [ 2 ] = vz ;89 }9091 template<class T>92 void Par t i c l e<T> : : s e tVe l o c i t y ( const T∗ const ve l )93 {94 i f ( v e l != NULL )95 {96 v e l o c i t y [ 0 ]= ve l [ 0 ] ;97 v e l o c i t y [ 1 ]= ve l [ 1 ] ;98 v e l o c i t y [ 2 ]= ve l [ 2 ] ;99 }

100 else101 v e l o c i t y [0 ]= v e l o c i t y [1 ]= v e l o c i t y [ 2 ]=0 . 0 ;102 }103104 template<class T>105 void Par t i c l e<T> : : s e tForce ( const T fx , const T fy , const T f z )106 {107 f o r c e [ 0 ]= fx ;108 f o r c e [ 1 ]= fy ;109 f o r c e [ 2 ]= f z ;110 }111112 template<class T>113 void Par t i c l e<T> : : s e tForce ( const T∗ const f o r c c e )114 {115 i f ( f o r c c e != NULL )116 {117 f o r c e [ 0 ]= f o r c c e [ 0 ] ;118 f o r c e [ 1 ]= f o r c c e [ 1 ] ;119 f o r c e [ 2 ]= f o r c c e [ 2 ] ;120 }121 else122 f o r c e [0 ]= f o r c e [1 ]= f o r c e [ 2 ]=0 . 0 ;123 }124125126 template<class T>127 const T Par t i c l e<T> : : getMass ( ) const128 {129 return mass ;130 }131132 template<class T>133 const T Par t i c l e<T> : : getCharge ( ) const134 {135 return charge ;136 }137138 template<class T>139 const T Par t i c l e<T> : : g e tS i z e ( ) const140 {141 return s i z e ;142 }143

51

Page 52: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144 template<class T>145 const f loat ∗ Par t i c l e<T> : : getColor ( ) const146 {147 return rgbColor ;148 }149150 template<class T>151 T∗ const Par t i c l e<T> : : g e tPo s i t i on ( ) const152 {153 return (T∗ const ) p o s i t i o n ;154 }155156 template<class T>157 T∗ const Par t i c l e<T> : : g e tVe l o c i t y ( ) const158 {159 return (T∗ const ) v e l o c i t y ;160 }161162 template<class T>163 T∗ const Par t i c l e<T> : : getForce ( ) const164 {165 return (T∗ const ) f o r c e ;166 }167168 #endif

52

Page 53: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

I Codigo Particles.h

1 //Classes herdadas da c l a s s e mae pa r t i c u l a2 //3 // pa r t i c u l a s com propr iedades bem de f i n i d a s a p r i o r i456 #ifndef PARTICLES H7 #define PARTICLES H89 #include <iostream>

10 using std : : c e r r ;11 #include <c s t r i ng>12 using std : : s t r i n g ;1314 #include ”Pa r t i c l e . h”1516 // U t i l i t y func t i on17 void18 permissionWarning ( const std : : s t r i n g prop , const std : : s t r i n g part )19 {20 c e r r <<21 ”ERRO: Alteracao de ” << prop << ” de um ” << part << ” r e qu i s i t a da .\n\22 Nao tem permissao para a l t e r a r propr i edades d e f au l t da c l a s s e ”23 << part << ” .\n” ;24 }252627 //Classe Protao28 template<typename T>29 class Protao : public Par t i c l e<T>30 {31 public :32 Protao ( T∗ const i n i t i a l P o s = 0 , T∗ const i n i t i a l V e l = 0 )33 : Pa r t i c l e<T>( 0 .938 , 1 . 0 , 0 . 4 , i n i t i a l P o s , i n i t i a l V e l )34 {35 Par t i c l e<T> : : s e tCo lo r ( 1 . 0 f , 0 . 0 f , 0 . 0 f ) ;36 }3738 /∗∗Set op t ions ∗∗/39 // Cara c t e r i s t i c a s da pa r t i c u l a b loqueadas40 virtual void setMass ( const T m=0.938 )41 {42 permissionWarning ( ”massa ” , ”Protao ” ) ;43 }44 virtual void setCharge ( const T c=1.0 )45 {46 permissionWarning ( ”carga ” , ”Protao ” ) ;47 }48 virtual void s e t S i z e ( const T s=0.4 )49 {50 permissionWarning ( ” ’ r a i o ’ ” , ”Protao ” ) ;51 }52 } ;535455 //Classe Neutrao56 template<typename T>57 class Neutrao : public Par t i c l e<T>58 {59 public :60 Neutrao ( T∗ const i n i t i a l P o s = 0 , T∗ const i n i t i a l V e l = 0 )61 : Pa r t i c l e<T>( 0 . 939 , 0 . 0 , 0 . 4 , i n i t i a l P o s , i n i t i a l V e l )62 {63 Par t i c l e<T> : : s e tCo lo r ( 1 . 0 f , 1 . 0 f , 1 . 0 f ) ;64 }65 /∗∗Set op t ions ∗∗/66 // Cara c t e r i s t i c a s da pa r t i c u l a b loqueadas67 virtual void setMass ( const T m=0.939 )68 {69 permissionWarning ( ”massa ” , ”Neutrao ” ) ;70 }

53

Page 54: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 virtual void setCharge ( const T c=0.0 )72 {73 permissionWarning ( ”carga ” , ”Neutrao ” ) ;74 }75 virtual void s e t S i z e ( const T s=0.4 )76 {77 permissionWarning ( ” ’ r a i o ’ ” , ”Neutrao ” ) ;78 }79 } ;808182 //Classe E lec t rao83 template<typename T>84 class Elec t rao : public Par t i c l e<T>85 {86 public :87 E l ec t rao ( T∗ const i n i t i a l P o s = 0 , T∗ const i n i t i a l V e l = 0 )88 : Pa r t i c l e<T>( 5 .11 e−4, −1.0 , 0 . 1 , i n i t i a l P o s , i n i t i a l V e l )89 {90 Par t i c l e<T> : : s e tCo lo r ( 1 . 0 f , 1 . 0 f , 0 . 0 f ) ;91 }9293 /∗∗Set op t ions ∗∗/94 // Cara c t e r i s t i c a s da pa r t i c u l a b loqueadas95 virtual void setMass ( const T m=5.11e−4 )96 {97 permissionWarning ( ”massa ” , ”E l ec t rao ” ) ;98 }99 virtual void setCharge ( const T c=−1.0 )

100 {101 permissionWarning ( ”carga ” , ”E l ec t rao ” ) ;102 }103 virtual void s e t S i z e ( const T s=0.1 )104 {105 permissionWarning ( ” ’ r a i o ’ ” , ”E l ec t rao ” ) ;106 }107 } ;108109 //Classe JPsi110 template<typename T>111 class JPsi : public Par t i c l e<T>112 {113 public :114 JPsi ( T∗ const i n i t i a l P o s = 0 , T∗ const i n i t i a l V e l = 0 )115 : Pa r t i c l e<T>( 3 . 096 , 0 . 0 , 0 . 5 , i n i t i a l P o s , i n i t i a l V e l )116 {117 Par t i c l e<T> : : s e tCo lo r ( 0 . 0 f , 0 . 0 f , 1 . 0 f ) ;118 }119 /∗∗Set op t ions ∗∗/120 // Cara c t e r i s t i c a s da pa r t i c u l a b loqueadas121 virtual void setMass ( const T m=3.096 )122 {123 permissionWarning ( ”massa ” , ”JPsi ” ) ;124 }125 virtual void setCharge ( const T c=0.0 )126 {127 permissionWarning ( ”carga ” , ”JPsi ” ) ;128 }129 virtual void s e t S i z e ( const T s=0.5 )130 {131 permissionWarning ( ” ’ r a i o ’ ” , ”JPsi ” ) ;132 }133 } ;134135 #endif

54

Page 55: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

J Codigo Campo.h

1 #ifndef CAMPOH2 #define CAMPOH34 #include<iostream>5 using std : : cout ;6 #include <fstream>7 using std : : i o s ;8 using std : : o f s tream ;9 #include <vector>

10 using std : : vec to r ;1112 #include ”Pa r t i c l e s . h”1314 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗15 ∗ INTERFACE ∗16 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/17 template<class T>18 class Campo19 {20 public :21 // cons t ruc tor para i n i c i a l i z a c a o de p a r t i c u l a s22 Campo( vector< Par t i c l e<T>∗ >&, const T∗ f i e l dCons tan t = NULL ) ;23 ˜Campo( ) ;2425 virtual void updateFie ld ( ) = 0 ;2627 /∗∗Set op t ions ∗∗/28 //Al tera p a r t i c u l a s geradoras do campo29 virtual void s e t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& ) ;3031 /∗∗Get op t ions ∗∗/32 //Retorna ponte i ro para p a r t i c u l a s do s is tema33 //ma p o t i l i c a de minimo acesso , mas e f i c i e n t e34 virtual vector< Par t i c l e<T>∗ >& ge tPa r t i c l e s ( ) const ;3536 virtual const T∗∗ ge tF i e l d ( ) const ;3738 virtual void pr in tToFi l e ( const char∗ ) const ;39 protected :40 // Par t i cu l a s cr iadoras do campo41 vector< Par t i c l e<T>∗ > p a r t i c l e s ;42 int numberOfBodies ;43 T cons tantF i e ld [ 3 ] ;4445 T∗∗ f i e l d ;46 } ;474849 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗50 ∗ IMPLEMENTACAO ∗51 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/52 template<class T>53 Campo<T> : :Campo( vector< Par t i c l e<T>∗ >& par t i cu l a s , const T∗ f i e l dCons tan t )54 : p a r t i c l e s ( p a r t i c u l a s )55 {56 i f ( f i e l dCons tan t==NULL )57 cons tantF i e ld [0 ]= cons tantF i e ld [1 ]= cons tantF i e ld [ 2 ]=0 . 0 ;58 else59 {60 cons tantF i e ld [0 ]= f i e l dCons tan t [ 0 ] ;61 cons tantF i e ld [1 ]= f i e l dCons tan t [ 1 ] ;62 cons tantF i e ld [2 ]= f i e l dCons tan t [ 2 ] ;63 }6465 f i e l d = new T∗ [ p a r t i c l e s . s i z e ( ) ] ;66 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )67 {68 −− i ;69 f i e l d [ i ] = new T[ 3 ] ;70 for ( int j = 3 ; j ; )

55

Page 56: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 {72 −−j ;73 f i e l d [ i ] [ j ]= cons tantF i e ld [ j ] ;74 }75 }76 numberOfBodies = p a r t i c l e s . s i z e ( ) ;77 }7879 template<class T>80 Campo<T> : :˜Campo( )81 {82 for ( int i = numberOfBodies ; i ; )83 {84 −− i ;85 delete [ ] f i e l d [ i ] ;86 }8788 delete [ ] f i e l d ;89 f i e l d = 0 ;90 cout << ”>> Fie ld de s t ru c t i on order conf irmed !\n” ;91 }929394 template<class T>95 void Campo<T> : : s e t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& pa r t i c u l a s )96 {97 numberOfBodies = p a r t i c l e s . s i z e ( ) ;98 p a r t i c l e s = pa r t i c u l a s ;99

100 for ( int i = numberOfBodies ; i ; )101 {102 −− i ;103 delete [ ] f i e l d [ i ] ;104 }105106 delete [ ] f i e l d ;107 f i e l d = new T∗ [ numberOfBodies ] ;108 for ( int i = numberOfBodies ; i ; )109 {110 −− i ;111 f i e l d [ i ] = new T[ 3 ] ;112 f i e l d [ i ] [ 0 ]= f i e l d [ i ] [ 1 ]= f i e l d [ i ] [ 2 ]=0;113 }114 }115116117 template <class T>118 vector< Par t i c l e<T>∗ >& Campo<T> : : g e tP a r t i c l e s ( ) const119 {120 return ( vector< Par t i c l e<T>∗ >&) p a r t i c l e s ;121 }122123 template <class T>124 const T∗∗ Campo<T> : : g e tF i e l d ( ) const125 {126 return ( const T∗∗) f i e l d ;127 }128129 template<class T>130 void Campo<T> : : p r in tToFi l e ( const char∗ f i leName ) const131 {132 ofstream out ( fi leName , i o s : : out ) ;133 i f ( ! out )134 {135 std : : c e r r << ”\n∗∗∗ERROR: F i l e ” << f i leName << ”could not be opened ∗∗∗\n” ;136 return ;137 }138139 for ( int i = numberOfBodies ; i ; )140 {141 −− i ;142 const T∗ pos = p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;143 out << setw ( 14 ) << pos [ 0 ] << ” ”

56

Page 57: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144 << setw ( 14 ) << pos [ 1 ] << ” ”145 << setw ( 14 ) << pos [ 2 ] << ” ” ;146 for ( int j = 3 ; j ; )147 {148 −−j ;149 out << setw ( 14 ) << f i e l d [ i ] [ j ] << ” ” ;150 }151152 out << endl ;153 }154155 out . c l o s e ( ) ;156 }157158 #endif

57

Page 58: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

K Codigo CampoElectrico.h

1 #ifndef CAMPOELECTRICOH2 #define CAMPOELECTRICOH34 #include ”Campo . h”5 #ifndef WIN326 #include <omp . h>7 #endif89

10 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗11 ∗ INTERFACE ∗12 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/13 template<class T>14 class CampoElectrico : public Campo<T>15 {16 public :17 // cons t ruc tor para i n i c i a l i z a c a o dos parametros18 CampoElectrico ( vector< Par t i c l e<T>∗ >&, const T so f t , const T∗ f i e l dCons tan t = NULL

) ;19 ˜CampoElectrico ( ) ;2021 virtual void updateFie ld ( ) ;2223 void s e tSo f tFac to r ( const T ) ;24 const T getSo f tFac to r ( ) const ;25 private :26 void bodyBodyInteract ion ( const int , const int , const T ) ;27 private :28 T so f tFac t o r ;29 const double E;30 } ;313233 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗34 ∗ IMPLEMENTACAO ∗35 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/36 template<class T>37 CampoElectrico<T> : : CampoElectrico ( vector< Par t i c l e<T>∗ >& par t i cu l a s ,\38 const T so f t , const T∗ f i e l dCons tan t )39 :Campo<T>( pa r t i cu l a s , f i e l dCons tan t ) ,40 s o f tFac to r ( s o f t ) ,41 E( 1 .0 )42 {43 updateFie ld ( ) ;44 }4546 template<class T>47 CampoElectrico<T> : :˜ CampoElectrico ( )48 {49 cout << ”>> E l e c t r i c f i e l d d e s t ru c t i on order conf irmed !\n” ;50 }515253 //Calcu la f o r ca s a actuar sobre cada pa r t i c u l a54 template <class T>55 void CampoElectrico<T> : : updateFie ld ( )56 {57 //Quadrado do f a c t o r de correccao so para nao ca l c u l a r duas vezes58 const T sof tFactorSquared = so f tFac to r ∗ s o f tFac to r ;5960 //Para cada pa r t i c u l a c a l c u l a f o r ca s a actuar sobre e l a61 #ifndef WIN3262 #pragma omp p a r a l l e l for63 #endif64 for ( int i =0 ; i<Campo<T> : : numberOfBodies;++ i )65 {66 Campo<T> : : f i e l d [ i ] [ 0 ]=Campo<T> : : c ons tantF i e ld [ 0 ] ;67 Campo<T> : : f i e l d [ i ] [ 1 ]=Campo<T> : : c ons tantF i e ld [ 1 ] ;68 Campo<T> : : f i e l d [ i ] [ 2 ]=Campo<T> : : c ons tantF i e ld [ 2 ] ;69 #ifndef WIN32

58

Page 59: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 #pragma omp p a r a l l e l for71 #endif72 for ( int j = 0 ; j<Campo<T> : : numberOfBodies ; ++j )73 bodyBodyInteract ion ( i , j , so f tFactorSquared ) ;74 }75 }7677 template<class T>78 void CampoElectrico<T> : : s e tSo f tFac to r ( const T s o f t )79 {80 //Nao permit ido va l o r nulo , mas va l o r nega t i vo81 //e i n d i f e r e n t e ( so quadramos e s t e va l o r )82 i f ( s o f t )83 so f tFac to r = s o f t ;84 }8586 template<class T>87 const T CampoElectrico<T> : : g e tSo f tFac to r ( ) const88 {89 return s o f tFac to r ;90 }919293 template<class T>94 void CampoElectrico<T> : : bodyBodyInteract ion ( const int i , const int j ,\95 const T sof tFactorSquared )96 {97 /∗∗Parte r e l a t i v a a in t e racoe s que variam com o quadrado da d i s t anc i a ∗∗/98 const T ∗ r0 = Campo<T> : : p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;99 const T ∗ rExt = Campo<T> : : p a r t i c l e s [ j ]−>ge tPo s i t i on ( ) ;

100101 //Posicao r e l a t i v a em re lacao ao body0102 const T r [ 3 ] = { rExt [ 0 ] − r0 [ 0 ] , rExt [ 1 ] − r0 [ 1 ] , rExt [ 2 ] − r0 [ 2 ] } ;103104 //Quadrado da d i s t anc i a com fa c t o r de r e c t i f i c a c a o do campo105 const T d i s t = sq r t ( r [ 0 ] ∗ r [ 0 ] + r [ 1 ] ∗ r [ 1 ] + r [ 2 ] ∗ r [ 2 ] + so f tFactorSquared ) ;106107 //Calcu lo do quoc ien te H = 1.0/( rˆ3 + s o f t ˆ3 )108 const T invDis t = 1 .0/ d i s t ;109 const T invDistCube = invDis t ∗ i nvDi s t ∗ i nvDi s t ;110111 //Calcu la (m 0 , q 0 ) ∗(m ext , q e x t )∗G/( rˆ3 + s o f t ˆ3 )112 const T sE =113 −(Campo<T> : : p a r t i c l e s [ j ]−>getCharge ( ) ) ∗(Campo<T> : : p a r t i c l e s [ i ]−>getCharge ( ) ) ∗E∗

invDistCube ;114115 /∗∗Actua l i za campo∗∗/116 Campo<T> : : f i e l d [ i ] [ 0 ] += r [ 0 ] ∗ sE ;117 Campo<T> : : f i e l d [ i ] [ 1 ] += r [ 1 ] ∗ sE ;118 Campo<T> : : f i e l d [ i ] [ 2 ] += r [ 2 ] ∗ sE ;119 }120121122 #endif

59

Page 60: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

L Codigo CampoGravitico.h

1 #ifndef CAMPOGRAVITICO H2 #define CAMPOGRAVITICO H34 #include ”Campo . h”5 #ifndef WIN326 #include <omp . h>7 #endif89

10 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗11 ∗ INTERFACE ∗12 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/13 template<class T>14 class CampoGravitico : public Campo<T>15 {16 public :17 // cons t ruc tor para i n i c i a l i z a c a o dos parametros18 CampoGravitico ( vector< Par t i c l e<T>∗ >&, const T so f t , const T∗ f i e l dCons tan t = NULL

) ;19 ˜CampoGravitico ( ) ;2021 virtual void updateFie ld ( ) ;2223 void s e tSo f tFac to r ( const T ) ;24 const T getSo f tFac to r ( ) const ;25 private :26 void bodyBodyInteract ion ( const int , const int , const T ) ;27 private :28 T so f tFac t o r ;29 const double G;30 } ;313233 /∗ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗34 ∗ IMPLEMENTACAO ∗35 ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗ ∗/36 template<class T>37 CampoGravitico<T> : : CampoGravitico ( vector< Par t i c l e<T>∗ >& par t i cu l a s ,\38 const T so f t , const T∗ f i e l dCons tan t )39 :Campo<T>( pa r t i cu l a s , f i e l dCons tan t ) ,40 s o f tFac to r ( s o f t ) ,41 G( 1 .0 )42 {43 updateFie ld ( ) ;44 }4546 template<class T>47 CampoGravitico<T> : :˜ CampoGravitico ( )48 {49 cout << ”>> Grav i t i c f i e l d d e s t ru c t i on order conf irmed !\n” ;50 }515253 //Calcu la f o r ca s a actuar sobre cada pa r t i c u l a54 template <class T>55 void CampoGravitico<T> : : updateFie ld ( )56 {57 //Quadrado do f a c t o r de correccao so para nao ca l c u l a r duas vezes58 const T sof tFactorSquared = so f tFac to r ∗ s o f tFac to r ;5960 //Para cada pa r t i c u l a c a l c u l a f o r ca s a actuar sobre e l a61 #ifndef WIN3262 #pragma omp p a r a l l e l for63 #endif64 for ( int i =0 ; i<Campo<T> : : numberOfBodies;++ i )65 {66 Campo<T> : : f i e l d [ i ] [ 0 ]=Campo<T> : : c ons tantF i e ld [ 0 ] ;67 Campo<T> : : f i e l d [ i ] [ 1 ]=Campo<T> : : c ons tantF i e ld [ 1 ] ;68 Campo<T> : : f i e l d [ i ] [ 2 ]=Campo<T> : : c ons tantF i e ld [ 2 ] ;69 #ifndef WIN32

60

Page 61: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 #pragma omp p a r a l l e l for71 #endif72 for ( int j = 0 ; j<Campo<T> : : numberOfBodies ; ++j )73 bodyBodyInteract ion ( i , j , so f tFactorSquared ) ;74 }75 }7677 template<class T>78 void CampoGravitico<T> : : s e tSo f tFac to r ( const T s o f t )79 {80 //Nao permit ido va l o r nulo , mas va l o r nega t i vo81 //e i n d i f e r e n t e ( so quadramos e s t e va l o r )82 i f ( s o f t )83 so f tFac to r = s o f t ;84 }8586 template<class T>87 const T CampoGravitico<T> : : g e tSo f tFac to r ( ) const88 {89 return s o f tFac to r ;90 }919293 template<class T>94 void CampoGravitico<T> : : bodyBodyInteract ion ( const int i , const int j ,\95 const T sof tFactorSquared )96 {97 /∗∗Parte r e l a t i v a a in t e racoe s que variam com o quadrado da d i s t anc i a ∗∗/98 const T ∗ r0 = Campo<T> : : p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;99 const T ∗ rExt = Campo<T> : : p a r t i c l e s [ j ]−>ge tPo s i t i on ( ) ;

100101 //Posicao r e l a t i v a em re lacao ao body0102 const T r [ 3 ] = { rExt [ 0 ] − r0 [ 0 ] , \103 rExt [ 1 ] − r0 [ 1 ] , \104 rExt [ 2 ] − r0 [ 2 ] } ;105106 //Quadrado da d i s t anc i a com fa c t o r de r e c t i f i c a c a o do campo107 const T d i s t = sq r t ( r [ 0 ] ∗ r [ 0 ] + r [ 1 ] ∗ r [ 1 ] + r [ 2 ] ∗ r [ 2 ] + so f tFactorSquared ) ;108109 //Calcu lo do quoc ien te H = 1.0/( rˆ3 + s o f t ˆ3 )110 const T invDis t = 1 .0/ d i s t ;111 const T invDistCube = invDis t ∗ i nvDi s t ∗ i nvDi s t ;112113 //Calcu la (m 0 , q 0 ) ∗(m ext , q e x t )∗G/( rˆ3 + s o f t ˆ3 )114 const T sG =115 ( Campo<T> : : p a r t i c l e s [ j ]−>getMass ( ) ) ∗( Campo<T> : : p a r t i c l e s [ i ]−>getMass ( ) ) ∗G∗

invDistCube ;116117 /∗∗Actua l i za campo∗∗/118 Campo<T> : : f i e l d [ i ] [ 0 ] += r [ 0 ] ∗ sG ;119 Campo<T> : : f i e l d [ i ] [ 1 ] += r [ 1 ] ∗ sG ;120 Campo<T> : : f i e l d [ i ] [ 2 ] += r [ 2 ] ∗ sG ;121122 }123124125 #endif

61

Page 62: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

M Codigo NParticleSystem.h

1 #ifndef NPARTICLESYSTEM H2 #define NPARTICLESYSTEM H34 #include ”CampoGravitico . h”5 #include ”CampoElectrico . h”67 //Configuracoes d e f a u l t do s is tema8 enum NBodyConfig9 {

10 NBODYCONFIGRANDOM,11 NBODY CONFIG SHELL,12 NBODY CONFIG EXPAND,13 NBODY CONFIG STATIONARY,14 NBODY NUMCONFIGS15 } ;161718 //Classe de ges tao do sis tema de N corpos19 template <class T>20 class NPartic leSystem21 {22 public :23 //Defau l t cons t ruc tor24 NPartic leSystem ( vector< Par t i c l e<T>∗ >&, const T s o f t = 0 .325 ,\25 const T damp = 0.125 , const T∗ = NULL ) ;26 //Destructor27 ˜NPartic leSystem ( ) ;2829 //Actua l i za es tado dinamico do sis tema30 void update ( const T timeStep ) ;3132 //Coloca p a r t i c u l a s num estado a l e a t o r i o de acordo com uma33 //dada condicao r e qu i s i t a da ( expansao , s h e l l , a l e a t o r i a )34 void randomizeBodies ( const NBodyConfig , const f loat cSca le , const f loat vSca le ) ;3536 /∗∗Set op t ions ∗∗/37 //Al tera parametros de correcao do campo e de amortecimento38 void s e t So f t en i ng ( const T s o f t ) ;39 void setDamping ( const T damp ) ;4041 //Al tera p a r t i c u l a s que o sis tema gere42 void s e t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& ) ;4344 /∗∗Get op t ions ∗∗/45 //Retorna ponte i ro para p a r t i c u l a s do s is tema46 //ma p o t i l i c a de minimo acesso , mas e f i c i e n t e47 vector< Par t i c l e<T>∗ >& ge tPa r t i c l e s ( ) const ;4849 //Retorna o numero de corpos do sis tema50 const unsigned long getNumberOfBodies ( ) const ;5152 private : //metodos53 //Calcu la e modi f ica es tado dinamico do sis tema54 void integrateNbodySystem ( const T deltaTime ) ;55 protected : // dados56 //Factores de correcao e amortecimento57 T dampFactor ;5859 //Vector de p a r t i c u l a s do sis tema60 vector< Par t i c l e<T>∗ > p a r t i c l e s ;6162 //Campos de fo r ca s63 CampoElectrico<T> ∗ e l e c t r i c F i e l d ;64 CampoGravitico<T> ∗ g r a v i t i c F i e l d ;6566 //Numero de corpos67 unsigned int numberOfBodies ;68 } ;6970 // Fiche i ro de implementacao

62

Page 63: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 #include ”NPartic leSystemImpl . h”7273 #endif

63

Page 64: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

N Codigo NParticleSystemImpl.h

1 #ifndef NPARTICLESYSTEMIMPL H2 #define NPARTICLESYSTEMIMPL H345 #include <cmath>6 #include <ctime>7 #include <c s t d l i b>8 using std : : srand ;9 using std : : time ;

10 using std : : rand ;1112 /∗∗Funcoes de u t i l i d a d e para operar sobre vec t o r e s ∗∗/1314 //Normalizar vec to r segundo norma euc l i d i ana15 template <typename T>16 void17 E2normalize ( T∗ const vector , const int dim )18 {19 f loat normSqr = 0 ;2021 //Cic lo de ca l c u l o do quadrado da norma euc l i d i ana22 for ( int i = dim ; i ; )23 {24 i−−;25 normSqr += vecto r [ i ]∗ vec to r [ i ] ;26 }2728 const f loat norm = sqr t ( normSqr ) ;29 //Testa a nao nu l idade da norma30 i f ( normSqr > 1e−6 )31 for ( int i = dim ; i ; )32 {33 i−−;34 vec to r [ i ]/=norm ;35 }36 }373839 //Produto externo de do i s v e c t o r e s num espaco a 3 dimensoes40 template<typename T>41 T∗42 c r o s s ( const T∗ const v0 , const T∗ const v1 )43 {44 T ∗ r t = new T[ 3 ] ;4546 r t [ 0 ] = v0 [ 1 ]∗ v1 [ 2 ]−v0 [ 2 ]∗ v1 [ 1 ] ;47 r t [ 1 ] = v0 [ 2 ]∗ v1 [ 0 ]−v0 [ 0 ]∗ v1 [ 2 ] ;48 r t [ 2 ] = v0 [ 0 ]∗ v1 [ 1 ]−v0 [ 1 ]∗ v1 [ 0 ] ;4950 return r t ;51 }525354 /∗∗∗IMPLEMENTACAO DA CLASSE∗∗∗/555657 //Defau l t cons t ruc tor da c l a s s e58 template <class T>59 NParticleSystem<T> : : NPart ic leSystem ( vector< Par t i c l e<T>∗ >& par t i cu l a s , const T so f t ,\60 const T damp , const T∗ f i e l dCons tan t )61 : p a r t i c l e s ( p a r t i c u l a s ) , // I n i c i a l i z a ponte i ro para vec tor de p a r t i c u l a s62 numberOfBodies ( p a r t i c u l a s . s i z e ( ) )63 {64 setDamping ( damp ) ; // I n i c i a l i z a f a c t o r de amortecimento6566 e l e c t r i c F i e l d = new CampoElectrico<T>( pa r t i cu l a s , s o f t , f i e l dCons tan t ) ;67 g r a v i t i c F i e l d = new CampoGravitico<T>( pa r t i cu l a s , s o f t , f i e l dCons tan t ) ;68 }6970 //Destructor da c l a s s e

64

Page 65: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 template <class T>72 NParticleSystem<T> : :˜ NPartic leSystem ( )73 {74 delete e l e c t r i c F i e l d ;75 e l e c t r i c F i e l d = 0 ;76 delete g r a v i t i c F i e l d ;77 g r a v i t i c F i e l d = 0 ;78 std : : cout << ”>> NPartic leSystem de s t ru c t i on order conf irmed !\n” ;79 }808182 //Actua l i za es tado dinamico do sis tema de p a r t i c u l a s83 // t imes tep e o i n t e r v a l o de tempo da ac tua l i z a cao84 template <class T>85 void NParticleSystem<T> : : update ( const T timeStep )86 {87 integrateNbodySystem ( timeStep ) ;88 }899091 //Al tera parametro de suav izacao92 template <class T>93 void NParticleSystem<T> : : s e t So f t en i ng ( const T s o f t )94 {95 g r a v i t i cF i e l d−>s e tSo f tFac to r ( s o f t ) ;96 e l e c t r i c F i e l d −>s e tSo f tFac to r ( s o f t ) ;97 }9899

100 //Al tera parametro de amortecimento101 template <class T>102 void NParticleSystem<T> : : setDamping ( const T damp )103 {104 //Nao permit ido va l o r nulo nem va lo r nega t i vo105 i f ( damp>0 )106 dampFactor = damp ;107 }108109 //Retorna vec tor das p a r t i c u l a s110 template <class T>111 vector< Par t i c l e<T>∗ >& NParticleSystem<T> : : g e tP a r t i c l e s ( ) const112 {113 return ( vector< Par t i c l e<T>∗ >&)p a r t i c l e s ;114 }115116 //Define qua i s as p a r t i c u l a s do s is tema117 template <class T>118 void NParticleSystem<T> : : s e t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& part )119 {120 p a r t i c l e s = part ;121 numberOfBodies = p a r t i c l e s . s i z e ( ) ;122123 g r a v i t i cF i e l d−>s e t P a r t i c l e s ( part ) ;124 e l e c t r i c F i e l d −>s e t P a r t i c l e s ( part ) ;125 }126127 //Retorna o numero de corpos do sis tema128 template <class T>129 const unsigned long NParticleSystem<T> : : getNumberOfBodies ( ) const130 {131 return numberOfBodies ;132 }133134135 //Calcu la e modi f ica es tado dinamico do sis tema136 template <class T>137 void NParticleSystem<T> : : integrateNbodySystem ( const T timeStep )138 {139 const T timeFactor = timeStep ∗dampFactor ;140141 //Actua l i za campos e l e c t r i c o e g r a v i t i c o142 e l e c t r i c F i e l d −>updateFie ld ( ) ;143 g r a v i t i cF i e l d−>updateFie ld ( ) ;

65

Page 66: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144145 //Obtem os do i s campos146 const T∗∗ e l e cF i e l d = e l e c t r i c F i e l d −>ge tF i e l d ( ) ;147 const T∗∗ gravFie ld = g r a v i t i cF i e l d−>ge tF i e l d ( ) ;148149150 //Para cada pa r t i c u l a do sistema , a c t u a l i z a a sua pos icao151 #pragma omp p a r a l l e l for152 for ( unsigned int i = 0 ; i<numberOfBodies;++ i )153 {154 const T invMassFactor = timeFactor /( p a r t i c l e s [ i ]−>getMass ( ) ) ;155156 //Antigas v e l o c i dade s e pos i coes157 const T ∗pos = p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;158 const T ∗ ve l = p a r t i c l e s [ i ]−>ge tVe l o c i t y ( ) ;159160 //Novas v e l o c i dade s161 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ 0 ]+( e l e cF i e l d [ i ] [ 0 ]+ gravFie ld [ i ] [ 0 ] ) ∗

invMassFactor ,\162 ve l [ 1 ]+( e l e cF i e l d [ i ] [ 1 ]+ gravFie ld [ i ] [ 1 ] ) ∗

invMassFactor ,\163 ve l [ 2 ]+( e l e cF i e l d [ i ] [ 2 ]+ gravFie ld [ i ] [ 2 ] ) ∗

invMassFactor ) ;164165 //Nova pos icao = ant i ga pos icao + nova ve loc idade ∗deltaTime166 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( pos [ 0 ]+ ve l [ 0 ]∗ timeStep ,\167 pos [ 1 ]+ ve l [ 1 ]∗ timeStep ,\168 pos [ 2 ]+ ve l [ 2 ]∗ t imeStep ) ;169 }170 }171172173 /∗∗ u t i l i t y func t i on ∗∗/174 template <typename T>175 void NParticleSystem<T> : : randomizeBodies ( const NBodyConfig con f i g ,\176 const f loat c l u s t e r S c a l e ,\177 const f loat v e l o c i t y S c a l e )178 {179 // I n i c i a l i z a origem da sequencia de pseudo−a l e a t o r i o s180 std : : srand ( std : : time ( NULL ) ) ;181 const f loat auxRandMax = RANDMAX∗ 0 . 5 ;182 const f loat s c a l e = c l u s t e r S c a l e ∗ std : : max<f loat>( 5 . 0 f , ( f loat ) p a r t i c l e s . s i z e ( )

/(1024 .0 f ) ) ;183184 switch ( c on f i g )185 {186 case NBODY CONFIG SHELL:187 {188 const f loat v s c a l e = c l u s t e r S c a l e ∗ v e l o c i t y S c a l e ;189 const f loat i nne r = 0 .5 f ∗ c l u s t e r S c a l e ;190 const f loat outer = 4 .0 f ∗ c l u s t e r S c a l e ;191192 //Rotacao em torno do e ixo dos zz193 T ax i s [ 3 ] = { 0 .0 f , 1 . 0 f , 0 . 0 f } ;194 E2normalize ( ax is , 3 ) ;195196 //Para cada pa r t i c u l a197 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )198 {199 i−−;200201 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a202 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;203 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;204 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;205206 T point [ 3 ] = {x , y , z } ;207 E2normalize ( point , 3 ) ;208209210 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( (T) po int [ 0 ] ∗ ( inne r + ( outer − i nne r ) ∗ rand ( ) /(

(T) RANDMAX ) ) ,\

66

Page 67: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

211 (T) po int [ 1 ] ∗ ( inne r + ( outer − i nne r ) ∗ rand ( ) /((T) RANDMAX ) ) ,\

212 (T) po int [ 2 ] ∗ ( inne r + ( outer − i nne r ) ∗ rand ( ) /((T) RANDMAX ) ) ) ;

213214 //Veloc idades das p a r t i c u l a s perpend i cu l a re s215 //ao e ixo e a pos icao da pa r t i c u l a216 const T ∗ ve l = ( const T∗) c r o s s ( p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) , ax i s ) ;217 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( (T) ve l [ 0 ]∗ dampFactor∗ vsca l e ,\218 (T) ve l [ 1 ]∗ dampFactor∗ vsca l e ,\219 (T) ve l [ 2 ]∗ dampFactor∗ v s c a l e ) ;220 }221222 }223 break ;224 case NBODY CONFIG EXPAND:225 {226 f loat v s c a l e = s c a l e ∗ v e l o c i t y S c a l e ;227228 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )229 {230 i−−;231 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a232 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;233 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;234 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;235 T point [ 3 ] = {x , y , z } ;236237 //Posicoes das p a r t i c u l a s238 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( (T) po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\239 (T) po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\240 (T) po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;241242 //Veloc idades das p a r t i c u l a s243 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( (T) po int [ 0 ]∗ vsca l e ,\244 (T) po int [ 1 ]∗ vsca l e ,\245 (T) po int [ 2 ]∗ v s c a l e ) ;246 }247 }248 break ;249 case NBODYCONFIGRANDOM:250 {251 f loat v s c a l e = v e l o c i t y S c a l e ∗ s c a l e ;252253 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )254 {255 i−−;256 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a257 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;258 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;259 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;260 T point [ 3 ] = {x , y , z } ;261262 //Posicao da pa r t i c u l a263264 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\265 po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\266 po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;267268 //Velocidade da pa r t i c u l a269 T vx = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;270 T vy = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;271 T vz = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;272 const T ve l [ 3 ] = {vx , vy , vz } ;273274 //Veloc idades das p a r t i c u l a s275 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ 0 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\276 ve l [ 1 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\277 ve l [ 2 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ) ;278 }279 }280 break ;281 case NBODY CONFIG STATIONARY:

67

Page 68: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

282 default :283 {284 for ( unsigned int i = p a r t i c l e s . s i z e ( ) ; i ; )285 {286 i−−;287 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a288 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;289 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;290 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;291 T point [ 3 ] = {x , y , z } ;292293 //Posicao da pa r t i c u l a294 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s ca l e ,\295 po int [ 1 ]∗ s ca l e ,\296 po int [ 2 ]∗ s c a l e ) ;297298 //Veloc idades das p a r t i c u l a s299 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( 0 , 0 , 0 ) ;300 }301 }302 break ;303304 }305 }306307 #endif

68

Page 69: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

O Codigo ParticleRenderer.h

123 #ifndef PARTICLERENDERER H4 #define PARTICLERENDERER H567 #include ”Pa r t i c l e . h”8 #include <vector>9 using std : : vec to r ;

101112 enum DisplayMode13 {14 PARTICLE POINTS,15 PARTICLE SPHERES,16 PARTICLE SPRITES,17 PARTICLE NUM MODES18 } ;192021 template<class T>22 class Part i c l eRendere r23 {24 public :25 Par t i c l eRendere r ( const vector< Par t i c l e<T>∗ >& ) ;26 ˜ Par t i c l eRendere r ( ) ;2728 void setBaseColor ( const f loat c o l o r [ 4 ] ) ;29 void setBaseColor ( const float , const float , const float , const f loat ) ;3031 //Apresenta graf icamente o s is tema de p a r t i c u l a s32 void d i sp l ay (DisplayMode mode = PARTICLE SPHERES ) ;3334 //Define tamanho da pa r t i c u l a pontua l35 void s e tPo in tS i z e ( f loat s i z e )36 {37 m pointSize = s i z e ;38 }3940 protected : // metodos41 // In i c i a e de f i ne o es tado do OpenGl para o render das p a r t i c u l a s42 void in i tGL ( ) ;4344 //Cria t e x tu ra45 void c rea teTexture ( int r e s o l u t i o n ) ;4647 //Desenha pontos r e p r e s en t a t i v o s da pos icao das p a r t i c u l a s48 void drawPar t i c l e s ( const DisplayMode ) ;495051 protected : // dados52 int m numParticles ;5354 vector< Par t i c l e<T> ∗> p a r t i c l e s ;5556 f loat m pointSize ;5758 unsigned int m vertexShader ;59 unsigned int m pixelShader ;60 unsigned int m program ;61 unsigned int m texture ;62 unsigned int m vboColor ;6364 bool fp64 ;6566 f loat m baseColor [ 4 ] ;67 } ;6869 #include ”Part i c l eRenderer Impl . h”70

69

Page 70: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 #endif // RENDER PARTICLES

70

Page 71: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

P Codigo ParticleRendererImpl.h

1 #ifndef RENDERPARTICLESIMPL H2 #define RENDERPARTICLESIMPL H345 #include <GL/glew . h>67 #i f de f ined (WIN32)8 #include <GL/wglew . h>9 #endif

1011 #i f de f ined ( APPLE ) | | de f ined (MACOSX)12 #include <GLUT/ g lu t . h>13 #else14 #include <GL/ g lu t . h>15 #endif1617 #include <math . h>181920 #define GL POINT SPRITE ARB 0x886121 #define GL COORD REPLACE ARB 0x886222 #define GL VERTEX PROGRAM POINT SIZE NV 0x8642232425 template<class T>26 Part i c l eRenderer<T> : : Par t i c l eRendere r ( const vector< Par t i c l e<T>∗ >& pa r t i c u l a s )27 : m numParticles ( p a r t i c u l a s . s i z e ( ) ) ,28 m pointSize ( 1 . 0 f ) ,29 m vertexShader (0 ) ,30 m pixelShader (0 ) ,31 m program (0) ,32 m texture (0 ) ,33 p a r t i c l e s ( p a r t i c u l a s )34 {35 in i tGL ( ) ;36 fp64 = ( s izeof (T)==s izeof (double ) ) ;37 }3839 template<class T>40 Part i c l eRenderer<T> : :˜ Par t i c l eRendere r ( )41 {42 std : : cout << ”>> Part i c l eRendere r d e s t ru c t i on order conf irmed !\n” ;43 }4445 template<class T>46 void Part i c l eRenderer<T> : : s e tBaseColor ( const f loat c o l o r [ 4 ] )47 {48 for ( int i = 0 ; i < 4 ; i++)49 m baseColor [ i ] = co l o r [ i ] ;50 }5152 template<class T>53 void Part i c l eRenderer<T> : : s e tBaseColor ( const f loat r , const f loat g ,\54 const f loat b , const f loat a )55 {56 m baseColor [ 0 ] = r ;57 m baseColor [ 1 ] = g ;58 m baseColor [ 2 ] = b ;59 m baseColor [ 3 ] = a ;60 }6162 //Desenha pa r t i c u l a s63 template<class T>64 void Part i c l eRenderer<T> : : d r awPar t i c l e s ( const DisplayMode mode )65 {66 i f ( mode == PARTICLE SPHERES )67 {68 glPushMatrix ( ) ;69 i f ( fp64 )70 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )

71

Page 72: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 {72 i−−;73 g lCo l o r3 fv ( ( const GLfloat ∗) p a r t i c l e s [ i ]−>getColor ( ) ) ;74 const double∗ p = ( const double∗) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;75 g lTrans la t ed ( p [ 0 ] , p [ 1 ] , p [ 2 ] ) ;76 g lu tSo l i dSphe r e ( m pointSize ∗ p a r t i c l e s [ i ]−>g e tS i z e ( ) ,10 ,10 ) ;77 g lTrans la t ed ( −p [ 0 ] , −p [ 1 ] , −p [ 2 ] ) ;78 }79 else80 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )81 {82 i−−;83 g lCo l o r3 fv ( ( const GLfloat ∗) p a r t i c l e s [ i ]−>getColor ( ) ) ;84 const f loat ∗ p = ( const f loat ∗) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;85 g lT r an s l a t e f ( p [ 0 ] , p [ 1 ] , p [ 2 ] ) ;86 g lu tSo l i dSphe r e ( m pointSize ∗ p a r t i c l e s [ i ]−>g e tS i z e ( ) ,10 ,10 ) ;87 g lT r an s l a t e f ( −p [ 0 ] , −p [ 1 ] , −p [ 2 ] ) ;88 }89 glPopMatrix ( ) ;90 }91 else92 {93 g lBeg in (GL POINTS) ;94 {95 i f ( fp64 )96 {97 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )98 {99 i−−;

100 glVertex3dv ( ( const GLdouble ∗) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ) ;101 }102 }103 else104 {105 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )106 {107 i−−;108 g lVer tex3 fv ( ( const GLfloat ∗) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ) ;109 }110 }111 }112 glEnd ( ) ;113 }114 }115116117 template<class T>118 void Part i c l eRenderer<T> : : d i sp l ay ( DisplayMode mode /∗ = PARTICLE SPHERES ∗/ )119 {120 switch (mode)121 {122 //Esferas de diametro proporc iona l ao ’ ra io ’ da pa r t i c u l a123 case PARTICLE SPHERES:124 glEnable (GL DEPTH TEST) ;125 glEnable (GL LIGHTING) ;126 glEnable (GL LIGHT0) ;127 glEnable (GL COLOR MATERIAL ) ;128 drawPar t i c l e s ( PARTICLE SPHERES ) ;129 //Pontos brancos com tamanho po in tS i z e130 case PARTICLE POINTS:131 g lCo l o r 3 f ( 1 . 0 f , 1 . 0 f , 1 . 0 f ) ;132 g lPo in tS i z e ( m pointSize ) ;133 d rawPar t i c l e s ( PARTICLE POINTS ) ;134 break ;135 //Espectro de l u z em vo l t a das p a r t i c u l a s136 case PARTICLE SPRITES :137 default :138 {139 // se tup po in t s p r i t e s140 glEnable (GL POINT SPRITE ARB) ;141 glTexEnvi (GL POINT SPRITE ARB, GL COORD REPLACE ARB, GL TRUE) ;142 glEnable (GL VERTEX PROGRAM POINT SIZE NV) ;143 g lPo in tS i z e ( m pointSize ) ;

72

Page 73: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144 glBlendFunc (GL SRC ALPHA, GL ONE) ;145 glEnable (GL BLEND) ;146 glDepthMask (GL FALSE) ;147148 glUseProgram (m program ) ;149 GLuint texLoc = glGetUniformLocation (m program , ”sp latTexture ”) ;150 g lUni form1i ( texLoc , 0) ;151152 glActiveTextureARB (GL TEXTURE0 ARB) ;153 glBindTexture (GL TEXTURE 2D, m texture ) ;154155 g lCo l o r 3 f (1 , 1 , 1) ;156 g lSecondaryColor3 fv ( m baseColor ) ;157158 drawPar t i c l e s ( PARTICLE SPRITES ) ;159160 glUseProgram (0) ;161162 g lD i s ab l e (GL POINT SPRITE ARB) ;163 g lD i s ab l e (GL BLEND) ;164 glDepthMask (GL TRUE) ;165 }166 break ;167 }168169 }170171 const char vertexShader [ ] =172 {173 ”void main ( ) \n”174 ”{ \n”175 ” f l o a t po in tS i z e = 500 .0 ∗ g l Po in t . s i z e ; \n”176 ” vec4 ve r t = g l Ver t ex ; \n”177 ” ver t .w = 1 . 0 ; \n”178 ” vec3 pos eye = vec3 ( gl ModelViewMatrix ∗ ver t ) ; \n”179 ” g l Po i n tS i z e = max( 1 . 0 , po i n tS i z e / ( 1 . 0 − pos eye . z ) ) ; \n”180 ” gl TexCoord [ 0 ] = gl MultiTexCoord0 ; \n”181 ” gl TexCoord [ 1 ] = gl MultiTexCoord1 ; \n”182 ” g l P o s i t i o n = f t rans fo rm ( ) ; \n”183 ” g l FrontCo lor = g l Co l o r ; \n”184 ” gl FrontSecondaryColor = gl SecondaryColor ; \n”185 ”} \n”186 } ;187188 const char p ixe lShader [ ] =189 {190 ”uniform sampler2D sp latTexture ; \n”191192 ”void main ( ) \n”193 ”{ \n”194 ” vec4 co l o r 2 = gl SecondaryColor ; \n”195 ” vec4 c o l o r = (0 . 8 + 0.4∗ g l Co l o r ) ∗ texture2D ( splatTexture , gl TexCoord [ 0 ] . s t ) ; \n”196 ” g l FragColor = \n”197 ” c o l o r ∗ co l o r 2 ;\n”//mix ( vec4 (0 .1 , 0 .0 , 0 .0 , co l o r .w) , co lor2 , co l o r .w) ;\n”198 ”} \n”199 } ;200201202 template<class T>203 void Part i c l eRenderer<T> : : in i tGL ( )204 {205 m vertexShader = glCreateShader (GL VERTEX SHADER) ;206 m pixelShader = glCreateShader (GL FRAGMENT SHADER) ;207208 const char∗ v = vertexShader ;209 const char∗ p = pixe lShader ;210 g lShaderSource ( m vertexShader , 1 , &v , 0) ;211 g lShaderSource ( m pixelShader , 1 , &p , 0) ;212213 glCompileShader ( m vertexShader ) ;214 glCompileShader ( m pixelShader ) ;215216 m program = glCreateProgram ( ) ;

73

Page 74: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

217218 glAttachShader (m program , m vertexShader ) ;219 glAttachShader (m program , m pixelShader ) ;220221 glLinkProgram (m program ) ;222223 crea teTexture (32) ;224225 g lGenBuf fers (1 , (GLuint ∗)&m vboColor ) ;226 g lB indBuf f e r ( GL ARRAY BUFFER ARB, m vboColor ) ;227 g lBuf fe rData ( GL ARRAY BUFFER ARB, m numParticles ∗ 4 ∗ s izeof ( f loat ) , 0 ,

GL STATIC DRAW ARB) ;228 g lB indBuf f e r ( GL ARRAY BUFFER ARB, 0) ;229 }230231 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−232 // Function : EvalHermite233 // Descr ip t ion :234 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−235 /∗∗236 ∗ EvalHermite ( f l o a t pA, f l o a t pB, f l o a t vA , f l o a t vB , f l o a t u)237 ∗ @brie f Eva luates Hermite b a s i s f unc t i ons f o r the s p e c i f i e d c o e f f i c i e n t s .238 ∗/239 inl ine f loat evalHermite ( const f loat pA, const f loat pB,\240 const f loat vA, const f loat vB,\241 const f loat u)242 {243 const f loat u2=(u∗u) , u3=u2∗u ;244 const f loat B0 = 2∗u3 − 3∗u2 + 1 . 0 ;245 const f loat B1 = −2∗u3 + 3∗u2 ;246 const f loat B2 = u3 − 2∗u2 + u ;247 const f loat B3 = u3 − u ;248 return ( B0∗pA + B1∗pB + B2∗vA + B3∗vB ) ;249 }250251252 unsigned char∗ createGaussianMap ( const int N )253 {254 f loat ∗M = new float [ 2∗N∗N] ;255 unsigned char ∗B = new unsigned char [ 4∗N∗N] ;256 f loat X,Y,Y2 , Dist ;257 f loat Inc r = 2 .0 f /N;258 int i =0;259 int j = 0 ;260 Y = −1.0 f ;261262 for ( int y=N; y ; Y+=Incr )263 {264 y−−;265 Y2=Y∗Y;266 X = −1.0 f ;267 for ( int x=N; x ; X+=Incr , i +=2, j+=4)268 {269 x−−;270 Dist = ( f loat ) s q r t f (X∗X+Y2) ;271 i f ( Dist>1)272 Dist=1;273 M[ i +1] = M[ i ] = evalHermite ( 1 . 0 f , 0 , 0 , 0 , Dist ) ;274 B[ j +3] = B[ j +2] = B[ j +1] = B[ j ] = (unsigned char ) (M[ i ] ∗ 256) ;275 }276 }277 delete [ ] M;278 return (B) ;279 }280281 template<class T>282 void Part i c l eRenderer<T> : : c r ea teTexture ( const int r e s o l u t i o n )283 {284 unsigned char∗ data = createGaussianMap ( r e s o l u t i o n ) ;285 glGenTextures (1 , (GLuint ∗)&m texture ) ;286 glBindTexture (GL TEXTURE 2D, m texture ) ;287 glTexParameteri (GL TEXTURE 2D, GL GENERATE MIPMAP SGIS, GL TRUE) ;288 glTexParameteri (GL TEXTURE 2D, GL TEXTURE MIN FILTER, GL LINEAR MIPMAP LINEAR) ;

74

Page 75: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

289 glTexParameteri (GL TEXTURE 2D, GL TEXTURE MAG FILTER, GL LINEAR) ;290 glTexImage2D (GL TEXTURE 2D, 0 , GL RGBA8, r e s o l u t i on , r e s o l u t i on , 0 ,291 GL RGBA, GL UNSIGNED BYTE, data ) ;292 }293294 #endif

75

Page 76: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

Q Codigo param.h

1 /∗2 Fiche i ro o r i g i n a l cr iado por NVIDIA CORPORATION3 Classes base e f i l h a s para cr iacao de l i s t a s de parametros4 ∗/56 #ifndef PARAMH7 #define PARAMH89 #include <s t r i ng>

10 #include <vector>11 #include <map>12 #include <iostream>13 #include <sstream>14 #include <iomanip>1516 //Classe mae para cada parametro17 class ParamBase {18 public :19 //COnstructor da c l a s s e mae20 ParamBase ( const char ∗name)21 : m name(name)22 {23 }2425 virtual ˜ParamBase ( ) { }2627 std : : s t r i n g &GetName ( )28 {29 return m name ;30 }3132 virtual f loat GetFloatValue ( ) = 0 ;33 virtual int GetIntValue ( ) = 0 ;34 virtual std : : s t r i n g GetValueStr ing ( ) = 0 ;3536 virtual void Reset ( ) = 0 ;37 virtual void Increment ( ) = 0 ;38 virtual void Decrement ( ) = 0 ;3940 virtual f loat GetPercentage ( ) = 0 ;41 virtual void SetPercentage ( f loat p) = 0 ;4243 virtual void Write ( std : : ostream &stream ) = 0 ;44 virtual void Read( std : : i s t ream &stream ) = 0 ;4546 virtual bool I s L i s t ( ) = 0 ;4748 protected :49 std : : s t r i n g m name ;50 } ;515253 //Classe f i l h a para cada parametro54 template<class T> class Param : public ParamBase {55 public :56 Param( const char ∗name , T value = 0 , T min = 0 , T max = 10000 , T step = 1 , T∗ ptr = 0)

:57 ParamBase (name) ,58 m default ( va lue ) ,59 m min(min ) ,60 m max(max) ,61 m step ( s tep ) ,62 m prec i s i on (5 )63 {64 i f ( ptr ) {65 m ptr = ptr ;66 } else {67 m ptr = &m value ;68 }69 ∗m ptr = value ;

76

Page 77: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 }71 ˜Param( ) { }7273 T GetValue ( ) const { return ∗m ptr ; }74 T SetValue ( const T value ) { ∗m ptr = value ; }7576 f loat GetFloatValue ( ) { return ( f loat ) ∗m ptr ; }77 int GetIntValue ( ) { return ( int ) ∗m ptr ; }7879 std : : s t r i n g GetValueStr ing ( )80 {81 std : : o s t r ing s t r eam ost ;82 ost<<std : : s e t p r e c i s i o n ( m prec i s i on )<<std : : f i x e d ;83 ost<<∗m ptr ;84 return os t . s t r ( ) ;85 }8687 void Se tPr e c i s i on ( int x ) { m prec i s i on = x ; }8889 f loat GetPercentage ( )90 {91 return (∗m ptr − m min) / ( f loat ) (m max − m min) ;92 }9394 void SetPercentage ( f loat p)95 {96 ∗m ptr = (T) (m min + p ∗ (m max − m min) ) ;97 }9899 void Reset ( ) { ∗m ptr = m default ; }

100101 void Increment ( )102 {103 ∗m ptr += m step ;104 i f (∗m ptr > m max)105 ∗m ptr = m max ;106 }107108 void Decrement ( )109 {110 ∗m ptr −= m step ;111 i f (∗m ptr < m min)112 ∗m ptr = m min ;113 }114115 void Write ( std : : ostream &stream ) { stream << m name << ” ” << ∗m ptr << ’ \n ’ ; }116 void Read( std : : i s t ream &stream ) { stream >> m name >> ∗m ptr ; }117118 bool I s L i s t ( ) { return fa lse ; }119120 private :121 T m value ;122 T ∗m ptr ; // po in t e r to va lue dec lared e l sewhere123 T m default , m min , m max , m step ;124 int m prec i s i on ; // number o f d i g i t s a f t e r decimal po in t in s t r i n g output125 } ;126127128 extern const Param<int> dummy;129130 //Classe neta para l i s t a de parametros131 class ParamList : public ParamBase {132 public :133 ParamList ( const char ∗name = ””) :134 ParamBase (name)135 {136 a c t i v e = true ;137 }138 ˜ParamList ( ) { }139140 f loat GetFloatValue ( ) { return 0 .0 f ; }141 int GetIntValue ( ) { return 0 ; }142

77

Page 78: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

143 void AddParam(ParamBase ∗param)144 {145 m params . push back (param) ;146 m map [ param−>GetName ( ) ] = param ;147 m current = m params . begin ( ) ;148 }149150 // look−up parameter based on name151 ParamBase ∗GetParam(char ∗name)152 {153 ParamBase ∗p = m map [ name ] ;154155 i f (p)156 return p ;157 else158 return (ParamBase ∗) &dummy;159 }160161 ParamBase ∗GetParam( int i )162 {163 return m params [ i ] ;164 }165166 ParamBase ∗GetCurrent ( )167 {168 return ∗m current ;169 }170171 int GetSize ( ) { return ( int )m params . s i z e ( ) ; }172173 std : : s t r i n g GetValueStr ing ( )174 {175 return m name ;176 }177178 // func t i ons to t r a v e r s e l i s t179 void Reset ( )180 {181 m current = m params . begin ( ) ;182 }183184 //Aumenta numero de parametro se l e c ionado185 void Increment ( )186 {187 m current++;188 i f ( m current == m params . end ( ) )189 m current = m params . begin ( ) ;190 }191192 void Decrement ( )193 {194 i f ( m current == m params . begin ( ) )195 m current = m params . end ( ) −1;196 else197 m current−−;198199 }200201 f loat GetPercentage ( ) { return 0 .0 f ; }202 void SetPercentage ( f loat /∗p∗/ ) {}203204 void Write ( std : : ostream &stream )205 {206 stream << m name << ’ \n ’ ;207 for ( std : : vector<ParamBase ∗> : : c o n s t i t e r a t o r p = m params . begin ( ) ; p != m params .

end ( ) ; ++p) {208 (∗p)−>Write ( stream ) ;209 }210 }211212 void Read( std : : i s t ream &stream )213 {214 stream >> m name ;

78

Page 79: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

215 for ( std : : vector<ParamBase ∗> : : c o n s t i t e r a t o r p = m params . begin ( ) ; p != m params .end ( ) ; ++p) {

216 (∗p)−>Read( stream ) ;217 }218 }219220 bool I s L i s t ( ) { return true ; }221222 void ResetAl l ( )223 {224 for ( std : : vector<ParamBase ∗> : : c o n s t i t e r a t o r p = m params . begin ( ) ; p != m params .

end ( ) ; ++p) {225 (∗p)−>Reset ( ) ;226 }227 }228229 protected :230 bool a c t i v e ;231 std : : vector<ParamBase ∗> m params ;232 std : : map<std : : s t r i ng , ParamBase ∗> m map ;233 std : : vector<ParamBase ∗> : : c o n s t i t e r a t o r m current ;234 } ;235236 #endif

79

Page 80: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

R Codigo paramgl.h

1 /∗2 Fiche i ro o r i g i n a l e laborado por NVIDIA CORPORATION3 ParamListGL4 − c l a s s e f i l h a de ParamList para e f e c t ua r o render da l i s t a de parametros em OpenGL5 ∗/67 #ifndef PARAMGLH8 #define PARAMGLH9

10 #i f de f ined ( APPLE ) | | de f ined (MACOSX)11 #include <GLUT/ g lu t . h>12 #else13 #include <GL/ g lu t . h>14 #endif1516 #include ”param . h”1718 void beginWinCoords ( ) ;19 void endWinCoords ( ) ;20 void g lP r i n t ( int x , int y , const char ∗s , void ∗ f ont ) ;21 void glPrintShadowed ( int x , int y , const char ∗s , void ∗ font , f loat ∗ c o l o r ) ;222324 //Classe f i l h a da c l a s s e ParamList , para l i s t a de parametros em openg l25 class ParamListGL : public ParamList {26 public :27 ParamListGL ( const char ∗name = ””) ;2829 //Desenha l i s t a de parametros na t e l a30 void Render ( int x , int y ) ;3132 //Reaccao ao c l i c k do mouse33 bool Mouse ( int x , int y , int button=GLUT LEFT BUTTON, int s t a t e=GLUTDOWN) ;3435 //Reaccao ao movimento ( do mouse )36 bool Motion ( int x , int y ) ;3738 //Reaccao ao t e c l ado39 void Spe c i a l ( int key , int x , int y ) ;4041 //Al tera tamanho e pos icao r e l a t i v a das f on t e s em re lacao a jane l a42 void SetFont (void ∗ font , int he ight )43 {44 m font = font ;45 m font h = he ight ;46 }4748 //Al tera cor de paramatros s e l e c i onados49 void Se tSe l e c t edCo lo r ( f loat r , f loat g , f loat b)50 {51 m t e x t c o l o r s e l e c t e d = Color ( r , g , b ) ;52 }5354 //Al tera cor de paramatros nao se l e c i onados55 void SetUnSelectedColor ( f loat r , f loat g , f loat b)56 {57 m tex t c o l o r un s e l e c t ed = Color ( r , g , b ) ;58 }5960 //Al tera cor do i n t e r i o r das barras61 void SetBarColorInner ( f loat r , f loat g , f loat b)62 {63 m bar co l o r i nne r = Color ( r , g , b ) ;64 }6566 //Al tera cor da l i nha de l imi tadora das barras ( formato RGB )67 void SetBarColorOuter ( f loat r , f loat g , f loat b)68 {69 m bar co l o r oute r = Color ( r , g , b ) ;70 }

80

Page 81: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

7172 private :73 void ∗m font ;74 int m font h ; // fon t h e i gh t7576 int m bar x ; // bar s t a r t x po s i t i on77 int m bar w ; // bar width78 int m bar h ; // bar he i gh t79 int m text x ; // t e x t s t a r t x po s i t i on80 int m separat ion ; // bar separa t ion in y81 int m value x ; // va lue t e x t x po s i t i on82 int m bar o f f s e t ; // bar o f f s e t in y8384 int m start x , m start y ;8586 struct Color87 {88 //Constructor da e s t ru tu ra89 Color ( f loat r , f loat g , f loat b )90 {91 r = r ;92 g = g ;93 b = b ;94 }9596 //Cores no formato RGB97 f loat r , g , b ;98 } ;99

100 //Cor de paramatros s e l e c i onados101 Color m t e x t c o l o r s e l e c t e d ;102 //Cor de paramatros nao se l e c i onados103 Color m t ex t c o l o r un s e l e c t ed ;104 //Cor shadow105 Color m text co lor shadow ;106 //Cor de l i nha de l imi tadora da barra107 Color m bar co l o r oute r ;108 //Cor no i n t e r i o r109 Color m bar co l o r i nne r ;110 } ;111112 #endif

81

Page 82: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

S Codigo paramgl.cpp

1 /∗2 Fiche i ro o r i g i n a l e laborado por NVIDIA CORPORATION3 ParamListGL4 − c l a s s e f i l h a de ParamList para e f e c t ua r o render da l i s t a de parametros em OpenGL5 Fiche i ro de implementacao6 ∗/78 #include ”param . h”9 #include ”paramgl . h”

10 #include <s t r i n g . h>11 #include <s t d i o . h>1213 void beginWinCoords (void )14 {15 glMatrixMode (GLMODELVIEW) ;16 glPushMatrix ( ) ;17 g lLoadIdent i ty ( ) ;18 g lT r an s l a t e f ( 0 . 0 , 102 , 0 . 0 ) ; //Posicao na jane l a da l i s t a19 g l S c a l e f ( 1 . 0 , −1.0 , 1 . 0 ) ; //Factor de e s ca l a2021 glMatrixMode (GL PROJECTION) ;22 glPushMatrix ( ) ;23 g lLoadIdent i ty ( ) ;24 glOrtho (0 , g lutGet (GLUTWINDOWWIDTH) , 0 , g lutGet (GLUTWINDOWHEIGHT) , −1, 1) ;2526 glMatrixMode (GLMODELVIEW) ;27 }2829 void endWinCoords (void )30 {31 glMatrixMode (GL PROJECTION) ;32 glPopMatrix ( ) ;3334 glMatrixMode (GLMODELVIEW) ;35 glPopMatrix ( ) ;36 }373839 //Imprime t e x t o para cada parametro40 void g lP r i n t ( int x , int y , const char ∗s , void ∗ f ont )41 {42 // Espec i f i c a pos icao de impressao de p i x e l s43 g lRaste rPos2 f (x , y ) ;4445 //Tamanho da s t r i n g de nomes dos parametros46 int l en = ( int ) s t r l e n ( s ) ;47 //Imprime t e x t o48 for ( int i = 0 ; i < l en ; i++)49 glutBitmapCharacter ( font , s [ i ] ) ;50 }5152 void glPrintShadowed ( int x , int y , const char ∗s , void ∗ font , f loat ∗ c o l o r )53 {54 g lCo l o r 3 f ( 0 . 0 , 0 . 0 , 0 . 0 ) ;55 g lP r i n t (x−1, y−1, s , f ont ) ;5657 g lCo l o r3 fv ( ( GLfloat ∗) c o l o r ) ;58 g lP r i n t (x , y , s , f ont ) ;59 }606162 ParamListGL : : ParamListGL ( const char ∗name) :63 ParamList (name) ,64 m t e x t c o l o r s e l e c t e d ( 0 . 0 , 0 . 9 , 0 . 0 ) ,65 m tex t c o l o r un s e l e c t ed ( 0 . 5 , 0 . 5 , 0 . 5 ) ,66 m text co lor shadow ( 0 . 0 , 0 . 0 , 0 . 0 ) ,67 m bar co l o r oute r ( 0 . 2 5 , 0 . 2 , 0 . 0 ) ,68 m bar co l o r i nne r ( 1 . 0 , 1 . 0 , 1 . 0 )69 {70 m font = (void ∗) GLUT BITMAP 8 BY 13 ; //Tamanho das f on t e s

82

Page 83: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

7172 m font h = 15 ; // Of f s e t do t e x t o em re lacao ao fundo da jane l a7374 m bar x = 230 ; //Separacao das barras em re lacao a jane l a ( esquerda )75 m bar w = 200 ;76 m bar h = 8 ;77 m bar o f f s e t = 5 ; // Of f s e t das barras em re lacao ao topo da jane l a78 m text x = 3 ; // Of f s e t do t e x t o em re lacao a jane l a ( esquerda )79 m separat ion = 15 ; //Separacao v e r t i c a l entre barras80 m value x = 160 ; //Separacao de va l o r e s em re lacao a jane l a ( esquerda )81 m start x = 0 ;82 m start y = 0 ;83 }8485 void86 ParamListGL : : Render ( int x , int y )87 {88 beginWinCoords ( ) ;8990 m start x = x ;91 m start y = glutGet (GLUTWINDOWHEIGHT)−100;9293 for ( std : : vector<ParamBase ∗> : : c o n s t i t e r a t o r p = m params . begin ( ) ; p != m params . end ( )

; ++p)94 {95 i f ( (∗p)−>I s L i s t ( ) )96 {97 ParamListGL ∗ l i s t = (ParamListGL ∗) (∗p) ;98 l i s t −>Render (x+10, y ) ;99 y += m separat ion ∗ l i s t −>GetSize ( ) ;

100101 }102 else103 {104 i f (p == m current )105 g lCo l o r3 fv (&m t ex t c o l o r s e l e c t e d . r ) ;106 else107 g lCo l o r3 fv (&m tex t c o l o r un s e l e c t ed . r ) ;108109 g lP r i n t ( x + m text x , y + m font h , (∗p)−>GetName ( ) . c s t r ( ) , m font ) ;110 g lP r i n t ( x + m value x , y + m font h , (∗p)−>GetValueStr ing ( ) . c s t r ( ) ,

m font ) ;111112 g lCo l o r3 fv ( ( GLfloat ∗) &m bar co l o r oute r . r ) ;113 //Desenha ca ixas de enchimento114 g lBeg in (GL LINE LOOP) ;115 g lVer t ex2 f ( x + m bar x , y + m bar o f f s e t ) ;116 g lVer t ex2 f ( x + m bar x + m bar w , y + m bar o f f s e t ) ;117 g lVer t ex2 f ( x + m bar x + m bar w , y + m bar o f f s e t + m bar h ) ;118 g lVer t ex2 f ( x + m bar x , y + m bar o f f s e t + m bar h ) ;119 glEnd ( ) ;120121 g lCo l o r3 fv ( ( GLfloat ∗) &m bar co l o r i nne r . r ) ;122 g lRec t f ( x + m bar x , y + m bar o f f s e t + m bar h , x + m bar x + ( (m bar w

−1)∗(∗p)−>GetPercentage ( ) ) , y + m bar o f f s e t + 1) ;123124 y += m separat ion ;125 }126127 }128129 endWinCoords ( ) ;130 }131132133 //Reaccao ao c l i c k do mouse134 bool135 ParamListGL : : Mouse ( int x , int y , int button , int s t a t e )136 {137 //Se o c l i c k e s t i v e r dentro da barra na v e r t i c a l138 i f ( ( y < m start y ) | | ( y > ( int ) ( m start y + ( m separat ion ∗ m params . s i z e ( ) ) − 1) ) )139 return fa lse ;140

83

Page 84: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

141 int i = (y − m start y ) / m separat ion ;142143 i f ( ( button==GLUT LEFT BUTTON) && ( s t a t e==GLUTDOWN) ) {144 #i f de f ined ( GNUC ) && ( GNUC < 3)145 m current = &m params [ i ] ;146 #else147 // MJH: workaround s ince the ver s ion o f vec to r : : a t used here i s non−standard148 for ( m current = m params . begin ( ) ; m current != m params . end ( ) && i > 0 ; m current

++, i−−) ;149 //m current = ( s td : : vector<ParamBase ∗>:: c o n s t i t e r a t o r )&m params . at ( i ) ;150 #endif151152 //Se o c l i c k e s t i v e r dentro da barra na ho r i z on t a l153 i f ( ( x > m bar x ) && (x < m bar x + m bar w ) ) {154 Motion (x , y ) ;155 }156 }157 return true ;158 }159160 //Reaccao ao moviemtno ( do mouse ) , para incremento/decremento161 bool162 ParamListGL : : Motion ( int x , int y )163 {164 i f ( ( y < m start y ) | | ( y > m start y + ( m separat ion ∗ ( int )m params . s i z e ( ) ) − 1) )165 return fa lse ;166167 i f ( x < m bar x )168 {169 (∗m current )−>SetPercentage ( 0 . 0 ) ;170 return true ;171 }172173 i f ( x > m bar x + m bar w )174 {175 (∗m current )−>SetPercentage ( 1 . 0 ) ;176 return true ;177 }178179 (∗m current )−>SetPercentage ( ( x−m bar x ) / ( f loat ) m bar w ) ;180 return true ;181 }182183184 //Reaccao a t e c l a s e s p e c i a i s ( do t e c l ado )185 void186 ParamListGL : : Sp e c i a l ( int key , int /∗x∗/ , int /∗y∗/ )187 {188 switch ( key )189 {190 case GLUTKEYDOWN: //Esco lher parametro acima191 Increment ( ) ;192 break ;193 case GLUT KEY UP: //Esco lher parametro abaixo194 Decrement ( ) ;195 break ;196 case GLUT KEY RIGHT: // Incrementar parametro e s co l h i do197 GetCurrent ( )−>Increment ( ) ;198 break ;199 case GLUT KEY LEFT: //Decrementar parametro e s co l h i do200 GetCurrent ( )−>Decrement ( ) ;201 break ;202 case GLUTKEYHOME: //Resetar va l o r e s i n i c i a i s203 GetCurrent ( )−>Reset ( ) ;204 break ;205 case GLUT KEY END: // Inrementar parametro currente ao maximo206 GetCurrent ( )−>SetPercentage ( 1 . 0 ) ;207 break ;208 }209 g lutPostRed i sp lay ( ) ;210 }

84

Page 85: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

T Codigo Particle2.h

1 #ifndef PARTICLE H2 #define PARTICLE H34 template<class T>5 class Pa r t i c l e6 {7 public :8 //Defau l t cons t ruc tor para i n i c i a l i z a c a o dos9 //parametros que se qu i s e r

10 Pa r t i c l e ( const T m = 1.0 , const T c = 1 . 0 , const T s = 1 .0 ,\11 const T∗ const pos = NULL, const T∗ const ve l = NULL,\12 const T∗ const a c e l = NULL ) ;13 //Destructor14 ˜ Pa r t i c l e ( ) ;1516 /∗∗Set op t ions ∗∗/17 // Cara c t e r i s t i c a s da pa r t i c u l a18 virtual void setMass ( const T m ) ;19 virtual void setCharge ( const T c ) ;20 virtual void s e t S i z e ( const T s ) ;21 virtual void s e tCo lo r ( const f loat [ 3 ] ) ;22 virtual void s e tCo lo r ( const float , const float , const f loat ) ;2324 //Dados dinamicos da pa r t i c u l a25 virtual void s e tPo s i t i o n ( const T, const T, const T ) ;26 virtual void s e tPo s i t i o n ( const T∗ const pos ) ;2728 virtual void s e tVe l o c i t y ( const T, const T, const T ) ;29 virtual void s e tVe l o c i t y ( const T∗ const ve l ) ;3031 virtual void s e tForce ( const T, const T, const T ) ;32 virtual void s e tForce ( const T∗ const f o r c e ) ;3334 /∗∗Get op t ions ∗∗/35 // Cara c t e r i s t i c a s da pa r t i c u l a36 virtual const T getMass ( ) const ;37 virtual const T getCharge ( ) const ;38 virtual const T ge tS i z e ( ) const ;39 virtual const f loat ∗ getColor ( ) const ;4041 //Dados dinamicos da pa r t i c u l a42 virtual T∗ const ge tPo s i t i on ( ) const ;43 virtual T∗ const ge tVe l o c i t y ( ) const ;44 virtual T∗ const getForce ( ) const ;45 protected :46 //Posicao da pa r t i c u l a47 T po s i t i o n [ 3 ] ;4849 //Velocidade da pa r t i c u l a50 T v e l o c i t y [ 3 ] ;5152 //Aceleracao exerc ida sobre a pa r t i c u l a53 T f o r c e [ 3 ] ;5455 //Propriedades da pa r t i c u l a56 T mass ;57 T charge ;58 T s i z e ;5960 f loat rgbColor [ 3 ] ; // ( R, G B )61 } ;6263 // Fiche i ro de implementacao do template64 #include ”Par t i c l e Imp l . h”6566 #endif

85

Page 86: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

U Codigo ParticleImpl2.h

1 #ifndef PARTICLEIMPL H2 #define PARTICLEIMPL H34 template<class T>5 Par t i c l e<T> : : P a r t i c l e ( const T m , const T c , const T s ,\6 const T∗ const pos ,\7 const T∗ const vel ,\8 const T∗const a c e l )9 : mass ( m ) ,

10 charge ( c ) ,11 s i z e ( s )12 {13 s e tPo s i t i o n ( pos ) ;14 s e tVe l o c i t y ( ve l ) ;15 se tForce ( a c e l ) ;16 s e tCo lo r ( 1 . 0 , 0 . 0 , 0 . 0 ) ;17 }1819 template<class T>20 Pa r t i c l e<T> : :˜ P a r t i c l e ( )21 {22 delete [ ] p o s i t i o n ;23 delete [ ] v e l o c i t y ;24 delete [ ] f o r c e ;25 }2627 template<class T>28 void Par t i c l e<T> : : setMass ( const T m )29 {30 mass = m;31 }3233 template<class T>34 void Par t i c l e<T> : : setCharge ( const T c )35 {36 charge = c ;37 }3839 template<class T>40 void Par t i c l e<T> : : s e t S i z e ( const T s )41 {42 s i z e = s ;43 }4445 template<class T>46 void Par t i c l e<T> : : s e tCo lo r ( const f loat c o l o r [ 3 ] )47 {48 rgbColor [ 0 ]= co l o r [ 0 ] ;49 rgbColor [ 1 ]= co l o r [ 1 ] ;50 rgbColor [ 2 ]= co l o r [ 2 ] ;51 }525354 template<class T>55 void Par t i c l e<T> : : s e tCo lo r ( const f loat r , const f loat g , const f loat b )56 {57 rgbColor [ 0 ] = r ;58 rgbColor [ 1 ] = g ;59 rgbColor [ 2 ] = b ;60 }6162 template<class T>63 void Par t i c l e<T> : : s e tPo s i t i o n ( const T px , const T py , const T pz )64 {65 po s i t i o n [ 0 ]=px ;66 po s i t i o n [ 1 ]=py ;67 po s i t i o n [ 2 ]=pz ;68 }6970 template<class T>

86

Page 87: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

71 void Par t i c l e<T> : : s e tPo s i t i o n ( const T∗ const pos )72 {73 i f ( pos != NULL )74 {75 po s i t i o n [ 0 ]=pos [ 0 ] ;76 po s i t i o n [ 1 ]=pos [ 1 ] ;77 po s i t i o n [ 2 ]=pos [ 2 ] ;78 }79 else80 po s i t i o n [0 ]= po s i t i o n [1 ]= po s i t i o n [ 2 ]=0 . 0 ;81 }8283 template<class T>84 void Par t i c l e<T> : : s e tVe l o c i t y ( const T vx , const T vy , const T vz )85 {86 v e l o c i t y [ 0 ] = vx ;87 v e l o c i t y [ 1 ] = vy ;88 v e l o c i t y [ 2 ] = vz ;89 }9091 template<class T>92 void Par t i c l e<T> : : s e tVe l o c i t y ( const T∗ const ve l )93 {94 i f ( v e l != NULL )95 {96 v e l o c i t y [ 0 ]= ve l [ 0 ] ;97 v e l o c i t y [ 1 ]= ve l [ 1 ] ;98 v e l o c i t y [ 2 ]= ve l [ 2 ] ;99 }

100 else101 v e l o c i t y [0 ]= v e l o c i t y [1 ]= v e l o c i t y [ 2 ]=0 . 0 ;102 }103104 template<class T>105 void Par t i c l e<T> : : s e tForce ( const T fx , const T fy , const T f z )106 {107 f o r c e [ 0 ]= fx ;108 f o r c e [ 1 ]= fy ;109 f o r c e [ 2 ]= f z ;110 }111112 template<class T>113 void Par t i c l e<T> : : s e tForce ( const T∗ const f o r c c e )114 {115 i f ( f o r c c e != NULL )116 {117 f o r c e [ 0 ]= f o r c c e [ 0 ] ;118 f o r c e [ 1 ]= f o r c c e [ 1 ] ;119 f o r c e [ 2 ]= f o r c c e [ 2 ] ;120 }121 else122 f o r c e [0 ]= f o r c e [1 ]= f o r c e [ 2 ]=0 . 0 ;123 }124125126 template<class T>127 const T Par t i c l e<T> : : getMass ( ) const128 {129 return mass ;130 }131132 template<class T>133 const T Par t i c l e<T> : : getCharge ( ) const134 {135 return charge ;136 }137138 template<class T>139 const T Par t i c l e<T> : : g e tS i z e ( ) const140 {141 return s i z e ;142 }143

87

Page 88: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

144 template<class T>145 const f loat ∗ Par t i c l e<T> : : getColor ( ) const146 {147 return rgbColor ;148 }149150 template<class T>151 T∗ const Par t i c l e<T> : : g e tPo s i t i on ( ) const152 {153 return (T∗ const ) p o s i t i o n ;154 }155156 template<class T>157 T∗ const Par t i c l e<T> : : g e tVe l o c i t y ( ) const158 {159 return (T∗ const ) v e l o c i t y ;160 }161162 template<class T>163 T∗ const Par t i c l e<T> : : getForce ( ) const164 {165 return (T∗ const ) f o r c e ;166 }167168 #endif

88

Page 89: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

V Codigo NParticleSystem2.h

1 #ifndef NBODYSYSTEMH2 #define NBODYSYSTEMH34 #include <vector>5 using std : : vec to r ;67 #include ”Pa r t i c l e s . h”89

10 //Configuracoes d e f a u l t do s is tema11 enum NBodyConfig12 {13 NBODYCONFIGRANDOM,14 NBODY CONFIG SHELL,15 NBODY CONFIG EXPAND,16 NBODY CONFIG STATIONARY,17 NBODY NUMCONFIGS18 } ;192021 //Classe de ges tao do sis tema de N corpos22 template <class T>23 class NPartic leSystem24 {25 public :2627 //Defau l t cons t ruc tor28 NPartic leSystem ( vector< Par t i c l e<T>∗ >&, const T s o f t = 0 .325 , const T damp = 0.125 )

;29 //Destructor30 ˜NPartic leSystem ( ) ;3132 //Actua l i za es tado dinamico do sis tema33 virtual void update ( const T timeStep ) ;3435 //Coloca p a r t i c u l a s num estado a l e a t o r i o de acordo com uma36 //dada condicao r e qu i s i t a da ( expansao , s h e l l , a l e a t o r i a )37 void randomizeBodies ( const NBodyConfig , const f loat cSca le , const f loat vSca le ) ;3839 /∗∗Set op t ions ∗∗/40 //Al tera parametros de correcao do campo e de amortecimento41 virtual void s e t So f t en i ng ( const T s o f t ) ;42 virtual void setDamping ( const T damp ) ;4344 //Al tera p a r t i c u l a s que o sis tema gere45 virtual void s e t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& ) ;4647 /∗∗Get op t ions ∗∗/48 //Retorna ponte i ro para p a r t i c u l a s do s is tema49 //ma p o t i l i c a de minimo acesso , mas e f i c i e n t e50 virtual const vector< Par t i c l e<T>∗ >& ge tPa r t i c l e s ( ) const ;5152 //Retorna o numero de corpos do sis tema53 virtual const unsigned long getNumberOfBodies ( ) const ;5455 protected : //metodos56 NPartic leSystem ( ) {} // d e f a u l t cons t ruc tor5758 //Calcu la e modi f ica es tado dinamico do sis tema59 void integrateNbodySystem ( const T deltaTime ) ;60 //Calcu la f o r ca s a actuar sobre cada pa r t i c u l a do s is tema61 void computeNBodyForces ( ) ;6263 void bodyBodyInteract ion ( const int i , const int j , const T softFactorCubed ) ;64 protected : // dados65 //Factores de correcao e amortecimento66 T dampFactor ;67 T so f tFac t o r ;6869 //Vectores posicao , v e l o c i dade e forca para melhoria

89

Page 90: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 //de performance −> r eduz i r chamadas a funcoes ge t71 T∗∗ pos ;72 T∗∗ ve l ;73 T∗∗ f o r c e s ;7475 bool b I n i t i a l i z e d ;7677 //Vector de p a r t i c u l a s do sis tema78 vector< Par t i c l e<T>∗ > p a r t i c l e s ;7980 //Numero de corpos81 unsigned int numberOfBodies ;82 } ;8384 // Fiche i ro de implementacao85 #include ”NPartic leSystemImpl . h”8687 #endif

90

Page 91: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

W Codigo NParticleSystemImpl2.h

1 #ifndef NPARTICLESYSTEMIMPL H2 #define NPARTICLESYSTEMIMPL H345 #include <cmath>6 #include <ctime>7 #include <c s t d l i b>8 using std : : srand ;9 using std : : time ;

10 using std : : rand ;11 #ifndef WIN3212 #include <omp . h>13 #endif14 /∗∗Funcoes de u t i l i d a d e para operar sobre vec t o r e s ∗∗/1516 //Normalizar vec to r segundo norma euc l i d i ana17 template <typename T>18 void19 E2normalize ( T∗ const vector , const int dim )20 {21 f loat normSqr = 0 ;2223 //Cic lo de ca l c u l o do quadrado da norma euc l i d i ana24 for ( int i = dim ; i ; )25 {26 i−−;27 normSqr += vecto r [ i ]∗ vec to r [ i ] ;28 }2930 const f loat norm = sqr t ( normSqr ) ;31 //Testa a nao nu l idade da norma32 i f ( normSqr > 1e−6 )33 for ( int i = dim ; i ; )34 {35 i−−;36 vec to r [ i ]/=norm ;37 }38 }394041 //Produto externo de do i s v e c t o r e s num espaco a 3 dimensoes42 template<typename T>43 T∗44 c r o s s ( const T∗ const v0 , const T∗ const v1 )45 {46 T ∗ r t = new T[ 3 ] ;4748 r t [ 0 ] = v0 [ 1 ]∗ v1 [ 2 ]−v0 [ 2 ]∗ v1 [ 1 ] ;49 r t [ 1 ] = v0 [ 2 ]∗ v1 [ 0 ]−v0 [ 0 ]∗ v1 [ 2 ] ;50 r t [ 2 ] = v0 [ 0 ]∗ v1 [ 1 ]−v0 [ 1 ]∗ v1 [ 0 ] ;5152 return r t ;53 }5455565758 /∗∗∗IMPLEMENTACAO DA CLASSE∗∗∗/596061 //Defau l t cons t ruc tor da c l a s s e62 template <class T>63 NParticleSystem<T> : : NPart ic leSystem ( vector< Par t i c l e<T>∗ >& par t i cu l a s , const T so f t ,

const T damp )64 : p a r t i c l e s ( p a r t i c u l a s ) , // I n i c i a l i z a ponte i ro para vec tor de p a r t i c u l a s65 numberOfBodies ( p a r t i c u l a s . s i z e ( ) )66 {67 setDamping ( damp ) ; // I n i c i a l i z a f a c t o r de amortecimento68 s e tSo f t en i ng ( s o f t ) ; // I n i c i a l i z a f a c t o r de correcao do campo69

91

Page 92: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

70 pos = new T∗ [ numberOfBodies ] ;71 ve l = new T∗ [ numberOfBodies ] ;72 f o r c e s = new T∗ [ numberOfBodies ] ;7374 for ( int i = numberOfBodies ; i ; )75 {76 i−−;7778 pos [ i ] = (T∗const ) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;79 ve l [ i ] = (T∗const ) p a r t i c l e s [ i ]−>ge tVe l o c i t y ( ) ;80 f o r c e s [ i ] = (T∗const ) p a r t i c l e s [ i ]−>getForce ( ) ;81 }82 }8384 //Destructor da c l a s s e85 template <class T>86 NParticleSystem<T> : :˜ NPartic leSystem ( )87 {88 delete [ ] pos ;89 delete [ ] v e l ;90 delete [ ] f o r c e s ;91 std : : cout << ”>> NPartic leSystem de s t ru c t i on order conf irmed !\n” ;92 }939495 //Actua l i za es tado dinamico do sis tema de p a r t i c u l a s96 // t imes tep e o i n t e r v a l o de tempo da ac tua l i z a cao97 template <class T>98 void NParticleSystem<T> : : update ( const T timeStep )99 {

100 integrateNbodySystem ( timeStep ) ;101 }102103104 //Al tera parametro de suav izacao105 template <class T>106 void NParticleSystem<T> : : s e t So f t en i ng ( const T s o f t )107 {108 //Nao permit ido va l o r nulo , mas va l o r nega t i vo109 //e i n d i f e r e n t e ( so quadramos e s t e va l o r )110 i f ( s o f t != 0 )111 so f tFac to r = s o f t ;112 }113114115 //Al tera parametro de amortecimento116 template <class T>117 void NParticleSystem<T> : : setDamping ( const T damp )118 {119 //Nao permit ido va l o r nulo nem va lo r nega t i vo120 i f ( damp>0 )121 dampFactor = damp ;122 }123124 //Retorna vec tor das p a r t i c u l a s125 template <class T>126 const vector< Par t i c l e<T>∗ >& NParticleSystem<T> : : g e tP a r t i c l e s ( ) const127 {128 return ( const vector< Par t i c l e<T>∗ >&)p a r t i c l e s ;129 }130131 template <class T>132 void NParticleSystem<T> : : s e t P a r t i c l e s ( vector< Par t i c l e<T>∗ >& part )133 {134 p a r t i c l e s = part ;135 i f ( p a r t i c l e s . s i z e ( ) !=numberOfBodies )136 {137 numberOfBodies = p a r t i c l e s . s i z e ( ) ;138139 pos = new T∗ [ numberOfBodies ] ;140 ve l = new T∗ [ numberOfBodies ] ;141 f o r c e s = new T∗ [ numberOfBodies ] ;142 }

92

Page 93: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

143144 for ( int i = numberOfBodies ; i ; )145 {146 i−−;147 pos [ i ] = (T∗const ) p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) ;148 ve l [ i ] = (T∗const ) p a r t i c l e s [ i ]−>ge tVe l o c i t y ( ) ;149 f o r c e s [ i ] = (T∗const ) p a r t i c l e s [ i ]−>getForce ( ) ;150 }151 }152153 //Retorna o numero de corpos do sis tema154 template <class T>155 const unsigned long NParticleSystem<T> : : getNumberOfBodies ( ) const156 {157 return numberOfBodies ;158 }159160161 //Calcu la e modi f ica es tado dinamico do sis tema162 template <class T>163 void NParticleSystem<T> : : integrateNbodySystem ( const T timeStep )164 {165 const T timeFactor = timeStep ∗dampFactor ;166167 //Calcu la e r e g i s t a f o r ca s in t e rnas a actuar em cada corpo168 computeNBodyForces ( ) ;169170 //Para cada pa r t i c u l a do sistema , a c t u a l i z a a sua pos icao171 #ifndef WIN32172 #pragma omp p a r a l l e l for173 #endif174 for ( unsigned int i = 0 ; i<numberOfBodies;++ i )175 {176 // Inverso da massa , apenas para nao ca l c u l a r var i a s vezes177 const T invMassFactor = timeFactor /( p a r t i c l e s [ i ]−>getMass ( ) ) ;178179 //Novas v e l o c i dade s180 ve l [ i ] [ 0 ]+= f o r c e s [ i ] [ 0 ]∗ invMassFactor ;181 ve l [ i ] [ 1 ]+= f o r c e s [ i ] [ 1 ]∗ invMassFactor ;182 ve l [ i ] [ 2 ]+= f o r c e s [ i ] [ 2 ]∗ invMassFactor ;183184 //Nova pos icao = ant i ga pos icao + ve l oc i dade ∗deltaTime185 pos [ i ] [ 0 ] += ve l [ i ] [ 0 ]∗ t imeStep ;186 pos [ i ] [ 1 ] += ve l [ i ] [ 1 ]∗ t imeStep ;187 pos [ i ] [ 2 ] += ve l [ i ] [ 2 ]∗ t imeStep ;188 }189 }190191192 //Calcu la f o r ca s a actuar sobre cada pa r t i c u l a193 template <class T>194 void NParticleSystem<T> : : computeNBodyForces ( )195 {196 //Quadrado do f a c t o r de correccao so para nao ca l c u l a r duas vezes197 const T sof tFactorSquared = so f tFac to r ∗ s o f tFac to r ;198199 //Para cada pa r t i c u l a c a l c u l a f o r ca s a actuar sobre e l a200 #ifndef WIN32201 #pragma omp p a r a l l e l for202 #endif203 for ( unsigned int i =0 ; i<numberOfBodies;++ i )204 {205 f o r c e s [ i ] [ 0 ] = f o r c e s [ i ] [ 1 ] = f o r c e s [ i ] [ 2 ] = 0 ;206 #ifndef WIN32207 #pragma omp p a r a l l e l for208 #endif209 for ( unsigned int j = 0 ; j<numberOfBodies ; ++j )210 bodyBodyInteract ion ( i , j , so f tFactorSquared ) ;211 }212 }213214215 //Calcu la in t e raccoe s g r a v i t i c a s

93

Page 94: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

216 template <class T>217 void NParticleSystem<T> : : bodyBodyInteract ion ( const int i , const int j ,\218 const T sof tFactorSquared )219 {220 //Constante de atraccao g r a v i t i c a221 stat ic const T G = 1 ;222 //Constante de Coulomb223 stat ic const T k = 1 ;224225 /∗∗Parte r e l a t i v a a in t e racoe s que variam com o quadrado da d i s t anc i a ∗∗/226227 //Posicao r e l a t i v a em re lacao ao body0228 const T r [ 3 ] = { pos [ j ] [ 0 ] − pos [ i ] [ 0 ] , \229 pos [ j ] [ 1 ] − pos [ i ] [ 1 ] , \230 pos [ j ] [ 2 ] − pos [ i ] [ 2 ] } ;231232 //Quadrado da d i s t anc i a com fa c t o r de r e c t i f i c a c a o do campo233 const T d i s t = sq r t ( r [ 0 ] ∗ r [ 0 ] + r [ 1 ] ∗ r [ 1 ] + r [ 2 ] ∗ r [ 2 ] + so f tFactorSquared ) ;234235 //Calcu lo do quoc ien te H = 1.0/( rˆ3 + s o f t ˆ3 )236 const T invDis t = 1 .0/ d i s t ;237 const T invDistCube = invDis t ∗ i nvDi s t ∗ i nvDi s t ;238239 //Calcu la (m 0 , q 0 ) ∗(m ext , q e x t )∗G/( rˆ3 + s o f t ˆ3 )240 const T sG = ( p a r t i c l e s [ j ]−>getMass ( ) ) ∗( p a r t i c l e s [ i ]−>getMass ( ) ) ∗G;241 const T sE = ( p a r t i c l e s [ j ]−>getCharge ( ) ) ∗( p a r t i c l e s [ i ]−>getCharge ( ) ) ∗k ;242 const T s = (sG − sE ) ∗ invDistCube ;243244 const T de l taForce [ 3 ] = { r [ 0 ] ∗ s , r [ 1 ] ∗ s , r [ 2 ] ∗ s } ;245246 /∗∗Calcu la forca e aumenta a da pa r t i c u l a ∗∗/247 f o r c e s [ i ] [ 0 ] += de l taForce [ 0 ] ;248 f o r c e s [ i ] [ 1 ] += de l taForce [ 1 ] ;249 f o r c e s [ i ] [ 2 ] += de l taForce [ 2 ] ;250 }251252253 /∗∗ u t i l i t y func t i on ∗∗/254 template <typename T>255 void NParticleSystem<T> : : randomizeBodies ( const NBodyConfig con f i g ,\256 const f loat c l u s t e r S c a l e ,\257 const f loat v e l o c i t y S c a l e )258 {259 // I n i c i a l i z a origem da sequencia de pseudo−a l e a t o r i o s260 std : : srand ( std : : time ( NULL ) ) ;261 const f loat auxRandMax = RANDMAX∗ 0 . 5 ;262 const f loat s c a l e =263 c l u s t e r S c a l e ∗ std : : max<f loat>( 5 . 0 f , ( f loat ) p a r t i c l e s . s i z e ( ) / (1024 .0 f ) ) ;264265 switch ( c on f i g )266 {267 case NBODY CONFIG SHELL:268 {269 const f loat v s c a l e = c l u s t e r S c a l e ∗ v e l o c i t y S c a l e ;270 const f loat i nne r = 0 .5 f ∗ c l u s t e r S c a l e ;271 const f loat outer = 4 .0 f ∗ c l u s t e r S c a l e ;272273 //Rotacao em torno do e ixo dos zz274 T ax i s [ 3 ] = { 0 .0 f , 1 . 0 f , 0 . 0 f } ;275 E2normalize ( ax is , 3 ) ;276277 //Para cada pa r t i c u l a278 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )279 {280 i−−;281282 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a283 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;284 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;285 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;286287 T point [ 3 ] = {x , y , z } ;288 E2normalize ( point , 3 ) ;

94

Page 95: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

289290 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( (T) po int [ 0 ] ∗ ( inne r + ( outer − i nne r ) ∗ rand ( ) /(

(T) RANDMAX ) ) ,\291 (T) po int [ 1 ] ∗ ( inne r + ( outer − i nne r ) ∗ rand ( ) /(

(T) RANDMAX ) ) ,\292 (T) po int [ 2 ] ∗ ( inne r + ( outer − i nne r ) ∗ rand ( ) /(

(T) RANDMAX ) ) ) ;293294 //Veloc idades das p a r t i c u l a s perpend i cu l a re s295 //ao e ixo e a pos icao da pa r t i c u l a296 const T ∗ ve l = ( const T∗) c r o s s ( p a r t i c l e s [ i ]−>ge tPo s i t i on ( ) , ax i s ) ;297 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( (T) ve l [ 0 ]∗ dampFactor∗ vsca l e ,\298 (T) ve l [ 1 ]∗ dampFactor∗ vsca l e ,\299 (T) ve l [ 2 ]∗ dampFactor∗ v s c a l e ) ;300 }301302 }303 break ;304 case NBODY CONFIG EXPAND:305 {306 f loat v s c a l e = s c a l e ∗ v e l o c i t y S c a l e ;307308 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )309 {310 i−−;311 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a312 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;313 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;314 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;315 T point [ 3 ] = {x , y , z } ;316317 //Posicoes das p a r t i c u l a s318 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( (T) po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\319 (T) po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\320 (T) po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;321322 //Veloc idades das p a r t i c u l a s323 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( (T) po int [ 0 ]∗ vsca l e ,\324 (T) po int [ 1 ]∗ vsca l e ,\325 (T) po int [ 2 ]∗ v s c a l e ) ;326 }327 }328 break ;329 case NBODYCONFIGRANDOM:330 {331 f loat v s c a l e = v e l o c i t y S c a l e ∗ s c a l e ;332333 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )334 {335 i−−;336 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a337 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;338 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;339 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;340 T point [ 3 ] = {x , y , z } ;341342 //Posicao da pa r t i c u l a343 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\344 po int [ 1 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ,\345 po int [ 2 ]∗ s c a l e ∗ rand ( ) /( RANDMAX ) ) ;346347 //Velocidade da pa r t i c u l a348 T vx = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;349 T vy = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;350 T vz = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;351 const T ve l [ 3 ] = {vx , vy , vz } ;352353 //Veloc idades das p a r t i c u l a s354 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( ve l [ 0 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\355 ve l [ 1 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ,\356 ve l [ 2 ]∗ v s c a l e ∗ rand ( ) /( RANDMAX ) ) ;357 }358 }

95

Page 96: S rie 7, Simula o de Part culas Cl ssicasUsamos uma abordagem lenta, mas que e o kernel de varios m etodos num ericos para simula˘cao de part culas, a saber, a aborgadem ’all-pairs’

359 break ;360 case NBODY CONFIG STATIONARY:361 default :362 {363 for ( int i = p a r t i c l e s . s i z e ( ) ; i ; )364 {365 i−−;366 //Direccao ao longo da qua l vamos co locar a pa r t i c u l a367 T x = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;368 T y = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;369 T z = ( auxRandMax − rand ( ) ) /( auxRandMax − 1 ) ;370 T point [ 3 ] = {x , y , z } ;371372 //Posicao da pa r t i c u l a373 p a r t i c l e s [ i ]−> s e tPo s i t i o n ( po int [ 0 ]∗ s ca l e ,\374 po int [ 1 ]∗ s ca l e ,\375 po int [ 2 ]∗ s c a l e ) ;376377 //Veloc idades das p a r t i c u l a s378 p a r t i c l e s [ i ]−> s e tVe l o c i t y ( 0 , 0 , 0 ) ;379 }380 }381 break ;382383 }384 }385386387 #endif

96