Linux伺服器 Linux伺服器

資工所專業課程上課教材

資工所專業課程 > 課程內容 > 專題八 - 軟體編譯行為

專題八 - 軟體編譯行為

上次更新日期 2019/07/10

許多的第三方軟體,可能都不是官方網站提供的!或者是,官方網站提供的額外功能 (例如 EPEL),並無法符合你的需求, 這個時候你就得要自己編譯軟體才行。舉例來說,鳥哥本人跑的 CMAQ 數值模式,就得要自己編譯後,才有辦法執行的。 而編譯一般使用 gcc 來處理,這時你就得要處理好編譯所需要的前驅軟體 (編譯器與函式庫等),才有辦法繼續做軟體編譯的行為啊!

另外,整篇資料看完做完之後,編譯 CMAQ 的最後一點要仔細瞧一瞧,回想一項 -L/your/function/lib 以及 -I/your/function/include 的意義, 還有 lnetcdff.a 或 lnetcdff.so 的完整檔名與意義又是什麼?這很重要喔!你會經常碰到的!

  • 軟體開發、發展的環境建置 - 以 AERMOD 模式為例
  • 大型專案的編譯與安裝 - 以美國環保署 CMAQ v5.2.1 所需要的前驅軟體為例
  • 參考資料

軟體開發、發展的環境建置 - 以 AERMOD 模式為例

