#!/usr/bin/perl
#
####################################################################################
### Set variables.
$dirscript  = $ENV{DIRSCRIPT};
$decade     = $ENV{DECADE};
$mnamelc    = "access.$ENV{DECADE}";
$mnameuc    = uc $mnamelc;

$inittime   = $ENV{INITTIME};
$firstinit  = $ENV{FIRSTINIT};
$previnit   = $ENV{PREVINIT};
$preprevinit   = $ENV{PREPREVINIT};
$restart    = $ENV{RESTART};

$inc        = $ENV{INC};
$nhrs       = $ENV{NHRS};
$rstrtint   = $nhrs*60.;
$ndom       = $ENV{NDOM};
$nruns      = $ENV{NRUNS};

$dir        = $ENV{DIR};
$rawdata    = "/gscratch/uwbstem/raquel/DATA/templates";
$dirout     = "rocinante.atmos.uw.edu:/home/disk/rocinante/DATA/WRF/ACCESS_1.0_RCP45";
$dirin      = "rocinante.atmos.uw.edu:/home/disk/mass/steed/cmip5/rcp4.5/access1.0/data/ungrib";
$driver     = $ENV{DRIVER};
$driverwps  = $ENV{DRIVERWPS};
$tables     = "$driver";
$mymail     = $ENV{EMAIL};
$niter      = $ENV{niter};
####################################################################################
require "$dirscript/utils.pl";
#Folders
    $prepoutdir = "$dir/tmpwrf.$preprevinit";
    $poutdir = "$dir/tmpwrf.$previnit";
    $rundir = "$dir/tmpwrf.$inittime";
    if ( ! -d "$rundir" ) { system ("mkdir -p $rundir"); }
    #cp script to run with pbs
    system ("cp ./hyak-intel-impi-b.sh $rundir/hyak-intel-impi-b.sh"); 
    system ("cp ./hyak-intel-openmpi.sh $rundir/hyak-intel-openmpi.sh");
    system ("cp ./hyak-intel-openmpi-real.sh $rundir/hyak-intel-openmpi-real.sh");
    system ("cp ./hyak-intel-openmpi-met.sh $rundir/hyak-intel-openmpi-met.sh");
    chdir ("$rundir");

#Simulation period
$date        = $inittime;
$syyyy       = substr($date,0,4);
$smm         = substr($date,4,2);
$sdd         = substr($date,6,2);
$shh         = substr($date,8,2);

$date = &changetime10($inittime,$nhrs);
$eyyyy       = substr($date,0,4);
$emm         = substr($date,4,2);
$edd         = substr($date,6,2);
$ehh         = substr($date,8,2);

#Nudging 
$thistime        = &changetime10($inittime,$h);
$fdate           = "$firstinit" . "0000";
$tdate           = "$thistime"  . "0000";
($ddiff,$sdiff)  = &time_difference($fdate,"yy",$tdate,"yy");
$hhhh            = ($ddiff*24)+($sdiff/3600);
$hhhh            = $hhhh + $nhrs + $inc;
$nhrsp           = sprintf("%4.4d",$hhhh);

#Interval save
$int         = $inc*3600.; #hours(saving the simulation)
$intd1         = $inc*600.;
$intm        = $inc*60.;   #min
system ("echo $syyy $smm $sdd $shh");
system ("echo $eyyy $emm $edd $ehh");

#Restart
if ($restart) { $rstrt = ".true."; }
else          { $rstrt = ".false."; }

  #--cp rst from previous run
  $sdate = "$syyyy"."-"."$smm"."-"."$sdd"."_"."$shh".":00:00";
  #for ($d=1;$d<=$ndom;$d++) {
  #  $fname = "wrfrst_d0"."$d"."_"."$sdate";
  #  system ("rm -f $rundir/$fname");
  #  system ("cp $poutdir/$fname $rundir/$fname");
  #}
  #--when rst file is created we launch next run (WRFLOOP)
  $edate = "$eyyyy"."-"."$emm"."-"."$edd"."_"."$ehh".":00:00";
  $restartfile = "$rundir/wrfrst_d02"."_"."$edate";

