-
Notifications
You must be signed in to change notification settings - Fork 0
Home
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.
O pyBAM depende da biblioteca sigioBAM, que deve ser instalada no ambiente para que o Python possa acessá-la
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.
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
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:
É 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:
é 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:


