90
WorkEta Introdução ao Fortran 90 Margarete Domingues [email protected] Tips Fortran 90 – p.1/87

Introdução ao Fortran 90 - INPE/LAC - Laboratório …margarete/fortran90Class.pdfTodos os nomes em Fortran devem: ter tamanho máximo de 31 caracteres começar com uma letra (maiúscula/minúscula)

Embed Size (px)

Citation preview

WorkEtaIntrodução ao Fortran 90

Margarete Domingues

[email protected]

Tips Fortran 90 – p.1/87

Estrutura de um programa Fortran

Tips Fortran 90 – p.2/87

Estrutura de um programa Fortran

Um prog. em Fortran 90 consiste de frases

algumas frases (statements) são executadasoutras são descritivas

Os programas são executados sequencialmente,iniciando na primeira frase executável.

Tips Fortran 90 – p.3/87

Estrutura de um programa principal

PROGRAM namespecification statements...........executable statements...........END PROGRAM name

Tips Fortran 90 – p.4/87

Exemplo:

PROGRAM SIMPLE! THIS IS A SIMPLE SAMPLE PROGRAMIMPLICIT NONEREAL :: A,B,C,TOTALA = 1.0B = 2.0C = 3.0TOTAL = A + B + CPRINT *,’TOTAL IS’,TOTAL

END PROGRAM SIMPLE

Tips Fortran 90 – p.5/87

Fortran statements

Tips Fortran 90 – p.6/87

Program Statement

PROGRAM program name

Todos os nomes em Fortran devem:ter tamanho máximo de 31 caracterescomeçar com uma letra (maiúscula/minúscula)pode ser composto apenas por: A-Z,a-z, 0-9 e _

Tipos de declarações statements:IMPLICIT NONE —- não permite atribuições detipos defaultREAL :: {list of variables} — todas as variáveisprecisam ser declaradas

Tips Fortran 90 – p.7/87

(cont.)

Entrada e saída: PRINT e READ —- lista-direta deoutput e input statements

PRINT *,{list of items to be printed}READ *,{list of items to be read in}

CALL {subroutine name} ({argument list}) — é umprocesso de transferência para uma subrotina deinformações com argumentos.

END ou END PROGRAM {name}

Tips Fortran 90 – p.8/87

Cometários iniciais de um prog.

nome dos autores

data e modificações

documentação para usuários

documentação técnica: que informações são utéispara o entendimento do programa.

limitações do programa.

Tips Fortran 90 – p.9/87

Exemplo

...! Author: CooleyTuckey!! Date: 10th july 1965: original code creation.! Modified: 19th Mar 2004: clarified program structure.!! Program Description:! FFT program!! Input Description: The numbers to be read in must be real.!! List of Variables Used:! X...CONTAINS THE TIME SERIES! COEF...CONTAINS THE RESULT FFT COEF.

....

Tips Fortran 90 – p.10/87

Erros

Tips Fortran 90 – p.11/87

Compilador e erros nos programas

Erros podem fazer com que os programas não sejamexecutados, ou pior ainda, fazer com que eles nosdeem respostas incorretas.

A maioria das tarefas ligadas a programação estáassociada a corrigir erros.

Classificação dos erros:erros de sintaxeerros de lógica

Tips Fortran 90 – p.12/87

Design e Teste

Tips Fortran 90 – p.13/87

Design, Maintainability, Portability

especificar o problema a ser resolvido claramente

input/output claros

um design limpo e modular

uso de procedures/libraries já existentes

nomes descritivos, comentarios claros e úteis

verificação de erro na entrada e nos estágios internosdos cálculos.

programas testes com casos realisticos

Tips Fortran 90 – p.14/87

Exercícios - erros

PROGRAM test! This program contains four major errors && and three examples of bad programming stylePRINT *,Please type a numberREAD *,numbrPRINT *,"The number you typed was ",numberEND

Tips Fortran 90 – p.15/87

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

(cont.)

quais são os erros?

compile o programa, verifique os erros encontrados,faça as correções, compile novamente, execute-o eentre com o número 123 qdo solicitado. A resposta foicorreta?

E se a entrada fosse 12.3?

Como podemos ajudar o compilador?

Tips Fortran 90 – p.16/87

Formas do F77 & F90

Tips Fortran 90 – p.17/87

F77 fixed form

brancos não são significativos, exceto em caracteres

