#!/bin/sh
################################################################################
####  UNIX Script Documentation Block
#                      .                                             .
# Script name:         global_analysis.sh
# Script description:  Makes a global spectral model analysis
#
# Author:        Mark Iredell       Org: NP23         Date: 1999-07-15
#
# Abstract: This script makes a global spectral model analysis.
#   Both the surface analysis and the upper-air analysis are performed.
#
# Script history log:
# 1999-05-01  Mark Iredell
# 2002-04-26  Russ Treadon   add global_angupdate processing
# 2003-08-05  Russ Treadon   add processing of hourly sigma and surface guess
# 2004-03-26  Russ Treadon   remove reference to IEEE TOVS-1b files, fix sfcg bug
# 2005-01-03  Cheng-Hsuan Lu :set FSMCL(2:4) = FSMCL2
#                             add FNVMNC,FNVMXC,FNSLPC,FNABSC
# 2005-07-22  Russ Treadon   add processing of NOAA-18 hirs4, amsua, and mhs data
# 2006-11-29  Russ Treadon   update for global_gsi
# 2007-10-18  Russ Treadon   add new options (not activated) to GSI namelist; 
#                            update CRTM related pieces for use with CRTM_GFS
#                            (revision 799); modify SBUVBF variable and 
#                            sbuvbufr OBS_INPUT "dsis" variable to process 
#                            version 8 (sbuv8_*) sbuv/2 ozone data.
# 2007-10-18  Diane Stokes   clean up processing of diagnostic files
#
# Usage:  global_analysis.sh SFCGES SIGGES GBIAS GSATANG
#                            SFCANL SIGANL ABIAS IGEN
#
#   Input script positional parameters:
#     1             Input surface guess
#                   defaults to $SFCGES; required
#     2             Input sigma guess
#                   defaults to $SIGGES; required
#     3             Input guess time dependent bias correction coefficients
#                   defaults to $GBIAS; required
#     4             Input guess angle dependent bias correction
#                   defaults to $GSATANG; required
#     5             Output surface analysis
#                   defaults to $SFCANL, then to ${COMOUT}/sfcanl
#     6             Output sigma analysis
#                   defaults to $SIGANL, then to ${COMOUT}/siganl
#     7             Output bias correction
#                   defaults to $ABIAS, then to ${COMOUT}/abias
#     8             Output generating code
#                   defaults to $IGEN, then to 0
#
#   Imported Shell Variables:
#     SFCGES        Input surface guess
#                   overridden by $1; required
#     SIGGES        Input sigma guess
#                   overridden by $2; required
#     GBIAS         Input guess bias correction
#                   overridden by $3; required
#     GSATANG       Input guess angle dependent bias correction
#                   overridden by $4; required
#     SFCANL        Output surface analysis
#                   overridden by $5; defaults to ${COMOUT}/sfcanl
#     SIGANL        Output sigma analysis
#                   overridden by $6; defaults to ${COMOUT}/siganl
#     ABIAS         Output bias correction
#                   overridden by $7; defaults to ${COMOUT}/abias
#     IGEN          Output generating code
#                   overridden by $8; defaults to 0
#     SFCG03        Surface guess valid at -03 hour
#                   defaults to ${COMOUT}/sfcf03; optional input
#     SFCG04        Surface guess valid at -04 hour
#                   defaults to ${COMOUT}/sfcf04; optional input
#     SFCG05        Surface guess valid at -05 hour
#                   defaults to ${COMOUT}/sfcf05; optional input
#     SFCG07        Surface guess valid at -07 hour
#                   defaults to ${COMOUT}/sfcf07; optional input
#     SFCG08        Surface guess valid at -08 hour
#                   defaults to ${COMOUT}/sfcf08; optional input
#     SFCG09        Surface guess valid at -09 hour
#                   defaults to ${COMOUT}/sfcf09; optional input
#     SIGG03        Sigma guess valid at -03 hour
#                   defaults to ${COMOUT}/sigf03; optional input
#     SIGG04        Sigma guess valid at -04 hour
#                   defaults to ${COMOUT}/sigf04; optional input
#     SIGG05        Sigma guess valid at -05 hour
#                   defaults to ${COMOUT}/sigf05; optional input
#     SIGG07        Sigma guess valid at -07 hour
#                   defaults to ${COMOUT}/sigf07; optional input
#     SIGG08        Sigma guess valid at -08 hour
#                   defaults to ${COMOUT}/sigf08; optional input
#     SIGG09        Sigma guess valid at -09 hour
#                   defaults to ${COMOUT}/sigf09; optional input
#     GINCIN        Input increment to guess
#                   defaults to ${COMOUT}/gesfile_in; optional
#     BIASIN        Input bias correction to guess
#                   defaults to ${COMOUT}/biascor_in; optional
#     RADSTAT       Output radiance assimilation statistics
#                   defaults to ${COMIN}/${PREINP}radstat
#     GSISTAT       Output gsi (obs-ges), qc, and iteration statistics
#                   defaults to ${COMIN}/${PREINP}gsistat
#     PCPSTAT       Output precipitation assimilation statistics
#                   defaults to ${COMIN}/${PREINP}pcpstat
#     CNVSTAT       Output conventional observation assimilation statistics
#                   defaults to ${COMIN}/${PREINP}cnvstat
#     OZNSTAT       Output ozone observation assimilation statistics
#                   defaults to ${COMIN}/${PREINP}oznstat
#     GINCOUT       Output increment to guess
#                   defaults to ${COMIN}/${PREINP}gesfile_out
#     BIASOUT       Output bias correction to guess
#                   defaults to ${COMIN}/${PREINP}biascor_out
#     FIXGLOBAL     Directory for global fixed files
#                   defaults to /nwprod/fix
#     EXECGLOBAL    Directory for global executables
#                   defaults to /nwprod/exec
#     USHGLOBAL     Directory for global scripts
#                   defaults to /nwprod/ush
#     DATA          working directory
#                   (if nonexistent will be made, used and deleted)
#                   defaults to current working directory
#     COMIN         input directory
#                   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
#     PREINP        Prefix to add to input observation files
#                   defaults to none
#     SUFINP        Suffix to add to input observation files
#                   defaults to none
#     NCP           Copy command
#                   defaults to cp
#     SIGHDR        Command to read sigma header
#                   defaults to ${EXECGLOBAL}/global_sighdr$XC
#     SFCHDR        Command to read surface header
#                   defaults to ${EXECGLOBAL}/global_sfchdr$XC
#     CYCLEXEC      Surface cycle executable
#                   defaults to ${EXECGLOBAL}/global_cycle$XC
#     GSIEXEC       Spectral analysis executable
#                   defaults to ${EXECGLOBAL}/global_gsi$XC
#     ANGUPDATEXEC  Radiance angle dependent bias correction update executable
#                   defaults to ${EXECGLOBAL}/global_angupdate$XC
#     CHGRESSH      Change resolution script
#                   (needed only if model and analysis grids differ)
#                   defaults to ${USHGLOBAL}/global_chgres.sh
#     CYCLESH       Surface cycle script
#                   defaults to ${USHGLOBAL}/global_cycle.sh
#     BERROR        Input background error file
#                   defaults to ${FIXGLOBAL}/global_berror.l${LEVS}y${NLAT}.sig.f77
#     SATANGL       Input satellite angle bias file
#                   defaults to ${FIXGLOBAL}/global_satangbias.txt
#     SATINFO       Input satellite information file
#                   defaults to ${FIXGLOBAL}/global_satinfo.txt
#     RTMFIX        Input directory containing sensor specific coefficients
#                   defaults to ${FIXGLOBAL}/crtm_gfs
#     RTMEMIS       Input satellite emissivity coefficients
#                   defaults to ${RTMFIX}/EmisCoeff/Big_Endian/EmisCoeff.bin
#     RTMAERO       Input radiative transfer model aerosol coefficients
#                   defaults to ${RTMFIX}/AerosolCoeff/Big_Endian/AerosolCoeff.bin
#     RTMCLDS       Input radiative transfer model cloud coefficients
#                   defaults to ${RTMFIX}/CloudCoeff/Big_Endian/CloudCoeff.bin
#     CONVINFO      Input conventional observation information file
#                   defaults to ${FIXGLOBAL}/global_convinfo.txt
#     OZINFO        Input ozone information file
#                   defaults to ${FIXGLOBAL}/global_ozone.txt
#     PCPINFO       Input precipitation information file
#                   defaults to ${FIXGLOBAL}/global_pcpinfo.txt
#     PREPQC        Input QC-ed observation BUFR file
#                   defaults to ${COMIN}/${PREINP}prepbufr${SUFINP}
#     GSNDBF        Input GOES sounder radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}goesnd.tm00.bufr_d${SUFINP}
#     GSNDBF1       Input GOES 1x1 sounder radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}goesfv.tm00.bufr_d${SUFINP}
#     B1HRS2        Input HIRS/2 radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bhrs2.tm00.bufr_d${SUFINP}
#     B1MSU         Input MSU radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bmsu.tm00.bufr_d${SUFINP}
#     B1HRS3        Input HIRS/3 radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bhrs3.tm00.bufr_d${SUFINP}
#     B1HRS4        Input HIRS/4 radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bhrs4.tm00.bufr_d${SUFINP}
#     B1AMUA        Input AMSU/A radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bamua.tm00.bufr_d${SUFINP}
#     B1AMUB        Input AMSU/B radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bamub.tm00.bufr_d${SUFINP}
#     B1MHS         Input MHS radiance file (bufr format)
#                   defaults to ${COMIN}/${PREINP}1bmhs.tm00.bufr_d${SUFINP}
#     AIRSBF        Input AIRS radiace file (bufr format)
#                   defaults to ${COMIN}/${PREINP}airs.tm00.bufr_d${SUFINP}
#     AMSREBF       Input AMSRE radiace file (bufr format)
#                   defaults to ${COMIN}/${PREINP}amsre.tm00.bufr_d${SUFINP}
#     SSMITBF       Input AIRS radiace file (bufr format)
#                   defaults to ${COMIN}/${PREINP}ssmit.tm00.bufr_d${SUFINP}
#     SBUVBF        Input NOAA POES SBUV ozone retrieval file
#                   defaults to ${COMIN}/${PREINP}osbuv8.tm00.bufr_d${SUFINP}
#     SMIPCP        Input SSM/I precipitation rate file
#                   defaults to ${COMIN}/${PREINP}spssmip.tm00.bufr_d${SUFINP}
#     TMIPCP        Input TMI precipitation rate file
#                   defaults to ${COMIN}/${PREINP}sptrmm.tm00.bufr_d${SUFINP}
#     GPSROBF       Input GPS radio occultation data
#                   defaults to ${COMIN}/${PREINP}gpsro.tm00.bufr_d${SUFINP}
#     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
#     JCAP          Spectral truncation
#                   defaults to the value in the input sigma file header
#     LEVS          Number of levels
#     DELTIM        Timestep in seconds
#                   defaults to 3600/($JCAP/20)
#     CDATE         Current analysis date in yyyymmddhh format
#                   defaults to the value in the input surface file header
#     LATB          Number of latitudes in surface cycling
#                   defaults to the value in the input surface file header
#     LONB          Number of longitudes in surface cycling
#                   defaults to the value in the input surface file header
#     LSOIL         Number of soil layers
#                   defaults to 2
#     FSMCL2        Scale in days to relax to soil moisture climatology
#                   defaults to 60
#     DELTSFC       Cycling frequency in hours
#                   defaults to forecast hour of $SFCGES
#     LATA          Number of latitudes in spectral analysis
#                   defaults to $LATB
#     LONA          Number of longitudes in spectral analysis
#                   defaults to $LONB
#     NSIG1         Number of levels per MPI task
#                   (Important: number of MPI tasks must be 5*$LEVS/$NSIG1+2)
#                   defaults to 1
#     CYCLVARS      Other namelist inputs to the cycle executable
#                   defaults to none set
#     GSIVARS       Other namelist inputs to the analysis executable
#                   defaults to none set
#     SATVARS       Other namelist input to analysis data usage namelist
#                   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
#                   ('C' to copy to/from $DATA, 'L' for symbolic links in $DATA,
#                    'X' to use XLFUNIT or symbolic links where appropriate)
#                   defaults to 'X'
#     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
#                  $CHGRESSH
#
#     programs   : $CYCLEXEC
#                  $GSIEXEC
#                  $ANGUPDATEXEC
#
#     fixed data : $BERROR
#                  $SATANGL
#                  $SATINFO
#                  $RTMFIX
#                  $RTMEMIS
#                  $RTMAERO
#                  $RTMCLDS
#                  $CONVINFO
#                  $OZINFO
#                  $PCPINFO
#
#     input data : $SFCGES
#                  $SIGGES
#                  $GBIAS
#                  $GSATANG
#                  $SFCG03
#                  $SFCG04
#                  $SFCG05
#                  $SFCG07
#                  $SFCG08
#                  $SFCG09
#                  $SIGG03
#                  $SIGG04
#                  $SIGG05
#                  $SIGG07
#                  $SIGG08
#                  $SIGG09
#                  $GINCIN
#                  $BIASIN
#                  $FNTSFA
#                  $FNACNA
#                  $FNSNOA
#                  $PREPQC
#                  $GSNDBF
#                  $GSNDBF1
#                  $B1HRS2
#                  $B1MSU
#                  $B1HRS3
#                  $B1HRS4
#                  $B1AMUA
#                  $B1AMUB
#                  $B1MHS
#                  $AIRSBF
#                  $AMSREBF
#                  $SSMITBF
#                  $SBUVBF
#                  $SMIPCP
#                  $TMIPCP
#                  $GPSROBF
#
#     output data: $SFCANL
#                  $SIGANL
#                  $ABIAS
#                  $RADSTAT
#                  $GSISTAT
#                  $PCPSTAT
#                  $CNVSTAT
#                  $OZNSTAT
#                  $GINCOUT
#                  $BIASOUT
#                  $PGMOUT
#                  $PGMERR
#
# 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 SFCGES=${1:-${SFCGES:?}}
export SIGGES=${2:-${SIGGES:?}}
export GBIAS=${3:-${GBIAS:?}}
export GSATANG=${4:-${GSATANG:?}}
export SFCANL=${5:-${SFCANL}}
export SIGANL=${6:-${SIGANL}}
export ABIAS=${7:-${ABIAS}}
export IGEN=${8:-${IGEN:-0}}
#  Directories.
export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix}
export EXECGLOBAL=${EXECGLOBAL:-/nwprod/exec}
export USHGLOBAL=${USHGLOBAL:-/nwprod/ush}
export utilscript=${utilscript:-/nwprod/util/ush}
export DATA=${DATA:-$(pwd)}
export COMIN=${COMIN:-$(pwd)}
export COMOUT=${COMOUT:-$(pwd)}
#  Filenames.
export XC=${XC}
export PREINP=${PREINP}
export SUFINP=${SUFINP}
export SIGHDR=${SIGHDR:-${EXECGLOBAL}/global_sighdr$XC}
export SFCHDR=${SFCHDR:-${EXECGLOBAL}/global_sfchdr$XC}
export JCAP=${JCAP:-$($SIGHDR $SIGGES JCAP||echo 0)}
export LATB=${LATB:-$($SFCHDR $SFCGES LATB||echo 0)}
export LONB=${LONB:-$($SFCHDR $SFCGES LONB||echo 0)}
export LATA=${LATA:-$LATB}
export LONA=${LONA:-$LONB}
export NLAT=${NLAT:-$(($LATA+2))}
export LEVS=${LEVS:-$($SIGHDR $SIGGES LEVS||echo 0)}
export DELTIM=${DELTIM:-$((3600/($JCAP/20)))}
export CYCLEXEC=${CYCLEXEC:-${EXECGLOBAL}/global_cycle$XC}
export GSIEXEC=${GSIEXEC:-${EXECGLOBAL}/global_gsi$XC}
export ANGUPDATEXEC=${ANGUPDATEXEC:-${EXECGLOBAL}/global_angupdate$XC}
export CHGRESSH=${CHGRESSH:-${USHGLOBAL}/global_chgres.sh}
export CYCLESH=${CYCLESH:-${USHGLOBAL}/global_cycle.sh}
export BERROR=${BERROR:-${FIXGLOBAL}/global_berror.l${LEVS}y${NLAT}.f77}
export SATANGL=${SATANGL:-${FIXGLOBAL}/global_satangbias.txt}
export SATINFO=${SATINFO:-${FIXGLOBAL}/global_satinfo.txt}
export RTMFIX=${RTMFIX:-${FIXGLOBAL}/crtm_gfs}

