introdução ao fortran 90 - 5 - wordpress institucional · 2018. 9. 17. · add = q + c...

43
ufpellogo Introdução ao Fortran 90 - 5 Alexandre Diehl Departamento de Física – UFPel Alexandre Diehl SCEF

Upload: others

Post on 20-Aug-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Introdução ao Fortran 90 - 5

Alexandre Diehl

Departamento de Física – UFPel

Alexandre Diehl SCEF

Page 2: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Programação estruturada: unidades de programa

A programação estruturada em Fortran 90 implica no uso deunidades de programa, do tipo:

Programa principalSubprogramas: Funções e SubrotinasMódulos

Cada unidade de programa contém um conjunto completo econsistente de tarefas que podem ser escritas e compiladasindividualmente.

Apenas o Programa Principal pode ser executadoindividualmente.

Alexandre Diehl SCEF

Page 3: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprogramas:Funções e Subrotinas

Em Fortran 90 existem dois tipos de subprogramas: Funções eSubrotinas

Uma Função, quando chamada, retorna um único valorcalculado dentro da unidade de programa, associado como nome da FunçãoUma Subrotina, quando chamada, pode retornar diversosvalores calculados dentro da unidade de programa,associados com os argumentos usados na chamada daSubrotina

Alexandre Diehl SCEF

Page 4: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Um subprograma do tipo FUNÇÃO tem a seguinte sintaxe

[tipo] FUNCTION nome-da-função (arg1, arg2, ..., argn)IMPLICIT NONE[campo de declaração de variáveis][campo de execução]

END FUNCTION nome-da-função

A opção tipo identifica o tipo de dado associado com a Função. Pode serINTEGER, REAL, LOGICAL, etc

A Função é nomeada pelo identificador nome-da-função. É ele que devemosusar nas operações envolvendo a Função.

Os argumentos da Função são identificados por uma lista de identificadoresmudos arg1, arg2, ..., argn. Eles são usados na unidade de programa paraproduzir o resultado a ser extraído da Função.

Alexandre Diehl SCEF

Page 5: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Um subprograma do tipo FUNÇÃO tem a seguinte sintaxe

[tipo] FUNCTION nome-da-função (arg1, arg2, ..., argn)IMPLICIT NONE[campo de declaração de variáveis][campo de execução]

END FUNCTION nome-da-função

Uma Função é uma unidade de programa que recebe dados através de uma listade argumentos mudos, realiza operações com estes argumentos e retorna umresultado associado com o nome da Função.

No campo de execução da Função devemos ter uma ou mais declarações do tipo

nome-da-função = expressão

onde o resultado da expressão será salvo no identificador do nome da Função.

Alexandre Diehl SCEF

Page 6: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Um subprograma do tipo FUNÇÃO tem a seguinte sintaxe

[tipo] FUNCTION nome-da-função ( )IMPLICIT NONE[campo de declaração de variáveis][campo de execução]

END FUNCTION nome-da-função

Uma Função não precisa ter uma lista de argumentos mudos.

Neste caso, a Função deve ser definida como

[tipo] FUNCTION nome-da-função ( )

e chamada de uma unidade de programa como

write(*,*)nome-da-função ( )

Alexandre Diehl SCEF

Page 7: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Um subprograma do tipo FUNÇÃO tem a seguinte sintaxe

[tipo] FUNCTION nome-da-função (arg1, arg2, ..., argn)IMPLICIT NONE[campo de declaração de variáveis][campo de execução]RETURN

END FUNCTION nome-da-função

Se um dos comando dentro da Função é uma instrução do tipo RETURN, aexecução da Função é encerrada e o programa segue a partir do ponto em que aFunção foi chamada.

Podem existir mais de uma instrução RETURN dentro da Função, isoladamenteou em combinação com instruções do tipo IF

IF (x < 0) RETURN

Alexandre Diehl SCEF

Page 8: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

As Funções podem ser internas ou externas

Funções internas (com CONTAINS):

→ São definidas dentro de uma unidade de programa, a partir da instrução

CONTAINS.

program t e s t ei m p l i c i t none[ campo de dec laracao de i d e n t i f i c a d o r e s ][ campo de execucao ]CONTAINS

[ funct ion 1][ func t ion 2]

end program t e s t e

