quarta-feira, 15 de junho de 2011

Já que é para falar sobre generalidades...

tinha algum tempo que eu queria postar em algum lugar uma ideia que eu tive para fazer filmes de dados gerados em tempo real por simulações usando o software Gnuplot.

Para quem não sabe o Gnuplot é uma ferramenta de graficação e análise de dados sem interface gráfica (usa linhas de comando) do Linux que é muito versátil e de altíssima qualidade.

Estou trabalhando agora com um programa que simula dinâmica browniana de cadeias poliméricas com interação, o que leva ao processo de micelização do sistema. Bom, o que importa é que seria muito bom que eu visse a imagem da posição das cadeias enquanto o programa rodasse. Procurei durante muito tempo na internet algo do tipo, mas só encontrei coisas muito complicadas que ainda assim não me atendiam. Até que tive uma sacada no Gnuplot de modo que atingi o meu objetivo de maneira bem simples.

A ideia é você, em seu código fonte principal atualizar um único arquivo com os dados em intervalos de tempo definidos. Em outro programa que será o programa você carrega um arquivo de configuração do gnuplot que fará as configurações que você desejar e carregará um outro arquivo com comandos para o Gnuplot. Nesse outro arquivo nós utilizaremos o comando "replot" e o comando "pause". O "replot" servirá para que, com as mesmas configurações, o mesmo arquivo seja graficado novamente, só que os dados foram alterados pelo programa principal (note que são programas independentes, o de atualização dos dados e o de configuração/chamada do Gnuplot)! Então chamamos um terceiro arquivo que faz a mesma coisa e chama o segundo novamente. Desse forma estamos sempre plotando na mesma configuração dados que são atualizados pelo seu programa principal. Seguem os arquivos de configuração e um exemplo do que pode ser feito utilizando-se isso.

program plotreal

implicit none

integer*4 status,system



call confggnu()

end

subroutine confggnu()

character*30::confg1,confg2,confg3
character*5::aux
real*8 cc

open(1,file="micelas.init",status="old")
read(1,*)aux,cc

write(confg1,'(I5)')int(-cc/2.0d0)
write(confg2,'(I5)')int(cc/2.0d0)
write(confg3,'(I5)')int(cc/5.0d0)

open(500000,file='plots.gnu',status='replace')
write(500000,*) 'set terminal wxt noraise'
write(500000,*) 'set xrange ['//trim(confg1)//':'//trim(confg2)//']'
write(500000,*) 'set yrange ['//trim(confg1)//':'//trim(confg2)//']'
write(500000,'(A 200)') 'set obj 20 rect from graph 0, graph 0 to graph 1, graph 1 fs solid 0.2 fc rgb "black" behind'
! write(500000,'(A 200)') 'set obj 21 rect from graph 0, graph 0 to graph 1, graph 1 fs empty border 30'

! write(500000,*) 'set border 0'
write(500000,*) 'unset tics'
write(500000,*) 'set key off'
write(500000,'(A200)') adjustl('plot "pos" using 1:2:3 w p pt 7 ps 0.5 lc variable, "pos" using 1:2:3 w l lc variable')
write(500000,*)'pause 0.01'
write(500000,*)'load "plots2.gnu"'

close(500000)

status=system('gnuplot "plots.gnu"')

end subroutine confggnu


Esse é o programa que chamei de plotreal. Como podem ver ele monta o primeiro arquivo de configuração e logo em seguida o chama. Detalhe para a chamada do plots2.gnu dentro do plots.gnu.

set terminal wxt noraise
set xrange [ -120: 120]
set yrange [ -120: 120]
set obj 20 rect from graph 0, graph 0 to graph 1, graph 1 fs solid 0.2 fc rgb "black" behind
unset tics
set key off
plot "pos" using 1:2:3 w p pt 7 ps 0.5 lc variable, "pos" using 1:2:3 w l lc variable
pause 0.01
load "plots2.gnu"


Saída do plots.gnu.

Agora só resta os outros dois arquivos de configuração.

plots2.gnu :

replot
pause 0.1
load "plots3.gnu"


plots3.gnu:

replot
pause 0.1
load "plots2.gnu"


Os "pauses" são somente para o gnuplot não tentar graficar o mesmo arquivo várias vezes utilizando toda a velocidade que seu computador permitir. Abaixo segue um video com uma função seno f(x) = sin(a*x) com o termo "a" aumentando com o tempo.



Abraços a todos e bom proveito!

Nenhum comentário:

Postar um comentário