Fortran statement são escritos nas colunas 7 to 72

linha comentário — C ou* na coluna 1

continuação de uma linha — um caracter na coluna 6

máximo de um statement 19 linhas de continuação

labels ficam nas colunas 1 a 5

Tips Fortran 90 – p.18/87

F90 free form

brancos são significativos, eles não devem aparecerem nomes e pelo menos um branco deve separarnomes/números e Fortran keywords.

linhas de comentário ! - mesmo que não seja nocomeço (trailing comments)

linhas podem ter até 132 caracteres e podem contermais de um statement separados por ";"

& indica que o statement continua na próxima linha.

39 linhas de continuação

label possuem até 5 digitos que precedem ostatement.

Tips Fortran 90 – p.19/87

Caracteres válidos, constantes, variáveis,memória

Tips Fortran 90 – p.20/87

Fortran Character Set

A–Z. (maiúsculas ou minúsculas).

digitos 0- 9

_

branco = + - * / ( ) , . $ ’ ": ! % & ; < > ?

ASCII character set são legais em constantes literais,e.g. ’fred@home’, ’[...]’.

Tips Fortran 90 – p.21/87

Constantes and Variáveis

memória principal de um computador consistepalavras (words)

cada word uma certa quantidade de informação

typicamente, uma palavra possui 2 bytes (8 bits -binary digits) de informação

Tips Fortran 90 – p.22/87

Armazenamento na memória emFortran

Integers: e.g. 1, 123, -56 (4 bytes (2 words = 32 bits))

Real (or floating point) numbers: e.g. 1.23, -4.56,1.0E02

Real – armazenado em duas partes: a mantissa eo expoent, e.g. 4.5E02.single precision real numbers: 4 bytes (2 words =32 bits)double precision real numbers are stored in 8 bytes( 4words = 64 bits)

Character or arrays de texto: e.g. ABCDE, FREDtamanho das variáveis caracter dependem da suadeclaração inicial (e.g. CHARACTER*4 = 32 bits =4 letters). Tips Fortran 90 – p.23/87

Variable Type Declarations

IMPLICIT NONETYPE :: {names}CHARACTER (LEN=length) :: name1, name2

Exemplo:

REAL :: a,b,cINTEGER :: i,j,kCHARACTER (LEN=10) :: name="Undefined"

Constantes – especificadas com o PARAMETERREAL, PARAMETER :: alpha=3.01INTEGER, PARAMETER :: ten=10

Tips Fortran 90 – p.24/87

Derived Data Types

Tipos padrões do Fortran:

REAL, INTEGER, CHARACTER, DOUBLEPRECISION, LOGICAL, COMPLEX.

Tipos derivados:

TYPE new_typecomponent defn

...END TYPE new_type

Tips Fortran 90 – p.25/87

Exemplo - data type

TYPE WorkEta_participante

CHARACTER (LEN=12) :: first_name,

& middle_name last_name

INTEGER :: age

CHARACTER :: Origin_Institute

END TYPE WorkEta_participante

Tips Fortran 90 – p.26/87

Exemplo - data type

variáveis passam a ser declaradas:

TYPE(WorkEta_participante) :: cristiane,

cristine =

& WorkEta_participante

("Cristiane","Maria","Osorio",28,"ONS")

componentes passam a ser referidas:cristiane\%first_namecristiane\%agecristiane\%Origin_Institute

Tips Fortran 90 – p.27/87

Exemplo

PROGRAM geometry! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey! A program to use derived types for two-dimensional! geometric calculations! Type definitionsIMPLICIT NONE

TYPE pointCHARACTER(LEN=12) :: nameREAL :: x,y ! Cartesian coordinates of the pointEND TYPE point

Tips Fortran 90 – p.28/87

Exemplo (cont.)

TYPE lineCHARACTER(LEN=12) :: nameREAL :: a,b,c ! coefficients of defining equation

END TYPE line

! Variable declarationsTYPE(point) :: p1,p2TYPE(line) :: p1_to_p2

Tips Fortran 90 – p.29/87

Exemplo (cont.)

! Read dataPRINT *,"Please type co-ordinates of first point"READ *,p1%x,p1%yPRINT *,"Please type co-ordinates of second point"READ *,p2%x,p2%y

Tips Fortran 90 – p.30/87

Exemplo (cont.)

