#!/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: RunBGrid,v 1.8 2004/04/28 18:05:33 thoar Exp $
#
# script to run an experiment with existing intial conditions
#======================================================================
# Find the project and build it, if need be.
#======================================================================

set echo

set Model = bgrid_solo

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 column_rand ) then    ;# interactively builds a set of randomly-
   csh mkmf_column_rand        ;# located column observations
   mv input.nml.mkmf default_column_rand.nml
   make || exit 1              ;# specify 5 vertical levels
endif                          ;# create_obs_set_def < column_rand.out
if !( -e ps_rand_local ) then  ;# randomly-located surface pressure obs
   csh mkmf_ps_rand_local      ;# can be confined to a lat/lon rectangle
   mv input.nml.mkmf default_ps_rand_local.nml
   make || exit 2              ;# create_obs_set_def < ps_rand.out
endif
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 3
endif
if !( -e create_obs_sequence ) then
   csh mkmf_create_obs_sequence
   mv input.nml.mkmf default_create_obs_sequence.nml
   make || exit 4
endif
if !( -e perfect_model_obs ) then
   csh mkmf_perfect_model_obs
   mv input.nml.mkmf default_perfect_model_obs.nml
   make || exit 5
endif
if !( -e filter ) then
   csh mkmf_filter
   mv input.nml.mkmf default_filter.nml
   make || exit 6
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

#======================================================================
# Create common namelists -- lots of ways to do it.
# The default initial conditions (i.e. restart files) are in ascii.
#======================================================================

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

cat << ENDofTask01 > model.nml
&model_nml
   days                =   10,
   dt_atmos            = 3600,
   output_state_vector = .false. /

&fms_nml
   domains_stack_size = 90000 /

&bgrid_cold_start_nml
   nlon = 60, 
   nlat = 30, 
   nlev =  5,
   equal_vert_spacing = .true. /

&hs_forcing_nml
   delh      =  60.,
   t_zero    = 315.,
   t_strat   = 200.,
   delv      =  10.,
   eps       =   0.,
   ka        = -40.,
   ks        =  -4.,
   kf        =  -1.,
   sigma_b   =  .7,
   do_conserve_energy = .false. /

&bgrid_core_driver_nml
   damp_coeff_wind     = 0.10,
   damp_coeff_temp     = 0.10,
   damp_coeff_tracer   = 0.10,
   advec_order_wind    = 4,
   advec_order_temp    = 2,
   advec_order_tracer  = 2,
   num_sponge_levels   = 1,
   sponge_coeff_wind   = 1.00,
   sponge_coeff_temp   = 1.00,
   sponge_coeff_tracer = 1.00,
   num_fill_pass       = 2,
   decomp              = 0,0,
   num_adjust_dt       = 3,
   num_advec_dt        = 3,
   halo                = 1,
   do_conserve_energy  = .false. /

&bgrid_integrals_nml
   file_name       = 'dynam_integral.out',
   time_units      = 'days',
   output_interval = 1.00 /
ENDofTask01

#======================================================================
# Simulate a particular observing system:
# 1) declare an observation set definition
# run either ps_rand_local _OR_ column_rand -- do not run both
#======================================================================

set bgrid_case = 0

switch ( $bgrid_case ) 
case 1:

   echo " "
   echo "Running create_obs_set_def ... ps_rand_local case"
   echo " "

   echo "1800          of observations"                  > ps_rand_local.in
   echo "10000  Pa     obs error variance (10,000=1mb)" >> ps_rand_local.in
   echo "-90           lower latitude [-90,xxx]"        >> ps_rand_local.in
   echo " 90           upper latitude [xxx, 90]"        >> ps_rand_local.in
   echo "  0           west longitude [0,360]"          >> ps_rand_local.in
   echo "360           east longitude [0,360]"          >> ps_rand_local.in

   echo '&utilities_nml'                                      > utilities.nml
   echo '   logfilename = "create_obs_set_def_ps_rand.out",' >> utilities.nml
   echo '   TERMLEVEL = 1 /'                                 >> utilities.nml
   
   cat utilities.nml assim_mod.nml model.nml > input.nml
   
   ./ps_rand_local < ps_rand_local.in
   ./create_obs_set_def < ps_rand.out
   
   if ( $status > 0 ) then
      echo "ERROR: running create_obs_set_def bombed ..."
      exit
   endif

