Skip to content
Carlos Frederico Bastarz edited this page May 25, 2022 · 1 revision

pyBAM - Python Interface to BAM

O pyBAM é uma interface projetada para acessar os arquivos espectrais (não pós-processados) do modelo BAM na sua coordenada vertical natural (sigma ou híbrida) diretamente no Python.

Por meio desta interface os campos atmosféricos tridimensionais do modelo BAM são acessados no Python via o xarray, o qual possibilita criar arrays multidmensionais com metadados que podem ser utilizados em operações matemáticas e em diferentes tipos de gráficos em coordenadas georeferenciadas.

A seguir serão apresentados os passos para obtenção, instalação e uso do pyBAM.

Obtenção e Instalação

O pyBAM depende da biblioteca sigioBAM, que deve ser instalada no ambiente para que o Python possa acessá-la

instação da biblioteca sigioBAM

Para obter e instalar o sigioBAM, siga os passos a seguir:

Obtenção:

svn export https://svn.cptec.inpe.br/slib/trunk/sharedLibs/sigioBAM

Compilação:

cd sigioBAM
./autogen.sh
./configure --prefix=/opt/sigioBAM
make
make install

Obs.: Caso não seja root do sistema, instale a biblioteca na pasta pessoal e prossiga para o próximo passo.

Configuração:

É necessário incluir o caminho de instalação do sigioBAM no path do sistema para que o Python possa acessar a biblioteca. Então é necessário criar uma váriável de ambiente e exportá-la. Se você tiver acesso root, edite o arquivo /etc/bash.bashrc, caso contrário edite o arquivo $HOME/.bashrc. Em qualquer um dos arquivos /etc/bash.bashrc ou $HOME/.bashrc, inclua as seguintes linhas:

export SIGIOBAM=/opt/sigioBAM
export LD_LIBRARY_PATH=/${SIGIOBAM}/lib:${LD_LIBRARY_PATH}

Obs.: é importante a criação da variável SIGIOBAM pois a biblioteca pyBAM irá procurar por esta variável durante a instalação do pacote.

Obtenção e Instalação do pyBAM

No passo anterior foi instalada a dependência para o uso da interface Python do modelo BAM, nesse passo serão apresentados os procedimentos de obtenção e instalação do pyBAM. Embora não seja um requerimento, é uma boa prática trabalhar com ambientes no Python. Para isso, considerando o uso da distribuição Anaconda, crie um ambiente para a instalação do pyBAM e das suas dependências (numpy, xarray, matplotlib e cartopy). Para criar um ambiente no Anaconda, siga os passos a seguir.

Obs.: Para evitar problemas relacionados com a versão dos pacotes a serem instalados, utilize exatamente as versões indicadas do Python.

conda create -n pyBAM python=3.7.6

Ative o ambiente criado e instale as dependências do pyBAM:

conda activate pyBAM
conda install numpy
conda install -c conda-forge xarray dask netCDF4 bottleneck
conda install matplotlib
conda install -c conda-forge cartopy

Para obter e instalar o pyBAM, siga os passos a seguir. Neste passo, você deve estar com o ambiente pyBAM ativado (caso contrário, o pyBAM será instalado fora do ambiente que contém as dependências necessárias). Escolha um local adequado (eg., $HOME/Downloads) e baixe o pacote do pyBAM a partir do repositório:

Obtenção:

svn export https://svn.cptec.inpe.br/pybam/trunk/pyBAM

Compilação e instalação:

cd pyBAM
python setup.py build
python setup.py install

Uso do pyBAM

Nos passos anteriores foi apresentada a forma de obtenção e instalação das dependências e o pacote pyBAM. A seguir será demostrado o uso básico do pacote.

O primeiro passo é carregar o pacote no ambiente Python. Uma vez que o ambiente Python já esteja em execução basta importar o pacote:

$ python

Python 3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pyBAM as pb

para a visualização de figuras é necessário carregar o pacote matplotlib:

>>> import matplotlib.pyplot as plt

O pacote pyBAM lida diretamente com os arquivos espectrais gerados pelo modelo BAM. As variáveis no espaço espectral são recompostas para o espaço físico (ponto de grade) e são organizadas em estruturas de dados em 2 ou 3 dimensões utilizando a biblioteca xarray do Python.

Para acessar um arquivo do BAM basta informar o arquivo header correspondente. Por exemplo um arquivo de previsão é acessado informando o arquivo dir, a previsão de 0 horas (condição inicial) é acessada por meio do arquivo dic, já a condição inicial inicializada é acessada pelo arquivo din. No caso da condição inicial que é lida pelo modelo BAM pode ser acessada criando-se um arquivo header, semelhante aos arquivos de previsão, porém com o nome dun, por exemplo, GANL2021021500.dun.TQ0299L064. Então para acessar qualquer um destes arquivos é realizada a seguinte operação no ambiente Python (aqui será demonstrado com um arquivo de análise icn):

>>> bFile = pb.openBAM('GFCTCPT20191115002019111500F.dic.TQ0299L064')

para plotar uma variável em um determinado nível é realizada a seguinte operação:

>>> bFile.plotField('VIRTUAL TEMPERATURE', zlevel=1)

Obs.: se a opção zlevel for omitida será plotado o primeiro nível da variável.

