WRF编译和安装

操作步骤

  1. 执行以下命令进入目录解压安装包。

    cd /path/to/hwrf/wrfrun/sorc/
    tar -xvf ../../HWRF_v4.0a_WRF.tar.gz

  2. 执行以下命令设置编译变量。

    export WRF_NMM_CORE=1
    export WRF_NMM_NEST=1
    export PNETCDF_QUILT=1
    export IBM_REDUCE_BUG_WORKAROUND=1

  3. 执行以下命令新建补丁patch-WRF。

    vim patch-WRF

    输入以下内容并保存。

    diff -Nru WRF/arch/configure.defaults WRF_ok/arch/configure.defaults
    --- WRF/arch/configure.defaults	2018-10-29 23:26:06.000000000 +0800
    +++ WRF_ok/arch/configure.defaults	2023-07-21 09:33:39.503770420 +0800
    @@ -1,3 +1,41 @@
    +############################################################
    +#ARCH    Linux aarch64, LLVM compiler OpenMPI # serial smpar dmpar dm+sm
    +#
    +DESCRIPTION     =      LLVM ($SFC/$SCC): AArch64
    +DMPARALLEL      =      1
    +OMPCPP          =      -D_OPENMP
    +OMP             =      -fopenmp
    +OMPCC           =      -fopenmp
    +SFC             =      flang
    +SCC             =      clang
    +CCOMP           =      clang
    +DM_FC           =      mpif90 -mllvm -prefetch-loop-depth=3 -mllvm -min-prefetch-stride=9 -mllvm -prefetch-distance=940 -mllvm -unroll-runtime=1 -mllvm -unroll-indirect-loads=true -mllvm -disable-loop-idiom-all
    +DM_CC           =      mpicc -DMPI2_SUPPORT -DMPI2_SUPPORT -DMPI2_THREAD_SUPPORT
    +FC              =      time $(DM_FC)
    +CC              =      $(DM_CC) -DFSEEKO64_OK
    +LD              =      $(FC)
    +RWORDSIZE       =      $(NATIVE_RWORDSIZE)
    +PROMOTION       =
    +ARCH_LOCAL      =
    +CFLAGS_LOCAL    =      -w -O3 -c -ffp-model=precise -Wno-return-type -I/usr/include/tirpc/
    +LDFLAGS_LOCAL   =      -fopenmp -Wl,--build-id -ltirpc
    +FCOPTIM         =      -O1 -ffast-math -fopenmp -Wno-return-type -fvectorize -funroll-loops -mcpu=tsv110 -lmathlib -fopenmp -ljemalloc -fstack-arrays -lstringlib -L$(KML_LIB) -lkm -lkm_l9 -lm -ffp-model=precise
    +FCREDUCEDOPT    =      $(FCOPTIM)
    +FCNOOPT         =      -O1 -fopenmp -frecursive -Wno-return-type
    +FCDEBUG         =      $(FCNOOPT)
    +FORMAT_FIXED    =      -ffixed-form
    +FORMAT_FREE     =      -ffree-form
    +FCSUFFIX        =
    +BYTESWAPIO      =      -fconvert=big-endian
    +FCBASEOPTS      =      -w $(FORMAT_FREE) $(BYTESWAPIO)
    +MODULE_SRCH_FLAG =     -module $(WRF_SRC_ROOT_DIR)/main
    +TRADFLAG        =      -traditional-cpp
    +CPP             =      /lib/cpp -p $(TRADFLAG)
    +AR              =      ar
    +ARFLAGS         =      ru
    +M4              =      m4 -B 14000
    +RANLIB          =      ranlib
    +CC_TOOLS        =      $(SCC)
     ###########################################################
     #ARCH    Linux i486 i586 i686,  NEC SX sxf90 sxcc #serial smpar dmpar dm+sm
     #
    diff -Nru WRF/dyn_nmm/module_ADVECTION.F WRF_ok/dyn_nmm/module_ADVECTION.F
    --- WRF/dyn_nmm/module_ADVECTION.F	2018-10-29 23:26:06.000000000 +0800
    +++ WRF_ok/dyn_nmm/module_ADVECTION.F	2023-07-21 09:33:39.503770420 +0800
    @@ -1043,6 +1043,9 @@
     !
           REAL,DIMENSION(KTS:KTE) :: AFR,DEL,DQL,DWL,E3,E4,PETDTK           &
          &                          ,RFACE,RFACQ,RFACW,Q3,Q4,W3,W4
    +      LOGICAL :: BOT,TOP
    +      !REAL*8 :: DPDN,DPUP,RFACEK,RFACQK,RFACWK
    +
     !
     !-----------------------------------------------------------------------
     !***********************************************************************
    @@ -1052,10 +1055,10 @@
     !
     !-----------------------------------------------------------------------
     !$omp parallel do                                                       &
    -!$omp& private(afr,afrp,bot,d2pqe,d2pqq,d2pqw,del,dep,detap,dpdn,dpup   &
    +!$omp& private(afr,afrp,bot,d2pqe,d2pqq,d2pqw,del,dep,detap,rdpdn,rdpup   &
     !$omp&        ,dql,dqp,dwl,dwp,e00,e3,e4,e4p,ep,ep0,haddt,i,j,k         &
    -!$omp&        ,la,lap,llap,petdtk,q00,q3,q4,q4p,qp,qp0,rfacek,rfacqk    &
    -!$omp&        ,rfacwk,rfc,rr,sumne,sumnq,sumnw,sumpe,sumpq,sumpw,top    &
    +!$omp&        ,la,lap,llap,petdtk,q00,q3,q4,q4p,qp,qp0,rface,rfacq    &
    +!$omp&        ,rfacw,rfc,rr,sumne,sumnq,sumnw,sumpe,sumpq,sumpw,top    &
     !$omp&        ,w00,w3,w4,w4p,wp,wp0)
     !-----------------------------------------------------------------------
     !
    @@ -1538,9 +1541,9 @@
             DARE(I,J)=HBM3(I,J)*DX(I,J)*DY
           ENDDO
           ENDDO
    +      if(advect_Q2) then
     !$omp parallel do                                                       &
     !$omp& private(i,j)
    -      if(advect_Q2) then
             DO J=MYJS_P3,MYJE_P3
             DO I=MYIS_P2,MYIE_P2
               E1(I,J,KTE)=MAX(Q2(I,J,KTE)*0.5,EPSQ2)
    diff -Nru WRF/dyn_nmm/module_IGWAVE_ADJUST.F WRF_ok/dyn_nmm/module_IGWAVE_ADJUST.F
    --- WRF/dyn_nmm/module_IGWAVE_ADJUST.F	2018-10-29 23:26:06.000000000 +0800
    +++ WRF_ok/dyn_nmm/module_IGWAVE_ADJUST.F	2023-07-21 09:34:47.863770420 +0800
    @@ -747,11 +747,10 @@
           ENDDO
           ENDDO
     !
    -!$omp parallel do                                                       &
    -!$omp& private(i,j)
    
           TASK_CHANGE=0.
    -
    +!$omp parallel do                                                       &
    +!$omp& private(i,j)
           DO J=MYJS_P2,MYJE_P2
           DO I=MYIS_P2,MYIE_P2
             PD(I,J)=PSDT(I,J)*DT+PD(I,J)
    @@ -1146,7 +1145,7 @@
     !
           FCXM=1.
     !
    -!$omp parallel do
    +!$omp parallel do                                                       &
     !$omp& private(i,j)
           DO J=MYJS_P2,MYJE_P2
           DO I=MYIS_P2,MYIE_P2

  4. 执行以下命令打入补丁patch-WRF。

    patch -p0 < ./patch-WRF

  5. 执行以下命令进入目录配置生成编译文件。

    cd WRF
    echo 3 | ./configure

  6. 执行以下命令进行编译。

    ./compile nmm_real 2>&1 | tee -a build.log

  7. 执行以下命令查看二进制文件。

    ls -l main/*.exe

    成功编译后将在目录main中生成两个可执行文件“real_nmm.exe”、“wrf.exe”。