daniel ruschel dutrarns/astroprog/f90_daniel.pdf · open(50,file=’meuarquivo.dat’) formato uma...
TRANSCRIPT
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