matrizes inumeros fortran 90

Upload: juliano-deividy-b-santos

Post on 31-Oct-2015

88 views

Category:

Documents


0 download

TRANSCRIPT

  • Disciplina: Mtodos Computacionais / 1 Semestre de 2005 Parte 1 Conceitos Fundamentais da Linguagem Fortran Verso F90

    1. Introduo 1 2. Linguagens de Programao 1 3. Uso da Linguagem Fortran em Computadores 3 4. Formatao de um Programa em Fortran 3 5. Estrutura de um Programa em Fortran 4 6. Constantes e Variveis 5 6.1 Declarao de Constantes e Variveis 6 6.2 Inicializao de Valores de Variveis 6 6.3 Programa com Diferentes Tipos de Variveis 7 7. Leitura e Impresso de Dados em Arquivo Externo 8 8. Comentrios 9 9. Formatao de Dados de Entrada e Sada 9 10. Funes Internas 11 11. Expresses Aritmticas e Lgicas 11 11.1 Exemplos 12 12. Comandos IF e DO 12 13. Sub-rotinas e Funes 13 14. Arranjos ou Variveis Compostas 14 14.1 Dimensionamento Dinmico de Arranjos 15 14.2 Operaes com Arranjos em F90 15 Anexo Lista de Programas 16 Referncias Bibliogrficas 35

    Autor: Renato Csar Gavazza Menin Braslia, 22 de Maro de 2005

  • Mtodos Computacionais / 1 Semestre de 2005 1

    1. Introduo:

    Soluo Analtica. Laboratrio. Computador.

    Forma Vantagens Desvantagens

    Sol. Analtica Resposta exata. Visualizao de todo o processo.

    Necessrio fazer simplificaes ( linearizaes, homogeneizao de materiais, simetrias ...). Invivel para problemas complexos (tempo).

    Laboratrio Realismo. Disponibilidade e custos de materiais, equipamentos e mo de obra). Necessidade de grande quantidade de ensaios.

    Computador Sem simplificaes. Rapidez, relativamente barato.

    Uso de softwares no confiveis. Anlise inadequada de resultados.

    2. Linguagens de Programao: Os programadores escrevem instrues em vrias linguagens de programao, algumas entendidas diretamente pelo computador e outras que exigem passos intermedirios de traduo. Centenas de linguagens computacionais esto atualmente em uso. Estas podem ser divididas em trs tipos gerais:

    Linguagens de mquina. Linguagens assembly. Linguagens de alto nvel.

    Qualquer computador pode entender apenas a sua prpria linguagem de mquina, que est relacionada intimamente com o seu projeto de hardware. Geralmente as linguagens de mquina consistem em strings de nmeros (reduzidos em ltima anlise de 1s e 0s) que dizem ao computador para realizar uma de suas operaes mais elementares de cada vez. As linguagens de mquina so dependentes da mquina (no padronizadas), ou seja, uma determinada linguagem de mquina s pode ser usada com um tipo de computador. As linguagens de mquina so complicadas para os humanos, como se pode ver no trecho de um programa em linguagem de mquina extrado de Deitel & Deitel [1994], que adiciona o Termo_B ao Termo_A e armazena o resultado no Termo_C. +1300042774 +1400593419 : linguagem de mquina +1200274027 medida que os computadores se tornaram mais populares, ficou claro que a programao em linguagem de mquina era muito lenta e tediosa para a maioria dos programadores. Em vez de usar strings de nmeros que os computadores podiam entender diretamente, os programadores comearam a usar abreviaes parecidas com palavras em ingls para representar as operaes elementares de um computador. Estas abreviaes formam a base das linguagens assembly. Foram desenvolvidos programas tradutores, chamados assemblers, para converter programas de linguagem assembly para linguagem de mquina. O trecho de um programa em linguagem assembly a seguir, extrado de Deitel & Deitel [1994], tambm

  • Mtodos Computacionais / 1 Semestre de 2005 2

    adiciona o Termo_B ao Termo_A e armazena o resultado no Termo_C, porm isto feito de uma forma mais clara que o programa equivalente em linguagem de mquina. LOAD Termo_A ADD Termo_B : linguagem assembly STORE Termo_C O uso do computador aumentou rapidamente com o advento das linguagens assembly, mais elas ainda exigiam muitas instrues para realizar mesmo as tarefas mais simples. Para acelerar o processo de programao, foram desenvolvidas linguagens de alto nvel, nas quais podiam ser escritas instrues simples para realizar tarefas fundamentais. Os programas tradutores que convertiam linguagens de alto nvel em linguagem de mquina so chamados compiladores. As linguagens de alto nvel permitem aos programadores escrever instrues que se parecem com o idioma ingls comum e contm as notaes matemticas normalmente usadas. O mesmo trecho de programa comentado acima pode se escrito em uma linguagem de alto nvel da seguinte forma: Termo_C = Termo_A + Termo_B : linguagem de alto nvel Obviamente, as linguagens de alto nvel so muito mais desejveis do ponto de vista do programador do que as linguagens de mquina ou assembly. Dentre as linguagens de computador de alto nvel mais comuns hoje em dia, destacam-se: Ada, Basic, Cobol, C, C++, Delphi, Fortran e Pascal. Destas linguagens, o Fortran tem sido uma das linguagens mais utilizadas nos ltimos cinqenta anos para clculos cientficos em geral, tendo sido empregada para uma grande variedade de aplicaes: modelos computacionais de centrais nucleares, projetos de aeronaves, sistemas de processamento de sinais ssmicos, programao em supercomputadores, computao paralela de grande porte, etc... A linguagem Fortran foi a primeira linguagem de alto nvel usada para programao de computadores. Foi proposta em 1953 por J. Backus, mas o seu primeiro compilador, feito para o computador IBM 704, s foi liberado em 1957. Seu nome formado pelas letras iniciais das palavras FORmula TRANslation, que indicam sua principal inovao na poca: a facilidade de transcrio de frmulas matemticas para serem usadas em computadores. Posteriormente, numerosos aperfeioamentos foram introduzidos em novas verses, sendo principais as denominadas Fortran II (1958), Fortran IV (1961), Fortran 66 (1966) e o Fortran 77 (1977), o qual resultou de um esforo para modernizar as verses anteriores e formar um padro que foi aprovado pelo American National Standards Institute (ANSI). Dentre as modernizaes destacam-se a introduo de estruturas de controle, (bloco IF) e facilidades na manipulao de variveis literais. A prxima grande atualizao da linguagem foi representada pelo Fortran 90. Dentre os avanos do Fortran 90 podem-se destacar: new free source format (na verso Fortran 77, as colunas 1 a 5 deveriam conter o nmero do comando ou declarao, quando usado, a coluna 6 era usada para indicar a continuao da linha anterior e os comandos deveriam estar compreendidos entre as colunas 7 a 72 ao passo que na verso Fortran 90, pode-se iniciar a digitao dos comandos na coluna 1); facilidades na criao e operaes de manipulao de arrays (vetores e matrizes); interfaces mais amigveis; etc... Nas prximas sees sero apresentadas algumas estruturas, palavras chaves, comandos de atribuio, comandos de entrada e sada de dados, ferramentas para modularizao (subrotinas e funes) e aspectos em geral para construo de programas na linguagem Fortran, dando-se nfase verso F90, porm fazendo uma analogia verso F77 quando necessrio.

  • Mtodos Computacionais / 1 Semestre de 2005 3

    3. Uso da Linguagem Fortran em Computadores: A utilizao da linguagem Fortran para resolver um problema em um computador faz-se, como em outras linguagens de programao, atravs de sucessivas fases:

    Definio do Problema. a descrio e a delimitao do problema a ser resolvido, caracterizando-o de maneira clara e completa.

    Desenvolvimento de um Algoritmo. Objetiva a descrio, geralmente desenvolvida por etapas (refinamentos), do processamento a ser realizado para resolver o problema e obter os resultados desejados no computador.

    Transcrio do algoritmo para a Linguagem Fortran. Objetiva a obteno de um programa equivalente, de acordo com as regras e recursos oferecidos pela linguagem.

    Processamento do Programa pelo Computador. Obedecendo a um programa denominado compilador da linguagem Fortran, o computador verifica a correo sinttica do programa que lhe apresentado e o traduz para um novo programa em linguagem de mquina. Em seguida este novo programa executado e passa a controlar o computador atravs das suas instrues, fazendo a resoluo do problema e obtendo os resultados desejados.

    Anlise de Resultados. Os resultados obtidos pelas primeiras execues de um programa num computador devem ser cuidadosamente analisados, pois eles podem estar parcial ou totalmente comprometidos com erros cometidos nas quatro primeiras fases. Se houver erro, ser necessrio retornar fase correspondente, fazer as devidas correes e repassar as fases seguintes.

    4. Formatao de um programa em Fortran: O texto de um programa em Fortran 77 deve ficar disposto em linhas. As linhas devem ter 80 colunas, e cada coluna s pode conter um caractere (letra, dgito ou sinal especial). As colunas 73 a 80 no so analisadas pelo compilador e geralmente so deixadas em branco. Antigamente, quando os programas eram digitados em cartes perfurados (cada linha em um carto), estas colunas eram usadas para numerar os cartes e facilitar a sua reordenao caso acidentalmente ficassem desordenados. Cada linha de um programa pode conter um comentrio, uma declarao ou um comando. Se a linha contiver um comentrio, a coluna 1 deve ter a letra C, e as colunas 2 a 72, os dizeres do comentrio. Se a linha contiver um comando ou uma declarao, as colunas devem ser agrupadas da seguinte maneira:

    colunas 1 a 5 para conter o nmero do comando ou da declarao (label ou rtulo), quando usado;

    coluna 6 para indicar continuao da linha anterior; colunas 7 a 72 para conter o comando ou a declarao.

    Programa Fonte ( Compilador )

    Programa Objeto + Biblioteca ( Linkagem )

    Programa Executvel ( Execuo )

    Resultados

  • Mtodos Computacionais / 1 Semestre de 2005 4

    Um comando ou declarao pode continuar nas colunas 7 a 72 de vrias linhas consecutivas que contiverem na coluna 6, caractere diferente de zero e de espao em branco. Neste caso, a coluna 7 de uma linha de continuao considerada como sucessora da coluna 72 da linha anterior. No caso do Fortran 90, graas ao chamado free source format, conforme comentado anteriormente, os comandos e declaraes podem ser digitados em qualquer lugar de uma linha e cada linha pode receber at 132 caracteres. Caso um comando ou declarao seja muito longo e no caiba em uma nica linha, pode-se continuar na linha seguinte digitando-se o smbolo & (ampersand) no final da linha corrente. Por exemplo, os seguintes comandos so idnticos:

    Output = input1 + input2

    Output = input1 & + input2 Vale ressaltar que tanto no Fortran 77 quanto no Fortran 90, os espaos em branco so irrelevantes e ignorados pelo programa compilador. Eles so considerados apenas nas constantes literais. 5. Estrutura de um Programa em Fortran: Cada programa em Fortran consiste de um agrupamento de declaraes executveis e no executveis, que devem ocorrer em uma ordem especfica. Um programa simples em F90 mostrado a seguir, no qual dois nmeros inteiros so lidos digitando-se os nmeros atravs do teclado e em seguida efetuada a multiplicao de um pelo outro e a impresso do resultado da multiplicao dos nmeros na tela do computador: Vale ressaltar que os programas fonte em Fortran escritos na verso F77 devem ter a extenso .for ao passo que os programas fonte escritos na verso F90 devem possuir uma extenso .f90. atravs da extenso que o compilador reconhece em que verso o programa fonte foi escrito. O compilador no aceitar o free source format se o arquivo fonte for definido com a extenso .for.

    Program exercise_1 ! Purpose: ! To illustrate some of the basic features of a Fortran program. ! Declare de variables used in this program: integer I,J,K ! Read the numbers: write(*,*) Enter the numbers to multiply: read (*,*) I,J ! Multiply the numbers: K = I*J ! Write out the result: write(*,*) Result = , K end program

    Estrutura de um Programa Simples: * Nome * Declaraes (no executveis) * Linhas executveis * End program

  • Mtodos Computacionais / 1 Semestre de 2005 5

    6. Constantes e Variveis: As constantes, conforme o prprio nome diz, so entidades cujos valores so fixos ao longo de todo o programa, no sendo possvel alterar os seus valores durante a execuo, sendo declaradas atravs do comando parameter. J as variveis podem sofrer alteraes ao longo da execuo do programa. A cada varivel corresponde uma posio de memria, cujo contedo pode variar ao longo do tempo, durante a execuo do programa. Embora uma varivel possa assumir diferentes valores, ela s pode armazenar um valor a cada instante. Toda constante ou varivel identificada por um nome ou identificador, cuja formao obedece a determinadas regras:

    F77: identificador pode ter no mximo 6 caracteres. F90: identificador pode ter at 31 caracteres. Os identificadores no so case sensitive, ou seja, letras maisculas e minsculas so

    consideradas iguais pelo compilador: variable_1 = Variable_1 = VARIABLE_1. O primeiro caractere de um identificador deve, obrigatoriamente, ser uma letra e os

    demais, letras ou nmeros, no sendo permitido o uso de smbolos especiais: Exemplo:

    1. Identificadores permitidos: Nota, total, A, X5, Var1, A32B, F1G3H5, step_1,...

    2. Identificadores no permitidos: 5B : comea pelo dgito 5 E(13) : contm os caracteres especiais ( ) A:B : contm o caractere especial : Var A : contm espao em branco VarA : contm o caractere especial . Observao: No confundir o caractere _ com o caractere .

    Conforme o seu tipo, as constantes e variveis podem ser classificadas como numricas (inteiras ou reais), lgicas ou literais, entre outras.

    9 26 letras do alfabeto (a,b,c,d,...,w,x,y,z) 9 10 nmeros (0,1,2,3,..., 8,9) 9 barra inferior ( _ )

    1. Integer: 9 armazena em forma exata at o limite, sem parte decimal. 9 intervalo vlido: [ -2147483648, +2147483647 ]. 9 exemplos: 1000, 0, 1, -1, 999,...

    2. Real: 9 nmeros reais, ou seja, com parte decimal em preciso simples. 9 nmero de dgitos na mantissa: 6 9 intervalo vlido: [1.0e+38, 1.0e-37], positivo ou negativo. 9 exemplos: 1.5, -0.01, 37., -6.8543, -1.0e-2, ... 3. Real*8: 9 nmeros reais, ou seja, com parte decimal em preciso dupla. 9 nmero de dgitos na mantissa: 15 9 intervalo vlido: [1.0e+308, 1.0e-307], positivo ou negativo. 9 exemplos: 1.5000, -0.0001, 37., -6.8543, -1.0e-2, ...

  • Mtodos Computacionais / 1 Semestre de 2005 6

    6.1 Declarao de Constantes e Variveis: No F77 havia uma regra de declarao implcita de variveis, segundo a qual qualquer varivel que comeasse com as letras (I, J, K, L, M, N) representavam variveis inteiras (integer) e todas as variveis que comeassem com outra letra diferente destas representavam variveis reais (real), a no ser que se declarasse diferente, de forma explcita. Desta forma obtm-se declarando a varivel inteira Juro1 de forma implcita e a varivel real Juro2 de forma explcita: Real Juro2 Juro1 = 0.09 ! Resultado: Juro1 = 0 (integer) Juro2 = 0.09 ! Resultado: Juro2 = 0.09 (real) Embora seja permitido este tipo de declarao implcita, para maior clareza do programa aconselhvel que as variveis sejam declaradas explicitamente, o que pode ser feito da seguinte forma, conforme o tipo de varivel: integer var1, var2 ! declarao de variveis do tipo inteiro. real var3, var4 ! declarao de variveis do tipo real com preciso simples. real*8 var5 ! declarao de variveis do tipo real com preciso dupla. logical var6,var7 ! declarao de variveis do tipo lgica. character*n var8 ! sendo n o nmero mximo de caracteres na varivel var8. Pode-se inibir a declarao implcita com o comando: implicit none, colocado antes da declarao de variveis, no incio do programa. 6.2 Inicializao de Valores de Variveis:

    a) Explicitar: Contador = 1 Taxa = 0.09 Word = Met_Computacionais

    b) Utilizando declarao DATA: DATA A,B,C /1,2,3.1415/ ! Observao: A = 1, B = 2 e C = 3.1415

    c) Entrar via teclado (recomendado para pequena quantidade de dados). d) Leitura de arquivo de entrada de dados (recomendado para grandes volumes).

    4. Logical: 9 um valor lgico, que s pode ser verdadeiro ou falso, usado em proposies lgicas. 9 s existem duas constantes deste tipo, sendo representadas pelas palavras true e false, precedidas e seguidas por ponto decimal, .true. e .false.. 5. Character: 9 constante literal que representa qualquer seqncia de caracteres. 9 a seqncia de caracteres, tambm conhecida por string, deve estar entre apstrofos. 9 nmero mximo de caracteres = [255]. 9 exemplos: Met_Computacionais, Resultado : , A5%(x): ,...

  • Mtodos Computacionais / 1 Semestre de 2005 7

    6.3 Programa com Diferentes Tipos de Variveis: Impresso de Resultados na Tela do Computador:

    Program exercise_2 ! Objetivo: ! Ilustrar a utilizao de diferentes tipos de variveis. ! Declarao de variveis do programa: integer I,J,K real var1,var2,var3 real*8 var4 logical flag1,flag2,flag3,flag4,flag5 character*7 const1 character*2 const2 character*9 const3 real*8, parameter :: const_4 = 2500.0 ! Declarao e inicializao de constante ! Inicializao explcita de variveis: I = 17 J = 4 var1 = 2.000 var2 = 3.000 flag1 = .true. flag2 = .false. const1 = Fortran const2 = 90 ! Operaes com variveis: K = I/J ! Diviso de inteiro por inteiro = inteiro (arredondamento para baixo) var3 = var1*var2 var4 = var1*var2 flag3 = flag1.and.flag2 flag4 = flag1.or.flag2 flag5 = .not.flag1 const3 = const1//const2 ! Operao de concatenao de strings ! Imprimir os resultados na tela do computador: write(*,*) Valor de K = , K write(*,*) Valor de var3 (simple precision) = ,var3 write(*,*) Valor de var4 (double precision) = ,var4 write(*,*) Valor de flag3 = ,flag3 write(*,*) Valor de flag4 = ,flag4 write(*,*) Valor de flag5 = ,flag5 write(*,*) String const3 = ,const3 write(*,*) 'Constante const_4 = ',const_4 end program

    Valor de K = 4 Valor de var3 (simple precision) = 6.000000 Valor de var4 (double precision) = 6.000000000000000 Valor de flag3 = F Valor de flag4 = T Valor de flag5 = F String const3 = Fortran90 Constante const 4 = 2500.000000000000000

  • Mtodos Computacionais / 1 Semestre de 2005 8

    7. Leitura e Impresso de Dados em Arquivo Externo: No caso de uma grande quantidade de dados sempre interessante a leitura e a impresso dos mesmos em arquivos externos. Antes de usar um arquivo externo necessrio que o mesmo seja aberto utilizando-se o comando OPEN. O comando OPEN abre um arquivo atravs das seguintes operaes: associa o nome externo do arquivo unidade que ser usada nos comandos de entrada ou sada, e estabelece o atributo de estado do arquivo. A forma do comando a seguinte:

    Open (Unit = n, File = nome-ext-arquivo, Status = estado)

    n: varivel ou constante, inteira e no negativa que identifica a unidade de entrada ou sada;

    nome-ext-arquivo: o nome externo do arquivo que deve ser colocado entre apstrofos ou ento o nome de uma varivel do tipo character colocada sem apstrofos;

    estado: indica o estado do arquivo no momento da abertura. O valor do estado deve vir entre apstrofos e pode ser um dos seguintes valores: 9 Old: indica que o arquivo externo j existe (normalmente arquivos de entrada). 9 New: indica que um novo arquivo ser criado (normalmente arquivos de sada). 9 Unknown: quando no se sabe o estado do arquivo, podendo ser utilizado para arquivos de entrada ou sada de dados.

    Program exercise_3 ! Objetivo: Ilustrar a leitura e impresso de dados em arquivos externos. ! Declarao de variveis do programa: integer I,J,K real var1,var2,var3 character*15 filein, fileout ! nomes dos arquivos de entrada (*.dat) e sada de dados (*.out) ! Abertura de arquivos externos para entrada e sada de dados: write(*,*)Input File Name ? (Max 15 Char) ! digitar a extenso do arquivo (*.dat) read (*,*) filein open(unit=10, file=filein, status = unknown) write(*,*)Output File Name ? (Max 15 Char) ! digitar a extenso do arquivo (*.out) read (*,*) fileout open(unit=20, file=fileout, status = unknown) ! Leitura de Dados do Arquivo de Entrada de Dados: read(10,*) I,J read(10,*) var1,var2 ! Operaes com variveis: K = I+J var3 = var1 * var2 ! Imprimir os resultados na tela do computador: write(*,*) Valor de K = , K write(*,*) Valor de var3 = ,var3 ! Imprimir os resultados no arquivo de sada: write(20,*) Valor de K = , K write(20,*) Valor de var3 = ,var3 end program

    Arquivo de Entrada de Dados / Exercise_3.dat 2 3 ! integer I,J 5.00 6.00 ! real var1,var2 Arquivo de Sada de Dados / Exercise_3.out Valor de K = 5 Valor de var3 = 30.000000

  • Mtodos Computacionais / 1 Semestre de 2005 9

    8. Comentrios: O comentrio um texto ou simplesmente uma frase utilizada para melhorar a clareza do programa. Na verso F77, a linha de comentrio deve ter a letra C na primeira coluna e os dizeres do comentrio colocados nas colunas 2 a 72. Na verso F90, para se colocar um comentrio basta utilizar o caractere ! em qualquer coluna e colocar o comentrio logo aps o caractere que o compilador ir desconsiderar qualquer texto colocado desde o smbolo ! at o final da linha. 9. Formatao de Dados de Entrada ou Sada: Na linguagem Fortran, atravs da especificao format, que descrito como os dados esto dispostos em um meio de entrada e como eles devero ser distribudos em um meio de sada. Sua forma geral dada por:

    read(u,n) lista-de-identificadores write(u,n) lista-de-identificadores n format(especificao-de-edio)

    u: uma constante positiva ou varivel contendo um valor inteiro positivo, que

    especifica qual a unidade de entrada ou sada que ser utilizada. n: um nmero tambm chamado de rtulo ou label da especificao format, a qual

    indica como os dados encontram-se distribudos em um meio de entrada ou como eles devem aparecer em um meio de sada de dados.

    lista-de-indentificadores: so os nomes das variveis, separados por vrgulas, nas quais sero armazenados os valores provenientes do meio de entrada ou cujos contedos sero mostrados atravs do meio de sada.

    especificao-de-edio: um conjunto de informaes sobre a distribuio dos dados em um meio de entrada/sada, conforme pode ser visto na tabela abaixo sendo w o tamanho total do campo de entrada/sada.

    Vale ressaltar que caso seja digitado o caractere asterisco na unidade de entrada do comando read ou na unidade de sada do comando write, ou seja (u = *), isto significa que os dados de entrada (read) e de sada (write) so respectivamente lidos e impressos na tela do computador, no sendo utilizados arquivos externos de entrada ou sada de dados. No caso do rtulo da especificao format ser definido com o smbolo asterisco (n = *), no necessrio colocar o formato da entrada ou sada de dados, uma vez que os mesmos sero lidos ou impressos em formato livre. Recomenda-se que no seja utilizada formatao nos arquivos de entrada, uma vez que isto pode ocasionar a leitura de dados de forma inadequada por um usurio desavisado. Em um campo de sada, os nmeros aparecem sempre alinhados direita. Se o nmero for negativo, um sinal colocado antes do nmero e se o nmero for positivo, nenhum sinal colocado antes do nmero. Se o valor de um dado de sada precisar de mais posies do que as previstas no formato, este ser preenchido com asteriscos.

    Especificao Tipo de Varivel Observao I w integer Entrada ou sada de inteiros Fw.d real Notao cientifica (d = parte decimal) Ew.d real Notao exponencial (d = parte decimal) Aw character Entrada ou sada de caracteres wX ------- Espaos em branco / ------- Pular para linha seguinte

  • Mtodos Computacionais / 1 Semestre de 2005 10

    Program exercise_4 ! Objetivo: Ilustrar a formatao de dados de sada ! Declarao de variveis do programa: integer I,J,K real var1,var2,var3 character*7 programa character*15 filein, fileout ! nomes dos arquivos de entrada (*.dat) e sada de dados (*.out) ! Abertura de arquivos externos para entrada e sada de dados: write(*,*)Input File Name ? (Max 15 Char) ! digitar a extenso do arquivo (*.dat) read (*,*) filein open(unit=10, file=filein, status = unknown) write(*,*)Output File Name ? (Max 15 Char) ! digitar a extenso do arquivo (*.out) read (*,*) fileout open(unit=20, file=fileout, status = unknown) ! Leitura de Dados do Arquivo de Entrada de Dados: read(10,*) I,J ! Dados de entrada no formatados read(10,*) var1,var2 read(10,*) programa ! Operaes com variveis: K = I+J var3 = var1 * var2 ! Imprimir os resultados no arquivo de sada sem formatao: write(20,*) Imprimir Resultados no format: write(20,*) Valor de K = , K write(20,*) Valor de var3 = ,var3 write(20,*) Nome do programa = ,programa ! Imprimir os resultados no arquivo de sada com formatao: write(20,25) 25 format(// Imprimir Resultados format: ) write(20,30) K 30 format(Valor de K = ,2x,I8) write(20,40) var3,var3 40 format(Valor de var3 =,2x,F8.2,/, Valor de var3 =,2x,E8.2) write(20,50) programa 50 format(Nome do programa =,A10) end program

    Arquivo de Entrada de Dados / Exercise_4.dat 10 15 ! integer I,J 7.00 6.00 ! real var1,var2 Fortran ! character*7 programa

    Arquivo de Sada de Dados / Exercise_4.out Imprimir Resultados - no format: Valor de K = 25 Valor de var3 = 42.000000 Nome do programa = Fortran Imprimir Resultados - format: Valor de K = 25 Valor de var3 = 42.00 Valor de var3 = .42E+02 Nome do programa = Fortran

  • Mtodos Computacionais / 1 Semestre de 2005 11

    10. Funes Internas: Podem-se usar nas expresses aritmticas algumas funes muito comuns na matemtica e que so supridas pelo compilador Fortran. Na tabela abaixo so apresentadas algumas das principais funes intrnsecas existentes no Fortran 90: 11. Expresses Aritmticas e Lgicas: Denomina-se expresso aritmtica, quela cujos operadores so aritmticos e cujos operandos so constantes e/ou variveis numricas. Por outro lado, denomina-se expresso lgica expresso cujos operadores so lgicos e cujos operandos so relaes, variveis e/ou constantes do tipo lgico. Tabela 11.1 Operadores aritmticos Tabela 11.2 Prioridade da operaes Tabela 11.4 Operadores relacionais e lgicos Tabela 11.3 Prioridade das operaes

    Funo Definio Parmetro Resultado ---------------------------------------------------------------------------------------------------------- abs(X) valor absoluto de x real/inteiro real/inteiro acos(X) cos-1(x) em rad real real asin(X) sen-1(x) em rad real real atan(X) tan-1(x) em rad real real cos(X) cos(x) sendo x em rad real real sin(X) sen(x) sendo x em rad real real tan(X) tan(x) sendo x em rad real real exp(X) ex real real log(X) loge(x) real real log10(X) log10(x) real real mod(X,Y) resto da diviso de X por Y inteiro inteiro float(X) converso de inteiro para real inteiro real sqrt(X) raiz quadrada de x real real max(X1,...,Xn) seleciona o maior valor Xi real/inteiro real/inteiro min(X1,...,Xn) seleciona o menor valor Xi real/inteiro real/inteiro

    operador operao -------------------------------- + adio subtrao * multiplicao / diviso ** potenciao

    prioridade operao --------------------------------------------- 1 potenciao 2 multiplicao/diviso 3 adio/subtrao

    F77 F90 definio ----------------------------------------------- .LT. < menor que .GT. > maior que .LE. = maior ou igual a .EQ. == igual a .NE. /= diferente de .AND. .AND. para conjuno .OR. .OR. para disjuno .NOT. .NOT. para negao

    prioridade operador --------------------------------- 1 aritmtico 2 relacional 3 .NOT. 4 .AND. 5 .OR.

  • Mtodos Computacionais / 1 Semestre de 2005 12

    11.1 Exemplos: 1) Expresso matemtica: Representao no Fortran: 1.1) ).( APP (P*(P A))**0.5 ou sqrt(P*(P A)) 1.2) GF

    EDCBA +

    ++ 1. A B*(C+D/(E+1) F)+G

    2) Variveis Relao Resultado --------------------------------------------------------------- X =1, Y=2, Z=5 X**2+Y.GT.Z .false. X=4, Y=3, Z=1 X**2+Y>=Z .true. 12. Comandos IF e DO: Num programa escrito em linguagem Fortran, aparecem em primeiro lugar as declaraes, seguidas por comandos que, se no houver indicao em contrrio, devero ser executadas numa seqncia linear, seguindo-se o texto em que esto escritos, de cima para baixo. O fim fsico do programa representado pela palavra chave END. Dentro da estrutura seqencial do Fortran, comentada no pargrafo acima, podem existir estruturas condicionais ou de repetio. A estrutura condicional representada pelo comando IF, sendo executada quando uma determinada condio for verdadeira ou falsa, conforme as suas diferentes formas apresentadas abaixo: J a estrutura de repetio da linguagem Fortran representada pela palavra-chave DO, permitindo que uma seqncia de comandos seja executada repetidamente at que uma determinada condio de interrupo seja satisfeita. As diferentes formas do comando DO so apresentadas abaixo: Nas duas primeiras estruturas mostradas acima o bloco de comandos executado repetidamente com I=J, I=J+1, I=J+2, ... ,I=K, ao passo que na terceira estrutura o termo L representa o incremento na varivel I, de modo que o bloco de comandos executado repetidamente com I=J, I=J+L, I=J+2L, I=J+3L, ..., I=J+nL K.

    if (condio) comando_1

    if (condio) then bloco_1 endif

    if (condio) then bloco_1 else bloco_2 endif

    if (condio1) then bloco_1 elseif (condio2) then bloco_2 elseif (condio3) then bloco_3 . . . else bloco_n endif

    do I = J,K bloco_de_comandos enddo

    do n I = J,K bloco_de_comandos n continue

    do I = J,K,L bloco_de_comandos enddo

    Verso F77:

  • Mtodos Computacionais / 1 Semestre de 2005 13

    Vale ressaltar que possvel abrir uma srie de laos IF ou DO, um dentro do outro, tomando-se o cuidado de sempre fechar os laos mais internos dentro dos laos mais externos. Tal construo conhecida pelo nome de ninho de IF ou de DO: Para o caso de se querer usar uma estrutura de repetio, porm sem saber inicialmente quantas vezes o lao de DO deve ser executado, pode-se utilizar o comando DO WHILE: Exemplos: ver exercises_5,6,7,...,11,12 na lista de programas em anexo. 13. Sub-rotinas e Funes: Em relao modularizao de programas, a linguagem Fortran oferece facilidades atravs de sub-rotinas (subroutine) e funes (function), o que torna possvel a implementao de programas modulares e estruturados, permitindo a construo de mdulos subordinados a um programa principal, que pode ser chamado vrias vezes, sempre que for necessrio:

    do I=1,5 do J=3,10 do K=2,9 bloco_de_comandos enddo enddo enddo

    if (condio_1) then if (condio_2) then bloco_de_comandos_1 endif else if (condio_3) then bloco_de_comandos_2 endif endif

    do while (expresso_lgica) bloco_de_comandos enddo

    ! Programa Principal .... ! Chamada da Sub-rotina S1: call S1(...) ! Chamada da Sub-rotina S2: call S2(...) ! Chamada da Funo F1: A = F1(...) ... contains subroutine S1(...) bloco_de_comandos end subroutine S1 subroutine S2(...) bloco_de_comandos end subroutine S2 function F1(...) bloco_de_comandos end function F1 End program ! Trmino do programa principal

  • Mtodos Computacionais / 1 Semestre de 2005 14

    Vale ressaltar que sempre conveniente dividir o programa principal em sub-rotinas de modo que cada sub-rotina contm um algoritmo independente que pode inclusive ser aproveitado para outros programas. Por exemplo, uma sub-rotina que resolve o sistema: Ax=y pode ter muitas aplicaes, no estando limitada a um programa especfico. Pode-se juntar uma srie de sub-rotinas e funes para formar uma biblioteca de sub-rotinas, de forma semelhante biblioteca de funes intrnsecas que vem com o compilador. Em F90, diferente das verses anteriores, todas as sub-rotinas e funes tem acesso todas as variveis globais, ou seja, todos os dados so public. Pode-se fazer com que uma varivel se torne privativa (private) de uma sub-rotina ou funo declarando ela novamente no corpo da sub-rotina ou funo, resolvendo o problema do comando COMMON que no mais necessrio em F90. Portanto, necessrio que o usurio declare explicitamente no corpo da sub-rotina ou funo todas as variveis que so privativas. Assim como na verso F77, no F90 pode-se passar dados para sub-rotinas e funes usando argumentos. Exemplos: ver exercises_13,14,15...,18 na lista de programas em anexo. 14. Arranjos ou Variveis Compostas: As variveis compostas correspondem a posies de memria, identificadas por um nico nome, individualizadas por ndices e cujo contedo de um mesmo tipo. O nome de uma varivel composta um identificador que obedece s mesmas regras de formao de identificadores de variveis simples. O nome se refere, coletivamente, a todos os elementos da varivel composta. Para referncia a um elemento, necessrio colocar-se o nome da varivel, seguida, entre parnteses, de um ou mais ndices. Em Fortran, esses ndices podem ser constantes inteiras ou variveis inteiras. A maioria dos compiladores aceita tambm expresses inteiras. Segue abaixo exemplos de variveis compostas: No Fortran, as variveis compostas unidimensionais (vetores) so utilizadas para armazenar conjuntos de dados cujos elementos podem ser endereados por um nico ndice. O conjunto de dados referenciado por um nome e que necessite de mais de um ndice para ter seus elementos individualizados dito composto multidimensional e a varivel que o armazena denominada varivel composta multidimensional (matrizes e tensores de ordem superior). Nas variveis compostas bi-dimensionais (matrizes ou tensores de segunda ordem), convenciona-se que o primeiro ndice indique a linha e o segundo a coluna. Em geral, utilizam-se laos de DO para manipular os elementos de um arranjo.

    ! Declarao de variveis: integer var_1 ! varivel simples integer vector_1(5), vector_2(10) real vector_3(4), matriz_1(3,3) real*8 matriz_2(2,3),matriz_3(3,3,3) ! pode possuir at 7 dimenses em F90 ... vector_1(3) = 2 ! terceiro elemento da varivel vector_1 matriz_1(1,2) = 3.0 ! elemento na primeira linha e segunda coluna de matriz_1 ... var_1 = 2*vector_1(4)+vector_2(10) ... ! tentar referenciar: vector_1(6), vector_1(0) ou vector_1(-2) produz erros ! tentar referenciar: vector_1(2.5) tambm produz erros

  • Mtodos Computacionais / 1 Semestre de 2005 15

    14.1 Dimensionamento Dinmico de Arranjos: Em programas computacionais de mdio e grande porte, de modo a evitar a perda de memria do computador, bastante til utilizar o dimensionamento dinmico de arranjos, segundo o qual, pode-se:

    Manter um arranjo no tamanho zero, exceto quando estiver em uso. Aumentar e diminuir o tamanho de arranjos. Ler o tamanho de arranjos como dados em vez de fixar de antemo.

    Porm, devem-se tomar certos cuidados: ao alterar o tamanho de um arranjo perde-se o seu contedo e portanto deve-se armazenar o seu contedo em outro local caso se queira uma cpia dos seus valores. Arranjos sem dimenses no podem ser passados para sub-rotinas como argumentos, ou seja, necessrio fixar antes a sua dimenso. A seguir apresentado o funcionamento da alocao dinmica de arranjos: 14.2 Operaes com Arranjos em F90: No Fortran F90 possvel fazer uma srie de operaes em parte ou na totalidade dos elementos de um arranjo com expresses simples, sem a necessidade de se utilizar laos de DO, conforme ocorria para o caso da verso F77: Exemplos: ver exercises_19,20,21...,23 na lista de programas em anexo.

    ! declarao de variveis: ! real*8, dimension(:), allocatable :: vector_1 ! vetor sem dimenso ! real*8, dimension(:,:), allocatable :: matriz_1 ! matriz sem dimenses ! integer n,m ... read(*,*) n,m allocate(vector_1(n)) ! definindo a dimenso do vetor allocate(matriz_1(n,m)) ! definindo as dimenses da matriz ...

    ! Declarao de Variveis: real*8 x(10),y(10),z(10),a(4),b(5),M(10,10),M1(3,3), prod real*8 M2(3,2),M3(2,3), M4(3,3),M5(3,3) ... z = x+y ! efetua a soma de cada um dos termos x(i)+y(i) isoladamente z = x*3.0 ! efetua a multiplicao de cada um dos termos x(i) por 3.0 z =(x*y) ! efetua o produto de cada um dos termos x(i)*y(i) isoladamente prod=sum(z) ! efetua o produto escalar dos vetores x*y x = y ! arranjo x igual a y a=x(1:4) ! inicializa o vetor a com os quatro primeiros termos de x b(1:5)=x(1:5)+y(6:10) ! b(1)=x(1)+y(6), b(2)=x(2)+y(7), ... M(1:10,1:10)=0.0 ! atribui o valor 0.0 a todos os termos da matriz M. M1(1:3,1:3)=M(4:6,4:6) ! M1(1,1)=M(4,4), M1(1,2)=M(4,5),... M3=transpose(M2) ! efetua a transposta da matriz M5=M1+M4 ! soma de matrizes (mesma dimenso) x(1:10) = M(1,1:10) ! vetor x igual a primeira linha da matriz M MC=Matmul(MA,MB) ! multiplicao de matrizes: MA(n,m)*MB(m,k) = MC(n,k)

  • Mtodos Computacionais / 1 Semestre de 2005 16

    Anexo - Lista de Programas

    program exercise_5 ! Objetivo: Definir a meno de um aluno com base na sua nota ! Declarao de variveis: real nota ! Entrada de Dados: write(*,*) 'Digitar a nota do aluno: ' read (*,*) nota if (nota10) then write(*,*)'Nota deve ser positiva entre 0 e 10' write(*,*)'Entre novamente com a nota:' read (*,*) nota endif ! Laos de IF: if (nota==0) then write(*,*)'Final Grade = SR' elseif (nota>0.and.nota=3.and.nota=5.and.nota=7.and.nota

  • Mtodos Computacionais / 1 Semestre de 2005 17

    elseif (nota>=7.and.nota2*saldo_inicial) stop enddo end program __________________________________________________________________________________________

  • Mtodos Computacionais / 1 Semestre de 2005 18

    program exercise_9 ! Objetivo: Achar a raiz quadrada de um nmero por iteraes ! Declarao de variveis: real numero,raiz integer i ! Entrada de dados: write(*,*)'Entrar com o numero: ' read (*,*) numero raiz = 1 ! Chute inicial (No importa que seja muito longe) do i=1,10 raiz = 0.5*(raiz+numero/raiz) write(*,*)'Iteration: ',i,' Raiz: ',raiz enddo write(*,*)'Raiz por iteracoes : ',raiz write(*,*)'Raiz pela funcao SQRT: ',sqrt(numero) end program __________________________________________________________________________________________ program exercise_10 ! Objetivo: Clculo dos momentos fletores ao longo de uma viga biapoiada ! M = M(x): momento ao longo da viga (calculado a cada metro) ! Declarao de variveis: real M,L,W,A,dx,distance integer i ! Caractersticas Geomtricas: L = 10.0 ! comprimento total da viga W = 100.0 ! carregamento concentrado A = 8.0 ! distncia do carregamento concentrado ao apoio esquerdo dx = L/10 ! Clculo das reaes de apoio R1 = W*(L-A)/L ! reao no apoio esquerdo R2 = W*A/L ! reao no apoio direito ! Clculo dos momentos fletores write(*,*)'Momentos fletores ao longo da viga: ' do i=0,10 distance =i*dx if (distance

  • Mtodos Computacionais / 1 Semestre de 2005 19

    program exercise_11 ! Objetivo: * Clculo do fatorial de um nmero. ! * O fatorial ser calculado utilizando-se variveis: integer ou real*8. ! importante ressaltar que as variveis inteiras s podem armazenar valores ! no intervalo [-2147483648,2147483647]. ! Declarao de variveis: integer ifact ! clculo do fatorial como integer real*8 rfact ! clculo do fatorial como real*8 character*15 fileout ! Arquivo de sada de dados: write(*,*)'Nome do arquivo de saida de dados - Max(15char): ' read (*,*) fileout open(unit=10,file=fileout,status='unknown') ! Clculo do Fatorial ifact=1 rfact=1.0d0 write(*,*) ' i ifact rfact' write(10,*)' i ifact rfact' do i=1,20 ifact=ifact*i rfact=rfact*i write(*,*)i,ifact,rfact write(10,*)i,ifact,rfact enddo end program Arquivo de Sada de Dados (exercise_11.out): i ifact rfact 1 1 1.000000000000000 2 2 2.000000000000000 3 6 6.000000000000000 4 24 24.000000000000000 5 120 120.000000000000000 6 720 720.000000000000000 7 5040 5040.000000000000000 8 40320 40320.000000000000000 9 362880 362880.000000000000000 10 3628800 3628800.000000000000000 11 39916800 3.991680000000000E+007 12 479001600 4.790016000000000E+008 13 1932053504 6.227020800000000E+009 ! Observao: 6.227e+09 = 6227000000 > 2147483647 14 1278945280 8.717829120000000E+010 15 2004310016 1.307674368000000E+012 16 2004189184 2.092278988800000E+013 17 -288522240 3.556874280960000E+014 18 -898433024 6.402373705728000E+015 19 109641728 1.216451004088320E+017 20 -2102132736 2.432902008176640E+018 __________________________________________________________________________________________

  • Mtodos Computacionais / 1 Semestre de 2005 20

    program exercise_12 ! Objetivo: Clculo das razes de uma equao de segunda ordem: ! Ax2 + Bx + C = 0 ! ---------------------------------------------------------------- ! Nota sobre nmeros complexos: ! Z=X+YI >>> Z=(X,Y) ! X: parte real ! Y: parte imaginria ! CONJG(Z)=X-YI ! ---------------------------------------------------------------- ! Declarao de variveis: real*8 A,B,C,DELTA,X1,X2,TOL complex*8 Z1, Z2 character*15 file_out ! Entrada de Dados: TOL=1.0E-05 !TOL: tolerncia para evitar diviso por zero write(*,*)'Calculo das raizes de uma equacao de segunda ordem' write(*,*)'Valor de coeficiente quadratico: ' read (*,*) A if (ABS(A).LT.TOL) then write(*,*)'O coeficiente quadratico deve ser maior que 1.0E-05' stop endif write(*,*)'Valor do coeficiente linear: ' read (*,*) B write(*,*)'Valor do coeficiente independente: ' read(*,*) C write(*,*)'Nome do arquivo de saida de dados: ' read(*,*) file_out ! Calculo das raizes: DELTA=B*B-4.*A*C if (DELTA.GE.0.) then ! Caso 1: razes reais X1=(-1.0*B+SQRT(DELTA))/(2.0*A) X2=(-1.0*B-SQRT(DELTA))/(2.0*A) open(unit=10, file=file_out, status='unknown') write(10,*) 'CLCULO DAS RAIZES DE UMA EQUAO DE 2a ORDEM: ' write(10,*) write(10,*) 'COEFICIENTE QUADRTICO :',A write(10,*) 'COEFICIENTE LINEAR :',B write(10,*) 'COEFICIENTE INDEPENDENTE:',C write(10,50)'PRIMEIRA RAIZ - X1 :',X1 write(10,50)'SEGUNDA RAIZ - X2 :',X2 else ! Caso 2: razes complexas Z1=(CMPLX(-1.0*B)-CSQRT(CMPLX(DELTA)))/(CMPLX(2.0*A)) Z2=(CMPLX(-1.0*B)+CSQRT(CMPLX(DELTA)))/(CMPLX(2.0*A)) open(unit=10, file=file_out, status='unknown') write(10,*) 'CLCULO DAS RAIZES DE UMA EQUAO DE 2a ORDEM: ' write(10,*) write(10,*) 'COEFICIENTE QUADRTICO :',A write(10,*) 'COEFICIENTE LINEAR :',B write(10,*) 'COEFICIENTE INDEPENDENTE:',C write(10,100)'PRIMEIRA RAIZ - Z1 :',Z1 write(10,100)'SEGUNDA RAIZ - Z2 :',Z2 endif 50 format(1X,A25,2X,F10.6) 100 format(1X,A25,2X,'(',F10.6,',',F10.6,')') end program

  • Mtodos Computacionais / 1 Semestre de 2005 21

    Arquivos de Sada de Dados: 1. ( 2 raizes reais diferentes) CLCULO DAS RAIZES DE UMA EQUAO DE 2a ORDEM: COEFICIENTE QUADRTICO : 2.000000 COEFICIENTE LINEAR : 3.000000 COEFICIENTE INDEPENDENTE: 1.000000 PRIMEIRA RAIZ - X1 : -.500000 SEGUNDA RAIZ - X2 : -1.000000 2. ( 2 raizes reais iguais ) CLCULO DAS RAIZES DE UMA EQUAO DE 2a ORDEM: COEFICIENTE QUADRTICO : 1.000000 COEFICIENTE LINEAR : -4.000000 COEFICIENTE INDEPENDENTE: 4.000000 PRIMEIRA RAIZ - X1 : 2.000000 SEGUNDA RAIZ - X2 : 2.000000 3. ( 2 raizes complexas ) CLCULO DAS RAIZES DE UMA EQUAO DE 2a ORDEM: COEFICIENTE QUADRTICO : 2.000000 COEFICIENTE LINEAR : 2.000000 COEFICIENTE INDEPENDENTE: 2.000000 PRIMEIRA RAIZ - Z1 : ( -.500000, -.866025) SEGUNDA RAIZ - Z2 : ( -.500000, .866025) __________________________________________________________________________________________ program exercise_13 ! Objetivo: Escrever um programa que leia os comprimentos dos trs lados a,b e c de um ! paraleleppedo, calcule e escreva o valor da sua diagonal e do seu volume: ! Volume = a*b*c e Diagonal = sqrt(sqrt(a^2+b^2)+c^2) ! Observao: Utilizao de funes (function) ! Declarao de variveis: real a,b,c,d,vol ! Entrada de Dados; write(*,*)'Entrar com os comprimentos dos lados (a,b,c):' read (*,*) a,b,c ! Clculo do volume e diagonal do paraleleppedo: vol = volume(a,b,c) d = hipotenusa(hipotenusa(a,b),c) write(*,*) 'Volume = ',vol write(*,*) 'Diagonal = ',d contains function volume(x,y,z) real x,y,z,volume volume =x*y*z end function volume function hipotenusa(x,y) real x,y,hipotenusa hipotenusa =sqrt(x**2+y**2) end function hipotenusa end program __________________________________________________________________________________________

  • Mtodos Computacionais / 1 Semestre de 2005 22

    program exercise_14 ! Objetivo: Escrever um programa que calcule a distncia entre dois pontos no espao, ! sendo fornecidas as coordenadas X1,Y1,Z1 e X2,Y2,Z2. ! Observao: Utilizao de funes (function) ! Declarao de variveis: real x1,y1,z1,x2,y2,z2,dist ! Entrada de Dados; write(*,*)'Entrar com as coordenadas X1,Y1 e Z1 do primeiro ponto:' read (*,*) x1,y1,z1 write(*,*)'Entrar com as coordenadas X2,Y2 e Z2 do segundo ponto:' read (*,*) x2,y2,z2 ! Clculo da distncia entre os pontos no espao: dist = distance(x1,y1,z1,x2,y2,z2) write(*,*) 'Distancia entre os pontos = ',dist contains function distance(x1,y1,z1,x2,y2,z2) real x1,y1,z1,x2,y2,z2,distance distance =sqrt((x2-x1)**2+(y2-y1)**2+(z2-z1)**2) end function distance end program __________________________________________________________________________________________ program exercise_15 ! Objetivo: Clculo do fatorial utilizando-se sub-rotinas (subroutine) ! fatorial(n) = n! = 1*2*3*...*n ! Declarao de variveis: real*8 fac_n integer n ! Clculo do fatorial de 1,2,...,10: write(*,*)' n fatorial(n)' do n=1,10 call factorial(n,fac_n) write(*,10)n,fac_n 10 format(i3,3x,f10.2) enddo contains subroutine factorial(n,fac_n) real*8 fac_n integer n fac_n=1 do i=2,n fac_n=i*fac_n enddo end subroutine factorial end program __________________________________________________________________________________________

  • Mtodos Computacionais / 1 Semestre de 2005 23

    program exercise_16 ! Objetivo: Escrever um programa que calcule a funo: ! exp(x)=1+x+(x^2/2!)+(x^3/3!)+... ! Observao: Na funo acima deve-se incluir apenas os termos maiores que tol=1.0E0-6. ! Imprima os resultados e compare com a funo interna exp ! Declarao de variveis: integer i real*8 x,fexp,tol,parcela character*15 file_out ! Entrada de dados: write(*,*)'Calculo da funcao F=exp(x)' write(*,*) write(*,*)'Valor de x: ' read (*,*) x write(*,*)'Nome do arquivo de saida de dados (Max=15char): ' read (*,*) file_out ! Clculo da funo exponencial de x: tol = 1.0e-06 ! tolerncial fexp = 0.0d0 ! inicializar a funo parcela = 1.0d0 ! primeira parcela i = 0 do while (parcela>tol) fexp=fexp+parcela i=i+1 parcela=(x**i)/fact(i) enddo ! Imprimir dados de sada: open (unit=10, file=file_out, status='unknown') write(10,*)'Valor da funcao exponencial de X: ' write(10,*)'----------------------------------------' write(10,*) write(10,*)'Valor de x = ', x write(10,*)'F(x)=1+x+(x^2/2!)+(x^3/3!)+... = ',fexp write(10,*)'F(x)=exp(x) = ',exp(x) contains function fact(n) integer n,j real*8 fact,temp temp=1 do j=2,n temp=temp*j enddo fact=temp end function fact end program Arquivo de sada de dados (exercise_16.out): Valor da funcao exponencial de X: ---------------------------------------- Valor de x = 5.000000000000000 F(x)=1+x+(x^2/2!)+(x^3/3!)+... = 148.413158521647700 F(x)=exp(x) = 148.413159102576600 __________________________________________________________________________________________

  • Mtodos Computacionais / 1 Semestre de 2005 24

    program exercise_17 ! Objetivo: Dados dois nmeros distintos,coloc-los em ordem crescente ! Declarao de variveis: real*8 A,B ! Entrada de dados: write(*,*) 'Entrar com os valores de A e B:' read (*,*) A,B write(*,10)A,B 10 format(/' Ordem original dos numeros: ',/,f10.2,/,f10.2) ! Colocar nmeros em ordem crescente: if (A>B) then call trocar(A,B) endif write(*,20)A,B 20 format(' Numeros em ordem crescente: ',/,f10.2,/,f10.2) contains subroutine trocar(A,B) real*8 A,B,aux aux = A A = B B = aux end subroutine trocar end program __________________________________________________________________________________________ program exercise_18 ! Objetivo: Encontrar uma das raizes de uma funo f(x)=0 usando o mtodo de Newton ! Mtodo de Newton: x = x-f(x)/df(x) ! Declarao de variveis; implicit none integer :: its = 0 ! contador de iteraes integer :: maxits = 20 ! nmero mximo de iteraes logical :: converged = .false. ! indicador de convergncia real*8 :: toler = 1.0e-06 ! tolerncia real*8 :: x = 2.0d0 ! chute inicial ! Determinao da raiz da equao: write(*,*)' x f(x) ' write(*,*)'-----------------------------------------------------' do while (.not.converged.and.its

  • Mtodos Computacionais / 1 Semestre de 2005 25

    contains function f(x) ! Funo qualquer escolhida pelo usurio f(x) = x^3+x-d real*8 f,x f=x**3+x-3 end function function df(x) ! Derivada da funo: df(x) = 3*x^2+1 real*8 df,x df = 3*x**2+1 end function df end program __________________________________________________________________________________________ program exercise_19 ! Objetivo: Calcular a mdia e o desvio padro de uma srie de nmeros ! Declarao de Variveis: integer i,n real std,media,x(100) character*15 file_in ! Entrada de Dados: write(*,*)'Nome do arquivo de entrada de dados (Max=15Char): ' read (*,*) file_in open (unit=10, file=file_in, status='unknown') media=0.0 std =0.0 read (10,*)n do i=1,n read(10,*)x(i) media=media+x(i) enddo ! Clculo da Mdia e Desvio Padro: media = media/n do i=1,n std=std+(x(i)-media)**2 enddo std=sqrt(std/(n-1)) write(*,*)'Valor Medio = ',media write(*,*)'Desvio Padrao = ',std end program __________________________________________________________________________________________ program exercise_20 ! Objetivo: Calcular a mdia e o desvio padro de uma srie de nmeros. ! Usar subrotinas e passar arranjo usando argumentos. ! Declarao de Variveis: integer i,n real std,media,x(100) character*15 file_in ! Entrada de Dados: write(*,*)'Nome do arquivo de entrada de dados (Max=15Char): ' read (*,*) file_in open (unit=10, file=file_in, status='unknown')

  • Mtodos Computacionais / 1 Semestre de 2005 26

    read (10,*)n do i=1,n read(10,*)x(i) enddo ! Chamar subrotina e imprimir resultados: call stats(x,n,media,std) write(*,*)'Valor Medio = ',media write(*,*)'Desvio Padrao = ',std contains ! Subrotina Stats: subroutine stats(x,n,media,std) ! passagem de argumentos real std,media,x(100) ! variveis privativas da subrotina (private) integer i,n media=0.0 std =0.0 do i=1,n media=media+x(i) enddo media = media/n do i=1,n std=std+(x(i)-media)**2 enddo std=sqrt(std/(n-1)) end subroutine stats end program __________________________________________________________________________________________ program exercise_21 ! Objetivo: Calcular a mdia e o desvio padro de uma srie de nmeros. ! Usar subrotinas e passar arranjo usando argumentos. ! Usar alocao dinmica para definir o vetor contendo os nmeros. ! Declarao de Variveis: integer i,n real std,media character*15 file_in real,dimension(:), allocatable::x ! Importante: declarao de varivel sem dimenso definida ! Entrada de Dados: write(*,*)'Nome do arquivo de entrada de dados (Max=15Char): ' read (*,*) file_in open (unit=10, file=file_in, status='unknown') read (10,*)n allocate (x(n)) ! definir dimenso do vetor do i=1,n read(10,*)x(i) enddo ! Chamar subrotina e imprimir resultados: ! Obs: sempre definir a dimenso do vetor ou matriz antes de passar para subrotina. call stats(x,n,media,std) write(*,*)'Valor Medio = ',media write(*,*)'Desvio Padrao = ',std contains

  • Mtodos Computacionais / 1 Semestre de 2005 27

    ! Subrotina Stats: subroutine stats(x,n,media,std) ! passagem de argumentos real std,media ! variveis privativas da subrotina (private) integer i,n real, dimension(:) :: x ! vetor alocado dinamicamente no programa principal media=0.0 std =0.0 do i=1,n media=media+x(i) enddo media = media/n do i=1,n std=std+(x(i)-media)**2 enddo std=sqrt(std/(n-1)) end subroutine stats end program __________________________________________________________________________________________ program exercise_22 ! Objetivo: Testar alocao dinmica de matrizes: ! Declarao de Variveis: integer tamanho,n real, dimension(:), allocatable::x ! Testando alocao dinmica: tamanho = size(x) write(*,*)' Tamanho (antes de definir dimensao) = ',tamanho open (unit=10, file='exercise_22.dat', status='unknown') read (10,*)n allocate(x(n)) do i=1,n read(10,*)x(i) enddo tamanho=size(x) write(*,*)' Tamanho (depois de definir dimensao) = ',tamanho write(*,*)' Vetor x: ' do i=1,n write(*,*)x(i) enddo end program __________________________________________________________________________________________ program exercise_23 ! Objetivo: Multiplicao de Matrizes: A(n,m)*B(m,k)=C(n,k),utilizando diferentes tcnicas ! Declarao de Variveis: integer i,j,n,m,k integer in,io real, dimension(:,:), allocatable::A,B,C character*15 file_in,file_out

  • Mtodos Computacionais / 1 Semestre de 2005 28

    ! Canais de Entrada e Sada de Dados: in = 10 io = 20 ! Entrada de Dados: write(*,*)'Nome do arquivo de entrada de dados (Max=15char): ' read (*,*) file_in open (in, file=file_in, status='unknown') write(*,*)'Nome do arquivo de sada de dados (Max=15char): ' read (*,*) file_out open (io, file=file_out, status='unknown') read (in,*) n,m,k allocate (A(n,m),B(m,k),C(n,k)) do i=1,n read(in,*)(A(i,j),j=1,m) enddo do i=1,m read(in,*)(B(i,j),j=1,k) enddo write(io,*)'Matriz A: ' do i=1,n write(io,*)(A(i,j),j=1,m) enddo write(io,*)'Matriz B: ' do i=1,m write(io,*)(B(i,j),j=1,k) enddo ! Testar possibilidade de multiplicao: t1=size(A,2) ! nmero de colunas da matriz A t2=size(B,1) ! nmero de linhas da matriz B if (t1/=t2) then write(*,*)' Impossibilidade de calcular C=A*B - Ajustar Dimensoes' stop endif ! Multiplicao de matrizes - verso F77: call prodF77(A,B,C) write(io,*)'Matriz C=A*B utilizando prodF77: ' do i=1,n write(io,*)(C(i,j),j=1,k) enddo ! Multiplicao de matrizes - verso F90: call prodF90(A,B,C) write(io,*)'Matriz C=A*B utilizando prodF90: ' do i=1,n write(io,*)(C(i,j),j=1,k) enddo ! Multiplicao de matrizes - comando Matmul: call prod_function(A,B,C) write(io,*)'Matriz C=A*B utilizando prod_function: ' do i=1,n write(io,*)(C(i,j),j=1,k) enddo contains

  • Mtodos Computacionais / 1 Semestre de 2005 29

    subroutine prodF77(A,B,C) real, dimension(:,:) :: A,B,C integer i,j,l do i=1,n do j=1,k C(i,j)=0.0 do l=1,m C(i,j)=C(i,j)+A(i,l)*B(l,j) enddo enddo enddo end subroutine prodF77 subroutine prodF90(A,B,C) real, dimension(:,:) :: A,B,C integer i,j C(1:n,1:k)= 0.0 do i=1,n do j=1,k C(i,j)=sum(A(i,1:m)*B(1:m,j)) enddo enddo end subroutine prodF90 subroutine prod_function(A,B,C) real, dimension(:,:) :: A,B,C C=Matmul(A,B) end subroutine prod_function end program Arquivo de Entrada de Dados (exercise_23.out) 3 3 3 ! n,m,k 1.0 2.0 3.0 2.0 3.0 4.0 3.0 4.0 5.0 1.0 1.0 1.0 2.0 2.0 2.0 3.0 3.0 3.0 Arquivo de Sada de Dados (exercise_23.out) Matriz A: 1.000000 2.000000 3.000000 2.000000 3.000000 4.000000 3.000000 4.000000 5.000000 Matriz B: 1.000000 1.000000 1.000000 2.000000 2.000000 2.000000 3.000000 3.000000 3.000000 Matriz C=A*B utilizando prodF77: 14.000000 14.000000 14.000000 20.000000 20.000000 20.000000 26.000000 26.000000 26.000000 Matriz C=A*B utilizando prodF90: 14.000000 14.000000 14.000000 20.000000 20.000000 20.000000 26.000000 26.000000 26.000000 Matriz C=A*B utilizando prod_function: 14.000000 14.000000 14.000000 20.000000 20.000000 20.000000 26.000000 26.000000 26.000000

  • Mtodos Computacionais / 1 Semestre de 2005 30

    Arquivo de Entrada de Dados (teste_23.out) (Matrizes no quadradas) 3 2 3 ! n,m,k 1.0 2.0 2.0 3.0 3.0 4.0 1.0 1.0 1.0 2.0 2.0 2.0 Arquivo de Sada de Dados (teste_23.out) (Matrizes no quadradas) Matriz A: 1.000000 2.000000 2.000000 3.000000 3.000000 4.000000 Matriz B: 1.000000 1.000000 1.000000 2.000000 2.000000 2.000000 Matriz C=A*B utilizando prodF77: 5.000000 5.000000 5.000000 8.000000 8.000000 8.000000 11.000000 11.000000 11.000000 Matriz C=A*B utilizando prodF90: 5.000000 5.000000 5.000000 8.000000 8.000000 8.000000 11.000000 11.000000 11.000000 Matriz C=A*B utilizando prod_function: 5.000000 5.000000 5.000000 8.000000 8.000000 8.000000 11.000000 11.000000 11.000000 __________________________________________________________________________________________

  • Mtodos Computacionais / 1 Semestre de 2005 31

    ! ******************************************************* ! Programa: Matrix ! Operaes com vetores e matrizes no F90 ! Author: Renato Csar Gavazza Menin ! ******************************************************* program matrix implicit double precision(a-h,o-z) implicit integer (i-n) real*8 A(3),B(3),Soma(3),Subt(3) real*8 MA(3,3),MB(3,3),MS(3,3),MT(3,3),MABST(6,6) real*8 aM(3,3),MM(3,3),MABT(3,3),matAB(3,3) real*8 Config_C0(3,10),E_0(3,3) real*8 V1(3),V2(3) real*8 MC(3,4),V3(4) real*8 PV(3),norma,m1,m2,m3,m4,m5,m6 integer io character*15 fileout io = 20 write(*,*)'Program: Matrix ' write(*,*)'--------------------------------' write(*,*) write(*,*)'Output File Name ? (Max 15 Char)' read (*,*) fileout open (io,file=fileout,status='unknown') write(*,*) ! 1. Soma e subtrao de vetores: ! --------------------------------------- ! Vetor A: A(1)=1 A(2)=2 A(3)=3 ! Vetor B: B(1)=10 B(2)=20 b(3)=30 Soma = A + B Subt = A - B write(io,*)'Vetor Soma: ' do i=1,3 write(io,*)Soma(i) enddo write(io,*)'Vetor Subt: ' do i=1,3 write(io,*)Subt(i) enddo ! 2. Transposio e soma de matrizes: ! ------------------------------------------- ! Matriz MA: MA(1,1)=1.0 MA(1,2)=2.0 MA(1,3)=3.0 MA(2,1)=4.0 MA(2,2)=5.0 MA(2,3)=6.0 MA(3,1)=7.0 MA(3,2)=8.0 MA(3,3)=9.0 ! Matriz MB: MB(1,1)=1.0 MB(1,2)=0.0 MB(1,3)=0.0 MB(2,1)=0.0 MB(2,2)=1.0 MB(2,3)=0.0 MB(3,1)=0.0 MB(3,2)=0.0 MB(3,3)=1.0 ! Matriz Transposta: MT=Transpose(MA) write(io,*)'Matriz Transposta: ' do i=1,3 write(io,*)(MT(i,j),j=1,3) enddo

  • Mtodos Computacionais / 1 Semestre de 2005 32

    ! Soma de Matrizes Quadradas: MS=MA+MB write(io,*)'Soma de Matrizes: ' do i=1,3 write(io,*)(MS(i,j),j=1,3) enddo ! 3. Composio de matrizes: ! --------------------------------- MABST(1:3,1:3)=MA MABST(1:3,4:6)=MB MABST(4:6,1:3)=MS MABST(4:6,4:6)=MT write(io,*)'Matriz MABST: ' do i=1,6 write(io,10)(MABST(i,j),j=1,6) 10 format(f4.1,X,f4.1,X,f4.1,X,f4.1,X,f4.1,X,f4.1) enddo ! Configurao Inicial: do i=1,3 do j=1,10 Config_C0(i,j)=i+j enddo enddo E_0(1:3,1)=Config_C0(1,1:3) E_0(1:3,2)=Config_C0(1,4:6) E_0(1:3,3)=Config_C0(1,7:9) write(io,*)'Matriz Config_C0: ' do i=1,3 write(io,15)(E_0(i,j),j=1,3) 15 format(f4.1,X,f4.1,X,f4.1) enddo ! 4. Multiplicao de matrizes: ! ------------------------------------ ! 4.1 Multiplicao de Matriz Quadrada por Escalar: aM=2.0*MA write(io,*)'Multiplicar matriz por escalar: ' do i=1,3 write(io,*)(aM(i,j),j=1,3) enddo ! 4.2 Multiplicao de matrizes - Funo Interna "MATMUL" MM=MATMUL(MA,MB) write(io,*)'Multiplicar matrizes - MA*MB: ' do i=1,3 write(io,*)(MM(i,j),j=1,3) enddo MABT=MATMUL(MM,MT) write(io,*)'Multiplicar matrizes - MA*MB*MT: ' do i=1,3 write(io,*)(MABT(i,j),j=1,3) enddo MM=MATMUL(MM,MT) write(io,*)'Multiplicar matrizes - MM=MA*MB*MT: ' do i=1,3 write(io,*)(MM(i,j),j=1,3) enddo ! 4.3 Multiplicao de Matriz e Vetor: ! Obs: [V1]3x1 = [MA]3x3 * [A]3x1 V1=MATMUL(MA,A) write(io,*)'Multiplicar matriz e vetor: ' do i=1,3 write(io,*)V1(i) enddo ! 4.4 Multiplicao de Vetor e Matriz: ! Obs: [V2]1x3 = [A]1x3 * [MA]3x3 V2=MATMUL(A,MA) write(io,*)'Multiplicar vetor e matriz: ' do i=1,3 write(io,*)V2(i) enddo

  • Mtodos Computacionais / 1 Semestre de 2005 33

    ! 4.5 Multiplicao de Vetor e Matriz No Quadrada: ! Obs: [V3]1x4 = [A]1x3 * [MC]3x4 MC(1:3,1:3)=MA MC(1:3,4)=A V3=MATMUL(A,MC) write(io,*)'Multiplication of vector by non quadratic matrix: ' do i=1,4 write(io,*)V3(i) enddo ! 5. Subrotina para o clculo do produto vetorial: ! -------------------------------------------------------- call cross(A,V1,PV) write(io,*)'Produto Vetorial - Subrotina Cross: ' do i=1,3 write(io,*)PV(i) enddo ! 6. Funo para o clculo da norma do vetor: ! ------------------------------------------- norma=norm(A) write(io,*)'Norma de Vetor - Function Norm: ' write(io,*)'Norm = ',norma ! 7. Encontrar o valor mximo de uma sequncia: ! -------------------------------------------- write(io,*)'Encontrar valor maximo de sequencia: ' m1=max(1,2,3) m2=max(-1,-2,-3) m3=max(-3,0,1) m4=max(1.1,3.5,5.5) m5=max(-3.5,0.0,2.0) m6=max(MA(1,1),MA(1,2),MA(1,3)) write(io,*)'m1=max(1,2,3) = ',m1 write(io,*)'m2=max(-1,-2,-3) = ',m2 write(io,*)'m3=max(-3,0,1) = ',m3 write(io,*)'m4=max(1.1,3.5,5.5) = ',m4 write(io,*)'m5=max(-3.5,0,2) = ',m5 write(io,*)'m6=max(MA(1,1),MA(1,2),MA(1,3))= ',m6 ! 8. Simetrizao de uma matriz: ! -------------------------------------- MA=MA+transpose(MA) MA=0.5*MA write(io,*)'[MA] = ([MA]+[MA]t)/2: ' do i=1,3 write(io,*)(MA(i,j),j=1,3) enddo ! 9. Multiplicao de matriz e transposta: ! ----------------------------------------------- ! Reestabelecer Matriz MA: MA(1,1)=1.0 MA(1,2)=2.0 MA(1,3)=3.0 MA(2,1)=4.0 MA(2,2)=5.0 MA(2,3)=6.0 MA(3,1)=7.0 MA(3,2)=8.0 MA(3,3)=9.0 MA=Matmul(MA,transpose(MA)) write(io,*)'[MA] = [MA]*transpose[MA]: ' do i=1,3 write(io,*)(MA(i,j),j=1,3) enddo ! 10. Multiplicao de vetor(3,1) e vetor(1,3): ! ----------------------------------------------------- matAB=vecmul(A,B) write(io,*)'[matAB] = vecmul(A,B): ' do i=1,3 write(io,*)(matAB(i,j),j=1,3) enddo

  • Mtodos Computacionais / 1 Semestre de 2005 34

    CONTAINS Subroutine cross(A,B,PV) real*8 A(3),B(3),PV(3) PV(1)=A(2)*B(3)-A(3)*B(2) PV(2)=A(3)*B(1)-A(1)*B(3) PV(3)=A(1)*B(2)-A(2)*B(1) end subroutine cross Function norm(V) real*8 V(3),norm norm=dsqrt(V(1)*V(1)+V(2)*V(2)+V(3)*V(3)) end function norm Function vecmul(A,B) real*8 A(3),B(3),mat(3,3),vecmul(3,3) integer i,j do i=1,3 do j=1,3 mat(i,j)=A(i)*B(j) enddo enddo vecmul=mat end function vecmul End ! Trmino do Programa Principal Arquivo de Sada de Dados (matrix.out): Vetor Soma: 11.000000000000000 22.000000000000000 33.000000000000000 Vetor Subt: -9.000000000000000 -18.000000000000000 -27.000000000000000 Matriz Transposta: 1.000000000000000 4.000000000000000 7.000000000000000 2.000000000000000 5.000000000000000 8.000000000000000 3.000000000000000 6.000000000000000 9.000000000000000 Soma de Matrizes: 2.000000000000000 2.000000000000000 3.000000000000000 4.000000000000000 6.000000000000000 6.000000000000000 7.000000000000000 8.000000000000000 10.000000000000000 Matriz MABST: 1.0 2.0 3.0 1.0 .0 .0 4.0 5.0 6.0 .0 1.0 .0 7.0 8.0 9.0 .0 .0 1.0 2.0 2.0 3.0 1.0 4.0 7.0 4.0 6.0 6.0 2.0 5.0 8.0 7.0 8.0 10.0 3.0 6.0 9.0 Matriz Config_C0: 2.0 5.0 8.0 3.0 6.0 9.0 4.0 7.0 10.0 Multiplicar matriz por escalar: 2.000000000000000 4.000000000000000 6.000000000000000 8.000000000000000 10.000000000000000 12.000000000000000 14.000000000000000 16.000000000000000 18.000000000000000 Multiplicar matrizes - MA*MB: 1.000000000000000 2.000000000000000 3.000000000000000 4.000000000000000 5.000000000000000 6.000000000000000 7.000000000000000 8.000000000000000 9.000000000000000 Multiplicar matrizes - MA*MB*MT: 14.000000000000000 32.000000000000000 50.000000000000000 32.000000000000000 77.000000000000000 122.000000000000000 50.000000000000000 122.000000000000000 194.000000000000000 Multiplicar matrizes - MM=MA*MB*MT: 14.000000000000000 32.000000000000000 50.000000000000000 32.000000000000000 77.000000000000000 122.000000000000000 50.000000000000000 122.000000000000000 194.000000000000000 Multiplicar matriz e vetor: 14.000000000000000 32.000000000000000 50.000000000000000

  • Mtodos Computacionais / 1 Semestre de 2005 35

    Multiplicar vetor e matriz: 30.000000000000000 36.000000000000000 42.000000000000000 Multiplication of vector by non quadratic matrix: 30.000000000000000 36.000000000000000 42.000000000000000 14.000000000000000 Produto Vetorial - Subrotina Cross: 4.000000000000000 -8.000000000000000 4.000000000000000 Norma de Vetor - Function Norm: Norm = 3.741657386773941 Encontrar valor maximo de sequencia: m1=max(1,2,3) = 3.000000000000000 m2=max(-1,-2,-3) = -1.000000000000000 m3=max(-3,0,1) = 1.000000000000000 m4=max(1.1,3.5,5.5)= 5.500000000000000 m5=max(-3.5,0,2) = 2.000000000000000 m6=max(MA(1,1),MA(1,2),MA(1,3))= 3.000000000000000 [MA] = ([MA]+[MA]t)/2: 1.000000000000000 3.000000000000000 5.000000000000000 3.000000000000000 5.000000000000000 7.000000000000000 5.000000000000000 7.000000000000000 9.000000000000000 [MA] = [MA]*transpose[MA]: 14.000000000000000 32.000000000000000 50.000000000000000 32.000000000000000 77.000000000000000 122.000000000000000 50.000000000000000 122.000000000000000 194.000000000000000 [matAB] = vecmul(A,B): 10.000000000000000 20.000000000000000 30.000000000000000 20.000000000000000 40.000000000000000 60.000000000000000 30.000000000000000 60.000000000000000 90.000000000000000 __________________________________________________________________________________________ REFERNCIAS BIBLIOGRFICAS:

    H.M. Deitel & P.J.Deitel, Como programar em C, Livros Tcnicos e Cientficos Editora, S.A., Rio de Janeiro , 1994.

    S.J. Chapman, Fortran 90/95 for Scientists and Engineers, WCB/McGraw-Hill, USA, 1998. J. Liberty, SAMS Teach Yourself C++ in 21 Days, Fourth Edition, SAMS Publishing, Indiana / USA,

    2001. A.Huerta, J. Sarrate, A.R. Ferran, Mtodos numricos, Introducion, aplicaciones y programacion,

    Universiat Politcnica de Catalunya, Barcelona, 1998. H. Farrer, C.G. Becker, E.C. Faria, Fortran Estruturado, Editora Guanabara Koogan, Rio de Janeiro,

    1992. P. W. Partridge, Notas de aula do curso: Mtodos Computacionais / 1 Semestre de 2002, Braslia,

    2002.