UNIVERSIDADE FEDERAL DE PELOTAS FACULDADE DE METEOROLOGIA DEPARTAMENTO DE METEOROLOGIA Lista de exercícios 04 Disciplina: CAM 1 – Prof. Mateus da Silva Teixeira – Data de entrega: 29/09/2015 PARTE 1 - FUNÇÕES INTRÍNSECAS PARA ARRANJOS EM FORTRAN 90 a) ALLOCATED( arranjo ) → informa se o arranjo estão ou não alocado. Funciona apenas para variáveis alocáveis. b) LBOUND( arranjo, dim ) → se dim está presente, retorna o limite inferior (do índice) daquela dimensão. Se dim está ausente, retorna o limite inferior (dos índices) de todas as dimensões de arranjo. c) SHAPE( arranjo ) → retorna a forma de arranjo. d) SIZE( arranjo, dim ) → se dim está presente, retorna a extensão da dimensão informada, caso contrário, retorna o número total de elementos de arranjo. e) UBOUND( arranjo, dim ) → idem LBOUND(), mas retorna o limite superior. Exemplo 01: PROGRAM arranjo2D IMPLICIT NONE INTEGER, DIMENSION(5,5) :: a a = RESHAPE( (/1,6,11,16,21,2,7,12,17,22,3,8,13,18,23,4,9, & 14, 19,24,5,10,15,20,25/), (/5,5/) ) WRITE(*,*) 'Características do arranjo “a”:' WRITE(*,*) 'Limites inferiores das dimensões de “a”:', LBOUND(a) WRITE(*,*) 'Limites superiores das dimensões de “a”:', UBOUND(a) WRITE(*,*) 'A forma de “a” é: ', SHAPE(a) WRITE(*,*) 'O tamanho de “a” é ', SIZE(a) END PROGRAM arranjo2D Exercícios para o programa arranjo2D (Exemplo 01): 1) Pesquise a finalidade da função intrínseca RESHAPE. Por que ela é usada neste programa 2) Altere a declaração do arranjo “a”, colocando diferentes limites para cada uma de suas dimensões, respeitando a quantidade total de elementos, ou seja, 25 elementos. Para a sua alteração, foi necessária alguma outra alteração? Que respostas foram obtidas para os limites inferior e superior do arranjo “a”, após essa alteração? 3) A partir do programa original (acima) altere o programa para que sejam exibidas apenas os limites inferior e superior da primeira dimensão. Exemplo 02: PROGRAM arranjo2Da IMPLICIT NONE INTEGER, DIMENSION(3,3) :: b INTEGER :: i,j,k,l,m,n b = RESHAPE( (/1,2,3,4,5,6,7,8,9/), (/3,3/) ) m = UBOUND( b,1 ) n = UBOUND( b,2 ) k = LBOUND( b,1 ) l = LBOUND( b, 2 ) WRITE(*,*) 'O arranjo “b” tem ', SIZE(b),' elementos' WRITE(*,*) 'Eles são:' DO i = k, m WRITE(*,*) ( b(i,j), j = l, n ) END DO END PROGRAM arranjo2Da Exercícios para o programa arranjo2Da (Exemplo 02): 1) O que faz esse programa? 2) Altere o programa para que os limites inferiores das dimensões sejam atribuídos a um vetor. Faça o mesmo para os limites superiores. OUTRAS FUNÇÕES INTRÍNSECAS f) ALL( máscara ) → retorna TRUE se todos os valores em máscara são verdadeiros. g) ANY( máscara ) → retorna TRUE se qualquer valor em máscara for verdadeiro. h) COUNT( máscara ) → retorna o número de elementos verdadeiros em máscara. i) DOT_PRODUCT( vetorA, vetorB ) → calcula o produto escalar entre dois vetores de mesmo tamanho. j) MATMUL( matrizA, matrizB ) → calcula a multiplicação matricial entre duas matrizes conformes. k) MAXLOC( arranjo, máscara ) → retorna a localização do valor máximo de arranjo entre aqueles para os quais a máscara foi verdadeira. O resultado é um arranjo unidimensional com um elemento para cada dimensão de arranjo. O uso de máscara é opcional. l) MAXVAL( arranjo, máscara ) → retorna o valor máximo de arranjo entre aqueles para os quais máscara foi verdadeira. O uso de máscara é opcional. m) PRODUCT( arranjo, máscara ) → calcula o produto dos elementos de arranjo para os quais máscara é verdadeira. O uso de máscara é opcional; se não estiver presente, todos os elementos são usados. n) SUM( arranjo, máscara ) → calcula a soma dos elementos de arranjo para os quais máscara é verdadeira. O uso de máscara é opcional; se não estiver presente, todos os elementos são usados. o) TRANSPOSE( matriz ) → retorna a transposta de um arranjo bidimensional. Exemplo 03: PROGRAM arranjo2Db IMPLICIT NONE INTEGER, DIMENSION(3,3) :: b b = RESHAPE( (/1,2,3,4,5,6,7,8,9/), (/3,3/) ) PRINT *,'Todos os elementos de “b” são menores que zero?', ALL( b < 0 ) PRINT *,'Algum elemento de “b” é menor que zero?', ANY( b < 0 ) PRINT *,'Há ', COUNT( b < 0 ), ' elementos menores que zero.' PRINT *,'O local do máximo valor de “b” é ', MAXLOC( b ) PRINT *,'O local do máximo valor negativo de “b” é ', MAXLOC( b, b < 0 ) PRINT *,'O máximo valor de “b” é ', MAXVAL( b ) PRINT *,'O máximo valor negativo de “b” é ', MAXVAL( b, b < 0 ) PRINT *,'O produto de todos os elementos de “b” é ', PRODUCT( b ) PRINT *,'O produto de todos os elementos negativos de “b” é ', PRODUCT( b, b < 0 ) PRINT *,'A soma de todos os elementos de “b” é ', SUM( b ) PRINT *,'A soma de todos os elementos negativos de “b” é ', SUM( b, b < 0 ) PRINT *,'A transposta de “b” é ', TRANSPOSE( b ) END PROGRAM arranjo2Db Exercícios para o programa arranjo2Db (Exemplo 03): 1) Crie um programa em Fortran 90 que calcule o produto escalar entre dois vetores. Use a função DOT_PRODUCT() para certificar os seus resultados. Apresente um exemplo de aplicação do seu programa, calculando o produto escalar de dois vetores a sua escolha. PARTE 2 – SUBROTINAS EM FORTRAN 90 A previsão de tempestades é, em grande parte dos centros de previsão, auxiliada por Índices de Instabilidade. Os índices de instabilidade têm o principal objetivo de indicar o grau de instabilidade da atmosfera. Quanto maior esse grau de instabilidade, maior é a possibilidade para ocorrência de tempestades. Um dos índices de instabilidade mais utilizados nos centros de previsão do tempo é o Índice K. Esse índice é representado, matematicamente, pela equação abaixo: K=T 850 −T 500 +Td 850 −(T 700 −Td 700 ) sendo T850, T700 e T500 as temperaturas do ar nos níveis de 850, 700 e 500 hPa, respectivamente, e Td850 e Td700 as temperaturas do ponto de orvalho nos níveis de 870 e 700 hPa, respectivamente. Assim, crie uma SUBROUTINE que calcula o índice K, conforme a equação acima. Escreva um programa Fortran que usa essa SUBROUTINE, utilizando cada um dos seguintes dados meteorológicos: 1. T850=22.8, Td850=9.8, T700=13.6, Td700=-0.4, T500=-38.7 2. T850=12.4, Td850=12.4, T700=8.4, Td700=5.3, T500=-8.7 3. T850=11.8, Td850=6.9, T700=4.0, Td700=-14.0, T500=-7.3 O programa Fortran que usa a SUBROUTINE criada para calcular o índice K deve informar ao usuário o grau de instabilidade, usando a seguinte classificação: • • • • • K<20: baixa instabilidade 20 ≤ K ≤ 25: ocorrência de tempestades isoladas 26 ≤ K ≤ 30: ocorrência de tempestades dispersas 31 ≤ K ≤ 35: ocorrência de numerosas tempestades K > 35: alta probabilidade de tempestades