#!/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: RunL63,v 1.14 2004/04/26 20:34:04 thoar Exp $
#
# script to run an experiment with existing intial conditions
#======================================================================
# Find the project and build it, if need be.
#======================================================================

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"
sleep 2

set Model = lorenz_63

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

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

cat << ENDofTask00 > utilities.nml
&utilities_nml
   logfilename = "create_obs_set_def.out",
   TERMLEVEL = 1
&end
ENDofTask00
   
cat << ENDofTask01 > assim_mod.nml
&assim_model_nml
   binary_restart_files = .false.
&end
ENDofTask01

cat << ENDofTask02 > model.nml

&model_nml
   sigma  = 10.0,
   r      = 28.0,
   b      = 2.6666666666667,
   deltat = 0.01
&end

ENDofTask02

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

echo " "
echo "Running create_obs_set_def ..."
echo " "

set obs_error_variance = 1.0
if ( ${?ObsError} ) then
   set obs_error_variance = $ObsError
endif

echo "set_def.out"        > create_obs_set_def.in
echo "1       # of unique observation sets to define" >> create_obs_set_def.in
echo "3       # of observations in set 1 (x,y,z)"     >> create_obs_set_def.in
echo $obs_error_variance                              >> create_obs_set_def.in
echo "1       1 == state variable 1 (X)"              >> create_obs_set_def.in
echo $obs_error_variance                              >> create_obs_set_def.in
echo "2       1 == state variable 1 (Y)"              >> create_obs_set_def.in
echo $obs_error_variance                              >> create_obs_set_def.in
echo "3       1 == state variable 1 (Z)"              >> create_obs_set_def.in

echo '&utilities_nml'                                  > utilities.nml
echo '   logfilename = "create_obs_set_def.out"'      >> utilities.nml
echo '   TERMLEVEL = 1'                               >> utilities.nml
echo '&end'                                           >> 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

#======================================================================
# Simulate a particular observing system:
# 2) declare sequences of observation sets
#======================================================================

echo " "
echo "Running create_obs_sequence ..."
echo " "

set num_obs = 1000
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
echo '&end'                                       >> 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
#======================================================================

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

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
&end
ENDofTask03

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

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

set async = 0
set ens_size = 20
set cutoff = 22222222.0
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 = 20
set output_interval = 1

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 '&end'                                     >> 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 = $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 "&end"                                                    >> filter.nml
echo " "                                                       >> filter.nml

cat utilities.nml assim_mod.nml model.nml filter.nml > 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 model.nml perfect.nml filter.nml input.nml
endif

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

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

exit
