Daniel Ruschel Dutrarns/astroprog/f90_daniel.pdf · OPEN(50,file=’meuarquivo.dat’) Formato Uma...

Preview:

Citation preview

Fortran 90 e suas aplicacoes astronomicas

Daniel Ruschel Dutra

UFRGS

21 de maio de 2010

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 1 / 16

Visao geral do Fortran 90

Linguagem de baixo nıvel

Facil aprendizagemFacilidade para trabalhar com vetores e matrizesRelativamente rapido para calculos numericos

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 2 / 16

Visao geral do Fortran 90

Linguagem de baixo nıvelFacil aprendizagem

Facilidade para trabalhar com vetores e matrizesRelativamente rapido para calculos numericos

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 2 / 16

Visao geral do Fortran 90

Linguagem de baixo nıvelFacil aprendizagemFacilidade para trabalhar com vetores e matrizes

Relativamente rapido para calculos numericos

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 2 / 16

Visao geral do Fortran 90

Linguagem de baixo nıvelFacil aprendizagemFacilidade para trabalhar com vetores e matrizesRelativamente rapido para calculos numericos

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 2 / 16

Conceitos gerais

Formato quase livre, 132 caracteres por linha

Para continuar uma linha basta colocar um ”&”no finalEx:Lorem ipsum dolor sit amet, consectetur&adipisicing elit, sed do eiusmod tempor incididunt”!”denota um comentario, pode estar no meio de uma linhaOs rotulos, comuns no 77, sao desnecessariosVarios comandos podem ser colocados em uma mesma linhaEx: DO i=1,10; WRITE(*,*) vec(i); ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 3 / 16

Conceitos gerais

Formato quase livre, 132 caracteres por linhaPara continuar uma linha basta colocar um ”&”no finalEx:Lorem ipsum dolor sit amet, consectetur&adipisicing elit, sed do eiusmod tempor incididunt

”!”denota um comentario, pode estar no meio de uma linhaOs rotulos, comuns no 77, sao desnecessariosVarios comandos podem ser colocados em uma mesma linhaEx: DO i=1,10; WRITE(*,*) vec(i); ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 3 / 16

Conceitos gerais

Formato quase livre, 132 caracteres por linhaPara continuar uma linha basta colocar um ”&”no finalEx:Lorem ipsum dolor sit amet, consectetur&adipisicing elit, sed do eiusmod tempor incididunt”!”denota um comentario, pode estar no meio de uma linha

Os rotulos, comuns no 77, sao desnecessariosVarios comandos podem ser colocados em uma mesma linhaEx: DO i=1,10; WRITE(*,*) vec(i); ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 3 / 16

Conceitos gerais

Formato quase livre, 132 caracteres por linhaPara continuar uma linha basta colocar um ”&”no finalEx:Lorem ipsum dolor sit amet, consectetur&adipisicing elit, sed do eiusmod tempor incididunt”!”denota um comentario, pode estar no meio de uma linhaOs rotulos, comuns no 77, sao desnecessarios

Varios comandos podem ser colocados em uma mesma linhaEx: DO i=1,10; WRITE(*,*) vec(i); ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 3 / 16

Conceitos gerais

Formato quase livre, 132 caracteres por linhaPara continuar uma linha basta colocar um ”&”no finalEx:Lorem ipsum dolor sit amet, consectetur&adipisicing elit, sed do eiusmod tempor incididunt”!”denota um comentario, pode estar no meio de uma linhaOs rotulos, comuns no 77, sao desnecessariosVarios comandos podem ser colocados em uma mesma linhaEx: DO i=1,10; WRITE(*,*) vec(i); ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 3 / 16

Buenas, mundo!

PROGRAM buenasWRITE(*,*)’Buenas, mundo!’END PROGRAM buenas

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 4 / 16

Declaracao de variaveis

EstruturaPROGRAM nome do programatipo 1 :: variavel 1,variavel 2(dimensoes)tipo 2 :: variavel 3comandosEND PROGRAM

Tipos de variaveisTipo Extensao Exemplo

integer ±2bits/2 -25643character > 107 caracteres ivoviuauva

logical .true. , .false. .true.

