diff --git a/reg_tests/global_cycle/C192.lndincsoilnoahmp.sh b/reg_tests/global_cycle/C192.lndincsoilnoahmp.sh index aa09eef10..b5780eb64 100755 --- a/reg_tests/global_cycle/C192.lndincsoilnoahmp.sh +++ b/reg_tests/global_cycle/C192.lndincsoilnoahmp.sh @@ -24,6 +24,7 @@ export FHOUR=00 export DELTSFC=6 export CASE=C192 +export OCNRES=99999 export COMIN=$HOMEreg/input_data_noahmp @@ -33,10 +34,9 @@ export JCAP=1534 export LONB=3072 export LATB=1536 +export OROFIX=$HOMEreg/fix/$CASE export FIXgsm=$BASE_GSM/fix/am -export FIXfv3=$HOMEreg/fix - export DONST="NO" export use_ufo=.true. @@ -73,9 +73,9 @@ done set +x if [ $test_failed -ne 0 ]; then echo - echo "*****************************************" - echo "<<< C192 LANDINC SOIL-NOAHP CYCLE TEST FAILED. >>>" - echo "*****************************************" + echo "**********************************************" + echo "<<< C192 LANDINC SOIL-NOAHMP CYCLE TEST FAILED. >>>" + echo "**********************************************" if [ "$UPDATE_BASELINE" = "TRUE" ]; then $BASE_GSM/reg_tests/update_baseline.sh $HOMEreg "c192.lndincsoilnoahmp" $commit_num fi diff --git a/reg_tests/global_cycle/C48.noahmp.fracgrid.sh b/reg_tests/global_cycle/C48.noahmp.fracgrid.sh new file mode 100755 index 000000000..ec6d03d37 --- /dev/null +++ b/reg_tests/global_cycle/C48.noahmp.fracgrid.sh @@ -0,0 +1,92 @@ +#!/bin/bash + +#------------------------------------------------------------------ +# Run global_cycle for a C48 case that tests the NOAHMP and +# fractional grid options. +# +# Compare output to a baseline set of files using the 'nccmp' +# utility. +#------------------------------------------------------------------ + +set -x + +NCCMP=${NCCMP:-$(which nccmp)} + +export MAX_TASKS_CY=6 + +export HOMEgfs=$NWPROD +export BASE_GSM=$NWPROD + +export CYCLEXEC=$BASE_GSM/exec/global_cycle + +export CDATE=2021032406 +export FHOUR=00 +export DELTSFC=6 + +export CASE=C48 +export OCNRES=500 + +export COMIN=$HOMEreg/input_data_c48.noahmp.frac.grid +export FNACNA=$COMIN/gdas.t06z.seaice.5min.blend.grb +export FNTSFA=" " +export FNSNOA=" " +export NST_FILE=$COMIN/gdas.t06z.dtfanl.nc + +export JCAP=1534 +export LONB=3072 +export LATB=1536 + +export OROFIX=$HOMEreg/fix/$CASE + +export FIXgsm=$BASE_GSM/fix/am + +export FNAISC=$FIXgsm/IMS-NIC.blended.ice.monthly.clim.grb + +export DONST="YES" +export use_ufo=.true. +export FRAC_GRID=.true. + +export VERBOSE=YES +export CYCLVARS=FSNOL=99999.,FSNOS=99999., + +$BASE_GSM/ush/global_cycle_driver.sh + +iret=$? +if [ $iret -ne 0 ]; then + set +x + echo "<<< C48 NOAHMP FRAC GRID TEST FAILED. >>>" + exit $iret +fi + +test_failed=0 + +cd $DATA +for files in *tile*.nc +do + if [ -f $files ]; then + echo CHECK $files + $NCCMP -dmfqS $files $HOMEreg/baseline_data/c48.noahmp.fracgrid/$files + iret=$? + if [ $iret -ne 0 ]; then + test_failed=1 + fi + fi +done + +set +x +if [ $test_failed -ne 0 ]; then + echo + echo "******************************************" + echo "<<< C48 NOAHMP FRAC GRID TEST FAILED. >>>" + echo "******************************************" + if [ "$UPDATE_BASELINE" = "TRUE" ]; then + $BASE_GSM/reg_tests/update_baseline.sh $HOMEreg "c48.noahmp.fracgrid" $commit_num + fi +else + echo + echo "*****************************************" + echo "<<< C48 NOAHMP FRAC GRID TEST PASSED. >>>" + echo "*****************************************" +fi + +exit diff --git a/reg_tests/global_cycle/C768.fv3gfs.sh b/reg_tests/global_cycle/C768.fv3gfs.sh index c1c50d242..8dd6d303c 100755 --- a/reg_tests/global_cycle/C768.fv3gfs.sh +++ b/reg_tests/global_cycle/C768.fv3gfs.sh @@ -21,6 +21,7 @@ export FHOUR=00 export DELTSFC=6 export CASE=C768 +export OCNRES=99999 export COMIN=$HOMEreg/input_data export FNTSFA=$COMIN/gdas.t00z.rtgssthr.grb @@ -32,10 +33,22 @@ export JCAP=1534 export LONB=3072 export LATB=1536 +export OROFIX=$HOMEreg/fix/$CASE + export FIXgsm=$BASE_GSM/fix/am -export FNAISC=$FIXgsm/CFSR.SEAICE.1982.2012.monthly.clim.grb -export FIXfv3=$HOMEreg/fix +export FNALBC2=$FIXgsm/global_albedo4.1x1.grb +export FNALBC=$FIXgsm/global_snowfree_albedo.bosu.t1534.3072.1536.rg.grb +export FNALBC=$FIXgsm/global_snowfree_albedo.bosu.t1534.3072.1536.rg.grb +export FNTG3C=$FIXgsm/global_tg3clim.2.6x1.5.grb +export FNVETC=$FIXgsm/global_vegtype.igbp.t1534.3072.1536.rg.grb +export FNSOTC=$FIXgsm/global_soiltype.statsgo.t1534.3072.1536.rg.grb +export FNVEGC=$FIXgsm/global_vegfrac.0.144.decpercent.grb +export FNVMNC=$FIXgsm/global_shdmin.0.144x0.144.grb +export FNVMXC=$FIXgsm/global_shdmax.0.144x0.144.grb +export FNSLPC=$FIXgsm/global_slope.1x1.grb +export FNABSC=$FIXgsm/global_mxsnoalb.uariz.t1534.3072.1536.rg.grb +export FNAISC=$FIXgsm/CFSR.SEAICE.1982.2012.monthly.clim.grb export DONST="YES" export use_ufo=.true. diff --git a/reg_tests/global_cycle/C768.lndincsnow.sh b/reg_tests/global_cycle/C768.lndincsnow.sh index 5bd21045b..86a2a7815 100755 --- a/reg_tests/global_cycle/C768.lndincsnow.sh +++ b/reg_tests/global_cycle/C768.lndincsnow.sh @@ -22,6 +22,7 @@ export FHOUR=00 export DELTSFC=6 export CASE=C768 +export OCNRES=99999 export COMIN=$HOMEreg/input_data export FNTSFA=$COMIN/gdas.t00z.rtgssthr.grb @@ -34,10 +35,9 @@ export JCAP=1534 export LONB=3072 export LATB=1536 +export OROFIX=$HOMEreg/fix/$CASE export FIXgsm=$BASE_GSM/fix/am -export FIXfv3=$HOMEreg/fix - export DONST="NO" export use_ufo=.true. diff --git a/reg_tests/global_cycle/driver.hera.sh b/reg_tests/global_cycle/driver.hera.sh index 9ea901726..db23cc6f1 100755 --- a/reg_tests/global_cycle/driver.hera.sh +++ b/reg_tests/global_cycle/driver.hera.sh @@ -73,10 +73,16 @@ export COMOUT=$DATA TEST3=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c768.lndincsnow \ -o $LOG_FILE -e $LOG_FILE ./C768.lndincsnow.sh) +LOG_FILE=consistency.log04 +export DATA="${DATA_DIR}/test4" +export COMOUT=$DATA +TEST4=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c48.noahmp.frac \ + -o $LOG_FILE -e $LOG_FILE ./C48.noahmp.fracgrid.sh) + LOG_FILE=consistency.log sbatch --nodes=1 -t 0:01:00 -A $PROJECT_CODE -J chgres_summary -o $LOG_FILE -e $LOG_FILE \ --open-mode=append -q $QUEUE -d\ - afterok:$TEST1:$TEST2:$TEST3 << EOF + afterok:$TEST1:$TEST2:$TEST3:$TEST4 << EOF #!/bin/bash grep -a '<<<' ${LOG_FILE}* > summary.log EOF diff --git a/reg_tests/global_cycle/driver.hercules.sh b/reg_tests/global_cycle/driver.hercules.sh index d8cb1048d..b522ad1bc 100755 --- a/reg_tests/global_cycle/driver.hercules.sh +++ b/reg_tests/global_cycle/driver.hercules.sh @@ -27,7 +27,7 @@ module list ulimit -s unlimited -export WORK_DIR="${WORK_DIR:-/work/noaa/stmp/$LOGNAME}" +export WORK_DIR="${WORK_DIR:-/work2/noaa/stmp/$LOGNAME}" PROJECT_CODE="${PROJECT_CODE:-fv3-cpu}" QUEUE="${QUEUE:-batch}" @@ -73,10 +73,16 @@ export COMOUT=$DATA TEST3=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c768.lndincsnow \ -o $LOG_FILE -e $LOG_FILE ./C768.lndincsnow.sh) +LOG_FILE=consistency.log04 +export DATA="${DATA_DIR}/test4" +export COMOUT=$DATA +TEST4=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c48.noahmp.frac \ + -o $LOG_FILE -e $LOG_FILE ./C48.noahmp.fracgrid.sh) + LOG_FILE=consistency.log sbatch --nodes=1 -t 0:01:00 -A $PROJECT_CODE -J chgres_summary -o $LOG_FILE -e $LOG_FILE \ --open-mode=append -q $QUEUE -d\ - afterok:$TEST1:$TEST2:$TEST3 << EOF + afterok:$TEST1:$TEST2:$TEST3:$TEST4 << EOF #!/bin/bash grep -a '<<<' ${LOG_FILE}* > summary.log EOF diff --git a/reg_tests/global_cycle/driver.jet.sh b/reg_tests/global_cycle/driver.jet.sh index 75fc6b343..d680dc023 100755 --- a/reg_tests/global_cycle/driver.jet.sh +++ b/reg_tests/global_cycle/driver.jet.sh @@ -71,10 +71,16 @@ export COMOUT=$DATA TEST3=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c768.lndincsnow \ --partition=xjet -o $LOG_FILE -e $LOG_FILE ./C768.lndincsnow.sh) +LOG_FILE=consistency.log04 +export DATA="${DATA_DIR}/test4" +export COMOUT=$DATA +TEST4=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c48.noahmp.frac \ + --partition=xjet -o $LOG_FILE -e $LOG_FILE ./C48.noahmp.fracgrid.sh) + LOG_FILE=consistency.log sbatch --partition=xjet --nodes=1 -t 0:01:00 -A $PROJECT_CODE -J summary -o $LOG_FILE -e $LOG_FILE \ --open-mode=append -q $QUEUE -d\ - afterok:$TEST1:$TEST2:$TEST3 << EOF + afterok:$TEST1:$TEST2:$TEST3:$TEST4 << EOF #!/bin/bash grep -a '<<<' ${LOG_FILE}* > ./summary.log EOF diff --git a/reg_tests/global_cycle/driver.orion.sh b/reg_tests/global_cycle/driver.orion.sh index 6fbd15fd2..d3f4f6415 100755 --- a/reg_tests/global_cycle/driver.orion.sh +++ b/reg_tests/global_cycle/driver.orion.sh @@ -71,10 +71,16 @@ export COMOUT=$DATA TEST3=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c768.lndincsnow \ -o $LOG_FILE -e $LOG_FILE ./C768.lndincsnow.sh) +LOG_FILE=consistency.log04 +export DATA="${DATA_DIR}/test4" +export COMOUT=$DATA +TEST4=$(sbatch --parsable --ntasks-per-node=6 --nodes=1 -t 0:05:00 -A $PROJECT_CODE -q $QUEUE -J c48.noahmp.frac \ + -o $LOG_FILE -e $LOG_FILE ./C48.noahmp.fracgrid.sh) + LOG_FILE=consistency.log sbatch --nodes=1 -t 0:01:00 -A $PROJECT_CODE -J chgres_summary -o $LOG_FILE -e $LOG_FILE \ --open-mode=append -q $QUEUE -d\ - afterok:$TEST1:$TEST2:$TEST3 << EOF + afterok:$TEST1:$TEST2:$TEST3:$TEST4 << EOF #!/bin/bash grep -a '<<<' ${LOG_FILE}* > summary.log EOF diff --git a/reg_tests/global_cycle/driver.wcoss2.sh b/reg_tests/global_cycle/driver.wcoss2.sh index 1facda522..077896cd3 100755 --- a/reg_tests/global_cycle/driver.wcoss2.sh +++ b/reg_tests/global_cycle/driver.wcoss2.sh @@ -76,8 +76,13 @@ export COMOUT=$DATA TEST3=$(qsub -V -o ${LOG_FILE}03 -e ${LOG_FILE}03 -q $QUEUE -A $PROJECT_CODE -l walltime=00:05:00 \ -N c768.lndincsnow -l select=1:ncpus=12:mem=8GB $PWD/C768.lndincsnow.sh) +export DATA="${DATA_DIR}/test4" +export COMOUT=$DATA +TEST4=$(qsub -V -o ${LOG_FILE}04 -e ${LOG_FILE}04 -q $QUEUE -A $PROJECT_CODE -l walltime=00:05:00 \ + -N c48.noahmp.frac -l select=1:ncpus=12:mem=8GB $PWD/C48.noahmp.fracgrid.sh) + qsub -V -o ${LOG_FILE} -e ${LOG_FILE} -q $QUEUE -A $PROJECT_CODE -l walltime=00:01:00 \ - -N cycle_summary -l select=1:ncpus=1:mem=100MB -W depend=afterok:$TEST1:$TEST2:$TEST3 << EOF + -N cycle_summary -l select=1:ncpus=1:mem=100MB -W depend=afterok:$TEST1:$TEST2:$TEST3:$TEST4 << EOF #!/bin/bash cd $reg_dir grep -a '<<<' ${LOG_FILE}?? | grep -v echo > summary.log diff --git a/sorc/global_cycle.fd/cycle.f90 b/sorc/global_cycle.fd/cycle.f90 index 4511416c9..ab983bc04 100644 --- a/sorc/global_cycle.fd/cycle.f90 +++ b/sorc/global_cycle.fd/cycle.f90 @@ -42,7 +42,7 @@ !! file. !! - $NST_FILE Gaussian GSI file which contains NSST !! TREF increments -!! - $LND_SOI_FILE Gaussian GSI file which contains soil state +!! - $LND_SOI_FILE.$NNN Gaussian GSI file which contains soil state !! increments !! - xainc.$NNN The cubed-sphere increment file (contains !! increments calculated by JEDI on the native @@ -109,12 +109,12 @@ PROGRAM SFC_DRV INTEGER :: ISOT, IVEGSRC, LENSFC, ZSEA1_MM, ZSEA2_MM, IERR INTEGER :: NPROCS, MYRANK, NUM_THREADS, NUM_PARTHDS, MAX_TASKS REAL :: FH, DELTSFC, ZSEA1, ZSEA2 - LOGICAL :: USE_UFO, DO_NSST, DO_LNDINC, DO_SFCCYCLE + LOGICAL :: USE_UFO, DO_NSST, DO_LNDINC, DO_SFCCYCLE, FRAC_GRID ! NAMELIST/NAMCYC/ IDIM,JDIM,LSOIL,LUGB,IY,IM,ID,IH,FH,& DELTSFC,IALB,USE_UFO,DONST, & DO_SFCCYCLE,ISOT,IVEGSRC,ZSEA1_MM, & - ZSEA2_MM, MAX_TASKS, DO_LNDINC + ZSEA2_MM, MAX_TASKS, DO_LNDINC, FRAC_GRID ! DATA IDIM,JDIM,LSOIL/96,96,4/ DATA IY,IM,ID,IH,FH/1997,8,2,0,0./ @@ -138,13 +138,14 @@ PROGRAM SFC_DRV DONST = "NO" DO_LNDINC = .FALSE. DO_SFCCYCLE = .TRUE. + FRAC_GRID = .FALSE. PRINT* PRINT*,"READ NAMCYC NAMELIST." CALL BAOPENR(36, "fort.36", IERR) READ(36, NML=NAMCYC) - !IF (MYRANK==0) WRITE(6,NAMCYC) +!IF (MYRANK==0) WRITE(6,NAMCYC) IF (MAX_TASKS < 99999 .AND. MYRANK > (MAX_TASKS - 1)) THEN PRINT*,"USER SPECIFIED MAX NUMBER OF TASKS: ", MAX_TASKS @@ -170,7 +171,7 @@ PROGRAM SFC_DRV CALL SFCDRV(LUGB,IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & IY,IM,ID,IH,FH,IALB, & USE_UFO,DO_NSST,DO_SFCCYCLE,DO_LNDINC, & - ZSEA1,ZSEA2,ISOT,IVEGSRC,MYRANK) + FRAC_GRID,ZSEA1,ZSEA2,ISOT,IVEGSRC,MYRANK) PRINT* PRINT*,'CYCLE PROGRAM COMPLETED NORMALLY ON RANK: ', MYRANK @@ -286,6 +287,7 @@ END PROGRAM SFC_DRV !! @param[in] DO_SFCCYCLE Call sfccycle routine to update surface fields !! @param[in] DO_LNDINC Read in land increment files, and add increments to !! requested states. + !! @param[in] FRAC_GRID When true, run with fractional grid. !! @param[in] ZSEA1 When running NSST model, this is the lower bound !! of depth of sea temperature. In whole mm. !! @param[in] ZSEA2 When running NSST model, this is the upper bound @@ -297,7 +299,7 @@ END PROGRAM SFC_DRV SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & IY,IM,ID,IH,FH,IALB, & USE_UFO,DO_NSST,DO_SFCCYCLE,DO_LNDINC,& - ZSEA1,ZSEA2,ISOT,IVEGSRC,MYRANK) + FRAC_GRID,ZSEA1,ZSEA2,ISOT,IVEGSRC,MYRANK) ! USE READ_WRITE_DATA use machine @@ -316,7 +318,7 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & INTEGER, INTENT(IN) :: ISOT, IVEGSRC, MYRANK LOGICAL, INTENT(IN) :: USE_UFO, DO_NSST,DO_SFCCYCLE - LOGICAL, INTENT(IN) :: DO_LNDINC + LOGICAL, INTENT(IN) :: DO_LNDINC, FRAC_GRID REAL, INTENT(IN) :: FH, DELTSFC, ZSEA1, ZSEA2 @@ -363,10 +365,10 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & !! dead start. Set to zero for non-dead !! start. REAL, ALLOCATABLE :: STC_BCK(:,:), SMC_BCK(:,:), SLC_BCK(:,:) - REAL, ALLOCATABLE :: SLIFCS_FG(:) + REAL, ALLOCATABLE :: SLIFCS_FG(:), SICFCS_FG(:) INTEGER, ALLOCATABLE :: LANDINC_MASK_FG(:), LANDINC_MASK(:) REAL, ALLOCATABLE :: SND_BCK(:), SND_INC(:), SWE_BCK(:) - REAL(KIND=KIND_IO8), ALLOCATABLE :: SLMASKL(:), SLMASKW(:) + REAL(KIND=KIND_IO8), ALLOCATABLE :: SLMASKL(:), SLMASKW(:), LANDFRAC(:) TYPE(NSST_DATA) :: NSST real, dimension(idim,jdim) :: tf_clm,tf_trd,sal_clm @@ -375,6 +377,7 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & INTEGER, DIMENSION(LENSFC) :: STC_UPDATED, SLC_UPDATED LOGICAL :: FILE_EXISTS, DO_SOI_INC, DO_SNO_INC + CHARACTER(LEN=3) :: RANKCH !-------------------------------------------------------------------------------- ! NST_FILE is the path/name of the gaussian GSI file which contains NSST @@ -389,7 +392,6 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & DO_SNO_INC = .FALSE. DO_SOI_INC = .FALSE. - SIG1T = 0.0 ! Not a dead start! INPUT_NML_FILE = "NULL" @@ -404,7 +406,14 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & ! READ THE OROGRAPHY AND GRID POINT LAT/LONS FOR THE CUBED-SPHERE TILE. !-------------------------------------------------------------------------------- - CALL READ_LAT_LON_OROG(RLA,RLO,OROG,OROG_UF,TILE_NUM,IDIM,JDIM,LENSFC) + ALLOCATE(LANDFRAC(LENSFC)) + IF(FRAC_GRID) THEN + PRINT*,'- RUNNING WITH FRACTIONAL GRID.' + CALL READ_LAT_LON_OROG(RLA,RLO,OROG,OROG_UF,TILE_NUM,IDIM,JDIM,LENSFC,LANDFRAC=LANDFRAC) + ELSE + CALL READ_LAT_LON_OROG(RLA,RLO,OROG,OROG_UF,TILE_NUM,IDIM,JDIM,LENSFC) + LANDFRAC=-999.9 + ENDIF DO I = 1, IDIM IDUM(I,:) = I @@ -441,10 +450,15 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & ALLOCATE(NSST%Z_C(LENSFC)) ALLOCATE(NSST%ZM(LENSFC)) ALLOCATE(SLIFCS_FG(LENSFC)) + ALLOCATE(SICFCS_FG(LENSFC)) ENDIF IF (DO_LNDINC) THEN - ! identify variables to be updates, and allocate arrays. + IF (FRAC_GRID) THEN + print *, 'FATAL ERROR: land increment update does not work with fractional grids.' + call MPI_ABORT(MPI_COMM_WORLD, 17, IERR) + ENDIF + ! identify variables to be updated, and allocate arrays. IF (TRIM(LND_SOI_FILE) .NE. "NULL") THEN DO_SOI_INC = .TRUE. PRINT* @@ -486,6 +500,21 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & ABSFCS=ABSFCS,T2M=T2M ,Q2M=Q2M ,SLMASK=SLMASK, & ZSOIL=ZSOIL, NSST=NSST) + IF (FRAC_GRID .AND. .NOT. IS_NOAHMP) THEN + print *, 'FATAL ERROR: NOAH lsm update does not work with fractional grids.' + call MPI_ABORT(MPI_COMM_WORLD, 18, IERR) + ENDIF + + IF (FRAC_GRID .AND. DO_SNO_INC) THEN + print *, 'FATAL ERROR: Snow increment update does not work with fractional grids.' + call MPI_ABORT(MPI_COMM_WORLD, 19, IERR) + ENDIF + + IF (IS_NOAHMP .AND. DO_SNO_INC) THEN + print *, 'FATAL ERROR: Snow increment update does not work with NOAH_MP.' + call MPI_ABORT(MPI_COMM_WORLD, 29, IERR) + ENDIF + IF (IS_NOAHMP) THEN LSM=LSM_NOAHMP ELSE @@ -505,6 +534,7 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & ENDDO IF (DO_NSST) THEN + SICFCS_FG=SICFCS IF (.NOT. DO_SFCCYCLE ) THEN PRINT* PRINT*,"FIRST GUESS MASK ADJUSTED BY IFD RECORD" @@ -532,21 +562,50 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & IF (DO_SFCCYCLE) THEN ALLOCATE(SLMASKL(LENSFC), SLMASKW(LENSFC)) -! for running uncoupled (non-fractional grid) + + SET_MASK : IF (FRAC_GRID) THEN + + DO I=1,LENSFC + IF(LANDFRAC(I) > 0.0_KIND_IO8) THEN + SLMASKL(I) = CEILING(LANDFRAC(I)-1.0E-6_KIND_IO8) + SLMASKW(I) = FLOOR(LANDFRAC(I)+1.0E-6_KIND_IO8) + ELSE + IF(NINT(SLMASK(I)) == 1) THEN ! If landfrac is zero, this should not happen. + ! So, stop processing. + PRINT*, 'FATAL ERROR: LAND FRAC AND SLMASK MISMATCH.' + CALL MPI_ABORT(MPI_COMM_WORLD, 27, IERR) + ELSE + SLMASKL(I) = 0.0_KIND_io8 + SLMASKW(I) = 0.0_KIND_io8 + ENDIF + ENDIF + + ENDDO + + ELSE + +! For running uncoupled (non-fractional grid). + + DO I=1,LENSFC + IF(NINT(SLMASK(I)) == 1) THEN + SLMASKL(I) = 1.0_KIND_io8 + SLMASKW(I) = 1.0_KIND_io8 + ELSE + SLMASKL(I) = 0.0_KIND_io8 + SLMASKW(I) = 0.0_KIND_io8 + ENDIF + ENDDO + + ENDIF SET_MASK + DO I=1,LENSFC - IF(NINT(SLMASK(I)) == 1) THEN - SLMASKL(I) = 1.0_KIND_io8 - SLMASKW(I) = 1.0_KIND_io8 - ELSE - SLMASKL(I) = 0.0_KIND_io8 - SLMASKW(I) = 0.0_KIND_io8 - ENDIF if(nint(slmask(i)) == 0) then min_ice(i) = 0.15_KIND_io8 else min_ice(i) = 0.0_KIND_io8 endif - ENDDO + ENDDO + num_threads = num_parthds() PRINT* PRINT*,"CALL SFCCYCLE TO UPDATE SURFACE FIELDS." @@ -562,6 +621,7 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & SZ_NML, INPUT_NML_FILE, & min_ice, & IALB,ISOT,IVEGSRC,TILE_NUM,I_INDEX,J_INDEX) + DEALLOCATE(SLMASKL, SLMASKW) ENDIF @@ -576,7 +636,7 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & PRINT* PRINT*,"NO GSI FILE. ADJUST IFD FOR FORMER ICE POINTS." DO I = 1, LENSFC - IF (NINT(SLIFCS_FG(I)) == 2 .AND. NINT(SLIFCS(I)) == 0) THEN + IF (SICFCS_FG(I) > 0.0 .AND. SICFCS(I) == 0) THEN NSST%IFD(I) = 3.0 ENDIF ENDDO @@ -602,9 +662,9 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & ! ! update foundation & surface temperature for NSST ! - CALL ADJUST_NSST(RLA,RLO,SLIFCS,SLIFCS_FG,TSFFCS,SITFCS,SICFCS,STCFCS, & - NSST,LENSFC,LSOIL,IDIM,JDIM,ZSEA1,ZSEA2,IM,ID,DELTSFC, & - tf_clm_tile,tf_trd_tile,sal_clm_tile) + CALL ADJUST_NSST(RLA,RLO,SLIFCS,SLIFCS_FG,TSFFCS,SITFCS,SICFCS,SICFCS_FG,& + STCFCS,NSST,LENSFC,LSOIL,IDIM,JDIM,ZSEA1,ZSEA2, & + tf_clm_tile,tf_trd_tile,sal_clm_tile,landfrac,frac_grid) ENDIF ENDIF @@ -665,6 +725,10 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & ! read increments in !-------------------------------------------------------------------------------- + WRITE(RANKCH, '(I3.3)') (MYRANK+1) + + LND_SOI_FILE = trim(LND_SOI_FILE) // "." // RANKCH + INQUIRE(FILE=trim(LND_SOI_FILE), EXIST=file_exists) IF (.not. file_exists) then print *, 'FATAL ERROR: land increment update requested, but file does not exist: ', & @@ -724,7 +788,8 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & IF (LSM==LSM_NOAHMP) THEN CALL WRITE_DATA(LENSFC,IDIM,JDIM,LSOIL,DO_NSST,NSST,VEGFCS=VEGFCS, & - SLCFCS=SLCFCS,SMCFCS=SMCFCS,STCFCS=STCFCS) + SLCFCS=SLCFCS,SMCFCS=SMCFCS,STCFCS=STCFCS,& + SICFCS=SICFCS,SIHFCS=SIHFCS) ELSEIF (LSM==LSM_NOAH) THEN @@ -762,6 +827,7 @@ SUBROUTINE SFCDRV(LUGB, IDIM,JDIM,LENSFC,LSOIL,DELTSFC, & DEALLOCATE(NSST%Z_C) DEALLOCATE(NSST%ZM) DEALLOCATE(SLIFCS_FG) + DEALLOCATE(SICFCS_FG) ENDIF RETURN @@ -772,13 +838,14 @@ END SUBROUTINE SFCDRV !! grid), interpolate increments to the cubed-sphere tile, and !! perform required nsst adjustments and qc. !! - !! @param[inout] RLA Latitude on the cubed-sphere tile - !! @param[inout] RLO Longitude on the cubed-sphere tile + !! @param[in] RLA Latitude on the cubed-sphere tile + !! @param[in] RLO Longitude on the cubed-sphere tile !! @param[in] SLMSK_TILE Land-sea mask on the cubed-sphere tile !! @param[in] SLMSK_FG_TILE First guess land-sea mask on the cubed-sphere tile !! @param[inout] SKINT_TILE Skin temperature on the cubed-sphere tile !! @param[inout] SICET_TILE Ice temperature on the cubed-sphere tile - !! @param[inout] sice_tile Ice concentration on the cubed-sphere tile + !! @param[in] sice_tile Ice concentration on the cubed-sphere tile + !! @param[in] sice_fg_tile First guess ice concentration on the cubed-sphere tile !! @param[inout] SOILT_TILE Soil temperature on the cubed-sphere tile !! @param[in] NSST Data structure holding nsst fields !! @param[in] LENSFC Number of points on a tile @@ -789,20 +856,20 @@ END SUBROUTINE SFCDRV !! depth of sea temperature. In whole mm. !! @param[in] ZSEA2 When running nsst model, this is the upper bound of !! depth of sea temperature. In whole mm. - !! @param[in] MON Month - !! @param[in] DAY Day - !! @param[in] DELTSFC Cycling frequency in hours !! @param[in] tf_clm_tile Climatological reference temperature on the !! cubed-sphere tile. !! @param[in] tf_trd_tile Climatolocial reference temperature trend on the !! cubed-sphere tile. !! @param[in] sal_clm_tile Climatological salinity on the cubed-sphere tile. + !! @param[in] LANDFRAC Land fraction + !! @param[in] FRAC_GRID Process fractional grid when true. !! !! @author Xu Li, George Gayno SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& - SICET_TILE,sice_tile,SOILT_TILE,NSST,LENSFC,LSOIL, & - IDIM,JDIM,ZSEA1,ZSEA2,MON,DAY,DELTSFC, & - tf_clm_tile,tf_trd_tile,sal_clm_tile) + SICET_TILE,sice_tile,sice_fg_tile,SOILT_TILE,NSST, & + LENSFC,LSOIL,IDIM,JDIM,ZSEA1,ZSEA2, & + tf_clm_tile,tf_trd_tile,sal_clm_tile,LANDFRAC, & + FRAC_GRID) USE UTILS USE GDSWZD_MOD @@ -814,13 +881,16 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& IMPLICIT NONE - INTEGER, INTENT(IN) :: LENSFC, LSOIL, IDIM, JDIM, MON, DAY + INTEGER, INTENT(IN) :: LENSFC, LSOIL, IDIM, JDIM - REAL, INTENT(IN) :: SLMSK_TILE(LENSFC), SLMSK_FG_TILE(LENSFC) + LOGICAL, INTENT(IN) :: FRAC_GRID + + REAL, INTENT(IN) :: SLMSK_TILE(LENSFC), SLMSK_FG_TILE(LENSFC), LANDFRAC(LENSFC) real, intent(in) :: tf_clm_tile(lensfc),tf_trd_tile(lensfc),sal_clm_tile(lensfc) - REAL, INTENT(IN) :: ZSEA1, ZSEA2, DELTSFC - REAL, INTENT(INOUT) :: RLA(LENSFC), RLO(LENSFC), SKINT_TILE(LENSFC) - REAL, INTENT(INOUT) :: SICET_TILE(LENSFC),sice_tile(lensfc),SOILT_TILE(LENSFC,LSOIL) + REAL, INTENT(IN) :: ZSEA1, ZSEA2,sice_tile(lensfc),sice_fg_tile(lensfc) + REAL, INTENT(IN) :: RLA(LENSFC), RLO(LENSFC) + REAL, INTENT(INOUT) :: SKINT_TILE(LENSFC) + REAL, INTENT(INOUT) :: SICET_TILE(LENSFC),SOILT_TILE(LENSFC,LSOIL) TYPE(NSST_DATA) :: NSST @@ -829,7 +899,8 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& INTEGER :: IOPT, NRET, KGDS_GAUS(200) INTEGER :: IGAUS, JGAUS, IJ, II, JJ, III, JJJ, KRAD INTEGER :: ISTART, IEND, JSTART, JEND - INTEGER :: MASK_TILE, MASK_FG_TILE +!INTEGER :: MASK_TILE, MASK_FG_TILE + INTEGER,allocatable :: MASK_TILE(:),MASK_FG_TILE(:) INTEGER :: ITILE, JTILE INTEGER :: MAX_SEARCH, J, IERR INTEGER :: IGAUSP1, JGAUSP1 @@ -959,10 +1030,22 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& NSST%TFINC = 0.0 - IJ_LOOP : DO IJ = 1, LENSFC + allocate(mask_tile(lensfc)) + allocate(mask_fg_tile(lensfc)) + + IF(.NOT. FRAC_GRID) THEN + MASK_TILE = NINT(SLMSK_TILE) + MASK_FG_TILE = NINT(SLMSK_FG_TILE) + ELSE + MASK_TILE=0 + WHERE(SICE_TILE > 0.0) MASK_TILE=2 + WHERE(LANDFRAC == 1.0) MASK_TILE=1 + MASK_FG_TILE=0 + WHERE(SICE_FG_TILE > 0.0) MASK_FG_TILE=2 + WHERE(LANDFRAC == 1.0) MASK_FG_TILE=1 + ENDIF - MASK_TILE = NINT(SLMSK_TILE(IJ)) - MASK_FG_TILE = NINT(SLMSK_FG_TILE(IJ)) + IJ_LOOP : DO IJ = 1, LENSFC ! ! when sea ice exists, get salinity dependent water temperature @@ -972,7 +1055,7 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& ! SKIP LAND POINTS. NSST NOT APPLIED AT LAND. !---------------------------------------------------------------------- - IF (MASK_TILE == 1) THEN + IF (MASK_TILE(ij) == 1) THEN nland = nland + 1 CYCLE IJ_LOOP ENDIF @@ -980,7 +1063,7 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& ! ! these are ice points. set tref to tf_ice and update tmpsfc. ! - if (mask_tile == 2) then + if (mask_tile(ij) == 2) then nsst%tref(ij)=tf_ice ! water part tmp set skint_tile(ij)=(1.0-sice_tile(ij))*nsst%tref(ij)+sice_tile(ij)*sicet_tile(ij) nice = nice + 1 @@ -1000,11 +1083,11 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& ! weighted average of tf_ice and tf_clm. For NSST vars, set xz TO '30' AND ALL OTHER FIELDS TO ZERO. !---------------------------------------------------------------------- - IF (MASK_FG_TILE == 2 .AND. MASK_TILE == 0) THEN + IF (mask_fg_tile(ij) == 2 .AND. mask_tile(ij) == 0) THEN ! ! set background for the thaw (just melted water) situation ! - call tf_thaw_set(nsst%tref,nint(slmsk_fg_tile),itile,jtile,tf_ice,tf_clm_tile(ij),tf_thaw,idim,jdim, & + call tf_thaw_set(nsst%tref,mask_fg_tile,itile,jtile,tf_ice,tf_clm_tile(ij),tf_thaw,idim,jdim, & nset_thaw_s,nset_thaw_i,nset_thaw_c) call nsst_water_reset(nsst,ij,tf_thaw) nset_thaw = nset_thaw + 1 @@ -1073,7 +1156,9 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& SKINT_TILE(IJ) = MIN(SKINT_TILE(IJ), TMAX) SICET_TILE(IJ) = SKINT_TILE(IJ) - SOILT_TILE(IJ,:) = SKINT_TILE(IJ) +! Under fractional grids, soilt is used at points with at +! least some land. + IF(.NOT. FRAC_GRID) SOILT_TILE(IJ,:) = SKINT_TILE(IJ) !---------------------------------------------------------------------- ! NO NEARBY GSI/GAUSSIAN OPEN WATER POINTS. PERFORM A SPIRAL SEARCH TO @@ -1136,7 +1221,7 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& SKINT_TILE(IJ) = MIN(SKINT_TILE(IJ), TMAX) SICET_TILE(IJ) = SKINT_TILE(IJ) - SOILT_TILE(IJ,:) = SKINT_TILE(IJ) + IF(.NOT. FRAC_GRID) SOILT_TILE(IJ,:) = SKINT_TILE(IJ) CYCLE IJ_LOOP ENDIF ! GSI/Gaussian mask is open water @@ -1180,7 +1265,7 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& SKINT_TILE(IJ) = MIN(SKINT_TILE(IJ), TMAX) SICET_TILE(IJ) = SKINT_TILE(IJ) - SOILT_TILE(IJ,:) = SKINT_TILE(IJ) + IF (.NOT. FRAC_GRID) SOILT_TILE(IJ,:) = SKINT_TILE(IJ) ENDIF ! NEARBY GAUSSIAN POINTS ARE OPEN WATER? @@ -1194,7 +1279,7 @@ SUBROUTINE ADJUST_NSST(RLA,RLO,SLMSK_TILE,SLMSK_FG_TILE,SKINT_TILE,& write(*,'(a,I8)') ' nice = ',nice write(*,'(a,I8)') ' nland = ',nland - DEALLOCATE(ID1, ID2, JDC, S2C) + DEALLOCATE(ID1, ID2, JDC, S2C, mask_tile, mask_fg_tile) END SUBROUTINE ADJUST_NSST @@ -1589,7 +1674,7 @@ subroutine get_tf_clm(xlats_ij,xlons_ij,ny,nx,iy,im,id,ih,tf_clm,tf_trd) real, dimension(nx*ny) :: tf_clm_ij ! sst climatology at target grids (nx*ny) real, dimension(nx*ny) :: tf_trd_ij ! 6-hourly sst climatology tendency real :: wei1,wei2 - integer :: nxc,nyc,mon1,mon2,i,j + integer :: nxc,nyc,mon1,mon2 character (len=6), parameter :: fin_tf_clm='sstclm' ! sst climatology file name ! ! get which two months used and their weights from atime @@ -1702,7 +1787,7 @@ subroutine get_sal_clm(xlats_ij,xlons_ij,ny,nx,iy,im,id,ih,sal_clm) real, dimension(nx*ny) :: sal_clm_ij ! salinity climatology at target grids (nx*ny) real :: wei1,wei2 - integer :: nxc,nyc,mon1,mon2,i,j + integer :: nxc,nyc,mon1,mon2 character (len=6), parameter :: fin_sal_clm='salclm' ! salinity climatology file name ! ! get which two months used and their weights from atime @@ -1812,11 +1897,10 @@ subroutine intp_tile(tf_lalo,dlats_lalo,dlons_lalo,jdim_lalo,idim_lalo, & real, parameter :: deg2rad=3.1415926/180.0 real, dimension(jdim_lalo) :: xlats_lalo real, dimension(idim_lalo) :: xlons_lalo - real :: tf,wsum,res_km + real :: wsum integer :: itile,jtile - integer :: ii,jj,ij,iii,jjj + integer :: ij integer :: ilalo,jlalo,ilalop1,jlalop1 - integer :: istart,iend,jstart,jend,krad integer, allocatable, dimension(:,:) :: id1,id2,jdc real, allocatable, dimension(:,:,:) :: agrid,s2c diff --git a/sorc/global_cycle.fd/read_write_data.f90 b/sorc/global_cycle.fd/read_write_data.f90 index 1cc9ad90f..71dabb465 100644 --- a/sorc/global_cycle.fd/read_write_data.f90 +++ b/sorc/global_cycle.fd/read_write_data.f90 @@ -664,8 +664,8 @@ subroutine remove_checksum(ncid, id_var) end subroutine remove_checksum !> Read latitude and longitude for the cubed-sphere tile from the - !! 'grid' file. Read the filtered and unfiltered orography from - !! the 'orography' file. + !! 'grid' file. Read the filtered and unfiltered orography and + !! optionally the land fraction from the 'orography' file. !! !! @param[in] IDIM 'i' dimension of cubed-sphere tile. !! @param[in] JDIM 'j' dimension of cubed-sphere tile. @@ -675,11 +675,13 @@ end subroutine remove_checksum !! @param[out] OROG Filtered orography. !! @param[out] OROG_UF Unfiltered orography. !! @param[out] TILE_NUM Cubed-sphere tile number + !! @param[out] LANDFRAC Land fraction. !! @author George Gayno NOAA/EMC SUBROUTINE READ_LAT_LON_OROG(RLA,RLO,OROG,OROG_UF,& - TILE_NUM,IDIM,JDIM,IJDIM) + TILE_NUM,IDIM,JDIM,IJDIM,LANDFRAC) USE MPI + USE MACHINE IMPLICIT NONE @@ -689,6 +691,7 @@ SUBROUTINE READ_LAT_LON_OROG(RLA,RLO,OROG,OROG_UF,& REAL, INTENT(OUT) :: RLA(IJDIM),RLO(IJDIM) REAL, INTENT(OUT) :: OROG(IJDIM),OROG_UF(IJDIM) + REAL(KIND=KIND_IO8), INTENT(OUT), OPTIONAL :: LANDFRAC(IJDIM) CHARACTER(LEN=50) :: FNOROG, FNGRID CHARACTER(LEN=3) :: RANKCH @@ -798,6 +801,14 @@ SUBROUTINE READ_LAT_LON_OROG(RLA,RLO,OROG,OROG_UF,& CALL NETCDF_ERR(ERROR, 'ERROR READING orog_filt RECORD' ) OROG = RESHAPE(DUMMY4, (/IJDIM/)) + IF(PRESENT(LANDFRAC))THEN + ERROR=NF90_INQ_VARID(NCID_OROG, 'land_frac', ID_VAR) + CALL NETCDF_ERR(ERROR, 'ERROR READING land_frac ID' ) + ERROR=NF90_GET_VAR(NCID_OROG, ID_VAR, DUMMY4) + CALL NETCDF_ERR(ERROR, 'ERROR READING land_frac RECORD' ) + LANDFRAC = RESHAPE(DUMMY4, (/IJDIM/)) + ENDIF + DEALLOCATE(DUMMY4) ERROR = NF90_CLOSE(NCID_OROG) @@ -861,7 +872,7 @@ SUBROUTINE READ_GSI_DATA(GSI_FILE, FILE_TYPE, LSOIL) CHARACTER(LEN=1) :: K_CH CHARACTER(LEN=10) :: INCVAR CHARACTER(LEN=80) :: err_msg - INTEGER :: K, I + INTEGER :: K PRINT* PRINT*, "READ INPUT GSI DATA FROM: "//TRIM(GSI_FILE) @@ -1694,7 +1705,6 @@ subroutine get_tf_clm_dim(file_sst,mlat_sst,mlon_sst) integer,parameter:: lu_sst = 21 ! fortran unit number of grib sst file integer :: iret - integer :: mscan,kb1 integer :: kf,kg,k,j,ierr integer, dimension(22):: jgds,kgds integer, dimension(25):: jpds,kpds @@ -1752,15 +1762,14 @@ subroutine read_salclm_gfs_nc(filename,sal,xlats,xlons,nlat,nlon,itime) real, dimension(nlon), intent(out) :: xlons real, dimension(nlon,nlat), intent(out) :: sal ! Local variables - integer :: ncid,ntime + integer :: ncid integer, parameter :: ndims = 3 character (len = *), parameter :: lat_name = "latitude" character (len = *), parameter :: lon_name = "longitude" character (len = *), parameter :: t_name = "time" character (len = *), parameter :: sal_name="sal" - integer :: no_fill,fill_value - integer :: time_varid,lon_varid, lat_varid, z_varid, sal_varid + integer :: time_varid,lon_varid, lat_varid, sal_varid ! The start and count arrays will tell the netCDF library where to read our data. integer, dimension(ndims) :: start, count @@ -1772,10 +1781,6 @@ subroutine read_salclm_gfs_nc(filename,sal,xlats,xlons,nlat,nlon,itime) character (len = *), parameter :: lat_units = "degrees_north" character (len = *), parameter :: lon_units = "degrees_east" - integer :: missv -! Loop indices - integer :: i,j - ! Open the file. call nc_check( nf90_open(filename, nf90_nowrite, ncid) ) diff --git a/ush/global_cycle.sh b/ush/global_cycle.sh index e6d55ad38..c71eb5efd 100755 --- a/ush/global_cycle.sh +++ b/ush/global_cycle.sh @@ -29,8 +29,6 @@ # Default is /nwprod2. # HOMEgfs Directory for gfs. Default is # $BASEDIR/gfs.v15.0.0. -# FIXSUBDA Sub-directory where fixed climatology files reside. -# Defaults to fix/am. # FIXam Directory for the global fixed climatology files. # Defaults to $HOMEgfs/fix/am # EXECgfs Directory of the program executable. Defaults to @@ -226,13 +224,17 @@ if [[ "$VERBOSE" = "YES" ]] ; then fi CASE=${CASE:-C768} +OCNRES=${OCNRES:-100} # Directories. gfs_ver=${gfs_ver:-v15.0.0} BASEDIR=${BASEDIR:-${NWROOT:-/nwprod2}} HOMEgfs=${HOMEgfs:-$BASEDIR/gfs_ver.${gfs_ver}} EXECgfs=${EXECgfs:-$HOMEgfs/exec} -FIXam=${FIXam:-$HOMEgfs/fix/am} +FIX_DIR=${FIX_DIR:-$HOMEgfs/fix} +FIXam=${FIXam:-$FIX_DIR/am} +OROFIX=${OROFIX:-$FIX_DIR/orog/${CASE}.mx${OCNRES}_frac} +FIX_SFC=${FIX_SFC:-$OROFIX/sfc} DATA=${DATA:-$(pwd)} COMIN=${COMIN:-$(pwd)} COMOUT=${COMOUT:-$(pwd)} @@ -269,6 +271,7 @@ DO_SNO_INC=${DO_SNO_INC:-.false.} zsea1=${zsea1:-0} zsea2=${zsea2:-0} MAX_TASKS_CY=${MAX_TASKS_CY:-99999} +FRAC_GRID=${FRAC_GRID:-.false.} FNGLAC=${FNGLAC:-${FIXam}/global_glacier.2x2.grb} FNMXIC=${FNMXIC:-${FIXam}/global_maxice.2x2.grb} @@ -276,18 +279,18 @@ FNTSFC=${FNTSFC:-${FIXam}/RTGSST.1982.2012.monthly.clim.grb} FNSALC=${FNSALC:-${FIXam}/global_salclm.t1534.3072.1536.nc} FNSNOC=${FNSNOC:-${FIXam}/global_snoclim.1.875.grb} FNZORC=${FNZORC:-igbp} -FNALBC2=${FNALBC2:-${FIXam}/global_albedo4.1x1.grb} FNAISC=${FNAISC:-${FIXam}/IMS-NIC.blended.ice.monthly.clim.grb} -FNTG3C=${FNTG3C:-${FIXam}/global_tg3clim.2.6x1.5.grb} -FNVEGC=${FNVEGC:-${FIXam}/global_vegfrac.0.144.decpercent.grb} -FNALBC=${FNALBC:-${FIXam}/global_snowfree_albedo.bosu.t$JCAP_CASE.$LONB_CASE.$LATB_CASE.rg.grb} -FNVETC=${FNVETC:-${FIXam}/global_vegtype.igbp.t$JCAP_CASE.$LONB_CASE.$LATB_CASE.rg.grb} -FNSOTC=${FNSOTC:-${FIXam}/global_soiltype.statsgo.t$JCAP_CASE.$LONB_CASE.$LATB_CASE.rg.grb} FNSMCC=${FNSMCC:-${FIXam}/global_soilmgldas.statsgo.t$JCAP_CASE.$LONB_CASE.$LATB_CASE.grb} -FNABSC=${FNABSC:-${FIXam}/global_mxsnoalb.uariz.t$JCAP_CASE.$LONB_CASE.$LATB_CASE.rg.grb} -FNVMNC=${FNVMNC:-${FIXam}/global_shdmin.0.144x0.144.grb} -FNVMXC=${FNVMXC:-${FIXam}/global_shdmax.0.144x0.144.grb} -FNSLPC=${FNSLPC:-${FIXam}/global_slope.1x1.grb} +FNALBC2=${FNALBC2:-${FIX_SFC}/${CASE}.mx${OCNRES}.facsf.tileX.nc} +FNTG3C=${FNTG3C:-${FIX_SFC}/${CASE}.mx${OCNRES}.substrate_temperature.tileX.nc} +FNVEGC=${FNVEGC:-${FIX_SFC}/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc} +FNALBC=${FNALBC:-${FIX_SFC}/${CASE}.mx${OCNRES}.snowfree_albedo.tileX.nc} +FNVETC=${FNVETC:-${FIX_SFC}/${CASE}.mx${OCNRES}.vegetation_type.tileX.nc} +FNSOTC=${FNSOTC:-${FIX_SFC}/${CASE}.mx${OCNRES}.soil_type.tileX.nc} +FNABSC=${FNABSC:-${FIX_SFC}/${CASE}.mx${OCNRES}.maximum_snow_albedo.tileX.nc} +FNVMNC=${FNVMNC:-${FIX_SFC}/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc} +FNVMXC=${FNVMXC:-${FIX_SFC}/${CASE}.mx${OCNRES}.vegetation_greenness.tileX.nc} +FNSLPC=${FNSLPC:-${FIX_SFC}/${CASE}.mx${OCNRES}.slope_type.tileX.nc} FNMSKH=${FNMSKH:-${FIXam}/global_slmask.t1534.3072.1536.grb} NST_FILE=${NST_FILE:-"NULL"} LND_SOI_FILE=${LND_SOI_FILE:-"NULL"} @@ -322,10 +325,6 @@ ln -fs $FNTSFC sstclm ln -fs $FNSALC salclm # If the appropriate resolution fix file is not present, use the highest resolution available (T1534) -[[ ! -f $FNALBC ]] && FNALBC="$FIXam/global_snowfree_albedo.bosu.t1534.3072.1536.rg.grb" -[[ ! -f $FNVETC ]] && FNVETC="$FIXam/global_vegtype.igbp.t1534.3072.1536.rg.grb" -[[ ! -f $FNSOTC ]] && FNSOTC="$FIXam/global_soiltype.statsgo.t1534.3072.1536.rg.grb" -[[ ! -f $FNABSC ]] && FNABSC="$FIXam/global_mxsnoalb.uariz.t1534.3072.1536.rg.grb" [[ ! -f $FNSMCC ]] && FNSMCC="$FIXam/global_soilmgldas.statsgo.t1534.3072.1536.grb" ################################################################################ @@ -381,7 +380,8 @@ cat << EOF > fort.36 iy=$iy, im=$im, id=$id, ih=$ih, fh=$FHOUR, deltsfc=$DELTSFC,ialb=$IALB,use_ufo=$use_ufo,donst=$DONST, do_sfccycle=$DO_SFCCYCLE,do_lndinc=$DO_LNDINC,isot=$ISOT,ivegsrc=$IVEGSRC, - zsea1_mm=$zsea1,zsea2_mm=$zsea2,MAX_TASKS=$MAX_TASKS_CY + zsea1_mm=$zsea1,zsea2_mm=$zsea2,MAX_TASKS=$MAX_TASKS_CY, + frac_grid=$FRAC_GRID / EOF diff --git a/ush/global_cycle_driver.sh b/ush/global_cycle_driver.sh index b48327419..84699c306 100755 --- a/ush/global_cycle_driver.sh +++ b/ush/global_cycle_driver.sh @@ -9,7 +9,7 @@ set -eux #------------------------------------------------------------------------------------------------- export CASE=${CASE:-C768} # resolution of tile: 48, 96, 192, 384, 768, 1152, 3072 -ocn=${ocn:-""} # ocean grid resolution: 025, 050, 100 or 500. +export OCNRES=${OCNRES:-100} export CDATE=${CDATE:-${cdate:-2017031900}} # format yyyymmddhh yyyymmddhh ... export CDUMP=${CDUMP:-gfs} # gfs or gdas export COMPONENT=${COMPONENT:-atmos} @@ -18,8 +18,10 @@ pwd=$(pwd) export NWPROD=${NWPROD:-$pwd} export DMPDIR=${DMPDIR:-$NWPROD} export HOMEgfs=${HOMEgfs:-$NWPROD/gfs.v15.0.0} -export FIXam=${FIXam:-$HOMEgfs/fix/am} -export FIXfv3=${FIXfv3:-$HOMEgfs/fix/orog} +export FIX_DIR=${FIX_DIR:-$HOMEgfs/fix} +export FIXam=${FIXam:-$FIX_DIR/am} +export OROFIX=${OROFIX:-$FIX_DIR/orog/${CASE}} +export FIX_SFC=${FIX_SFC:-$OROFIX/sfc} ntiles=${ntiles:-6} DONST=${DONST:-"NO"} @@ -54,6 +56,7 @@ export DO_SFCCYLE=${DO_SFCCYCLE:-".true."} export DO_LNDINC=${DO_LNDINC:-".false."} export LND_SOI_FILE=${LND_SOI_FILE:-"NULL"} export DO_SNO_INC=${DO_SNO_INC:-".false."} +export FRAC_GRID=${FRAC_GRID:-".false."} CRES=$(echo $CASE | cut -c 2-) JCAP_CASE=$((2*CRES-2)) @@ -71,27 +74,34 @@ export DATA=${DATA:-$pwd/rundir$$} rm -fr $DATA mkdir -p $DATA +# Make a copy of the input restart file as fnbgso. For fractional grids, +# only a few fields will be updated by sfcsub.F. Only these records +# will be overwritten in fnbgso. + for n in $(seq 1 $ntiles); do ln -fs $COMIN/$PDY.${cyc}0000.sfc_data.tile${n}.nc $DATA/fnbgsi.00$n # Make a copy of the input restart file in the working directory. # global_cycle will update the required records for noah-mp. + cp $COMIN/$PDY.${cyc}0000.sfc_data.tile${n}.nc $COMOUT/$PDY.${cyc}0000.sfcanl_data.tile${n}.nc chmod 644 $COMOUT/$PDY.${cyc}0000.sfcanl_data.tile${n}.nc ln -fs $COMOUT/$PDY.${cyc}0000.sfcanl_data.tile${n}.nc $DATA/fnbgso.00$n - ln -fs $FIXfv3/C${CRES}/C${CRES}_grid.tile${n}.nc $DATA/fngrid.00$n - if [ -z "${ocn}" ];then - ln -fs $FIXfv3/C${CRES}/C${CRES}_oro_data.tile${n}.nc $DATA/fnorog.00$n + ln -fs $OROFIX/C${CRES}_grid.tile${n}.nc $DATA/fngrid.00$n + if (( OCNRES > 9999 ));then + ln -fs $OROFIX/C${CRES}_oro_data.tile${n}.nc $DATA/fnorog.00$n else - ln -fs $FIXfv3/C${CRES}/C${CRES}.mx${ocn}_oro_data.tile${n}.nc $DATA/fnorog.00$n + ln -fs $OROFIX/C${CRES}.mx${OCNRES}_oro_data.tile${n}.nc $DATA/fnorog.00$n fi + if [[ "$DO_SNO_INC" == ".true." ]] ; then ln -fs $COMIN/$PDY.${cyc}0000.xainc.tile${n}.nc $DATA/xainc.00$n fi done $CYCLESH + rc=$? if [[ $rc -ne 0 ]] ; then echo "***ERROR*** rc= $rc"