7a série

Propaganda
Série 7 de TFCOM – Simulação de partı́culas clássicas, MEFT, 2009/10
Objectivos
Pretende-se simular partı́culas, em particular para fazer o filme do movimento dinâmico de um conjunto de
partı́culas clássicas. Este é o último trabalho de TFCOM, sendo o pretexto para que os alunos apliquem
toda a matéria de C++ estudada.
A simulação de partı́culas tem imensas aplicações, seja para estudar directamente as próprias partı́culas em
gases ou plasmas ou até mesmo para simular o movimento de clusters de galáxias no universo, seja para
simular fluidos ou plasmas ou sólidos deformáveis evitando resolver EDP para volumes e superfı́cies. Em
termos de meios contı́nuos permite usarmos técnicas sem rede ou “meshfree”,
http://en.wikipedia.org/wiki/Meshfree methods sendo que para fluidos há duas técnicas para usar partı́culas,
a SPH http://en.wikipedia.org/wiki/Smoothed particle hydrodynamics
e a PIC http://en.wikipedia.org/wiki/Particle-in-cell.
A primeira alı́nea questiona alguns aspectos básicos de templates e da linguagem Python, mas a sua utilização ao longo da série é opcional, sendo necessário apenas optar por dar um exemplo de templates ou da
utilização de Python.
Considerações iniciais
Note que deve incluir no relatório todos os códigos que for construindo, designando-os por g1s7a1.cpp
representando, respectivametente, o grupo 1, série 7 e alı́nea 1. NOTA: Sempre que é pedido para
melhorar ou corrigir um código, este deve ser gravado com um nome novo adequado à alı́nea!
Pode usar as extensões “cpp”, “cxx” ou “cc” (iremos usar “cpp” apenas por conveniência). Utilize uma
nomenclatura semelhante para os ficheiros de output criados.
Aconselha-se que o relatório (obrigatoriamente em formato pdf) seja escrito em LATEX, mas não haverá
penalização se for escrito noutro programa (MS/Open Office).
Os códigos serão avaliados de acordo com a ponderação definida na página da cadeira. Todas as alı́neas
terão a mesma ponderação (ou seja 5/20 da série).
Questões
1. (a) Explique a funcionalidade da keyword template, explicando em que tipos de situações é que é
conveniente utilizarmos templates.
(b) Explique brevemente quais as semelhanças e diferenças que encontra relevantes entre a utilização
de C++, C++ através da STL (Standard Template Library), ROOT compilado e interpretado
e Python. Se lhes fosse fornecido um código simples (funções e ciclos), com qual destas soluções
é que o código seria mais rápido? Já agora, com qual destas soluções é que lhe parece mais fácil
desenvolver código?
(c) Escolha uma das opções apresentadas. O valor desta alı́nea será incluı́do na alı́nea 1, valendo
apenas 30% desta.
i. Implemente uma função “Print” que irá mostrar no ecrã propriedas comuns a Partı́culas e
Campos, podendo usar como argumento qualquer objecto destas classes, ou suas derivadas.
Deverá usar obrigatoriamente uma classe ou tipo template.
1
ii. Implemente uma das alı́neas de toda a série (excluindo a alı́nea 1, obviamente) em Python,
em vez de C++.1 .
2. Comece por escrever uma classe geral denominada Particula2 . As partı́culas deverão ter massa,
carga, três coordenadas de posição (x, y, z), três coordenadas de velocidade (vx, vy, vz), tempo,
energia3 , e ainda propriedades para os gráficos como cor, um raio caso sejam representadas por um
disco, etc. Note que iremos trabalhar com electrões e protões, que irão constituir duas classes derivadas
diferentes, cada uma com massa, carga e cor constantes. Defina também uma classe Campo para
trabalhar com o campo de forças, sendo que o campo terá uma constante, e três componentes em
cada ponto do espaço-tempo. Teremos doze objectos dessa classe, um campo gravı́tico e um campo
electrostático por partı́cula.
(a) Teste esse código com uma “main” simples, com inputs e outputs só de teste, por exemplo para
6 partı́culas diferentes e 12 campos.
(b) Agora restringimo-nos a uma partı́cula, pois iremos implementar a sua dinâmica num campo de
forças. Defina um campo arbitrário constante, e use a lei de Newton:
F (t)
,
m
v(t + δt) = v(t) + a(t)δt,
1
r(t + δt) = r(t) + v(t)δt + a(t)(δt)2 ,
2
com diferenças finitas como na Série 3, para resolver estas equações vectoriais.
a(t) =
(1)
(2)
(3)
3. Agora considere várias partı́culas, por exemplo três electrões e três protões (com cargas ±1 opostas mas
com massas escolhidas por si, se o desejar). Calcule os dois campos de forças, gravı́tico e electrostático
(com constantes “à vontade do freguês”), criados pelas partı́culas. Resolva o problema dinâmico do
sistema de partı́culas e campos.
4. Passe para gráfico frames de sucessivos tempos t do sistema, para fazer um filme, que deverá ser
colocado no http://www.youtube.com.
Identifique-o com o nome do trabalho, por exemplo ParticleFCOM09S7T1G13. Pode mostrar o gráfico
no plano xy, mas representando as partı́culas com discos cujo raio depende de z, para visualizarmos as
três dimensões em perspectiva. Pode guardar os frames por exemplo em jpeg, bmp ou png e depois
passar para um formato de vı́deo como mpeg ou wmv, por exemplo com o Windows Movie Maker, ou
com outro software conveniente.
Nas condições iniciais, deve definir os ri e os vi , mas considere sempre o referencial do centro de massa
P
P
ri = 0 e vi = 0, senão as partı́culas “fogem” da área visı́vel do gráfico.
Dicas para a criação dos gráficos (NOTA: apenas se pretende que seja criado um filme. A nota não
irá depender do método escolhido para fazer o filme):
1
Sugestão: se não estiver muito à vontade com Python mas quiser utilizar esta opção, é aconselhável resolver primeiro a
série toda em C++ e depois passar o código para Python na alı́nea que lhe agradar.
2
Obviamente, não utilize caracteres acentuados ou proibidos dentro do seu código.
3
Sugestão: Pode utilizar uma classe que permita guardar quatro coordenadas: três coordenadas de posição e uma de
tempo, ou três de velocidade e uma quarta coordenada de energia. Existe uma implementação parecida na classe de ROOT
“TLorentzVector”, embora aqui se pretenda algo muito mais simples que funcione como “container”.
2
• Em C++, poderá utilizar bibliotecas gráficas já conhecidas por si para gravar cada uma das
frames. Pode utilizar o gnuplot ou o Allegro, se já estiver familiarizado com este último.
• Pode utilizar o root para desenhar os gráficos, utilizando para isso um gráfico ou outro tipo
de objectos (ex: TGraph2D, TEllipse, etc.). Poderá gravar o canvas com o método “SaveAs” e
poderá actualizar o canvas com o método “Update()”.
• Apenas para esta última alı́nea, também poderá realizá-la em python. Para desenhar gráficos,
poderá utilizar uma biblioteca gráfica como o Tkinter (exemplos em
http://www.pasteur.fr/recherche/unites/sis/formation/python/ch14.html)
• Para criar o filme a partir de frames separadas (cabe-lhe a si determinar quantas frames é que
são necessárias para ter uma visualização confortável, poderá usar o Windows Movie Maker ou
outras soluções (por exemplo o Mencoder, http://pymolwiki.org/index.php/Making Movies, ou
o ImageMagick)
Pode procurar já no youtube os vı́deos criados pelos seus colegas do ano passado e ver que tipo de
soluções é que foram implementadas por eles.
P. Bicudo & P. Martins, IST, 2 de Dezembro de 2009.
3
Download