pt2emNest.f程式說明

 

背景

  • 點源排放數據在空間上是離散的點狀分布,背景點源數以萬計,如以分級色點標示將會彼此重疊無法辨識。需以網格整併後,以[VERDI][VERDI]或其他軟體來顯示其格柵圖。
  • 本程式為fortran讀取point_source二進位循序檔案版本(格式詳參[[2022-07-18-PTSRCE_format]]),同樣功能有python版本,讀取CAMx nc檔案或者是CMAQ點源檔案,可以參見FAQ
  • 此處著重pt2em.f程式之細部設計說明。參見[2022-07-04-emis#pt2em.f]

程式IO

  • 本程式系列有2支程式,因應大範圍以及較小尺度範圍之解析度需求。
  • 因是fortran程式,可以自行產生新檔,不需要準備結果檔案之模版

pt2em.f(d1範圍)

  • 引數:
    1. File14:point_source格式之輸入檔名稱
    2. File13:uamiv格式之輸出檔名稱

pt2emNest.f(任何指定範圍)

  • 引數
    1. File14:point_source格式之輸入檔名稱
    2. 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)

程式碼下載