Todas as Funções são listadas a partir do CONTAINS.

O Programa Principal é finalizado após a declaração de todas as Funções.

Alexandre Diehl SCEF

Page 9: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Função interna com CONTAINS

program t e s t a _ f u n c t i o ni m p l i c i t nonewri te ( ∗ , ∗ ) GetNumber ( )

CONTAINSr e a l funct ion GetNumber ( )

i m p l i c i t noner e a l : : Input_Valuedo

wri te ( ∗ , ∗ ) ’ � d i g i t e �um�numero� p o s i t i v o : ’read ( ∗ , ∗ ) Input_Valuei f ( Input_Value > 0 . 0 ) e x i twri te ( ∗ , ∗ ) ’ Erro : � t e n t e �novamente ’

end doGetNumber = Input_Value

end funct ion GetNumberend program t e s t a _ f u n c t i o n

Alexandre Diehl SCEF

Page 10: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

As Funções podem ser internas ou externas

Funções internas (sem CONTAINS):

→ Todas as Funções devem ser iniciadas e finalizadas separadamente, após a

finalização do Programa Principal.

program t e s t ei m p l i c i t none[ campo de dec laracao de i d e n t i f i c a d o r e s ][ campo de execucao ]

end program t e s t e[ funct ion 1][ func t ion 2]

As Funções devem ser declaradas no campo de identificadores do Programa

Principal.

Alexandre Diehl SCEF

Page 11: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Função interna: sem CONTAINS

program t e s t a _ f u n c t i o ni m p l i c i t noner e a l : : GetNumberwri te ( ∗ , ∗ ) GetNumber ( )

end program t e s t a _ f u n c t i o n

r e a l funct ion GetNumber ( )i m p l i c i t noner e a l : : Input_Valuedo

wri te ( ∗ , ∗ ) ’ � d i g i t e �um�numero� p o s i t i v o : ’read ( ∗ , ∗ ) Input_Valuei f ( Input_Value > 0 . 0 ) e x i twri te ( ∗ , ∗ ) ’ Erro : � t e n t e �novamente ’

end doGetNumber = Input_Value

end funct ion GetNumber

Alexandre Diehl SCEF

Page 12: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

Os argumentos de uma Função podem ser declarados com o opção de intençãoINTENT:

→ usado para se especificar como é passado um argumento para umsubprograma e como ele é retornado.

Para uma Função a opção de intenção que pode ser usada é o INTENT(IN):

→ neste caso o valor do argumento não pode ser alterado pela Função

A sintaxe a ser usada é a seguinte

INTENT(IN) :: <lista de argumentos mudos da função>

Sem a opção de intenção INTENT(IN) os valores dos argumentos mudos podemmudar pelos cálculos realizados dentro da Função

Alexandre Diehl SCEF

Page 13: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

Forma correta de uso da opção intenção INTENT(IN):

program i n t e n t i o ni m p l i c i t nonei n t e g e r : : a = 10 , b = 20wri te ( ∗ , ∗ ) Add( a , b )

CONTAINSi n t e g e r funct ion Add( x , y )

i m p l i c i t noneinteger , i n t e n t ( in ) : : x , yAdd = x + y

end funct ion Addend program i n t e n t i o n

Como usamos a opção de intençãoINTENT(IN), os argumentos mudos x e ynão podem ter seus valores alterados.

Alexandre Diehl SCEF

Page 14: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em FunçõesForma errada de uso da opção intenção INTENT(IN):

program i n t e n t i o ni m p l i c i t nonei n t e g e r : : a = 10 , b = 20wri te ( ∗ , ∗ ) Add( a , b )

CONTAINSi n t e g e r funct ion Add( a , b )

i m p l i c i t noneinteger , i n t e n t ( in ) : : a , bb = a + bAdd = b

end funct ion Addend program i n t e n t i o n

Os nomes dos argumentos mudos nãoprecisam ser os mesmos daqueles usadosno programa que chama a Função.Apenas os tipos devem ser os mesmos.

Como usamos a opção de intençãoINTENT(IN), se tivéssemos usado a e bcomo argumentos mudos, daria um errode compilação.

Alexandre Diehl SCEF

Page 15: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

IDENTIFICADORES LOCAIS ou INTERNOS (com CONTAINS)