! Calculate coefficients of equation representing the linep1_to_p2%a = p2%y - p1%yp1_to_p2%b = p1%x - p2%xp1_to_p2%c = p1%y*p2%x - p2%y*p1%x

! Print resultPRINT *,"The equation of the line joining these two points is"PRINT *,"ax + by + c = 0"PRINT *,"where a = ",p1_to_p2%aPRINT *," b = ",p1_to_p2%bPRINT *," c = ",p1_to_p2%c

END PROGRAM geometry

Tips Fortran 90 – p.31/87

Expressões

Tips Fortran 90 – p.32/87

Expressões aritméticas

+ addition- subtraction* multiplication/ division** exponentiationPor exemplo:

� � � � ��� ��� � � � ��� � � ��� � � �

Ordemde cálculo:

parenteses (o mais interno primeiro),

exponenciação,

multiplicação e divisão,

adição e subtração.

Por exemplo:

� � � � � �� � �� � � � ��

� � � � � � � � � � � ��� � � � � �

Tips Fortran 90 – p.33/87

Expression Type

IMPLICIT NONEREAL :: X,YINTEGER :: I,J

I + J resulta num tipo integerX/Y resulta num tipo realI + X resulta em um tipo real.

I=5J=3I/J = ?

(Isso é uma fonte potencial de erros lógicos!!!)

Tips Fortran 90 – p.34/87

Assignment Statement

variable = expressionPor exemplo:IMPLICIT NONEREAL :: A,B,C,DINTEGER :: I,J

A = 3.0B = 1.0C = -5.1D = A*B+CD=?

I = 4.8I=I+1I=?

Tips Fortran 90 – p.35/87

Strings

character string to acharacter variable, quando ostamanhos não são os mesmos as strings são preenchidaspor zeros ou cortadas à direita.

A única operação existente com caracteres é aconcatenação:char = "fred"//"die"substringschar(1:2) ! access first two characterschar(:10) ! access first ten characterschar(4:) ! access fourth till the last characters

Tips Fortran 90 – p.36/87

Overflow, Underflow and DivideCheck Error

overflow – qdo. a magnitude de um resultado é maiordo que a capacidade de armazenamento.

underflow – qdo. a magnitude de um número é menorque a do menor número permitido

qdo ocorre uma divisão por zero — divide check error.

Como esses erros são tratados depende doscompiladores

Tips Fortran 90 – p.37/87

Exercícios:

Identifiquem como constantes real, integer nem umanem outra:

���

� �� � � � � � � � � � �� � � � � � �� � � � � � � � ��

��

� � � ��

Quais os nomes a seguir são nomes válidos emFortran?QAZ, COMPUTER, TUFF., A+B, 3XY, AJKLMN, L9A45

Aonde estão os erros nos statements?

X = A + 3B3.14159 = PIX + Y = (A+B)/Z-2*PI*RJ = M-4.5*N**-2

Tips Fortran 90 – p.38/87

Exercícios:

Considere A,B,X,Z (real) e I,J,K,N (integer)

A = 6.0 X=-6.0 J=2B = 3.2 I=-3 N=5

Quais são os resultados obtidos:

Z = (A+B)/XZ = J + I + NZ = (J-I)/NZ = N/J+I+2K=BK = N/JK = B*3.0 + XK = (A+B-X)/3.0K=I*J/N ; K=I/N*J

Tips Fortran 90 – p.39/87

Input/Output – Free format

Tips Fortran 90 – p.40/87

READ Statement

READ *,{input list}READ(5,*) {input list}READ(UNIT=5,FMT=*) {input list}

Por exemplo,READ(5,*) A,B,C

são esperados os valores de A,B, C separados por virgulas

ou espaços em branco.

Tips Fortran 90 – p.41/87

WRITE Statement

PRINT *,{output list}WRITE(6,*) {output list}WRITE(UNIT=6,FMT=*) {output list}

Por exemplo,WRITE(6,*) ’ THE TOTAL IS:’, TOTAL

Tips Fortran 90 – p.42/87

Exemplo

PROGRAM Celscius_to_fahrenheit! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey! A program to convert a Celsius temperature to Fahrenheit

! Variable declarationsIMPLICIT NONEREAL :: temp_c,temp_f

! Ask for Celsius temperaturePRINT *,"What is the Celsius temperature? "READ *,temp_c

! Convert it to Fahrenheittemp_f = 9.0*temp_c/5.0 + 32.0

Tips Fortran 90 – p.43/87

