我现在正在使用大气模拟模型(名为 WRF )。该模型由其自己的控制文件 namelist.input
当我想在一段时间内模拟大气情况时,我只需要在 namelist.input 中更改开始时间和结束时间,然后运行模型
vim namelist.input ## Change the simulated period
mpirun np -16 ./wrf.exe
当目标周期足够大(例如1年)时,长计算时间将降低结果的稳定性。 (有人可能熟悉蝴蝶效应:如果计算时间过长,模拟结果与现实相比的微小差异会变得很大)
因此,我需要将模拟时间段划分为多个子部分并多次运行模型。一个研究人员写的.csh
文件可以实现我的目标。我在这里上传了它作为参考。
#!/bin/csh -f
set year = "2013"
foreach strtime (010106010600 010512011100) ## just show two periods here
set smon = `echo ${strtime}|cut -c1-2`
set sday = `echo ${strtime}|cut -c3-4`
set shr = `echo ${strtime}|cut -c5-6`
set emon = `echo ${strtime}|cut -c7-8`
set eday = `echo ${strtime}|cut -c9-10`
set ehr = `echo ${strtime}|cut -c11-12`
cat > namelist.input << EOF
start_year = ${year},${year},
start_month = ${smon},${smon},
start_day = ${sday},${sday},
start_hour = ${shr},${shr},
end_year = ${year},${year},
end_month = ${emon},${emon},
end_day = ${eday},${eday},
end_hour = ${ehr},${ehr},
... # the .csh file contain all content of __namelist.input__ with start and end time changes.
EOF
# running wrf
mpirun -np 16 ./wrf.exe
end
我想编写一个Python程序来替换csh文件。 Python语言更强大(我可以在同一个 .py 程序中对输出文件进行后期处理)
我曾尝试编写.py程序,以便多次自动运行WRF模型。它包含三个主要元素:
将开始时间和相应的结束时间设置为列表,然后循环列表重新运行。
使用不同的时间段更改 namelist.input 。
在python环境中运行命令行程序。
from subprocess import call
call(["mpirun", "-np 16 ./wrf.exe"])
但我对重新开始的时间点感到困惑。
总而言之,如何测试单个运行已经结束,我需要在Python中重新运行下一个时期的模型。
答案 0 :(得分:1)
所以问题是:如何检查进程是否仍在运行?
可能的解决方案:
1)创建执行模型的启动管理器脚本,并检查其他进程是否在while循环中完成?或者在模型的最后进行函数调用?
2)在每个时期结束时做一些事情,编写简单的文本文件或类似的东西。而这又被另一个过程所吸引。
3)使用psutil检查exe是否正在运行 https://github.com/giampaolo/psutil
import psutil
def is_alive():
for pid in psutil.pids():
p = psutil.Process(pid)
if p.name() == "wrf.exe":
print("Process is alive")
return True
return False