NWPC笔记:获取模式积分时长 - 动态步长

目录

在《NWPC笔记:获取模式积分时长 - 恒定步长》中,笔者介绍如何从恒定步长模式的输出日志获取每步积分的时长。

NWPC 业务系统中有另一类模式系统,采用自动调制时间步长方案,每步积分对应的步长会动态调整,随之而来的就是积分预报固定时间对应的积分步数不一致。

本文介绍如何获取动态步长的模式积分时长,以下只针对 GRAPES MESO 3KM 系统。

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

模式积分输出

模式积分的输出保存到模式积分作业标准输出重定向的文件中,即积分作业 fcst.job1 的标准输出 fcst.1 文件中。

积分步长不变时,模式输出如下所示。与上一篇文章介绍的 GRAPES GFS 相比,输出增加括号中的时间,表示该步骤对应的预报时刻。 可以看到,默认情况下,积分步长是 30 秒。

 begin of gcr  1.027551119140290E-005
 RES of gcr  9.348691670014106E-013 in           31 iterations 
Timing for processing for step 41 (2020051600:20:00):          1.16430 elapsed seconds.
Timing for processing for step 41 (2020051600:20:00):          1.16364 cpu seconds.
 begin of gcr  1.033965735220742E-005
 RES of gcr  9.367767677783578E-013 in           31 iterations 
Timing for processing for step 42 (2020051600:20:30):          1.15810 elapsed seconds.
Timing for processing for step 42 (2020051600:20:30):          1.15735 cpu seconds.

积分步长有变化时,模式输出如下所示。每步对应的预报时刻会有相应的变化。

 begin of gcr  1.098722297822488E-005
 RES of gcr  9.172839643659993E-013 in           31 iterations 
Timing for processing for step 46 (2020051600:22:30):          1.16230 elapsed seconds.
Timing for processing for step 46 (2020051600:22:30):          1.16027 cpu seconds.
 ADJUST TIME STEP: old dt=   30.00000      new dt=   29.00000      MaxCfl=
   1.235862    
 begin of gcr  1.109554748107992E-005
 RES of gcr  8.997919793166811E-013 in           30 iterations 
Timing for processing for step 47 (2020051600:23:00):          1.18880 elapsed seconds.
Timing for processing for step 47 (2020051600:23:00):          1.18749 cpu seconds.
 ADJUST TIME STEP: old dt=   29.00000      new dt=   26.00000      MaxCfl=
   1.307939    
 begin of gcr  1.066902129885752E-005
 RES of gcr  8.810854294594817E-013 in           27 iterations 
Timing for processing for step 48 (2020051600:23:29):          1.16680 elapsed seconds.
Timing for processing for step 48 (2020051600:23:29):          1.16603 cpu seconds.

本文不关心积分步长的变化,只关注模式积分总体的进程,所以仅使用正则表达式提取积分时长信息。

提取信息

使用下面的函数获取步数、预报时刻和时长。

def get_step_time_from_file(file_path: str or Path) -> pd.DataFrame:
    p = re.compile(r"Timing for processing for step\s+(.+) \((.*)\):\s+(.+) elapsed seconds\.")
    data = []
    index = []
    with open(file_path) as f:
        for line in f:
            m = p.match(line)
            if m is None:
                continue
            step = int(m.group(1))
            valid_time = pd.to_datetime(m.group(2), format='%Y%m%d%H:%M:%S')
            time = float(m.group(3))
            data.append({
                "valid_time": valid_time,
                "time": time
            })
            index.append(step)
    df = pd.DataFrame(data, index=index)
    return df

返回的 pandas.DataFrame 对象包含 valid_timetime 列。 其中 valid_time 表示预报时效,time 表示单步积分耗时。

获取积分步长

使用 nwpc-oper/nwpc-log-tool 工具获取日志文件地址。

from nwpc_log_tool.data_finder import find_local_file

start_time = pd.to_datetime("2020-04-22 00:00:00")
file_path = find_local_file(
    "grapes_meso_3km/log/fcst_ecf_out",
    start_time=start_time,
)
print(file_path)
/g3/wangdp/project/work/nwpc-log/data/forecast_output/grapes_meso_3km/ecfout_2020042200/model/fcst.1

获取积分时长

df = get_step_time_from_file(file_path)
df["step"] = df.index
df["forecast_time"] = df["valid_time"] - start_time
df.head()

绘制统计图形

使用 Seaborn 绘制统计图形

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

折线图

从第 2 步骤开始绘制折线图

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

可以除了有个别步骤的耗时明显异常外,其余步骤单步耗时有明显的周期性,与模式积分输出积分结果相对应。

直方图

从第 2 步骤开始绘制直方图

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

可以看到,大部分步骤的耗时都在低值区间。

分析

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

df["time"].sum()/60
59.573949999999996

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

df["time"][df["time"]>1].sum()/60
10.523705

大于 2s 的步骤耗时

df["time"][df["time"]>2].sum()/60
1.7440304597218828

可见超长时间的积分步骤对总积分时间的影响不大。

绘制累计时间折线图

df["ctime"] = df["time"].cumsum()
fig, ax = plt.subplots(figsize=(10, 5))
df.plot(
    x="forecast_time", 
    y="ctime",
    ax=ax,
)

折线图除了开头有两个比较明显的跃升外,其余部分近似于直线。

本示例的积分总耗时在正常范围内,两次跃升的影响在可接收范围内。

参考

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

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