#Edit namelist
system ("cp $rawdata/namelist.input $rundir/namelist.input");
system ("cp $rawdata/namelist.wps $rundir/namelist.wps");

##Edit namelist.wps
open (OUT,">$rundir/ppwps.sed");
print OUT <<"END";
/start_date/c\\
start_date = '$syyyy-$smm-${sdd}_00:00:00','$syyyy-$smm-${sdd}_00:00:00',
/end_date/c\\
end_date = '$eyyyy-$emm-${edd}_00:00:00','$eyyyy-$emm-${edd}_00:00:00',
END
close OUT;

##Edit namelist.input
open (OUT,">$rundir/pp.sed");
print OUT <<"END";
 /run_hours/c\\
 run_hours = $nhrs,
 /start_year/c\\
 start_year = $syyyy,$syyyy
 /start_month/c\\
 start_month = $smm,$smm
 /start_day/c\\
 start_day = $sdd,$sdd   
 /start_hour/c\\
 start_hour = $shh,$shh  
 /end_year/c\\
 end_year = $eyyyy,$eyyyy
 /end_month/c\\
 end_month = $emm,$emm  
 /end_day/c\\
 end_day = $edd,$edd 
 /end_hour/c\\
 end_hour = $ehh,$ehh
 /interval_seconds/c\\
 interval_seconds  = $int,
 /restart /c\\
 restart = $rstrt,
 /restart_interval /c\\
 restart_interval = $rstrtint,
 /auxinput4_interval/c\\
 auxinput4_interval = $intm,  $intm
 /auxinput4_end_h/c\\
 auxinput4_end_h = $nhrs,  $nhrs
 /max_dom/c\\
 max_dom = $ndom,
 /gfdda_interval_m/c\\
 gfdda_interval_m  = $intm,  0,
 /gfdda_end_h/c\\
 gfdda_end_h = $nhrsp, 0,
END
close OUT;

system ("sed -f $rundir/ppwps.sed $rundir/namelist.wps > $rundir/namelist.wps.new");
system ("rm -f $rundir/namelist.wps");
system ("cp -f $rundir/namelist.wps.new $rundir/namelist.wps");
system ("sed -f $rundir/pp.sed $rundir/namelist.input > $rundir/namelist.input.new");
system ("rm -f $rundir/namelist.input");
system ("cp -f $rundir/namelist.input.new $rundir/namelist.input");

system ("cp $rawdata/geo_em.d0*.nc $rundir ");
system ("scp  $dirin/FILE:$syyyy-$smm-$sdd* $rundir");
system ("scp  $dirin/FILE:$eyyyy-$emm-$edd* $rundir");

#copy executables and tables
    system ("cp $driverwps/metgrid/src/metgrid.exe $rundir/metgrid.exe");
    system ("cp -r $driverwps/metgrid $rundir");
    system ("cp $driver/wrf.exe $rundir/wrf.exe");
    system ("cp $driver/real.exe $rundir/real.exe");
    system ("cp $tables/CAM_ABS_DATA $rundir");
    system ("cp $tables/CAM_AEROPT_DATA $rundir");
    system ("cp $tables/ETAMPNEW_DATA $rundir");
    system ("cp $tables/ETAMPNEW_DATA_DBL $rundir");
    system ("cp $tables/GENPARM.TBL $rundir");
    system ("cp $tables/LANDUSE.TBL $rundir");
    system ("cp $tables/RRTMG_LW_DATA $rundir");
    system ("cp $tables/RRTMG_LW_DATA_DBL $rundir");
    system ("cp $tables/RRTMG_SW_DATA $rundir");
    system ("cp $tables/RRTMG_SW_DATA_DBL $rundir");
    system ("cp $tables/RRTM_DATA $rundir");
    system ("cp $tables/RRTM_DATA_DBL $rundir");
    system ("cp $tables/SOILPARM.TBL $rundir");
    system ("cp $tables/URBPARM.TBL $rundir");
    system ("cp $tables/VEGPARM.TBL $rundir");
    system ("cp $tables/co2_trans $rundir");
    system ("cp $tables/grib2map.tbl $rundir");
    system ("cp $tables/gribmap.txt $rundir");
    system ("cp $tables/ozone.formatted $rundir");
    system ("cp $tables/ozone_lat.formatted $rundir");
    system ("cp $tables/ozone_plev.formatted $rundir");
    system ("cp $tables/tr49t67 $rundir");
    system ("cp $tables/tr49t85 $rundir");
    system ("cp $tables/tr67t85 $rundir");
