CAMx 模式的ICBC

 

CAMx模式對其初始與邊界條件(IC/BC)並不是非常嚴格,包括污染物成分種類、與實質的內容數據等等,只要求時間與範圍必須對應。然而模擬結果是否合理、正確,顯然與ICBC的設定有密切的關係。

完整的資料處理過程可以參見CMAQ Model system -> 邊界條件之準備初始條件之準備,此處僅針對CAMx模式差異之處進行說明。

CAMx.in ICBC檔案與路徑的設定

  • 冷起動(Restart=false)
    • 需要給定粗網格的ICBC檔案
  • 熱起動(Restart=true)
    • 需要前月最末小時模擬結果的瞬時檔、粗細網格的濃度、如有PiG設定,則需要煙流模擬結果(注意點源順序必須完全一致才能接續)。
    • BC檔案仍然需要
    • IC檔案不需給定,即使給定也不會讀取。
  • 如給定的是相對目錄,根目錄指的是CAMx.in所在的位置
段落 關鍵字 範例 說明
Model clock control Restart true/false, 熱起動/冷起動
  Start_Date_Hour 2018,12,31,2000, 前月最末日夜間開始
  End_Date_Hour 2019,1,31,2000, 當月最末日夜間結束,整點時間必須一致
Input files Initial_Conditions ’./ICBC/bndextr_d2/base.grd02.1901.ic’, 當月初始條件
  Boundary_Conditions ’./ICBC/bndextr_d2/base.grd02.1901.bc’, 當月邊界條件
Restart files Master_Grid_Restart ‘outputs/con00/1812baseB.inst’, 前月粗網格模擬結果
  Nested_Grid_Restart ‘outputs/con00/1812baseB.finst’, 前月細網格模擬結果
  PiG_Restart ‘outputs/con00/1812baseB.pig’, 前月點源pig模擬結果

初始條件

啟始時間的考量

  1. 08(00Z)雖然是氣象模式的整點開始,但是對光化模式而言,卻不是好的開始時間,個案的連接會發生斷層。
  2. 00(16Z)是local一天的開始,氣象模式也有輸出,但是mozart沒有初始值,無法(冷˙)啟動程式,必須另外冷啟動再restart。
  3. 02(18Z)compromize 上述2個觀點,但結束在02時又多跨一天local date
  4. 20(12Z)似乎是比較好的一個選擇,可以是一天的結束,也可以是cold start 或restart的好時刻

冷熱起動之考量

  • 冷起動(RESTART=False)
    • 基本上由全球模式模擬結果整理成的大尺度空品檔案,切出指定時間,即可作為模式的起始條件。
    • 只需要最外層網格系統的初始濃度檔案(grd01)、其內層之初始值CAMx會自行內插求得。
  • 熱起動(RESTART=True)
    • 在連續、全年的模式作業中,前次模擬結果的瞬時紀錄檔案,可以作為模式的初始條件,不需另外再提供初始空品檔案。
    • 包括粗、細每一層巢狀網格之瞬時檔都必須提供。

CAMx模擬結果做為冷起動的初始濃度條件

  • airq.f這一個fortran程式用來讀取前一批次模擬結果濃度(ROOT.avrg.grd01)檔案的最末時間,來產生下一批次作業的起始濃度檔案(冷起動)。
    • 因早期CAMx模式並不產生ncf格式的結果,必須循序讀到最後時間。這在ncf版本中已經可以完全不需要了。
    • 程式下載:
  • 需要檔案
    • 編譯時,會需要早期UAM程式的內含文件(PARAMS.CMD等等,可以在UAMIV-CMDs@FAQ找到這些檔案)
    • 引數:前批作業的結果檔案(ROOT.avrg.grd01)
  • 產出檔案:ROOT.avrg.grd01 M

ncf格式版本

  • 直接使用ncks即可完成作業
  • 再用ncatted修改成所需的SDATE及STIME
ncks -d TSTEP,TLAST,TLAST+1 ROOT.avrg.grd01 ROOT.avrg.grd01M
ncatted -a SDATE,global,o,i,2019032 -a STIME,global,o,i,0 ROOT.avrg.grd01M

邊界條件

固定值之邊界濃度

  • CAMx與CMAQ一樣,在測試階段可以一組單純的空氣品質觀測值作為邊界濃度條件,一方面可以測試檔案格式與操作是否正確,一方面也可以調適化學機制之反應平衡、模式邊界與起始條件的一致性等等課題。
  • CAMx的邊界濃度檔案格式有別於其他所有格式,除了4筆表頭內容一致外,增加了第5~8筆表頭內容
  • 時變部分,因邊界濃度為2維場,與uamiv之3維特性有所差異。CAMx的特性是以邊界序(西東南北)取代uamiv高度位置。而將每筆之2維濃度場設定為高度及水平向。

uamiv與lateral_boundary格式內容之比較