Exemplo

! Print both temperaturesPRINT *,temp_c,"C = ",temp_f,"F"

END PROGRAM Celsius_to_fahrenheit

Tips Fortran 90 – p.44/87

Exercícios

Escreva um programa que leia 4 números, sendo os 2primeiros do tipo real e os 2 últimos do tipo integer.

Escreva os números na ordem inversa.

Escreva a soma dos 2 primeiros números e as dos 2últimos números.

Tips Fortran 90 – p.45/87

Basic Building Blocks: Unidades doPrograma

Tips Fortran 90 – p.46/87

Main programs

Programas simples podem conter apenas um módulode programa, que são chamados programasprincipais.

Problemas mais complexos são subdivididos emsubprograms e procedures (functions e subroutines)

Isso deixa o problema modular e facilita o reutilizaçãodo código

COMMON blocks é uma forma de se acessar variáveisglobais, mas atualmente esse tipo de procedimentonão é recomendado.

Tips Fortran 90 – p.47/87

Layout das unidades deprogramação

main program unit

function subprogram

subroutine subprogram

modules and block data subprogram

Tips Fortran 90 – p.48/87

Estrutura de um programa

PROGRAM {name}specification statements........................executable statements.....................

END PROGRAM {name}

FUNCTION {name} ({argument list})specification statements........................executable statements.....................

END FUNCTION {name}

Tips Fortran 90 – p.49/87

Estrutura de um programa (cont.)

SUBROUTINE {name} ({argument list})specification statements........................executable statements.....................

END SUBROUTINE {name}

MODULE {name}specification statements........................executable statements.....................

END MODULE {name}

Tips Fortran 90 – p.50/87

Estrutura de um programa (cont.)

BLOCK DATA {name}specification statements........................

END BLOCK DATA {name}

Tips Fortran 90 – p.51/87

Relational and Logical Expressions

Tips Fortran 90 – p.52/87

Expressões relacionais

Uma expressão relacional compara duas expressões pormeio de um operador relacional e retorna o valor TRUE ouFALSE.< .LT. less than<= .LE. less than or equal to== .EQ. equal to/= .NE. not equal to>= .GE. greater than or equal to> .GT. greater than

Tips Fortran 90 – p.53/87

Exemplos de expressões relacionais

pay .LT. credit

half*2 .GE. min**3/denom

OBS: Computadores não representam bem númerosreais (e.g. 1.0/3.0) então é perigoso usar .EQ. . Porque?

Tips Fortran 90 – p.54/87

Expressões lógicas

Operadores lógicos

.OR. logical disjunction (inclusive or): true if either orboth of its operands are true

.AND. logical conjunction: true if both of its operandsare true

.EQV. true if its operands have the same logical value

.NEQV. true if its operands have the opposite logicalvalue

Tips Fortran 90 – p.55/87

(cont.)

.AND. tem precedencia sobre .OR.

operadores aritimétricos tem preferência sobreoperadores relacionais

as duplas a seguir são equivalentes:jill .EQ. jack .OR. boulder .GT. pebble .AND. ant .LT.giraffe(jill .EQ. jack) .OR. ((boulder .GT. pebble) .AND.(ant .LT. giraffe))

.NOT. tem precedencia sobre .AND.

as duplas a seguir são equivalentes:.NOT. (a<b .AND. b<c)a>=b .OR. b>=c Tips Fortran 90 – p.56/87

Logical Variables

LOGICAL pos, neg,answer

pos = num .GE. 0neg = .NOT. pos

answer = .TRUE.answer = (good .GT. bad)

Tips Fortran 90 – p.57/87

IF lógico statment

Tips Fortran 90 – p.58/87

IF

IF(E) S

E é uma expressão lógica

S é qq comando executável, exceto DO, outro IF ouum block-IF

Exemplos,IF(pay .LT. starve) pay = pay + 250.0IF(number .GT. 10) WRITE(*,*) ’number > 10’

Tips Fortran 90 – p.59/87

Erros comuns

1)IF(pay .LT. starve) pay = pay +250.0pay=pay+100.02)

IF(pay .LT. starve) pay = pay +250.0IF(pay .GE. starve) pay=pay+100.0

3) Forma mais correta:IF(pay .GE. starve) pay=pay+100.0IF(pay .LT. starve) pay = pay +250.0

Tips Fortran 90 – p.60/87

Block IF Statements

Basic Block IF

IF (logical expression) THEN[Lines of Fortran]

ENDIF

Else-If Block:

IF (logical expression1) THEN[Lines of Fortran]

ELSEIF (logical expression2) THEN[Lines of Fortran]

ELSEIF (logical expression3) THEN[Lines of Fortran]

ENDIF

Tips Fortran 90 – p.61/87

Block IF Statements (cont.)

Else Block:

IF (logical expression1) THEN[Lines of Fortran]

ELSEIF (logical expression2) THEN[Lines of Fortran]

ELSEIF (logical expression3) THEN[Lines of Fortran]

ELSE[Lines of Fortran]

ENDIF

Tips Fortran 90 – p.62/87

IF-THEN-ELSE-ENDIF

PROGRAM test! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONEREAL, EXTERNAL :: cube_rootREAL :: x ; PRINT *,"x?" ; READ *,xPRINT *,"The cube root of ",x," is ",cube_root(x)

END PROGRAM test

Tips Fortran 90 – p.63/87

IF-THEN-ELSE-ENDIF (cont.)

REAL FUNCTION cube_root(x)

! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE

! Function to calculate the cube root

! of a positive real number

! Dummy argument declaration

REAL, INTENT(IN) :: x

! Local constant

REAL, PARAMETER :: epsilon=1E-20

Tips Fortran 90 – p.64/87

IF-THEN-ELSE-ENDIF (cont.)

! Eliminate (nearly) zero case

IF (ABS(x)<epsilon) THEN

cube_root = 0.0

! Calculate cube root by using logs

ELSE IF (x<0) THEN

! First deal with negative argument

cube_root = -EXP(LOG(-x)/3.0)

ELSE

! Positive argument

cube_root = EXP(LOG(x)/3.0)

END IF

END FUNCTION cube_rootTips Fortran 90 – p.65/87

CASE

SELECT CASE (case_expression)CASE (case_selector)block of Fortran statements

CASE (case_selector)block of Fortran statements....

CASE (case_selector)block of Fortran statements

CASE DEFAULTblock of Fortran statements

END SELECT

Tips Fortran 90 – p.66/87

case_ selector

case_ valuecase_ expression == case_ value.

low_ value:low_ value <= case_ expression.

high_ valuecase_ expression <= high_ value.

low_ value:high_ valuelow_ value <= case_ expression .AND. case_expression <= high_ value.

Tips Fortran 90 – p.67/87

Exemplo

PROGRAM seasons! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE! A program to calculate in which season! a specified date lies! Variable declarations

CHARACTER(LEN=10) :: dateCHARACTER(LEN=2) :: month

! Read datePRINT *,

& "Please type a date in the form yyyy-mm-dd"READ *,date

! Extract month numbermonth = date(6:7)

Tips Fortran 90 – p.68/87

Exemplo (cont.)

! Print seasonSELECT CASE (month)CASE ("08":"10")

PRINT *,date," is in the spring"CASE ("11","12","01":"03")

PRINT *,date," is in the summer"CASE ("04","05")

PRINT *,date," is in the autumn"CASE ("06","07")

PRINT *,date," is in the winter"CASE DEFAULT

PRINT *,date," is not a valid date"END SELECT

END PROGRAM seasons

Tips Fortran 90 – p.69/87

DO looping

Tips Fortran 90 – p.70/87

sintaxe DO

DO count=initial,final,inc[Lines of Fortran to be looped over]ENDDO

count é um integer – DO variable

Comandos internos ao DO

CYCLE

EXIT

Tips Fortran 90 – p.71/87

Exemplo DO

DO i=0,12,3A = A + S(i) + S(i+1) + S(i+2)

ENDDO

Tips Fortran 90 – p.72/87

alinhamento DO

DO i=m1,m2,m3DO j=n1,n2,n3

[Lines of Fortran to be looped over]ENDDO

ENDDO

Tips Fortran 90 – p.73/87

Exemplo DO

PROGRAM multiplication_tables! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE! A program to print multiplication tables from 2 to 12 times! Variable declarationsINTEGER :: i,j! Outer loop defines which ’times table’DO i=2,12

PRINT *," "PRINT *,i," times table"DO j=1,12

PRINT *,i," times",j," is ",i*jEND DO

END DOEND PROGRAM multiplication_tables

Tips Fortran 90 – p.74/87

Array Declarations