export RTMEMIS=${RTMEMIS:-${RTMFIX}/EmisCoeff/Big_Endian/EmisCoeff.bin}
export RTMAERO=${RTMAERO:-${RTMFIX}/AerosolCoeff/Big_Endian/AerosolCoeff.bin}
export RTMCLDS=${RTMCLDS:-${RTMFIX}/CloudCoeff/Big_Endian/CloudCoeff.bin}
export CONVINFO=${CONVINFO:-${FIXGLOBAL}/global_convinfo.txt}
export OZINFO=${OZINFO:-${FIXGLOBAL}/global_ozinfo.txt}
export PCPINFO=${PCPINFO:-${FIXGLOBAL}/global_pcpinfo.txt}

export OBERROR=${OBERROR:-${FIXGLOBAL}/prepobs_errtable.global}
export PREPQC=${PREPQC:-${COMIN}/${PREINP}prepbufr${SUFINP}}
export GSNDBF=${GSNDBF:-${COMIN}/${PREINP}goesnd.tm00.bufr_d${SUFINP}}
export GSNDBF1=${GSNDBF1:-${COMIN}/${PREINP}goesfv.tm00.bufr_d${SUFINP}}
export B1HRS2=${B1HRS2:-${COMIN}/${PREINP}1bhrs2.tm00.bufr_d${SUFINP}}
export B1MSU=${B1MSU:-${COMIN}/${PREINP}1bmsu.tm00.bufr_d${SUFINP}}
export B1HRS3=${B1HRS3:-${COMIN}/${PREINP}1bhrs3.tm00.bufr_d${SUFINP}}
export B1HRS4=${B1HRS4:-${COMIN}/${PREINP}1bhrs4.tm00.bufr_d${SUFINP}}
export B1AMUA=${B1AMUA:-${COMIN}/${PREINP}1bamua.tm00.bufr_d${SUFINP}}
export B1AMUB=${B1AMUB:-${COMIN}/${PREINP}1bamub.tm00.bufr_d${SUFINP}}
export B1MHS=${B1MHS:-${COMIN}/${PREINP}1bmhs.tm00.bufr_d${SUFINP}}
export AIRSBF=${AIRSBF:-${COMIN}/${PREINP}airsev.tm00.bufr_d${SUFINP}}
export AMSREBF=${AMSREBF:-${COMIN}/${PREINP}amsre.tm00.bufr_d${SUFINP}}
export SSMITBF=${SSMITBF:-${COMIN}/${PREINP}ssmit.tm00.bufr_d${SUFINP}}
export SBUVBF=${SBUVBF:-${COMIN}/${PREINP}osbuv8.tm00.bufr_d${SUFINP}}
export SMIPCP=${SMIPCP:-${COMIN}/${PREINP}spssmi.tm00.bufr_d${SUFINP}}
export TMIPCP=${TMIPCP:-${COMIN}/${PREINP}sptrmm.tm00.bufr_d${SUFINP}}
export GPSROBF=${GPSROBF:-${COMIN}/${PREINP}gpsro.tm00.bufr_d${SUFINP}}
export GINCIN=${GINCIN:-${COMOUT}/gesfile_in}
export BIASIN=${BIASIN:-${COMOUT}/biascor_in}
export SFCG03=${SFCG03:-${COMOUT}/sfcf03}
export SFCG04=${SFCG04:-${COMOUT}/sfcf04}
export SFCG05=${SFCG05:-${COMOUT}/sfcf05}
export SFCG07=${SFCG07:-${COMOUT}/sfcf07}
export SFCG08=${SFCG08:-${COMOUT}/sfcf08}
export SFCG09=${SFCG09:-${COMOUT}/sfcf09}
export SIGG03=${SIGG03:-${COMOUT}/sigf03}
export SIGG04=${SIGG04:-${COMOUT}/sigf04}
export SIGG05=${SIGG05:-${COMOUT}/sigf05}
export SIGG07=${SIGG07:-${COMOUT}/sigf07}
export SIGG08=${SIGG08:-${COMOUT}/sigf08}
export SIGG09=${SIGG09:-${COMOUT}/sigf09}
export SFCANL=${SFCANL:-${COMIN}/${PREINP}sfcanl}
export SIGANL=${SIGANL:-${COMIN}/${PREINP}sanl}
export ABIAS=${ABIAS:-${COMIN}/${PREINP}abias}
export GINCOUT=${GINCOUT:-${COMIN}/${PREINP}gesfile_out}
export BIASOUT=${BIASOUT:-${COMIN}/${PREINP}biascor_out}
export RADSTAT=${RADSTAT:-${COMIN}/${PREINP}radstat}
export GSISTAT=${GSISTAT:-${COMIN}/${PREINP}gsistat}
export PCPSTAT=${PCPSTAT:-${COMIN}/${PREINP}pcpstat}
export CNVSTAT=${CNVSTAT:-${COMIN}/${PREINP}cnvstat}
export OZNSTAT=${OZNSTAT:-${COMIN}/${PREINP}oznstat}
export SATANGO=${SATANGO:-${COMIN}/${PREINP}satang}
export INISCRIPT=${INISCRIPT}
export ERRSCRIPT=${ERRSCRIPT:-'eval [[ $err = 0 ]]'}
export LOGSCRIPT=${LOGSCRIPT}
export ENDSCRIPT=${ENDSCRIPT}
#  Other variables.
export CDATE=${CDATE:-$($SFCHDR $SFCGES VDATE||echo 0)}
export LSOIL=${LSOIL:-2}
export FSMCL2=${FSMCL2:-60}
export DELTSFC=${DELTSFC:-$($SFCHDR $SFCGES FHOUR||echo 0)}
export CYCLVARS=${CYCLVARS}
export SETUP=${SETUP:-""}
export GRIDOPTS=${GRIDOPTS:-""}
export BKGVERR=${BKGVERR:-""}
export ANBKGERR=${ANBKGERR:-""}
export JCOPTS=${JCOPTS:-""}
export STRONGOPTS=${STRONGOPTS:-""}
export OBSQC=${OBSQC:-""}
export OBSINPUT=${OBSINPUT:-""}
export SUPERRAD=${SUPERRAD:-""}
export SINGLEOB=${SINGLEOB:-""}
export SETUPANG=${SETUPANG:-""}
export OBSINPUTANG=${OBSINPUTANG:-""}
export NTHREADS=${NTHREADS:-1}
export NTHSTACK=${NTHSTACK:-64000000}
export FILESTYLE=${FILESTYLE:-'X'}
export PGMOUT=${PGMOUT:-${pgmout:-'&1'}}
export PGMERR=${PGMERR:-${pgmerr:-'&2'}}
export OBERRFLAG=${OBERRFLAG:-.false.}
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

