Post on 20-Aug-2020
ufpellogo
Introdução ao Fortran 90 - 5
Alexandre Diehl
Departamento de Física – UFPel
Alexandre Diehl SCEF
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
ufpellogo
Subprograma do tipo FUNÇÃO
Formato do arquivo de entrada input.dat:
Execução e saída do código:
Alexandre Diehl SCEF
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
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
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
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
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
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
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
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
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
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
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
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
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