Link Search Menu Expand Document

obsYYMM_run.sh

Table of contents

背景

  • 除了wrf本身之外,系統各個階段的執行所需時間,以obsgrid最多,因此其執行平行化也最有必要。
  • obsgrid程式本身並沒有平行化的設計,因此在OS層次就必須多考量。
  • 此處所面對的作業挑戰是要做全年obsgrid,所以分月執行,是基本的分工方式。
  • 由於wrf的執行期間不能太長,以避免數值發散。此處規劃每批次間隔4天,批次時間為5天,其中重疊1天

OBSGRID 之全月執行方案

final之預備

  • obsgrid彙整所有little_r格式的觀測數據。由於little_r是個ASCII檔案,可以用cat指令將其整併
  • 如果不存在檔案,cat指令仍然繼續執行。
y=2019
f1=/Users/WRF4.1/NCEP/SRF_ds461.0/$y/SURFACE_OBS:${y}
f2=/Users/WRF4.1/NCEP/SUPA_ds351.0/$y/OBS:${y}
f3=/Users/WRF4.1/NCEP/cwb_data/$y/cwbsrf/cwbsrf:${y}
f4=/Users/WRF4.1/NCEP/cwb_data/$y/cwbupa/cwbupa:${y}
f5=/Users/WRF4.1/NCEP/epa_data/$y/epasrf:${y}
f6=/Users/WRF4.1/NCEP/SOBSGRID_DATA/final:${y}
for m in 0{1..9} {10..12};do
  for d in 0{1..9} {10..31};do
    for h in 0{0..9} {10..23};do
      cat ${f1}${m}${d}${h} ${f2}${m}${d}${h} ${f3}-${m}-${d}_${h} ${f4}-${m}-${d}_${h} ${f5}-${m}-${d}_${h} > ${f6}-${m}-${d}_${h}
    done
  done
done

namelist.oa模版

  • 因為每批次、每層網格的namelist.oa都有所不同,必須按照規則進行修改,此處以複製模版、局部置換的方式辦理。
  • 置換的方式採用linux sed指令
  • 模版詳見namelist.oa說明

批次的定義

  • 由於WRF是一個時間積分的數值模式,需要有個時間的起始與終結,必須以批次方式進行模式模擬。
  • 此處以前月15日為所有批次的開始日期begd,以使在大範圍模擬有足夠的調適時間。
  • 每批次執行5天、兩批次重疊1天、每批次間隔4天
  • 以2019年1月為例
批次序號起始日結束日
run12018121520181220
run22018121920181224
run32018122320181228
run42018122720190101
run52018123120190105
run62019010420190109
run72019010820190113
run82019011220190117
run92019011620190121
run102019012020190125
run112019012420190129
run122019012820190202

obsYYMM_run.sh的執行

  • 開啟12個月份的專屬目錄(OBS01~OBS12),其下再開啟12個批次run1~run12,共144個批次同時進行。
  • 每批次工作目錄執行:obsYYMM_run.sh YYMM RR,YYMM為年月(4碼)、RR批次編號(1~12)
y=19
for m in 0{1..9} {10..12};do
  for r in {1..12};do
    dir=OBS$m/run$r
    mkdir -p $dir
    cd $dir
    sub obsYYMM_run.sh $y$m $r
    cd ../..
  done
done

