Fortran 90 moving average


APÊNDICE 5 Funções intrínsecas no Fortran 90 Existe uma grande quantidade de funções intrínsecas e cinco sub-rotinas intrínsecas no Fortran 90. Trato as rotinas numéricas e matemáticas muito em breve, uma vez que não são alteradas pelo Fortran 77 e, portanto, devem ser bem conhecidas. Esta seção é baseada na seção 13 do padrão ISO (1991), que contém um tratamento mais formal. Seguimos o arranjo das diferentes funções e sub-rotinas no padrão, mas explicamos diretamente na lista. Para um tratamento mais detalhado, nos referimos a Metcalf e Reid (1990, 1993). Quando um parâmetro abaixo é opcional, ele é dado em minúsculas. Quando uma lista de argumentos contém vários argumentos, a função pode ser chamada por argumentos relacionados à posição ou por uma palavra-chave. A palavra-chave deve ser usada se alguns argumentos anteriores não estiverem incluídos. As palavras-chave normalmente são os nomes que são fornecidos abaixo. Nem sempre damos todas as limitações naturais às variáveis, por exemplo, que a classificação não pode ser negativa. A função PRESENT (A) retorna. TRUE. Se o argumento A estiver na lista de chamadas,.FALSE. No outro caso. O uso é ilustrado no programa de exemplo no capítulo 8 do texto principal. Os seguintes estão disponíveis no Fortran 77: ABS, AIMAG, AINT, ANINT, CMPLX, CONJG, DBLE, DIM, DPROD, INT, MAX, MIN, MOD, NINT, REAL e SIGN. Além disso, o CEILING, o FLOOR e o MODULO foram adicionados ao Fortran 90. Apenas o último é difícil de explicar, o que é mais fácil de usar com os exemplos do ISO (1991). As seguintes funções do Fortran 77 podem usar um parâmetro tipo como Em AINT (A, kind). AINT, ANINT, CMPLX, INT, NINT e REAL. Um fato histórico é que as funções numéricas no Fortran 66 tiveram que ter nomes específicos (diferentes) em precisões diferentes, e esses nomes explícitos ainda são os únicos que podem ser usados ​​quando um nome de função é passado como um argumento. Uma tabela completa de todas as funções numéricas segue. Os nomes que são indicados com uma estrela não podem ser usados ​​como argumentos. Algumas funções, como INT e IFIX, possuem dois nomes específicos, ou podem ser usados. Por outro lado, algumas funções não possuem nenhum nome específico. Abaixo, eu uso C para valores de ponto flutuante complexos, D para valores de ponto flutuante em dupla precisão, I para inteiros e R para valores de ponto flutuante em uma única precisão. O truncamento é para zero, INT (-3,7) torna-se -3. Mas o arredondamento está correto, NINT (-3,7) torna-se -4. As novas funções FLOOR e CEILING truncam para menos e mais infinito, respectivamente. A função CMPLX pode ter um ou dois argumentos, se dois argumentos estiverem presentes, esses devem ser do mesmo tipo, mas não COMPLEXOS. A função MOD (X, Y) calcula X-INT (XY) Y. A função de transferência de sinal SIGN (X, Y) assume o sinal do segundo argumento e o coloca no primeiro argumento, ABS (X) se Y gt 0 e - ABS (X) se Y lt 0. Diferença positiva DIM é uma função que nunca usei, mas DIM (X, Y) dá X-Y se esta for positiva e zero no outro caso. O produto interno DPROD, por outro lado, é uma função muito útil que dá o produto de dois números em uma única precisão como um número de dupla precisão. É rápido e preciso. As duas funções MAX e MIN são únicas porque podem ter um número arbitrário de argumentos, mas pelo menos dois. Os argumentos devem ser do mesmo tipo, mas não podem ser do tipo COMPLEX. O mesmo que no Fortran 77. Todas as funções trigonométricas funcionam em radianos. Estão disponíveis: ACOS, ASIN, ATAN, ATAN2, COS, COSH, EXP, LOG, LOG10, SIN, SINH, SQRT, TAN e TANH. Um fato histórico é que as funções matemáticas no Fortran 66 tiveram que ter nomes específicos (diferentes) em precisões diferentes, e esses nomes explícitos ainda são os únicos que podem ser usados ​​quando um nome de função é passado como um argumento. Uma tabela completa de todas as funções matemáticas segue. Abaixo, eu uso C para valores de ponto flutuante complexos, D para valores de ponto flutuante em dupla precisão, I para inteiros e R para valores de ponto flutuante em uma única precisão. O objetivo da maioria dessas funções é óbvio. Note que todos são apenas definidos para números de ponto flutuante e não para números inteiros. Portanto, você não pode calcular a raiz quadrada de 4 como SQRT (4). Mas, em vez disso, você pode usar NINT (SQRT (REAL (4))). Observe também que todas as funções complexas retornam o valor principal. A raiz quadrada dá um resultado real para um argumento real em uma única ou dupla precisão e um resultado complexo para um argumento complexo. Portanto, SQRT (-1.0) dá uma mensagem de erro (geralmente já no tempo de compilação), enquanto você pode obter a raiz quadrada complexa usando as seguintes instruções. O argumento para os logaritmos usuais deve ser positivo, enquanto o argumento para CLOG deve ser diferente de zero. O módulo para o argumento para ASIN e ACOS deve ser no máximo 1. O resultado será dentro de - pi2, pi2 e 0, pi, respectivamente. A função ATAN retornará um valor em - pi2, pi2. A função ATAN2 (Y, X) arctan (y, x) retornará um valor em (-pi, pi. Se Y é positivo, o resultado será positivo. Se Y é zero, o resultado será zero se X for positivo e Se X for negativo, o resultado será negativo. Se X for zero, o resultado será mais ou menos pi2. Tanto o X quanto o Y não podem ser zero simultaneamente. O propósito da função é evitar a divisão Por zero. Uma limitação natural para as funções matemáticas é a precisão e o alcance limitados, o que significa que, por exemplo, EXP pode causar subfluível ou transbordar em valores bastante comuns do argumento. As funções trigonométricas obterão uma precisão muito baixa para grandes argumentos. São dependentes da implementação e devem ser fornecidos no manual dos vendedores. As funções abaixo executam operações de e para cadeias de caracteres. Tenha em atenção que o ACHAR funciona com o conjunto de caracteres ASCII padrão enquanto CHAR trabalha com a representação no computador que você está usando. Rotas com Pare duas cordas usando a classificação de acordo com ASCII. Se uma seqüência de caracteres for menor que a outra, os espaços em branco são adicionados no final da string curta. Se uma string contém um caractere fora do conjunto de caracteres ASCII, o resultado é dependente da implementação. LEN (STRING) retorna o comprimento de uma seqüência de caracteres. Não é necessário atribuir um valor à variável STRING. O primeiro retorna o tipo de argumento real, que pode ser do tipo INTEGER, REAL, COMPLEX, LOGICAL ou CHARACTER. O argumento X não precisa ser atribuído a nenhum valor. O segundo retorna um número inteiro com o número de dígitos solicitado e o terceiro retorna o tipo para números de ponto flutuante com precisão numérica, pelo menos, dígitos P e um intervalo exponencial decimal entre - R e R. Os parâmetros P e R devem ser números inteiros escalares. Pelo menos um de P e R deve ser dado. O resultado de SELECTEDINTKIND é um número inteiro de zero e para cima, se o tipo desejado não estiver disponível, você obterá -1. Se vários tipos implementados satisfizerem a condição, é usado o que possui o menor intervalo decimal. Se ainda houver vários tipos ou tipos que satisfaçam a condição, será usado aquele com o menor número genérico. O resultado de SELECTEDREALKIND também é um inteiro de zero e para cima se o tipo desejado não estiver disponível, então -1 é retornado se a precisão não estiver disponível, -2 se o intervalo exponente não estiver disponível e -3 se nenhum dos requisitos Estão disponíveis. Se vários tipos implementados satisfizerem a condição, aquele com a menor precisão decimal é retornado, e se houver vários deles, aquele com o número menos gentil é retornado. Exemplos são apresentados no capítulo 2 do texto principal. Exemplos de tipos em algumas implementações diferentes (NAG e Cray) são fornecidos no Apêndice 6. LOGICAL (L, kind) converte entre diferentes tipos de variáveis ​​lógicas. As variáveis ​​lógicas podem ser implementadas de várias maneiras, por exemplo, com uma representação física ocupando um bit (não recomendado), um byte, uma palavra ou talvez até uma palavra dupla. Essa diferença é importante se COMMON e EQUIVALENCE com variáveis ​​lógicas tiverem sido mal utilizados em um programa da maneira tradicional da programação Fortran 66. 8. Funções de indicação numérica: estas funções funcionam com um certo modelo de aritmética de número inteiro e ponto flutuante, ver ISO (1991), seção 13.7.1. As funções retornam propriedades de números do mesmo tipo que a variável X. Que pode ser real e em alguns casos inteiro. Funções que retornam propriedades do argumento real X estão disponíveis na seção 12 abaixo, funções de manipulação de ponto flutuante. BITSIZE (I) retorna o número de bits de acordo com o modelo de representação de bits no padrão ISO (1991), seção 13.5.7. Normalmente, obtemos o número de bits em uma (toda) palavra. O modelo para a representação de bits no ISO padrão (1991), seção 13.5.7 é usado. TRANSFER (SOURCE, MOLD, tamanho) especifica que a representação física do primeiro argumento SOURCE deve ser tratada como se tivesse tipo e parâmetros como o segundo argumento MOLD. Mas sem convertê-lo. O objetivo é dar a possibilidade de mover uma quantidade de um determinado tipo através de uma rotina que não tenha exatamente esse tipo de dados. 12. Funções de manipulação de ponto flutuante: essas funções funcionam em um determinado modelo de aritmética de número inteiro e ponto flutuante, veja o ISO padrão (1991), seção 13.7.1. As funções retornam números relacionados à variável real X do tipo REAL. Funções que retornam propriedades para os números do mesmo tipo que a variável X estão na seção 8 (funções de consulta numérica). DOTPRODUCT (VECTORA, VECTORB) faz um produto escalar de dois vetores, que devem ter o mesmo comprimento (mesmo número de elementos). Observe que se VECTORA for do tipo COMPLEX, o resultado é SUM (CONJG (VECTORA) VECTORB). MATMUL (MATRIXA, MATRIXB) faz o produto de matriz de duas matrizes, que devem ser consistentes, ou seja, as dimensões como (M, K) e (K, N). Usado no capítulo 11 do texto principal. 14. Funções de matriz: ALL (MASK, dim) retorna um valor lógico que indica se todas as relações em MASK são. TRUE. . Somente a dimensão desejada se o segundo argumento for dado. QUALQUER (MASK, dim) retorna um valor lógico que indica se qualquer relação na MASK é. TRUE. . Somente a dimensão desejada se o segundo argumento for dado. COUNT (MASK, dim) retorna um valor numérico que é o número de relações em MASK que são. TRUE. . Somente a dimensão desejada se o segundo argumento for dado. MAXVAL (ARRAY, dim, mask) retorna o maior valor na matriz ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo apenas da dimensão desejada se o segundo argumento DIM for dado. MINVAL (ARRAY, dim, mask) retorna o menor valor no array ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo apenas da dimensão desejada se o segundo argumento DIM for dado. PRODUCT (ARRAY, dim, mask) retorna o produto de todos os elementos no array ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo apenas da dimensão desejada se o segundo argumento DIM for dado. SUM (ARRAY, dim, máscara) retorna a soma de todos os elementos na matriz ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo apenas da dimensão desejada se o segundo argumento DIM for dado. Um exemplo é dado no Apêndice 3, seção 10. ALLOCATED (ARRAY) é uma função lógica que indica se a matriz é alocada. LBOUND (ARRAY, dim) é uma função que retorna o limite de dimensão inferior para o ARRAY. Se DIM (a dimensão) não for dado como um argumento, você obtém um vetor inteiro, se DIM estiver incluído, você obtém o valor inteiro exatamente com o limite de dimensão inferior, para o qual você perguntou. SHAPE (SOURCE) é uma função que retorna a forma de uma SOURCE de matriz como um vetor inteiro. SIZE (ARRAY, dim) é uma função que retorna o número de elementos em uma matriz ARRAY. Se DIM não for dado e o número de elementos na dimensão relevante se DIM estiver incluído. UBOUND (ARRAY, dim) é uma função semelhante à LBOUND que retorna os limites dimensionais superiores. MERGE (TSOURCE, FSOURCE, MASK) é uma função que une dois arrays. Ele fornece os elementos em TSOURCE se a condição em MASK for. TRUE. E FSOURCE se a condição em MASK for. FALSE. Os dois campos TSOURCE e FSOURCE devem ser do mesmo tipo e da mesma forma. O resultado também é desse tipo e dessa forma. Também a MÁSCARA deve ter a mesma forma. Aqui, damos um exemplo bastante completo do uso do MERGE, que também usa RESHAPE da próxima seção para criar matrizes de teste adequadas. Observe que as duas sub-rotas WRITEARRAY e WRITELARRAY são rotinas de teste para escrever matrizes que, no primeiro caso, são de tipo REAL, no segundo caso de tipo LOGICAL. A seguinte saída é obtida PACK (ARRAY, MASK, vetor) mapeia uma matriz para um vetor com o controle de MASK. A forma da matriz lógica MASK deve concordar com a de ARRAY ou MASK deve ser um escalar. Se o VECTOR estiver incluído, ele deve ser uma matriz de rank 1 (ou seja, um vetor) com pelo menos tantos elementos como aqueles que são verdadeiros em MASK e têm o mesmo tipo de ARRAY. Se MASK for um escalar com o valor. TRUE. Então o VECTOR deve ter o mesmo número de elementos que ARRAY. O resultado é um vetor com tantos elementos como aqueles em ARRAY que obedecem às condições se VECTOR não estiver incluído (ou seja, todos os elementos se MASK for um escalar com valor. TRUE). No outro caso, o número de elementos do resultado será igual ao de VECTOR. Os valores serão os aprovados, isto é, os valores que atendem a condição e estarão na ordem Fortran comum. Se o VECTOR estiver incluído e o número de seus elementos exceder o número de valores aprovados, os valores de falta necessários para o resultado são retirados das posições correspondentes no VECTOR. O exemplo a seguir é baseado na modificação de um para MERGE. Mas eu dou agora apenas os resultados. SPREAD (SOURCE, DIM, NCOPIES) retorna uma matriz do mesmo tipo que o argumento SOURCE com a classificação aumentada em um. Os parâmetros DIM e NCOPIES são inteiros. Se NCOPIES é negativo, o valor zero é usado. Se SOURCE for um escalar, então SPREAD torna-se um vetor com elementos NCOPIES que todos têm o mesmo valor que SOURCE. O parâmetro DIM indica qual índice deve ser estendido. Tem que estar dentro do intervalo 1 e 1 (classificação de SOURCE). Se SOURCE for um escalar, então a DIM tem que ser uma. O parâmetro NCOPIES é o número de elementos nas novas dimensões. A discussão adicional é dada na solução ao exercício (11.1). UNPACK (VECTOR, MASK, ARRAY) dispersa um vetor para uma matriz sob o controle de MASK. A forma da matriz lógica MASK tem de concordar com a de ARRAY. A matriz VECTOR tem que ter o ranking 1 (isto é, um vetor) com pelo menos tantos elementos como os que são verdadeiros na MÁSCARA. E também tem que ter o mesmo tipo de ARRAY. Se ARRAY for dado como um escalar, então ele é considerado uma matriz com a mesma forma de MASK e os mesmos elementos escalares em todos os lugares. O resultado será uma matriz com a mesma forma de MASK e do mesmo tipo que o VECTOR. Os valores serão aqueles do VECTOR que são aceitos (ou seja, aqueles que cumprem a condição em MASK), tomados na ordem Fortran comum, enquanto nas posições restantes em ARRAY os valores antigos são mantidos. RESHAPE (SOURCE, SHAPE, pad, order) constrói uma matriz com uma forma especificada SHAPE a partir dos elementos em uma dada fonte SOURCE. Se o PAD não estiver incluído, então o tamanho da SOURCE deve ser pelo menos PRODUCT (SHAPE). Se o PAD estiver incluído, ele deve ter o mesmo tipo de SOURCE. Se ORDER estiver incluído, ele deve ser um array INTEIRO com a mesma forma que SHAPE e os valores devem ser uma permutação de (1,2,3. N), onde N é o número de elementos em SHAPE. Tem que ser menor ou igual a 7. O resultado tem, naturalmente, uma forma SHAPE e os elementos são aqueles em SOURCE. Possivelmente complementado com PAD. As diferentes dimensões foram permutadas na atribuição dos elementos se ORDER fosse incluído, mas sem influenciar a forma do resultado. Alguns exemplos simples são dados na seção anterior e próxima e também no Apêndice 3, seção 9. Um exemplo mais complicado, ilustrando também os argumentos opcionais, segue. A saída do programa acima é a seguinte. As funções de mudança retornam a forma de uma matriz inalterada, mas movem os elementos. Eles são bastante difíceis de explicar, então eu recomendo estudar também o ISO padrão (1991). CSHIFT (ARRAY, SHIFT, dim) executa mudança circular por posições SHIFT para a esquerda se SHIFT for positivo e à direita se for negativo. Se ARRAY é um vetor, a mudança está sendo feita de forma natural, se for uma matriz de uma classificação mais alta, então a mudança está em todas as seções ao longo da dimensão DIM. Se DIM estiver faltando, é considerado 1, em outros casos tem que ser um número inteiro escalar entre 1 e n (onde n é igual ao grau de ARRAY). O argumento SHIFT é um inteiro escalar ou uma matriz de número inteiro de posição n-1 e a mesma forma que o ARRAY. Exceto ao longo da dimensão DIM (que é removido por causa da classificação mais baixa). Diferentes seções podem, portanto, ser deslocadas em várias direções e com vários números de posições. EOSHIFT (ARRAY, SHIFT, limite, dim) executa deslocamento para a esquerda se SHIFT for positivo e à direita se for negativo. Em vez de os elementos deslocados, novos elementos são retirados do LIMITE. Se ARRAY é um vetor, a mudança está sendo feita de forma natural, se for uma matriz de maior classificação, a mudança em todas as seções é ao longo da dimensão DIM. Se DIM estiver faltando, é considerado 1, em outros casos, ele tem que ter um valor inteiro escalar entre 1 e n (onde n é igual ao grau de ARRAY). O argumento SHIFT é um inteiro escalar se o ARRAY tiver o ranking 1, no outro caso, ele pode ser um inteiro escalar ou uma matriz inteira de rank n-1 e com a mesma forma que o array ARRAY, exceto ao longo da dimensão DIM (que é removida Por causa da classificação mais baixa). O correspondente aplica-se ao BOUNDARY, que tem que ter o mesmo tipo de ARRAY. Se o parâmetro BOUNDARY estiver faltando você tem a escolha de valores zero,.FALSE. Ou em branco sendo usado, dependendo do tipo de dados. Diferentes seções podem assim ser deslocadas em várias direções e com vários números de posições. Um exemplo simples das duas funções acima para o caso do vetor segue, tanto o programa como a saída. Um exemplo simples das duas funções acima no caso da matriz segue. Eu usei aqui RESHAPE para criar uma matriz adequada para começar a trabalhar. O programa não é reproduzido aqui, apenas as principais declarações. TRANSPOSE (MATRIX) transpõe uma matriz, que é uma matriz de classificação 2. Ele substitui as linhas e colunas na matriz. MAXLOC (ARRAY, máscara) retorna a posição do maior elemento na matriz ARRAY. Se MASK estiver incluído apenas para aqueles que preencham as condições em MASK. O resultado é um vetor inteiro. Ele é usado na solução do exercício (11.1). MINLOC (ARRAY, máscara) retorna a posição do elemento mais pequeno no array ARRAY. Se MASK estiver incluído apenas para aqueles que preencham as condições em MASK. O resultado é um vetor inteiro ASSOCIADO (POINTER, target) é função lógica que indica se o POINTER do ponteiro está associado a algum alvo, e se um TARGET específico estiver incluído, ele indica se ele está associado exatamente a esse alvo. Se tanto POINTER como TARGET são ponteiros, o resultado é. TRUE. Somente se ambos estiverem associados ao mesmo alvo. Refiro o leitor ao capítulo 12 do texto principal, Ponteiros. Uma sub-rotina que retorna a data, a hora e o fuso horário. Pelo menos um argumento deve ser dado. DATE deve ser uma variável de caracteres de caracteres escalares com pelo menos 8 caracteres e é atribuído o valor CCYYMMDD por século, ano, mês e dia. Todos são dados numericamente, com espaços em branco se o sistema não incluir a data. TIME também deve ser uma variável de caracteres de caracteres escalares com pelo menos 10 caracteres e é atribuído um valor hhmmss. sss por hora em horas, minutos, segundos e milissegundos. Todos são dados numericamente com espaços em branco se o sistema não incluir um relógio. A ZONE deve ser uma variável de caracteres de caracteres escalares com pelo menos 5 caracteres e é atribuído o valor hhmm para sinal, tempo em horas e minutos para a diferença de horário local com UTC (que foi anteriormente chamado de Greenwich Mean Time). Todos são dados numericamente, com espaços em branco se o sistema não incluir um relógio. Na Suécia, obtemos 0100 no inverno e 0200 no verão, em Novosibirsk recebemos 0700. A variável VALUES é, em vez disso, um vetor inteiro com pelo menos 8 elementos, fornece a maneira mais fácil de usar os resultados de DATEANDTIME nos cálculos de um programa. Se o sistema não incluir a data ou a hora em que você obtém o valor - HUGE (0). Esse é o número inteiro mais pequeno no modelo, como saída. O vetor incluirá os seguintes elementos: ano, mês, dia, diferença de tempo em minutos. Horas, minutos, segundos e milissegundos. Subrutina que retorna a hora do sistema. Pelo menos um argumento deve ser dado. COUNT é um número inteiro escalar que é aumentado em um para cada ciclo até COUNTMAX. Onde começa mais uma vez. Se não houver relógio do sistema, então - HUGE (0) é retornado. COUNTRATE é um número inteiro escalar que dá o número de ciclos por segundo. Se não houver nenhum relógio do sistema, o valor zero é retornado. COUNTMAX é um inteiro escalar que fornece o valor máximo que COUNT pode alcançar. Se não houver nenhum relógio do sistema, zero será retornado. Uma sub-rotina que copia a seqüência de bits na posição FROMPOS e tem o comprimento LEN para direcionar TO a partir da posição TOPOS. Os bits restantes não são alterados. Todas as quantidades devem ser inteiras e todas, exceto TO, devem ter INTENT (IN), enquanto TO é suposto ter INTENT (INOUT) e ser do mesmo tipo tipo FROM FROM. A mesma variável pode ser FROM e TO. Algumas restrições naturais aplicam-se aos valores de LEN, FROMPOS e TOPOS e você também deve considerar o valor de BITSIZE. Uma sequência de números pseudo aleatórios pode ser gerada a partir de um valor inicial que é armazenado como um vetor inteiro. As sub-rotinas oferecem uma interface portátil para uma sequência de números aleatórios dependentes da implementação. Esta sub-rotina retorna na variável de número de ponto flutuante HARVEST uma (ou vários se HARVEST é uma matriz) números aleatórios entre zero e 1. Esta sub-rotina redefine ou fornece informações sobre o gerador de números aleatórios. Nenhum argumento deve ser fornecido. A variável de saída SIZE deve ser um inteiro escalar e fornece o número de inteiros (N) que o processador usa para o valor inicial. A variável de entrada PUT é um vetor inteiro que coloca os números iniciais fornecidos pelo usuário no gerador de números aleatórios. A variável de saída GET (também um vetor inteiro) lê o valor inicial presente. Exemplo: Um exemplo simples sobre o uso dessas funções está agora disponível. Mais informações sobre Atribuição de Arrays: Novo Fortran: instruções de atribuição de aritmética de array Fortran 90, Inicialização de Array, Implied DO, Fortran 90 Intrinsics: MAXLOC. MAXVAL. MINLOC. MINVAL. SOMA. COVER WHERE, ELED WHERE Structure Uma vez que você entra em uso sério de arrays em aplicações de engenharia e científica, não faz muito esforço para esticar as habilidades do seu computador. É apenas uma questão de aumentar a resolução da sua visão do mundo real. Você começa a se preocupar com o armazenamento da máquina e a velocidade da máquina, e tente lembrar algumas das coisas que você ouviu falar sobre unidades aritméticas pipelinadas, vetor e processamento paralelo. Parte da motivação por trás do Fortran 90, era tornar a utilização eficiente desses recursos da máquina mais transparente. Isso foi realizado através de algumas extensões de linguagem simples e um aumento substancial no conjunto de funções intrínsecas disponíveis. Os detalhes de muitos recursos de economia de tempo estão escondidos nas funções intrínsecas, onde você não precisa se preocupar com elas. Se você pensa em pipelines vetoriais em computadores, você deve perceber que os simples loops OD que operam com elementos de matriz são ótimas maneiras de manter as tubulações alimentadas. O seguinte segmento de programação fará muito bom trabalho de bombeamento de um fluxo de números em um multiplicador pipeline. No entanto, a adição de alguns sinos e assobios ao loop DO, pode dificultar a impossibilidade para um compilador aproveitar o processamento de pipeline (ou paralelo). Por exemplo, depois de gerar valores para elementos de c, talvez eu precise saber o valor máximo, valor mínimo e valor médio dos elementos em c. Um algoritmo bastante padrão para gerar esses valores dentro de um loop DO é: Observe que uma soma é gerada inicializando csum para zero antes do loop e adicionando cada elemento de c to csum à medida que o loop avança. Um valor máximo é obtido inicializando o cmax para um número tão negativo, que qualquer elemento de c excederá o primeiro valor da cmax à medida que os testes máximos prosseguem no loop. Uma ação semelhante é tomada começando com um valor muito grande para o cmin para obter o mínimo de todos os elementos em c. Como a geração de cmin, cmax e csum depende dos valores obtidos na última passagem pelo loop, essas operações não são diretamente apropriadas para o processamento em pipeline ou paralelo. Como resultado, um compilador geralmente desistirá tentando fazer qualquer coisa para vetorializar o loop DO. Fortran 90 incentiva você a manter o potencial de maior velocidade do computador, introduzindo uma taquigrafia para a parte do loop fazendo a multiplicação e fornecendo funções intrínsecas para cobrir as outras operações. Para programas longos, prefiro uma forma um pouco mais longa desta notação: isso deixa claro para quem lê seu programa que você realmente está operando com arrays e especifica claramente o alcance sobre o qual as operações ocorrem. Esta notação pode ser estendida para incluir um fator de salto (ou stride), comportando-se como o incremento de índice em uma declaração DO. Por exemplo, a soma dos elementos ímpares ímpares em c pode ser obtida com: A soma de elementos pares seria: Para matrizes de tamanho significativo, é improvável que o compilador gere um código de máquina mais eficiente da construção do loop DO, do que ele Usará as funções intrínsecas do Fortran 90. Portanto, vale a pena lembrar: SUM - Uma função intrínseca Fortran 90 para resumir os elementos da matriz fornecida como seu argumento. Se apenas o nome da matriz for fornecido (por exemplo, soma (c)), todos os elementos da matriz são somados. Uma porção selecionada da matriz pode ser somada, se uma expressão de intervalo inteiro for fornecida com o nome da matriz (.e. g. Sum (c (2:10)), resume os elementos 2 a 10 de c). Esta função pode levar dois outros argumentos opcionais, que serão abordados com mais detalhes, quando chegarmos a arrays multidimensionais. Vale a pena notar aqui que a opção MASK permite que você restrinja ainda mais os elementos que você incluirá na soma. Isso é incluído como um argumento com uma expressão lógica envolvendo uma matriz com o mesmo tamanho que a matriz sendo somada. Por exemplo: avalia a soma de todos os elementos em c que são positivos e avalia a soma de todos os elementos em c que são negativos. A declaração avalia a soma de todos os elementos em c para os quais os elementos correspondentes em b são maiores que 8 (veja somas. f para um programa de teste). MINVAL - Uma função Fortran 90 para obter o valor mínimo de todos os elementos contidos na matriz fornecida como argumento para a função. Os mesmos argumentos opcionais fornecidos em SUM estão disponíveis aqui. MINLOC - MINVAL dá-lhe o valor mínimo, mas não lhe diz qual elemento possui esse valor. Esta função Fortran 90 retorna o índice do elemento na matriz, cujo valor é mínimo. Se c (1) 1, c (2) 0 e c (3) -1, então minloc (c (1: 3)) retorna o número inteiro 3. Devido aos requisitos para uso com arrays multidimensionais, o valor desta função Deve ser retornado para uma matriz. Por exemplo, icminminloc (c (1: 3)) só funcionará se o icmin for declarado como uma matriz de número inteiro e o valor 3 será colocado no primeiro elemento do icmin. O argumento opcional MASK está disponível para esta função. MAXVAL - Uma função Fortran 90 para obter o valor máximo de todos os elementos contidos na matriz fornecida como argumento para a função. Os mesmos argumentos opcionais fornecidos em SUM, e MINVAL estão disponíveis aqui. MAXLOC - Esta função Fortran 90 retorna o índice do elemento na matriz, cujo valor é o máximo. Se c (1) 0, c (2) 1 e c (3) -1, então maxloc (c (1: 3)) retorna o inteiro 2. O argumento opcional MASK está disponível para esta função. Ao usar o argumento MASK na função SUM, geralmente é útil conhecer o número de elementos da matriz para a qual a expressão MASK é verdadeira. Isso é fornecido pela função COUNT intrinsic. Se array x tiver 10 valores, então contagem (x. lt. 0.75) produz o resultado INTEIRO 4. O argumento MASK é muito geral e não precisa incluir uma referência à matriz operada pela função intrínseca. Consulte uma matriz com o mesmo comprimento. Por exemplo, eu poderia ter matrizes contendo informações sobre n pessoas com idade contendo idades e peso contendo os pesos correspondentes. O peso médio daqueles de 30 a 39 anos pode ser obtido a partir da seguinte declaração: Uma outra característica geral dessas funções intrínsecas de matriz é que o argumento não precisa ser uma matriz simples. Pode ser uma expressão aritmética envolvendo arrays com os mesmos comprimentos. Por exemplo, de tempos em tempos, você terá uma série de resultados experimentais ydata e uma série de previsões teóricas correspondentes. Uma medida útil da qualidade de sua teoria (e talvez seus dados) é o desvio padrão, que requer um cálculo da soma dos quadrados das diferenças entre dados e teoria. Note-se que a ordem de operação aqui é tal que isso dá: sumsqdf (ydata (1) - ytheory (2)) 2 (ydata (2) - ytheory (2)) 2. À medida que você entra em tarefas de programação mais complexas, você pode encontrar a necessidade de aplicar o mesmo tipo de recursos de máscara, discutidos para a função intrínseca SUM, para instruções de atribuição de matrizes. Por exemplo, como você impede uma divisão por zero em uma declaração de divisão de matriz Isso é coberto pela estrutura WHERE, ELED WHERE, END WHERE,. Eu posso escrever. Posso fornecer mais informações para o caso de que um elemento de b seja zero com Você ficará tentado a pensar em WHERE, ELSE WHERE estruturas como análises para IF, ELSE IF, mas não carregam a comparação muito longe. A instrução ELSE WHERE é realmente a mesma que a instrução ELSE simples em uma estrutura IF. Não há equivalente a SEQUÊS em uma estrutura WHERE. ONDE permite, no máximo, duas ações possíveis. Para os elementos de matriz onde a máscara no WHERE inicial é verdadeira, as instruções imediatamente após o WHERE são executadas. Para os elementos em que a máscara é falsa, as instruções seguindo qualquer ELED WHERE são executadas (não OUTRO ONDE, então nada é feito). Para mais prática com WHERE, estudar onde. f o fim de array2.f. Many times you do not want to operate on the full range of the arrays dimension. Lets take the example that we only want to operate on elements 2 through 9. Elements 1 and 10 may be boundary values in some physical problem. For a standard DO loop, you would be doing something like: In Fortran 90 the above problem is not difficult. Just use the appropriate integer range notation. Array Initialization Those of you who have been studying the examples array1.f. array2.f. sums. f. and where. f. have already seen the two methods of array initialization introduced in the two examples above. However, I havent spelled out the key rules of the game. The simplest and most common is a full specification of the arrays contents in a DATA statement. You give the array name with no index specification followed by a data list containing values for every element of the array.. Constructs like 31. say repeat the value 1. in three consecutive array elements. I could have also done something like: to specifically fill individual array elements, but not initialize others. The curious construct (a(j),j1,4) is an implied DO loop, similar to the one associated with the WRITE statements in array1.f. The implied DO can also be used with direct data initialization in a type statement. For example: is equivalent to I could have generated a more complicated series: which is the same as Assignment of values within a REAL statement is new to Fortran 90, and this use of the implied DO is restricted to the REAL (dont try it within a value list for a DATA statement). It is also worth mentioning that although a statement is valid, the statement does not work. You cant use the repeat operation of a DATA statement in a REAL assignment. Remember that an implied DO loop is legal in DATA statement only as part of the list of variables to receive values: The above statement sets odd indexed elements of a to a value of 1.0 and even indexed elements to a value of 0.0. To see the values of even elements in a, I can apply an analogous implied DO loop to a WRITE statement. Please note that nothing has changed in positioning of DATA and REAL statements, assigning initial values to arrays. They are still non-executable, and must precede any executable statements in the program unit where they are applied. Mathematica (optional) If you are coasting in the Applications Labs, I recommend that you also take a look at the symbolic algebra package called Mathematica, and have provided some sample Mathematica scripts. It is in effect another programming language, but operating at a much higher lever. Fortran really only deals with numbers, but Mathematica will manipulate symbolic (algebraic) expressions. It can handle all of those factorization problems that drove you nuts in high school algebra, and do all the chain rule work to obtain general derivatives of functions. Better yet it can do a wide range of indefinite or definite integrals. You can also use its built in capabilities to solve complicated equations, both algebraically when possible, and numerically when no closed form algebraic solution exists. Later in the semester, you may want to use Mathematica to solve an Ordinary Differential Equation If you have the time, search the Web for Mathematica Tutorials. download tutorial notebooks, and use them by starting the XWindows interface to Mathematica with the command mathematica. To solve the problem at hand I recommend that you copy the file mathin into your home directory, and try it by typing math at the Unix prompt, and the typing ltltmathin when you get a Mathematica prompt. To exit Mathematica type Quit. Once you have a feel for what mathin is doing, modify it with vi to solve your problem. You can learn more about Mathematica by looking at the book Mathematica by Stephen Wolfram in one of the campus libraries (usually on reserve in the Math Library). You can also pick up a little from my list of basics. or Chris Duffys quick reference. Check you knowledge of this material, but first be sure your Web Browser works correctly. Back to the Table of Contents HomeCategory:Fortran Listed below are all of the tasks on Rosetta Code which have been solved using Fortran. Your Help Needed If you know Fortran . please write code for some of the tasks not implemented in Fortran . Fortran is the oldest programming language still in widespread use. The language has evolved considerably since it was first released in 1957. Fortran was original developed for scientific and engineering applications, and remains especially suited to numeric computation and scientific computing. By convention, versions before Fortran 90 are spelled with all uppercase letters (e. g. FORTRAN 66, FORTRAN 77), while starting with Fortran 90, the mixed case spelling is used (i. e. Fortran 90, Fortran 95, Fortran 2003 and Fortran 2008 ). The most recent standard is Fortran 2008 (ISOIEC 1539-1:2010). The next, informally known as Fortran 2017. is underway. FORTRAN 77, being quite old, lacks almost everything one expects from a modern programming language. It uses a fixed-length line and column oriented line format which was motivated by punch cards. Due to its age, and since FORTRAN compilers generally gave very good performance for numerical code, a lot of code, especially scientific code, was written in FORTRAN. Also, for quite a while there was no free Fortran 90 compiler, which also caused a lot of FORTRAN 77 code to be written even quite some time after Fortran 90 was standardized. Because of the large body of code written in FORTRAN 77 it remains relevant today. Indeed, every modern Fortran compiler still accepts FORTRAN 77 code. Fortran 90 was a major revision of the language. It introduced a new free-form source code format, modern programming language features like modules, pointers and user-defined types, an improved type system for built-in types and superiour built-in array handling. Newer Fortran standards (Fortran 2003 and Fortran 2008) added further modern features, like support for object oriented programming. inheritance. polymorphism. parallel processing. and interoperability with the C programming language. Subcategories This category has the following 3 subcategories, out of 3 total.

Comments