執行預報腳本之分段說明
Table of contents
背景
- 雖然隨著預報時間由5天延長到10天,工作站聯合工作也隨之展開,過去的腳本基本上已不再維護。
- 然因作業腳本採模組化撰寫,很多模組仍然沿用,只是分配到不同工作站執行。
- 因此除專題外,整體知流程還是留在此處交代。
Links
- 運用GFS/CWB/CAMS數值預報數進行台灣地區CMAQ模擬
- GFS數據自動下載轉換及GFS數據驅動WRF
- 將CWB數據填入WRF客觀分析場
- 逐日循序執行bcon.exe
- cmaq_json及CMAQ粒狀物模擬結果之earth呈現
- fcst_dev2
- 單/雙工作站版本之切換
整體工作如表所示
下載fcst.cs全文
crontab設定
- dev2會在下午4:30展開,以避免午夜後網路不穩定。
- 同時也讓CAMS預報結果的下載與處理也在4:32隨後開始。以提供cmaq所需的IC/BC
#WRF forecasting from gfs and CWBWRF results
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
30 16 * * * /home/GFS/fcst.cs >& /home/GFS/fcst.out
32 16 * * * cd /u01/ecmwf/CAMS/CAMS_global_atmospheric_composition_forecasts/2022;rm get_all.log;./get_all.cs >& get_all.log
- devp工作站在1個小時之後(下午5:30)展開
30 17 * * * /home/GFS/fcst_devp.cs >& /home/GFS/fcst_devp.out
目錄、日期及常數設定
- 序列環境變數
DOM
會隨著WRF的執行而訂,經試誤決定以d01~d02雙向同步運作、以及d03個別運作之風場結果可以規避臺灣地區FDDA網格太密的突兀(詳雙向巢狀網格風場模擬之檢討),實際WRF執行與網格系統的搭配,則由迴圈與namelist.input_loop等控制。
#$ cat /home/GFS/fcst.cs
wget=/usr/bin/wget
curl=/opt/anaconda3/bin/curl
root=https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.
today=$(date -d -0day +%Y%m%d)
export BEGD=$(date -d "$today -0days" +%Y-%m-%d)
HR=10#$(date +%H)
if [[ $HR -ge 7 && $HR -le 15 ]];then export BEGD=$(date -d "$today -1days" +%Y-%m-%d);fi
begdp=$(date -d "$BEGD -0day" +%Y%m%d)
yestd=$(date -d "$BEGD -1day" +%Y%m%d)
yesty=$(date -d "$yestd" +%Y)
BH=00
dir=$begdp/$BH/atmos/
gfs=/home/GFS
export fcst=/u01/cmaqruns/2022fcst
fcst3=/nas3/cmaqruns/2022fcst
fcst2=/nas2/cmaqruns/2022fcst
export ENDD=$(date -d "$BEGD +11days" +%Y-%m-%d)
export BEGJ=$(date -d $BEGD +%Y%j)
dates=();datep=()
for id in {0..11};do
dates=( ${dates[@]} $(date -d "$BEGD +${id}days" +%Y-%m-%d) )
datep=( ${datep[@]} $(date -d "$BEGD +${id}days" +%Y%m%d) )
done
sub=~/bin/sub
DOM=( 'CWBWRF_45k' 'SECN_9k' 'TWEPA_3k' 'tw_CWBWRF_45k' 'nests3')
RES=( 45 09 03 )
GRD=( 'grid45' 'grid09' 'grid03' )
# two WS version MPI=( '-f machinefile -np 200' '-f machinefile -np 196' '-f machinefile -np 140' '-f machinefile -np 120' '-f machinefile -np 120')
# one WS version
MPI=( '-f machinefile -np 200' '-f machinefile -np 196' '-np 81' '-np 81' '-f machinefile -np 120')
CMB=/home/cmaqruns/CMAQ_Project/POST/combine/scripts/BLD_combine_v53_gcc/combine_v53.exe
cd $gfs
起始日設定方式檢討
- 模擬由當天0時開始進行其後5/10天預報。因此
$BEGD
要設成BEGD=$(date -d "$today -0days" +%Y-%m-%d)
- 然若是執行失敗,第2天上班須重新執行,因此需要一個判斷式
HR=10#$(date +%H);if [[ $HR -ge 7 && $HR -le 15 ]];then export BEGD=$(date -d "$today -1days" +%Y-%m-%d);fi
以保證$BEGD
式正確的。 - 因腳本
fcst.cs
還會呼叫其他腳本,而$BEGD
在各腳本間必須保持一致,因此改用export。
可在背景獨立執行之程式
- 由於gfs下載與處理需要一段不短的時間(至少30分鐘)。同時間可以先啟動可在背景獨立執行之程式:
- 排放量前處理程式:mk_emis.py/em3.cs
- d02/d03空氣品質處理腳本:airq.cs
- profile.config檔案內容的更替
#CMAQ stream
YYYYJJJ=$(date -d ${BEGD} +%Y%j)
mcip_start=$BEGD
mcip_end=$(date -d ${BEGD}+11days +%Y-%m-%d)
cp $fcst/project.config_loop $fcst/project.config
for cmd in 's/YYYYJJJ/'$YYYYJJJ'/g' \
's/mcip_start/'$mcip_start'/g' \
's/mcip_end/'$mcip_end'/g';do
sed -ie $cmd $fcst/project.config
done
氣象模式之執行
gfs檔案下載
- 因WRF/MCIP執行時會需要較指定日期多一天,因此多下載一些。
- 連續下載會遭到NOAA網管認定為惡意攻擊而切斷連線,因此需適度休息一下(
sleep 5s
)。
# 執行gfs檔案下載
for ((i=0;i <= 312; i+=3));do
iii=$(printf "%03d" $i)
file=gfs.t${BH}z.pgrb2.1p00.f$iii
if [ -e $file ];then rm $file;fi
while [ 1 ]; do
$wget --no-check-certificate -q --retry-connrefused --waitretry=3 --random-wait \
--read-timeout=20 --timeout=15 -t 10 --continue $root$dir$file
if [ $? = 0 ]; then break; fi
sleep 5
done
...
done
WPS
- WPS的控制模版namelist.wps_loop主要需要更替的是模擬的起迄日期。
- 依序執行ungrib及metgrid(UGB2內容如下)。
- 因各個timeframe分在不同的目錄下執行,不會互相干擾,可以同步在背景執行。
- 因GFS每天預報結果檔名都保持一樣,沒有時間標籤,因此只要事先做好連結即可,不需每次更名。
for ((i=0;i <= 312; i+=3));do
...
nh=$(( $i + 10#$BH ))
NOWD=$(date -d "$BEGD +${nh}hour" +%Y-%m-%d )
hh=$(date -d "$BEGD +${nh}hour" +%H )
mkdir -p ${gfs}/f$iii
cd ${gfs}/f$iii
rm gfs*
ln -s ../$file .
./link_grib.csh gfs*
cp ../namelist.wps_loop namelist.wps
for cmd in 's/BEGD/'$NOWD'/g' 's/ENDD/'$NOWD'/g' 's/HH/'$hh'/g';do sed -ie $cmd namelist.wps;done
~/bin/sub ../UGB2
cd $gfs
done
kuang@dev2 /home/GFS
$ cat UGB2
LD_LIBRARY_PATH=/home/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/lib:/opt/intel_f/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel64_lin /home/WRF4.0/WPS/ungrib/src/ungrib.exe >& /dev/null
LD_LIBRARY_PATH=/home/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/lib:/opt/intel_f/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel64_lin /home/WRF4.0/WPS/metgrid/src/metgrid.exe >& /dev/null
mv met_em* ..
namelist.input模版之準備
- WRF的執行控制檔模版namelist.input_loop中需要更替的項目,主要是模擬的起迄日期,其餘設定不需每天更動。
- 不同的模擬範圍對應到特定的模版,需在DOM的迴圈中複製$DOM目錄下特定的檔案。
${DOM[3]}
:同時執行d01及d02雙向巢狀網格系統,需要tw_CWBWRF_45k/namelist.input_loop${DOM[2]}
:執行d03之WRF,需要TWEPA_3k/namelist.input_loop- 不同範圍模版除了網格系統、time_step的差異外,其中的
nproc_x, nproc_y
也需要搭配平行計算結點的控制,即${MPI[$i]}
之內容
# 依序執行3個domain的real及wrf
## 起迄年 、 月 、 日B
yea1=$(echo $BEGD|cut -d'-' -f1);mon1=$(echo $BEGD|cut -d'-' -f2);day1=$(echo $BEGD|cut -d'-' -f3)
yea2=$(echo $ENDD|cut -d'-' -f1);mon2=$(echo $ENDD|cut -d'-' -f2);day2=$(echo $ENDD|cut -d'-' -f3)
dates=()
for id in {0..5};do
dates=( ${dates[@]} $(date -d "$BEGD +${id}days" +%Y-%m-%d) )
done
各個範圍風場之模擬
- 原本3個domain的real/ndown/wrf/mcip都執行完後,再啟動cmaq的執行。這樣的邏輯雖然清楚,但會耽擱domain2的cmaq,以致無法在午夜斷網前完成工作。
- 修正成 d01/d02風場完成後,隨即啟動cmaq模擬,俟d01 cmaq完成後,再回頭執行d03風場的模擬。
for i in 3 2;do
cd $gfs/${DOM[$i]}
## 置換模版中的起迄日期
cp namelist.input_loop namelist.input
for cmd in "s/SYEA/$yea1/g" "s/SMON/$mon1/g" "s/SDAY/$day1/g" \
"s/EYEA/$yea2/g" "s/EMON/$mon2/g" "s/EDAY/$day2/g" ;do
sed -i $cmd namelist.input
done
- met_em與metoa_em檔案的連結,以及real(或ndown)之執行。
- 執行wrf
if [[ $i -eq 3 ]];then
rm metoa_em*
## 連結metoa_em檔案
for d in 1 2;do for id in {0..11};do for j in $(ls ../met_em.d0${d}.${dates[$id]}_*);do k=${j};l=${k/..\//};m=${l/met_/metoa_};ln -s $j $m;done;done;done
# real
LD_LIBRARY_PATH=/home/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/lib:/opt/intel_f/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel64_lin:/opt/mpich/mpich-3.4.2-icc/lib /opt/mpich/mpich-3.4.2-icc/bin/mpirun ${MPI[$i]} /home/WRF4.0/WRF/main/real.exe >& /dev/null
else
$gfs/ndown.cs
fi
# wrf
LD_LIBRARY_PATH=/opt/netcdf/netcdf4_gcc/lib /opt/mpich/mpich3_gcc/bin/mpirun ${MPI[$i]} /opt/WRF4/WRFv4.2/main/wrf.exe >& /dev/null
OS控制同步執行CWBWRF結果的內插(d03($i==2
))(deprecated)
- 使用中央氣象局3公里數值預報結果進行FDDA,詳見將CWB數據填入WRF客觀分析場說明
if [ $i -eq 2 ];then
## 執行CWBWRF結果的內插
EXE=./mk_metoaT.py
ln -sf /nas1/Data/cwb/WRF_3Km/$yesty/$yestd/wrfout_d03 CWB_wrfout_d03
for j in {0..48};do $sub $EXE $j;sleep 10s;done
## 等候所有的程序都完成,才執行下一動作。
while true;do
n=$(ps -ef|grep ${EXE}|wc -l)
if [ $n -lt 2 ];then
break
else
sleep 60
fi
done
fi
- 2023-07-04 note
- 因中央氣象局模擬結果與GFS之間還是有所落差,2者無法一起使用,最後還是放棄此一作法。
- 此處還是將其留下,往後如果還要使用CWB_WRF作為FDDA的來源,可以作為參考。
mcip之執行
- 依序執行各網格系統wrfout的轉檔。
- 這個版本的run_mcip_DM.csh主要會讀取網格範圍之引數(
${GRD[$i]}
),啟動對應的網格範圍設定,並且將結果檔存到正確的網格目錄下,而且檔名中不會有日期的註記以減省儲存空間。- 網格範圍引數=grid03/grid09/grid45
- 第2引數為模擬天數。如不給予設定、內設為5天。
- wrfout連結如果發生錯誤、或模擬起始(開始累積)時間彼此不相符,程式將不會執行。後者可以acc_dm.py解決。
- 只將邊界檔留存下來,讓run_bcon(逐日執行)使用,其餘檔案則任其被每一天的執行結果覆蓋。
- d01/d02的mcip放在背景執行,隨即展開d01的空品模擬。
d01/d02之轉檔
- 將tw_CWBWRF_45k/目錄下的檔案分別連結到CWBWRF_45k/(d01)與SECN_9k/(d02)
- 將地面風及行星邊界層高度輸出,已備軌跡線之製作。
- 因CMAQ執行前都會進行檔案的確認(chk_IBM.cs),如果日期不正確,會持續停等。因此,mcip可以放在背景執行。直接啟動cmaq的執行。
$gfs/run_cmaq.cs 0
if [ $i -eq 3 ];then
for d in 1 2;do
j=$(( $d - 1))
for f in {0..11};do
wrfo=wrfout_d0${d}_${dates[$f]}_00:00:00
nc1=$gfs/${DOM[$i]}/$wrfo
if [ -e $nc1 ];then
wrfo2=${wrfo/d0${d}/d01}
nc2=$gfs/${DOM[$j]}/$wrfo2
if [ -e $nc2 ];then rm $nc2;fi
ln -sf $nc1 $nc2
fi
done
for f in {0..11};do
wrfo=wrfout_d0${d}_${dates[$f]}_00:00:00
nc1=$gfs/${DOM[$i]}/$wrfo
uv10=${nc1/wrfout/U10V10}
/usr/bin/ncks -O -v Times,XLAT,XLONG,U10,V10,PBLH $nc1 $uv10
~/bin/sub cp $uv10 /nas2/backup/data/NOAA/NCEP/GFS/YYYY/${DOM[$i]}
test $HOSTNAME == 'dev2' && /usr/bin/sshpass -f ~/bin/PW scp -r $uv10 kuang@imackuang:/Users/Data/cwb/e-service/btraj_WRFnests/CWB_forecast/
done
# mcip
cd $fcst/${GRD[$j]}/wrfout
for f in {0..11};do nc=$gfs/${DOM[$j]}/wrfout_d01_${dates[$f]}_00:00:00;ln -sf $nc wrfout_d0${d}_$f;done
cd $fcst;~/bin/sub csh run_mcip_DM.csh ${GRD[$j]} 11 >&/dev/null
done
$gfs/run_cmaq.cs 0
...
d03之轉檔
...
else
# mcip i=2,d=3
cd $fcst/${GRD[$i]}/wrfout;j=$i;d=3
for f in {0..11};do nc=$gfs/${DOM[$j]}/wrfout_d01_${dates[$f]}_00:00:00;ln -sf $nc wrfout_d0${d}_$f;done
for f in {0..11};do
nc=$gfs/${DOM[$j]}/wrfout_d01_${dates[$f]}_00:00:00;ln -sf $nc wrfout_d0${d}_$f
uv10=${nc/wrfout_d01/U10V10_d03}
/usr/bin/ncks -O -v Times,XLAT,XLONG,U10,V10,PBLH $nc $uv10
~/bin/sub cp $uv10 /nas2/backup/data/NOAA/NCEP/GFS/YYYY/${DOM[$i]}
test $HOSTNAME == 'dev2' && /usr/bin/sshpass -f ~/bin/PW scp -r $uv10 kuang@imackuang:/Users/Data/cwb/e-service/btraj_WRFnests/CWB_forecast/
done
cd $fcst;csh run_mcip_DM.csh ${GRD[$j]} 11 >&/dev/null
$gfs/run_cmaq.cs 2
fi
CMAQ
- 為使cmaq的模擬流程更加模組化,在整體作業中安排更加彈性化,將原本作業腳本中cmaq的迴圈部分拆分成另一個腳本,讓domain number成為腳本的引數,而不是迴圈標籤。
專案模版之設定
- project.config_loop主要延伸自公版模式的習慣,該模式將執行起迄時間、IC與BC檔案時間等,寫在此設定檔中,因此如果要更換每天執行的起迄時間,就需要替換模版中的指定位置。
- 此檔案只涉及CMAQ的執行,MCIP並不會讀取(MCIP的日期是在程式內設定的)。
- 此處以sed程式進行更替。
- 程式碼見前可在背景獨立執行之程式
日期序列dates
- 未來五日的日期。以YYYYMMDD形式,以符合CMAQ系統的檔案命名習慣。
dates=()
for id in {0..4};do
dates=( ${dates[@]} $(date -d "$BEGD +${id}days" +%Y%m%d) )
done
排放檔案之切割
- 此部分因與風場無關,已挪到作業前段去啟動背景執行
- 排放量之處理可以詳參逐日模擬排放檔案之切割程式
- 台灣本島範圍的點源另外建檔處理。須執行mk_ptse.py
for i in 0 1 2;do
ii=$(echo ${GRD[$i]}|cut -c5-)
cd $fcst/grid$ii/smoke
../../mk_emis.py $BEGD
if [[ $i -eq 2 ]];then
/usr/bin/ncks -O -d LAY,0 TEDS.ncf TEDS0.ncf
/usr/bin/ncatted -a NLAYS,global,o,i,1 TEDS0.ncf
./mk_ptse.py $BEGD
fi
chk_IBM
- 詳見初始/邊界/氣象檔案之檢核的說明。程式會載執行前妥善檢核,如有錯誤隨即進行停等。停等秒數對應到出錯的檔案類別。
執行cctm
cd $fcst
csh ./run.cctm.${ii}.csh >&/dev/null
下層BC/IC之準備
- 為準備下層邊界濃度逐日處理,先產生逐日bcon檔案名稱序列
${f[@]}
。
# nest down BCON and ICON
j=$(( $i + 1))
f=()
for id in {0..4};do
nc=$fcst/grid$ii/bcon/BCON_${dates[id]}_${DOM[$j]}
f=( ${f[@]} $nc )
if [[ -e $nc ]];then rm $nc;fi
done
combine.sh及下層BCON
- 執行5天所需的邊界檔案,會需要121小時,因此ncrcat連結之後,還要再加1個小時。
for id in {0..4};do
nc=$fcst/grid$ii/cctm.fcst/daily/CCTM_ACONC_v532_intel_${DOM[$i]}_${dates[$id]}.nc
# combine PM's
$fcst/combine.sh $nc
# generate bcon for next nest
test $i -eq 2 && continue
csh $fcst/run_bcon_NC.csh $nc >&/dev/null
done
test $i -eq 2 && continue
nc=$fcst/grid$ii/bcon/BCON_today_${DOM[$j]}
/usr/bin/ncrcat -O ${f[0]} ${f[1]} ${f[2]} ${f[3]} ${f[4]} $nc
# expand the last hour to next day
~/bin/add_lastHr.py $nc
下層ICON
cd $fcst
csh $fcst/run_icon_NC.csh $fcst/grid$ii/icon/ICON_yesterday_${DOM[$i]} >&/dev/null
done
earth套件輸出
tw_CWBWRF_45k(${DOM[3]}
)版本
- 需將wrfout連結到各個分層目錄,以利uv10的讀取
for i in 0 1 2;do
d=$(( $i + 1))
for j in $(ls $gfs/${DOM[3]}/wrfout_d0${d}*);do
k=${j/${DOM[3]}/${DOM[$i]}}
l=${k/d0${d}/d01}
ln -sf $j $l
done
done
cmaq_json
- 依序執行3個模擬範圍結果的轉檔,以利earth系統的展示($IP:$PORT)。
- IP’s
- 公司內IP=http://200.200.31.47/
- 公司外IP=http://sinotec24.com 1
- PORT’s
- d01:8084
- d02:8085
- d03:8086
# prepare earth json files and backup to imackuang
for r in 45 09 03;do cd /nas1/Data/javascripts/D3js/earthFcst$r/public/data/weather/current;./cmaq_json3.py $BEGD;done
備份
# prepare earth json files and backup to imackuang
if ! [ -e /home/kuang/mac/do_not_delete ];then /usr/bin/fusermount -u /home/kuang/mac;/usr/bin/sshfs kuang@IMacKuang:/Users ~/mac -o nonempty -o password_stdin < ~/bin/PW;fi
for id in {0..4};do
for r in 45 09 03;do
y=$(echo ${dates[$id]}|cut -c1-4);m=$(echo ${dates[$id]}|cut -c5-6);d=$(echo ${dates[$id]}|cut -c7-8)
W45=Data/javascripts/D3js/earthFcst${r}/public/data/weather
mkdir -p ~/mac/$W45/$y/$m/$d
cp /nas1/$W45/$y/$m/$d/[012]*.json ~/mac/$W45/$y/$m/$d/
done
done
下載點
- Download: 逐日WRF及CMAQ預報之執行腳本fcst.cs
WRF相關設定
- Download: 執行WPS ungrib及metgrid)的控制模版namelist.wps_loop
- Download: d01與d02雙向巢狀網格WRF控制檔案之模版tw_CWBWRF_45k/namelist.input_loop
- Download: d03網格WRF控制檔案之模版TWEPA_3k/namelist.input_loop
CMAQ相關設定與批次檔
- Download: 逐日執行特定網格mcip之批次檔run_mcip_DM.csh
- Download: CMAQ專案與時間設定檔模版project.config_loop
- Download: 逐日循序執行bcon.exe腳本run_bcon_NC.csh
- Download: 逐日循序執行icon.exe腳本run_icon_NC.csh
sinotec24.com為Hinet給定,如遇機房更新或系統因素,將不會保留。敬請逕洽作者:sinotec2@gmail.com. ↩