Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
Capítulo 8. Funções e Subrotinas - UFMG
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
108 <strong>8.</strong>2. sub-programas<br />
<strong>8.</strong>2.17 Rotinas elementais<br />
Na seção 6.7 já foi introduzida a noção de rotinas intrínsecas elementais, as quais são rotinas com argumentos<br />
mudos escalares que podem ser invocadas com argumentos reais matriciais, desde que os argumentos matriciais<br />
tenham todos a mesma forma (isto é, que sejam conformáveis). Para uma função, a forma do resultado é a<br />
forma dos argumentos matriciais.<br />
O Fortran 95 estende este conceito a rotinas não-intrínsecas. Uma rotina elemental criada pelo programador<br />
deve ter um dos seguintes cabeçalhos:<br />
ELEMENTAL SUBROUTINE ...<br />
--------------------------<br />
ELEMENTAL FUNCTION ...<br />
Um exemplo é fornecido abaixo. Dado o tipo derivado INTERVALO:<br />
TYPE :: INTERVALO<br />
REAL :: INF, SUP<br />
END TYPE INTERVALO<br />
pode-se definir a seguinte função elemental:<br />
ELEMENTAL FUNCTION SOMA_INTERVALOS(A,B)<br />
INTRINSIC NONE<br />
TYPE(INTERVALO) :: SOMA_INTERVALOS<br />
TYPE(INTERVALO), INTENT(IN) :: A, B<br />
SOMA_INTERVALOS%INF= A%INF + B%INF<br />
SOMA_INTERVALOS%SUP= A%SUP + B%SUP<br />
RETURN<br />
END FUNCTION SOMA_INTERVALOS<br />
a qual soma dois intervalos de valores, entre um limite inferior e um limite superior. Nota-se que os argumentos<br />
mudos são escritos como escalares, mas a especificação ELEMENTAL possibilita o uso de matrizes conformáveis<br />
como argumentos reais. Neste caso, as operações de soma dos intervalos são realizadas componente a componente<br />
das matrizes A e B da maneira mais eficiente possível.<br />
Uma rotina não pode ser ao mesmo tempo elemental e recursiva.<br />
Uma rotina elemental deve satisfazer todos os requisitos de uma rotina pura; de fato, ela já possui automaticamente<br />
o atributo PURE. Adicionalmente, todos os argumentos mudos e resultados de função devem ser<br />
variáveis escalares sem o atributo POINTER. Se o valor de um argumento mudo é usado em uma declaração,<br />
especificando o tamanho ou outra propriedade de alguma variável, como no exemplo<br />
ELEMENTAL FUNCTION BRANCO(N)<br />
IMPLICIT NONE<br />
INTEGER, INTENT(IN) :: N<br />
CHARACTER(LEN= N) :: BRANCO<br />
BRANCO= ’ ’<br />
RETURN<br />
END FUNCTION BRANCO<br />
esta função deve ser chamada com argumento real escalar, uma vez que um argumento real matricial resultaria<br />
em uma matriz cujos elementos seriam caracteres de comprimentos variáveis.<br />
Uma rotina externa elemental deve possuir uma interface explícita que sempre a caracterize de forma inequívoca<br />
como elemental. Isto é exigido para que o compilador possa determinar o mecanismo de chamada que<br />
acomode os elementos de matriz de forma mais eficiente. Isto contrasta com o caso de uma rotina pura, onde a<br />
interface nem sempre necessita caracterizar a rotina como pura.<br />
No caso de uma subrotina elemental, se algum argumento real é matriz, todos os argumentos com intenções<br />
OUT ou INOUT devem ser matrizes. No exemplo abaixo,<br />
ELEMENTAL SUBROUTINE TROCA(A,B)<br />
IMPLICIT NONE<br />
REAL, INTENT(INOUT) :: A, B<br />
REAL :: TEMP<br />
Autor: Rudi Gaelzer – IFM/UFPel Impresso: 23 de abril de 2008