GRIB - Zonal Average Difference

GRIB - Zonal Average Difference
# (C) Copyright 2017- ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities
# granted to it by virtue of its status as an intergovernmental organisation
# nor does it submit to any jurisdiction.

import numpy as np
import metview as mv

# getting data
use_mars = False

# getting forecast data from MARS
if use_mars:
    ret_core = {
        "param": "r",
        "time": 0,
        "levtype": "pl",
        "levelist": [1000, 925, 850, 700, 500, 400, 300, 200, 150, 100],
        "grid": [1, 1],
    }
    an = mv.retrieve(type="an", date=20210226, **ret_core)
    fc = mv.retrieve(type="fc", date=20210221, step=120, **ret_core)

# read data from file
else:
    filename = "r_an_global_upper.grib"
    if mv.exist(filename):
        an = mv.read(filename)
    else:
        an = mv.gallery.load_dataset(filename)

    filename = "r_fc_global_upper.grib"
    if mv.exist(filename):
        fc = mv.read(filename)
    else:
        fc = mv.gallery.load_dataset(filename)

# define the "zonal" average view
view = mv.maverageview(bottom_level=1000, top_level=100, direction="ew")

# define the layout
page_0 = mv.plot_page(bottom=50, left=20, right=80, view=view)

page_1 = mv.plot_page(top=50, bottom=100, right=50, view=view)

page_2 = mv.plot_page(top=50, left=50, view=view)

dw = mv.plot_superpage(pages=[page_0, page_1, page_2])

# define contour shading for r
cont = mv.mcont(
    legend="on",
    contour="off",
    contour_level_selection_type="level_list",
    contour_level_list=[0, 20, 40, 60, 70, 80, 90, 110],
    contour_label="off",
    contour_shade="on",
    contour_shade_colour_method="palette",
    contour_shade_method="area_fill",
    contour_shade_palette_name="eccharts_blue_purple_7",
)

# define contour shading for differences
diff_cont = mv.mcont(
    legend="on",
    contour="off",
    contour_level_selection_type="level_list",
    contour_max_level=60,
    contour_min_level=-60,
    contour_level_list=[-60, -40, -20, -15, -10, -5, 0, 5, 10, 15, 20, 40, 60],
    contour_label="off",
    contour_shade="on",
    contour_shade_colour_method="palette",
    contour_shade_method="area_fill",
    contour_shade_palette_name="eccharts_blue_red_12",
)

# generate the zonal mean of the forecast
d_fc = mv.mxs_average(data=fc, direction="ew")

# generate the zonal mean of the analysis
d_an = mv.mxs_average(data=an, direction="ew")

# generate the zonal mean of the difference
d_diff = mv.mxs_average(data=fc - an, direction="ew")

# compute the min an max of the zonal mean of the difference. The
# zonal mean data is a NetCDF object. The variable holding the data in
# this case is called "r" (this is the ecCodes shortName in the input GRIBs)
mv.setcurrent(d_diff, "r")
min_v = np.amin(mv.values(d_diff))
max_v = np.amax(mv.values(d_diff))

# define difference title
title_diff = mv.mtext(
    text_lines="FC-AN Relative Humidity min={:.1f}% max={:.1f}%".format(min_v, max_v),
    text_font_size=0.4,
)

# define other titles
title_fc = mv.mtext(text_lines="FC Relative Humidity", text_font_size=0.4)
title_an = mv.mtext(text_lines="AN Relative Humidity", text_font_size=0.4)

# define the output plot file
mv.setoutput(mv.pdf_output(output_name="zonal_average_difference"))

# generate plot
mv.plot(
    dw[0],
    d_diff,
    diff_cont,
    title_diff,
    dw[1],
    d_fc,
    cont,
    title_fc,
    dw[2],
    d_an,
    cont,
    title_an,
)