通常我們 CentOS 的開發環境,大多直接 yum groupinstall "Development Tools" 就搞定了!但是,如果是 fortran 的環境, 或者是某些可以到處移動執行檔的靜態函式庫功能,可能就得要額外安裝其他的軟體才行了。

  1. 建立好軟體開發的環境
    1. 在 Linux 底下的軟體開發,大部分使用的都是 GNU 計畫提供的 gcc 編譯器!但是,只有 gcc 編譯器會有點蠢, 因此,大部分的軟體在釋出的時候,都會提供 autoconf, make 等相關軟體,並提供一隻可以自動幫你監測與分析環境的腳本, 最終幫你建立 Makefile,好讓你可以簡單的透過 make 這個指令來進行編譯、安裝、移除的行為。
    2. 不同的 Linux distribution 所需要的開發環境套件可能有點差異,因此,你得要自己找到適合自己的軟體才行。 在 CentOS 7 上面,我們應該可以透過 yum groupinstall "Developement Tools" 來安裝所有的軟體即可。但是, 如果想要開發 UI 界面,可能還得要安裝 X 相關的驅動程式軟體才行。
    3. 因為這一章的目標,主要是完成美國環保署 CMAQ 的程式,這個程式主要是透過 fortran 程式碼撰寫的,因此, 我們還得要額外安裝 gfortran (g95) 的編譯器才行。

    4. 完成底下的實做:
      1. 透過前幾章的虛擬機知識技巧,成立一個名為 cmaq 的虛擬機,這個虛擬機需要用到所有的 CPU 核心, 同時提供大約 4G 的記憶體,另外,使用的磁碟檔案請使用原始碟,不要使用快照碟
      2. 建立完成後請啟動這個虛擬機器,同時透過遠端連線的方式 (pietty) 連線進入這個虛擬機的環境中。
      3. 安裝好你的開發環境 (包括 Development Tools, gcc-gfortran 等軟體喔!)
  2. 牛刀小試:嘗試將美國環保署提供的 AERMOD 模式抓下來編譯與執行:
    1. AERMOD 是一個擴散模式,可以模擬從煙囪排放之後,這個污染物擴散到周界大氣的結果,會造成 PM2.5 濃度的變化。 這個模式很常用在環境影響評估,或者是環保、環工方面的工廠擴廠,或者是降載可能造成的影響等任務上面。
    2. AERMOD 主要是由美國環保署所開發釋出的,今年 (2019) 最新的版本為 v18081 這一個版次。 不過,預設的 AERMOD 版本,主要是提供給 windows 系統執行的。但是,對於真的在跑 model 的企業來說, 使用 windows 版本有許多不方便的地方。包括資料複製得要傳到其他 server 去共享、windows 系統資源分配比較傷腦筋、 無法與實際的模式系統整合等等。
    3. 因此,在這個專題當中,我們建議將 AERMOD 轉成 Linux 版本,所以下載 v18081 的 source code (zip) 版本, 相關的下載點如下:美國環保署網站的 AERMOD 模式下載
    4. 下載之後該如何編譯呢?事實上,這個模式有提供數個編譯的批次檔,我們先來瞧一瞧編譯的批次檔結構:
      # mkdir -p /srv/aermod/sources
      # cd /srv/aermod/sources
      # wget ttps://www3.epa.gov/ttn/scram/models/aermod/aermod_source.zip
      # unzip aermod_source.zip
      # vim gfortran-aermod-64bit.bat
      rem @echo off
      setlocal
      set COMPILE_FLAGS=-fbounds-check -Wuninitialized -O2 -static  <==這兩行在設定編譯與連結的參數
      set LINK_FLAGS= -static -O2
      
      gfortran -m64 -c %COMPILE_FLAGS% modules.f  <==一個個程式碼去編譯成為目標檔 (object file, *.o)
      gfortran -m64 -c %COMPILE_FLAGS% aermod.f
      gfortran -m64 -c %COMPILE_FLAGS% setup.f
      gfortran -m64 -c %COMPILE_FLAGS% coset.f
      gfortran -m64 -c %COMPILE_FLAGS% soset.f
      gfortran -m64 -c %COMPILE_FLAGS% reset.f
      gfortran -m64 -c %COMPILE_FLAGS% meset.f
      gfortran -m64 -c %COMPILE_FLAGS% ouset.f
      gfortran -m64 -c %COMPILE_FLAGS% inpsum.f
      gfortran -m64 -c %COMPILE_FLAGS% metext.f
      gfortran -m64 -c %COMPILE_FLAGS% iblval.f
      gfortran -m64 -c %COMPILE_FLAGS% siggrid.f
      gfortran -m64 -c %COMPILE_FLAGS% tempgrid.f
      gfortran -m64 -c %COMPILE_FLAGS% windgrid.f
      gfortran -m64 -c %COMPILE_FLAGS% calc1.f
      gfortran -m64 -c %COMPILE_FLAGS% calc2.f
      gfortran -m64 -c %COMPILE_FLAGS% prise.f
      gfortran -m64 -c %COMPILE_FLAGS% prime.f
      gfortran -m64 -c %COMPILE_FLAGS% sigmas.f
      gfortran -m64 -c %COMPILE_FLAGS% pitarea.f
      gfortran -m64 -c %COMPILE_FLAGS% uninam.f
      gfortran -m64 -c %COMPILE_FLAGS% output.f
      gfortran -m64 -c %COMPILE_FLAGS% evset.f
      gfortran -m64 -c %COMPILE_FLAGS% evcalc.f
      gfortran -m64 -c %COMPILE_FLAGS% evoutput.f
      
      gfortran -m64 -o aermod.exe %LINK_FLAGS% MODULES.o AERMOD.o SETUP.o \ <==讓所有的目標檔連結整合成為一個可執行檔的方式
       COSET.o SOSET.o RESET.o MESET.o OUSET.o INPSUM.o METEXT.o IBLVAL.o \
       SIGGRID.o TEMPGRID.o WINDGRID.o CALC1.o CALC2.o PRISE.o PRIME.o SIGMAS.o \
       PITAREA.o UNINAM.o OUTPUT.o EVSET.o EVCALC.o EVOUTPUT.o
      
      del *.o
      del *.mod
      
      你可以很輕鬆的就發現,這個是給 windows 版本的 gfortran 使用的編譯批次檔,所以裡面用到 %COMPILE_FLAGS% 之類的格式! 跟我們在 Linux 底下使用的不同。此外,給 gfortran 的旗標 (flags) 也不太一樣,這也需要調整才行!
    5. 現在,讓我們建立一個名為 Makefile 的檔案,讓我們在建立執行檔時,能有比較好的執行過程。 先要知道的是, Makefile 的簡單語法是這樣講的:
      • 在 makefile 當中的 # 代表註解;
      • <tab> 需要在命令行 (例如 gfortran 這個編譯器指令) 的第一個字元;
      • 標的 (target) 與相依檔案(就是目標檔)之間需以『:』隔開。
      現在,就來建立 Makefile 檔案:
      # yum install libgfortran-static  glibc-static  <==因為會用到靜態函式庫喔!
      # vim Makefile
      # 1. 先規範編譯器、編譯參數、連結參數
      FC = gfortran
      FFLAGS = -fbounds-check -Wuninitialized -Ofast -static -march=native -ffast-math \
               -funroll-loops -m64
      LFLAGS = -static -Ofast -march=native -ffast-math -funroll-loops -m64
      
      # 2. 建立原始檔案與處理目標檔案 (object file)
      SRC = \
       modules.f  aermod.f   setup.f    coset.f    soset.f    reset.f    \
       meset.f    ouset.f    inpsum.f   metext.f   iblval.f   siggrid.f  \
       tempgrid.f windgrid.f calc1.f    calc2.f    prise.f    prime.f    \
       sigmas.f   pitarea.f  uninam.f   output.f   evset.f    evcalc.f   \
       evoutput.f
      OBJ = $(SRC:.f=.o)
      
      # 3. 處理編譯流程
      main: ${OBJ}
              ${FC} -o aermod.exe ${LFLAGS} ${OBJ}
      
      # 你會發現,不但內容變得比較簡潔,資料修改也比較容易喔!
      
      上面的檔案內容中,比較有趣的其實是那個 OBJ 的變化!意思是將 SRC 的檔名,從 .f 轉成 .o ,也就變成了 object 檔案! 至於 FC 是 fortran compiler,而 FFLAGS 則是 fortran 編譯時,提供的編譯參數之意。
    6. 最後,請輸入 make 這個指令,make 就可以參考 Makefile 去一個一個的編譯與執行所需要的編譯過程!這要比批次檔來的有效率, 而且還能查閱流程!相當有用喔!
    7. 測試執行 ./aermod.exe --help ,看看能否出現警告訊息?如果可以,那就是編譯成功了!例如這樣:
      # ./aermod.exe --help
       usage: 0, 1, or 2 args
      
       Usage: AERMOD  18081 takes either no or one or two parameters.
              Either
                    AERMOD
              Or
                    AERMOD plumetest.inp
              Or
                    AERMOD plumetest.inp plumetest.out
      
              The first parameter  is the .INP file name,
              The second parameter is the .OUT file name,
      +Error Opening Runstream Input File!  Aborting.
      
      最簡單的 Makefile 內容,可以參考鳥哥好久以前寫的一篇文章內容:鳥哥基礎學習:原始碼與 Tarball
    8. 現在,請從 這裡 下載一個可執行的範本檔,將他放置到 /srv/aermod 裡面,準備解開進行模式模擬:
      # 1. 先將測試範例抓下來,同時進行環境的建置:
      # cd /srv/aermod/
      # wget http://dic.vbird.tw/network_project/images/aermod.co.tar.gz
      # tar -zxvf aermod.co.tar.gz
      # cd zzzdemo/
      # ln -s ../sources/aermod.exe  .
      # ll
      -rw-rw-r--. 1 student student  578160  7月  9 15:16 AERMET_2013_466920.PFL  <==探空資料檔案
      -rw-rw-r--. 1 student student 1550646  7月  9 15:16 AERMET_2013_467440.SFC  <==地面氣象檔案
      lrwxrwxrwx. 1 root    student      21  7月  9 15:31 aermod.exe -> ../sources/aermod.exe <==執行檔
      -rw-rw-r--. 1 student student    1109  7月  9 15:24 aermod.inp              <==參數設定檔
      -rw-rw-r--. 1 student student 1303843  7月  9 15:16 kaohsiung_csc.rec       <==地形檔案
      
      # 2. 開始直接執行即可:
      # ./aermod.exe
      +Now Processing SETUP Information
      +Now Processing Data For Day No.    1 of 2013
      +Now Processing Data For Day No.    2 of 2013
      ...
      # 事實上只有跑 5 天,後續的天數都沒跑,所以後面衝很快!沒問題!別擔心!
      
      # ll
      -rw-rw-r--. 1 student student   578160  7月  9 15:16 AERMET_2013_466920.PFL
      -rw-rw-r--. 1 student student  1550646  7月  9 15:16 AERMET_2013_467440.SFC
      lrwxrwxrwx. 1 root    student       21  7月  9 15:31 aermod.exe -> ../sources/aermod.exe
      -rw-rw-r--. 1 student student     1109  7月  9 15:24 aermod.inp
      -rw-r--r--. 1 root    student 26435831  7月  9 15:34 aermod.out
      -rw-r--r--. 1 root    student 73772381  7月  9 15:34 CO_8hr_all.txt
      -rw-r--r--. 1 root    student  5374329  7月  9 15:34 CO_8hr_max.txt
      -rw-r--r--. 1 root    student  5374329  7月  9 15:34 CO_day_3th.txt
      -rw-r--r--. 1 root    student  5374329  7月  9 15:34 CO_day_max.txt
      -rw-r--r--. 1 root    student 24591341  7月  9 15:34 CO_days_all.txt
      -rw-r--r--. 1 root    student   277188  7月  9 15:34 CO.ERR
      -rw-r--r--. 1 root    student  4918936  7月  9 15:34 CO_year_average.txt
      -rw-rw-r--. 1 student student  1303843  7月  9 15:16 kaohsiung_csc.rec
      # 之後就有一堆輸出檔!可以用來作圖囉!
      
      這樣,你的 AERMOD 模式就可以順利運作進行囉!

