#!/bin/sh
################################################################################
####  UNIX Script Documentation Block
#                      .                                             .
# Script name:         global_forecast.sh
# Script description:  Runs a global spectral model forecast
#
# Author:        Mark Iredell       Org: NP23         Date: 1999-05-01
#
# Abstract: This script runs a single global spectral model forecast.
#   The initial conditions and run parameters are passed in the argument list.
#
# Script history log:
# 1999-05-01  Mark Iredell
# 2005-01-03  Cheng-Hsuan Lu :add namelist SOIL_VEG
#                             set FSMCL(2:4) = FSMCL2
#                             add FNVMNC,FNVMXC,FNSLPC,FNABSC
# 2006-02     Shrinivas Moorthi Modified to run ESMF - Stand Alone
#                             version of GFS - Only filestyle "L"
#                             allowed - Added a ESMF config file
#                             The script can run up to 21 ENS members
#                             concurrently.
# 2006-06     Shrinivas Moorthi : Added default PE$n values to 0
#
# Usage:  global_forecast.sh SIGI SFCI SIGO FLXO FHOUT FHMAX IGEN D3DO
#
#   Input script positional parameters:
#     1             Input sigma file 1
#                   defaults to $SIGI; one or the other is required
#     2             Input surface file
#                   defaults to $SFCI; one or the other is required
#     3             Output sigma file with embedded forecast hour '${FH}'
#                   defaults to $SIGO, then to ${COMOUT}/sigf'${FH}'$SUFOUT
#     4             Output flux file with embedded forecast hour '${FH}'
#                   defaults to $FLXO, then to ${COMOUT}/flxf'${FH}'$SUFOUT
#     5             Output frequency in hours
#                   defaults to $FHOUT, then to 3
#     6             Length of forecast in hours
#                   defaults to $FHMAX; otherwise FHSEG is required to be set
#     7             Output generating code
#                   defaults to $IGEN, defaults to 0
#     8             Output flux file with embedded forecast hour '${FH}'
#                   defaults to $D3DO, then to ${COMOUT}/d3df'${FH}'$SUFOUT
#
#   Imported Shell Variables:
#     SIGI          Input sigma file
#                   overridden by $1; one or the other is required
#     SFCI          Input surface file
#                   overridden by $2; one or the other is required
#     SIGO          Output sigma file with embedded forecast hour '${FH}'
#                   overridden by $3; defaults to ${COMOUT}/sigf'${FH}'$SUFOUT
#     FLXO          Output flux file with embedded forecast hour '${FH}'
#                   overridden by $4; defaults to ${COMOUT}/flxf'${FH}'$SUFOUT
#     FHOUT         Output frequency in hours
#                   overridden by $5; defaults to 3
#     FHMAX         Length of forecast in hours
#                   overridden by $6; either FHMAX or FHSEG must be set
#     IGEN          Output generating code
#                   overridden by $7; defaults to 0
#     FIXGLOBAL     Directory for global fixed files
#                   defaults to /nwprod/fix
#     EXECGLOBAL    Directory for global executables
#                   defaults to /nwprod/exec
#     DATA          working directory
#                   (if nonexistent will be made, used and deleted)
#                   defaults to current working directory
#     COMOUT        output directory
#                   (if nonexistent will be made)
#                   defaults to current working directory
#     XC            Suffix to add to executables
#                   defaults to none
#     SUFOUT        Suffix to add to output filenames
#                   defaults to none
#     NCP           Copy command
#                   defaults to cp
#     SIGHDR        Command to read sigma header
#                   (required if JCAP, LEVS, or FHINI are not specified)
#                   defaults to ${EXECGLOBAL}/global_sighdr$XC
#     JCAP          Spectral truncation
#                   defaults to the value in the input sigma file header
#     LEVS          Number of levels
#                   defaults to the value in the input sigma file header
#     FCSTEXEC      Forecast executable
#                   defaults to ${EXECGLOBAL}/global_fcst$XC
#     SIGI2         Second time level sigma restart file
#                   defaults to NULL
#     CO2CON        Input CO2 radiation (vertical resolution dependent)
#                   defaults to ${FIXGLOBAL}/global_co2con.l${LEVS}.f77
#     MTNVAR        Input mountain variance (horizontal resolution dependent)
#                   defaults to ${FIXGLOBAL}/global_mtnvar.t${JCAP}.f77
#     CLTUNE        Input cloud tuning file
#                   defaults to ${FIXGLOBAL}/global_cldtune.f77
#     DTBTHE        Input equivalent potential temperature file
#                   defaults to ${FIXGLOBAL}/global_tbthe.f77
#     O3FORC        Input ozone forcing (production/loss) climatology
#                   defaults to ${FIXGLOBAL}/global_o3prdlos.f77
#     O3CLIM        Input ozone climatology
#                   defaults to ${FIXGLOBAL}/global_o3clim.txt
#     FNGLAC        Input glacier climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_glacier.2x2.grb
#     FNMXIC        Input maximum sea ice climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_maxice.2x2.grb
#     FNTSFC        Input SST climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_sstclim.2x2.grb
#     FNSNOC        Input snow climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_snoclim.1.875.grb
#     FNZORC        Input roughness climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_zorclim.1x1.grb
#     FNALBC        Input albedo climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_albedo4.1x1.grb
#     FNAISC        Input sea ice climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_iceclim.2x2.grb
#     FNTG3C        Input deep soil temperature climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb
#     FNVEGC        Input vegetation fraction climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_vegfrac.1x1.grb
#     FNVETC        Input vegetation type climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_vegtype.1x1.grb
#     FNSOTC        Input soil type climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_soiltype.1x1.grb
#     FNSMCC        Input soil moisture climatology GRIB file
#                   defaults to ${FIXGLOBAL}/global_soilmcpc.1x1.grb
#     FNVMNC        Input min veg frac climatology GRIB file    
#                   defaults to ${FIXGLOBAL}/global_shdmin.0.144x0.144.grb
#     FNVMXC        Input max veg frac climatology GRIB file    
#                   defaults to ${FIXGLOBAL}/global_shdmax.0.144x0.144.grb
#     FNSLPC        Input slope type climatology GRIB file    
#                   defaults to ${FIXGLOBAL}/global_slope.1x1.grb
#     FNABSC        Input max snow albedo climatology GRIB file    
#                   defaults to ${FIXGLOBAL}/global_snoalb.1x1.grb
#     OROGRAPHY     Input orography GRIB file (horiz resolution dependent)
#                   defaults to ${FIXGLOBAL}/global_orography.t$JCAP.grb
#     FNMSKH        Input high resolution land mask GRIB file
#                   defaults to ${FIXGLOBAL}/seaice_newland.grb
#     FNTSFA        Input SST analysis GRIB file
#                   defaults to none
#     FNACNA        Input sea ice analysis GRIB file
#                   defaults to none
#     FNSNOA        Input snow analysis GRIB file
#                   defaults to none
#     AERODIR       Input aersol climatology directory
#                   defaults to ${FIXGLOBAL}
#     EMISDIR       Input earth's surface emissivity data directory
#                   defaults to ${FIXGLOBAL}
#     SIGR1         Output first time level sigma restart file
#                   defaults to ${DATA}/sigr1 which is deleted
#     SIGR2         Output second time level sigma restart file
#                   defaults to ${DATA}/sigr2 which is deleted
#     SFCR          Output surface restart file
#                   defaults to ${DATA}/sfcr which is deleted
#     SFCO          Output surface file with embedded forecast hour '${FH}'
#                   defaults to ${COMOUT}/sfcf'${FH}'$SUFOUT
#     LOGO          Output log file with embedded forecast hour '${FH}'
#                   defaults to ${COMOUT}/logf'${FH}'$SUFOUT
#     INISCRIPT     Preprocessing script
#                   defaults to none
#     LOGSCRIPT     Log posting script
#                   defaults to none
#     ERRSCRIPT     Error processing script
#                   defaults to 'eval [[ $err = 0 ]]'
#     ENDSCRIPT     Postprocessing script
#                   defaults to none
#     FHINI         Starting forecast hour
#                   defaults to the value in the input sigma file header
#     FHSEG         Number of hours to integrate
#                   (only required if FHMAX is not specified)
#                   defaults to 0
#     DELTIM        Timestep in seconds
#                   defaults to 3600/($JCAP/20)
#     FHRES         Restart frequency in hours
#                   defaults to 24
#     FHZER         Zeroing frequency in hours
#                   defaults to 6
#     FHLWR         Longwave radiation frequency in hours
#                   defaults to 3
#     FHSWR         Shortwave radiation frequency in hours
#                   defaults to 1
#     FHROT         Forecast hour to Read One Time level
#                   defaults to 0
#     FHDFI         Half number of hours of digital filter initialization
#                   defaults to 0
#     FHCYC         Surface cycling frequency in hours
#                   defaults to 0 for no cycling
#     IDVC          Integer ID of the vertical coordinate type
#                   defaults to that in the header for the input upperair
#                   file. IDVC=1 for sigma; IDVC=2 for pressure/sigma hybrid
#     TFILTC        Time filter coefficient
#                   defaults to 0.85
#     FCSTVARS      Other namelist inputs to the forecast executable
#                   defaults to none set
#     FSMCL2        Scale in days to relax to soil moisture climatology
#                   defaults to 99999 for no relaxation
#     FTSFS         Scale in days to relax to SST anomaly to zero
#                   defaults to 90
#     FAISS         Scale in days to relax to sea ice to climatology
#                   defaults to 99999
#     FSNOL         Scale in days to relax to snow to climatology
#                   defaults to 99999
#     FSICL         Scale in days to relax to sea ice to climatology
#                   defaults to 99999
#     CYCLEVARS     Other namelist inputs to the surface cycling
#                   defaults to none set
#     NTHREADS      Number of threads
#                   defaults to 1
#     NTHSTACK      Size of stack per thread
#                   defaults to 64000000
#     FILESTYLE     File management style flag
#                   ('L' for symbolic links in $DATA is the only allowed style),
#     PGMOUT        Executable standard output
#                   defaults to $pgmout, then to '&1'
#     PGMERR        Executable standard error
#                   defaults to $pgmerr, then to '&1'
#     pgmout        Executable standard output default
#     pgmerr        Executable standard error default
#     REDOUT        standard output redirect ('1>' or '1>>')
#                   defaults to '1>', or to '1>>' to append if $PGMOUT is a file
#     REDERR        standard error redirect ('2>' or '2>>')
#                   defaults to '2>', or to '2>>' to append if $PGMERR is a file
#     VERBOSE       Verbose flag (YES or NO)
#                   defaults to NO
#
#   Exported Shell Variables:
#     PGM           Current program name
#     pgm
#     ERR           Last return code
#     err
#
#   Modules and files referenced:
#     scripts    : $INISCRIPT
#                  $LOGSCRIPT
#                  $ERRSCRIPT
#                  $ENDSCRIPT
#
#     programs   : $FCSTEXEC
#
#     input data : $1 or $SIGI
#                  $2 or $SFCI
#                  $SIGI2
#                  $FNTSFA
#                  $FNACNA
#                  $FNSNOA
#
#     fixed data : $CO2CON
#                  $MTNVAR
#                  $CLTUNE
#                  $DTBTHE
#                  $O3FORC
#                  $O3CLIM
#                  $FNGLAC
#                  $FNMXIC
#                  $FNTSFC
#                  $FNSNOC
#                  $FNZORC
#                  $FNALBC
#                  $FNAISC
#                  $FNTG3C
#                  $FNVEGC
#                  $FNVETC
#                  $FNSOTC
#                  $FNSMCC
#                  $FNVMNC
#                  $FNVMXC
#                  $FNSLPC
#                  $FNABSC
#                  $FNMSKH
#                  $OROGRAPHY
#
#     output data: $3 or $SIGO
#                  $4 or $FLXO
#                  $SFCO
#                  $LOGO
#                  $SIGR1
#                  $SIGR2
#                  $SFCR
#                  $PGMOUT
#                  $PGMERR
#
#     scratch    : ${DATA}/fort.11
#                  ${DATA}/fort.12
#                  ${DATA}/fort.14
#                  ${DATA}/fort.15
#                  ${DATA}/fort.24
#                  ${DATA}/fort.27
#                  ${DATA}/fort.28
#                  ${DATA}/fort.29
#                  ${DATA}/fort.43
#                  ${DATA}/fort.48
#                  ${DATA}/fort.51
#                  ${DATA}/fort.52
#                  ${DATA}/fort.53
#                  ${DATA}/SIG.F*
#                  ${DATA}/SFC.F*
#                  ${DATA}/FLX.F*
#                  ${DATA}/LOG.F*
#                  ${DATA}/sigr1
#                  ${DATA}/sigr2
#                  ${DATA}/sfcr
#                  ${DATA}/NULL
#
# Remarks:
#
#   Condition codes
#      0 - no problem encountered
#     >0 - some problem encountered
#
#  Control variable resolution priority
#    1 Command line argument.
#    2 Environment variable.
#    3 Inline default.
#
# Attributes:
#   Language: POSIX shell
#   Machine: IBM SP
#
####
################################################################################
#  Set environment.
export VERBOSE=${VERBOSE:-"NO"}
if [[ "$VERBOSE" = "YES" ]]
then
   echo $(date) EXECUTING $0 $* >&2
   set -x
