#!/bin/sh
################################################################################
####  UNIX Script Documentation Block
#                      .                                             .
# Script name:         exglobal_angupdate.sh.sms
# Script description:  Updates global_gsi angle dependent bias correction file
#
# Author:        Russ Treadon       Org: NP23         Date: 2010-04-26
#
# Abstract: This script update the angle dependent bias correction file
#
# Script history log:
# 2010-04-28  Russ Treadon
#
#   Input script positional parameters:
#     1             Input surface guess
#                   defaults to $SFCGES; required
#     2             Input guess angle dependent bias correction
#                   defaults to $GSATANG; required
#     3             Input radiance diagnostic file
#                   defaults to $RADSTAT; required
#     4             Output (updated) angle dependent bias correction
#                   defaults to $SATANGO, then to ${COMOUT}/${PREINP}satang
#
#   Imported Shell Variables:
#     SFCGES        Input surface guess
#                   overridden by $1; required
#     GSATANG       Input guess angle dependent bias correction
#                   overridden by $2; required
#     RADSTAT       Output radiance assimilation statistics
#                   overridden by $3; required
#     SATANGO       Output updated angle dependent bias correction
#                   overridden by $4; defaults to ${COMIN}/${PREINP}${PREINP}satang
#     FIXGLOBAL     Directory for global fixed files
#                   defaults to /nwprod/fix
#     FIXcfs        Directory for cfs_cdas fixed files
#                   defaults to /nwprod/fix/cfs_fix_cdas
#     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
#     SFCHDR        Command to read surface header
#                   defaults to ${EXECGLOBAL}/global_sfchdr$XC
#     ANGUPDATEXEC  Radiance angle dependent bias correction update executable
#                   defaults to ${EXECGLOBAL}/global_angupdate$XC
#     SATANGL       Input satellite angle bias file
#                   defaults to ${FIXcfs}/global_satangbias.txt
#     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
#     CDATE         Current analysis date in yyyymmddhh format
#                   defaults to the value in the input surface file header
#     NTHREADS_ANG  Number of threads for ANGUPDATEXEC
#                   defaults to 1
#     NTHSTACK_ANG  Size of stack per thread for ANGUPDATEXEC
#                   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
#
#     programs   : $CYCLEXEC
#                  $GSIEXEC
#                  $ANGUPDATEXEC
#
#     fixed data : $SATANGL
#
#     input data : $GSATANG
#                  $RADSTAT
#
#     output data: $SATANGO
#
# 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 GSATANG=${2:-${GSATANG:?}}
export RADSTAT=${3:-${RADSTAT:?}}
export SATANGO=${4:-${SATANGO:?}}
#  Directories.
export FIXGLOBAL=${FIXGLOBAL:-/nwprod/fix}
export FIXcfs=${FIXcfs:-/nwprod/fix/cfs_fix_cdas}
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 SFCHDR=${SFCHDR:-${EXECGLOBAL}/global_sfchdr$XC}
export ANGUPDATEXEC=${ANGUPDATEXEC:-${EXECGLOBAL}/cfs_cdas_angupdate$XC}
export SATANGL=${SATANGL:-${FIXcfs}/global_satangbias.txt}
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 SETUPANG=${SETUPANG:-""}
export OBSINPUTANG=${OBSINPUTANG:-""}
export NTHREADS_ANG=${NTHREADS_ANG:-1}
export NTHSTACK_ANG=${NTHSTACK_ANG:-64000000}
export FILESTYLE=${FILESTYLE:-'X'}
export PGMOUT=${PGMOUT:-${pgmout:-'&1'}}
export PGMERR=${PGMERR:-${pgmerr:-'&2'}}
export NCP=${NCP:-cp}
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 angle dependent bias 
export XLSMPOPTS="parthds=$NTHREADS_ANG:stack=$NTHSTACK_ANG"
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)

rm global_angupdate.namelist 
rm satbias_angle satbias_ang.in radstat


if [[ $FILESTYLE = 'C' ]]
then
   # Fixed fields
   $NCP $SATANGL  satbias_angle

   # Required guess fields
   $NCP $GSATANG  satbias_ang.in
   $NCP $RADSTAT  radstat

else
   # Fixed fields
   ln -fs $SATANGL  satbias_angle

   # Guess fields
   ln -fs $GSATANG  satbias_ang.in
   $NCP $RADSTAT    radstat
fi

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

if [[ ! -s satbias_ang.in ]]; then
   $NCP ./satbias_angle ./satbias_ang.in
fi

# Extract sensor specific diagnostic files from radstat file
tar -xvf radstat
rm -f diag_*_anl.$CDATE.Z


# List of sensor specific diagnostic files
   listrad="hirs2_n14 msu_n14 sndr_g08 sndr_g11 sndr_g12 sndr_g13 sndr_g08_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 sndrd1_g14 sndrd2_g14 sndrd3_g14 sndrd4_g14 sndrd1_g15 sndrd2_g15 sndrd3_g15 sndrd4_g15 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 imgr_g14 imgr_g15 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 ssmis_las_f17 ssmis_uas_f17 ssmis_img_f17 ssmis_env_f17 ssmis_las_f18 ssmis_uas_f18 ssmis_img_f18 ssmis_env_f18 ssmis_las_f19 ssmis_uas_f19 ssmis_img_f19 ssmis_env_f19 ssmis_las_f20 ssmis_uas_f20 ssmis_img_f20 ssmis_env_f20 iasi_metop-a hirs4_n19 amsua_n19 mhs_n19"
for type in $listrad; do
   if [[ -s diag_${type}_ges.$CDATE.Z ]]; then
      uncompress diag_${type}_ges.$CDATE.Z
      ln -fs diag_${type}_ges.$CDATE  ./diag_${type}.$CDATE
   fi
done

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

# Create global_angupdate namelist
cat <<EOF > global_angupdate.namelist
 &SETUP
  jpch=1577,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=36,
  $SETUPANG
 /
 &OBS_INPUT
  dtype(01)='hirs3',     dplat(01)='n17',       dsis(01)='hirs3_n17',
  dtype(02)='hirs4',     dplat(02)='metop-a',   dsis(02)='hirs4_metop-a',
  dtype(03)='goes_img',  dplat(03)='g11',       dsis(03)='imgr_g11',
  dtype(04)='goes_img',  dplat(04)='g12',       dsis(04)='imgr_g12',
  dtype(05)='airs',      dplat(05)='aqua',      dsis(05)='airs281SUBSET_aqua',
  dtype(06)='amsua',     dplat(06)='n15',       dsis(06)='amsua_n15',
  dtype(07)='amsua',     dplat(07)='n18',       dsis(07)='amsua_n18',
  dtype(08)='amsua',     dplat(08)='metop-a',   dsis(08)='amsua_metop-a',
  dtype(09)='amsua',     dplat(09)='aqua',      dsis(09)='amsua_aqua',
  dtype(10)='mhs',       dplat(10)='n18',       dsis(10)='mhs_n18',
  dtype(11)='mhs',       dplat(11)='metop-a',   dsis(11)='mhs_metop-a',
  dtype(12)='ssmi',      dplat(12)='f15',       dsis(12)='ssmi_f15',
  dtype(13)='amsre_low', dplat(13)='aqua',      dsis(13)='amsre_aqua',
  dtype(14)='amsre_mid', dplat(14)='aqua',      dsis(14)='amsre_aqua',
  dtype(15)='amsre_hig', dplat(15)='aqua',      dsis(15)='amsre_aqua',
  dtype(16)='ssmis_las', dplat(16)='f16',       dsis(16)='ssmis_f16',
  dtype(17)='ssmis_uas', dplat(17)='f16',       dsis(17)='ssmis_f16',
  dtype(18)='ssmis_img', dplat(18)='f16',       dsis(18)='ssmis_f16',
  dtype(19)='ssmis_env', dplat(19)='f16',       dsis(19)='ssmis_f16',
  dtype(20)='sndrd1',    dplat(20)='g12',       dsis(20)='sndrD1_g12',
  dtype(21)='sndrd2',    dplat(21)='g12',       dsis(21)='sndrD2_g12',
  dtype(22)='sndrd3',    dplat(22)='g12',       dsis(22)='sndrD3_g12',
  dtype(23)='sndrd4',    dplat(23)='g12',       dsis(23)='sndrD4_g12',
  dtype(24)='sndrd1',    dplat(24)='g11',       dsis(24)='sndrD1_g11',
  dtype(25)='sndrd2',    dplat(25)='g11',       dsis(25)='sndrD2_g11',
  dtype(26)='sndrd3',    dplat(26)='g11',       dsis(26)='sndrD3_g11',
  dtype(27)='sndrd4',    dplat(27)='g11',       dsis(27)='sndrD4_g11',
  dtype(28)='sndrd1',    dplat(28)='g13',       dsis(28)='sndrD1_g13',
  dtype(29)='sndrd2',    dplat(29)='g13',       dsis(29)='sndrD2_g13',
  dtype(30)='sndrd3',    dplat(30)='g13',       dsis(30)='sndrD3_g13',
  dtype(31)='sndrd4',    dplat(31)='g13',       dsis(31)='sndrD4_g13',
  dtype(32)='iasi',      dplat(32)='metop-a',   dsis(32)='iasi616_metop-a',
  dtype(33)='hirs4',     dplat(33)='n19',       dsis(33)='hirs4_n19',
  dtype(34)='amsua',     dplat(34)='n19',       dsis(34)='amsua_n19',
  dtype(35)='mhs',       dplat(35)='n19',       dsis(35)='mhs_n19',
  dtype(36)='amsub',     dplat(36)='n17',       dsis(36)='amsub_n17',
  $OBSINPUTANG
 /
EOF

# Run global_angupdate program
eval $PGM < global_angupdate.namelist $REDOUT$PGMOUT $REDERR$PGMERR
rc=$?

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

# Output file
$NCP satbias_ang.out  $SATANGO

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

if test "$RUN" = 'gdas1'
then
    if test "$SENDDBN" = 'YES'
    then
       $DBNROOT/bin/dbn_alert MODEL GDAS1_MSC_satang $job $SATANGO
    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
