#!/bin/bash
# copy in the same dir as bench.sh, or change $exe
# August 2024, @NVillefranque

set -eu

source ../install_shared/env.sh

#------------------ memo -------------------#
#       i =   01 02 03 04 05 06 07 08       #
# sza tab = [ 00 11 22 33 44 55 66 77 ]     #
#-------------------------------------------#

# each exp in $listexp will be run
# available exps: test|bench|ArtIII
listexp="test bench ArtIII"
listexp="test bench"
listexp="test"
listexp="Maelle"
listexp="ArtIIImean"

# read metric file if exists?
use_metric_file=0

# run bench with seed option for reproducibility
# exe="./bench.sh"
exe="./bench.sh -seed 123 -cutoff_val 3,2.5,2 -cutoff_wav 1,5,10" # -noplot 

# this should not be changed
edir=models/ECRAD
mkdir -p log

#-------------------- utility function -------------------#
# returns either -metrics $met or -metrics_file $filemet  #
write_optmet() {                                          #
  if [ $use_metric_file -eq 0 ] || [ ! -f $filemet ]      #
  then                                                    #
    optmet="-metrics $met"                                #
    use_metric_file=0                                     #
  else                                                    #
    optmet="-metrics_file $filemet"                       #
  fi                                                      #
  echo $optmet                                            #
}                                                         #
#---------------------------------------------------------#

echo launch the exp : $listexp
#----------- loop over listexp -------------#
for exp in $listexp 
do
  met=
  logfile=log/bench_ecrad_${exp}_$$.out
  echo exp = $exp