Como resultado teremos o seguinte mapa:

vt_l1.png

É possível obter campos 2D ou 3D para serem manipulados diretamente no Python, por exemplo, um campo 2D é obtido da seguinte forma:

>>> field = bFile.getField('VIRTUAL TEMPERATURE', zlevel=55)

desta forma a variável field conterá um xarray com a temperatura virtual no nível 55:

>>> field = bFile.getField('VIRTUAL TEMPERATURE', zlevel=55)
>>> print(field)
<xarray.DataArray 'VIRTUAL TEMPERATURE' (lat: 450, lon: 900)>
array([[195.43694, 195.43604, 195.43513, ..., 195.43967, 195.43877,
        195.43785],
       [195.54573, 195.54234, 195.53894, ..., 195.5558 , 195.55246,
        195.5491 ],
       [195.70177, 195.6979 , 195.694  , ..., 195.71307, 195.70935,
        195.70558],
       ...,
       [240.0018 , 239.99652, 239.99113, ..., 240.01709, 240.01208,
        240.00699],
       [239.82939, 239.82619, 239.82297, ..., 239.83885, 239.83572,
        239.83257],
       [239.6583 , 239.65721, 239.65614, ..., 239.66148, 239.66042,
        239.65936]], dtype=float32)
Coordinates:
  * lat      (lat) float32 89.69 89.3 88.9 88.5 ... -88.5 -88.9 -89.3 -89.69
  * lon      (lon) float32 0.0 0.4 0.8 1.2 1.6 ... 358.0 358.4 358.8 359.2 359.6
>>>

Por outro lado, para obter campos 3D utiliza-se o método getField3D. Pelo fato dos arquivos estarem no espaço espectral é necessária a conversão para o espaço físico, e este processo leva um pouco de tempo e depende da máquina onde está sendo executado:

>>> field3D = bFile.getField3D('VIRTUAL TEMPERATURE')
VIRTUAL TEMPERATURE  has  64  zlevels
This operation will take a while ...
100%|===================================================|64/64 [01:48<00:00,  1.69s/it]
>>> print(field3D)
<xarray.DataArray 'VIRTUAL TEMPERATURE' (zlev: 64, lat: 450, lon: 900)>
array([[[252.69609, 252.69844, 252.70079, ..., 252.68913, 252.69144,
         252.69376],
        [252.21732, 252.22253, 252.22774, ..., 252.20169, 252.2069 ,
         252.21211],
        [251.98215, 251.9921 , 252.00203, ..., 251.95232, 251.96225,
         251.9722 ],
        ...,
        [248.31041, 248.29773, 248.28464, ..., 248.34602, 248.33456,
         248.3227 ],
        [247.39056, 247.38445, 247.37819, ..., 247.4079 , 247.40228,
         247.3965 ],
        [246.86551, 246.86342, 246.86131, ..., 246.8717 , 246.86966,
         246.86758]],
...
        [272.3629 , 272.36194, 272.36096, ..., 272.36588, 272.3649 ,
         272.3639 ],
        [272.41965, 272.41913, 272.4186 , ..., 272.4212 , 272.4207 ,
         272.42017],
        [272.4776 , 272.47736, 272.4771 , ..., 272.47833, 272.4781 ,
         272.47784]],

       [[239.36282, 239.36331, 239.3638 , ..., 239.36139, 239.36186,
         239.36234],
        [239.29114, 239.29208, 239.29305, ..., 239.28831, 239.28925,
         239.29018],
        [239.23221, 239.23349, 239.23477, ..., 239.22847, 239.2297 ,
         239.23096],
        ...,
        [268.84753, 268.8466 , 268.84564, ..., 268.85037, 268.84943,
         268.84848],
        [268.90298, 268.90225, 268.90155, ..., 268.90512, 268.9044 ,
         268.9037 ],
        [268.95297, 268.9526 , 268.9522 , ..., 268.95416, 268.95377,
         268.95337]]], dtype=float32)
Coordinates:
  * lat      (lat) float32 89.69 89.3 88.9 88.5 ... -88.5 -88.9 -89.3 -89.69
  * lon      (lon) float32 0.0 0.4 0.8 1.2 1.6 ... 358.0 358.4 358.8 359.2 359.6
  * zlev     (zlev) int64 1 2 3 4 5 6 7 8 9 10 ... 55 56 57 58 59 60 61 62 63 64

como as variáveis field e field3D são estruturas de dados do tipo xarray, elas carregam com si todas as funcionalidades do pacote xarray. Para plotar qualquer um dos níveis da variável field3D basta executar a seguinte instrução:

>>> field3D.sel(zlev=2).plot()

o que resulta na seguinte imagem:

vt_l2_xarray_plot.png

é possível aplicar outros métodos do xarray, como por exemplo calcular a média zonal da variável e então plotar o resultado:

>>> zonal_mean = field3D.mean(dim='lon')
>>> zonal_mean.plot.contourf(levels=13, yincrease=False, cmap='jet', extend='both')
>>> zonal_mean.plot.contour(levels=13, yincrease=False, colors='k')
>>> plt.yscale('log')
>>> plt.gca().yaxis.set_major_formatter(mpl.ticker.ScalarFormatter()
>>> plt.show()

o que deve resultar na seguinte imagem:

zonal_mean_zlog.png