項目 uamiv lateral_boundary 說明
表頭1檔名標籤與起迄日期時間 fname, note, NOSEG, NOSPEC,<p>NDATE, TTIME, NDLAST, TTLAST</p> (same)  
表頭2網格系統 XUTM, YUTM, NZONE, <p>XORG, YORG, DELTAX, DELTAY, </p><p>NOXG, NOYG, NOZ,</p><p>idproj,istag,tlat1,tlat2,rdum</p> (same)  
表頭3 4個整數 (Itmp(j), J=1,4) (same)  
表頭4污染物名稱 ((SPNAME(I,J), I=1,10), J=1,NOSPEC) (same)  
表頭5~8 4個邊界的索引指標 (無) <p>DO 100 N=1,4</p><p> READ(11) NOSEG, NEDG, NCEL(N),((IND(N,J),i,i,i),J=1,NCEL(N))</p><p>100 CONTINUE</p> 依序為西、東、南、北
時變部分逐時之啟迄日期時間 jjj,btime, jjn,etime (same)  
時變部分之濃度場 DO L=1,NOSPEC<p>DO K=1,NOZ</p><p> WRITE (12) NOSEG, (SPNAME(I,L),I=1,10), ((C(I,J,K,L),I=1,NOX),J=1,NOY)</p><p>enddo</p><p>enddo</p> DO L=1,NOSPEC<p>DO NEDG=1,4</p><p> nc=NOYG</p><p> if(NEDG.gt.2)nc=NOXG</p><p> WRITE (12) NOSEG, (SPNAME(I,L),I=1,10), NDG,((BC(I,K,L), K=1,NOZ2), I=1,NC)</p><p>enddo</p><p>enddo</p>  
  • 格式範例詳見

自空品濃度檔案截取邊界濃度

  • CAMx官網提供了截取程式BNDEXTR,其使用方法詳見

    邊界濃度檔案之處理程式

  • bndaryM2J.f,其目的在將全月逐時的邊界濃度檔案,按照日期進行切割以進行逐日的CAMx模擬測試。

逐月執行ICBC檔名之迭代

  • 在逐月的執行過程中,每月CAMx.in會需要定義當月的ICBC檔名,如果以手工一一給定,不單費工,而且容易出錯。可以一簡單的批次檔(gen.cs)來執行。
    • 事先將需要替換的名稱部分,以變數形式寫在CAMx.in模版裏
    • 逐月以sed指令將當月分的時間值,替換模版內之特定位置、另存新檔。

CAMx.in.loop模版

  • 模版以排放情境命名、建立目錄
    • 注意ROOT之定義、排放檔案的指定
  • ICBC部分內容如下
 Restart          = .RESTART.,
 Start_Date_Hour  = 20BY,BM,BD,BT00,   !
 End_Date_Hour    = 20YY,MM,DD,TT00,   !

...
 Initial_Conditions   = './ICBC/bndextr_d2/base.grd02.YYMM.ic',
 Boundary_Conditions  = './ICBC/bndextr_d2/base.grd02.YYMM.bc',
...
 Master_Grid_Restart  = 'outputs/conBM/BYBMbaseB.inst',
 Nested_Grid_Restart  = 'outputs/conBM/BYBMbaseB.finst',
 PiG_Restart          = 'outputs/conBM/BYBMbaseB.pig',
  • 時間變數原則:
    • 年月日時:Y/M/D/T
    • 前一批次:B+Y/M/D/T
    • 當批次:YY/MM/DD/TT

gen.cs

  1. 此處以date指令進行時間的計算。如為maxOS,指令略有不同。
  2. 當作業拆分給3台工作站執行時,第一次執行1/5/9月必須是冷起動。
    • 此處以月份與此三者差值的乘積為0做為判別式。字串$MM改成10為底的整數$MM10#$MM
    • 如果工作站數目多,會有更多冷起動,誤差機會比較多。
  3. sed指令的批次變數作業方式,特別留意引號的寫法。
kuang@114-32-164-198 /Users/camxruns/2016_v7
$ cat CAMxin_B/gen.cs 
for MM in {01..12};do
  nextM=$(date -d "2016${MM}01 +31day" +%m)
  nextY=$(date -d "2016${MM}01 +31day" +%Y)
  YY=$(date -d "$nextY${nextM}01 -1day" +%y)
  DD=$(date -d "$nextY${nextM}01 -1day" +%d)
  TT=20
  BY=$(date -d "2016${MM}01 -1day" +%y)
  BM=$(date -d "2016${MM}01 -1day" +%m)
  BD=$(date -d "2016${MM}01 -1day" +%d)
  BT=20
  RESTART=true
#split to 3 machines:  
  a=$(( (10#$MM - 1)*(10#$MM - 5)*(10#$MM - 9) ))
#  a=$(( (10#$MM - 1) ))
  if [ $a -eq 0 ];then
    RESTART=false
  fi
  echo $BY$BM$BD$BT $YY$MM$DD$TT 
  cp CAMxR.in.loop CAMx.in_$MM
  for cmd in  "s/MM/"$MM/ "s/DD/"$DD/ "s/TT/"$TT/ \
  	"s/BM/"$BM/ "s/BM/"$BM/ "s/BD/"$BD/ "s/BT/"$BT/ \
	  "s/YY/"$YY/ "s/BY/"$BY/ \
	  "s/RESTART/"$RESTART/  \
	  "s/YY/"$YY/ "s/MM/"$MM/ ;do
    sed -i $cmd CAMx.in_$MM
  done
done
exit 0