NWPC笔记:对比模式积分时长 - 恒定步长

目录

上一篇文章《NWPC笔记:获取模式积分时长 - 恒定步长》介绍如何从模式输出日志获取模式积分每步的时长,并绘制一些统计图形。选用的是模式积分耗时处于正常范围内的时次。 但从文章《统计数值天气预报模式积分运行时间》中可以看到,个别情况下模式积分时长会显著增加。

本文使用《NWPC笔记:获取模式积分时长 - 恒定步长》中的方法,对比 GRAPES GFS 模式积分耗时正常和异常情况下每步积分的时长变化。

声明:本文仅代表作者个人观点,所用数据无法代表真实情况,严禁转载。关于模式系统的相关信息,请以官方发布的信息及经过同行评议的论文为准。

获取数据

以下假设已按照前一篇文章中的方法,将积分时间正常的 2020050500 时次的数据保存到 df 中。

加载积分时间超时的 2020041300 时次的数据。

file_path = find_local_file(
    "grapes_gfs_gmf/log/fcst_long_std_out",
    start_time="2020041300",
)
edf = get_step_time_from_file(file_path)
edf["step"] = edf.index
edf["ctime"] = edf["time"].cumsum()
edf.head()

绘制统计图形

与前一篇文章一样,使用 Seaborn 绘制统计图形

import seaborn as sns
sns.set(style="whitegrid")

折线图

fig, ax = plt.subplots(figsize=(20, 5))
sns.lineplot(
    x="step",
    y="time", 
    data=edf[1:],
    ax=ax
)

可以看到,4 月 13 日 00 时次的积分单步耗时明显比 5 月 5 日 00 时次多,甚至出现单步耗时 17 秒的情况。

直方图

fig, ax = plt.subplots(figsize=(20, 5))
sns.distplot(
    edf["time"][1:],
    ax=ax
)

同样可以看到,虽然大部分步骤依然耗时在 0.5 秒以内,但步骤耗时分布区间明显增大。

简单分析

所有步骤耗时,单位为分钟。

edf["time"].sum()/60
44.65238666666667

耗时几乎是 5 月 5 日 00 时次的 2 倍。

耗时大于 1 秒的步骤的累计时间,单位为分钟。

edf["time"][edf["time"]>1].sum()/60
25.928708333333336

大于 1 秒步骤的总时间几乎占到一半,模式积分时间延长主要受这些步骤的影响。

绘制累计时间折线图

fig, ax = plt.subplots(figsize=(10, 5))
edf["ctime"].plot(
    ax=ax
)

折线图看起来不像是一条直线。

对比显示

使用 Bokeh 同时绘制前一篇文章的正常情况数据和本文新获取的异常情况数据。

加载需要的模块

from bokeh.io import output_notebook, show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
output_notebook()

创建 Bokeh 需要的数据

normal_source = ColumnDataSource(df)
late_source = ColumnDataSource(edf)

绘制图形

p = figure(
    plot_height=500,
    plot_width=1000,
    title="MODEL A",
)
p.line(
    x="step",
    y="ctime",
    source=normal_source,
    color="green",
    legend_label="2020050500"
)
p.line(
    x="step",
    y="ctime",
    source=late_source,
    color="red",
    legend_label="2020041300"
)
p.legend.location = "top_left"
p.xaxis.axis_label = "step"
p.yaxis.axis_label = "time(seconds)"

show(p)

可以看到,正常情况下积分累计时间近似于一条直线,但 4 月 13 日 00 时次的异常情况则没有这样的特性,虽然也可以看成是保持线性趋势的。

进一步对比

为了进一步验证正常和异常情况下积分累计时间的趋势,下面绘制从 4 月 20 日到 4 月 30 日共计 11 天的积分步骤累计时间图。

首先创建批量获取数据的函数。

def get_cum_time(start_time_list):
    data = dict()
    for start_time in start_time_list:
        file_path = find_local_file(
            "grapes_gfs_gmf/log/fcst_long_std_out",
            start_time=start_time,
        )
        df = get_step_time_from_file(file_path)
        df["ctime"] = df["time"].cumsum()
        data[start_time] = df["ctime"]
    df = pd.DataFrame(
        data, 
        index=df.index
    )
    return df

获取数据

total_df = get_cum_time(
    pd.date_range(
        "2020-04-20", 
        "2020-04-30", 
        freq="D"
    )
)
total_df.head()

查看每个时次的积分累计时间

total_df.iloc[-1]/60
2020-04-20    22.829743
2020-04-21    32.210792
2020-04-22    29.892152
2020-04-23    23.042733
2020-04-24    22.938663
2020-04-25    22.867722
2020-04-26    22.937087
2020-04-27    31.016060
2020-04-28    32.708422
2020-04-29    31.268345
2020-04-30    22.859272
Name: 2880, dtype: float64

上述数据中,有 5 个时次的积分时间明显延长:

  • 2020-04-21:32.210792
  • 2020-04-22:29.892152
  • 2020-04-27:31.016060
  • 2020-04-28:32.708422
  • 2020-04-29:31.268345

使用 Bokeh 画图

from bokeh.palettes import viridis

colormap = viridis(len(source_df.columns))
source = ColumnDataSource(source_df)

p = figure(
    plot_height=500,
    plot_width=1000,
    title="MODEL A",
)

i = 0
for col in source_df.columns:
    p.line(
        x="index",
        y=col,
        source=source,
        color=colormap[i],
        legend_label=col
    )
    i += 1
    
p.legend.location="top_left"
p.xaxis.axis_label = "step"
p.yaxis.axis_label = "time(seconds)"
    
show(p)

可以看到,有 5 条线段的斜率明显比其它线段大,而其它线段的斜率基本一致。 这说明积分时间与累计时间折线图的斜率有一定的关系。

下一篇文章将会介绍如何计算积分累计时间的斜率,即积分累计时间与积分步数的线性关系。

参考

https://github.com/nwp-oper/nwpc-log-tool

NWPC笔记:获取模式积分时长 - 恒定步长

统计数值天气预报模式积分运行时间