fi
#  Command line arguments.
export ENS_NUM=${ENS_NUM:-1}
export FM=${FM}
export SIGI=${1:-${SIGI:-?}}
export SFCI=${2:-${SFCI:-?}}
export SIGO=${3:-${SIGO}}
export FLXO=${4:-${FLXO}}
export FHOUT=${5:-${FHOUT:-3}}
export FHMAX=${6:-${FHMAX:-0}}
export IGEN=${7:-${IGEN:-0}}
export D3DO=${8:-${D3DO}}
#  Directories.
export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix}
export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec}
export DATA=${DATA:-$(pwd)}
export COMOUT=${COMOUT:-$(pwd)}
#  Filenames.
export XC=${XC}
export SUFOUT=${SUFOUT}
export SIGHDR=${SIGHDR:-${EXECGLOBAL}/global_sighdr$XC}
export JCAP=${JCAP:-$(echo jcap|$SIGHDR ${SIGI}$FM)}
export LEVS=${LEVS:-$(echo levs|$SIGHDR ${SIGI}$FM)}
export LONR=${LONR:-$(echo lonr|$SIGHDR ${SIGI}$FM)}
export LATR=${LATR:-$(echo latr|$SIGHDR ${SIGI}$FM)}
export LONF=${LONF:-$(echo lonf|$SIGHDR ${SIGI}$FM)}
export LATG=${LATG:-$(echo latf|$SIGHDR ${SIGI}$FM)}
export NTRAC=${NTRAC:-$(echo ntrac|$SIGHDR ${SIGI}$FM)}
export IDVC=${IDVC:-$(echo idvc|$SIGHDR ${SIGI}$FM)}
export NMTVR=${NMTVR:-14}
export LSOIL=${LSOIL:-4}
export NTOZ=${NTOZ:-2}
export NTCW=${NTCW:-3}
export NCLD=${NCLD:-1}
export NGPTC=${NGPTC:-30}
export ADIAB=${ADIAB:-.false.}
export pre_rad=${pre_rad:-.false.}
export random_xkt2=${random_xkt2:-.true.}
export FCSTEXEC=${FCSTEXEC:-${EXECGLOBAL}/global_fcst$XC}
#export FCSTEXEC=${FCSTEXEC:-/nw${envir}/exec/global_fcst$XC}
export SIGI2=${SIGI2:-NULL}
export CO2CON=${CO2CON:-${FIXGLOBAL}/global_co2con.l${LEVS}.f77}
export MTNVAR=${MTNVAR:-${FIXGLOBAL}/global_mtnvar.t${JCAP}.f77}
export CLTUNE=${CLTUNE:-${FIXGLOBAL}/global_cldtune.f77}
export DTBTHE=${DTBTHE:-${FIXGLOBAL}/global_tbthe.f77}
export O3FORC=${O3FORC:-${FIXGLOBAL}/global_o3prdlos.f77}
export O3CLIM=${O3CLIM:-${FIXGLOBAL}/global_o3clim.txt}
export FNGLAC=${FNGLAC:-${FIXGLOBAL}/global_glacier.2x2.grb}
export FNMXIC=${FNMXIC:-${FIXGLOBAL}/global_maxice.2x2.grb}
export FNTSFC=${FNTSFC:-${FIXGLOBAL}/cfs_oi2sst1x1monclim19822001.grb}
export FNSNOC=${FNSNOC:-${FIXGLOBAL}/global_snoclim.1.875.grb}
export FNZORC=${FNZORC:-${FIXGLOBAL}/global_zorclim.1x1.grb}
export FNALBC=${FNALBC:-${FIXGLOBAL}/global_albedo4.1x1.grb}
export FNAISC=${FNAISC:-${FIXGLOBAL}/cfs_ice1x1monclim19822001.grb}
export FNTG3C=${FNTG3C:-${FIXGLOBAL}/global_tg3clim.2.6x1.5.grb}
export FNVEGC=${FNVEGC:-${FIXGLOBAL}/global_vegfrac.0.144.decpercent.grb}
export FNVETC=${FNVETC:-${FIXGLOBAL}/global_vegtype.1x1.grb}
export FNSOTC=${FNSOTC:-${FIXGLOBAL}/global_soiltype.1x1.grb}
export FNSMCC=${FNSMCC:-${FIXGLOBAL}/global_soilmcpc.1x1.grb}
export FNVMNC=${FNVMNC:-${FIXGLOBAL}/global_shdmin.0.144x0.144.grb}
export FNVMXC=${FNVMXC:-${FIXGLOBAL}/global_shdmax.0.144x0.144.grb}
export FNSLPC=${FNSLPC:-${FIXGLOBAL}/global_slope.1x1.grb}
export FNABSC=${FNABSC:-${FIXGLOBAL}/global_snoalb.1x1.grb}
export FNMSKH=${FNMSKH:-${FIXGLOBAL}/seaice_newland.grb}
export OROGRAPHY=${OROGRAPHY:-${FIXGLOBAL}/global_orography.t$JCAP.grb}
export FNTSFA=${FNTSFA}
export FNACNA=${FNACNA}
export FNSNOA=${FNSNOA}
export AERODIR=${AERODIR:-${FIXGLOBAL}}
export EMISDIR=${EMISDIR:-${FIXGLOBAL}}
export SIGR1=${SIGR1:-${DATA}/sigr1}
export SIGR2=${SIGR2:-${DATA}/sigr2}
export SFCR=${SFCR:-${DATA}/sfcr}
export SIGO=${SIGO:-${COMOUT}/sigf'${FH}''${MN}'$SUFOUT}
export SFCO=${SFCO:-${COMOUT}/sfcf'${FH}''${MN}'$SUFOUT}
export FLXO=${FLXO:-${COMOUT}/flxf'${FH}''${MN}'$SUFOUT}
export LOGO=${LOGO:-${COMOUT}/logf'${FH}''${MN}'$SUFOUT}
export D3DO=${D3DO:-${COMOUT}/d3df'${FH}''${MN}'$SUFOUT}
export INISCRIPT=${INISCRIPT}
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT}
export ENDSCRIPT=${ENDSCRIPT}
#  Other variables.
export FHINI=${FHINI:-$(echo ifhr|$SIGHDR ${SIGI}$FM)}
export FHSEG=${FHSEG:-0}
export FHMAX=${FHMAX:-$((10#$FHINI+10#$FHSEG))}
export DELTIM=${DELTIM:-$((3600/(JCAP/20)))}
export FHRES=${FHRES:-24}
export FHZER=${FHZER:-6}
export FHLWR=${FHLWR:-3}
export FHSWR=${FHSWR:-1}
export FHROT=${FHROT:-0}
export FHDFI=${FHDFI:-0}
export FHCYC=${FHCYC:-0}
export LIOPE=${LIOPE:-.true.}
if [ $IDVC = 1 ] ; then
 export HYBRID=.false.
 export GEN_COORD_HYBRID=.false.
elif [ $IDVC = 2 ] ; then
 export HYBRID=.true.
 export GEN_COORD_HYBRID=.false.
elif [ $IDVC = 3 ] ; then
 export HYBRID=.false.
 export GEN_COORD_HYBRID=.true.
fi
export TFILTC=${TFILTC:-0.85}
export FCSTVARS=${FCSTVARS:-""}
export FSMCL2=${FSMCL2:-99999}
export FTSFS=${FTSFS:-90}
export FAISS=${FAISS:-99999}
export FSNOL=${FSNOL:-99999}
export FSICL=${FSICL:-99999}
export CYCLVARS=${CYCLVARS}
#export NTHREADS=${NTHREADS:-1}
export OMP_NUM_THREADS=${OMP_NUM_THREADS:-1}
export NTHSTACK=${NTHSTACK:-128000000}
export XLSMPOPTS=${XLSMPOPTS:-"parthds=$NTHREADS:stack=$NTHSTACK"}
export FILESTYLE=${FILESTYLE:-'L'}
export PGMOUT=${PGMOUT:-${pgmout:-'&1'}}
export PGMERR=${PGMERR:-${pgmerr:-'&2'}}
export MEMBER_NAMES=${MEMBER_NAMES:-''}
export BIND_TASKS=${BIND_TASKS:-no}
#typeset -L1 l=$PGMOUT
[[ $l = '&' ]]&&a=''||a='>'
export REDOUT=${REDOUT:-'1>'$a}
#typeset -L1 l=$PGMERR
[[ $l = '&' ]]&&a=''||a='>'
export REDERR=${REDERR:-'2>'$a}
################################################################################
#  Preprocessing
$INISCRIPT
pwd=$(pwd)
if [[ -d $DATA ]]
then
   mkdata=NO
else
   mkdir -p $DATA
   mkdata=YES
fi
cd $DATA||exit 99
[[ -d $COMOUT ]]||mkdir -p $COMOUT
################################################################################
#  Make forecast
export XLFRTEOPTS="unit_vars=yes"
export PGM=$DATA/$(basename $FCSTEXEC)
export pgm=$PGM
$LOGSCRIPT
${NCP:-cp} $FCSTEXEC $DATA
rm -f NULL
FH=$((10#$FHINI))
[[ $FH -lt 10 ]]&&FH=0$FH
if [[ $FHINI -gt 0 ]]
then
   FH=$((10#$FHINI+10#$FHOUT))
   [[ $FH -lt 10 ]]&&FH=0$FH
fi
while [[ $FH -le $FHMAX ]]
do
   eval rm -f $LOGO
   ((FH=10#$FH+10#$FHOUT))
   [[ $FH -lt 10 ]]&&FH=0$FH
done
if [[ $FILESTYLE = "L" ]]
then
   ln -fs $CO2CON fort.15
   ln -fs $MTNVAR fort.24
   ln -fs $DTBTHE fort.27
   ln -fs $O3FORC fort.28
   ln -fs $CLTUNE fort.43
   ln -fs $O3CLIM fort.48
else
  echo 'FILESTYLE' $FILESTYLE 'NOT SUPPORTED'
  exit 222
fi
for m in 01 02 03 04 05 06 07 08 09 10 11 12
do
  ln -fs $AERODIR/global_aeropac3a.m$m.txt aeropac3a.m$m
done
ln -fs $EMISDIR/sfc_emissivity_idx.txt sfc_emissivity_idx.txt
ln -fs $OROGRAPHY orography

#
#     For one member case i.e. control
#
if [[ $ENS_NUM -le 1 ]] ; then
  FH=$((10#$FHINI))
  [[ $FH -lt 10 ]]&&FH=0$FH
  if [[ $FHINI -gt 0 ]] ; then
    FH=$((10#$FHINI+10#$FHOUT))
    [[ $FH -lt 10 ]]&&FH=0$FH
  fi
#        For Initial Conditions
  ln -fs $SIGI sig_ini
  ln -fs $SFCI sfc_ini
  ln -fs $SIGI2 sig_ini2
#        For output
  while [ $FH -le $FHMAX ] ; do
    eval ln -fs $SIGO SIG.F${FH}
    eval ln -fs $SFCO SFC.F${FH}
    eval ln -fs $FLXO FLX.F${FH}
    eval ln -fs $LOGO LOG.F${FH}
    eval ln -fs $D3DO D3D.F${FH}
    ((FH=10#$FH+10#$FHOUT))
    [[ $FH -lt 10 ]]&&FH=0$FH
  done
  ln -fs $SIGR1 SIGR1
  ln -fs $SIGR2 SIGR2
  ln -fs $SFCR  SFCR
else
#
#   For Ensemble runs (members > 1)
  for MN in $MEMBER_NAMES ; do
#      This is just faking the ensemble ICs.
#   ${NCP:-cp} $SIGI  ${SIGI}${MN}
#   ${NCP:-cp} $SFCI  ${SFCI}${MN}
#   ${NCP:-cp} $SIGI2 ${SIGI2}${MN}
#        For Initial Conditions
    ln -fs ${SIGI}${MN} sig_ini${MN}
    ln -fs ${SFCI}${MN} sfc_ini${MN}
    ln -fs ${SIGI2}${MN} sig_ini2${MN}
#        For output
    FH=$((10#$FHINI))
    [[ $FH -lt 10 ]]&&FH=0$FH
    if [[ $FHINI -gt 0 ]] ; then
      FH=$((10#$FHINI+10#$FHOUT))
      [[ $FH -lt 10 ]]&&FH=0$FH
    fi
    while [[ $FH -le $FHMAX ]] ; do
      eval ln -fs $SIGO SIG.F${FH}${MN}
      eval ln -fs $SFCO SFC.F${FH}${MN}
      eval ln -fs $FLXO FLX.F${FH}${MN}
      eval ln -fs $LOGO LOG.F${FH}${MN}
      eval ln -fs $D3DO D3D.F${FH}${MN}
      ((FH=10#$FH+10#$FHOUT))
      [[ $FH -lt 10 ]]&&FH=0$FH
    done
    ln -fs ${SIGR1}${MN} SIGR1${MN}
    ln -fs ${SIGR2}${MN} SIGR2${MN}
    ln -fs ${SFCR}${MN}  SFCR${MN}
  done
fi

#
# Create Configure file (i.e. .rc file) here
# PE$n are to be imported from outside.  If PE$n are not set from outside, the
# model would give equal processors for all ensembel members.
#
c=1
while [ $c -le $ENS_NUM ] ; do
 eval export PE$c=\${PE$c:-0}
 c=$((c+1))
done
cat << EOF > gfs_namelist.rc

#nam_gfs +++++++++++++++++++++++++++
NLUNIT:                  35
DELTIM:                  ${DELTIM}.0
NAMELIST:                gfs_namelist
TOTAL_MEMBER:            $ENS_NUM
PE_MEMBER01:             $PE1
PE_MEMBER02:             $PE2
PE_MEMBER03:             $PE3
PE_MEMBER04:             $PE4
PE_MEMBER05:             $PE5
PE_MEMBER06:             $PE6
PE_MEMBER07:             $PE7
PE_MEMBER08:             $PE8
PE_MEMBER09:             $PE9
PE_MEMBER10:             $PE10
PE_MEMBER11:             $PE11
PE_MEMBER12:             $PE12
PE_MEMBER13:             $PE13
PE_MEMBER14:             $PE14
PE_MEMBER14:             $PE15
PE_MEMBER16:             $PE16
PE_MEMBER17:             $PE17
PE_MEMBER18:             $PE18
PE_MEMBER19:             $PE19
PE_MEMBER20:             $PE20
PE_MEMBER21:             $PE21

#ESMF_State_Namelist +++++++++++++++
IDATE1_IMPORT:                    0
Z_IMPORT:                         0
PS_IMPORT:                        0
VOR_IMPORT:                       0
DIV_IMPORT:                       0
TEMP_IMPORT:                      0
Q_IMPORT:                         0
OZ_IMPORT:                        0
SCLD_IMPORT:                      0

IDATE1_EXPORT:                    0
Z_EXPORT:                         0
PS_EXPORT:                        0
VOR_EXPORT:                       0
DIV_EXPORT:                       0
TEMP_EXPORT:                      0
Q_EXPORT:                         0
OZ_EXPORT:                        0
SCLD_EXPORT:                      0

# Surface state.
#---------------
OROGRAPHY_IMPORT:                 0
T_SKIN_IMPORT:                    0
SOIL_MOIS_IMPORT:                 0
SNOW_DEPTH_IMPORT:                0
SOIL_T_IMPORT:                    0
DEEP_SOIL_T_IMPORT:               0
ROUGHNESS_IMPORT:                 0
CONV_CLOUD_COVER_IMPORT:          0
CONV_CLOUD_BASE_IMPORT:           0
CONV_CLOUD_TOP_IMPORT:            0
ALBEDO_VISIBLE_SCATTERED_IMPORT:  0
ALBEDO_VISIBLE_BEAM_IMPORT:       0
ALBEDO_NEARIR_SCATTERED_IMPORT:   0
ALBEDO_NEARIR_BEAM_IMPORT:        0
SEA_LEVEL_ICE_MASK_IMPORT:        0
VEGETATION_COVER_IMPORT:          0
CANOPY_WATER_IMPORT:              0
M10_WIND_FRACTION_IMPORT:         0
VEGETATION_TYPE_IMPORT:           0
SOIL_TYPE_IMPORT:                 0
ZENEITH_ANGLE_FACSF_IMPORT:       0
ZENEITH_ANGLE_FACWF_IMPORT:       0
UUSTAR_IMPORT:                    0
FFMM_IMPORT:                      0
FFHH_IMPORT:                      0
SEA_ICE_THICKNESS_IMPORT:         0
SEA_ICE_CONCENTRATION_IMPORT:     0
TPRCP_IMPORT:                     0
SRFLAG_IMPORT:                    0
ACTUAL_SNOW_DEPTH_IMPORT:         0
LIQUID_SOIL_MOISTURE_IMPORT:      0
VEGETATION_COVER_MIN_IMPORT:      0
VEGETATION_COVER_MAX_IMPORT:      0
SLOPE_TYPE_IMPORT:                0
SNOW_ALBEDO_MAX_IMPORT:           0

OROGRAPHY_EXPORT:                 0
T_SKIN_EXPORT:                    0
SOIL_MOIS_EXPORT:                 0
SNOW_DEPTH_EXPORT:                0
SOIL_T_EXPORT:                    0
DEEP_SOIL_T_EXPORT:               0
ROUGHNESS_EXPORT:                 0
CONV_CLOUD_COVER_EXPORT:          0
CONV_CLOUD_BASE_EXPORT:           0
CONV_CLOUD_TOP_EXPORT:            0
ALBEDO_VISIBLE_SCATTERED_EXPORT:  0
ALBEDO_VISIBLE_BEAM_EXPORT:       0
ALBEDO_NEARIR_SCATTERED_EXPORT:   0
ALBEDO_NEARIR_BEAM_EXPORT:        0
SEA_LEVEL_ICE_MASK_EXPORT:        0
VEGETATION_COVER_EXPORT:          0
CANOPY_WATER_EXPORT:              0
M10_WIND_FRACTION_EXPORT:         0
VEGETATION_TYPE_EXPORT:           0
SOIL_TYPE_EXPORT:                 0
ZENEITH_ANGLE_FACSF_EXPORT:       0
ZENEITH_ANGLE_FACWF_EXPORT:       0
UUSTAR_EXPORT:                    0
FFMM_EXPORT:                      0
FFHH_EXPORT:                      0
SEA_ICE_THICKNESS_EXPORT:         0
SEA_ICE_CONCENTRATION_EXPORT:     0
TPRCP_EXPORT:                     0
SRFLAG_EXPORT:                    0
ACTUAL_SNOW_DEPTH_EXPORT:         0
LIQUID_SOIL_MOISTURE_EXPORT:      0
VEGETATION_COVER_MIN_EXPORT:      0
VEGETATION_COVER_MAX_EXPORT:      0
SLOPE_TYPE_EXPORT:                0
SNOW_ALBEDO_MAX_EXPORT:           0

EOF

#
#   WARNING WARNING FILESTYLE "C" will not work for Component Ensembles!!!
#
#eval $PGM <<EOF $REDOUT$PGMOUT $REDERR$PGMERR
#totalview poe -a $PGM <<EOF $REDOUT$PGMOUT $REDERR$PGMERR
#
#eval $PGM <<EOF $REDOUT$PGMOUT $REDERR$PGMERR
cat  > gfs_namelist <<EOF
 &nam_mrf
  FHOUT=$FHOUT, FHMAX=$FHMAX, IGEN=$IGEN, DELTIM=$DELTIM,
  FHRES=$FHRES, FHZER=$FHZER, FHLWR=$FHLWR, FHSWR=$FHSWR,
  FHROT=$FHROT, FHDFI=$FHDFI, FHCYC=$FHCYC, LIOPE=$LIOPE,
  ntrac=$NTRAC,nxpt=1,nypt=2,jintmx=2,jcap=$JCAP,levs=$LEVS,lonf=$LONF,
  lonr=$LONR,latg=$LATG,latr=$LATR,ntoz=$NTOZ,ntcw=$NTCW,ncld=$NCLD,lsoil=$LSOIL,
  nmtvr=$NMTVR, ngptc=$NGPTC,hybrid=$HYBRID,tfiltc=$TFILTC,
  gen_coord_hybrid=$GEN_COORD_HYBRID,
  $FCSTVARS /
&SOIL_VEG
  LPARAM = .FALSE./
&NAMSFC
  FNGLAC="$FNGLAC",
  FNMXIC="$FNMXIC",
  FNTSFC="$FNTSFC",
  FNSNOC="$FNSNOC",
  FNZORC="$FNZORC",
  FNALBC="$FNALBC",
  FNAISC="$FNAISC",
  FNTG3C="$FNTG3C",
  FNVEGC="$FNVEGC",
  FNVETC="$FNVETC",
  FNSOTC="$FNSOTC",
  FNSMCC="$FNSMCC",
  FNMSKH="$FNMSKH",
  FNTSFA="$FNTSFA",
  FNACNA="$FNACNA",
  FNSNOA="$FNSNOA",
  FNVMNC="$FNVMNC",
  FNVMXC="$FNVMXC",
  FNSLPC="$FNSLPC",
  FNABSC="$FNABSC",
  LDEBUG=.false.,
  FSMCL(2)=$FSMCL2,
  FSMCL(3)=$FSMCL2,
  FSMCL(4)=$FSMCL2,
  FTSFS=$FTSFS,
  FAISS=$FAISS,
  FSNOL=$FSNOL,
  FSICL=$FSICL,
  FTSFL=99999,
  FAISL=99999,
  FSNOS=99999,
  FSICS=99999,
  $CYCLVARS /
EOF

cat gfs_namelist
ls -l $PGM

echo "executing $PGM at `date`"
eval $PGM 
echo "done executing $PGM at `date`"

export ERR=$?
export err=$ERR
exit $err