pt2emNest.f程式說明
Table of contents
背景
- 點源排放數據在空間上是離散的點狀分布,背景點源數以萬計,如以分級色點標示將會彼此重疊無法辨識。需以網格整併後,以VERDI或其他軟體來顯示其格柵圖。
- 本程式為fortran讀取point_source二進位循序檔案版本,同樣功能有python版本,讀取CAMx nc檔案或者是CMAQ點源檔案,可以參見FAQ。
- 此處著重pt2em.f程式之細部設計說明。
程式IO
- 本程式系列有2支程式,因應大範圍以及較小尺度範圍之解析度需求。
- 因是fortran程式,可以自行產生新檔,不需要準備結果檔案之模版
pt2em.f(d1範圍)
- 引數:
- File14:point_source格式之輸入檔名稱
- File13:uamiv格式之輸出檔名稱
pt2emNest.f(任何指定範圍)
- 引數
- File14:point_source格式之輸入檔名稱
- mm5camx之控制檔(d1.in~d4.in,範例如FAQ)
程式分段說明
副程式readIn
- 雖然point_source格式的煙囪座標已經轉成直角座標系統,不見得與目標uamiv格式檔案一致,需要轉換
- 這段程式來自於mm5camx的部分內容
- 讀取d?.in的網格定義,應用在產生新的uamiv格式檔案
subroutine readIn(NX,NY,NZ,XORG,YORG,DELTAX,DELTAY)
character fname*100,project*10
do i=1,7
read(1,*)
enddo
read(1,'(20x,a)') fname !line 8th
read(fname,*) NX,NY,NZ
write(*,'(a,3i10)')' CAMx grid size:',NX,NY,NZ
read(1,'(20x,a)') fname
read(fname,*)DELTAX,DELTAY
write(*,'(a,2f10.3)')
& ' CAMx grid spacing:',DELTAX,DELTAY
read(1,'(20x,a)') fname
read(fname,*) XORG,YORG,clonin,clatin,tlat1in,tlat2in
write(*,'(a,2f10.3)')
& ' CAMx LCP Origin (SW corner):',XORG,YORG
write(*,'(a,4f10.3,/)')
& ' CAMx LCP Projection Params :',clonin,clatin,tlat1in,tlat2in
return
end
point_source格式之讀取
- 6筆常數檔頭
DATA NUPTS /14/
OPEN(NUPTS, FILE=trim(fort14),FORM='UNFORMATTED'
, ,convert='BIG_ENDIAN',STATUS='UNKNOWN')
read (NUPTS) MPTS, MFID, NSG, NSPEC, NBD, TBEG, NED, TEND
read (NUPTS) XUTM, YUTM, NZONE, XORG, YORG, DELTAX, DELTAY,
$ NX, NY, NZ
$, NVLOW, NVUP, DZSURF, DZMINL, DZMINU
read (NUPTS) I1,I1,NX,NY
read (NUPTS) ((MSPEC(I,J),I=1,10),J=1,NSPEC)
read (NUPTS) NSEG, NOPTS
read (NUPTS) (X(K),Y(K),H(K),D(K),T(K),V(K),K=1,NOPTS)
- 其中MPTS為4個位元、長度10的序列,其內容為”PTSOURCE “
- MFID為長度10的整數序列
- MSPEC為4個位元,長寬10×50的矩陣
時間序列部分
- 3個檔頭及排放量
DO
read (NUPTS,end=680) NBD, TB , JED, TE
write (NUEM1) NBD, TB, JED, TE
read (NUPTS) NSEG, NOPTS
WRITE ( *,* ) NBD, TB , JED, TE
IT=int(TB)+1
read (NUPTS)(ILOC(IP,IT),IJPS(IP,IT),KPTS(IP,IT),FLOW(IP,IT),
$ EFPLH(IP,IT), IP=1,NOPTS)
DO 500 L=1,NSPEC
read (NUPTS) NSEG,(MSPEC(J,L),J=1,10),
$ (QPTS(L,IP), IP=1,NOPTS)
...
ENDDO
網格化後加總排放量
tmp=0
do IP=1,NOPTS
if((X(IP)-XORG)*(X(IP)-XLEN).GT.0) cycle
if((Y(IP)-YORG)*(Y(IP)-YLEN).GT.0) cycle
I=(X(IP)-XORG)/DELTAX+1
J=(Y(IP)-YORG)/DELTAY+1
if(I.le.0.or.I.gt.MROWS) print*,I
if(J.le.0.or.J.gt.MCOLS) print*,J
tmp(I,J)=tmp(I,J)+QPTS(L,IP)
enddo !IP
write(NUEM1)NSG,(MSPEC(J,L),J=1,10),((tmp(I,J),I=1,NX),J=1,NY)
程式碼下載
Download: 以d4解析度檢視CAMx點源point_source格式檔案:pt2emNest