################################################################################
#  Update surface guess file to produce surface analysis

($CYCLESH  $SFCGES $SFCANL)&

################################################################################
#  If necessary, change resolution of surface guess files.

## NOTE:  10/01/2003, r.treadon
##    To prevent misleading error messages, copy/process 4,5,7,8 hour
##    forecasts only if files exist.

if [[ $LATA -eq $LATB && $LONA -eq $LONB ]]
then
   ${NCP:-cp} $SFCG03 sfcf03a

   if [[ -s $SFCG04 ]]; then
      ${NCP:-cp} $SFCG04 sfcf04a
   fi
   if [[ -s $SFCG05 ]]; then
     ${NCP:-cp} $SFCG05 sfcf05a
   fi
   ${NCP:-cp} $SFCGES sfcf06a

   if [[ -s $SFCG07 ]]; then
      ${NCP:-cp} $SFCG07 sfcf07a
   fi
   if [[ -s $SFCG08 ]]; then
      ${NCP:-cp} $SFCG08 sfcf08a
   fi

   ${NCP:-cp} $SFCG09 sfcf09a
else
   (DATAHOLD=$DATA
   export DATA=$DATAHOLD/chgres03
   mkdir $DATA
   cd $DATA
   sh $utilscript/setup.sh
   $CHGRESSH "" $SFCG03 "" sfcf03a $JCAP $LEVS $LONA $LATA
   mv $DATA/sfcf03a $DATAHOLD/.
   export DATA=$DATAHOLD)&

   if [[ -s $SFCG04 ]]; then
      (DATAHOLD=$DATA
      export DATA=$DATAHOLD/chgres04
      mkdir $DATA
      cd $DATA
      sh $utilscript/setup.sh
      $CHGRESSH "" $SFCG04 "" sfcf04a $JCAP $LEVS $LONA $LATA
      mv $DATA/sfcf04a $DATAHOLD/.
      export DATA=$DATAHOLD)&
   fi
   if [[ -s $SFCG05 ]]; then
      (DATAHOLD=$DATA
      export DATA=$DATAHOLD/chgres05
      mkdir $DATA
      cd $DATA
      sh $utilscript/setup.sh
      $CHGRESSH "" $SFCG05 "" sfcf05a $JCAP $LEVS $LONA $LATA
      mv $DATA/sfcf05a $DATAHOLD/.
      export DATA=$DATAHOLD)&
   fi

   (DATAHOLD=$DATA
   export DATA=$DATAHOLD/chgres06
   mkdir $DATA
   cd $DATA
   sh $utilscript/setup.sh
   $CHGRESSH "" $SFCGES "" sfcf06a $JCAP $LEVS $LONA $LATA
   mv $DATA/sfcf06a $DATAHOLD/.
   export DATA=$DATAHOLD)&

   if [[ -s $SFCG07 ]]; then
      (DATAHOLD=$DATA
      export DATA=$DATAHOLD/chgres07
      mkdir $DATA
      cd $DATA
      sh $utilscript/setup.sh
      $CHGRESSH "" $SFCG07 "" sfcf07a $JCAP $LEVS $LONA $LATA
      mv $DATA/sfcf07a $DATAHOLD/.
      export DATA=$DATAHOLD)&
   fi
   if [[ -s $SFCG08 ]]; then
      (DATAHOLD=$DATA
      export DATA=$DATAHOLD/chgres08
      mkdir $DATA
      cd $DATA
      sh $utilscript/setup.sh
      $CHGRESSH "" $SFCG08 "" sfcf08a $JCAP $LEVS $LONA $LATA
      mv $DATA/sfcf08a $DATAHOLD/.
      export DATA=$DATAHOLD)&
   fi

   (DATAHOLD=$DATA
   export DATA=$DATAHOLD/chgres09
   mkdir $DATA
   cd $DATA
   sh $utilscript/setup.sh
   $CHGRESSH "" $SFCG09 "" sfcf09a $JCAP $LEVS $LONA $LATA
   mv $DATA/sfcf09a $DATAHOLD/.
   export DATA=$DATAHOLD)&

