Lesson 2 of 3
Em andamento

Acesso aos dados do modelo ERA 5

Paulo Jorge 16 de Setembro, 2024

2.1 Objetivo da lição:

A presente lição tem por objetivo ensinar a realizar operações sobre ficheiros NetCDF do modelo ERA5. Ao longo da lição será demonstrada a abertura de um ficheiro no formato NetCDF do modelo ERA5, a aplicação de um cálculo trigonométrico simples que permite obter a direção e intensidade do vento a 10 metros através das componentes vetoriais U e V. Por fim, será realizada a exportação dos dados calculados para um ficheiro txt tornando os dados utilizáveis em outros programas como os sistemas de informação geográfica.

O programa irá realizar os seguintes passos:

1. Abrir um ficheiro no formato NetCDF

2. Calcular a direção e intensidade do vento a 10 metros com base nas componentes vetoriais U e V;

3. Exportar os dados para um ficheiro de texto

2.2 Bibliotecas netCDF4

No processo será utilizada a biblioteca netCDF4 que oferece um interface Python para a livraria netCDF C. Esta lição não pretende descrever exaustivamente a biblioteca. Convidam-se os interessados em acompanhar as descrições seguintes através da documentação.

2.3 Abertura do ficheiro

Os dados obtidos a partir do CDS API seguindo o processo descrito na lição Download de dados do modelo ERA5 usando a linguagem de programação Python apresentam-se sobre a forma de um ficheiro netCDF.

O formato Unidata’s Network Common Data Form (netCDF) é um formato muito utilizado para partilha de conjuntos de dados multidimensionais entre os investigadores e a comunidade de utilizadores associada às disciplinas de Geofísica (e.g. meteorologia, oceanografia, etc.). O formato foi desenvolvido pela Unidata que mantém um repositório com a documentação técnica. Será importante ainda referir que o formato netCDF é reconhecido pela Open Geospatial Consortium (OGC) como um formato standard – OGC CF-netCDF.

Transcrição da descrição do formato OGC CF-netCDF:

“netCDF is a set of software libraries and self-describing, machine-independent data formats that support the creation, access, and sharing of array-oriented scientific data. The conventions for climate and forecast (CF) metadata are designed to promote the processing and sharing of netCDF files. The conventions define metadata that provide a definitive description of what the data represents, and the spatial and temporal properties of the data.

The OGC CF-netCDF standard consists of a suite of standards that support encoding of digital geospatial information representing space/time-varying phenomena. Although it was originally developed for the Earth science community, netCDF can be used to communicate and store a wide variety of multidimensional data. The netCDF data model and encodings are particularly well suited to providing data in forms familiar to atmospheric and oceanic scientists, specifically, as sets of related arrays” (from OGC CF-netCDF webpage).

A instalação do pacote netCDF4 pode ser realizado via pip ($ pip install netCDF4) ou utilizando a linha de comandos da Anaconda ($ conda install -c conda-forge netCDF4).

A abertura do ficheiro netCDF utilizando a linguagem Python é feita de uma forma simples correndo os comandos segintes:

>>> from netCDF4 import Dataset
>>> rootgrp = Dataset("test.nc", "w", format="NETCDF4") # create the object rootgrp of type Dataset
>>> print(rootgrp.data_model)
NETCDF4
>>> rootgrp.close() # close the object rootgrp

Após correr o código Download de dados do modelo ERA5 usando a linguagem de programação Python o utilizador passa a ter dois novos ficheiros dentro da pasta selecionada para download:

  • download_1959.nc
  • download_1960.nc

Para o presente exercício será aberto o ficheiro download_1960.nc

Uma das caraterísticas que torna o uso do formato netCDF muito comum é a possibilidade de encapsular metainformação no ficheiro. O acesso à metainformação é feito através do print do objeto do tipo NetCDF4 dataset. De seguida é apresentado o output do print.

Ao ler a informação disponível ficamos a saber que o ficheiro apresenta uma matriz multidimensional com a dimensões: longitude, latitude e tempo.

As variáveis presentes no ficheiro:

  • longitude do tipo float32 # 181 valores de longitude
  • latitude do tipo float32  # 141 valores de latitude
  • tempo do tipo int32 # 8784 valores que correspondem a todas as horas de 1960 (ano bissexto com 366 dias)
  • u10 do tipo int16 (time, latitude, longitude) # a componente vectorial u do vento a 10 metros (8784*141*181 valores)
  • v10 do tipo int16 (time, latitude, longitude) # a componente vectorial v do vento a 10 metros (8784*141*181 valores)

Output:

