在進行地形敏感度數值實驗時,除了將地形移除的無地形實驗之外,也常常會進行將地表分類替換為海洋的Ocean Run,以藉此檢驗地表特性、洋面通量對此實驗之影響。
但是問題來了,地表分類是替換掉了,但是地表溫度呢?
以台灣本島這種高聳地形為例,高山地區的地表溫度一定明顯低於洋面溫度,因此在這個假想的Ocean Run中,這塊原本是陸地的「海洋」會有著很不尋常的低溫存在,這時就可以修改海溫分布來讓他看起來「正常」點,然而,溫度分布又該採用哪種分布呢?長期平均?線性內插?甚至是spline內插?這種敏感度實驗的狀況本來就不存在於現實之中,所以選用哪種分布,甚至是不做任何改變都是可以討論的,端看你希望透過這個實驗看出什麼。
以下就說明一下怎麼修改海溫,內容同樣是出自我之前寫給學弟妹的MM5使用手冊。
開始修改可以先看一下這張取自MM5 OnLine Tutorial - SST Note的海溫分布圖:
這裡的「海溫」連陸地上都有值,不過不用擔心,根據線上教學的說明呢,陸上的值沒有任何意義,只是經由MM5自己內插產生而成的。
然而,在表面溫度(SkinTemperature)這個變數裡,則是包含了陸地、海洋的溫度資料,從下圖中可以看出海溫差異不大,但是有表現出陸地的溫度特性來,然而由於海陸的溫差較大,在交界處也就理所當然的會有著相當大的溫度梯度。
在REGRID裡面對這兩個場的處理方式是一樣的,不過稍後在INTERPF程式中就不一樣了。
在INTERPF中,如果程式在讀取來自REGIRD的資料時有找到SST的資料,那就會將其存入TSEASFC這個變數裡,然後用他的資料當作水體的表面溫度來製作下邊界場(這個變數是可以隨時間變化的)程式也會依據海陸分布的遮罩自動判斷哪裡要用SST的資料,哪裡要用地表溫度的資料。
反之,如果沒有找到SST的資料而只有表面溫度的資料,那就會將此表面溫度所有時間的值做平均,產生一個不隨時間變動的TSEASFC海溫場供模式使用,這個平均的目的就是要移除在平均的海溫場中,陸地因日夜變化而造成的溫度差異。
對這些變數有初步的了解之後就可以開始動手啦!海溫資料會存在於初始場(MMINPUT)以及邊界場(BDYOUT)中,修改得由 INTERPF/src/modual_all_io.F 著手, 開始之前要先準備好修改好的二進位海溫格點資料,格點數要跟你的domain設定一樣,如果手邊沒有海溫資料的話,也可以先在這個檔案中讓他輸出tseasfc這個變數,再依據這個原本的海溫資料來改成你想要的分布。
首先來修改邊界條件,假設手邊已經準備好了一份叫做SSTok.dat的海溫資料檔,請先在modual_all_io.F裡面的add_lbc 這支副程式中(我猜他是 add lower bounday condition 的縮寫,從interpf.f中也可以看到這是用來製作下邊界用的)找到下面這段程式碼:! Specific things for sst small header. tseasfc_sh%name = 'SST AVG ' |
integer :: i,j ... print*,"=== Modifing LOWBDY SST ===" open(99,file="SSTok.dat",access="direct",form="unformatted",recl=4*ie*je,status="old") read(99,rec=1) ((tseasfc(i,j),j=1,je),i=1,ie) ! 讀進新的海溫資料,記得要先宣告i,j close(99) ... WRITE ( unit_lowerbc ) tseasfc |
WRITE ( immout ) ps0 |
integer :: i,j real,allocatable :: MYtseasfc(:,:) ... allocate(MYtseasfc(ie,je)) ... WRITE ( immout ) ps0 print*,"=== Modifing LOWBDY SST ===" open(99,file="SSTok.dat",access="direct",form="unformatted",recl=4*ie*je,status="old") read(99,rec=1) ((MYtseasfc(i,j),j=1,je),i=1,ie) ! 讀入資料,記得要先宣告i,j以及一個暫存陣列 close(99) all_2d(16)%array(is:ie,js:je)=tseasfc DO loop = 1 , num_2d IF ( all_2d(loop)%small_header%ordering(1:2) .EQ. 'YX' ) THEN WRITE ( immout ) sh_flag ...... |