Fortran Apostila

Download Fortran Apostila

Post on 21-Oct-2015

6 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

<ul><li><p>Introduo ao Fortran 90 </p><p>CENAPAD-SP </p></li><li><p>2</p><p>NDICE INTRODUO 1-HISTRIA _______ 04 2-FORTRAN 77 05 3-FORTRAN 90 06 ELEMENTOS DO FORTRAN 90 4-EXEMPLO DE PROGRAMA 07 5-RECOMENDAES DE CODIFICAO 08 6-CARACTERSTICAS DE CODIFICAO 09 7-REGRAS DE CODIFICAO 10 8-COMPILAO NO AMBIENTE CENAPAD-SP 11 9-EXERCCIO 1-Compilao e Execuo _____ ______________________12 10-EXERCCIO 2- Reestruturao de programa 13 11-ESTRUTURA DE PROGRAMAS _____________ ___ _______14 12-TIPOS DE DADOS _______14 13-CONSTANTES _______15 14-TIPO IMPLCITO _______15 15-DECLARAO NUMRICA E LGICA _______16 16 - DECLARAO CARACTERE _______16 17-DECLARAO DE CONSTANTES _______17 18-INICIALIZAO DE VARIVEIS _______17 19-EXERCCIO 3 - Declarao de Variveis _______18 20-EXPRESSES _______19 21-Operador de ATRIBUIO _______19 22-Operadores NUMRICOS _______20 23-Precedncia de Operadores _______20 24-Operadores RELACIONAIS _______21 25-Operadores LGICOS _______21 26-Operador CARACTERE _______22 27-EXERCCIO 4 B Expresses _______23 CONSTRUES DE CONTROLE DE EXECUO 28-COMANDOS DE CONTROLE DE FLUXO _______24 29-Comando IF _______25 30-Comando IF...THEN...END IF _______26 31-Comando IF...THEN...ELSE...END IF _______27 32-Comando IF...THEN...ELSEIF...END IF _______28 33-Comando IF...THEN...ELSEIF...END IF Identificado _______29 34-EXERCCIO 5 - Comando IF 30 35-Comando DOBEXIT-END DO ALOOP@ Condicional _______31 36-Comando DOBCYCLE-EXIT-END DO ALOOP@ Cclico Condicional _______31 37-ALOOPs@ Identificados _______32 38-Comando DO-WHILE _______32 39-Comando DO iterativo _______32 40-Comando SELECT-CASE _______33 41-DIVISO POR INTEIROS _______33 42-EXERCCIO 6 B SELECT CAS E _______34 43-PROCEDIMENTOS INTRNSICOS _______35 </p></li><li><p>3</p><p>NDICE </p><p>44-Funes de CONVERSO 35 45-Funes MATEMTICAS 36 46-Funes NUMRICAS 36 47-Funes CARACTERES 36 48-EXERCCIO 7 B Funes Matemticas 37 49-Comando PRINT 38 50-Comando READ 38 </p><p> MATRIZES 51-DEFINIO DE MATRIZES 39 52-DECLARAO DE MATRIZES 40 53-SNTAXE DE MATRIZES 41 54-SECES DE MATRIZES 41 55-IMPRESSO E LEITURA DE MATRIZES 42 56-FUNES DE MATRIZES 43 57-ALOCAO DE MATRIZES 44 58-EXERCCIO 8 B DEFINIO DE MATRIZES 45 59-EXERCCIO 9 B FUNES DE MATRIZES 46 60-EXERCCIO 10 B USO DE MATRIZES 46 </p><p> SECES PRINCIPAIS DE PROGRAMAS 61-SECES DE UM PROGRAMA FORTRAN 47 62-PROGRAMA PRINCIPAL 48 63-PROCEDIMENTOS 49 64-Procedimentos: SUBROUTINE 49 65-Procedimentos: FUNCTION 50 66-EXERCCIO 11 B SUBROTINA 51 67-EXERCCIO 12 B FUNO 51 68-EXERCCIO 13 B PROCEDIMENTOS 52 69-SECO DE PROGRAMA: MODULE 53 70-EXERCCIO 14 B DEFINIO DE UM MDULO 54 71-EXERCCIO 15 B USO DE UM MDULO 54 </p><p> ENTRADA E SADA 72-ENTRADA / SADA 55 73-Comando OPEN 56 74-Comando READ 57 75-Comando WRITE 58 76-Comando FORMAT/FMT= 59 77-Descritores de Formatos 59 78-Outros comandos de I/O 59 79-Comando DATA 60 80-EXERCICIOS 15 B I/O 61 81-EXERCICIOS 16 B FORMATAO 61 82-REFERNCIAS 62 </p></li><li><p>4</p><p>1-HISTRIA IBM Mathematical FORmula TRANslation System; Elaborado especificamente para aplicaes cientficas; Primeiro compilador considerado High-Level Idealizado por John Backus 1957; Primeiro Padro Comercivel em 1972: Fortran 66; </p><p>Houve diversas verses de compiladores, similares ao Fortran, durante a dcada de 60, o que forou a necessidade de se padronizar o software. </p><p> Atualizado em 1980 Fortran 77; </p><p>Verso amplamente divulgada e ut ilizada no mundo inteiro pelas reas cientficas. Atualizado em 1991 ~ 12 anos Fortran 90; </p><p>O planejamento para a atualizao do Fortran iniciou-se no incio da dcada de 80, mas seu desenvolvimento levou muito tempo devido ao compromisso de manter o Fortran como uma das linguagens cientficas mais eficientes, superior ao PASCAL, ADA e ALGOL. Os recursos existentes no Fortran 90 se equiparam aos existentes no C (Alocao dinmica de memria, apontadores e orientao ao objeto). </p><p> High Performance Fortran HPF Fortran 90 para ambientes com memria distribuda; Atualmente Fortran 95; Padronizado por ANSI X3 e ISO/IEC JTC1/SC22/WG5 </p></li><li><p>5</p><p>2-FORTRAN 77 O Fortran77 est muito obsoleto em relao s linguagens atuais e aos recursos existentes Formato fixo: </p><p> Linhas da posio 7 a 72; Somente letras maisculas; Nomes at 6 caracteres. </p><p> Impossibilidade de representar operaes paralelas intrnsecas; </p><p> uma situao crtica, pois o Fortran considerado como uma linguagem de alta performance, no entanto, at o padro 77 no existia nenhuma instruo que permitisse o paralelismo, como compartilhamento de endereos de memria. </p><p> No possvel a alocao de memria dinmica; </p><p>No Fortran77, o programador obrigado a declarar vetores com o maior tamanho possvel para reservar memria durante a compilao. </p><p> No possui representao numrica portvel; </p><p>A preciso de campos numricos variava de uma mquina para outra, tornando o cdigo no portvel. </p><p> No possui definio de tipo de dado pelo programador; </p><p>No possvel criar novos formatos a partir dos existentes. No possui recurso explcita; </p><p>No possvel chamar uma funo dentro de outra funo. </p></li><li><p>6</p><p>3-FORTRAN 90 Formato livre: </p><p> 132 caracteres por linha; Maisculas e minsculas; Nomes at 31 caracteres. </p><p> Definio de ARRAYS paralelos; </p><p>Novos recursos na definio de um ARRAY permitem a distribuio de vetores por entre vrios processos que compartilham um ambiente de memria compartilhada. </p><p> Alocao de memria dinmica e apontadores; Definio de tipo de dados (Comando KIND); Recursividade Alm dos recursos descritos acima, vrios outros, melhoraram o Fortran tornando-o mais atual aos recursos existente em outras linguagens de programao : </p><p>- Controle de estruturas : </p><p>o DO...ENDDO o DO...WHILE o SELECT CASE </p><p> - Substituio de comandos: </p><p>o COMMON blocks MODULE o EQUIVALENCE TRANSFER </p><p>- Novos comandos: </p><p>o IMPLICIT NONE </p></li><li><p>7</p><p>4-EXEMPLO DE PROGRAMA MODULE Triangle_Operations IMPLICIT NONE CONTAINS FUNCTION Area(x,y,z) REAL :: Area ! function type REAL, INTENT( IN ) :: x, y, z REAL :: theta, height theta = ACOS((x**2+y**2-z**2)/(2.0*x*y)) height = x*SIN(theta); Area = 0.5*y*height END FUNCTION Area END MODULE Triangle_Operations PROGRAM Triangle USE Triangle_Operations IMPLICIT NONE REAL :: a, b, c, Area PRINT *, 'Welcome, please enter the&amp; lengths of the 3 sides.' READ *, a, b, c PRINT *, 'Triangle''s area: ', Area(a,b,c) END PROGRAM Triangle </p></li><li><p>8</p><p>5-RECOMENDAES DE CODIFICAO Sempre utilize o comando IMPLICT NONE; Comandos, funes intrnsecas e as definidas pelo programador, em maisculas; </p><p>OBS: No obrigatrio! Apenas uma recomendao. Variveis e constantes em minsculas; </p><p>OBS: No obrigatrio! Apenas uma recomendao. Cada comando deve ser colocado por linha; Codifique com recuos; Acrescente comentrios s linhas. </p></li><li><p>9</p><p>6-CARACTERSTICAS DE CODIFICAO 132 caracteres por linha; Alfanumrico: a-z, A-Z, 0-9, _ ! Caractere de incio de comentrio; &amp; Caractere de continuao de linha; ; Caractere de separao de comandos; Smbolos aritmticos: </p><p>+ Adio </p><p>- Subtrao </p><p>* Multiplicao </p><p>/ Diviso </p><p>** Expoente </p></li><li><p>10</p><p>7-REGRAS DE CODIFICAO Brancos no so permitidos: </p><p> Palavras-chave INTEGER :: nome1 Certo INT EGER :: nome1 Errado </p><p> Nomes </p><p>REAL :: valor_total Certo REAL :: valor total Errado </p><p> Brancos so permitidos: </p><p> Entre palavras-chave Entre nomes e palavras-chave </p><p>INTEGER FUNCTION val(x) Certo INTEGERFUNCTION val(x) Errado INTEGER FUNCTIONval(x) Errado </p><p> Nomes de variveis e rotinas: </p><p> Podem ter at 31 caracteres </p><p> Devem comear com letra </p><p>REAL :: a1 Certo REAL :: 1a Errado </p><p> Podem continuar com letras, dgitos ou _ </p><p>CHARACTER :: atoz Certo CHARACTER :: a-z Errado CHARACTER :: a_zCerto </p></li><li><p>11</p><p>8-COMPILAO NO AMBIENTE CENAPAD-SP Ambiente IBM/AIX </p><p> Fortran77: xlf, f77, fort77, g77 extenso: .f , .F </p><p> Fortran90: xlf90, f90 extenso: .f , .f90 </p><p> Fortran95: xlf95 extenso: .f , .f95 </p><p>Na verdade o compilador um s (xlf) , mas com vrios scripts de execuo que possuem as opes de como o compilador deve ser executado, como: </p><p> qlanglvl= Padro de Fortran qsuffix= Sufixo dos programas qfree=yes/no Tipo de formatao </p><p> Ambiente INTEL/Linux </p><p> Fortran77 e 90: ifort extenso: .f , .F , .f90 Opes bsicas de compilao: -o Nome do executvel (Default: a.out); -O, -O1, -O2, -O3 Otimizao do cdigo; -c No gera executvel; -g Gera informaes para depurao; -L Localizao da biblioteca para linkedio; -l Nome da biblioteca; -q32 Cdigo para 32bits (somente para AIX); -q64 Cdigo para 64bits (somente para AIX); Exemplos de compilaes: </p><p>xlf prog1.f -o prog xlf90 cofigo.f -o teste -O3 xlf90 cena.f -c -L/usr/lib - lscalapack ifort salto.f -o salto -O3 -L/home/kusel - lbib1 ifort parceiro.f -o par -g -O </p></li><li><p>12</p><p>9-EXERCCIO 1- Compilao e Execuo 1 Caminhe para o diretrio ~/curso/fortran/ex1.Utilizando um editor de texto, edite o programa abaixo e salve-o com o nome quadsol.f cd ~/curso/fortran/ex1 quadsol.f OBS: Pode ser o editor pico, emacs ou vi PROGRAM QES IMPLICIT NONE INTEGER :: a, b, c, D REAL :: Part_Real, Part_imag PRINT*, ''Entre com os valores de a, b, c'' READ*, a, b, c IF (a /= 0) THEN D = b*b - 4*a*c ! Calculo do discriminante IF (D == 0) THEN ! Uma raiz PRINT*, ''Raiz '', -b/(2.0*a) ELSE IF (D &gt; 0) THEN ! raizes reais PRINT*, ''Raizes so '',(-b+SQRT(REAL(D)))/(2.0*a),&amp; ''e '', (-b-SQRT(REAL(D)))/(2.0*a) ELSE ! raizes complexas Part_Real = -b/(2.0*a) Part_Imag = (SQRT(REAL(-D))/(2.0*a)) PRINT*, ''1a. Raiz'', Prat_Real, ''+'', Part_Imag, ''i'' PRINT*, ''2a. Raiz'', Part_Real, ''-'', Part_Imag, ''i'' END IF ELSE ! a == 0 PRINT*, ''No uma equao quadrtica'' END IF END PROGRAM QES 2. Compile e execute o programa. Verifique a sua execuo para os valores abaixo: </p><p>xlf90 quadsol.f o quadsol O3 ./quadsol (a) a = 1 b = -3 c = 2; (b) a = 1 b = -2 c = 1; (c) a = 1 b = 1 c = 1; (d) a = 0 b = 2 c = 3 3. Copie quadSol.f para novoquadsol.f. : </p><p>cp quadsol.f novoquadsol.f 4. Edite esse novo arquivo e declare uma nova varivel real de nome parte2a. 5. Na seo executvel do cdigo, defina a nova varivel igual ao valor de 1/(2.0*a). parte2a=1/(2.0*a) 6. Aonde aparecer a expresso 1/(2.0*a), substitua pela nova varivel. </p></li><li><p>13</p><p>10-EXERCCIO 2- Reestruturao de programa 1 Caminhe para o diretrio ~/curso/fortran/ex2. Reescreva o programa basic_reform.f de uma maneira que fique mais compreensvel. </p></li><li><p>14</p><p>11-ESTRUTURA DE PROGRAMAS O Fortran possui algumas regras bem definidas para ordem dos comandos: </p><p>1. Cabealho de definio: PROGRAM, FUNCTION, SUBROUTINE, MODULE ou BLOCK DATA; </p><p> S pode haver um nico comando PROGRAM. Pode haver mais de um FUNCTION, SUBROUTINE e MODULE. S pode haver um nico BLOCK DATA </p><p>1. Comandos de Declarao: </p><p> REAL, INTEGER, IMPLICIT, PARAMETER, DATA; 2. Comandos de Execuo: </p><p> IF-ENDIF, DO-ENDDO, comando de atribuio; </p><p>4. Finalizao do programa com o comando END; 12-TIPOS DE DADOS Todo tipo de dado possui um nome, um conjunto vlido de valores, um significado dos valores e um conjunto de operadores. Dado Caractere CHARACTER :: sex CHARACTER(LEN=12) :: nome Dado Boolean LOGICAL :: w Dado Numrico REAL :: alt DOUBLE PRECISION :: pi INTEGER :: id </p></li><li><p>15</p><p>13-CONSTANTES Constante um objeto com valor fixo 12345 Nmero Inteiro </p><p> -6.6E-06 Nmero Real .FALSE. Valor Lgico Curso Fortran Caractere </p><p> Observaes: </p><p> Nmeros Reais possuem ponto decimal ou o smbolo de expoente; </p><p> Nmeros Inteiros no possuem ponto decimal e so representados por uma seqncia de dgitos com o sinal + ou -; </p><p> S existem dois valores Lgicos : .FALSE. e .TRUE.; </p><p> Valores caracteres so delimitados por ou </p><p> 14-TIPO IMPLCITO Variveis no declaradas possuem um tipo implcito de dado: </p><p> Se a primeira letra da varivel comear por I, J, K, L, M ou N, ser definida como Inteiro ; </p><p> Qualquer outra letra ser do tipo Real; </p><p> Tipo de dado implcito potencialmente perigoso e deve ser evitado com a declarao: </p><p> IMPLICIT NONE Exemplo de problema ocorrido no Fortran77: DO 30 I = 1.1000 ... 30 CONTINUE </p></li><li><p>16</p><p>15-DECLARAO NUMRICA E LGICA Com o comando IMPLICIT NONE, todas as variveis devem ser declaradas, da forma: </p><p> [, ] :: [=] Em Fortran90 pode se definir atributos quando se declara uma varivel. Lista de atributos PARAMETER, DIMENSION; :: No obrigatrio, a menos que se especifique um atributo; </p><p> Exemplos: REAL :: x INTEGER :: i, j LOGICAL :: ptr REAL, DIMENSION(10,10) :: y, z INTEGER :: k=4 </p><p> 16 - DECLARAO CARACTERE As declaraes de caracteres so similares s declaraes numricas. Pode-se declarar </p><p>um caractere ou um conjunto de caracteres: [(LEN=)] [, ] :: [=] </p><p> Exemplos: </p><p> CHARACTER(LEN=10) :: nome CAHARCTER :: sexo CHARACTER(LEN=32) :: str CHARACTER(LEN=10), DIMENSION(10,10) :: vetor </p></li><li><p>17</p><p>17-DECLARAO DE CONSTANTES Um valor constante conhecido como parmetro, pode ser definido pelos comandos de </p><p>declarao utilizando o atributo PARAMETER ou pelo prprio comando PARAMETER; </p><p> Exemplos: INTEGER pre Fortran77 </p><p> PARAMETER (pre=252) Fortran77 </p><p> REAL, PARAMETER :: pi=3.14159 Fortran90 </p><p> CHARACTER(LEN=*), PARAMETER :: n1=Paulo, n2=FranciscoFortran90 </p><p> Valores caracteres podem assumir o seu prprio tamanho utilizando-se (LEN=*); Recomenda-se que se utilize a forma padro do Fortran90, com atributos; O atributo PARAMETER deve ser usado, quando se tiver certeza que a varivel s </p><p>poder assumir um nico valor. 18-INICIALIZAO DE VARIVEIS Pode-se atribuir um valor inicial a uma varivel e alter- la no decorrer da execuo. </p><p>Exemplos: REAL :: x, y=1.005 </p><p> INTEGER :: i=5, j=100 </p><p> CHARACTER(LEN=5) :: luz=Amber </p><p> LOGICAL :: a=.TRUE., b=.FALSE. </p><p> REAL, PARAMETER :: pi=3.14159 </p><p> REAL :: radius=3.5 </p><p> REAL :: circo=2*pi*radius (expresso) </p><p> OBS: Em geral, funes...</p></li></ul>