<classnetCDF4._netCDF4.Dataset‘>

root group (NETCDF3_64BIT_OFFSET data model, file format NETCDF3):

Conventions: CF-1.6

history: 2023-09-30 08:15:40 GMT by grib_to_netcdf-2.25.1: /opt/ecmwf/marsclient/bin/grib_to_netcdf.bin S param o /cache/data6/adaptor.mars.internal-1696061678.3628552-18446-11-290d6a78-9e46-4e48-b054a5710521250e.nc /cache/tmp/290d6a78-9e46-4e48-b054a5710521250eadaptor.mars.internal-1696060971.7165616-18446-16-tmp.grib

dimensions(sizes): longitude(181), latitude(141), time(8784)

variables(dimensions): float32 longitude(longitude), float32 latitude(latitude), int32 time(time), int16 u10(time, latitude, longitude), int16 v10(time, latitude, longitude)

groups:

Outros comandos importantes:

Impressão das dimensões:

>>> print(f.dimensions) # para imprimir as dimensões da matriz

Output:

{‘longitude’: <classnetCDF4._netCDF4.Dimension‘>: name = ‘longitude‘, size = 181,

‘latitude’: <classnetCDF4._netCDF4.Dimension‘>: name = ‘latitude‘, size = 141,

‘time’: <classnetCDF4._netCDF4.Dimension‘>: name = ‘time‘, size = 8784}

Impressão das variáveis:

>>> print(f.variables) # descrição da variáveis

Output:

Na secção seguinte será explicado como aceder e fazer sub conjuntos do objeto no corpo do programa.

Contudo, podemos aceder ao valor das variáveis com o comando:

>>>print(f.variables[‘latitude’][0].data) # print do valor de latitude no primeiro valor do vetor da variável latitude.

2.4 Cálculo da direção e intensidade do vento a 10 metros

O cálculo da direção e intensidade do vento a 10 metros será realizado com o formulário publicado pelo ECMWF com as variáveis u10 e v10.

Transcrição da explicação publicada pelo ECMWF:

The meteorological wind direction is the direction from which the wind is blowing.

Wind direction increases clockwise such that a northerly wind is 0°, an easterly wind is 90°, a southerly wind is 180°, and a westerly wind is 270°.
Because trigonometry uses a polar coordinate system in which 0° is along the x axis, the meteorological angle definition can wreak havoc on typical angle calculations.

Com o comando seguinte obtemos informação sobre a variável u10 que é importante para entender os passos seguintes.

>>> f.variables[‘u10’]  # O comando f.variables[‘v10’] tem um output semelhante para a componente V

Output:

Através da análise do output sabemos que a variável u10 é do tipo int16 (Integer (-32768 to 32767)), ou seja, apresenta valores inteiros no domínio indicado. Todavia sabemos que os valores das componentes U e V são valores reais positivos ou negativos. Isto acontece porque o valor de U resulta da operação:

u10(real) = u10(int16)*scale_factor + add_offset

A biblioteca NetCDF4 executa a operação de forma automática mas é importante conhecer as operações que estão a ser realizadas.

Os cálculos da Direção e Intensidade são realizados através da função getDirInt apresentada de seguida, resolvendo a questão da apresentar os ângulos de 0 a 360 de acordo com os quadrantes com base na função math.atan2.

2.5 Exportar os valores para um ficheiro de texto

Para demonstrar a exportação de dados para um ficheiro de texto, tornando-os utilizáveis em outras aplicações como os sistemas de informação geográfica, vamos criar uma programa que vai exportar os valores de direção e intensidade do vento para uma grelha regular de pontos do modelo ERA5 para as 02:00 de 01 de janeiro de 1960.

Antes de avançar é importante fazer a impressão da metainformação da variável tempo. Após analisar o resultado verificamos que esta variável apresenta um vetor com 8784 valores em que cada valor é o número de horas a contar de uma referência (1900-01-01 00:00:00.0).

O código fonte para fazer o processo de exportação está acessível no GitHub em: openNetCDF_export_grid_of_wind_values_at_specific_hour_to_txt.py

O ficheiro de texto resultante pode ser importado por outras aplicações como a aplicação de Sistemas de Informação Geográfica, open source, QGIS. O resultado após a aplicação de regras simples de simbolização é a apresentada na imagem seguinte. Não faz parte desta lição a explicação do processo de apresentação de dados em QGIS.

Existem muitos recursos na internet com a explicação de geração de mapas de vetores em ambiente SIG. Uma explicação do processo para gerar um mapa semelhante ao apresentado de seguida pode ser consultada na página: How do create a wind map in QGIS.