xgcm / aerobulk-python

A python wrapper for aerobulk (https://github.com/brodeau/aerobulk)
GNU General Public License v3.0
14 stars 4 forks source link

pre-commit.ci status DOI

aerobulk-python

A python wrapper for aerobulk (https://github.com/brodeau/aerobulk)

Installation

Due to the heavy dependencies in this package we recommend installing the package from conda-forge with mamba/conda

mamba install -c conda-forge aerobulk-python

or

conda install -c conda-forge aerobulk-python

aerobulk-python developer guide

These are the steps to install and develop the package locally

  1. Set up a development environment.

    mamba create -n aerobulk-python-dev python=3.9 dask numpy gfortran xarray pytest ipython
    conda activate aerobulk-python-dev
  2. Clone the repository

Make sure to clone the repo with --recursive to also pull the git submodule!

git clone --recursive git@github.com:xgcm/aerobulk-python.git
  1. Compile/Install aerobulk-python (this has to be rerun after every change to the fortran code/wrapper/signature file) Run these commands from within the aerobulk-python folder.

    a. Use pip to install aerobulk locally (this will install the python package and compile).

    pip install -e .

    b. Manual version (you will have to install the python module separately)

    python -m numpy.f2py --verbose -c --f90flags="-fdefault-real-8 -ffree-line-length-200 --std=gnu" ./source/fortran/aerobulk/src/mod_const.f90 ./source/fortran/aerobulk/src/mod_phymbl.f90 ./source/fortran/aerobulk/src/mod_skin_coare.f90 ./source/fortran/aerobulk/src/mod_skin_ecmwf.f90 ./source/fortran/aerobulk/src/mod_blk_andreas.f90 ./source/fortran/aerobulk/src/mod_common_coare.f90 ./source/fortran/aerobulk/src/mod_blk_coare3p0.f90 ./source/fortran/aerobulk/src/mod_blk_coare3p6.f90 ./source/fortran/aerobulk/src/mod_blk_ecmwf.f90 ./source/fortran/aerobulk/src/mod_blk_ncar.f90 ./source/fortran/aerobulk/src/mod_blk_neutral_10m.f90 ./source/fortran/aerobulk/src/mod_aerobulk_compute.f90 ./source/fortran/aerobulk/src/mod_aerobulk.f90   ./source/fortran/mod_aerobulk_wrap_skin.f90 ./source/fortran/mod_aerobulk_wrap_skin.pyf

    and

    python -m numpy.f2py --verbose -c --f90flags="-fdefault-real-8 -ffree-line-length-200 --std=gnu" ./source/fortran/aerobulk/src/mod_const.f90 ./source/fortran/aerobulk/src/mod_phymbl.f90 ./source/fortran/aerobulk/src/mod_skin_coare.f90 ./source/fortran/aerobulk/src/mod_skin_ecmwf.f90 ./source/fortran/aerobulk/src/mod_blk_andreas.f90 ./source/fortran/aerobulk/src/mod_common_coare.f90 ./source/fortran/aerobulk/src/mod_blk_coare3p0.f90 ./source/fortran/aerobulk/src/mod_blk_coare3p6.f90 ./source/fortran/aerobulk/src/mod_blk_ecmwf.f90 ./source/fortran/aerobulk/src/mod_blk_ncar.f90 ./source/fortran/aerobulk/src/mod_blk_neutral_10m.f90 ./source/fortran/aerobulk/src/mod_aerobulk_compute.f90 ./source/fortran/aerobulk/src/mod_aerobulk.f90   ./source/fortran/mod_aerobulk_wrap_noskin.f90 ./source/fortran/mod_aerobulk_wrap_noskin.pyf
  2. Make sure things work
    pytest tests/test_fortran.py

    🎉

Local Aerobulk compilation guide

Assumes that you have an environment with a gfortran compiler set up, have aerobulk cloned and that you are in the root aerobulk (not aerobulk-python) directory.

  1. Build the aerobulk source

First copy the appropriate macro file to the source directory:

cp arch/make.macro_GnuLinux make.macro

those of us on mac needed to edit make.macro make this change

# These are needed for the C/C++ interface
- FF += -std=gnu -lstdc++
+ FF += -std=gnu

Then you should be able to run make

This will build:

I was able to run one of the binaries with bin/example_call_aerobulk.x

Output ``` *********** COARE 3.0 ***************** =================================================================== ----- AeroBulk_init ----- *** Bulk parameterization to be used => "coare3p0" ==> will use the Cool-skin & Warm-ayer scheme of `coare3p0` ! *** Computational domain shape: Ni x Nj = 00002 x 00001 *** Number of time records that will be treated: 1 *** Number of iterations in bulk algos: nb_iter = 10 *** Filling the `mask` array... ==> no points need to be masked! :) *** Type of prescribed air humidity `specific humidity [kg/kg]` =================================================================== =================================================================== ----- AeroBulk_bye ----- =================================================================== --------------------------------------------------------------------- Parameter | Unstable ASL | Stable ASL | units --------------------------------------------------------------------- Wind speed at zu = 5.00000000 5.00000000 m/s SST = 22.0000000 22.0000000 deg.C Abs. temperature at zt = 20.0000000 25.0000000 deg.C Pot. temperature at zt = 20.0134144 25.0150242 deg.C Sensible heat flux: QH = -15.1545086 17.8423691 W/m**2 Latent heat flux: QL = -81.3846741 -50.8408585 W/m**2 Evaporation: Evap = -2.87061906 -1.79333246 mm/day Skin temperature: SSST = 21.7219677 21.7576351 deg.C Tau_x = 3.57834995E-02 1.73626728E-02 N/m**2 Tau_y = 0.00000000 0.00000000 N/m**2 Tau = 3.57834995E-02 1.73626728E-02 N/m**2 *********** COARE 3.6 ***************** =================================================================== ----- AeroBulk_init ----- *** Bulk parameterization to be used => "coare3p6" ==> will use the Cool-skin & Warm-ayer scheme of `coare3p6` ! *** Computational domain shape: Ni x Nj = 00002 x 00001 *** Number of time records that will be treated: 1 *** Number of iterations in bulk algos: nb_iter = 10 *** Filling the `mask` array... ==> no points need to be masked! :) *** Type of prescribed air humidity `specific humidity [kg/kg]` =================================================================== =================================================================== ----- AeroBulk_bye ----- =================================================================== --------------------------------------------------------------------- Parameter | Unstable ASL | Stable ASL | units --------------------------------------------------------------------- Wind speed at zu = 5.00000000 5.00000000 m/s SST = 22.0000000 22.0000000 deg.C Abs. temperature at zt = 20.0000000 25.0000000 deg.C Pot. temperature at zt = 20.0134144 25.0150242 deg.C Sensible heat flux: QH = -15.3865499 17.0818920 W/m**2 Latent heat flux: QL = -83.0788422 -48.4459152 W/m**2 Evaporation: Evap = -2.93033028 -1.70883954 mm/day Skin temperature: SSST = 21.7057972 21.7485600 deg.C Tau_x = 3.21817845E-02 1.51577257E-02 N/m**2 Tau_y = 0.00000000 0.00000000 N/m**2 Tau = 3.21817845E-02 1.51577257E-02 N/m**2 *********** ECMWF ***************** =================================================================== ----- AeroBulk_init ----- *** Bulk parameterization to be used => "ecmwf" ==> will use the Cool-skin & Warm-ayer scheme of `ecmwf` ! *** Computational domain shape: Ni x Nj = 00002 x 00001 *** Number of time records that will be treated: 1 *** Number of iterations in bulk algos: nb_iter = 10 *** Filling the `mask` array... ==> no points need to be masked! :) *** Type of prescribed air humidity `specific humidity [kg/kg]` =================================================================== =================================================================== ----- AeroBulk_bye ----- =================================================================== --------------------------------------------------------------------- Parameter | Unstable ASL | Stable ASL | units --------------------------------------------------------------------- Wind speed at zu = 5.00000000 5.00000000 m/s SST = 22.0000000 22.0000000 deg.C Abs. temperature at zt = 20.0000000 25.0000000 deg.C Pot. temperature at zt = 20.0134144 25.0150242 deg.C Sensible heat flux: QH = -14.3822346 17.6531811 W/m**2 Latent heat flux: QL = -80.2958984 -52.4623947 W/m**2 Evaporation: Evap = -2.83224440 -1.85053933 mm/day Skin temperature: SSST = 21.7325401 21.7630310 deg.C Tau_x = 3.84389125E-02 1.93256922E-02 N/m**2 Tau_y = 0.00000000 0.00000000 N/m**2 Tau = 3.84389125E-02 1.93256922E-02 N/m**2 *********** NCAR ***************** =================================================================== ----- AeroBulk_init ----- *** Bulk parameterization to be used => "ncar" *** Cool-skin & Warm-layer schemes will NOT be used! *** Computational domain shape: Ni x Nj = 00002 x 00001 *** Number of time records that will be treated: 1 *** Number of iterations in bulk algos: nb_iter = 10 *** Filling the `mask` array... ==> no points need to be masked! :) *** Type of prescribed air humidity `specific humidity [kg/kg]` =================================================================== =================================================================== ----- AeroBulk_bye ----- =================================================================== --------------------------------------------------------------------- Parameter | Unstable ASL | Stable ASL | units --------------------------------------------------------------------- Wind speed at zu = 5.00000000 5.00000000 m/s SST = 22.0000000 22.0000000 deg.C Abs. temperature at zt = 20.0000000 25.0000000 deg.C Pot. temperature at zt = 20.0134144 25.0150242 deg.C Sensible heat flux: QH = -16.6969528 10.7261686 W/m**2 Latent heat flux: QL = -88.4781876 -71.9012222 W/m**2 Evaporation: Evap = -3.12166286 -2.53679895 mm/day Tau_x = 3.58519591E-02 2.77329944E-02 N/m**2 Tau_y = 0.00000000 0.00000000 N/m**2 Tau = 3.58519591E-02 2.77329944E-02 N/m**2 *********** ANDREAS ***************** =================================================================== ----- AeroBulk_init ----- *** Bulk parameterization to be used => "andreas" *** Cool-skin & Warm-layer schemes will NOT be used! *** Computational domain shape: Ni x Nj = 00002 x 00001 *** Number of time records that will be treated: 1 *** Number of iterations in bulk algos: nb_iter = 10 *** Filling the `mask` array... ==> no points need to be masked! :) *** Type of prescribed air humidity `specific humidity [kg/kg]` =================================================================== =================================================================== ----- AeroBulk_bye ----- =================================================================== --------------------------------------------------------------------- Parameter | Unstable ASL | Stable ASL | units --------------------------------------------------------------------- Wind speed at zu = 5.00000000 5.00000000 m/s SST = 22.0000000 22.0000000 deg.C Abs. temperature at zt = 20.0000000 25.0000000 deg.C Pot. temperature at zt = 20.0134144 25.0150242 deg.C Sensible heat flux: QH = -14.4129944 15.1970539 W/m**2 Latent heat flux: QL = -74.4637756 -51.7018318 W/m**2 Evaporation: Evap = -2.62721038 -1.82412970 mm/day Tau_x = 3.02770734E-02 1.79436151E-02 N/m**2 Tau_y = 0.00000000 0.00000000 N/m**2 Tau = 3.02770734E-02 1.79436151E-02 N/m**2 ```