24.07.2013 Views

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

Capítulo 8. Funções e Subrotinas - UFMG

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!