Escolar Documentos
Profissional Documentos
Cultura Documentos
Program Unit
Programa Principal
Subrotinas
Funções
Procedures
External Procedures
Internal Procedures
Vantagens das Subrotinas Externas
• Independência no teste das subrotinas: Cada subrotina pode
ser escrita e compilada como uma unidade independente. A
subrotina pode ser testada em separado antes de combiná-la
com o programa principal;
• Partes diferentes do programa podem executar a mesma
tarefa. É mais simples do que escrever várias vezes a mesma
tarefa;
• Estanquiedade: Isolamento dos efeitos dos erros de
programação;
• A comunicação é feita apenas com as variáveis parâmetros
das rotinas.
Organização de uma Subrotina
Subroutine nome da sub (lista de argumentos)
implicit none
seção de declaração
lista de comandos
[return]
end subroutine
O comando Return tem o mesmo efeito que o comando
End Subroutine. O seu uso somente se justifica quando se
deseja retornar ao programa de chamada antes de encerrar
a subrotina.
Programa Teste
Subroutine teste(n,ik,data1)
implicit none
integer,intent(in):: n,ik
real,intent(out):: data1(n)
Como a subrotina conhece a forma e tamanho do array, as
operações do tipo Whole array operations e array sectins
podem ser feitas.
subroutine sub1
use test
implicit none
write(*,*) values
end subroutine
Interface Operator(operator_symbol)
module procedure function_1
....
End Interface
Operator_symbol
Qualquer operador intrinsico (+ - / * < > )
Operador definido pela sequência de até 31 letras entre
dois pontos (.inverter.)
Mais de uma função pode ser associada ao mesmo
operador, mas as funções devem obrigatoriamente
se distinguir pelos diferentes tipos de argumentos.
Para funções com dois argumentos (operador binário) o
lado esquerdo do operador corresponde ao primeiro
argumento da função e o lado direito deve
corresponder ao segundo argumento da função.
Operadores intrinsicos (por exemplo +) não podem ter o
seu significado padrão alterado.
Interface assignment (=)
module procedure subroutine_1
...
End interface
Type:: vetor
real:: x
real:: y
real:: z
End type
Interface operator(*)
module procedure cross
End interface
Function cross(vec_1,vec_2)
type (vetor):: cross
type(vetor),intent(in),vec_1,vec_2
cross.x=vec_1%y*vec_2%z-vec_1%z*vec_2%y
cross.y=vec_1%z*vec_2%x-vec_1%x*vec_2%z
cross.z=vec_1%x*vec_2%y-vec_1%y*vec_2%x
End function
Uso da Biblioteca IMSL
A biblioteca IMSL é um conjunto de rotinas matemáticas já
compiladas que podem ser acrescentadas ao código do
programa que está sendo desenvolvido. As vantagens do uso
dessa biblioteca são:
• Não reinventar a roda;
• Rotinas testadas e otimizadas;
• Desenvolvimento do código de forma mais rápida;
• As rotinas podem ser usadas sem maiores dificuldades.
As principais desvantagens do uso da biblioteca IMSL são:
• Rotinas do tipo caixa-preta. A documentação disponível é
restrita ao necessário para saber o método empregado e a
formatação dos parâmetros da rotina;
• As variáveis devem ser adaptadas à forma de armazenamen-
to usada na rotina;
• Nem sempre as rotinas disponíveis são as mais otimizadas
para tratar o problema.
Como verificar os procedimentos disponíveis
program inversa
use msimsl ! Esse comando deve ser colocado imediatamente
! Após o comando program ou o comando de
! declaração de subrotina
implicit none
real(8)::a(2,2),ainv(2,2)
integer,parameter::n=2, lda=2, ldainv=2
integer:: i,j
!
a(1,1)=2.d0; a(1,2)=1.d0; a(2,1)=1.d0; a(2,2)=3.d0
CALL DLINDS (N, A, LDA, AINV, LDAINV)
do i=1,2
write(*,*)(ainv(i,j),j=1,2)
end do
END program
Cuidados no Uso da IMSL
- Colocar o comando USE imsl na posição correta;
- Selecionar a rotina correspondente ao problema em estudo;
- Respeitar a ordem, o tipo e o número de parâmetros da
rotina usada;
- Respeitar a forma de armazenamento de dados indicada
pelos parâmetros da rotina.
Alguns Procedimentos com Rotinas IMSL
- Solução de sistemas de equações lineares;
- Solução de problemas de autovalores;
- Integração;
- Interpolação;