breaksw
case 2:

   echo " "
   echo "Running create_obs_set_def ... column_rand case"
   echo " "

   echo "400           # of observations"                > column_rand.in
   echo "5             model levels "                   >> column_rand.in
   echo "10000  Pa     obs error variance (10,000=1mb)" >> column_rand.in
   echo "1.0           T obs error variance"            >> column_rand.in
   echo "1.0           U,V obs error variance"          >> column_rand.in

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

   cat utilities.nml assim_mod.nml model.nml > input.nml

   ./column_rand < column_rand.in
   ./create_obs_set_def < column_rand.out

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

breaksw
default:

   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 "4"                         >> create_obs_set_def.in  ;# num obs in first set
   echo "1.0"                       >> create_obs_set_def.in  ;# error variance for first obs
   echo "10"                        >> create_obs_set_def.in  ;# observing state var #10
   echo "23.0"                      >> create_obs_set_def.in  ;# error variance for next obs
   echo "123"                       >> create_obs_set_def.in  ;# observing state var #123
   echo "2.0"                       >> create_obs_set_def.in  ;# error variance for next obs
   echo "975"                       >> create_obs_set_def.in  ;# observing state var #975
   echo "1.0"                       >> create_obs_set_def.in  ;# error variance for next obs
   echo "1000"                      >> create_obs_set_def.in  ;# observing state var #975

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

   cat utilities.nml assim_mod.nml model.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

breaksw
endsw

#======================================================================
# Simulate a particular observing system:
# 2) declare sequences of observation sets
# 21600 -> every  6 hours
# 43200 -> every 12 hours
#======================================================================

set      num_obs = 10
set     ob_day_1 = 0
set ob_seconds_1 = 43200

if ( ${?NumObs} ) then
   set num_obs = $NumObs
endif
if ( ${?ObDay1} ) then
   set ob_day_1 = $ObDay1
endif
if ( ${?ObSec1} ) then
   set ob_seconds_1 = $ObSec1
endif

echo "set_def.out"            > create_obs_sequence.in
echo "1"                     >> create_obs_sequence.in
echo $num_obs                >> create_obs_sequence.in
echo $ob_day_1 $ob_seconds_1 >> create_obs_sequence.in
echo $ob_day_1 $ob_seconds_1 >> create_obs_sequence.in
echo "obs_seq.in"            >> create_obs_sequence.in

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

cat utilities.nml assim_mod.nml model.nml > input.nml

./create_obs_sequence < create_obs_sequence.in

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

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

cat << ENDofTask03 > perfect.nml
&perfect_model_obs_nml
   async                 = 0,
   obs_seq_in_file_name  = "obs_seq.in",
   obs_seq_out_file_name = "obs_seq.out",
   start_from_restart    = .true.,
   output_restart        = .true.,
   restart_in_file_name  = "perfect_ics",
   restart_out_file_name = "perfect_restart",
   init_time_days        = 0,
   init_time_seconds     = 0,
   output_interval       = 1 /
ENDofTask03

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

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

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

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

set async = 0
set ens_size = 20
set cutoff = 0.2
set cov_inflate = 1.00
set start_from_restart = .true.
set output_restart = .true.
set obs_sequence_file_name = '"obs_seq.out"'
set restart_in_file_name = '"filter_ics"'
set 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 num_output_ens_members = 10
set output_interval = 1

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

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 = $restart_in_file_name ,"       >> filter.nml
echo "   restart_out_file_name = $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

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

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

./filter

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

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

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

exit
