diff --git a/src/Applications/GEOSdas_App/CMakeLists.txt b/src/Applications/GEOSdas_App/CMakeLists.txt index c3beac5f..53981631 100644 --- a/src/Applications/GEOSdas_App/CMakeLists.txt +++ b/src/Applications/GEOSdas_App/CMakeLists.txt @@ -11,7 +11,8 @@ set(dasscripts fvsens fvsvec g54dvar - fp_seamless + fp_seamless + ldas_run.csh read_HIST.csh ) set(extraperlscripts diff --git a/src/Applications/GEOSdas_App/GEOSdas.csm b/src/Applications/GEOSdas_App/GEOSdas.csm index f2bdd02e..df494349 100755 --- a/src/Applications/GEOSdas_App/GEOSdas.csm +++ b/src/Applications/GEOSdas_App/GEOSdas.csm @@ -1901,6 +1901,7 @@ exit 1 /bin/cp $FVHOME/recycle/$EXPID.ana_radstat_rst.*.tar radstat endif + # GAAS restart files #------------------- if ( ! $DO4DVAR ) then @@ -3229,56 +3230,6 @@ endif #............................................................................. -# ------------------------------ - Sub LandAnalysisRun_() -# ------------------------------ - if ( $?ECHO___ ) set echo - - cd $FVWORK - set rstdate = ( `rst_date ./d_rst` ) - set mydate = (`tick $rstdate -21600`) # tick back 6 hours - - set DURATION = "060000" - set SUBDIR = "ldas.$mydate[1].$mydate[2]" - set LDINPUT_FORCE = "$FVWORK" - set EXPDOMAIN = "GLOBAL" - set RESOLUTION = "144x91" - set THREEHOURS = 10800 - - ldsetup -expid $EXPID \ - -nymd $mydate[1] \ - -nhms $mydate[2] \ - -duration $DURATION \ - -fvroot $FVROOT \ - -fvhome $FVHOME \ - -fvwork $FVWORK \ - -fvwork_subdir $SUBDIR \ - -expdomain $EXPDOMAIN \ - -resolution $RESOLUTION \ - -ldinput_force $FVWORK \ - -mettag $EXPID \ - -forcedtstep $THREEHOURS \ - -rstrtdir $FVWORK \ - -rstrtid $EXPID \ - -gid $GID \ - -noprompt - - echo y | lenkf.pl - -# Move output to top FVWORK directory -# ----------------------------------- - cd $FVWORK - foreach file ( `find $SUBDIR -name $EXPID\*.txt`) - /bin/mv $file . - end - foreach file ( `find $SUBDIR -name $EXPID\.ens\*`) - /bin/mv $file . - end - - # Last line of LandAnalysisRun_() -\end - -#............................................................................. # ------------------------------ Sub EvolveAinc0_( Viter_, Final_ ) @@ -5742,6 +5693,13 @@ endif /bin/cp $EXPID.ana_radstat_rst.$rtag.tar $RSTHOLD/ & endif + # hold lfo files for the next segment of ldas coupling + #---------------------------------------------------------- + if ( $LDAS_ANA ) then + mkdir -p $FVHOME/recycle/holdforc + /bin/cp *2d_lfo*nc4 $FVHOME/recycle/holdforc/. + endif + # local copy to be moved by pesto, 2nd copy to be dealt w/ by recycle #-------------------------------------------------------------------- if ( -e biasinp.$RSTSUFFIX ) then diff --git a/src/Applications/GEOSdas_App/fvpsas b/src/Applications/GEOSdas_App/fvpsas index a6548a51..40618a63 100755 --- a/src/Applications/GEOSdas_App/fvpsas +++ b/src/Applications/GEOSdas_App/fvpsas @@ -112,6 +112,7 @@ # 30May2013 Todling Add GetAODinfo4Fcst_ to retrieve AOD fields for fcsts # 13Jun2020 Todling Time aerosol analysis # 19Oct2020 Todling Call to JEDI analysis +# 10Mar2021 sqzhang Add call to LandAnalysis when coupling # #----------------------------------------------------------------------------- @@ -416,6 +417,24 @@ endif +#-------------------------------------- +# Run Land analysis +# ----------------- + + if ( $LDAS_ANA ) then + echo " LDAS coupling: fvpsas LDAS_ANA run lenkf " + zeit_ci.x ldasRun + ldas_run.csh 0 060000 |& tee -a ldasrun.log + if( $status) then + echo "ldasRun failed" + exit(1) + endif + zeit_co.x ldasRun + endif + +##--------------------------------- + + # Run the analysis if not doing replay # ----------------------------------- if ( ! -e replay.acq ) then @@ -474,6 +493,22 @@ endif endif +#------------------------------------------------ +# check ldas job status and stage ldas increments +#-------------------------------------------------- + if ( ( $LDAS_ANA ) && ( $LDASFDBK ) ) then + echo " LDAS coupling: stage 1" + zeit_ci.x ldasStage + ldas_run.csh 1 060000 |& tee -a ldasrun.log + if( $status) then + echo "ldas_run stage 1 failed" + exit(1) + endif + zeit_co.x ldasStage + endif + +#----------------------- + # Convert analysis eta file into GCM restart # ------------------------------------------ zeit_ci.x AnaToGcm @@ -511,14 +546,6 @@ Call RenameRstCheckPoint_( 1 ) zeit_co.x RenameRstCheckPoint -# Run Land analysis -# ----------------- - if ( $LDAS_ANA ) then - zeit_ci.x LandAnalysisRun - Call LandAnalysisRun_() - zeit_co.x LandAnalysisRun - endif - # Run the vortex tracker # ---------------------- zeit_ci.x VortexTrack diff --git a/src/Applications/GEOSdas_App/fvsetup b/src/Applications/GEOSdas_App/fvsetup index f94f1131..bb29ffad 100755 --- a/src/Applications/GEOSdas_App/fvsetup +++ b/src/Applications/GEOSdas_App/fvsetup @@ -375,7 +375,7 @@ my $SECS_PER_DAY = $SECS_PER_HR * $HRS_PER_DAY; my ($res, $hres); my ($g5hist_rc, $g5prog_rc); -my ($gocart_tracers, $radcor, $emiss, $lsmodel_flag, $rroute_flag); +my ($gocart_tracers, $radcor, $emiss, $lsmodel_flag, $ldas_flag, $rroute_flag); my ($agcm_rst_flg, $sensdeg, %setupfile, @otherheaders); my ($checkFLG, $dbqueue, $runjobFLG, $saveFLG, $stopFLG); my (@fvprompt, @fvANS1, @fvANS2, $fvsetupflags); @@ -509,7 +509,7 @@ $ENV{"PATH"} = $FindBin::Bin .":$ENV{PATH}"; while3 ( \&set_rcov ); while3 ( \&set_acftbias ); while3 ( \&set_newradbc ); - while3 ( \&set_ldasANA ); + while3 ( \&set_ldasANA ); while3 ( \&get_forecast ); if ($DAO == 0) { while3 ( \&get_mhost ) } while3 ( \&get_output ); @@ -520,7 +520,7 @@ $ENV{"PATH"} = $FindBin::Bin .":$ENV{PATH}"; # Create subdirectories in FVHOME # ------------------------------- - mkdir_fvhome(); + mkdir_fvhome(); # Create Namelists/tables for main DAS run # ---------------------------------------- @@ -570,6 +570,20 @@ $ENV{"PATH"} = $FindBin::Bin .":$ENV{PATH}"; $rc = system("$fvbin/fix_gocart_rc.csh $vres $fvhome/run/gocart"); die "Failed to fix GOCART levels-referencing $!" if ( $rc ); +# LDAS Setup is done separately, follow instructions in GEOSldas/README.md +# ------------------------------------------------------------------------ + print "\n checkprintout ldas_ana == 1 ($ldas_ana)\n"; + if ($ldas_ana == 1 ) { + print "\n Please run ldas_setup following instructions in GEOSldas/README.md\n"; + print "\n requires config input files: YOUR_exeinp.txt, YOUR_batinp.txt.\n" ; + print "\n example LDROOT: /discover/nobackup/$user/GEOSldas\n" ; + print "\n example LDHOME: /discover/nobackup/$user/ldascoup_C180\n" ; + print "\n example cd $LDROOT/install/bin/ \n"; + print "\n example salloc \n"; + print "\n example source g5_modules \n" ; + print "\n example ldas_setup setup $LDHOME exp_exeinp.txt exp_batinp.txt \n" ; + } + # Monthly Setup # ------------------------------------------------------------- # [this must be after HISTORY.rc.tmpl and silo.arc are created] @@ -3353,23 +3367,41 @@ sub set_newradbc { sub set_ldasANA { # initialize Land DAS processing flag - #------------------------------------ - $ldasANA = 0; - - # query for processing flag, if LDAS executable found - #---------------------------------------------------- - if (-e "$fvbin/LDASsa_assim_seq.x") { + #------------------------------------ + my($dflt, $ans1, $ans2, $ans3, $ans4); + $ldas_ana = 0; + $ldasfdbk = 0; + $ldas_flag = 0; + $dflt = "n"; print "\n-------------\n"; print "LDAS Analysis\n"; print "-------------\n\n"; - $ans = query(" Land DAS Analysis (y/n)?", "n"); - $ldasANA = 1 if yes($ans); - } + $ans1 = query(" Land DAS Analysis (y/n)?", $dflt) ; + $ldas_ana = 1 if yes($ans1); + print " ldas_ana ($ldas_ana)\n " ; + + if ($ldas_ana == 1) { + $ans2 = query(" Enable LDAS feedback to model y/n ? ", $dflt); + $ldasfdbk = 1 if yes($ans2); + print " ldasfdbk ($ldasfdbk)\n" ; + + if ($ldasfdbk ==1 ) { + $ldas_flag = 1 + } + + $ans3 = query("LDAS HOME = /discover/nobackup/$user/$ldasexp, full path? "); + $ldashome = $ans3 ; + + $ans4 = query("LDAS HOME for atm_ens = /discover/nobackup/$user/$ldasexp4ens, full path? "); + $ldashome4ens = $ans4 ; + + } return 0; } + #======================================================================= sub get_setgsi { @@ -3584,6 +3616,8 @@ EOF $replace{">>>EXPID<<<"} = $expid; $replace{">>>JOBNJ<<<"} = "$jobn.j"; $replace{">>>FVHOME<<<"} = "$fvhome"; + $replace{">>>LDAS_ANA<<<"} = $ldas_ana; + $replace{">>>LDHOME4ens<<<"} = "$ldashome4ens"; $atm_ens_j = "$fvhome/run/atm_ens.j"; $atm_ens_j_tilde = "${atm_ens_j}~"; @@ -4282,9 +4316,9 @@ sub get_history { # verify that HISTORY.rc.tmpl has collections needed by LDAS #----------------------------------------------------------- - if ( $ldasANA ) { + if ( $ldas_ana == 1 ) { $verify = 0; - @ldasinputs = qw / diag_sfc bkg.eta /; + @ldasinputs = qw / tavg1_2d_lfo inst1_2d_lfo /; foreach $prod ( @ldasinputs ) { open HIST, "< $fvroot/etc/$g5hist_rc"; unless ( grep /$prod/, ) { @@ -4301,7 +4335,7 @@ sub get_history { . " 2. Select again\n\n"; $ans = query(" Choose option 1 or 2:", "2"); return 1 unless $ans eq "1"; - } + } } print " Using HISTORY template: $g5hist_rc\n"; @@ -5206,12 +5240,11 @@ sub secs2hhmmss { #========================================================================= sub mkdir_fvhome { # create directories on FVHOME - print "\nSetting up FVHOME directory for $expid experiment ...\n"; foreach $dir (qw(ana diag daotovs etc obs prog radmon)) { mkpath("$fvhome/$dir") or die ">>> ERROR <<< creating directory $fvhome/$dir;"; } - foreach $dir (qw(rs run recycle fcst asens anasa)) { + foreach $dir (qw(rs run recycle fcst lana asens anasa)) { mkpath("$fvhome/$dir") or die ">>> ERROR <<< creating directory $fvhome/$dir;"; } foreach $subdir (qw( gaas gocart )) { @@ -7662,7 +7695,10 @@ print SCRIPT <<"EOF"; setenv GAAS_ANA $gaas_ana # 1 = aerosol analysis, 0 = disables it setenv GAASFDBK $gaasfdbk # 1 = feedback aerosol analysis into GCM, 0 = don't setenv SKIP_PSAS 0 # sets do_you_want_to_skip_PSAS in ana.rc.tmpl; 0 = no, 1 = yes - setenv LDAS_ANA $ldasANA # 0 = don't run Land DAS Analysis; 1 = run LDAS + setenv LDAS_ANA $ldas_ana # 1 = land analysis, 0 = disables it + setenv LDASFDBK $ldasfdbk # 1 = read land analysis incr into GCM (feedback), 0 = don't + setenv LDHOME $ldashome # land analysis home dir (ldas_exp/) for central + setenv LDHOME4ens $ldashome4ens # land analysis home dir for atm_ens setenv IGNORE_0 1 # 1 = ignore 0 length obs files in acquire setenv ACFTBIAS $acftbias setenv USE_MODIS_STAGE 0 # 1 = use MODIS data from MODIS_STAGE_DIR; 0 = don't @@ -9457,6 +9493,7 @@ sub init_agcm_rc { $flags{"iau"} = $doiau; $flags{"pcp_forced"} = $pcp_forced; $flags{"lsmodel_flag"} = $lsmodel_flag; + $flags{"ldas_flag"} = $ldas_flag; set_AGCM_flags(%flags); # $num_readers must divide evenly into $ny @@ -9569,6 +9606,7 @@ sub init_agcm_rc { AGCM_label_subst("\@LSM_CHOICE" , $lsmodel_flag); AGCM_label_subst("\@RUN_ROUTE" , $rroute_flag); AGCM_label_subst("\@NUM_READERS" , "1"); + AGCM_label_subst("\@LDAS_INCR" , $ldas_flag); # Choice of LSM parameters if ( "$landbcs" eq "Icarus-NLv3" ) { diff --git a/src/Applications/GEOSdas_App/ldas_add2rc b/src/Applications/GEOSdas_App/ldas_add2rc new file mode 100755 index 00000000..59999a1e --- /dev/null +++ b/src/Applications/GEOSdas_App/ldas_add2rc @@ -0,0 +1,77 @@ +#!/bin/bash + +MYNAME="ldas_add2rc" +if [[ $# -ne 2 ]]; then + echo " " + echo " NAME " + echo " " + echo " $MYNAME - reconcile GEOSldas and AGCM configurations in weakly-coupled LADAS " + echo " " + echo " SYNOPSIS " + echo " " + echo " $MYNAME FVHOME LDHOME" + echo " " + echo " where" + echo " FVHOME - location of ADAS experiment " + echo " LDHOME - location of LDAS experiment " + echo " " + echo " DESCRIPTION" + echo " " + echo " This procedure inserts select GEOSldas resource parameters into AGCM.rc and " + echo " verifies consistency between LDAS.rc and AGCM.rc for other resource parameters " + echo " " + echo " $MYNAME should be run after fvsetup and ldas_setup " + exit 0 +fi + +FVHOME="$1" +LDHOME="$2" + +# ---------------------------------------------------------------- +# extract the following parameters from LDAS.rc and add to AGCM.rc + +cd $FVHOME/run +cp AGCM.rc.tmpl AGCM.rc.tmpl.original + +list="LANDASSIM_DT LANDASSIM_T0 " + for var in $list +do + grep $var $LDHOME/run/LDAS.rc >> add.txt +done + +sed -i '/LDAS_INCR/r add.txt' AGCM.rc.tmpl + +echo " The following land parameters are added to AGCM.rc: " +for var in $list +do +echo "$(grep $var add.txt)" +done + +# add same resource parameters into AGCM.rc for atm ens +mv add.txt $FVHOME/run/atmens/. +cd $FVHOME/run/atmens/ +cp AGCM.rc.tmpl AGCM.rc.tmpl.original + +sed -i '/LDAS_INCR/r add.txt' AGCM.rc.tmpl + +rm -rf add.txt + +# ------------------------------------------------------------------------ +# check consistency of the following parameter between LDAS.rc and AGCM.rc + +clist=" Z0_FORMULATION:.* LAND_PARAMS:.* LSM_CHOICE:.* " + for var in $clist +do +Lset="$(grep $var $LDHOME/run/LDAS.rc)" +Aset="$(grep $var $FVHOME/run/AGCM.rc.tmpl)" +lv="$(echo $Lset | cut -d " " -f 2)" +av="$(echo $Aset | cut -d " " -f 2)" +if [ "$lv" != "$av" ]; then +echo " " +echo "Please repeat setup such that the following parameter values are consistent in AGCM.rc and LDAS.rc:" +echo "in AGCM.rc: $Aset " +echo "in LDAS.rc: $Lset " +echo " " +fi +done + diff --git a/src/Applications/GEOSdas_App/ldas_run.csh b/src/Applications/GEOSdas_App/ldas_run.csh new file mode 100755 index 00000000..a5a923fe --- /dev/null +++ b/src/Applications/GEOSdas_App/ldas_run.csh @@ -0,0 +1,206 @@ +#!/bin/csh -f + +set echo + +setenv MYNAME ldas_run.csh + +if ( $#argv < 2 ) then + echo " " + echo " \\begin{verbatim} " + echo " " + echo " NAME " + echo " " + echo " $MYNAME - entry point to obtain LDAS increments" + echo " " + echo " SYNOPSIS " + echo " " + echo " $MYNAME stage freqa" + echo " " + echo " where" + echo " stage - run step 0 or stage step 1" + echo " freqa - frequency of adas increments, as in HHMMSS" + echo " " + echo " DESCRIPTION" + echo " " + echo " This procedures handles the LDAS coupling in the central DAS. " + echo " " + echo " Example of valid command line:" + echo " $MYNAME 1 060000" + echo " " + echo " REQUIRED ENVIRONMENT VARIABLES" + echo " " + echo " FVHOME - location of experiment " + echo " FVROOT - location of DAS build " + echo " FVWORK - location of work directory " + echo " LDHOME - location of LDAS experiment " + echo " \\end{verbatim} " + echo " \\clearpage " + exit(0) +endif + +set path = ( . $FVHOME/run $FVROOT/bin $path ) + +setenv FAILED 0 +if ( !($?FVHOME) ) setenv FAILED 1 +if ( !($?FVROOT) ) setenv FAILED 1 +if ( !($?FVWORK) ) setenv FAILED 1 +if ( !($?LDHOME) ) setenv FAILED 1 + +if ( $FAILED ) then + env + echo " ${MYNAME}: not all required env vars defined" + exit 1 +endif + +set stage = $1 +set freqa = $2 + + + cd $FVWORK + set adas_strt = ( `rst_date ./d_rst` ) +set nymd = `echo $adas_strt[1] | cut -c1-8` +set hh = `echo $adas_strt[2] | cut -c1-2` +set yyyymmddhh = ${nymd}${hh} + +if (-e $FVWORK/.DONE_${MYNAME}.${yyyymmddhh} ) then + echo " ${MYNAME}: already done" + exit(0) +endif + + @ adas_int = $freqa / 10000 + @ adas_int = $adas_int * 3600 + + +if ( $stage == 0 ) then + echo " ${MYNAME}: stage 0" + +# lfo forcing + @ cent_int = 3600 + @ tavg1_tick0 = -1800 + @ inst1_tick0 = 0 + + set inst1_strt = ( `tick $adas_strt $inst1_tick0` ) + set tavg1_strt = ( `tick $adas_strt $tavg1_tick0` ) + + set secs = 0 + + while ( $secs < = $adas_int ) + set inst1_now = ( `tick $inst1_strt $secs` ) + set tavg1_now = ( `tick $tavg1_strt $secs` ) + + set tttt_i=`echo $inst1_now[2] | cut -c1-4` + set tttt_a=`echo $tavg1_now[2] | cut -c1-4` + + /bin/cp ${FVHOME}/recycle/holdforc/*.inst1_2d_lfo_Nx+-.$inst1_now[1]_${tttt_i}z.nc4\ + ${FVWORK} + /bin/cp ${FVHOME}/recycle/holdforc/*.tavg1_2d_lfo_Nx+-.$tavg1_now[1]_${tttt_a}z.nc4\ + ${FVWORK} + + @ secs = $secs + $cent_int + end + /bin/rm -f ${FVHOME}/recycle/holdforc/* + +#link $FVWORK for ldas met_forcing access + /bin/rm -f $FVHOME/lana/forc + /bin/ln -s $FVWORK $FVHOME/lana/forc + + echo " ${MYNAME}: LDAS coupling: run ldas for central DAS coupling" + # go to LDHOME to submit ldas run + cd $LDHOME/run + echo "ldas_home_dir: ", $LDHOME + set lcapdat = `cat cap_restart | cut -c1-8` + set lcaptim = `cat cap_restart | cut -c10-15` + echo "ldas_6h_window starting at: ", $lcapdat, $lcaptim + echo "adas_anal_window starting at: ", $adas_strt[1], $adas_strt[2] + + # submit job and capture job ID + set jobldas = "$LDHOME/run/lenkf.j" + set jobIDlong = `$PBS_BIN/sbatch $jobldas` + set jobID = `echo $jobIDlong |awk -F'[ ]' '{print $4}'` + setenv ldasJobIDs $jobID + echo $ldasJobIDs ": LDAS coupling lenkf jobID for central das " + +## back to fvwork + cd $FVWORK + +##stage incr + else + cd $FVWORK + echo " ${MYNAME}: LDAS coupling: stage/link LdasIncr for AGCM corrector " + if ($?ldasJobIDs) then + $FVROOT/bin/jobIDfilter -w $ldasJobIDs + unsetenv ldasJobIDs + endif + + set lenkf_status_file = ${FVWORK}/lenkf_job_completed.txt + rm -f $lenkf_status_file + + cp $LDHOME/run/lenkf_job_completed.txt $lenkf_status_file + + set lenkf_status = `cat $lenkf_status_file` + echo $lenkf_status + echo $lenkf_status ": lenkf_status" + if ($lenkf_status =~ SUCCEEDED ) then + echo "LDAS coupling Lenkf job SUCCEEDED, stageLdasIncr" + endif + +# current all member incr outputs in cat/ens_avg + set LINC_DIR = ${LDHOME}/output/*/cat/ens_avg/ + +# LANDASSIM_DT in sec (10800 ) + set ldas_int = 10800 + set ldasDT = `grep LANDASSIM_DT: ${LDHOME}/run/LDAS.rc | cut -d':' -f2` + if ( ${ldasDT} > 0 ) then + set ldas_int = ${ldasDT} + endif + +# LANDASSIM_T0 in hhmmss (centered update for ladas ) + set ldas_t0 = 013000 + set ldasT0 = `grep LANDASSIM_T0: ${LDHOME}/run/LDAS.rc | cut -d':' -f2` + if ( ${ldasT0} > 0 ) then + set ldas_t0 = ${ldasT0} + endif + set t0hh = `echo ${ldas_t0} | cut -c1-2` + set t0mm = `echo ${ldas_t0} | cut -c3-4` + @ cent_int = $t0hh * 3600 + $t0mm * 60 + + set lincr_native_name = catch_progn_incr + set lincr_default_name = ldas_inc + + set secs = 0 + + while ( $secs < $adas_int ) + # the begining time of the window secs=0 + set ldas_strt = ( `tick $adas_strt $secs` ) + # for ldas_incr, use LANDASSIM_T0 + set ldas_anlt = ( `tick $ldas_strt $cent_int` ) + + set yyyy_a=`echo $ldas_anlt[1] | cut -c1-4` + set mm_a=`echo $ldas_anlt[1] | cut -c5-6` + set dd_a=`echo $ldas_anlt[1] | cut -c7-8` + set tttt_a=`echo $ldas_anlt[2] | cut -c1-4` +# default name for AGCM: ldas_inc.yyyymmdd_hhnn00 + if ( -e ${LINC_DIR}/Y${yyyy_a}/M${mm_a}/*${lincr_native_name}.$ldas_anlt[1]_${tttt_a}z.nc4) then + + /bin/cp ${LINC_DIR}/Y${yyyy_a}/M${mm_a}/*.${lincr_native_name}.$ldas_anlt[1]_${tttt_a}z.nc4\ + ${FVWORK}/ldas_inc.$ldas_anlt[1]_${tttt_a}00 + + /bin/ln -s ${LINC_DIR}/Y${yyyy_a}/M${mm_a}/*${lincr_native_name}.$ldas_anlt[1]_${tttt_a}z.nc4\ + ${FVHOME}/lana/ldas_inc.$ldas_anlt[1]_${tttt_a}00 + else + echo " ${MYNAME}: WARNING: ldas incr file not found, no ldasIncr for this cycle" + exit 1 + endif + @ secs = $secs + $ldas_int + end + +# normal return +touch $FVWORK/.DONE_${MYNAME}.${yyyymmddhh} +echo " ${MYNAME}: Complete " + exit 0 + + endif #end stage=1 + + cd ${FVWORK} + + diff --git a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atm_ens.j b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atm_ens.j index 9dfb7027..35685b4a 100755 --- a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atm_ens.j +++ b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atm_ens.j @@ -143,6 +143,9 @@ setenv SPECRES 62 # should be able to revisit analyzer to avoid needing this setenv GAAS_ANA 1 + setenv LDAS_ANA >>>LDAS_ANA<<< + setenv LDHOME4ens >>>LDHOME4ens<<< + # Run-time mpi-related options # ---------------------------- @@ -451,6 +454,18 @@ zeit_co.x eaod endif endif + +# LDAS ens analysis at ens gcm resolution +# ----------------------------------- + if ( $LDAS_ANA ) then + zeit_ci.x eldas + atmos_eldas.csh $EXPID $anymd $anhms 060000 |& tee -a atm_ens.log + if( $status) then + echo "eldas failed" + exit(1) + endif + zeit_co.x eldas + endif # Run ensemble of atmospheric analyses # ------------------------------------ diff --git a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atmos_eldas.csh b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atmos_eldas.csh new file mode 100755 index 00000000..c1848dab --- /dev/null +++ b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/atmos_eldas.csh @@ -0,0 +1,198 @@ +#!/bin/csh -f + +if ( !($?ATMENS_VERBOSE) ) then + setenv ATMENS_VERBOSE 0 +else + if ( $ATMENS_VERBOSE ) set echo +endif + +setenv MYNAME atmos_eldas.csh + +if ( $#argv < 4 ) then + echo " " + echo " \\begin{verbatim} " + echo " " + echo " NAME " + echo " " + echo " $MYNAME - entry point to obtain LDAS4en increments" + echo " " + echo " SYNOPSIS " + echo " " + echo " $MYNAME expid nymd nhms freqa " + echo " " + echo " where" + echo " expid - usual experiment name, e.g., b541iau" + echo " nymd - date of current anal as in YYYYMMDD" + echo " nhms - time of current anal as in HHMMSS" + echo " freqa - frequency of ADASen analysis, as in HHMMSS" + echo " " + echo " " + echo " This procedures handles the LDAS coupling in the ensembe DAS. In its simplest form " + echo " this procedure makes the LDAS4ens ensavg analysis available to each of the members of the " + echo " ensemble." + echo " " + echo " Example of valid command line:" + echo " $MYNAME b541iau 20091019 000000 060000" + echo " " + echo " REQUIRED ENVIRONMENT VARIABLES" + echo " " + echo " FVHOME - location of experiment " + echo " FVROOT - location of DAS build " + echo " FVWORK - location of work directory " + echo " LDHOME4ens - location of LDAS4ens experiment " + echo " \\end{verbatim} " + echo " \\clearpage " + exit(0) +endif + +##source $FVROOT/bin/g5_modules +set path = ( . $FVHOME/run $FVROOT/bin $path ) + +setenv FAILED 0 +if ( !($?FVHOME) ) setenv FAILED 1 +if ( !($?FVROOT) ) setenv FAILED 1 +if ( !($?FVWORK) ) setenv FAILED 1 +if ( !($?LDHOME4ens) ) setenv FAILED 1 + +if ( $FAILED ) then + env + echo " ${MYNAME}: not all required env vars defined" + exit 1 +endif + +set expid = $1 +set nymd = $2 +set nhms = $3 +set freqa = $4 + +set hh = `echo $nhms | cut -c1-2` +set yyyymmddhh = ${nymd}${hh} + +setenv ENSWORK $FVWORK +if (-e $ENSWORK/.DONE_${MYNAME}.$yyyymmddhh ) then + echo " ${MYNAME}: already done" + exit(0) +endif + + echo " ${MYNAME}: LDAS4ENS coupling: run ldas for atmens coupling" + # ens forc access: $FVHOME/ensdiag/mem*** + # go to LDHOME to run ldas + cd $LDHOME4ens/run + echo "ldas_home_dir: ", $LDHOME4ens + # submit job and capture job ID + set jobldas = "$LDHOME4ens/run/lenkf.j" + set jobIDlong = `$PBS_BIN/sbatch $jobldas` + set jobID = `echo $jobIDlong |awk -F'[ ]' '{print $4}'` + setenv ldasJobIDs $jobID + echo $ldasJobIDs ": LDAS4ens coupling lenkf jobID " + +## back to fvwork + cd $FVWORK + + echo " ${MYNAME}: LDAS4ENS coupling: stage/link LdasIncr for eAGCM corrector " + setenv RSTSTAGE4AENS $FVHOME/atmens/RST + + if ($?ldasJobIDs) then + $FVROOT/bin/jobIDfilter -w $ldasJobIDs + unsetenv ldasJobIDs + endif + + set lenkf_status_file = ${FVWORK}/lenkf_job_completed.txt + rm -f $lenkf_status_file + + cp $LDHOME4ens/run/lenkf_job_completed.txt $lenkf_status_file + + set lenkf_status = `cat $lenkf_status_file` + echo $lenkf_status + echo $lenkf_status ": lenkf_status" + if ($lenkf_status =~ SUCCEEDED ) then + echo "LDAS4ens coupling Lenkf job SUCCEEDED, stageLdasIncr4ens" + +# current all member incr outputs in cat/ens_avg + set LINC_DIR = ${LDHOME4ens}/output/*/cat/ens_avg/ + +#make atmens/lana/mem* + cd ${FVHOME}/atmens + mkdir enslana + @ nmem = 0 + set dirs = (`/bin/ls -d mem0*`) + foreach dir ($dirs) + set nnn = `echo $dir | cut -c4-6` + mkdir ${FVHOME}/atmens/enslana/mem${nnn} + @ nmem ++ + end #foreach dir + cd - + + @ adas_int = $freqa / 10000 + @ adas_int = $adas_int * 3600 + + set ldas_int = 10800 + set ldasDT = `grep LANDASSIM_DT: ${LDHOME4ens}/run/LDAS.rc | cut -d':' -f2` + if ( ${ldasDT} > 0 ) then + set ldas_int = ${ldasDT} + endif + + set ldas_t0 = 013000 + set ldasT0 = `grep LANDASSIM_T0: ${LDHOME4ens}/run/LDAS.rc | cut -d':' -f2` + if ( ${ldasT0} > 0 ) then + set ldas_t0 = ${ldasT0} + endif + set t0hh = `echo ${ldas_t0} | cut -c1-2` + set t0mm = `echo ${ldas_t0} | cut -c3-4` + @ cent_int = $t0hh * 3600 + $t0mm * 60 + + + set lincr_native_name = catch_progn_incr + set lincr_default_name = ldas_inc + + + /bin/cp $RSTSTAGE4AENS/*.rst.lcv.*.bin my_d_rst + set adas_strt = ( `rst_date ./my_d_rst` ) + + set secs = 0 + + while ( $secs < $adas_int ) + # the begining time of the window secs=0 + set ldas_strt = ( `tick $adas_strt $secs` ) + # ldas anal time + set ldas_anlt = ( `tick $ldas_strt $cent_int` ) + + set yyyy_a=`echo $ldas_anlt[1] | cut -c1-4` + set mm_a=`echo $ldas_anlt[1] | cut -c5-6` + set dd_a=`echo $ldas_anlt[1] | cut -c7-8` + set tttt_a=`echo $ldas_anlt[2] | cut -c1-4` +# default name for AGCM: ldas_inc.yyyymmdd_hhnn00 + @ n = 0 +while ($n < $nmem) +set lentag = `echo $n | awk '{printf "%04d", $1}'` +echo $lentag +@ n++ +set memtag = `echo $n | awk '{printf "%03d", $1}'` +echo $memtag + /bin/ln -s ${LINC_DIR}/Y${yyyy_a}/M${mm_a}/*.${lincr_native_name}${lentag}.$ldas_anlt[1]_${tttt_a}z.nc4\ + ${FVHOME}/atmens/enslana/mem$memtag/ldas_inc.$ldas_anlt[1]_${tttt_a}00 + end + +## copy to FVWORK + cd ${FVWORK} + set dirs = (`/bin/ls -d mem0*`) + foreach dir ($dirs) + set nnn = `echo $dir | cut -c4-6` + /bin/cp ${FVHOME}/atmens/enslana/mem${nnn}/ldas_inc.$ldas_anlt[1]_${tttt_a}00\ + ${FVWORK}/mem${nnn}/ldas_inc.$ldas_anlt[1]_${tttt_a}00 + end #foreach dir +#--- + @ secs = $secs + $ldas_int + end #sec while loop + + else + echo " ${MYNAME}: WARNING: ldas4ens failed, no ldasIncr for this cycle to enAGCM " + exit 1 + endif #end ldas enkf succeeded + +# normal return +touch $FVWORK/.DONE_${MYNAME}.$yyyymmddhh +echo " ${MYNAME}: Complete " + exit 0 + + diff --git a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/AGCM.rc.tmpl b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/AGCM.rc.tmpl index 6faa8397..39718512 100644 --- a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/AGCM.rc.tmpl +++ b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/AGCM.rc.tmpl @@ -502,6 +502,11 @@ LSM_CHOICE: @LSM_CHOICE # # **************************************************************** +# Feedback Increments from ldas :1, no feedback: 0 +# --------------------------------------------------- +LDAS_INCR: 0 + + ############################################################################################## ############################################################################################## diff --git a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/HISTAENS.rc.tmpl b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/HISTAENS.rc.tmpl index 904e9779..aea492d9 100644 --- a/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/HISTAENS.rc.tmpl +++ b/src/Applications/NCEP_Etc/NCEP_enkf/scripts/gmao/etc/HISTAENS.rc.tmpl @@ -52,7 +52,9 @@ COLLECTIONS: 'bkg.eta' # Land output # 'tavg1_2d_lfo_Nx' # 'inst1_2d_lfo_Nx' -# 'tavg1_2d_lnd_Nx' +# 'tavg1_2d_lnd_Nx' +# 'tavg1_2d_lfo_Nx+-' +# 'inst1_2d_lfo_Nx+-' # Vortex track/relocator # 'vtx.mix' # Cubed trajectory (background for JEDI) @@ -626,6 +628,43 @@ COLLECTIONS: 'bkg.eta' 'SPSNOW' , 'SURFACE' , :: + tavg1_2d_lfo_Nx+-.format: 'CFIO', + tavg1_2d_lfo_Nx+-.descr: '2d,1-Hourly,Time-Averaged,Single-Level,Forecast,Land forcing' , + tavg1_2d_lfo_Nx+-.template: '%y4%m2%d2_%h2%n2z.nc4', + tavg1_2d_lfo_Nx+-.mode: 'time-averaged', + tavg1_2d_lfo_Nx+-.ref_date: >>>IOBBKGD<<< , + tavg1_2d_lfo_Nx+-.ref_time: >>>IOBBKGT<<< , + tavg1_2d_lfo_Nx+-.end_date: >>>IOEBKGD<<< , + tavg1_2d_lfo_Nx+-.end_time: >>>IOEBKGT<<< , + tavg1_2d_lfo_Nx+-.frequency: 010000, + tavg1_2d_lfo_Nx+-.duration: 010000 , + tavg1_2d_lfo_Nx+-.fields: 'SLRSF' , 'SOLAR' , 'SWGDN' , + 'SWLAND' , 'SURFACE' , + 'LWS' , 'IRRAD' , 'LWGAB' , + 'PCU' , 'SURFACE' , 'PRECCU' , + 'PLS' , 'SURFACE' , 'PRECLS' , + 'SNO' , 'SURFACE' , 'PRECSNO' , + 'DFPAR' , 'SOLAR' , 'PARDF' , + 'DRPAR' , 'SOLAR' , 'PARDR' , + :: + + inst1_2d_lfo_Nx+-.format: 'CFIO', + inst1_2d_lfo_Nx+-.descr: '2d,1-Hourly,Instantaneous,Single-Level,Forecast,land forcing' + inst1_2d_lfo_Nx+-.template: '%y4%m2%d2_%h2%n2z.nc4', + inst1_2d_lfo_Nx+-.mode: 'instantaneous' , + inst1_2d_lfo_Nx+-.ref_date: >>>IOBBKGD<<< , + inst1_2d_lfo_Nx+-.ref_time: >>>IOBBKGT<<< , + inst1_2d_lfo_Nx+-.end_date: >>>IOEBKGD<<< , + inst1_2d_lfo_Nx+-.end_time: >>>IOEBKGT<<< , + inst1_2d_lfo_Nx+-.frequency: 010000, + inst1_2d_lfo_Nx+-.duration: 010000 , + inst1_2d_lfo_Nx+-.fields: 'DZ' , 'DYN' , 'HLML' , + 'TA' , 'DYN' , 'TLML' , + 'QA' , 'DYN' , 'QLML' , + 'SPEED' , 'DYN' , 'SPEEDLML' , + 'PS' , 'DYN' , + :: + # Caution: this stream does not follow convention of output from # ensemble - file does not carry member information ...