fi

wait

################################################################################
#  Make atmospheric analysis
export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK"
export PGM=$DATA/$(basename $GSIEXEC)
export pgm=$PGM
$LOGSCRIPT

rm berror_stats satbias_angle satinfo *SpcCoeff.bin *TauCoeff.bin EmisCoeff.bin
rm AerosolCoeff.bin CloudCoeff.bin convinfo ozinfo pcpinfo errtable
rm prepbufr gsndrbufr gsnd1bufr hirs2bufr msubufr hirs3bufr hirs4bufr
rm amsuabufr amsubbufr mhsbufr sbuvbufr ssmirrbufr tmirrbufr airsbufr
rm amsrebufr ssmitbufr gpsrobufr
rm satbias_in satbias_ang.in 
rm sfcf03 sfcf04 sfcf05 sfcf06 sfcf07 sfcf08 sfcf09
rm sigf03 sigf04 sigf05 sigf06 sigf07 sigf08 sigf09 siganl
rm gesfile_in gesfiles_out satbias_in satbias_ang.in satbias_out
rm prepbufr hirs2bufr msubufr hirs3bufr hirs4bufr amsuabufr
rm amsubbufr mhsbufr airsbufr sbuvbufr ssmirrbufr tmirrbufr
rm amsrebufr ssmitbufr gsndrbufr gsnd1bufr

${NCP:-cp} $GSIEXEC $DATA
if [[ $FILESTYLE = 'C' ]]
then
   # Fixed fields
   ${NCP:-cp} $BERROR   berror_stats
   ${NCP:-cp} $SATANGL  satbias_angle
   ${NCP:-cp} $SATINFO  satinfo
   ${NCP:-cp} $RTMEMIS  EmisCoeff.bin
   ${NCP:-cp} $RTMAERO  AerosolCoeff.bin
   ${NCP:-cp} $RTMCLDS  CloudCoeff.bin
   ${NCP:-cp} $CONVINFO convinfo
   ${NCP:-cp} $OZINFO   ozinfo
   ${NCP:-cp} $PCPINFO  pcpinfo
   ${NPC:-cp} $OBERROR  errtable

   # CRTM Spectral and Transmittance coefficients
   nsatsen=`cat satinfo | wc -l`
   isatsen=1
   while [[ $isatsen -le $nsatsen ]]; do
      flag=`head -n $isatsen satinfo | tail -1 | cut -c1-1`
      if [[ "$flag" != "!" ]]; then
         satsen=`head -n $isatsen satinfo | tail -1 | cut -f 2 -d" "`
         spccoeff=${satsen}.SpcCoeff.bin
         if  [[ ! -s $spccoeff ]]; then
            ${NPC:-cp} $RTMFIX/SpcCoeff/No_AC/Big_Endian/$spccoeff $spccoeff
            ${NPC:-cp} $RTMFIX/TauCoeff/Big_Endian/${satsen}.TauCoeff.bin ${satsen}.TauCoeff.bin
         fi
      fi
      isatsen=` expr $isatsen + 1 `
   done


   # Observational data
   ${NCP:-cp} $PREPQC   prepbufr
   ${NCP:-cp} $GSNDBF   gsndrbufr
   ${NCP:-cp} $GSNDBF1  gsnd1bufr
   ${NCP:-cp} $B1HRS2   hirs2bufr
   ${NCP:-cp} $B1MSU    msubufr
   ${NCP:-cp} $B1HRS3   hirs3bufr
   ${NCP:-cp} $B1HRS4   hirs4bufr
   ${NCP:-cp} $B1AMUA   amsuabufr
   ${NCP:-cp} $B1AMUB   amsubbufr
   ${NCP:-cp} $B1MHS    mhsbufr
   ${NCP:-cp} $SBUVBF   sbuvbufr
   ${NCP:-cp} $SMIPCP   ssmirrbufr
   ${NCP:-cp} $TMIPCP   tmirrbufr
   ${NCP:-cp} $AIRSBF   airsbufr
   ${NCP:-cp} $AMSREBF  amsrebufr
   ${NCP:-cp} $SSMITBF  ssmitbufr
   ${NCP:-cp} $GPSROBF  gpsrobufr

   # Required guess fields
   ${NCP:-cp} $GBIAS    satbias_in
   ${NCP:-cp} $GSATANG  satbias_ang.in
   ${NCP:-cp} $SIGG03   sigf03
   ${NCP:-cp} $SIGGES   sigf06
   ${NCP:-cp} $SIGG09   sigf09
   ${NCP:-cp} sfcf03a   sfcf03
   ${NCP:-cp} sfcf06a   sfcf06
   ${NCP:-cp} sfcf09a   sfcf09

