Metview's documentation is now on readthedocs!

Download source and data


Cross Section in Height for Model Level Data with Orography Example
#Metview Macro

#  **************************** LICENSE START ***********************************
# 
#  Copyright 2020 ECMWF. This software is distributed under the terms
#  of the Apache License version 2.0. In applying this license, ECMWF does not
#  waive the privileges and immunities granted to it by virtue of its status as
#  an Intergovernmental Organization or submit itself to any jurisdiction.
# 
#  ***************************** LICENSE END ************************************
# 

# get data
use_mars = 0 # 0 or 1
if use_mars then
    # retrieve data from MARS
    ret_core = (
        date     : 20200822,
        time     : 0,
        area     : [40,-93,51,-84],
        grid     : [0.5,0.5]
    )
    
    # forecast fields on all the model levels (bottom=ML-137, top=ML-1)
    # Note: log surface pressure (lnsp) is defined on ML-1!
    fs_ml = retrieve(ret_core,
        type: "fc",
        levtype: "ml",
        levelist: [1, "TO", 137],
        step: 12,
        param: ["t", "q", "lnsp"])
     
    # surface geopotential is available in  
    # the analysis only! It is available on ML-1!     
    zs = retrieve(ret_core,
        type: "an",
        levtype: "ml",
        levelist: 1,
        param: "z")
else
    # read data from GRIB file
    fs_ml = read("xs_ml_orog.grib")
    zs = read(data: fs_ml, param: "z") 
end if

# extract ml data
t = read(data: fs_ml, param: "t")
q = read(data: fs_ml, param: "q")
lnsp = read(data: fs_ml, param: "lnsp")

# compute geopotential on model levels
z = mvl_geopotential_on_ml(t, q, lnsp, zs)

# define cross section line
line = [50.21,-91.82,40.82,-84.71]

# define bottom level (m)
bottom_level = 0

# extract a set of levels needed for the cross section
# and converts temperature from K to C
t = read(data: t, levelist:[137,"TO", 100]) - 273.16
z = read(data: z, levelist:[137,"TO", 100])

# compute cross section in height (above sea level) for t 
# (using z, paramId=129)
xs_t = mcross_sect(
    data: t & z/9.81, 
    line: line, 
    vertical_coordinates: "user",
    vertical_coordinate_param: 129,
    vertical_coordinate_extrapolate: "on"
    )
    
# generate orography area curve
orog_curve = xs_build_orog(xs_t, zs/9.81, bottom_level, "charcoal")

# define contour shading for temperature
cont = mcont(
    legend                         : "on",
    contour_line_colour            : "charcoal",
    contour_highlight              : "off",
    contour_level_selection_type   : "interval",
    contour_max_level              : 23.5,
    contour_min_level              : 16.5,
    contour_interval               : 0.5,
    contour_shade                  : "on",
    contour_shade_method           : "area_fill",
    contour_shade_max_level_colour : "red",
    contour_shade_min_level_colour : "green",
    contour_shade_colour_direction : "clockwise"
    )

# define vertical axis
vertical_axis = maxis(
    axis_orientation        : "vertical",
    axis_title_text         : "Height ASL (m)",
    axis_tick_label_height: 0.4
    )

# define cross section in height above sea level  (m)  
xs_view = mxsectview(
  line : line,
  top_level : 1000,
  bottom_level: bottom_level,
  vertical_axis: vertical_axis
)

# define legend
legend = mlegend(
    legend_text_font_size : 0.35
    )
    
# define title
title = mtext(
    text_font_size : 0.4
    )
        
# define the output plot file
setoutput(pdf_output(output_name : 'cross_section_height_ml_orog'))
   
# generate plot
plot(xs_view,
     xs_t, cont,
     orog_curve, legend, title)
Cross Section in Height for Model Level Data with Orography Example
"""
Cross Section in Height for Model Level Data with Orography
"""

# Metview Macro

#  **************************** LICENSE START ***********************************
#
#  Copyright 2020 ECMWF. This software is distributed under the terms
#  of the Apache License version 2.0. In applying this license, ECMWF does not
#  waive the privileges and immunities granted to it by virtue of its status as
#  an Intergovernmental Organization or submit itself to any jurisdiction.
#
#  ***************************** LICENSE END ************************************
#

import metview as mv

# get data
use_mars = False
if use_mars:
    # retrieve data from MARS
    ret_core = {
        "date": 20200822,
        "time": 0,
        "area": [40, -93, 51, -84],
        "grid": [0.5, 0.5],
    }

    # forecast fields on all the model levels (bottom=ML-137, top=ML-1)
    # Note= log surface pressure (lnsp) is defined on ML-1!
    fs_ml = mv.retrieve(
        **ret_core,
        type="fc",
        levtype="ml",
        levelist=[1, "TO", 137],
        step=12,
        param=["t", "q", "lnsp"]
    )

    # surface geopotential is available in
    # the analysis only! It is available on ML-1!
    zs = mv.retrieve(**ret_core, type="an", levtype="ml", levelist=1, param="z")
else:
    # read data from GRIB file
    fs_ml = mv.read("xs_ml_orog.grib")
    zs = mv.read(data=fs_ml, param="z")

# extract ml data
t = mv.read(data=fs_ml, param="t")
q = mv.read(data=fs_ml, param="q")
lnsp = mv.read(data=fs_ml, param="lnsp")

# compute geopotential on model levels
z = mv.mvl_geopotential_on_ml(t, q, lnsp, zs)

# define cross section line
line = [50.21, -91.82, 40.82, -84.71]

# define bottom level (m)
bottom_level = 0

# extract a set of levels needed for the cross section
# and converts temperature from K to C and z to m
t = mv.read(data=t, levelist=[137, "TO", 100]) - 273.16
z = mv.read(data=z, levelist=[137, "TO", 100]) / 9.81

# compute cross section in height (above sea level) for t
# (using z, paramId=129)
xs_t = mv.mcross_sect(
    data=mv.merge(t, z),
    line=line,
    vertical_coordinates="user",
    vertical_coordinate_param=129,
    vertical_coordinate_extrapolate="on",
)

# generate orography area curve
orog_curve = mv.xs_build_orog(xs_t, zs / 9.81, bottom_level, "charcoal")

# define contour shading for temperature
cont = mv.mcont(
    legend="on",
    contour_line_colour="charcoal",
    contour_highlight="off",
    contour_level_selection_type="interval",
    contour_max_level=23.5,
    contour_min_level=16.5,
    contour_interval=0.5,
    contour_shade="on",
    contour_shade_method="area_fill",
    contour_shade_max_level_colour="red",
    contour_shade_min_level_colour="green",
    contour_shade_colour_direction="clockwise",
)

# define vertical axis
vertical_axis = mv.maxis(
    axis_orientation="vertical",
    axis_title_text="Height ASL (m)",
    axis_tick_label_height=0.4,
)

# define cross section in height above sea level  (m)
xs_view = mv.mxsectview(
    line=line, top_level=1000, bottom_level=bottom_level, vertical_axis=vertical_axis
)

# define legend
legend = mv.mlegend(legend_text_font_size=0.35)

# define title
title = mv.mtext(text_font_size=0.4)

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

# generate plot
mv.plot(xs_view, xs_t, cont, orog_curve, legend, title)