Thursday, September 07, 2006

Visualização de campo escalar com o GNUPLOT



Algumas vezes é necessário visualizar um campo escalar... E o Slackware traz o gnuplot, que pode ser usado para esta tarefa. Primeiro, gere um arquivo texto com extensão .dat com os dados. Os dados deve ser gravados como exemplificado no programa abaixo (em fortran).




        program teste_campo
real campo,pi
integer i,j

pi=acos(-1.0)
open(1,file='teste.dat')
rewind(1)
do i=1,100
do j=1,100
campo=
20.0*sin(2.0*pi*i/10.0)+(2.0*pi*j/10.0)
write(1,*) i,j,campo
enddo
write(1,*) !uma linha em branco após gravar cada coluna
enddo
close(1)
end program



Depois, chame o gnuplot com o seguinte comando no terminal:

gnuplot

Um terminal do gnuplot será exibido. Nele, digite os comandos:

set pm3d map
splot “teste.dat”

Você deve ver a figura mostrada acima!

Se você quer gravar a figura em um arquivo gif, use os comandos:

set term gif
set out 'teste.gif'
set pm3d map

splot “teste.dat”

É isso aí...
Abaços!

Wednesday, September 06, 2006

Programação para dual core (ou multi core) com a LAM MPI

Com a disponibilidade de processadores com múltiplos núcleos
de processamento (multicore), os desenvolvedores de software
precisam saber utilizar ferramentas de desenvolvimento (ou mesmo
desenvolvê-las) para o aproveitamento desse recurso. Uma
possibilidade é utilizar a MPI (message passing interface)
como biblioteca de comunicação. Este artigo traz um
exemplo simples em FORTRAN 77, que calcula o fatorial de 10
utilizando dois processadores. É importante notar que se você
tiver vários computadores em rede (linux, unix...), a MPI pode
ser empregada para usá-los!

O primeiro passo é instalar a LAM-MPI.

Você pode baixar o pacote para o Slackware 10.x aqui.
A instalação é direta, com o comando installpkg
lam-7.0.2-i686-1.tgz
(como
root)
.


Depois, salve o código abaixo num novo arquivo texto chamado mpitest.f


ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc


c  Programa com o minimo necessario 
c na inplementacao de passagem de informacao
c com a MPI
c
c Rodrigo M.S. de Oliveira


program mpitest

include 'mpif.h'
integer myrank, ierr, nnodes, status(MPI_STATUS_SIZE), buffpos
real x,y

call MPI_INIT (ierr)
call MPI_COMM_SIZE (MPI_COMM_WORLD, nnodes, ierr)
call MPI_COMM_RANK (MPI_COMM_WORLD, myrank, ierr)



if(myrank.eq.0)then

x=1.0
do i=1,5
x=x*(i)
enddo

call MPI_SEND(x,1,MPI_REAL,1,99,MPI_COMM_WORLD,ierr)

else
if(myrank.eq.1)then

y=1.0
do i=6,10
y=y*(i)
enddo


call MPI_RECV(x,1,MPI_REAL,0,99,MPI_COMM_WORLD,status,ierr)

write(*,*) '10!=',x*y

endif
endif

call MPI_FINALIZE (ierr)
stop

end program
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

Neste código, as funções em azul claro são da biblioteca MPI e devem ser chamadas com
a instrução call. As três primeiras, MPI_INIT, MPI_COMM_SIZE e MPI_COMM_RANK sempre
devem estar no programa após as declarações das variaveis. Aliás, declará-las explicitamente
(sem usar o comando implicit) é uma boa idéia. A variável myrank é utilizada para se
determinar em que processador se está trabalhando (0, 1, 2 ...).
MPI_SEND e MPI_RECV são, como os nomes sugerem, utilizadas para a troca de mensagens.
A sintaxe dessas funções é a seguinte: MPI_SEND (a1,1,a2,a3,a4,MPI_COMM_WORLD,ierr),
na qual a1 é o valor a ser enviado, a2 é o tipo da variavel a1, a3 é o processador de destino e
a4 é o código único que identifica a troca de mensagens (a ser controlado pelo programador),
MPI_RECV
(a5,1,a2,a6,a4,MPI_COMM_WORLD,status,ierr)
, onde a5 é a variavel de destino,
a6 é o processador de onde vem a informação.

O próximo passo é compilar o código. O segunte comando pode ser usado:
hf77 mpitest.f -o mpitest -O

A topologia da máquina paralela deve ser especificada, pois, como dito anteriormente, a MPI
pode operar com outros micros da rede que tenham MPI (dadas as devidas permissões).
Então, um arquivo texto deve ser criado com a lista de máquinas que vão ser usadas para rodar
o programa. Como vamos aqui usar os dois núcleos do processador local, um arquivo texto topologia
deve conter o seguinte:

localhost
localhost

São duas vezes mesmo. Se fossem 4 núcleos, localhost apareceria 4 vezes.

Salvo o arquivo, basta dar o comando

lamboot -v topologia
para montar a topologia.

Agora basta rodar o programa com o comando
mpirun -np 2 mpitest
com o argumento de np sendo o número de processadores empregados.

Para desmontar a topologia. basta dar o comando
wipe -v topologia

Obs: o kernel do sistema deve ser recompilado para suportar múltiplas CPUs (SMP),
de forma que, assim, realmente serão usados os dois núcleos.

É isso aí... em breve a versão em C será publicada.
Abraços!

Sunday, September 03, 2006

Implementação e uso de Funções em C

Algumas pessoas me perguntam, algumas vezes, como implementar e usar funções e C. Fica aqui registrado um bom exemplo para iniciantes!

void imprime_array(float *x, int imax){
int i;
for (i=0;i<imax;i++){
printf("x[%d]=%f\n",i,x[i]);
}
}

float triplo(float x){ //primeira versao

return (3.0*x);
}

void triplo2(float x, float *x3){ //com ponteiros: varios argumentos podem ser retornados

*x3=(3.0*x);
}


main(){

int i, imax=10;

float x[imax],y;

for (i=0;i<imax;i++){

x[i] = (float)i;

}


imprime_array(x,imax);

y=triplo(2.0);

printf("%f\n",y);

triplo2(3.0,&y);
printf("%f\n",y);

}



Espero que seja útil pessoal! Abraços!