São identificadores declarados dentro da Função e têm validade apenas dentrodo escopo da Função, ou seja, não podem ser usados fora deste escopo.

IDENTIFICADORES GLOBAIS (com CONTAINS)

São identificadores declarados no programa principal e têm validade em todo oescopo do programa, inclusive dentro da Função.

Não precisam ser transferidos para a Função através dos seus argumentos ouqualquer outra instrução do tipo COMMON.

Alexandre Diehl SCEF

Page 16: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

program tes ta_escopoi m p l i c i t nonerea l , parameter : : pi = 3 .1415926i n t e g e r : : m, n. . .

CONTAINSi n t e g e r funct ion func1 ( k )

i m p l i c i t noneinteger , i n t e n t ( in ) : : kr e a l : : f , g. . .

end funct ion func1r e a l funct ion func2 ( u , v )

i m p l i c i t nonerea l , i n t e n t ( in ) : : u , vi n t e g e r : : i , j. . .

end funct ion func2end program tes ta_escopo

Variáveis globais

→ pi→m→ n

Variáveis locais de func1

→ k→ f→ g

Variáveis locais de func2

→ u→ v→ i→ j

Alexandre Diehl SCEF

Page 17: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

Um identificador global é visível em todo o programa

i m p l i c i t nonei n t e g e r : : a = 1 , b = 2 , c = 3wri te ( ∗ , ∗ ) Add( a )c = 4wri te ( ∗ , ∗ ) Add( a )wri te ( ∗ , ∗ ) Mul ( b , c )CONTAINSi n t e g e r funct ion Add( q )

i m p l i c i t noneinteger , i n t e n t ( in ) : : qAdd = q + c

end funct ion Addi n t e g e r funct ion Mul ( x , y )

i m p l i c i t noneinteger , i n t e n t ( in ) : : x , yMul = x ∗ y

end funct ion Mulend

a, b e c são globais

O primeiro Add(a) retorna o valor 4

O segundo Add(a) retorna o valor 5

Mul(b,c) retorna o valor 8

Assim, duas chamadas sucessivas daFunção Add(a) produzem resultadosdiferentes, mesmo usando os mesmosargumentos mudos: efeito lateral.

Alexandre Diehl SCEF

Page 18: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

Um identificador global é visível em todo o programa

program Globali m p l i c i t nonei n t e g e r : : a = 10 , b = 20wri te ( ∗ , ∗ ) Add( a , b )wri te ( ∗ , ∗ ) bwri te ( ∗ , ∗ ) Add( a , b )

CONTAINSi n t e g e r funct ion Add( x , y )

i m p l i c i t noneinteger , i n t e n t ( in ) : : x , yb = x + yAdd = b

end funct ion Addend program Global

a, b são globais

O primeiro Add(a,b) retorna o valor 30

O primeiro Add(a,b) muda b para 30

O primeiro write(*,*) mostra o valor 30

O segundo Add(a,b) retorna o valor 40

Alexandre Diehl SCEF

Page 19: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

Identificador local com o mesmo nome de um identificador global

PROGRAM escopoIMPLICIT NONEINTEGER : : i , Max = 5DO i = 1 , Max

Write ( ∗ , ∗ ) Sum( i )END DO

CONTAINSINTEGER FUNCTION Sum( n )

IMPLICIT NONEINTEGER, INTENT( IN ) : : nINTEGER : : i , ss = 0. . .

Sum = sEND FUNCTION Sum

END PROGRAM escopo

Um identificador local pode ter o mesmo nomede um identificador global

O identificador inteiro i, declarado dentrodo programa principal, é global.

O identificador inteiro i, declarado dentroda Função Sum(n), é local.

Assim, qualquer mudança de i dentro daFunção não irá alterar o valor da variávelglobal i do programa principal.

Alexandre Diehl SCEF

Page 20: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

Sem o uso do CONTAINS, o conceito de identificadores GLOBAIS deve ser revisto:

i m p l i c i t nonei n t e g e r : : a = 1 , b = 2 , c = 3i n t e g e r : : Add, Mulwri te ( ∗ , ∗ ) Add( a , c )c = 4wri te ( ∗ , ∗ ) Add( a , c )wri te ( ∗ , ∗ ) Mul ( b , c )endi n t e g e r funct ion Add( q , c )