## NOTE:  10/01/2003, r.treadon
##    (1) While the global_gsi can handle hourly forecast
##        files, we do not currently utilize hourly input.
##        To prevent misleading error messages in operations, 
##        test for file existence before cp
##
##    (2) File gesfile_in is not currently used in the global_gsi
##        To prevent misleading error messages in operations, 
##        test for file existence before cp
##
##    (3) File biascor_in is not currently used in the global_gsi
##        To prevent misleading error messages in operations,
##        test for file existence before cp


   if [[ -s $SIGG04 ]]; then 
      ${NCP:-cp} $SIGG04   sigf04
   fi
   if [[ -s $SIGG05 ]]; then
      ${NCP:-cp} $SIGG05   sigf05
   fi
   if [[ -s $SIGG07 ]]; then
      ${NCP:-cp} $SIGG07   sigf07
   fi
   if [[ -s $SIGG08 ]]; then
      ${NCP:-cp} $SIGG08   sigf08
   fi

   if [[ -s sfcf04a ]]; then
      ${NCP:-cp} sfcf04a   sfcf04
   fi
   if [[ -s sfcf05a ]]; then
      ${NCP:-cp} sfcf05a   sfcf05
   fi
   if [[ -s sfcf07a ]]; then
      ${NCP:-cp} sfcf07a   sfcf07
   fi
   if [[ -s sfcf08a ]]; then
      ${NCP:-cp} sfcf08a   sfcf08
   fi
   if [[ -s $GINCIN ]]; then
      ${NCP:-cp} $GINCIN   gesfile_in
   fi
   if [[ -s $BIASIN ]]; then
      ${NCP:-cp} $BIASIN   biascor_in
   fi

else

## NOTE:  10/01/2003, r.treadon
##    Do not add above file existence tests since
##    we do not link to files in operations


   # Fixed fields
   ln -fs $BERROR   berror_stats
   ln -fs $SATANGL  satbias_angle
   ln -fs $SATINFO  satinfo
   ln -fs $RTMEMIS  EmisCoeff.bin
   ln -fs $RTMAERO  AerosolCoeff.bin
   ln -fs $RTMCLDS  CloudCoeff.bin
   ln -fs $CONVINFO convinfo
   ln -fs $OZINFO   ozinfo
   ln -fs $PCPINFO  pcpinfo

   # CRTM Spectral and Transmittance coefficients
   nsatsen=`cat satinfo | wc -l`
   isatsen=1
   while [[ $isatsen -le $nsatsen ]]; do
      flag=`head -n $isatsen satinfo | tail -1 | cut -c1-1`
      if [[ "$flag" != "!" ]]; then
         satsen=`head -n $isatsen satinfo | tail -1 | cut -f 2 -d" "`
         spccoeff=${satsen}.SpcCoeff.bin
         if  [[ ! -s $spccoeff ]]; then
            ln -fs $RTMFIX/SpcCoeff/No_AC/Big_Endian/$spccoeff $spccoeff
            ln -fs $RTMFIX/TauCoeff/Big_Endian/${satsen}.TauCoeff.bin ${satsen}.TauCoeff.bin
         fi
      fi
      isatsen=` expr $isatsen + 1 `
   done


   # Observational data
   ln -fs $PREPQC   prepqcbufr
   ln -fs $GSNDBF   gsndrbufr
   ln -fs $GSNDBF1  gsnd1bufr
   ln -fs $B1HRS2   hirs2bufr
   ln -fs $B1MSU    msubufr
   ln -fs $B1HRS3   hirs3bufr
   ln -fs $B1HRS4   hirs4bufr
   ln -fs $B1AMUA   amsuabufr
   ln -fs $B1AMUB   amsubbufr
   ln -fs $B1MHS    mhsbufr
   ln -fs $AIRSBF   airsbufr
   ln -fs $AMSREBF  amsrebufr
   ln -fs $SSMITBF  ssmitbufr
   ln -fs $SBUVBF   sbuvbufr
   ln -fs $SMIPCP   ssmirrbufr
   ln -fs $TMIPCP   tmirrbufr
   ln -fs $GPSROBF  gpsrobufr

   # Guess fields
   ln -fs $GBIAS    satbias_in
   ln -fs $GSATANG  satbias_ang.in
   ln -fs $GINCIN   gesfile_in
   ln -fs $BIASIN   biascor_in
   ln -fs $SIGG03   sigf03
   ln -fs $SIGG04   sigf04
   ln -fs $SIGG05   sigf05
   ln -fs $SIGGES   sigf06
   ln -fs $SIGG07   sigf07
   ln -fs $SIGG08   sigf08
   ln -fs $SIGG09   sigf09
   ln -fs sfcf03a   sfcf03
   ln -fs sfcf04a   sfcf04
   ln -fs sfcf05a   sfcf05
   ln -fs sfcf06a   sfcf06
   ln -fs sfcf07a   sfcf07
   ln -fs sfcf08a   sfcf08
   ln -fs sfcf09a   sfcf09
   # Output files
   ln -fs $SIGANL   siganl
   ln -fs $ABIAS    satbias_out
   ln -fs $GINCOUT  gesfile_out
   ln -fs $BIASOUT  biascor_out
fi