obsYYMM_run.sh分段說明

  • 讀進引數與連結met_em檔案
    • 第一引數:年月(4碼)
    • 第二引數:批次編號(1~12)
     1	#usage: obsYYMM_run.sh 1304 5
     2	path=/Users/WRF4.3/OBSGRID
     3	ym=$1
     4	j=$2
     5	ln -sf $path/../WPS/20$ym/met/met_em* .
  • 起訖年月日之計算
    • 每批次起始日差4天,使用bc進行計算"4*($j-1)"|bc -l
    • 每批次執行5天(1天重疊)
     6	begd=$(date -v-1m -j -f "%Y%m%d" "20${ym}15" +%Y%m%d)
     7	dd=`echo "4*($j-1)"|bc -l`
     8	ymd1=$(date -v+${dd}d -j -f "%Y%m%d" "${begd}" +%y%m%d)
     9	ymd2=$(date -v+5d     -j -f "%y%m%d" "${ymd1}" +%y%m%d)
    10	yea1=`echo $ymd1|cut -c1-2`;mon1=`echo $ymd1|cut -c3-4`;day1=`echo $ymd1|cut -c5-6`
    11	yea2=`echo $ymd2|cut -c1-2`;mon2=`echo $ymd2|cut -c3-4`;day2=`echo $ymd2|cut -c5-6`
    12	
  • 每層網格依序執行
    • namelist.oa.loop模版的複製
    • 替換其中起訖年月日、網格編號。使用sed指令
    13	for d in {1..4};do #domain
    14	#copy the template and change the beg/end dates by sed
    15	  rm -f namelist.oa;cp -f $path/namelist.oa.loop namelist.oa
    16	  for cmd in   "s/SYEA/20$yea1/g" "s/SMON/$mon1/g" "s/SDAY/$day1/g" \
    17	    "s/GID/$d/g" "s/EYEA/20$yea2/g" "s/EMON/$mon2/g" "s/EDAY/$day2/g";do
    18	    sed -ie $cmd namelist.oa
    19	  done
    20	
    21	#execution the programs
    22	  $path/src/obsgrid$d.exe
    23	  $path/run_cat_obs_files.csh $d
    24	  $path/../FILTER/filter_p $d
    25	done
    26	
  • 儲存(整併)結果
    27	#store the results
    28	mkdir -p $path/20$ym/run$j
    29	mv -f metoa_em* OBS_DOMAIN* wrfsfdda* $path/20$ym/run$j
    30	

按日執行OBSGRID

  • 在個別目錄下分開執行逐日內插
for i in {01..12};do 
  mkdir -p OBS$i
  cd OBS$i
  ln -sf /nas1/WRF4.0/WRF_chem/WPS/met_em.d02.* .
  if [ -e namelist.oa ];then rm namelist.oa;fi
  cp ../namelist.oa.loop namelist.oa
  j=$(( 10#$i + 1 ))
  for cmd in "s/SYEA/2018/g"  "s/EYEA/2018/g"  "s/SMON/04/g" \
    "s/EMON/04/g"  "s/SDAY/"$i"/g"  "s/EDAY/"$j"/g" "s/GID/2/g" ;do
    sed -i $cmd namelist.oa
  done
  sub ../src_ifort/obsgrid4.exe >&a
  cd ..
done
  • 再予以整合
for i in {01..12};do cd OBS$i;../run_cat_obs_files.csh 2;cd ..;done
for i in {01..12};do cd OBS$i;/nas1/WRF4.0/FILTER/filter_p2.exe;cd ..;done
cd 201804/run56
nc=wrfsfdda_d02
ncrcat -O ../../OBS12/$nc ../../OBS11/$nc ../../OBS0?/$nc $nc
o=OBS_DOMAIN201p
cat ../../OBS12/$o ../../OBS11/$o ../../OBS0?/$o > OBS_DOMAIN201

執行成果檢核

  • 正常執行結果,wrfsfdda檔案長度將會有24*天數個小時,可以用ncdump -h $nc指令來檢查。
  • wrfsfdda檔案可以使用VERDIMETINFO或其他軟體開啟。如下圖即以wrfsfdda中的(U10_NDG_NEW,V10_NDG_NEW),使用METINFO繪製的向量與流線圖:

下載obsYYMM_run.sh

點選github

Reference

  • akuox, linux date 指令用法@ 老人最愛碎碎念:: 隨意窩Xuite日誌, Xuite, 2009-04-06
  • G. T. Wang, Linux 計算機bc 指令用法教學與範例, gtwang, 2018/08/23
  • Terry Lin, Linux 指令SED 用法教學、取代範例、詳解, terryl.in, 2021-02-11
  • weikaiwei, Linux教學:cat指令, weikaiwei.com, 2021
  • lizadams, Visualization Environment for Rich Data Interpretation (VERDI): User’s Manual, github,
  • Yaqiang Wang, MeteoInfo Introduction, meteothink, 2021,10,16