i m p l i c i t noneinteger , i n t e n t ( in ) : : q , cAdd = q + c

end funct ion Addi n t e g e r funct ion Mul ( x , y )

i m p l i c i t noneinteger , i n t e n t ( in ) : : x , yMul = x ∗ y

end funct ion Mul

As variáveis só têm validade noescopo da unidade de programa ondeforam definidas.

Para serem usadas em unidades deprograma distintas, as variáveisdevem ser transferidas para a Funçãoatravés dos seus argumentos mudos.

Alexandre Diehl SCEF

Page 21: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

O atributo SAVE:

→ usado para se preservar o valor de variáveis, declaradas em uma Função.Desta forma, o valor anterior desta variável está acessível quando a Função éinvocada novamente.

program t e s t a _ s a v ei n t e g e r : : ii = SUB ( )i = SUB ( )i = SUB ( )

CONTAINSi n t e g e r FUNCTION SUB ( )

in teger , SAVE : : a = 0a = a + 1p r i n t ∗ , ’ a�=� ’ , a

end funct ion SUBend program t e s t a _ s a v e

O valor inicial de a é 0.

Na primeira chamada da Função o valorde a é modificado para 1.

Na segunda chamada da Função o valorde a é modificado para 2.

Na terceira chamada da Função o valor dea é modificado para 3.

Alexandre Diehl SCEF

Page 22: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Declaração de argumentos e identificadores em Funções

O atributo DATA:

→ usado inicializar variáveis declaradas em uma unidade de programa.

program t e s t a _ d a t ar e a l : : x , y

DATA x , y / −1.0 , 6 . 0 /p r i n t ∗ , x , yp r i n t ∗ , ’FUNC�=� ’ ,FUNC( )

CONTAINSr e a l FUNCTION FUNC( )

i n t e g e r : : jDATA j / 100 /p r i n t ∗ , jp r i n t ∗ , ’ x�=� ’ , xFUNC = 2 . 0 ∗ x

end funct ion FUNCend program t e s t a _ d a t a

→ as variáveis inicializadas com o atributoDATA podem ter seus valores modificados.

Obs.: Uso inadequado da Função!

Alexandre Diehl SCEF

Page 23: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Exemplo: Programa para inserir N partículas numa caixaquadrada de lado L, com as posições fixadas de forma aleatória.

Alexandre Diehl SCEF