real ate 15 decimais e10200 3.14159274101257324E+157

complex dois reais ( 5.0000000 , 6.0000000 )

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 5 / 16

Declaracao de variaveis

EstruturaPROGRAM nome do programatipo 1 :: variavel 1,variavel 2(dimensoes)tipo 2 :: variavel 3comandosEND PROGRAM

Tipos de variaveisTipo Extensao Exemplo

integer ±2bits/2 -25643character > 107 caracteres ivoviuauva

logical .true. , .false. .true.

real ate 15 decimais e10200 3.14159274101257324E+157

complex dois reais ( 5.0000000 , 6.0000000 )

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 5 / 16

READ e WRITE

WRITE( 50 , ’(3f9.3)’ ) vetor

Unidade Logica

FormatoVariavel

Unidade LogicaA maneira como o fortran opera arquivos:OPEN(50,file=’meuarquivo.dat’)

FormatoUma string que define a forma de ler ou escrever.’(3f9.3)’→ 3 floats de 9 dıgitos, com 3 decimais

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 6 / 16

READ e WRITE

WRITE( 50 , ’(3f9.3)’ ) vetor

Unidade LogicaFormato

Variavel

Unidade LogicaA maneira como o fortran opera arquivos:OPEN(50,file=’meuarquivo.dat’)

FormatoUma string que define a forma de ler ou escrever.’(3f9.3)’→ 3 floats de 9 dıgitos, com 3 decimais

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 6 / 16

READ e WRITE

WRITE( 50 , ’(3f9.3)’ ) vetor

Unidade LogicaFormatoVariavel

Unidade LogicaA maneira como o fortran opera arquivos:OPEN(50,file=’meuarquivo.dat’)

FormatoUma string que define a forma de ler ou escrever.’(3f9.3)’→ 3 floats de 9 dıgitos, com 3 decimais

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 6 / 16

READ e WRITE

WRITE( 50 , ’(3f9.3)’ ) vetor

Unidade LogicaFormatoVariavel

Unidade LogicaA maneira como o fortran opera arquivos:OPEN(50,file=’meuarquivo.dat’)

FormatoUma string que define a forma de ler ou escrever.’(3f9.3)’→ 3 floats de 9 dıgitos, com 3 decimais

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 6 / 16

READ e WRITE

WRITE( 50 , ’(3f9.3)’ ) vetor

Unidade LogicaFormatoVariavel

Unidade LogicaA maneira como o fortran opera arquivos:OPEN(50,file=’meuarquivo.dat’)

FormatoUma string que define a forma de ler ou escrever.’(3f9.3)’→ 3 floats de 9 dıgitos, com 3 decimais

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 6 / 16

READ e WRITE

WRITE( 50 , ’(3f9.3)’ ) vetor

Unidade LogicaFormatoVariavel

Unidade LogicaA maneira como o fortran opera arquivos:OPEN(50,file=’meuarquivo.dat’)

FormatoUma string que define a forma de ler ou escrever.’(3f9.3)’→ 3 floats de 9 dıgitos, com 3 decimais

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 6 / 16

Condicional

Relacoes

Matematica < 6 = 6= > >Fortran 90 < <= == /= >= >Fortran 77 .lt. .le. .eq. .ne. .ge. .gt.

Exemplo 1IF(flux < 0) flux=0

Exemplo 2IF(lambda == lambda0)THENALLOCATE(spectro(lambda:lambda f))READ(10,*)spectroENDIF

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 7 / 16

Condicional

Relacoes

Matematica < 6 = 6= > >Fortran 90 < <= == /= >= >Fortran 77 .lt. .le. .eq. .ne. .ge. .gt.

Exemplo 1IF(flux < 0) flux=0

Exemplo 2IF(lambda == lambda0)THENALLOCATE(spectro(lambda:lambda f))READ(10,*)spectroENDIF

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 7 / 16

Condicional

Relacoes

Matematica < 6 = 6= > >Fortran 90 < <= == /= >= >Fortran 77 .lt. .le. .eq. .ne. .ge. .gt.

Exemplo 1IF(flux < 0) flux=0