Tips Fortran 90 – p.75/87

Exemplos

REAL :: grades(100),marks(100),topten(10)REAL, DIMENSION(100) :: grades, marks, topten(10)

INTEGER :: ages(50)LOGICAL :: answers(10)

INTEGER :: grid(50,50)REAL :: altitude(100,100), coordinate(50,50,10)

!REAL arrayname(lowerbound : upperbound)REAL A(0 : 10)

INTEGER I(-5:10,-20:100)REAL X(0:10,-5,5)

Tips Fortran 90 – p.76/87

Array constants e initial values

!array_name = (/ value_1, value_2, ... /)

arr = (/ 1,2,3,4,5,6,7,8,9,10 /)

!Para grandes arrays uma seq. de DO implicito:

! set arr = (/ 1,2,3,4,5,6,7,8,9,10 /)arr = (/ (i, i=1,10) /)

Tips Fortran 90 – p.77/87

Arrays as Subprogram Parameters

REAL :: HUGE(100),TINY(50)...CALL SIZE(HUGE,TINY,NUMBER)...STOPEND

SUBROUTINE SIZE(BIG,SMALL,N)REAL :: BIG(100),SMALL(50)...RETURNEND

Tips Fortran 90 – p.78/87

Arrays as Subprogram Parameters

PROGRAM ARRAY_EXAMPLE_2

REAL :: HUGE(100),TINY(50)...

NHUGE=100NTINY=50CALL SIZE(HUGE,TINY,NHUGE,NTINY)...

NHUGE=75NTINY=34CALL SIZE(HUGE,TINY,NHUGE,NTINY)

...END PROGRAM ARRAY_EXAMPLE_2

SUBROUTINE SIZE(BIG,SMALL,NBIG,NSMALL)REAL :: BIG(:),SMALL(:)...END SUBROUTINE SIZE

Tips Fortran 90 – p.79/87

Implied Do Loops

! (list of variables, control = start, finish, increment)

read(*,*) (A(I), I=1,10)

! 2D, array X(10,20) row by row

read(*,*) (( X(I,J), I=1,10), J=1,20)

do j=1,20read(*,*) ( X(I,J), I=1,10)

enddo

Tips Fortran 90 – p.80/87

Arrays em expressões

REAL, DIMENSION(20) :: a,b,c,d

a = c*d ! Fortran 90 array processing

DO i=1,20 ! Fortran 77 array processingb(i)=c(i)*d(i)

ENDDO

REAL:: a(1:20),b(0:19),c(10:29),d(-9:10)

a = c*d ! Fortran 90 array processing

DO i=1,20 ! Fortran 77 array processingb(i-1)=c(i+9)*d(i-10)

ENDDO Tips Fortran 90 – p.81/87

Arrays em intrinsic procedures.

Assume array1, array2, and a, b, c, d, e são conformablearraysarray1 = SIN(array2)arr_max = MAX(100,0,a,b,c,d,e)

Tips Fortran 90 – p.82/87

Exemplo

PROGRAM ArrayTest! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONEINTERFACE

FUNCTION max_array(array_1,array_2)IMPLICIT NONEREAL, DIMENSION(:) :: array_1,array_2REAL, DIMENSION(SIZE(array_1)) :: max_array

END FUNCTION max_arrayEND INTERFACE

Tips Fortran 90 – p.83/87

Exemplo (cont.)

REAL, DIMENSION(10) :: a1,a2PRINT *,"array 1?"READ *,a1PRINT *,"array 2?"READ *,a2PRINT *,"Maximum array is ",max_array(a1,a2)

END PROGRAM test

Tips Fortran 90 – p.84/87

Exemplo (cont.)

FUNCTION max_array(array_1,array_2)! Copyright 1994, Miles Ellis, Ivor Philips and Tom Lahey

IMPLICIT NONE! This function returns the maximum of two arrays on an! element by element basis! Dummy argumentsREAL, DIMENSION(:) :: array_1,array_2! Result variableREAL, DIMENSION(SIZE(array_1)) :: max_array! Use the elemental intrinsic MAX to compare elementsmax_array = MAX(array_1,array_2)

END FUNCTION max_array

Tips Fortran 90 – p.85/87

Referências

http://rsc.anu.edu.au/ harry/COURSES/MATHMETH/node1.html

Tips Fortran 90 – p.86/87

[email protected]

Tips Fortran 90 – p.87/87