case $exp in 
  ########################################
  # experiment "test", Tripleclouds, 2 parameters 1 metric 2 waves
  test) nwave=2
  filemet=$edir/metrics_def_${exp}.csv
  dir_rad=""
  cp $edir/params/param_${exp} $edir/
  sed_i 's/^namelist=.*/namelist=config_'$exp'/g' $edir/serie_ECRAD.sh
  sed_i 's,^HTN=.*,HTN=$ECRAD/work/tuning_'$exp'/,g' $edir/serie_ECRAD.sh
  sed_i 's/^opt_rad=.*/opt_rad=1/g' src/get_one_metric_target_and_var.sh
  sed_i 's/^dir_rad=.*/dir_rad='$dir_rad'/g' src/get_one_metric_target_and_var.sh
  sed_i "s/^dir_les=.*/dir_les=$dir_rad/g" $edir/serie_ECRAD.sh
  
  l=REF.1.ARMCU.008
  i=03   # SZA = 22
  m=unt  # abs|unt|toa
  
  s=`echo $l | awk -F "." ' { print $1 } '`
  c=`echo $l | awk -F "." ' { print $3 } '`
  t=`echo $l | awk -F "." ' { print $4 } '`
  
  # met = RAD_ARMCU_REF008_unt_03_03
  met=RAD_${c}_${s}${t}_${m}_${i}_${i}
  
  optmet=$(write_optmet)
 
   
  echo $exe -model ECRAD -waves "$(seq 1 $nwave)" $optmet -param param_$exp \
    -wdir TESTECRAD${use_metric_file} -sample_size_next_design 20 \
    ">" $logfile 
  $exe -model ECRAD -waves "$(seq 1 $nwave)" $optmet -param param_$exp \
    -wdir TESTECRAD${use_metric_file} -sample_size_next_design 20 \
    > $logfile 2>&1 

  ;;

  ########################################
  # experiment "bench", SPARTACUS, 4 parameters, 3 metrics 3 waves
  bench) nwave=3
  filemet=$edir/metrics_def_${exp}.csv
  cp $edir/params/param_$exp $edir/
  sed_i 's/^namelist=.*/namelist=config_'$exp'/g' $edir/serie_ECRAD.sh
  sed_i 's,^HTN=.*,HTN=$ECRAD/work/tuning_'$exp'/,g' $edir/serie_ECRAD.sh
  sed_i 's/^opt_rad=.*/opt_rad=1/g' src/get_one_metric_target_and_var.sh
  
  listCases=(ARMCU_REF008 FIRE_REF015 SANDU_SLOW008)
  listSZAs=(01 03 03)
  for i in 0 1 2 
  do
    sza=${listSZAs[$i]}
    met=${met}RAD_${listCases[$i]}_unt_${sza}_${sza},
  done

  met=${met:0:-1}

  optmet=$(write_optmet)
  
  echo $exe -model ECRAD -waves "$(seq 1 $nwave)" $optmet -param param_$exp \
    -wdir BENCHECRAD${use_metric_file} \
    ">" $logfile 
  $exe -model ECRAD -waves "$(seq 1 $nwave)" $optmet -param param_$exp \
    -wdir BENCHECRAD${use_metric_file} \
    > $logfile 2>&1 

  ;;

  ########################################
  # experiment "ArtIII", Villefranque et al. 2021
  ArtIII) nwave=3 # 13
  filemet=$edir/metrics_def_${exp}.csv
  dir_rad=""
  cp $edir/params/param_$exp $edir/
  sed_i "s/^namelist=.*/namelist=config_'$exp'/g" $edir/serie_ECRAD.sh
  sed_i 's,^HTN=.*,HTN=$ECRAD/work/tuning_'$exp'/,g' $edir/serie_ECRAD.sh
  sed_i 's/^opt_rad=.*/opt_rad=2/g' src/get_one_metric_target_and_var.sh
  sed_i 's/^dir_rad=.*/dir_rad='$dir_rad'/g' src/get_one_metric_target_and_var.sh
  sed_i "s/^dir_les=.*/dir_les=$dir_rad/g" $edir/serie_ECRAD.sh

  listCases=$(cat $edir/list_selected_$exp.txt)
  for l in $listCases
  do
    for i in 01 05 08
    do
      s=`echo $l | awk -F "." ' { print $1 } '`
      c=`echo $l | awk -F "." ' { print $3 } '`
      t=`echo $l | awk -F "." ' { print $4 } '`
      met=${met}RAD_${c}_${s}${t}_unt_${i}_${i},
      met=${met}RAD_${c}_${s}${t}_uptoa_${i}_${i},
      met=${met}RAD_${c}_${s}${t}_abs_${i}_${i},
    done 
  done
  met=${met:0:-1}

  optmet=$(write_optmet)

  echo $exe -model ECRAD -waves "$(seq 1 $nwave)" $optmet -param param_$exp \
    -wdir ArtIII${use_metric_file} -sample_size_next_design 80 \
    ">" $logfile
  $exe -model ECRAD -waves "$(seq 1 $nwave)" $optmet -param param_$exp \
    -wdir ArtIII${use_metric_file} -sample_size_next_design 80 \
    > $logfile 2>&1 
  ;;

  ########################################
  # mix of Maelle ave angle subexp and ArtIII
  ArtIIImean) nwave=10; begwave=1
  cst_err=1
  solver=spartacus         #spartacus|3clouds|3cloudsID
  subexp=mean3D
  expnam=$solver$subexp
  wdir=ArtIIImean${use_metric_file}-$expnam
  param=param_$exp
  ssnd=100
  model=ECRAD
  use_metric_file=0

  var=uptoa
  met=""
  case $subexp in 
    mean3D)
    met=${met}RAD_ARMCU_REF008_${var}_01_08,
    met=${met}RAD_ARMCU_REF012_${var}_01_08,
    met=${met}RAD_RICO_REF005_${var}_01_08,
    met=${met}RAD_RICO_REF012_${var}_01_08,
    ;;

    meanica)
    met=${met}RADICA_ARMCU_REF008_${var}_01_08,
    met=${met}RADICA_ARMCU_REF012_${var}_01_08,
    met=${met}RADICA_RICO_REF005_${var}_01_08,
    met=${met}RADICA_RICO_REF012_${var}_01_08,
    ;;

    3angica)
    met=${met}RADICA_ARMCU_REF008_${var}_01_01,
    met=${met}RADICA_ARMCU_REF008_${var}_05_05,
    met=${met}RADICA_ARMCU_REF008_${var}_08_08,

    met=${met}RADICA_ARMCU_REF012_${var}_01_01,
    met=${met}RADICA_ARMCU_REF012_${var}_05_05,
    met=${met}RADICA_ARMCU_REF012_${var}_08_08,

    met=${met}RADICA_RICO_REF005_${var}_01_01,
    met=${met}RADICA_RICO_REF005_${var}_05_05,
    met=${met}RADICA_RICO_REF005_${var}_08_08,

    met=${met}RADICA_RICO_REF012_${var}_01_01,
    met=${met}RADICA_RICO_REF012_${var}_05_05,
    met=${met}RADICA_RICO_REF012_${var}_08_08,
    ;;

    3ang3D)
    met=${met}RAD_ARMCU_REF008_${var}_01_01,
    met=${met}RAD_ARMCU_REF008_${var}_05_05,
    met=${met}RAD_ARMCU_REF008_${var}_08_08,

    met=${met}RAD_ARMCU_REF012_${var}_01_01,
    met=${met}RAD_ARMCU_REF012_${var}_05_05,
    met=${met}RAD_ARMCU_REF012_${var}_08_08,

    met=${met}RAD_RICO_REF005_${var}_01_01,
    met=${met}RAD_RICO_REF005_${var}_05_05,
    met=${met}RAD_RICO_REF005_${var}_08_08,

    met=${met}RAD_RICO_REF012_${var}_01_01,
    met=${met}RAD_RICO_REF012_${var}_05_05,
    met=${met}RAD_RICO_REF012_${var}_08_08,
    ;;

  esac
  met=${met:0:-1}
  optmet=$(write_optmet)

  #radiative configuration
  opt_rad=1 # absolute tolerance
  namelist=config_ArtIIImean_${solver}
  sed_i "s/^namelist=.*/namelist=$namelist/g" $edir/serie_ECRAD.sh
  sed_i 's,^HTN=.*,HTN=$ECRAD/work/tuning_'$exp'-'$expnam'/,g' $edir/serie_ECRAD.sh
  sed_i 's/^opt_rad=.*/opt_rad='$opt_rad'/g' src/get_one_metric_target_and_var.sh

  # TEST TRIPLECLOUDS TGT 3D MC FLUXES
  #if [ $cst_err -eq 1 ] ; then err_uptoa=9 ; fi 
  if [ $cst_err -eq 1 ] ; then err_uptoa=3.5 ; fi
  sed_i 's/^err_uptoa=.*/err_uptoa='$err_uptoa'/g' src/get_one_metric_target_and_var.sh

  # TEST PERFECT CLOUD PROFILES = HOURLY AVERAGE INSTEAD OF INSTANT
  #dir_rad=L12.8km_hourly_ave         #Radiative ref hourly average, 12.8km LES
  dir_rad=L12.8km_hourly_instant     #Radiative ref instantaneous,  12.8km LES
  sed_i 's/^dir_rad=.*/dir_rad='$dir_rad'/g' src/get_one_metric_target_and_var.sh
  sed_i "s/^dir_les=.*/dir_les=$dir_rad/g" $edir/serie_ECRAD.sh

  cmd='$exe -wdir $wdir -waves "`seq $begwave $nwave`" -param $param -ssnd $ssnd $optmet -model $model'

  echo $cmd
  eval $cmd

  ;;

  ########################################
  # experiment for GRL (cross finger)
  Maelle) nwave=30 ; begwave=1
  cst_err=0
  solver=spartacus      #spartacus|3clouds|3cloudsID
  subexp=2cases3angles
  confbest=_best_16-092
  expnam=$solver$subexp$confbest
  wdir=Maelle${use_metric_file}-$expnam
  param=param_CL13
  ssnd=130
  model=LMDZ

  fileallmet=$edir/metrics_def_${exp}-${solver}.csv

  # define metrics depending on the sub experiment
  # works with and without metrics_def file
  case $subexp in
    2cases1aveang)
    met=""
    var=uptoa
    met=${met},RAD_ARMCU_REF008_${var}_01_08
    met=${met},RAD_ARMCU_REF012_${var}_01_08
    met=${met},RAD_RICO_REF005_${var}_01_08
    met=${met},RAD_RICO_REF012_${var}_01_08
    use_metric_file=0
    filemet=""
    ;;

    1cases1aveang)
    met=""
    var=uptoa
    met=${met},RAD_ARMCU_REF008_${var}_01_08
    met=${met},RAD_ARMCU_REF012_${var}_01_08
    use_metric_file=0
    filemet=""
    ;;

    2cases2angles)
    met=""
    for sza in 05 08 ; do
      var=uptoa
      met=${met},RAD_ARMCU_REF008_${var}_${sza}_${sza}
      met=${met},RAD_ARMCU_REF012_${var}_${sza}_${sza}
      met=${met},RAD_RICO_REF005_${var}_${sza}_${sza}
      met=${met},RAD_RICO_REF012_${var}_${sza}_${sza}
    done
    filemet=$fileallmet
    ;;

    2cases3angles)
    met=""
    for sza in 01 05 08 ; do
      var=uptoa
      met=${met},RAD_ARMCU_REF008_${var}_${sza}_${sza}
      met=${met},RAD_ARMCU_REF012_${var}_${sza}_${sza}
      met=${met},RAD_RICO_REF005_${var}_${sza}_${sza}
      met=${met},RAD_RICO_REF012_${var}_${sza}_${sza}
    done
    filemet=$fileallmet
    ;;

    1cases3angles)
    met=""
    for sza in 01 05 08 ; do
      var=uptoa
      met=${met},RAD_ARMCU_REF008_${var}_${sza}_${sza}
      met=${met},RAD_ARMCU_REF012_${var}_${sza}_${sza}
    done
    filemet=${fileallmet}_${subexp}
    grep ARMCU $fileallmet > $filemet
    ;;

    1cases1angle1)
    met=""
    for sza in 01 ; do
      var=uptoa
      met=${met},RAD_ARMCU_REF008_${var}_${sza}_${sza}
      met=${met},RAD_ARMCU_REF012_${var}_${sza}_${sza}
    done
    filemet=${fileallmet}_${subexp}
    grep ARMCU $fileallmet |grep 01_01 > $filemet
    ;;

    1cases1angle8)
    met=""
    for sza in 08 ; do
      var=uptoa
      met=${met},RAD_ARMCU_REF008_${var}_${sza}_${sza}
      met=${met},RAD_ARMCU_REF012_${var}_${sza}_${sza}
    done
    filemet=${fileallmet}_${subexp}
    grep ARMCU $fileallmet |grep 08_08 > $filemet
    ;;

  esac

  met=${met:1}

  optmet=$(write_optmet)

  #radiative configuration
  opt_rad=1                      #absolute tolerance
  #namelist=config_${solver}_glob #best global tuning ArtIII
  namelist=config${confbest}_${solver}
  sed_i "s/^namelist=.*/namelist=$namelist/g" $edir/serie_ECRAD.sh
  sed_i 's,^HTN=.*,HTN=$ECRAD/work/tuning_'$exp'-'$expnam'/,g' $edir/serie_ECRAD.sh
  sed_i 's/^opt_rad=.*/opt_rad='$opt_rad'/g' src/get_one_metric_target_and_var.sh

  # this is only useful if $use_metric_file is 0
  case $solver in 
    spartacus) err_uptoa=3.5;;                #tolerance to error in W/m2
    3clouds)   err_uptoa=9  ;;                # x 2.5 par rapport à spartacus
  esac
  if [ $cst_err -eq 1 ] ; then err_uptoa=3.5 ; fi
  sed_i 's/^err_uptoa=.*/err_uptoa='$err_uptoa'/g' src/get_one_metric_target_and_var.sh

  dir_rad=L12.8km_hourly_ave     #Radiative ref hourly average on 12.8km LES
  sed_i 's/^dir_rad=.*/dir_rad='$dir_rad'/g' src/get_one_metric_target_and_var.sh
  sed_i "s/^dir_les=.*/dir_les=$dir_rad/g" $edir/serie_ECRAD.sh

  #LMDZ configuration
  #vLMDZ=20230626.trunk
  LMAX=95
  phys=NPv6.3
  rad=rrtm
  #sed_i "s/version=.*./version=\" -v ${vLMDZ}\"/" models/LMDZ/setup_LMDZ.sh

  cmd='$exe -wdir $wdir -waves "`seq $begwave $nwave`" -param $param -ssnd $ssnd $optmet -model $model -opt_model "-phys $phys -rad $rad -LMAX $LMAX"'

  echo $cmd
  eval $cmd
  ;;


  ########################################
  # experiment with cloud metrics preconditionning ArtII1
  # and then adding radiative metrics evaluated with ECRAD 
  # with fixed ecrad parameter values or not
  # Not very studied (yet !)
  clourad) 
  wdir=clourad${use_metric_file}
  param=param_ArtII1_avec_ecrad  #add 3 free spartacus parameter to vary
  param=param_ArtII1 
  ssnd=30
  model=LMDZ
  nwave_clou=1  #wave number with cloud metrics
  nwave_rad=1   #wave number with radiative metrics
  met_clou="ARMCU_REF_zav-400-600-theta_7_9,ARMCU_REF_zav-400-600-qv_7_9,ARMCU_REF_nebmax_7_9,RICO_REF_nebmax_19_25,SANDU_REF_neb4zave_50_60"
  
  met_rad=""
  i=0
  for sza in 01 05 08 ; do
    var=uptoa
    met_rad=${met_rad},RAD_ARMCU_REF008_${var}_${sza}_${sza}
    met_rad=${met_rad},RAD_ARMCU_REF012_${var}_${sza}_${sza}
    met_rad=${met_rad},RAD_RICO_REF005_${var}_${sza}_${sza}
    met_rad=${met_rad},RAD_RICO_REF012_${var}_${sza}_${sza}
  done
  met_rad=${met_rad:1}

  #LMDZ configuration
  #vLMDZ=20230626.trunk
  LMAX=95
  phys=NPv6.3
  rad=rrtm
  #sed_i "s/version=.*./version=\" -v ${vLMDZ}\"/" models/LMDZ/setup_LMDZ.sh

  #radiative configuration
  opt_rad=1                      #absolute tolerance
  err_uptoa=5                    #tolerance to error in W/m2
  dir_rad=L12.8km_hourly_ave     #Radiative ref hourly average on 12.8km LES
  namelist=config_spartacus_glob #best global tuning ArtIII
  sed_i "s/^namelist=.*/namelist=$namelist/g" $edir/serie_ECRAD.sh
  sed_i 's,^HTN=.*,HTN=$ECRAD/work/tuning_'$exp'/,g' $edir/serie_ECRAD.sh
  sed_i "s/^dir_les=.*/dir_les=$dir_rad/g" $edir/serie_ECRAD.sh
  sed_i 's/^opt_rad=.*/opt_rad='$opt_rad'/g' src/get_one_metric_target_and_var.sh
  sed_i 's/^err_uptoa=.*/err_uptoa='$err_uptoa'/g' src/get_one_metric_target_and_var.sh
  sed_i 's/^dir_rad=.*/dir_rad='$dir_rad'/g' src/get_one_metric_target_and_var.sh

  #premiere vague que nuageuse
  echo $exe -wdir $wdir -waves "`seq 1 $nwave_clou`" -param $param -ssnd $ssnd \
  -metrics $met_clou -model $model \
  -opt_model "-phys $phys -rad $rad -LMAX $LMAX"

  $exe -wdir $wdir -waves "`seq 1 $nwave_clou`" -param $param -ssnd $ssnd \
  -metrics $met_clou -model $model \
  -opt_model "-phys $phys -rad $rad -LMAX $LMAX"

  bash setup.sh ECRAD $wdir
  #deuxième vague avec métriques radiatives
  #if [ ! -f WORK/$wdir/serie_ECRAD.sh ] ; then
  #  #on rappatrie les fichiers liés à ECRAD 
  #  #car ils ne sont pas rappatriés par le bench.sh
  #  #(la partie "rappatriement ECRAD" n'est fait automatiquement par le bench
  #  # qu'à la première vague si model=ECRAD ou s'il y a une métruque
  #  # radiative)
  #  cp -r models/ECRAD/* WORK/$wdir/
  #  cd WORK/$wdir
  #  ln -s ../../RAD .
  #  cd -
  #fi
  nwave_ini=$(($nwave_clou +1))
  nwave_fin=$(($nwave_clou+$nwave_rad))
  met=$met_clou,$met_rad
  
  echo $exe -wdir $wdir -waves "`seq $nwave_ini $nwave_fin`" -param $param \
  -ssnd $ssnd -metrics $met -model $model \
  -opt_model "-phys $phys -rad $rad -LMAX $LMAX"

  $exe -wdir $wdir -waves "`seq $nwave_ini $nwave_fin`" -param $param \
  -ssnd $ssnd -metrics $met -model $model \
  -opt_model "-phys $phys -rad $rad -LMAX $LMAX"

esac
done

echo "End of $0"