Exemplo 2IF(lambda == lambda0)THENALLOCATE(spectro(lambda:lambda f))READ(10,*)spectroENDIF

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 7 / 16

Condicional

Exemplo 3IF(x/2 = int(x/2))THENWRITE(*,*)’x e par’ELSEWRITE(*,*)’x e ımpar’ENDIF

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 8 / 16

Loops

Loop contadoDO n=1,10,2WRITE(*,*) n/2 → 0 1 2 3 4ENDDO

Loop indefinidoDOREAD(50,*,iostat=stat)xIF(stat /= 0)EXITn=n+1ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 9 / 16

Loops

Loop contadoDO n=1,10,2WRITE(*,*) n/2 → 0 1 2 3 4ENDDO

Loop indefinidoDOREAD(50,*,iostat=stat)xIF(stat /= 0)EXITn=n+1ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 9 / 16

Arrays

DeclaracaoINTEGER :: matriz(5,5)

INTEGER, DIMENSION(10) :: matriz 1, matriz 2, matriz 3REAL, ALLOCATABLE :: matriz(:,:),vetor(:)...ALLOCATE(matriz(colunas,linhas))...ALLOCATE(vetor(dimensoes))Os ındices sao arbitrarios desde que inteirosREAL :: espectro(4500:8000)

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 10 / 16

Arrays

DeclaracaoINTEGER :: matriz(5,5)INTEGER, DIMENSION(10) :: matriz 1, matriz 2, matriz 3

REAL, ALLOCATABLE :: matriz(:,:),vetor(:)...ALLOCATE(matriz(colunas,linhas))...ALLOCATE(vetor(dimensoes))Os ındices sao arbitrarios desde que inteirosREAL :: espectro(4500:8000)

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 10 / 16

Arrays

DeclaracaoINTEGER :: matriz(5,5)INTEGER, DIMENSION(10) :: matriz 1, matriz 2, matriz 3REAL, ALLOCATABLE :: matriz(:,:),vetor(:)...ALLOCATE(matriz(colunas,linhas))...ALLOCATE(vetor(dimensoes))

Os ındices sao arbitrarios desde que inteirosREAL :: espectro(4500:8000)

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 10 / 16

Arrays

DeclaracaoINTEGER :: matriz(5,5)INTEGER, DIMENSION(10) :: matriz 1, matriz 2, matriz 3REAL, ALLOCATABLE :: matriz(:,:),vetor(:)...ALLOCATE(matriz(colunas,linhas))...ALLOCATE(vetor(dimensoes))Os ındices sao arbitrarios desde que inteirosREAL :: espectro(4500:8000)

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 10 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)

Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fatorou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)

Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fatorou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)

Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fatorou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fatorou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fatorou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fator

ou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Operando

AritmeticaDefinindo um vetor constante: vetor=(/ 1,2,3,4,5 /)Soma e subtracao como escalaresc=a+b→ c(n)=a(n)+b(n)Produto escalar entre cada um dos elementosc=a*b→ c(n)=a(n)*b(n)Operacoes entre vetores e escalares tambem valemc=a*d→ c(n)=a(n)*d

Como diria o Jack Estripador...

E possıvel operar sobre uma secao de um vetorc(10:20)=c(10:20)*fatorou toda uma linha de uma matrizmatriz(2,:)=matriz(2,:)*fator

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 11 / 16

Arrays - Lendo

Jeito direto: exige uniformidade12000.0 .213246E-1212001.0 .213368E-1212002.0 .213490E-1212003.0 .213611E-12

...

READ(unity,’(8x,1e11.6)’) espectro

mas nao muitoREAD(unity,*)lixo(:,:)

Atraves de loop: mais controleDO i=inicio,fim,passoREAD(unity,format) lambda(i),fluxo(i)ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 12 / 16

Arrays - Lendo

Jeito direto: exige uniformidade12000.0 .213246E-1212001.0 .213368E-1212002.0 .213490E-1212003.0 .213611E-12

...

READ(unity,’(8x,1e11.6)’) espectro

mas nao muitoREAD(unity,*)lixo(:,:)

Atraves de loop: mais controleDO i=inicio,fim,passoREAD(unity,format) lambda(i),fluxo(i)ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 12 / 16