大型專案的編譯與安裝 - 以美國環保署 CMAQ v5.2.1 所需要的前驅軟體為例

美國環保署為了讓他們國內各州有個統一的模式標準,因此提供了很多的空氣品質模式,其中一個最大的模式,就是 CMAQ 這個! 在 2019 年釋出了 v5.2.1 版本。CMAQ 光是要編譯成功,就很有點困難~許多的函式庫都得要編譯才行! 先讓我們來玩一玩前驅模組的編譯~

  1. 美國環保署公告的 CMAQ 軟體:
    1. 旨在以一個大型數值模式進行所有的空氣污染物模擬。這裡指的空氣污染物,包括氣態 (O3, SO2, NOx, NH3, VOC, PAH...) 以及固態 (硫酸鹽、 硝酸鹽、銨鹽、重金屬元素、有機碳成份、無機碳成份、地殼元素等等) 等物種,這些污染物都在一個大型模式裡面模擬, 而且彼此之間會進行反應、傳輸、轉化、平衡等行為,對於政府進行減量控制的應用,非常有幫助。
    2. 這個數值模式名稱被稱為 CMAQ ( Community Multiscale Air Quality Modeling System),雖然主要是美國環保署培養一群環工博士、 電腦科學博士所開發出來的,但是,這個程式碼是對全世界公佈成為自由軟體,因此,有非常多的學者會參與討論與修改, 包括提供更詳細的數值運算模式機制、更快速的演算法等等,詳細的說明可以參考底下的網站:
    3. 相較於之前開發的模式,第一代的的箱模式 (box model) 只提供一個格點來進行模擬,第二代的網格模式 (multiscale grid model) 雖然加入了多層次網格來進行模擬,但是主要的氣相、固相、液相反應均分別在不同的模式當中運作,CMAQ 將所有的運算機制整合在一起, 因此自稱為第三代網格模式,故稱為 Models3 這樣的稱呼。於是就有 Models3/CMAQ 模式之名。
    4. 如上所述,這個模式會使用到相當多的機制,因此運算的效能是很重要的!以前的電腦系統效能很糟糕,因此,許多的計算只能被簡化, 以加速產生模擬的結果。現代的電腦技術成熟,可以有比較快速的核心運算能力,因此 Models3/CMAQ 就加入比較詳細的機制 (沒有簡化), 所以模式的運作時,需要的運算效能要求就會比較高。所以,使用單一的一顆核心來運算是無法滿足整體模式的運作的。
    5. 因此就需要所謂的平行函式庫,也需要將原本的程式碼,改成可以平行運算的寫法。這個平行運算就是一般所謂的 Message Passing Interface (MPI) 機制!目前常見的軟體有 MPICH 以及 OpenMPI 等。 CMAQ 預設使用 OpenMPI,不過鳥哥比較習慣使用 MPICH 。
    6. 另外,因為輸入的資料相當龐大,包括每天、每小時的氣象資料、排放量資料、土地利用型態資料、又分為水平 X Y 網格以及垂直 Z 網格, 所以,如果使用傳統的純文字資料來進行輸入,很可能會造成輸入資料的錯置,最常見的就是時間定義錯誤。為此, 國際網路間大量使用了 NetCDF 這種讀寫格式,這種格式會將每筆資料定義在固定的時間與空間,所以,每筆資料都有對應的時空分佈, 那就不可能會有資料錯置的情況發生了。
    7. 承上,Models3/CMAQ 更在 NetCDF 的方法上面,建置了 I/O API 的一個讀寫界面,這個界面有助於提供 CMAQ 進行更有效率的讀寫機制! 所以,要安裝 CMAQ,就得要有 I/O API 喔!
  2. 系統規劃:

    我們預計將所有的 CMAQ 資料通通放置於 /srv/cmaq 裡面,相關的模式所需函式庫與模組預計想要這樣做:

    /srv/cmaq/sources    <==原始程式
    /srv/cmaq/programs   <==各函式庫預設放置的目錄
    /srv/cmaq/build      <==各函式庫編譯時的原始資料目錄
    /srv/cmaq/models     <==主程式放置的位置
    
    # mkdir /srv/cmaq
    # cd /srv/cmaq
    # mkdir sources programs build models
    
    # 
    # 
    # 
    
  3. MPICH 平行函式庫的安裝:
    1. MPICH 廣泛的應用在很多的平行運算數值模式上面,相關的 MPICH 你可以參考他的官方網站介紹:
      https://www.mpich.org/
    2. 最新的 (2019) MPICH 目前釋出版本為 3.3 這一版次,你可以在上面的官網上面抓下來,也可以從我們的網站來下載。 下載點在: mpich
    3. 一般來說,我們編譯完成的軟體是很有可能需要提供給其他單純運算的 node 使用的,因此,你應該要將該軟體放置到非正規目錄比較好! 然後將這個非正規的目錄使用類似 NFS 的服務,完整的釋出給區域網路內的其他運算單元 (nodes) 掛載使用才對。 在這個案例中,我們預計將軟體下載到 /usr/local/sources 裡面,而編譯過程則放置到 /usr/local/build 當中, 至於安裝的所在處,就放置到 /models/programs 這個目錄。
    4. 下載軟體與解開軟體:
      # cd /srv/cmaq/sources/
      # wget http://www.mpich.org/static/downloads/3.3/mpich-3.3.tar.gz
      # cd ../build
      # tar -zxvf ../sources/mpich-3.3.tar.gz
      # cd mpich-3.3
      # vim README
      
      請仔細看一下 Getting Started 的內容,會有詳細的介紹如何進行這個軟體的編譯與安裝的行為!相當的重要喔! 看完之後你也應該就會處理整體軟體的編譯了!
    5. 一般軟體的安裝過程,大致上就是:
      1. 使用 ./configure --options 去分析系統,然後建立所需要的 Makefile 檔案
      2. 使用 make 去分析 Makefile 進行編譯的行為
      3. 使用 make check 去檢查編譯的資料是否正確
      4. 使用 make install 去安裝這個編譯的成果到正確的地方
      5. 修改變數設定資料,讓你可以使用這個軟體。
    6. 根據上述的說明,我們建立一個名為 install.sh 的批次檔,將上述所需要進行的任務寫在一起, 然後進行執行會比較簡單,而且能夠有個紀錄,未來要 debug 也比較容易!
      # vim install.sh
      #!/bin/bash
      
      export CC=gcc
      export FC=gfortran
      export F77=gfortran
      export CXX=g++
      ./configure     \
              --enable-fast=all \
              --enable-mpit-pvars=nem \
              --enable-fortran=all \
              --enable-cxx \
              --enable-threads=multiple \
              --enable-debug \
              --prefix=/srv/cmaq/programs/mpich3
      make clean
      make -j 8
      make install
      
      上面那個 make -j 8 比較好玩,一般來說,如果沒有額外指定, make 會使用 1 顆 CPU 慢慢去編譯 (單執行緒), 當你的系統 CPU 核心比較多,就可以進行同步編譯,以上面的情況來說,就是透過 8 個執行緒,分別交給不同的 CPU 去幫忙編譯, 這樣編譯的速度會比較快!但是,某些軟體不能這樣做!否則會出現錯誤喔!在我們這個環境是可以這樣做的!
    7. 請使用 sh install.sh 去進行環境分析、編譯與安裝吧!另外,你也可以將上面的 install.sh 內容分項一個一個分別執行, 好處是你可以檢查每一個步驟的執行過程是否正確順利的完成!如果沒有任何問題,再進行下一步這樣,也比較能夠即時的抓出問題, 減少一次處理造成的困擾!
    8. 這一版的 MPICH 有提供一個計算 pi 的平行程式碼給我們使用,同樣在剛剛建立 install.sh 的目錄裡面,編譯完成之後, 下達這個指令來使用 4 個核心計算看看:
      # /srv/cmaq/programs/mpich3/bin/mpiexec -n 4 ./examples/cpi
      Process 0 of 4 is on localhost.localdomain
      Process 1 of 4 is on localhost.localdomain
      Process 2 of 4 is on localhost.localdomain
      Process 3 of 4 is on localhost.localdomain
      pi is approximately 3.1415926544231239, Error is 0.0000000008333307
      wall clock time = 0.000774
      
      你可以變更 4 到不同的數量去,測試看看你的 MPICH 能否順利的完成計算囉。
    9. 你會發現我們上面的指令中,要執行這個 mpiexec 要寫好長好長的指令~不太方便。要可以直接執行 mpiexec 的話, 直接建立一個大家可以呼叫的環境設定檔即可!
      # 1. 指定要跑 CMAQ 所需要的環境設定:
      # vim /srv/cmaq/bashrc
      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
      export PATH
      
      # 1. MPICH
      PATH=${PATH}:/srv/cmaq/programs/mpich3/bin
      
      # 2. 修改操作者自己的環境設定:
      # vim ~/.bashrc
      ....
      if [ -f /srv/cmaq/bashrc ]; then
              . /srv/cmaq/bashrc
      fi
      
      # 3. 直接載入測試看看囉!
      # source ~/.bashrc
      # mpiexec -n 4 ./examples/cpi
      Process 3 of 4 is on localhost.localdomain
      Process 0 of 4 is on localhost.localdomain
      pi is approximately 3.1415926544231239, Error is 0.0000000008333307
      wall clock time = 0.000587
      Process 1 of 4 is on localhost.localdomain
      Process 2 of 4 is on localhost.localdomain
      
  4. HDF 5 軟體的安裝:
    1. 除了 MPICH 要先安裝之外,CMAQ 模式會使用到的 WRF 氣象資料,這個 WRF 氣象資料的容量佔用非常大量的磁碟空間, 因此,近來很多的模式都會使用 HDF5 這個函式庫的支援,讓系統的資料可以進行高速的壓縮與解壓縮,以降低容量。 以鳥哥的案例來說,我們購買的 2013 年的 WRF 資料,佔用我 4T 的磁碟空間,但是,新的 2016 年的 WRF 資料使用 hdf5 函式庫, 只佔用了大約 1.5T 的容量,降低了很多容量的使用。雖然這樣的結果會導致鳥哥的模式在讀取這個 WRF 的過程中, 效能較慢些 (因為需要解壓縮),不過降低這麼多容量,還是相當高興啊!
    2. hdf5 官方網站提供了不少的軟體支援,不過我們目前只需要 hdf5 就是了。官方網站如下:
      https://www.hdfgroup.org/
    3. hdf5 官方網站已經提供了直接下載的方式,建議大家下載 hdf5-1.10.5.tar.bz2 這個版本,因為容量比較小喔!
      https://www.hdfgroup.org/downloads/hdf5/source-code/#conf
    4. 開始解壓縮與編譯的流程:
      # cd /srv/cmaq/sources
      # wget "https://www.hdfgroup.org/package/hdf5-1-10-5-tar-bz2/?wpdmdl=13570&refresh=5d244ad36f1061562659539" -O hdf5-1.10.5.tar.bz2
      # cd ../build
      # tar -jxvf ../sources/hdf5-1.10.5.tar.bz2
      # cd hdf5-1.10.5
      # vim install.sh
      #!/bin/bash
      export CC=gcc
      export FC=gfortran
      export CXX=g++
      export CPPFLAGS=""
      export LDFLAGS=""
      ./configure  --enable-fortran --prefix=/srv/cmaq/programs/hdf5
      make -j 8
      make install
      
      # sh install.sh
      
      整個流程跟剛剛的 MPICH 並沒有什麼很大的差別!安裝完畢之後,整個 hdf5 的軟體與函式庫就會放置到 /srv/cmaq/programs/hdf5 的目錄下!
    5. 現在,我們想要讓使用者也可以使用 hdf5 的指令,還有利用 hdf5 的函式庫,那可以這樣做的:
      # vim /srv/cmaq/bashrc
      ...
      # 2. dhf5
      PATH=${PATH}:/srv/cmaq/programs/hdf5/bin
      
      # source ~/.bashrc
      # h5fc --version
      GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
      Copyright (C) 2015 Free Software Foundation, Inc.
      
      GNU Fortran 在法律允許的範圍內沒有任何擔保。
      您可以在遵循 GNU 通用公共許可證的前提下分發 GNU Fortran 的副本。
      有關事宜的詳情請參考名為 COPYING 的檔案
      
      要讓動態函式庫可以被其他軟體搜尋使用,可以這樣做:
      # vim /etc/ld.so.conf.d/models.conf
      /srv/cmaq/programs/mpich3/lib
      /srv/cmaq/programs/hdf5/lib
      # 一個軟體的函式庫一行,直接寫進來到附檔名為 .conf 的檔案即可!
      
      # ldconfig   # 這個動作在載入
      # ldconfig -p | grep hdf
              libhdf5hl_fortran.so.100 (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5hl_fortran.so.100
              libhdf5hl_fortran.so (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5hl_fortran.so
              libhdf5_hl.so.100 (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5_hl.so.100
              libhdf5_hl.so (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5_hl.so
              libhdf5_fortran.so.102 (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5_fortran.so.102
              libhdf5_fortran.so (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5_fortran.so
              libhdf5.so.103 (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5.so.103
              libhdf5.so (libc6,x86-64) => /srv/cmaq/programs/hdf5/lib/libhdf5.so
      
      這樣就完成了 hdf5 的安裝囉!
  5. NetCDF C 函式庫的安裝:
    1. 以前古早的年代,如果想要讓模式可以讀取某些檔案,這些文字檔的『格式』就很重要!因為如果一個錯誤資訊, 就可能導致所有的資料錯亂!這是因為這些資料只是透過排序來輸入,每個資料並沒有給予特定的時空變化數據! 舉例來說,給妳一個 PM2.5 的排放量資料,你要如何知道這個排放量資料的 (1)時間與 (2)這個排放的地理位置呢? 為了解決這個問題,因此 UCAR 就開發出一個有點類似『資料庫類型的檔案』格式,這就是所謂的 NetCDF。
    2. 資傳系的同學都知道,所謂的關聯性資料庫,就是先定義出每一個欄位的資料,以及資料的格式,之後如果你想讀取該資料, 就可以透過關聯性的搭配,取得正確的資訊。一般來說,使用 SQL 的方式來讀寫資料庫系統,基本上,讀寫的資料大部分都會是正確的! 不太可能會有讀寫到錯誤的資訊。但資料庫系統通常整合在 Server 上面,然後資料的可攜式情況不太好! 如果能夠以檔案的格式來提供類似資料庫的讀寫,應該才是比較合適的方式。
    3. 在這樣的概念下,NetCDF 函式庫,就提供了一個類似資料庫讀寫的函式庫,然後建置出類似資料庫欄位定義的檔案, 之後再以 NetCDF 提供的 ncdump, ncgen 等指令,就可以輕鬆的讀寫出某個檔案內的數值!基本上,資料會相當準確! 讀寫的速度效能也很好!因此,目前許多的大型專案,都會使用 NetCDF 喔!
    4. 不過,NetCDF 畢竟沒有支援檔案資料壓縮,因此檔案的容量通常比較大。近期以來,許多大型數值專案計畫, 就將 NetCDF 整合了 hdf5 的函式庫,因此,NetCDF 的檔案格式就會直接支援 hdf5 的資料壓縮格式,如果則可以擁有降低容量, 且仍然提供不錯的讀寫效能的 NetCDF 檔案喔!
    5. NetCDF 的官方網站以及載點在這裡:
      https://www.unidata.ucar.edu/software/netcdf/
      https://www.unidata.ucar.edu/downloads/netcdf/index.jsp
      在這個專題中,預設使用的 NetCDF 為 4.6.3 版本,不過,基本上安裝的方式都差不多。比較需要注意的是, 從 4.0 之後,NetCDF 已經將 C 語言與 fortran 語言的 NetCDF 版本分開,因此,你得要先安裝 C 語言的 NetCDF 函式庫之後, 才能夠安裝好 fortran 版本的喔!
    6. 檔案資料的下載、解壓縮與查看編譯流程的程序:
      # cd /srv/cmaq/sources
      # wget https://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-c-4.6.3.tar.gz
      # cd ../build/
      # tar -zxvf ../sources/netcdf-c-4.6.3.tar.gz
      # cd netcdf-c-4.6.3/
      # vim INSTALL.md
      
      基本上,整體的流程跟之前的軟體不會有太大的差異,只是 make 時,好像不要使用多執行緒,使用單一執行緒比較不容易出錯!
    7. 偵測與編譯行為:
      # yum install libcurl-devel zlib-devel
      # vim install.sh
      #!/bin/bash
      H5DIR=/srv/cmaq/programs/hdf5
      export LD_LIBRARY_PATH="${H5DIR}/lib"
      CC=gcc
      export CPPFLAGS="-DNDEBUG -DgFortran -I${H5DIR}/include "
      export LDFLAGS="-L${H5DIR}/lib "
      CFLAGS="-O"
      FC="gfortran"
      FFLAGS="-O -w"
      CXX="g++"
      export H5DIR CC CPPFLAGS CFLAGS FC FFLAGS CXX LDFLAGS
      ./configure  --disable-dap --prefix=/srv/cmaq/programs/netcdf
      make
      make check
      make install
      
      # sh install.sh
      
      這樣就將 NetCDF 安裝到你的系統中了!目前安裝的地點在 /srv/cmaq/programs/netcdf/ 裡面。
    8. 開始設定好所需要的動態函式庫載入功能,以及指令下達的位置:
      # vim /srv/cmaq/bashrc
      ....
      # 3. netcdf
      PATH=${PATH}:/srv/cmaq/programs/netcdf/bin
      
      # source ~/.bashrc
      # ncdump -h
      ncdump [-c|-h] [-v ...] [[-b|-f] [c|f]] [-l len] [-n name] [-p n[,n]] [-k] [-x] [-s] [-t|-i] [-g ...] [-w] [-Ln] file
        [-c]             Coordinate variable data and header information
        [-h]             Header information only, no data
        [-v var1[,...]]  Data for variable(s) ,... only
        [-b [c|f]]       Brief annotations for C or Fortran indices in data
        [-f [c|f]]       Full annotations for C or Fortran indices in data
        [-l len]         Line length maximum in data section (default 80)
        [-n name]        Name for netCDF (default derived from file name)
        [-p n[,n]]       Display floating-point values with less precision
        [-k]             Output kind of netCDF file
        [-s]             Output special (virtual) attributes
        [-t]             Output time data as date-time strings
        [-i]             Output time data as date-time strings with ISO-8601 'T' separator
        [-g grp1[,...]]  Data and metadata for group(s) ,... only
        [-w]             With client-side caching of variables for DAP URLs
        [-x]             Output XML (NcML) instead of CDL
        [-Xp]            Unconditionally suppress output of the properties attribute
        [-Ln]            Set log level to n (>= 0); ignore if logging not enabled.
        file             Name of netCDF file (or URL if DAP access enabled)
      netcdf library version 4.6.3 of May  8 2019 22:11:57 $
      
      接下來處理動態函式庫:
      # vim /etc/ld.so.conf.d/models.conf
      /srv/cmaq/programs/mpich3/lib
      /srv/cmaq/programs/hdf5/lib
      /srv/cmaq/programs/netcdf/lib
      
      # ldconfig
      # ldconfig -p | grep netcdf
              libnetcdf.so.15 (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libnetcdf.so.15
              libnetcdf.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libnetcdf.so
              libmisc.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libmisc.so
              libbzip2.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libbzip2.so
      
      簡單快速的安裝好 NetCDF 這個玩意兒!
  6. NetCDF fortran 函式庫的安裝:
    1. 開始下載與解壓縮 netcdf 的 fortran 函式庫版本:
      # cd /srv/cmaq/sources
      # wget https://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-fortran-4.4.5.tar.gz
      # cd ../build
      # tar -zxvf ../sources/netcdf-fortran-4.4.5.tar.gz
      # cd netcdf-fortran-4.4.5
      # vim install.sh
      #!/bin/bash
      NCDIR=/srv/cmaq/programs/netcdf
      CC=gcc
      CXX="g++"
      FC=gfortran
      F77=gfortran
      LD_LIBRARY_PATH="${NCDIR}/lib"
      NFDIR=${NCDIR#}
      CPPFLAGS="-DNDEBUG -DgFortran -I${NCDIR}/include"
      CFLAGS="-O"
      FFLAGS="-O -w"
      LIBS="-lnetcdf "
      LDFLAGS="-L${NCDIR}/lib ${LIBS}"
      export NCDIR CC CXX FC F77 LD_LIBRARY_PATH NFDIR CPPFLAGS CFLAGS FFLAGS LIBS LDFLAGS
      ./configure --prefix=${NFDIR}
      make
      make check
      make install
      
      # sh install.sh
      
      因為預設的 NetCDF fortran 會與 netcdf c 安裝在一起,因此,你無須重新處理函式庫的位置與 PATH 的內容喔! 不過,為了避免問題,還是來查閱看看有沒有 libnetcdff.so 這個函式庫吧!
      # ll /srv/cmaq/programs/netcdf/lib/libnetcdff*
      -rw-r--r--. 1 root root 1969300  7月  9 16:21 /srv/cmaq/programs/netcdf/lib/libnetcdff.a
      -rwxr-xr-x. 1 root root    1173  7月  9 16:21 /srv/cmaq/programs/netcdf/lib/libnetcdff.la
      lrwxrwxrwx. 1 root root      19  7月  9 16:21 /srv/cmaq/programs/netcdf/lib/libnetcdff.so -> libnetcdff.so.6.2.1
      lrwxrwxrwx. 1 root root      19  7月  9 16:21 /srv/cmaq/programs/netcdf/lib/libnetcdff.so.6 -> libnetcdff.so.6.2.1
      -rwxr-xr-x. 1 root root 1413400  7月  9 16:21 /srv/cmaq/programs/netcdf/lib/libnetcdff.so.6.2.1
      
  7. I/O API 函式庫編譯:
    1. I/O API 的開發則是為了 CMAQ 以及空氣品質模式的高效能 I/O 界面所開發的,CMAQ 模式主要是透過 NetCDF 與 I/O API 兩者的協助, 進行資料的輸出/入,同時,I/O API 也提供了不少的工具,可以讓使用者很容易操作模式輸出的資料檔案。這個函式庫的安裝就稍微麻煩些, 因為我們主要是需要他的函式庫,而不是工具軟體。整體的安裝流程有點麻煩~要改的東西很多~得要慢慢看喔。至於 I/O API 的官網與說明文件如下:
    2. 開始來進行函式庫資料的下載、解壓縮與查閱編譯方式:
      # cd /srv/cmaq/sources/
      # wget https://www.cmascenter.org/ioapi/download/ioapi-3.2.tar.gz
      # cd ../build/
      # mkdir ioapi-3.2
      # cd ioapi-3.2/
      # tar -zxvf ../../sources/ioapi-3.2.tar.gz
      # vim README.txt
      # 這個檔案裡面會有一些基礎的流程說明喔!
      
    3. 編譯的過程稍微奇怪些,得要先去建立好後續需要安裝的目錄,然後再繼續編譯的行為。此外,由於 I/O API 當初開發的時候,預計就是給跑模式的系統用的,而早期跑模式的系統大多都是大型的 Unix 主機,例如 Sun 或 Cray 等等。 因此, I/O API 預設提供了很多不同的編譯參數給不同的系統使用喔!我們的系統是 Linux2 ,因此需要事先查詢有無相關的編譯引入檔才行。
      # 1. 預計安裝到 /srv/cmaq/programs/ioapi,所以事先建立好:
      # mkdir /srv/cmaq/programs/ioapi
      # mkdir /srv/cmaq/programs/ioapi/Linux2_x86_64gfort
      # cd /srv/cmaq/programs/ioapi/Linux2_x86_64gfort
      # ln -s ../../netcdf/lib/libnetcdf.a .
      # ln -s ../../netcdf/lib/libnetcdff.a .
      
      # 2. 回到原本的目錄,準備編譯:
      # cd /srv/cmaq/build/ioapi-3.2/ioapi/
      # ll Makeinclude.Linux2_x86_64g*
      -rw-r--r--. 1 500 500  695  2月  7  2018 Makeinclude.Linux2_x86_64g95
      -rw-r--r--. 1 500 500  713  4月  5  2018 Makeinclude.Linux2_x86_64g95dbg
      -rw-r--r--. 1 500 500 1271  2月  7  2018 Makeinclude.Linux2_x86_64gfort    <==這個比較符合我們的環境!
      -rw-r--r--. 1 500 500 1278  2月  7  2018 Makeinclude.Linux2_x86_64gfort_360
      -rw-r--r--. 1 500 500 1278  2月  7  2018 Makeinclude.Linux2_x86_64gfort_365
      -rw-r--r--. 1 500 500 1252  5月  1  2018 Makeinclude.Linux2_x86_64gfortdbg
      -rw-r--r--. 1 500 500 1629  2月  7  2018 Makeinclude.Linux2_x86_64gfort_medium
      -rw-r--r--. 1 500 500 1333  2月  7  2018 Makeinclude.Linux2_x86_64gfortmpi
      
      # vim Makeinclude.Linux2_x86_64gfort
      ...
      OMPFLAGS  = # -fopenmp  <==大約 27, 28 行左右,關閉平行函式的使用
      OMPLIBS   = # -fopenmp
      COPTFLAGS = -O3 ${MFLAGS}
      FOPTFLAGS = -O3 ${MFLAGS}
      ...
      
      # cp Makefile.cpl Makefile
      # vim Makefile
      # 1. 原本 81~88 的內容是
       81 BASEDIR = ${HOME}/ioapi-3.2
       82
       83 IODIR  = ${BASEDIR}/ioapi
       84
       85 # OBJDIR = ${IODIR}/../lib
       86 # OBJDIR = ${IODIR}/../${BIN}
       87 OBJDIR  = ${BASEDIR}/${BIN}
      # 將它改成這樣:
      BIN     = Linux2_x86_64gfort
      BASEDIR = /srv/cmaq/build/ioapi-3.2
      IODIR   = ${BASEDIR}/ioapi
      SRCDIR  = ${IODIR}
      INSTALL = /srv/cmaq/programs/ioapi
      NCDIR   = /srv/cmaq/programs/netcdf/lib
      LIBINST = ${INSTALL}/${BIN}
      BININST = ${INSTALL}/${BIN}
      OBJDIR  = ${INSTALL}/${BIN}
      
      # 2. 原本 90 行左右內容是這樣:
       98  DEFINEFLAGS = -DIOAPICPL=1 $(ARCHFLAGS) $(PARFLAGS)
       99 #DEFINEFLAGS  =                $(ARCHFLAGS) $(PARFLAGS)
      # 將它改成這個樣子:
      #DEFINEFLAGS = -DIOAPICPL=1 $(ARCHFLAGS) $(PARFLAGS)
       DEFINEFLAGS  =                $(ARCHFLAGS) $(PARFLAGS)
      
      # 3. 原本的內容大概是這樣:
      105  VFLAG  = -DVERSION='3.2-cpl'
      106 #VFLAG  = -DVERSION='3.2-cpl-mpi'
      107 #VFLAG  = -DVERSION='3.2-cpl-ncf4'
      108 #VFLAG  = -DVERSION='3.2-cpl-ncf4-mpi'
      109 #VFLAG  = -DVERSION='3.2-nocpl'
      110 #VFLAG  = -DVERSION='3.2-nocpl-mpi'
      111 #VFLAG  = -DVERSION='3.2-nocpl-ncf4'
      112 #VFLAG  = -DVERSION='3.2-nocpl-ncf4-mpi'
      # 將它改成這樣:
      #VFLAG  = -DVERSION='3.2-cpl'
      #VFLAG  = -DVERSION='3.2-cpl-mpi'
      #VFLAG  = -DVERSION='3.2-cpl-ncf4'
      #VFLAG  = -DVERSION='3.2-cpl-ncf4-mpi'
       VFLAG  = -DVERSION='3.2-nocpl'
      #VFLAG  = -DVERSION='3.2-nocpl-mpi'
      #VFLAG  = -DVERSION='3.2-nocpl-ncf4'
      #VFLAG  = -DVERSION='3.2-nocpl-ncf4-mpi'
      
      # 4. 原本的內容大致上是這樣
      264 nametest: ${LIB} ${OBJDIR}/libnetcdff.a
      265         ${SRCDIR}/nm_test.csh ${OBJDIR}/${LIB} ${OBJDIR}/libnetcdff.a nf_open
      # 將它改成這樣:
      nametest: ${LIB} ${OBJDIR}/libnetcdff.a
              ${SRCDIR}/nm_test.csh ${OBJDIR}/${LIB} ${OBJDIR}/libnetcdff.a nf_close
      
      # 3. 實際進行編譯
      # rm -f *.o *.mod
      # make
      # make nametest
      /srv/cmaq/build/ioapi-3.2/ioapi/nm_test.csh /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libioapi.a /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libnetcdff.a nf_close
      Name match OK
      Files /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libioapi.a and /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libnetcdff.a
      Symbol "nf_close_"
      
      # ll /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libioapi.a
      -rw-r--r--. 1 root root 12874178  7月 10 01:03 /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libioapi.a
      
      這樣就做完 I/O API 的編譯了!這很重要啊!因為後來的程式碼,都會用到這個函式庫!
  8. 編譯 CMAQ 主程式 v5.2.1 版本:
    1. CMAQ 主程式其實分為許多部份,包括處理氣象參數的 MCIP、處理初始條件的 ICON、處理邊界條件的 BCON、處理光解速率的 JPROC 等等。 我們這裡不是要大家全部的輸入資料都處理,只是提供大家一個測試的依據,因此,這邊就忽略其他的模組,完全僅使用 CMAQ 的運算模組, 亦即是 CCMT 這個模組的編譯運作而已。至於 CMAQ 的 github 主程式放置位置在底下:
    2. 我們預計放置的目錄預設在 /srv/cmaq/ 底下,因此,開始來下載與編譯吧!
      # cd /srv/cmaq/
      # git clone -b 5.2.1 https://github.com/USEPA/CMAQ.git CMAQ_REPO
      Cloning into 'CMAQ_REPO'...
      remote: Enumerating objects: 42043, done.
      remote: Total 42043 (delta 0), reused 0 (delta 0), pack-reused 42043
      Receiving objects: 100% (42043/42043), 54.95 MiB | 4.05 MiB/s, done.
      Resolving deltas: 100% (28584/28584), done.
      
      # ll -a
      -rw-r--r--. 1 root root 240  7月  9 16:17 bashrc
      drwxr-xr-x. 7 root root 109  7月 10 00:22 build
      drwxr-xr-x. 8 root root 161  7月 10 10:47 CMAQ_REPO  <==剛剛 git 下載的目錄
      drwxr-xr-x. 6 root root  59  7月 10 00:27 programs
      drwxr-xr-x. 2 root root 145  7月 10 00:18 sources
      
      # cd CMAQ_REPO
      # ll
      -rwxr-xr-x.  1 root root 10684  7月 10 10:47 bldit_project.csh  <==整體編譯的 C shell 腳本
      drwxr-xr-x.  5 root root    61  7月 10 10:47 CCTM               <== CMAQ 的 CCTM 運作主程式
      -rwxr-xr-x.  1 root root  9722  7月 10 10:47 config_cmaq.csh    <== CMAQ 的整體環境設定
      drwxr-xr-x.  6 root root   103  7月 10 10:47 DOCS
      drwxr-xr-x. 10 root root   163  7月 10 10:47 POST
      drwxr-xr-x.  7 root root    87  7月 10 10:47 PREP
      -rw-r--r--.  1 root root  3409  7月 10 10:47 README.md
      drwxr-xr-x.  8 root root   123  7月 10 10:47 UTIL
      
      接下來,先來設定好編譯過程中,我們所需要進行的各項環境設定值!包括 (1)主設定檔、 (2)各函式庫放置的位置連結等資料喔!
      # 1. 先處理主設定檔:
      # vim config_cmaq.csh
       22  setenv CMAQ_HOME /srv/cmaq/CMAQ_REPO
      
       37  setenv compiler gcc
      
      159         setenv mpi_lib "-lmpich" 
      
      198  setenv MPI_LIB_DIR     /srv/cmaq/programs/mpich3/
      199  setenv NETCDF_LIB_DIR  /srv/cmaq/programs/netcdf/lib/
      200  setenv NETCDF_INCL_DIR /srv/cmaq/programs/netcdf/include/
      201  setenv IOAPI_MOD_DIR   /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/
      202  setenv IOAPI_INCL_DIR  /srv/cmaq/build/ioapi-3.2/ioapi/fixed_src
      203  setenv IOAPI_LIB_DIR   /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/
      
      # 2. 測試主設定檔是正確的!
      # ./config_cmaq.csh
      Compiler is set to gcc
      # 沒有出現其他錯誤訊息,就是 OK 的!
      
      # 3. 開始準備整理 CCTM 了!
      # cd CCTM/
      # ll
      drwxr-xr-x.  3 root root   44  7月 10 10:47 docs      <==說明文件
      -rw-r--r--.  1 root root 2584  7月 10 10:47 README.md
      drwxr-xr-x.  2 root root   48  7月 10 10:53 scripts   <==編譯的腳本
      drwxr-xr-x. 28 root root 4096  7月 10 10:47 src       <==CCTM的原始碼
      
      # cd scripts
      # ll
      -rwxr-xr-x. 1 root root 27067  7月 10 10:47 bldit_cctm.csh  <==編譯程序檔
      -rwxr-xr-x. 1 root root 24700  7月 10 10:47 run_cctm.csh    <==執行 CCTM 腳本
      
      # vim bldit_cctm.csh
      117  set LIOAPI   = "${IOAPI_DIR}/lib ${ioapi_lib}" 
      118  set IOAPIMOD = "${IOAPI_DIR}/include"  
      
      # 先將剛剛編譯 I/O API 所複製的 netcdf 函式庫連結檔刪除,不刪除無法編譯成功...
      # rm /srv/cmaq/programs/ioapi/libnetcdf* /srv/cmaq/programs/ioapi/Linux2_x86_64gfort/libnetcdf*
      
      # ./bldit_cctm.csh gcc
      # 這會跑一陣子喔!因為模組很多,需要一個一個處理才行!過程中一些警告可以暫時忽略!
      
      # ll BLD_CCTM_v521_gcc/CCTM_v521.*
      -rw-r--r--. 1 root root     3265  7月 10 11:38 BLD_CCTM_v521_gcc/CCTM_v521.cfg
      -rw-r--r--. 1 root root     3265  7月 10 11:35 BLD_CCTM_v521_gcc/CCTM_v521.cfg.old
      -rwxr-xr-x. 1 root root 10743920  7月 10 11:38 BLD_CCTM_v521_gcc/CCTM_v521.exe     <==這就是編譯成功之後的程式碼囉!
      
    3. 開始來測試一下這個模式是否能執行?如果你登出之後再登入,然後執行一下這隻程式,可能會出現如下的錯誤:
      # ./BLD_CCTM_v521_gcc/CCTM_v521.exe --help
      ./BLD_CCTM_v521_gcc/CCTM_v521.exe: error while loading shared libraries: libnetcdff.so.6: cannot open shared object file: No such file or directory
      
      這是因為動態函式庫放在非正規目錄底下,因此無法被找到來執行的意思~你可以使用 ldconfig -p 來載入:
      # ldconfig
      # ldconfig -p | grep netcdf
              libnetcdff.so.6 (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libnetcdff.so.6 <==找到了!
              libnetcdff.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libnetcdff.so
              libnetcdf.so.15 (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libnetcdf.so.15
              libnetcdf.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libnetcdf.so
              libmisc.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libmisc.so
              libbzip2.so (libc6,x86-64) => /srv/cmaq/programs/netcdf/lib/libbzip2.so
      
      這樣很快就可以執行了!不過,如果未來每次登入都要執行 ldconfig,或許你會覺得很蠢~那怎辦?沒關係, 我們可以指定動態函式庫放置的位置,讓模式自己去找!這就得要動到 bashrc 的設定了:
      # vim /srv/cmaq/bashrc
      MPI_HOME=/srv/cmaq/programs/mpich3/
      NETCDF=/srv/cmaq/programs/netcdf/
      H5DIR=/srv/cmaq/programs/hdf5/
      export LD_LIBRARY_PATH="${MPI_HOME}/lib:${NETCDF}/lib;${H5DIR}/lib"
      
      # source ~/.bashrc
      
      # ./BLD_CCTM_v521_gcc/CCTM_v521.exe
      
           This program uses the EPA-AREAL/MCNC-EnvPgms/BAMS Models-3
           I/O Applications Programming Interface, [I/O API] which is
           built on top of the netCDF I/O library (Copyright 1993, 1996
           University Corporation for Atmospheric Research/Unidata
           Program) and the PVM parallel-programming library (from
           Oak Ridge National Laboratory).
           Copyright (C) 1992-2002 MCNC,
           (C) 1992-2013 Carlie J. Coats, Jr.,
           (C) 2003-2012 Baron Advanced Meteorological Systems, LLC, and
           (C) 2014-2019 UNC Institute for the Environment.
           Released under the GNU LGPL  License, version 2.1.  See URL
      
               https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
      
           for conditions of use.
      
           ioapi-3.2: $Id: init3.F90 120 2019-06-21 14:18:20Z coats $
           Version with PARMS3.EXT/PARAMETER::MXVARS3= 2048
           netCDF version 4.6.3 of Jul  9 2019 16:16:38 $
      
      
           Missing environment variable EXECUTION_ID
           Value for GRID_NAME not defined; returning defaultval ':  'GRID_NAME'
           Value for GRID_NAME not defined; returning defaultval ':  'GRID_NAME'
           Horizontal Domain Definition
           Environment variable not set ... Using default
      ....
      
      最後會出現錯誤~因為找不到模式需要的 INPUT data!不過,這也表示 CCTM 可以運作了!恭喜恭喜!完成一個大模式的編譯囉!
  9. 總結:
    1. 事實上,要安裝一個大型數值模式,我們需要的前驅軟體多的跟什麼一樣!而且這些前驅軟體的功能還是可調整的! 因此,在編譯上面,要非常非常的注意!不要搞錯了!許多的旗標設定 (FFLAGS, CFLAGS) 或者是連結時需要填寫的函式庫與參數等, 都很有點麻煩~因此,在使用上面,我們得要特別注意才可以!

    2. 因為需要編譯,因此,某些特別的官方提供的軟體,可能就得要安裝 *-devel 之類的軟體才行!包括上面我們玩到的 zlib-devel 或 curl-devel 等軟體! 這些都可以在 ./configure 的過程中,根據錯誤的訊息來取得可能的軟體相依的資訊。
    3. 編譯的最後一個 link 階段,可能需要使用到額外的動態函式庫支援,那就是 -lnetcdf 之類的項目,該項目的意思是: 我要使用 libnetcdf.so 或 libnetcdf.a 來進行連結編譯!其中 .so 為動態函式庫,而 .a 則為靜態函式庫!
    4. 承上,如果使用的函式庫在非正規的目錄中,可能得要使用 -L/path/to/libraries 的模樣來告知 ./configure 才行喔!

參考資料: