#!/bin/csh
#
# Data Assimilation Research Testbed -- DART
# Copyright 2004, Data Assimilation Initiative, University Corporation for Atmospheric Research
# Licensed under the GPL -- www.gpl.org/licenses/gpl.html
#
# $Id: RunPE2,v 1.2 2004/04/28 18:05:34 thoar Exp $
#
# This script will do one of two things -- based on an envir

set SNAME = $0

switch ($#argv) 
   case 0:
      #===================================================================
      # With no arguments -- running with the default observation sequence  
      # supplied by Jeff Whitaker -- 151 days with 362 obs per day.
      # The initial conditions files are ASCII ...
      #===================================================================
      set pe2lyr_case = 1
   breaksw

   case 1:
      #===================================================================
      # If the solo argument is 
      # 1       -- running with the default observation sequence  (case 0)
      # <other> -- running from a prescribed set of BINARY initial 
      #            conditions as created in the script MakeICs and with a
      #            short observation sequence and just a few ensemble mems.
      #===================================================================
      set pe2lyr_case = $1
   breaksw

   default:
      echo " "
      echo "usage: $SNAME:t [scenarionumber]"
      echo " "
      echo "This script exercises the PE2LYR model."
      echo "If 'scenarionumber' is absent -- the default behavior is to"
      echo "run with the default observation sequence supplied by Jeff Whitaker "
      echo "151 days with 362 obs per day."
      echo " "
      echo "If scenarionumber is '1' -- the default case is run."
      echo " "
      echo "If scenarionumber is anything else -- a prescribed set of BINARY initial conditions"
      echo "is used as well as a short observation sequence with just a few ensemble"
      echo "members used as well as a short observation sequence."
      echo " "

      @ MYSTATUS = 1
      exit
   breaksw
endsw

#======================================================================
# Find the project and build it, if need be.
#======================================================================

set Model = pe2lyr

if ( ${?DART_HOME} ) then
   if ( -d $DART_HOME ) then
      setenv DARTHOME $DART_HOME
   else
      echo "$DART_HOME does not exist on this platform"
   endif
else if ( -d /export/data/gsp/${USER}/DART ) then
   setenv DARTHOME /export/data/gsp/${USER}/DART
else if ( -d /data/gsp/${USER}/DART ) then
   setenv DARTHOME /data/gsp/${USER}/DART
else if ( -d /home/${USER}/DART ) then
   setenv DARTHOME /home/${USER}/DART
else
   echo "no DART project"
   exit
endif
echo "DART project directory is $DARTHOME"
echo "       working with model $Model"
sleep 2

cd ${DARTHOME}/models/${Model}/work

if !( -e create_obs_set_def ) then
   csh mkmf_create_obs_set_def
   mv input.nml.mkmf default_create_obs_set_def.nml
   make || exit 1
endif
if !( -e create_obs_sequence ) then
   csh mkmf_create_obs_sequence
   mv input.nml.mkmf default_create_obs_sequence.nml
   make || exit 1
endif
if !( -e perfect_model_obs ) then
   csh mkmf_perfect_model_obs
   mv input.nml.mkmf default_perfect_model_obs.nml
   make || exit 1
endif
if !( -e filter ) then
   csh mkmf_filter
   mv input.nml.mkmf default_filter.nml
   make || exit 1
endif
\rm -f *.o *.d *.mod Makefile

#======================================================================
# Save any existing namelist ...
#======================================================================

set SAVEME = .NamelistStorage.$$
if ( ! -d $SAVEME ) then
   mkdir ${SAVEME}
endif
foreach NAMELIST ( *.nml )
   mv ${NAMELIST} ${SAVEME}
end

#======================================================================
# Simulate a particular observing system:
# 1) declare an observation set definition
#======================================================================

switch ( $pe2lyr_case ) 
case 1:

cat << ENDofMessage > JeffWhitakerREADME

This is a snipit from the README from the developers of the pe2lyr model.
The initial conditions for perfect_ics and filter_ics came from 
Jeff Whitaker and Xue Wei at NOAA. This script repeats the experiment 
mentioned as item #12 in the README.

snipit starts here :

10) simulate obs_seq.in_151 is a file containing 362 obs for each day
    (151 days total).
    those 362 obs locations come from Jeff's expts,
    so test result can be compared with what we already have.

11) change obs_seq_in_file_name = "obs_seq.in_151"
    obs_seq_out_file_name = "obs_seq.out_151"  for &perfect_model_obs_nml
    change obs_sequence_file_name = "obs_seq.out_151" for &filter_nml
    in input.nml

12) repeat step 7 and 8 with cutoff=0.25, cov_inflate=1.01,
    start_from_restart=true.

ENDofMessage

   cat JeffWhitakerREADME

   set obs_sequence_in_name = '"obs_seq.in_151"'
   set obs_sequence_file_name = '"obs_seq.out_151"'
   set ens_size = 50
   set num_output_ens_members = 20

   echo '&assim_model_nml'                     > assim_mod.nml
   echo '   binary_restart_files = .false. /' >> assim_mod.nml

breaksw
default:

   set ens_size = 3
   set num_output_ens_members = 3

   echo " "
   echo "Running create_obs_set_def ... just a few locations case"
   echo "observation locations and error variances are entirely random."
   echo " "

   echo "set_def.out"    > create_obs_set_def.in  ;# output filename
   echo "1"             >> create_obs_set_def.in  ;# number of obs SETS
   echo "2"             >> create_obs_set_def.in  ;# num obs in first set
   echo "1.0"           >> create_obs_set_def.in  ;# error variance for first obs
   echo "-1"            >> create_obs_set_def.in  ;# not a state variable
   echo "-1"            >> create_obs_set_def.in  ;# surface observation
   echo "23.0"          >> create_obs_set_def.in  ;# longitude [0,360]
   echo "40.0"          >> create_obs_set_def.in  ;# latitude [-90,90]
   echo "3"             >> create_obs_set_def.in  ;# obs kind: u = 1, v = 2, ps = 3, t = 4 q = 5
   echo "1.0"           >> create_obs_set_def.in  ;# error variance for second obs
   echo "-1"            >> create_obs_set_def.in  ;# not a state variable
   echo "-1"            >> create_obs_set_def.in  ;# surface observation
   echo "123.0"         >> create_obs_set_def.in  ;# longitude [0,360]
   echo "-40.0"         >> create_obs_set_def.in  ;# latitude [-90,90]
   echo "3"             >> create_obs_set_def.in  ;# obs kind: u = 1, v = 2, ps = 3, t = 4 q = 5

   echo '&utilities_nml'                              > utilities.nml
   echo '   logfilename = "create_obs_set_def.out",' >> utilities.nml
   echo '   TERMLEVEL = 1 /'                         >> utilities.nml

   echo '&assim_model_nml'                            > assim_mod.nml
   echo '   binary_restart_files = .true. /'         >> assim_mod.nml

   cat utilities.nml assim_mod.nml > input.nml

   ./create_obs_set_def < create_obs_set_def.in

   if ( $status > 0 ) then
      echo "ERROR: running create_obs_set_def bombed ..."
      exit
   endif

   echo "set_def.out"           > create_obs_sequence.in
   echo "1"                    >> create_obs_sequence.in
   echo "3"                    >> create_obs_sequence.in
   echo "1 0"                  >> create_obs_sequence.in
   echo "1 0"                  >> create_obs_sequence.in
   echo "obs_seq.in"           >> create_obs_sequence.in

   set obs_sequence_in_name = '"obs_seq.in"'
   set obs_sequence_file_name = '"obs_seq.out"'

   echo '&utilities_nml'                               > utilities.nml
   echo '   logfilename = "create_obs_sequence.out",' >> utilities.nml
   echo '   TERMLEVEL = 1 /'                          >> utilities.nml

   cat utilities.nml assim_mod.nml > input.nml

   ./create_obs_sequence < create_obs_sequence.in

   if ( $status > 0 ) then
      echo "ERROR: running create_obs_sequence bombed ..."
      exit
   endif

breaksw
endsw

#======================================================================
# Create common namelists -- lots of ways to do it.
#======================================================================

set async = 0
set cutoff = 0.25
set cov_inflate = 1.01
set start_from_restart = .true.
set output_restart = .true.
set perfect_restart_in_file_name = '"perfect_ics"'
set perfect_restart_out_file_name = '"perfect_restart"'
set filter_restart_in_file_name = '"filter_ics"'
set filter_restart_out_file_name = '"filter_restart"'
set init_time_days = 0
set init_time_seconds = 0
set output_state_ens_mean = .true.
set output_state_ens_spread = .true.
set output_interval = 1


#======================================================================
# Simulate a particular observing system
# 3) Populate the observation sequences with synthetic observations
#    creates files True_State.nc, obs_seq.out
#======================================================================

echo " "
echo "Running perfect_model_obs ..."
echo " "

echo "&perfect_model_obs_nml"                                       > perfect.nml
echo "   async = $async ,"                                         >> perfect.nml
echo "   obs_seq_in_file_name = $obs_sequence_in_name ,"           >> perfect.nml
echo "   obs_seq_out_file_name = $obs_sequence_file_name ,"        >> perfect.nml
echo "   start_from_restart = $start_from_restart ,"               >> perfect.nml
echo "   output_restart = $output_restart ,"                       >> perfect.nml
echo "   restart_in_file_name = $perfect_restart_in_file_name ,"   >> perfect.nml
echo "   restart_out_file_name = $perfect_restart_out_file_name ," >> perfect.nml
echo "   init_time_days = $init_time_days ,"                       >> perfect.nml
echo "   init_time_seconds = $init_time_seconds ,"                 >> perfect.nml
echo "   output_interval = $output_interval /"                     >> perfect.nml

echo '&utilities_nml'                              > utilities.nml
echo '   logfilename = "perfect_obs.out"'         >> utilities.nml
echo '   TERMLEVEL = 1 /'                         >> utilities.nml

cat utilities.nml assim_mod.nml perfect.nml > input.nml

cat input.nml

#./perfect_model_obs

if ( $status > 0 ) then
   echo "ERROR: perfect_model_obs (synthetic) bombed ..."
   exit
else
   echo " "
   echo "perfect_model_obs (synthetic) terminated normally"
   echo " "
endif

#======================================================================
# Simulate a particular observing system
# 4) Filter
#    creates files Prior_Diag.nc, Posterior_Diag.nc
#======================================================================
# Set defaults
#======================================================================

echo " "
echo "Running filter ..."
echo " "

#======================================================================
# check environment variables 'NumEns' 'CovInflate' and 'Cutoff'  
# if they are not defined, use default values.
# There is no checking for sensible values ... caveat emptor ...

echo "Ensemble size is $ens_size ..."
echo "Num output ensemble members is $num_output_ens_members ..."
sleep 2

if ( ${?NumEns} ) then
   set ens_size = $NumEns
   set num_output_ens_members = $NumEns
endif
if ( ${?CovInflate} ) then
   set cov_inflate = $CovInflate
endif
if ( ${?Cutoff} ) then
   set cutoff = $Cutoff
endif

echo '&utilities_nml'                            > utilities.nml
echo '   logfilename = "filter.out"'            >> utilities.nml
echo '   TERMLEVEL = 1 /'                       >> utilities.nml

echo " "                                                            > filter.nml
echo "&filter_nml"                                                 >> filter.nml
echo "   async = $async ,"                                         >> filter.nml
echo "   ens_size = $ens_size ,"                                   >> filter.nml
echo "   cutoff = $cutoff ,"                                       >> filter.nml
echo "   cov_inflate = $cov_inflate ,"                             >> filter.nml
echo "   start_from_restart = $start_from_restart ,"               >> filter.nml
echo "   output_restart = $output_restart ,"                       >> filter.nml
echo "   obs_sequence_file_name = $obs_sequence_file_name ,"       >> filter.nml
echo "   restart_in_file_name = $filter_restart_in_file_name ,"    >> filter.nml
echo "   restart_out_file_name = $filter_restart_out_file_name ,"  >> filter.nml
echo "   init_time_days = $init_time_days ,"                       >> filter.nml
echo "   init_time_seconds = $init_time_seconds ,"                 >> filter.nml
echo "   output_state_ens_mean = $output_state_ens_mean ,"         >> filter.nml
echo "   output_state_ens_spread = $output_state_ens_spread ,"     >> filter.nml
echo "   num_output_ens_members = $num_output_ens_members ,"       >> filter.nml
echo "   output_interval = $output_interval /"                     >> filter.nml
echo " "                                                           >> filter.nml

cat utilities.nml assim_mod.nml filter.nml > input.nml

cat input.nml

# ./filter

if ( $status > 0 ) then
   echo "ERROR: filter bombed ..."
else
   echo " "
   echo "filter terminated normally"
   echo " "
   \rm -f create_obs_set_def.in create_obs_sequence.in 
   \rm -f utilities.nml assim_mod.nml perfect.nml filter.nml input.nml
endif

#======================================================================
# Restore the existing namelists ...
#======================================================================

foreach NAMELIST ( ${SAVEME}/*.nml )
   mv ${NAMELIST} .
end
\rmdir ${SAVEME}

\rm -f JeffWhitakerREADME

exit