# Run global_gsi
eval $PGM <<EOF $REDOUT$PGMOUT $REDERR$PGMERR
 &SETUP
   miter=2,niter(1)=100,niter(2)=150,
   write_diag(1)=.true.,write_diag(2)=.false.,write_diag(3)=.true.,
   qoption=2,
   gencode=$IGEN,factqmin=0.005,factqmax=0.005,deltim=$DELTIM,
   ndat=59,npred=5,iguess=-1,
   oneobtest=.false.,retrieval=.false.,l_foto=.false.,
   use_pbl=.false.,
   $SETUP
 /
 &GRIDOPTS
   JCAP=$JCAP,NLAT=$NLAT,NLON=$LONA,nsig=$LEVS,hybrid=.true.,
   regional=.false.,nlayers(63)=3,nlayers(64)=6,
   $GRIDOPTS
 /
 &BKGERR
   as=0.6,0.6,0.75,0.75,0.75,0.75,1.0,1.0
   vs=0.7,
   hzscl=1.7,0.8,0.5,
   hswgt=0.45,0.3,0.25,
   bw=0.0,norsp=4,
   bkgv_flowdep=.false.,bkgv_rewgtfct=1.5
   $BKGVERR
 /
 &ANBKGERR
   anisotropic=.false.,
   $ANBKGERR
 /
 &JCOPTS
   jcterm=.false.,jcdivt=.false.,bamp_ext1=2.5e12,bamp_ext2=5.0e11,
   bamp_int1=2.5e13,bamp_int2=2.5e12, 
   $JCOPTS
 /
 &STRONGOPTS
   jcstrong=.true.,nstrong=1,nvmodes_keep=8,period_max=6.,period_width=1.5,
   jcstrong_option=2,baldiag_full=.true.,baldiag_inc=.true.,
   $STRONGOPTS
 /
 &OBSQC
   dfact=0.75,dfact1=3.0,noiqc=.false.,perturb_obs=.false.,oberrflg=.false.,
   perturb_fact=0.1,c_varqc=0.02,
   $OBSQC
 /
 &OBS_INPUT
   dmesh(1)=180.0,dmesh(2)=145.0,dmesh(3)=240.0,dmesh(4)=160.0,dmesh(5)=180.0,time_window_max=3.0,
   dfile(01)='prepbufr',  dtype(01)='ps',        dplat(01)=' ',         dsis(01)='ps',                  dval(01)=1.0,  dthin(01)=0,
   dfile(02)='prepbufr'   dtype(02)='t',         dplat(02)=' ',         dsis(02)='t',                   dval(02)=1.0,  dthin(02)=0,
   dfile(03)='prepbufr',  dtype(03)='q',         dplat(03)=' ',         dsis(03)='q',                   dval(03)=1.0,  dthin(03)=0,
   dfile(04)='prepbufr',  dtype(04)='pw',        dplat(04)=' ',         dsis(04)='pw',                  dval(04)=1.0,  dthin(04)=0,
   dfile(05)='prepbufr',  dtype(05)='uv',        dplat(05)=' ',         dsis(05)='uv',                  dval(05)=1.0,  dthin(05)=0,
   dfile(06)='prepbufr',  dtype(06)='spd',       dplat(06)=' ',         dsis(06)='spd',                 dval(06)=1.0,  dthin(06)=0,
   dfile(07)='prepbufr',  dtype(07)='dw',        dplat(07)=' ',         dsis(07)='dw',                  dval(07)=1.0,  dthin(07)=0,
   dfile(08)='radarbufr', dtype(08)='rw',        dplat(08)=' ',         dsis(08)='rw',                  dval(08)=1.0,  dthin(08)=0,
   dfile(09)='prepbufr',  dtype(09)='sst',       dplat(09)=' ',         dsis(09)='sst',                 dval(09)=1.0,  dthin(09)=0,
   dfile(10)='gpsrobufr', dtype(10)='gps_ref',   dplat(10)=' ',         dsis(10)='gps_ref',             dval(10)=1.0,  dthin(10)=0,
   dfile(11)='ssmirrbufr',dtype(11)='pcp_ssmi',  dplat(11)='dmsp',      dsis(11)='pcp_ssmi',            dval(11)=1.0,  dthin(11)=-1,
   dfile(12)='tmirrbufr', dtype(12)='pcp_tmi',   dplat(12)='trmm',      dsis(12)='pcp_tmi',             dval(12)=1.0,  dthin(12)=-1,
   dfile(13)='sbuvbufr',  dtype(13)='sbuv2',     dplat(13)='n16',       dsis(13)='sbuv8_n16',           dval(13)=1.0,  dthin(13)=0,
   dfile(14)='sbuvbufr',  dtype(14)='sbuv2',     dplat(14)='n17',       dsis(14)='sbuv8_n17',           dval(14)=1.0,  dthin(14)=0,
   dfile(15)='sbuvbufr',  dtype(15)='sbuv2',     dplat(15)='n18',       dsis(15)='sbuv8_n18',           dval(15)=1.0,  dthin(15)=0,
   dfile(16)='hirs2bufr', dtype(16)='hirs2',     dplat(16)='n14',       dsis(16)='hirs2_n14',           dval(16)=6.0,  dthin(16)=1,
   dfile(17)='hirs3bufr', dtype(17)='hirs3',     dplat(17)='n16',       dsis(17)='hirs3_n16',           dval(17)=0.0,  dthin(17)=1,
   dfile(18)='hirs3bufr', dtype(18)='hirs3',     dplat(18)='n17',       dsis(18)='hirs3_n17',           dval(18)=6.0,  dthin(18)=1,
   dfile(19)='hirs4bufr', dtype(19)='hirs4',     dplat(19)='n18',       dsis(19)='hirs4_n18',           dval(19)=0.0,  dthin(19)=1,
   dfile(20)='hirs4bufr', dtype(20)='hirs4',     dplat(20)='metop-a',   dsis(20)='hirs4_metop-a',       dval(20)=6.0,  dthin(20)=1,
   dfile(21)='gsndrbufr', dtype(21)='sndr',      dplat(21)='g11',       dsis(21)='sndr_g11',            dval(21)=0.0,  dthin(21)=1,
   dfile(22)='gsndrbufr', dtype(22)='sndr',      dplat(22)='g12',       dsis(22)='sndr_g12',            dval(22)=0.0,  dthin(22)=1,
   dfile(23)='gimgrbufr', dtype(23)='goes_img',  dplat(23)='g11',       dsis(23)='imgr_g11',            dval(23)=0.0,  dthin(23)=1,
   dfile(24)='gimgrbufr', dtype(24)='goes_img',  dplat(24)='g12',       dsis(24)='imgr_g12',            dval(24)=0.0,  dthin(24)=1,
   dfile(25)='airsbufr',  dtype(25)='airs',      dplat(25)='aqua',      dsis(25)='airs281SUBSET_aqua',  dval(25)=20.0, dthin(25)=1,
   dfile(26)='msubufr',   dtype(26)='msu',       dplat(26)='n14',       dsis(26)='msu_n14',             dval(26)=2.0,  dthin(26)=2,
   dfile(27)='amsuabufr', dtype(27)='amsua',     dplat(27)='n15',       dsis(27)='amsua_n15',           dval(27)=10.0, dthin(27)=2,
   dfile(28)='amsuabufr', dtype(28)='amsua',     dplat(28)='n16',       dsis(28)='amsua_n16',           dval(28)=0.0,  dthin(28)=2,
   dfile(29)='amsuabufr', dtype(29)='amsua',     dplat(29)='n17',       dsis(29)='amsua_n17',           dval(29)=0.0,  dthin(29)=2,
   dfile(30)='amsuabufr', dtype(30)='amsua',     dplat(30)='n18',       dsis(30)='amsua_n18',           dval(30)=10.0, dthin(30)=2,
   dfile(31)='amsuabufr', dtype(31)='amsua',     dplat(31)='metop-a',   dsis(31)='amsua_metop-a',       dval(31)=10.0, dthin(31)=2,
   dfile(32)='airsbufr',  dtype(32)='amsua',     dplat(32)='aqua',      dsis(32)='amsua_aqua',          dval(32)=10.0, dthin(32)=2,
   dfile(33)='amsubbufr', dtype(33)='amsub',     dplat(33)='n15',       dsis(33)='amsub_n15',           dval(33)=3.0,  dthin(33)=3,
   dfile(34)='amsubbufr', dtype(34)='amsub',     dplat(34)='n16',       dsis(34)='amsub_n16',           dval(34)=3.0,  dthin(34)=3,
   dfile(35)='amsubbufr', dtype(35)='amsub',     dplat(35)='n17',       dsis(35)='amsub_n17',           dval(35)=3.0,  dthin(35)=3,
   dfile(36)='mhsbufr',   dtype(36)='mhs',       dplat(36)='n18',       dsis(36)='mhs_n18',             dval(36)=3.0,  dthin(36)=3,
   dfile(37)='mhsbufr',   dtype(37)='mhs',       dplat(37)='metop-a',   dsis(37)='mhs_metop-a',         dval(37)=3.0,  dthin(37)=3,
   dfile(38)='ssmitbufr', dtype(38)='ssmi',      dplat(38)='f13',       dsis(38)='ssmi_f13',            dval(38)=0.0,  dthin(38)=4,
   dfile(39)='ssmitbufr', dtype(39)='ssmi',      dplat(39)='f14',       dsis(39)='ssmi_f14',            dval(39)=0.0,  dthin(39)=4,
   dfile(40)='ssmitbufr', dtype(40)='ssmi',      dplat(40)='f15',       dsis(40)='ssmi_f15',            dval(40)=0.0,  dthin(40)=4,
   dfile(41)='amsrebufr', dtype(41)='amsre_low', dplat(41)='aqua',      dsis(41)='amsre_aqua',          dval(41)=0.0,  dthin(41)=4,
   dfile(42)='amsrebufr', dtype(42)='amsre_mid', dplat(42)='aqua',      dsis(42)='amsre_aqua',          dval(42)=0.0,  dthin(42)=4,
   dfile(43)='amsrebufr', dtype(43)='amsre_hig', dplat(43)='aqua',      dsis(43)='amsre_aqua',          dval(43)=0.0,  dthin(43)=4,
   dfile(44)='ssmisbufr', dtype(44)='ssmis_las', dplat(44)='f16',       dsis(44)='ssmis_f16',           dval(44)=0.0,  dthin(44)=4,
   dfile(45)='ssmisbufr', dtype(45)='ssmis_uas', dplat(45)='f16',       dsis(45)='ssmis_f16',           dval(45)=0.0,  dthin(45)=4,
   dfile(46)='ssmisbufr', dtype(46)='ssmis_img', dplat(46)='f16',       dsis(46)='ssmis_f16',           dval(46)=0.0,  dthin(46)=4,
   dfile(47)='ssmisbufr', dtype(47)='ssmis_env', dplat(47)='f16',       dsis(47)='ssmis_f16',           dval(47)=0.0,  dthin(47)=4,
   dfile(48)='gsnd1bufr', dtype(48)='sndrd1',    dplat(48)='g12',       dsis(48)='sndrD1_g12',          dval(48)=1.5,  dthin(48)=5,
   dfile(49)='gsnd1bufr', dtype(49)='sndrd2',    dplat(49)='g12',       dsis(49)='sndrD2_g12',          dval(49)=1.5,  dthin(49)=5,
   dfile(50)='gsnd1bufr', dtype(50)='sndrd3',    dplat(50)='g12',       dsis(50)='sndrD3_g12',          dval(50)=1.5,  dthin(50)=5,
   dfile(51)='gsnd1bufr', dtype(51)='sndrd4',    dplat(51)='g12',       dsis(51)='sndrD4_g12',          dval(51)=1.5,  dthin(51)=5,
   dfile(52)='gsnd1bufr', dtype(52)='sndrd1',    dplat(52)='g11',       dsis(52)='sndrD1_g11',          dval(52)=1.5,  dthin(52)=5,
   dfile(53)='gsnd1bufr', dtype(53)='sndrd2',    dplat(53)='g11',       dsis(53)='sndrD2_g11',          dval(53)=1.5,  dthin(53)=5,
   dfile(54)='gsnd1bufr', dtype(54)='sndrd3',    dplat(54)='g11',       dsis(54)='sndrD3_g11',          dval(54)=1.5,  dthin(54)=5,
   dfile(55)='gsnd1bufr', dtype(55)='sndrd4',    dplat(55)='g11',       dsis(55)='sndrD4_g11',          dval(55)=1.5,  dthin(55)=5,
   dfile(56)='gsnd1bufr', dtype(56)='sndrd1',    dplat(56)='g13',       dsis(56)='sndrD1_g13',          dval(56)=1.5,  dthin(56)=5,
   dfile(57)='gsnd1bufr', dtype(57)='sndrd2',    dplat(57)='g13',       dsis(57)='sndrD2_g13',          dval(57)=1.5,  dthin(57)=5,
   dfile(58)='gsnd1bufr', dtype(58)='sndrd3',    dplat(58)='g13',       dsis(58)='sndrD3_g13',          dval(58)=1.5,  dthin(58)=5,
   dfile(59)='gsnd1bufr', dtype(59)='sndrd4',    dplat(59)='g13',       dsis(59)='sndrD4_g13',          dval(59)=1.5,  dthin(59)=5,

   $OBSINPUT
 /
  &SUPEROB_RADAR
   $SUPERRAD
 /
 &SINGLEOB_TEST
   maginnov=0.1,magoberr=0.1,oneob_type='t',
   oblat=45.,oblon=180.,obpres=1000.,obdattim=${adate},
   obhourset=0.,
   $SINGLEOB
 /