Arrays - Lendo

Jeito direto: exige uniformidade12000.0 .213246E-1212001.0 .213368E-1212002.0 .213490E-1212003.0 .213611E-12

...

READ(unity,’(8x,1e11.6)’) espectro

mas nao muitoREAD(unity,*)lixo(:,:)

Atraves de loop: mais controleDO i=inicio,fim,passoREAD(unity,format) lambda(i),fluxo(i)ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 12 / 16

Arrays - Escrevendo

Direto (loop implıcito)WRITE(unity,’(5(1f7.1,3x))’)(matriz(i,:),i=1,100)

Mais direto (tudo implıcito)WRITE(unity,*)matriz

Com loopDO i=1,10WRITE(*,*)vetor(i)ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 13 / 16

Arrays - Escrevendo

Direto (loop implıcito)WRITE(unity,’(5(1f7.1,3x))’)(matriz(i,:),i=1,100)

Mais direto (tudo implıcito)WRITE(unity,*)matriz

Com loopDO i=1,10WRITE(*,*)vetor(i)ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 13 / 16

Arrays - Escrevendo

Direto (loop implıcito)WRITE(unity,’(5(1f7.1,3x))’)(matriz(i,:),i=1,100)

Mais direto (tudo implıcito)WRITE(unity,*)matriz

Com loopDO i=1,10WRITE(*,*)vetor(i)ENDDO

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 13 / 16

Arrays - Algumas funcoes especiais

WHERE(matriz < 0)matriz=01 -2 3 45 6 -7 89 10 11 -12

1 0 3 45 6 0 89 10 11 0

SUM e COUNTmedia=SUM(a)/COUNT(a /= 0)desvpad=SUM(SQRT((a-media)**2))/COUNT(a /= 0)

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 14 / 16

Arrays - Algumas funcoes especiais

WHERE(matriz < 0)matriz=01 -2 3 45 6 -7 89 10 11 -12

1 0 3 45 6 0 89 10 11 0

SUM e COUNTmedia=SUM(a)/COUNT(a /= 0)desvpad=SUM(SQRT((a-media)**2))/COUNT(a /= 0)

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 14 / 16

Subrotinas

PROGRAM exemploREAL :: vetor(3)READ(*,*) vetorCALL modulo(vetor,mod)WRITE(*,*) modEND PROGRAM exemplo

SUBROUTINE modulo(v,n)REAL :: v(3)n=SQRT(v(1)**2+v(2)**2+v(3)**2)END SUBROUTINE modulo

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 15 / 16

Algumas funcoes intrınsecas

MINLOC(a,mask) - localiza o valor mınimo do array a para o quala mascara mask tem valor T

MINVAL(a,mask) - similar ao anterior mas retorna o proprio valorTRIM(str) - remove os espacos em branco da string strINDEX(str1,str2) - retorna a posicao que a string str2 ocupa nastring str1

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 16 / 16

Algumas funcoes intrınsecas

MINLOC(a,mask) - localiza o valor mınimo do array a para o quala mascara mask tem valor TMINVAL(a,mask) - similar ao anterior mas retorna o proprio valor

TRIM(str) - remove os espacos em branco da string strINDEX(str1,str2) - retorna a posicao que a string str2 ocupa nastring str1

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 16 / 16

Algumas funcoes intrınsecas

MINLOC(a,mask) - localiza o valor mınimo do array a para o quala mascara mask tem valor TMINVAL(a,mask) - similar ao anterior mas retorna o proprio valorTRIM(str) - remove os espacos em branco da string str

INDEX(str1,str2) - retorna a posicao que a string str2 ocupa nastring str1

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 16 / 16

Algumas funcoes intrınsecas

MINLOC(a,mask) - localiza o valor mınimo do array a para o quala mascara mask tem valor TMINVAL(a,mask) - similar ao anterior mas retorna o proprio valorTRIM(str) - remove os espacos em branco da string strINDEX(str1,str2) - retorna a posicao que a string str2 ocupa nastring str1

Daniel Ruschel Dutra (UFRGS) Fortran 90 21 de maio de 2010 16 / 16

Recommended