Page 24: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Rotina para gerar uma sequência de números pseudoaleatórios: ran2.f90 (Numerical

Recipes, http://www.nrbook.com/a/bookf90pdf.html)

REAL FUNCTION ran2 ( idum )INTEGER idum , idum2INTEGER IM1 , IM2 , IMM1, IA1 , IA2 , IQ1 , IQ2 , IR1 , IR2 ,NTAB,NDIVREAL AM, EPS ,RNMXPARAMETER ( IM1=2147483563 ,IM2=2147483399 ,AM= 1 . / IM1 ,

IMM1=IM1−1 , IA1=40014 , IA2=40692 , IQ1=53668 ,&IQ2=52774 , IR1 =12211 , IR2 =3791 ,NTAB=32,&NDIV=1+IMM1 /NTAB, EPS=1.2 e−7 ,RNMX=1.−EPS )

INTEGER j , k , iv (NTAB) , iySAVE iv , iy , idum2DATA idum2 /1 2 3 4 5 6 7 8 9 / , iv /NTAB∗ 0 / , iy / 0 /[ . . . A . . . ]

A argumento mudo idum deve ser um inteiro negativo na primeira chamada de ran2.

Alexandre Diehl SCEF

Page 25: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Rotina para gerar uma sequência de números pseudoaleatórios: ran2.f90 (Numerical

Recipes, http://www.nrbook.com/a/bookf90pdf.html)

[ . . . A . . . ]i f ( idum <= 0) then

idum = MAX(−idum , 1 )idum2 = idumdo j = NTAB+8 ,1 ,−1

k = idum / IQ1idum = IA1 ∗ ( idum−k ∗ IQ1 ) − k ∗ IR1i f ( idum . l t . 0 ) idum = idum + IM1i f ( j <= NTAB) iv ( j ) = idum

enddoiy = iv ( 1 )

endi fk = idum / IQ1idum = IA1 ∗ ( idum−k ∗ IQ1 ) − k ∗ IR1[ . . . B . . . ]

A argumento mudo idum deve ser um inteiro negativo na primeira chamada de ran2.

Alexandre Diehl SCEF

Page 26: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Rotina para gerar uma sequência de números pseudoaleatórios: ran2.f90 (Numerical

Recipes, http://www.nrbook.com/a/bookf90pdf.html)

[ . . . B . . . ]i f ( idum < 0) idum = idum + IM1k = idum2 / IQ2idum2 = IA2 ∗ ( idum2−k ∗ IQ2 ) − k ∗ IR2i f ( idum2 < 0) idum2 = idum2 + IM2j = 1 + iy /NDIViy = iv ( j ) − idum2iv ( j ) = idumi f ( iy < 1) iy = iy + IMM1ran2 = MIN(AM∗ iy ,RNMX)return

END FUNCTION ran2

Use ran2 para inserir as N partículas na caixa quadrada. Use alocação dinâmica,

entrada de dados a partir de arquivos e a saída das coordenadas das partículas num

arquivo.

Alexandre Diehl SCEF

Page 27: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

program i n s e r e _ p a r t i c u l a si m p l i c i t nonei n t e g e r : : i , N, i seedr e a l : : Lrea l , a l l o c a t a b l e : : x ( : ) , y ( : )p r i n t ∗ , ’ quantas � p a r t i c u l a s ? ’read ∗ ,Na l l o c a t e ( x (N) , y (N) )p r i n t ∗ , ’ qual �o�tamanho�L�da� ca ixa ? ’read ∗ , Lp r i n t ∗ , ’ � d i g i t e �um� i n t e i r o � negativo : ’read ∗ , i seeddo i = 1 ,N

x ( i ) = L∗ ran2 ( i seed )y ( i ) = L∗ ran2 ( i seed )p r i n t ∗ , x ( i ) , y ( i )

end doCONTAINS

r e a l FUNCTION ran2 ( idum )[ . . . ]end FUNCTION ran2

end program i n s e r e _ p a r t i c u l a s

Alexandre Diehl SCEF

Page 28: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Exemplo: Programa para calcular a distância centro-a-centro deN partículas numa caixa quadrada de lado L, com as posiçõesfixadas de forma aleatória.

~rij = ~r(i) −~r(j)

distância centro-a-centro:

|~rij| =

√(x(i) − x(j))2 + (y(i) − y(j))2

Alexandre Diehl SCEF

Page 29: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

program i n s e r e _ p a r t i c u l a si m p l i c i t nonei n t e g e r : : i , j , N, i seedr e a l : : L , d i s t a n c i area l , a l l o c a t a b l e : : x ( : ) , y ( : )read ∗ ,N, L , i seeda l l o c a t e ( x (N) , y (N) )do i = 1 ,N

x ( i ) = L∗ ran2 ( i seed )y ( i ) = L∗ ran2 ( i seed )

end dodo i = 1 ,N−1

do j = i +1 ,Nd i s t a n c i a = s q r t ( ( x ( i )−x ( j ) ) ∗ ∗ 2 + ( y ( i )−y ( j ) ) ∗ ∗ 2 )wri te ( ∗ , ’ (A, I3 , 2 x ,A, I3 , 2 x ,A, F6 . 3 ) ’ ) ’ i= ’ , i , ’ j = ’ , j ,&’ d i s t a n c i a= ’ , d i s t a n c i a

end doend do

CONTAINSr e a l FUNCTION ran2 ( idum )[ . . . ]end FUNCTION ran2

end program i n s e r e _ p a r t i c u l a s

Alexandre Diehl SCEF

Page 30: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo FUNÇÃO

Formato do arquivo de entrada input.dat:

Execução e saída do código:

Alexandre Diehl SCEF

Page 31: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Em Fortran 90 existem dois tipos de subprogramas: Funções eSubrotinas

Uma Função, quando chamada, retorna um único valorcalculado dentro da unidade de programa, associado como nome da FunçãoUma Subrotina, quando chamada, pode retornar diversosvalores calculados dentro da unidade de programa,associados com os argumentos usados na chamada daSubrotina

Alexandre Diehl SCEF

Page 32: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Um subprograma do tipo SUBROTINA tem a seguinte sintaxe

<atributos> SUBROUTINE <nome> (arg1, arg2, ..., argn)IMPLICIT NONE[campo de declaração de variáveis][campo de execução]

END SUBROUTINE <nome>

A opção <atributos> é opcional, possibilitando o uso de atributos comoRECURSIVE, com a mesma funcionalidade apresentada no caso de Funções.

A Subrotina é nomeada pelo identificador <nome>. É ele que devemos usar parainvocar o uso da Subrotina.

→ O nome da Subrotina não pode ser usado dentro de expressões aritméticase/ou lógicas, nem em comando do tipo PRINT.

→ Para invocar a Subrotina, usamos o comando CALL <nome>.

Alexandre Diehl SCEF

Page 33: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Um subprograma do tipo SUBROTINA tem a seguinte sintaxe

<atributos> SUBROUTINE <nome> (arg1, arg2, ..., argn)IMPLICIT NONE[campo de declaração de variáveis][campo de execução]RETURN

END SUBROUTINE <nome>

Se um dos comando dentro da Subrotina é uma instrução do tipo RETURN, aexecução da Subrotina é encerrada e o programa segue a partir do ponto em quea Subrotina foi invocada.

→ Podem existir mais de uma instrução RETURN dentro da Subrotina,isoladamente ou em combinação com instruções do tipo IF.

→ A instrução RETURN é opcional. Sem ela, a execução da Subrotina éencerrada no comando END.

Alexandre Diehl SCEF

Page 34: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Um subprograma do tipo SUBROTINA tem a seguinte sintaxe

<atributos> SUBROUTINE <nome> (arg1, arg2, ..., argn)IMPLICIT NONE[campo de declaração de variáveis][campo de execução]

END SUBROUTINE <nome>

Os argumentos da Subrotina são identificados por uma lista de identificadoresmudos arg1, arg2, ..., argn.

→ Eles são usados na unidade de programa para produzir o resultado a serextraído da Subrotina.

→ Os argumentos podem ser de entrada, INTENT(IN).

→ Os argumentos podem ser de saída INTENT(OUT).

Alexandre Diehl SCEF

Page 35: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Declaração de argumentos e identificadores em Subrotina

Os argumentos de uma Subrotina podem ser declarados com o opção deintenção INTENT:

→ usado para se especificar como é passado um argumento para umsubprograma e como ele é retornado.

Opção de intenção de entrada, INTENT(IN):

→ neste caso o valor do argumento não pode ser alterado pela Subrotina

→ A sintaxe a ser usada é a seguinte

INTENT(IN) :: <lista de argumentos mudos da Subrotina>

→ Sem o INTENT(IN) os valores dos argumentos mudos podem mudarpelos cálculos realizados dentro da Subrotina.

Alexandre Diehl SCEF

Page 36: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Declaração de argumentos e identificadores em Subrotina

Os argumentos de uma Subrotina podem ser declarados com o opção deintenção INTENT:

→ usado para se especificar como é passado um argumento para umsubprograma e como ele é retornado.

Opção de intenção de saída, INTENT(OUT):

→ neste caso o argumento só pode ser usado em expressões e comandosdepois de um valor ter sido atribuído a ele dentro da Subrotina.

→ A sintaxe a ser usada é a seguinte

INTENT(OUT) :: <lista de argumentos mudos da Subrotina>

→ A opção INTENT(OUT) em geral é usada para extrair os resultadoscalculados dentro da Subrotina através dos argumentos mudos desta.

Alexandre Diehl SCEF

Page 37: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

As Subrotinas podem ser internas ou externas

Subrotinas internas (com CONTAINS):

→ São definidas dentro de uma unidade de programa, a partir da instrução

CONTAINS.

program t e s t ei m p l i c i t none[ campo de dec laracao de i d e n t i f i c a d o r e s ][ campo de execucao ]CONTAINS

[ Subroutine 1][ Subroutine 2]

end program t e s t e

Todas as Subrotinas são listadas a partir do CONTAINS.

O Programa Principal é finalizado após a declaração de todas as Subrotinas.

Alexandre Diehl SCEF

Page 38: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Subrotina interna com CONTAINS

program t e s t a _ s u b r o t i n ai m p l i c i t noner e a l : : numberCALL GetNumber ( number )p r i n t ∗ , ’ �numero� digi tado : ’ , number

CONTAINS

SUBROUTINE GetNumber ( Input_Value )i m p l i c i t nonerea l , INTENT(OUT) : : Input_Valuedo

wri te ( ∗ , ∗ ) ’ � d i g i t e �um�numero� p o s i t i v o : ’read ( ∗ , ∗ ) Input_Valuei f ( Input_Value > 0 . 0 ) e x i twri te ( ∗ , ∗ ) ’ Erro : � t e n t e �novamente ’

end doend SUBROUTINE GetNumber

end program t e s t a _ s u b r o t i n a

Alexandre Diehl SCEF

Page 39: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

As Subrotinas podem ser internas ou externas

Subrotinas internas (sem CONTAINS):

→ Todas as Subrotinas devem ser iniciadas e finalizadas separadamente, após a

finalização do Programa Principal.

program t e s t ei m p l i c i t none[ campo de dec laracao de i d e n t i f i c a d o r e s ][ campo de execucao ]

end program t e s t e[ subroutine 1][ subroutine 2]

Alexandre Diehl SCEF

Page 40: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Subrotina interna sem CONTAINS

program t e s t a _ s u b r o t i n ai m p l i c i t noner e a l : : numberCALL GetNumber ( number )p r i n t ∗ , ’ �numero� digi tado : ’ , number

end program t e s t a _ s u b r o t i n a

SUBROUTINE GetNumber ( Input_Value )i m p l i c i t nonerea l , INTENT(OUT) : : Input_Valuedo

wri te ( ∗ , ∗ ) ’ � d i g i t e �um�numero� p o s i t i v o : ’read ( ∗ , ∗ ) Input_Valuei f ( Input_Value > 0 . 0 ) e x i twri te ( ∗ , ∗ ) ’ Erro : � t e n t e �novamente ’

end doend SUBROUTINE GetNumber

Alexandre Diehl SCEF

Page 41: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Fatorial de n:

program f a t o r i a l _ s u bi m p l i c i t nonei n t e g e r : : f , np r i n t ∗ , ’n? ’read ∗ , ni f ( n >= 0) then

CALL f a t o r i a l ( n , f )wri te ( ∗ , ’ ( " f a t o r i a l ( " , I12 , " ) = " , I12 ) ’ ) n , f

e l s ep r i n t ∗ , ’ va lor � inva l ido �para�n ’

end i f

CONTAINS

subroutine f a t o r i a l ( n , f )[ . . . ]

end subroutine f a t o r i a l

end program f a t o r i a l _ s u b

Alexandre Diehl SCEF

Page 42: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Subprograma do tipo SUBROTINA

Fatorial de n:

program f a t o r i a l _ s u b

[ . . . ]CONTAINS

subroutine f a t o r i a l ( n , f )i m p l i c i t noneinteger , i n t e n t ( in ) : : nin teger , i n t e n t ( out ) : : fi n t e g e r : : ii f ( n >= 0) then

f = 1do i = 2 ,n

f = f ∗ iend do

e l s e i f ( n == 0) thenf = 1

end i fend subroutine f a t o r i a l

end program f a t o r i a l _ s u b

Execução do código:

Tente usar na Subrotina

integer, intent(out) :: f = 1

O que acontece na compilação?

Alexandre Diehl SCEF

Page 43: Introdução ao Fortran 90 - 5 - WordPress Institucional · 2018. 9. 17. · Add = q + c endfunctionAdd integerfunctionMul(x , y) implicitnone integer,intent(in) : : x , y Mul = x

ufpellogo

Usando subprogramas FORTRAN90

Considere um sistema com N partículas de diâmetro σ. Construa um programa emFORTRAN 90 para inserir as N partículas numa caixa cúbica de lado L de formaaleatória.

As seguintes condições devem ser verificadas no programa:

a) durante a inserção das partículas, a separação entre quaisquer duas partículas nãopode ser menor do que σ.

b) Caso não seja possível inserir as N partículas, o programa deve ser interrompido euma mensagem de erro deve ser informada ao usuário.

c) Caso seja possível inserir as N partículas, o programa deve escrever as coordenadasx, y e z num arquivo de saída, usando formato de edição ES.

Alexandre Diehl SCEF