EOF

export ERR=$?
export err=$ERR
$ERRSCRIPT||exit 2

if [[ $FILESTYLE = 'C' ]]
then
   # Output files
   ${NCP:-cp} siganl          $SIGANL
   ${NCP:-cp} satbias_out     $ABIAS
   if [[ -s gesfile_out ]]; then
      ${NCP:-cp} gesfile_out  $GINCOUT
   fi
      if [[ -s biascor_out ]]; then
      ${NCP:-cp} biascor_out  $BIASOUT
   fi
fi


# Cat runtime output files.
cat fort.2* > $GSISTAT
cat fort.2*


# Loop over first and last outer loops to generate innovation
# diagnostic files for indicated observation types (groups)
#
# NOTE:  Since we set miter=2 in GSI namelist SETUP, outer
#        loop 03 will contain innovations with respect to 
#        the analysis.  Creation of o-a innovation files
#        is triggered by write_diag(3)=.true.  The setting
#        write_diag(1)=.true. turns on creation of o-g
#        innovation files.
#

cd $DATA    # we should already be in $DATA, but extra cd to be sure.
loops="01 03"
for loop in $loops; do

case $loop in
  01) string=ges;;
  03) string=anl;;
   *) string=$loop;;
esac

#  Collect diagnostic files for obs types (groups) below
   listall="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 pcp_ssmi_dmsp pcp_tmi_trmm conv sbuv2_n16 sbuv2_n17 sbuv2_n18 omi_aura ssmi_f13 ssmi_f14 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16"
   for type in $listall; do
      find ./dir.* -name "${type}_${loop}*" -print | xargs cat > diag_${type}_${string}.${CDATE}
   done
done


################################################################################
#  Update angle dependent bias 
export XLSMPOPTS="parthds=$NTHREADS:stack=$NTHSTACK"
export PGM=$ANGUPDATEXEC
export pgm=$PGM
$LOGSCRIPT

iy=$(echo $CDATE|cut -c1-4)
im=$(echo $CDATE|cut -c5-6)
id=$(echo $CDATE|cut -c7-8)
ih=$(echo $CDATE|cut -c9-10)

# local input files assumed to already exist are
#   ./satbias_ang.in
#   radiance diagnostic files

if [[ -s satbias_ang.in ]]; then
   cp ./satbias_angle ./satbias_ang.in
fi
   listrad="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g11 sndr_g12 sndr_g13 sndr_g08_prep sndr_g11_prep sndr_g11_prep sndr_g12_prep sndr_g13_prep sndrd1_g11 sndrd2_g11 sndrd3_g11 sndrd4_g11 sndrd1_g12 sndrd2_g12 sndrd3_g12 sndrd4_g12 sndrd1_g13 sndrd2_g13 sndrd3_g13 sndrd4_g13 hirs3_n15 hirs3_n16 hirs3_n17 amsua_n15 amsua_n16 amsua_n17 amsub_n15 amsub_n16 amsub_n17 hsb_aqua airs_aqua amsua_aqua imgr_g08 imgr_g11 imgr_g12 ssmi_f13 ssmi_f14 ssmi_f15 hirs4_n18 hirs4_metop-a amsua_n18 amsua_metop-a mhs_n18 mhs_metop-a amsre_low_aqua amsre_mid_aqua amsre_hig_aqua ssmis_las_f16 ssmis_uas_f16 ssmis_img_f16 ssmis_env_f16"
for type in $listrad; do
   if [[ -s ${DATA}/diag_${type}_ges.$CDATE ]]; then
      ln -fs ${DATA}/diag_${type}_ges.$CDATE  ./diag_${type}.$CDATE
   fi
done

# output file created by program is
#   $SATANGO = ./satbias_ang.out 

