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_time
和 time
列。
其中 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,
)
折线图除了开头有两个比较明显的跃升外,其余部分近似于直线。
本示例的积分总耗时在正常范围内,两次跃升的影响在可接收范围内。