#    system ("cp $tables/CAMtr_volume_mixing_ratio.RCP8.5 $rundir/CAMtr_volume_mixing_ratio");

system ("sed -i 's|change|$rundir|g' $rundir/hyak-intel-impi-b.sh");
system ("sed -i 's|change|$rundir|g' $rundir/hyak-intel-openmpi.sh");
system ("sed -i 's|change|$rundir|g' $rundir/hyak-intel-openmpi-real.sh");
system ("sed -i 's|change|$rundir|g' $rundir/hyak-intel-openmpi-met.sh");

#run metgrib
 #system ("qsub -l nodes=1:ppn=1,walltime=01:00:00 -W group_list=hyak-uwbstem $rundir/hyak-intel-openmpi-met.sh");
 system ("qsub -I -q build -l walltime=1:00:00");
 #system("ssh n610");
 chdir ("$rundir"); 
 system("./metgrid.exe");
 system("./real.exe");
 system("exit");
 chdir ("$rundir");

$SUCC = qx(cat $poutdir/rsl.error.0000 | grep 'wrf: SUCCESS COMPLETE REAL_EM INIT' | wc -l);

 if ($SUCC == 0) {
 #  system("mail -s 'crash real $ninter $sdate $ENV{DECADE}' $mymail <<<'$n'");
 #  system ("echo $niter $sdate $decade 'crash real' > $dirscript/ppcrash-$decade");
   system ("echo $SUCC $niter $sdate $decade >> $dirscript/crashreal$dedade");
  }
   else  {
   goto RUNWRF;
  }

#waiting to rst file is created ...
RUNWRF: $fname = "$poutdir/wrfrst_d02"."_"."$sdate";

   if ($restart) { 
     $maxwait = 60;
     for ($t=0;$t<=$maxwait;$t++) {
      system ("echo $t $maxwait >> $rundir/ppcuenta");
     if ($t<60){
        if (! -e $fname) {
            system ("echo $fname >> $rundir/ppcuenta4");
            sleep 60;
         }
        else{
            $SUCC = qx(cat $poutdir/rsl.error.0000 | grep 'wrf: SUCCESS COMPLETE WRF' | wc -l);
            if ($SUCC == 0) {
            system ("echo 'runsucc' >> $rundir/pprunsucc");
            }
            else{
            for ($d=1;$d<=$ndom;$d++) {
               $fname = "wrfrst_d0"."$d"."_"."$sdate";
               system ("rm -f $rundir/$fname");
               system ("cp $poutdir/$fname $rundir/$fname");
               system ("scp $poutdir/$fname $dirout/$mnamelc/wrfrst");
          #     system ("scp $dirout/wrfrst/$fname $rundir/$fname");
               }
               system ("scp $poutdir/wrfout_d0* $dirout/$mnamelc/wrfoutputs");
               system ("qsub -l nodes=1:ppn=16,walltime=01:00:00 -W group_list=hyak-uwbstem $rundir/hyak-intel-openmpi.sh"); 
               system ("rm -r $prepoutdir");
               goto GOUT;
          }#succ 
       }#filerst
     } #time
     else{
     system ("echo $niter $sdate $decade >> $dirscript/ppcrash-$decade");
     system("mail -s 'crash until $ninter $sdate $ENV{DECADE}' $mymail <<<'$n'");
     exit;
     }
     } #for     
  } #ifrst
  else { 
  system ("qsub -l nodes=1:ppn=16,walltime=01:00:00  -W group_list=hyak-uwbstem $rundir/hyak-intel-openmpi.sh");
  system ("scp $poutdir/wrfout_d0* $dirout/$mnamelc/wrfoutputs");
  }

GOUT: system ("echo $fname > $dirscript/pprstdone");
exit;