eval $ANGUPDATEXEC <<EOF $REDOUT$PGMOUT $REDERR$PGMERR
 &SETUP
  jpch=843,nstep=90,nsize=20,wgtang=0.008333333,wgtlap=0.0,
  iuseqc=1,dtmax=1.0,
  iyy1=${iy},imm1=${im},idd1=${id},ihh1=${ih},
  iyy2=${iy},imm2=${im},idd2=${id},ihh2=${ih},
  dth=06,ndat=44,
  $SETUPANG
 /
 &OBS_INPUT
  dtype(01)='hirs2',     dplat(01)='n14',       dsis(01)='hirs2_n14',
  dtype(02)='hirs3',     dplat(02)='n16',       dsis(02)='hirs3_n16',
  dtype(03)='hirs3',     dplat(03)='n17',       dsis(03)='hirs3_n17',
  dtype(04)='hirs4',     dplat(04)='n18',       dsis(04)='hirs4_n18',
  dtype(05)='hirs4',     dplat(05)='metop-a',   dsis(05)='hirs4_metop-a',
  dtype(06)='sndr',      dplat(06)='g11',       dsis(06)='sndr_g11',
  dtype(07)='sndr',      dplat(07)='g12',       dsis(07)='sndr_g12',
  dtype(08)='goes_img',  dplat(08)='g11',       dsis(08)='imgr_g11',
  dtype(09)='goes_img',  dplat(09)='g12',       dsis(09)='imgr_g12',
  dtype(10)='airs',      dplat(10)='aqua',      dsis(10)='airs281SUBSET_aqua',
  dtype(11)='msu',       dplat(11)='n14',       dsis(11)='msu_n14',
  dtype(12)='amsua',     dplat(12)='n15',       dsis(12)='amsua_n15',
  dtype(13)='amsua',     dplat(13)='n16',       dsis(13)='amsua_n16',
  dtype(14)='amsua',     dplat(14)='n17',       dsis(14)='amsua_n17',
  dtype(15)='amsua',     dplat(15)='n18',       dsis(15)='amsua_n18',
  dtype(16)='amsua',     dplat(16)='metop-a',   dsis(16)='amsua_metop-a',
  dtype(17)='amsua',     dplat(17)='aqua',      dsis(17)='amsua_aqua',
  dtype(18)='amsub',     dplat(18)='n15',       dsis(18)='amsub_n15',
  dtype(19)='amsub',     dplat(19)='n16',       dsis(19)='amsub_n16',
  dtype(20)='amsub',     dplat(20)='n17',       dsis(20)='amsub_n17',
  dtype(21)='mhs',       dplat(21)='n18',       dsis(21)='mhs_n18',
  dtype(22)='mhs',       dplat(22)='metop-a',   dsis(22)='mhs_metop-a',
  dtype(23)='ssmi',      dplat(23)='f13',       dsis(23)='ssmi_f13',
  dtype(24)='ssmi',      dplat(24)='f14',       dsis(24)='ssmi_f14',
  dtype(25)='ssmi',      dplat(25)='f15',       dsis(25)='ssmi_f15',
  dtype(26)='amsre_low', dplat(26)='aqua',      dsis(26)='amsre_aqua',
  dtype(27)='amsre_mid', dplat(27)='aqua',      dsis(27)='amsre_aqua',
  dtype(28)='amsre_hig', dplat(28)='aqua',      dsis(28)='amsre_aqua',
  dtype(29)='ssmis_las', dplat(29)='f16',       dsis(29)='ssmis_f16',
  dtype(30)='ssmis_uas', dplat(30)='f16',       dsis(30)='ssmis_f16',
  dtype(31)='ssmis_img', dplat(31)='f16',       dsis(31)='ssmis_f16',
  dtype(32)='ssmis_env', dplat(32)='f16',       dsis(32)='ssmis_f16',
  dtype(33)='sndrd1',    dplat(33)='g12',       dsis(33)='sndrD1_g12',
  dtype(34)='sndrd2',    dplat(34)='g12',       dsis(34)='sndrD2_g12',
  dtype(35)='sndrd3',    dplat(35)='g12',       dsis(35)='sndrD3_g12',
  dtype(36)='sndrd4',    dplat(36)='g12',       dsis(36)='sndrD4_g12',
  dtype(37)='sndrd1',    dplat(37)='g11',       dsis(37)='sndrD1_g11',
  dtype(38)='sndrd2',    dplat(38)='g11',       dsis(38)='sndrD2_g11',
  dtype(39)='sndrd3',    dplat(39)='g11',       dsis(39)='sndrD3_g11',
  dtype(40)='sndrd4',    dplat(40)='g11',       dsis(40)='sndrD4_g11',
  dtype(41)='sndrd1',    dplat(41)='g13',       dsis(41)='sndrD1_g13',
  dtype(42)='sndrd2',    dplat(42)='g13',       dsis(42)='sndrD2_g13',
  dtype(43)='sndrd3',    dplat(43)='g13',       dsis(43)='sndrD3_g13',
  dtype(44)='sndrd4',    dplat(44)='g13',       dsis(44)='sndrD4_g13',

  $OBSINPUTANG
 /
EOF

export ERR=$?
export err=$ERR
$ERRSCRIPT||exit 2

# Output file
${NCP:-cp} satbias_ang.out  $SATANGO


cd $DATA    # we should already be in $DATA, but extra cd to be sure.
# Compress and tar diagnostic files.  
loops="01 03"
for loop in $loops; do
   case $loop in
     01) string=ges;;
     03) string=anl;;
      *) string=$loop;;
   esac
   nsum=0
   for type in $listall; do
     for file in diag_${type}_${string}.${CDATE}; do
       if [ -s $file ]; then
         nsum=`expr $nsum + 1`
         compress diag_${type}_${string}.${CDATE}
       fi
     done
   done


   if [[ nsum -gt 0 ]]; then
      if [ ! -s $RADSTAT ]; then
         tar -cvf $RADSTAT diag_hirs*_${string}.${CDATE}.Z diag_msu*_${string}.${CDATE}.Z diag_amsu*_${string}.${CDATE}.Z diag_sndr*_${string}.${CDATE}.Z imgr*_${string}.${CDATE}.Z diag_airs*_${string}.${CDATE}.Z diag_hsb*_${string}.${CDATE}.Z diag_ssmi*_${string}.${CDATE}.Z diag_mhs*_${string}.${CDATE}.Z diag_amsre*_${string}.${CDATE}.Z diag_ssmis*_${string}.${CDATE}.Z
      else
         tar -uvf $RADSTAT diag_hirs*_${string}.${CDATE}.Z diag_msu*_${string}.${CDATE}.Z diag_amsu*_${string}.${CDATE}.Z diag_sndr*_${string}.${CDATE}.Z imgr*_${string}.${CDATE}.Z diag_airs*_${string}.${CDATE}.Z diag_hsb*_${string}.${CDATE}.Z diag_ssmi*_${string}.${CDATE}.Z diag_mhs*_${string}.${CDATE}.Z diag_amsre*_${string}.${CDATE}.Z diag_ssmis*_${string}.${CDATE}.Z
      fi
      if [ ! -s $OZNSTAT ]; then
         tar -cvf $OZNSTAT  diag_sbuv2*_${string}.${CDATE}.Z
      else
         tar -uvf $OZNSTAT  diag_sbuv2*_${string}.${CDATE}.Z
      fi
      if [ ! -s $PCPSTAT ]; then
         tar -cvf $PCPSTAT diag_pcp*_${string}.${CDATE}.Z
      else
         tar -uvf $PCPSTAT diag_pcp*_${string}.${CDATE}.Z
      fi
      if [ ! -s $CNVSTAT ]; then
         tar -cvf $CNVSTAT diag_conv*_${string}.${CDATE}.Z
      else
         tar -uvf $CNVSTAT diag_conv*_${string}.${CDATE}.Z
      fi
   fi
done


################################################################################

if test $RUN = 'gdas1'
then
    if test $SENDDBN = 'YES'
    then
       $DBNROOT/bin/dbn_alert MODEL GDAS1RADSTAT $job $RADSTAT
    fi
fi

################################################################################
#  Postprocessing
cd $pwd
[[ $mkdata = YES ]]&&rmdir $DATA
$ENDSCRIPT
set +x
if [[ "$VERBOSE" = "YES" ]]
then
   echo $(date) EXITING $0 with return code $err >&2
fi
exit $err