12"""Plot YAC debug grid files on an interactive map."""
16from itertools
import cycle
19import matplotlib.pyplot
as plt
22from _utils.plotting
import (
25 plot_grid_edges_in_ax,
27 add_keybinding_legend,
31_GRID_COLORS = [
"green",
"blue",
"red",
"orange",
"purple",
"brown",
"pink",
"gray"]
35 ds = netCDF4.Dataset(filename, mode=
"r")
36 yac_grid_names = [d[3:]
for d
in ds.dimensions
37 if d.startswith(
"nv_")]
38 if len(yac_grid_names) == 0:
39 logging.warning(f
"No yac grids found in {filename!r}")
42if __name__ ==
"__main__":
43 parser = argparse.ArgumentParser(
44 description=
"Plot YAC debug grid files on an interactive map"
51 help=
"Increase verbosity (-v for INFO, -vv for DEBUG)",
58 metavar=(
"LON",
"LAT"),
60 help=
"Center of the map projection (longitude, latitude in degrees)",
67 help=
"Radius in km of the region to display (default: 2000). Set to 0 to auto-scale the view to fit all plotted grid data.",
74 choices=(
"10m",
"50m",
"110m"),
76 "Coastline resolution (default: 50m). "
77 "Use --coast-res without value to disable."
83 default=
"orthographic",
84 choices=(
"orthographic",
"stereographic",
"platecarree"),
85 help=
"Map projection type (default: orthographic)",
90 help=
"Path to YAC debug grid file (NetCDF format)",
97 help=
"Only plot grids with these names",
102 help=
"Load indices on corners",
109 help=
"Plot only the part of the grid that was stored on the given MPI ranks")
111 args = parser.parse_args()
113 log_level = [logging.WARNING, logging.INFO, logging.DEBUG][min(args.verbose, 2)]
114 logging.basicConfig(format=
"%(levelname)s: %(message)s")
115 logging.getLogger(
"_utils").setLevel(level=log_level)
116 logger = logging.getLogger(
"plotting")
117 logger.setLevel(level=log_level)
120 logger.info(
"Starting YAC grid visualisation")
121 logger.debug(f
"CLI arguments: {args}")
123 logger.info(
"Setting up figure and map projection")
124 fig, ax = setup_figure(
125 projection=args.projection,
129 coast_res=args.coast_res,
134 _GRID_COLORS,
"ABCDEFGHIJKLMNO"):
135 logger.info(f
"Plotting {gridname}")
136 (clo, cla), (lo, la), ids, mask = load_grid([args.gridfile], gridname,
"CORNER" if args.corner
else "CELL", args.ranks)
137 plot_grid_edges_in_ax(ax, clo[mask], cla[mask], plot_kwargs={
"color": color})
138 plot_grid_edges_in_ax(ax, clo[~mask], cla[~mask], plot_kwargs={
"color": color,
"alpha": 0.3,
"linestyle":
"dashed"})
141 ids, select = np.unique(ids.ravel(), return_index=
True)
142 lo = lo.ravel()[select]
143 la = la.ravel()[select]
150 {
"color":
"black",
"visible":
False},
153 legend.append((key, f
"toggle {gridname} labels", color))
155 add_keybinding_legend(ax, legend)
159 logger.info(
"Opening interactive plot window")
find_grids_in_file(filename)