From 0431b26650c5e5d4eb741304a05c841d3fda0ddc Mon Sep 17 00:00:00 2001 From: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com> Date: Tue, 20 Aug 2024 17:09:01 -0400 Subject: [PATCH 1/4] add lgetkf observer and solver templates (#1252) This PR adds prototype templates to run the lgetkf in observation and solver modes. Doing so necessitates updates to `parm/jcb-algorithms` and `parm/jcb-gdas`. The PR also changes the `iodafile` in `ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py` to be consistent with the `jcb-gdas` template. Resolves #1249 Dependencies - jcb-algorithms PR [#4](https://github.com/NOAA-EMC/jcb-algorithms/pull/4) - jcb-gdas PR [#23](https://github.com/NOAA-EMC/jcb-gdas/pull/23) **DO NOT MERGE THIS PR into GDASApp `develop` until** 1. the above jcb PRs are merged into their respective `develop` 2. the jcb hashes in this PR are updated --- parm/atm/jcb-base.yaml.j2 | 3 + parm/atm/jcb-prototype_3dvar.yaml.j2 | 10 +- .../atm/jcb-prototype_lgetkf_observer.yaml.j2 | 46 +++++ parm/atm/jcb-prototype_lgetkf_solver.yaml.j2 | 49 ++++++ parm/jcb-algorithms | 2 +- parm/jcb-gdas | 2 +- test/atm/global-workflow/CMakeLists.txt | 14 +- test/atm/global-workflow/config.yaml | 6 + .../jcb-prototype_lgetkf_observer.yaml.j2 | 34 ++++ .../jcb-prototype_lgetkf_solver.yaml.j2 | 34 ++++ .../{jjob_ens_run.sh => jjob_ens_letkf.sh} | 0 test/atm/global-workflow/jjob_ens_obs.sh | 56 ++++++ test/atm/global-workflow/jjob_ens_sol.sh | 56 ++++++ test/atm/global-workflow/lgetkf_observer.ref | 111 ++++++++++++ test/atm/global-workflow/lgetkf_solver.ref | 165 ++++++++++++++++++ .../bufr2ioda_acft_profiles_prepbufr.py | 2 +- ush/ioda/bufr2ioda/bufr2ioda_adpupa.py | 2 +- 17 files changed, 581 insertions(+), 11 deletions(-) create mode 100644 parm/atm/jcb-prototype_lgetkf_observer.yaml.j2 create mode 100644 parm/atm/jcb-prototype_lgetkf_solver.yaml.j2 create mode 100644 test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2 create mode 100644 test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2 rename test/atm/global-workflow/{jjob_ens_run.sh => jjob_ens_letkf.sh} (100%) create mode 100755 test/atm/global-workflow/jjob_ens_obs.sh create mode 100755 test/atm/global-workflow/jjob_ens_sol.sh create mode 100644 test/atm/global-workflow/lgetkf_observer.ref create mode 100644 test/atm/global-workflow/lgetkf_solver.ref diff --git a/parm/atm/jcb-base.yaml.j2 b/parm/atm/jcb-base.yaml.j2 index a9db8a3e9..ee2caa3ae 100644 --- a/parm/atm/jcb-base.yaml.j2 +++ b/parm/atm/jcb-base.yaml.j2 @@ -116,6 +116,9 @@ driver_save_prior_mean: false driver_save_posterior_mean_increment: false driver_save_posterior_ensemble_increments: true +# Distribution type +distribution_type: Halo + # Diagnostics atmosphere_ensemble_increment_prefix: "./anl/mem%{member}%/atminc." atmosphere_posterior_output_gaussian: "./mem%{member}%/atmanl." diff --git a/parm/atm/jcb-prototype_3dvar.yaml.j2 b/parm/atm/jcb-prototype_3dvar.yaml.j2 index 83b612347..7b6c80011 100644 --- a/parm/atm/jcb-prototype_3dvar.yaml.j2 +++ b/parm/atm/jcb-prototype_3dvar.yaml.j2 @@ -12,7 +12,7 @@ observations: - ascatw.ascat_metop-b # - ascatw.ascat_metop-c - atms_n20 - - atms_npp +# - atms_npp - conventional_ps - gnssro # - gpsro @@ -23,9 +23,9 @@ observations: # - ompstc_n20 - ompstc_npp - satwnd.abi_goes-16 - - satwnd.abi_goes-18 - - satwnd.leogeo_multi - - satwnd.viirs_n20 - - satwnd.viirs_npp +# - satwnd.abi_goes-18 +# - satwnd.leogeo_multi +# - satwnd.viirs_n20 +# - satwnd.viirs_npp # - scatwind_ascat_metop-a # - snowcvr diff --git a/parm/atm/jcb-prototype_lgetkf_observer.yaml.j2 b/parm/atm/jcb-prototype_lgetkf_observer.yaml.j2 new file mode 100644 index 000000000..26654b175 --- /dev/null +++ b/parm/atm/jcb-prototype_lgetkf_observer.yaml.j2 @@ -0,0 +1,46 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere + +# Algorithm +# --------- +algorithm: local_ensemble_da_observer + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Observation things +# ------------------ +observations: +# - ADPSFC +# - ADPUPA +# - SFCSHP + - aircraft + - ascatw.ascat_metop-b +# - ascatw.ascat_metop-c + - atms_n20 +# - atms_npp + - conventional_ps + - gnssro +# - gpsro +# - mtiasi_metop-a +# - mtiasi_metop-b +# - ompsnp_n20 + - ompsnp_npp +# - ompstc_n20 + - ompstc_npp + - satwnd.abi_goes-16 +# - satwnd.abi_goes-18 +# - satwnd.leogeo_multi +# - satwnd.viirs_n20 +# - satwnd.viirs_npp +# - scatwind_ascat_metop-a +# - snowcvr + +# Naming conventions for observation files +atmosphere_obsdataout_prefix: diag_lobs_ + +# Distribution type +distribution_type: RoundRobin diff --git a/parm/atm/jcb-prototype_lgetkf_solver.yaml.j2 b/parm/atm/jcb-prototype_lgetkf_solver.yaml.j2 new file mode 100644 index 000000000..677934158 --- /dev/null +++ b/parm/atm/jcb-prototype_lgetkf_solver.yaml.j2 @@ -0,0 +1,49 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere + +# Algorithm +# --------- +algorithm: local_ensemble_da_solver + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Observation things +# ------------------ +observations: +# - ADPSFC +# - ADPUPA +# - SFCSHP + - aircraft + - ascatw.ascat_metop-b +# - ascatw.ascat_metop-c + - atms_n20 +# - atms_npp + - conventional_ps + - gnssro +# - gpsro +# - mtiasi_metop-a +# - mtiasi_metop-b +# - ompsnp_n20 + - ompsnp_npp +# - ompstc_n20 + - ompstc_npp + - satwnd.abi_goes-16 +# - satwnd.abi_goes-18 +# - satwnd.leogeo_multi +# - satwnd.viirs_n20 +# - satwnd.viirs_npp +# - scatwind_ascat_metop-a +# - snowcvr + +# Naming conventions for observation files +atmosphere_obsdatain_path: "{{atm_obsdataout_path}}" +atmosphere_obsdatain_prefix: diag_lobs_ +atmosphere_obsdatain_suffix: "_{{ current_cycle | to_YMDH }}.nc" +atmosphere_obsdataout_prefix: diag_solv_ + +# Distribution type +distribution_type: Halo diff --git a/parm/jcb-algorithms b/parm/jcb-algorithms index 115474385..a6822d8c1 160000 --- a/parm/jcb-algorithms +++ b/parm/jcb-algorithms @@ -1 +1 @@ -Subproject commit 115474385012bfa0afd47dfc6db100e8cf2dcb62 +Subproject commit a6822d8c1e72f6b1bf951e378b153cb6df1faee5 diff --git a/parm/jcb-gdas b/parm/jcb-gdas index a132852df..50a46a046 160000 --- a/parm/jcb-gdas +++ b/parm/jcb-gdas @@ -1 +1 @@ -Subproject commit a132852df41b0b096d61b198f164c4c6e394662d +Subproject commit 50a46a046d761da17997aa2901fa4af19fc388bf diff --git a/test/atm/global-workflow/CMakeLists.txt b/test/atm/global-workflow/CMakeLists.txt index 1a91b0740..e9e4e1f19 100644 --- a/test/atm/global-workflow/CMakeLists.txt +++ b/test/atm/global-workflow/CMakeLists.txt @@ -31,11 +31,21 @@ add_test(NAME test_gdasapp_atm_jjob_ens_init ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/atm/global-workflow/testrun) -add_test(NAME test_gdasapp_atm_jjob_ens_run - COMMAND ${PROJECT_SOURCE_DIR}/test/atm/global-workflow/jjob_ens_run.sh +add_test(NAME test_gdasapp_atm_jjob_ens_letkf + COMMAND ${PROJECT_SOURCE_DIR}/test/atm/global-workflow/jjob_ens_letkf.sh ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/atm/global-workflow/testrun) +add_test(NAME test_gdasapp_atm_jjob_ens_obs + COMMAND ${PROJECT_SOURCE_DIR}/test/atm/global-workflow/jjob_ens_obs.sh + ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/atm/global-workflow/testrun) + +add_test(NAME test_gdasapp_atm_jjob_ens_sol + COMMAND ${PROJECT_SOURCE_DIR}/test/atm/global-workflow/jjob_ens_sol.sh + ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/test/atm/global-workflow/testrun) + add_test(NAME test_gdasapp_atm_jjob_ens_inc COMMAND ${PROJECT_SOURCE_DIR}/test/atm/global-workflow/jjob_ens_inc.sh ${PROJECT_BINARY_DIR} ${PROJECT_SOURCE_DIR} diff --git a/test/atm/global-workflow/config.yaml b/test/atm/global-workflow/config.yaml index f53712683..9d896736d 100644 --- a/test/atm/global-workflow/config.yaml +++ b/test/atm/global-workflow/config.yaml @@ -20,3 +20,9 @@ atmensanl: JCB_ALGO_YAML: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf.yaml.j2" LAYOUT_X_ATMENSANL: 1 LAYOUT_Y_ATMENSANL: 1 + +atmensanlobs: + JCB_ALGO_YAML: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2" + +atmensanlsol: + JCB_ALGO_YAML: "@srcdir@/test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2" diff --git a/test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2 b/test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2 new file mode 100644 index 000000000..ec1182019 --- /dev/null +++ b/test/atm/global-workflow/jcb-prototype_lgetkf_observer.yaml.j2 @@ -0,0 +1,34 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere-lgetkf + +# Algorithm +# --------- +algorithm: local_ensemble_da_observer + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Observation things +# ------------------ +observations: + - amsua_n19 + - sondes + +# The observation files in the testing are appended using the yyymmddhh similar to JEDI tests +atmosphere_obsdatain_suffix: ".{{ current_cycle | to_YMDH }}.nc" + +# Naming conventions for observation files +atmosphere_obsdataout_prefix: diag_lobs_ + +# Distribution type +distribution_type: RoundRobin + +# Testing things +# -------------- +test_reference_filename: {{ HOMEgfs }}/sorc/gdas.cd/test/atm/global-workflow/lgetkf_observer.ref +test_output_filename: ./lgetkf_observer.out +test_float_relative_tolerance: 1.0e-3 +test_float_absolute_tolerance: 1.0e-5 diff --git a/test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2 b/test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2 new file mode 100644 index 000000000..a6ad34751 --- /dev/null +++ b/test/atm/global-workflow/jcb-prototype_lgetkf_solver.yaml.j2 @@ -0,0 +1,34 @@ +# Use observations for lgetkf +# --------------------------- +app_path_observations: {{PARMgfs}}/gdas/jcb-gdas/observations/atmosphere-lgetkf +app_path_observation_chronicle: {{PARMgfs}}/gdas/jcb-gdas/observation_chronicle/atmosphere-lgetkf + +# Algorithm +# --------- +algorithm: local_ensemble_da_solver + +# Model things +# ------------ +atmosphere_background_ensemble_path: ./bkg/mem%mem% + +# Observation things +# ------------------ +observations: + - amsua_n19 + - sondes + +# Naming conventions for observation files +atmosphere_obsdatain_path: "{{atm_obsdataout_path}}" +atmosphere_obsdatain_prefix: diag_lobs_ +atmosphere_obsdatain_suffix: "_{{ current_cycle | to_YMDH }}.nc" +atmosphere_obsdataout_prefix: diag_solv_ + +# Distribution type +distribution_type: Halo + +# Testing things +# -------------- +test_reference_filename: {{ HOMEgfs }}/sorc/gdas.cd/test/atm/global-workflow/lgetkf_solver.ref +test_output_filename: ./lgetkf_solver.out +test_float_relative_tolerance: 1.0e-3 +test_float_absolute_tolerance: 1.0e-5 diff --git a/test/atm/global-workflow/jjob_ens_run.sh b/test/atm/global-workflow/jjob_ens_letkf.sh similarity index 100% rename from test/atm/global-workflow/jjob_ens_run.sh rename to test/atm/global-workflow/jjob_ens_letkf.sh diff --git a/test/atm/global-workflow/jjob_ens_obs.sh b/test/atm/global-workflow/jjob_ens_obs.sh new file mode 100755 index 000000000..e96c30a0a --- /dev/null +++ b/test/atm/global-workflow/jjob_ens_obs.sh @@ -0,0 +1,56 @@ +#! /usr/bin/env bash + +set -x +bindir=$1 +srcdir=$2 + +# Set g-w HOMEgfs +topdir=$(cd "$(dirname "$(readlink -f -n "${bindir}" )" )/../../.." && pwd -P) +export HOMEgfs=$topdir + +# Set variables for ctest +export PSLOT=gdas_test +export EXPDIR=$bindir/test/atm/global-workflow/testrun/experiments/$PSLOT +export PDY=20210323 +export cyc=18 +export CDATE=${PDY}${cyc} +export gPDY=20210323 +export gcyc=12 +export GDATE=${gPDY}${gcyc} +export ROTDIR=$bindir/test/atm/global-workflow/testrun/ROTDIRS/$PSLOT +export RUN=enkfgdas +export CDUMP=enkfgdas +export DATAROOT=$bindir/test/atm/global-workflow/testrun/RUNDIRS/$PSLOT +export COMIN_GES=${bindir}/test/atm/bkg +export pid=${pid:-$$} +export jobid=$pid +export COMROOT=$DATAROOT +export NMEM_ENS=3 +export ACCOUNT=da-cpu + +# Set python path for workflow utilities and tasks +wxflowPATH="${HOMEgfs}/ush/python" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${wxflowPATH}" +export PYTHONPATH + +# Detemine machine from config.base +machine=$(echo `grep 'machine=' $EXPDIR/config.base | cut -d"=" -f2` | tr -d '"') + +# Set NETCDF and UTILROOT variables (used in config.base) +if [[ $machine = 'HERA' ]]; then + NETCDF=$( which ncdump ) + export NETCDF + export UTILROOT="/scratch2/NCEPDEV/ensemble/save/Walter.Kolczynski/hpc-stack/intel-18.0.5.274/prod_util/1.2.2" +elif [[ $machine = 'ORION' || $machine = 'HERCULES' ]]; then + ncdump=$( which ncdump ) + NETCDF=$( echo "${ncdump}" | cut -d " " -f 3 ) + export NETCDF + export UTILROOT=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2 +fi + +# Execute j-job +if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then + sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=debug --time=00:30:00 --export=ALL --wait --output=atmensanlobs-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_OBS +else + ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_OBS +fi diff --git a/test/atm/global-workflow/jjob_ens_sol.sh b/test/atm/global-workflow/jjob_ens_sol.sh new file mode 100755 index 000000000..53cfb87d4 --- /dev/null +++ b/test/atm/global-workflow/jjob_ens_sol.sh @@ -0,0 +1,56 @@ +#! /usr/bin/env bash + +set -x +bindir=$1 +srcdir=$2 + +# Set g-w HOMEgfs +topdir=$(cd "$(dirname "$(readlink -f -n "${bindir}" )" )/../../.." && pwd -P) +export HOMEgfs=$topdir + +# Set variables for ctest +export PSLOT=gdas_test +export EXPDIR=$bindir/test/atm/global-workflow/testrun/experiments/$PSLOT +export PDY=20210323 +export cyc=18 +export CDATE=${PDY}${cyc} +export gPDY=20210323 +export gcyc=12 +export GDATE=${gPDY}${gcyc} +export ROTDIR=$bindir/test/atm/global-workflow/testrun/ROTDIRS/$PSLOT +export RUN=enkfgdas +export CDUMP=enkfgdas +export DATAROOT=$bindir/test/atm/global-workflow/testrun/RUNDIRS/$PSLOT +export COMIN_GES=${bindir}/test/atm/bkg +export pid=${pid:-$$} +export jobid=$pid +export COMROOT=$DATAROOT +export NMEM_ENS=3 +export ACCOUNT=da-cpu + +# Set python path for workflow utilities and tasks +wxflowPATH="${HOMEgfs}/ush/python" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}${wxflowPATH}" +export PYTHONPATH + +# Detemine machine from config.base +machine=$(echo `grep 'machine=' $EXPDIR/config.base | cut -d"=" -f2` | tr -d '"') + +# Set NETCDF and UTILROOT variables (used in config.base) +if [[ $machine = 'HERA' ]]; then + NETCDF=$( which ncdump ) + export NETCDF + export UTILROOT="/scratch2/NCEPDEV/ensemble/save/Walter.Kolczynski/hpc-stack/intel-18.0.5.274/prod_util/1.2.2" +elif [[ $machine = 'ORION' || $machine = 'HERCULES' ]]; then + ncdump=$( which ncdump ) + NETCDF=$( echo "${ncdump}" | cut -d " " -f 3 ) + export NETCDF + export UTILROOT=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2 +fi + +# Execute j-job +if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then + sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=debug --time=00:30:00 --export=ALL --wait --output=atmensanlsol-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_SOL +else + ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_SOL +fi diff --git a/test/atm/global-workflow/lgetkf_observer.ref b/test/atm/global-workflow/lgetkf_observer.ref new file mode 100644 index 000000000..c4b815ef1 --- /dev/null +++ b/test/atm/global-workflow/lgetkf_observer.ref @@ -0,0 +1,111 @@ +Initial state for member 1: +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.1619864857418477e+01 Max:+8.6812084442971653e+01 RMS:+1.5983411875766325e+01 +northward_wind | Min:-7.3094846805319690e+01 Max:+7.0353817207582651e+01 RMS:+7.7265473774262041e+00 +air_temperature | Min:+1.7646396818493386e+02 Max:+3.1441817730817547e+02 RMS:+2.4989439192167012e+02 +layer_thickness | Min:-2.8728340670782936e+03 Max:-1.5844010522128334e+01 RMS:+9.8310890327340439e+02 +air_pressure_thickness | Min:+6.0599999953541761e-01 Max:+1.7747677648323079e+03 RMS:+9.5676512006998769e+02 +surface_pressure | Min:+5.3259705655314101e+04 Max:+1.0392378167916714e+05 RMS:+9.8893465602866549e+04 +specific_humidity | Min:+9.5164908108891825e-09 Max:+2.0222136340880194e-02 RMS:+4.8552459174929334e-03 +cloud_liquid_ice | Min:-1.3545705512023003e-20 Max:+6.7304686933261399e-04 RMS:+1.0726563909939355e-05 +cloud_liquid_water | Min:-5.4244251425755909e-20 Max:+1.2879383569881558e-03 RMS:+3.8382491358281577e-05 +ozone_mass_mixing_ratio | Min:+2.9375003505643131e-08 Max:+1.8014885502109894e-05 RMS:+4.4946424525503736e-06 +surface_geopotential_height | Min:-2.7018394470214844e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.3367721414977348e+02 RMS:+2.2844482914802999e+01 +sea_surface_temperature | Min:+2.0791388472150163e+02 Max:+3.4773327272108133e+02 RMS:+2.8888781974396971e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2044502210464319e+02 Max:+3.1531527244154063e+02 RMS:+2.8916372621979713e+02 +soilMoistureVolumetric | Min:+2.0000000000000000e-02 Max:+1.0000000000000000e+00 RMS:+8.7096638468255239e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8134236127502426e+00 RMS:+1.8222715253202781e-01 +surface_eastward_wind | Min:-2.0302650327509099e+01 Max:+2.1760551255897649e+01 RMS:+5.2972810149144989e+00 +surface_northward_wind | Min:-1.4968894650435200e+01 Max:+1.6765905429678224e+01 RMS:+4.2782356748931996e+00 +f10m | Min:+9.3257572069704375e-01 Max:+1.0782447572529907e+00 RMS:+9.9542831934707332e-01 +---------------------------------------------------------------------------------------------------- +Initial state for member 2: +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.2853490758012072e+01 Max:+8.7248708527964936e+01 RMS:+1.5955809745480765e+01 +northward_wind | Min:-7.2178651628585953e+01 Max:+7.2568167230757609e+01 RMS:+7.7335061167195889e+00 +air_temperature | Min:+1.7660670217895057e+02 Max:+3.1526174222386965e+02 RMS:+2.4989392943476341e+02 +layer_thickness | Min:-2.8750852837791022e+03 Max:-1.5794597440684603e+01 RMS:+9.8301208643901532e+02 +air_pressure_thickness | Min:+6.0599999948625027e-01 Max:+1.7752652524725063e+03 RMS:+9.5675980922035808e+02 +surface_pressure | Min:+5.3317702550070273e+04 Max:+1.0394629485957995e+05 RMS:+9.8892949759388735e+04 +specific_humidity | Min:+2.1514597275760548e-08 Max:+1.9663168048133908e-02 RMS:+4.8569105861498299e-03 +cloud_liquid_ice | Min:-1.3544569699620215e-20 Max:+7.9557019872326799e-04 RMS:+1.0816147029169270e-05 +cloud_liquid_water | Min:-5.4200711162051571e-20 Max:+1.2298889446687945e-03 RMS:+3.8689917911663205e-05 +ozone_mass_mixing_ratio | Min:+1.6238717942558199e-08 Max:+1.8031521448783218e-05 RMS:+4.4947640660308833e-06 +surface_geopotential_height | Min:-2.7018394470214844e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.3446253401369569e+02 RMS:+2.2874187237166272e+01 +sea_surface_temperature | Min:+2.0978258608237891e+02 Max:+3.4063292812032523e+02 RMS:+2.8892010225961866e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2042860927849489e+02 Max:+3.1556639379821877e+02 RMS:+2.8916436305504556e+02 +soilMoistureVolumetric | Min:+2.0000000000000000e-02 Max:+1.0000000000000000e+00 RMS:+8.7096997815200794e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8153278546401408e+00 RMS:+1.8214466028068999e-01 +surface_eastward_wind | Min:-1.9122075401123020e+01 Max:+2.1444683230863411e+01 RMS:+5.3022867151420767e+00 +surface_northward_wind | Min:-1.4756460531574159e+01 Max:+1.8507846311761583e+01 RMS:+4.2802135707024282e+00 +f10m | Min:+9.3238101450200428e-01 Max:+1.0793518217027296e+00 RMS:+9.9539536810295792e-01 +---------------------------------------------------------------------------------------------------- +Initial state for member 3: +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.3776366655868109e+01 Max:+8.6331467223030344e+01 RMS:+1.5960680883840784e+01 +northward_wind | Min:-7.0176400159320124e+01 Max:+6.9531049915936578e+01 RMS:+7.7410680097841684e+00 +air_temperature | Min:+1.7648447482434227e+02 Max:+3.1491330999751426e+02 RMS:+2.4989313307279673e+02 +layer_thickness | Min:-2.8748181022793874e+03 Max:-1.5822712660806282e+01 RMS:+9.8301820591439434e+02 +air_pressure_thickness | Min:+6.0599999955059858e-01 Max:+1.7742011426782731e+03 RMS:+9.5675144888218676e+02 +surface_pressure | Min:+5.3350124363319999e+04 Max:+1.0389818047809265e+05 RMS:+9.8892179510558097e+04 +specific_humidity | Min:+2.1846447498856659e-08 Max:+2.0007929878326374e-02 RMS:+4.8392192734415156e-03 +cloud_liquid_ice | Min:-6.7740196346531239e-21 Max:+6.2473018245821010e-04 RMS:+1.0889666282638220e-05 +cloud_liquid_water | Min:-5.4107584399974539e-20 Max:+1.2132298501853738e-03 RMS:+3.8405804865664137e-05 +ozone_mass_mixing_ratio | Min:+1.2289325508931378e-08 Max:+1.8036413152177077e-05 RMS:+4.4950884931704925e-06 +surface_geopotential_height | Min:-2.7018394470214844e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.0768588203961116e+02 RMS:+2.2922702270144551e+01 +sea_surface_temperature | Min:+2.0916406214271251e+02 Max:+3.4510570590652480e+02 RMS:+2.8892699554065905e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2045545733453196e+02 Max:+3.1492502526099332e+02 RMS:+2.8916655770658571e+02 +soilMoistureVolumetric | Min:+2.0000000000000000e-02 Max:+1.0000000000000000e+00 RMS:+8.7097084862976482e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8143247567290359e+00 RMS:+1.8207043992662716e-01 +surface_eastward_wind | Min:-1.8951406320589882e+01 Max:+2.1985111394345580e+01 RMS:+5.3062512116922882e+00 +surface_northward_wind | Min:-1.4183550286832059e+01 Max:+1.7289090100273199e+01 RMS:+4.2365567732484486e+00 +f10m | Min:+9.2995810057091766e-01 Max:+1.0787102983488339e+00 RMS:+9.9539268028154582e-01 +---------------------------------------------------------------------------------------------------- +H(x) for member 1: +AMSUA N19 nobs= 83277 Min=201.8068522798935, Max=282.1977771850452, RMS=233.8559407930978 + +sondes nobs= 8481 Min=-33.72958087992568, Max=309.9582199829497, RMS=141.2113994268562 + + +H(x) for member 2: +AMSUA N19 nobs= 83277 Min=201.6491455196041, Max=282.0442934777565, RMS=233.8549246604183 + +sondes nobs= 8481 Min=-30.53144491152982, Max=310.2016372514533, RMS=141.1993510066664 + + +H(x) for member 3: +AMSUA N19 nobs= 83277 Min=201.5822623660015, Max=282.1680720517217, RMS=233.8542062391686 + +sondes nobs= 8481 Min=-32.86095389873932, Max=310.3775309250524, RMS=141.1778363650817 + + +H(x) ensemble background mean: +AMSUA N19 nobs= 83277 Min=201.7046771524233, Max=282.1363019533286, RMS=233.8550114850208 + +sondes nobs= 8481 Min=-32.28721130380135, Max=310.1791293864851, RMS=141.1946022453276 + + +background y - H(x): +AMSUA N19 nobs= 83254 Min=-40.1226250672521, Max=14.39438798864785, RMS=1.520218815029863 + +sondes nobs= 3950 Min=-16.79891131775619, Max=16.07422994026274, RMS=4.060200040073279 + + diff --git a/test/atm/global-workflow/lgetkf_solver.ref b/test/atm/global-workflow/lgetkf_solver.ref new file mode 100644 index 000000000..7d0bbc73d --- /dev/null +++ b/test/atm/global-workflow/lgetkf_solver.ref @@ -0,0 +1,165 @@ +Initial state for member 1: +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.1619864857418477e+01 Max:+8.6812084442971653e+01 RMS:+1.5983411875766325e+01 +northward_wind | Min:-7.3094846805319690e+01 Max:+7.0353817207582651e+01 RMS:+7.7265473774262041e+00 +air_temperature | Min:+1.7646396818493386e+02 Max:+3.1441817730817547e+02 RMS:+2.4989439192167012e+02 +layer_thickness | Min:-2.8728340670782936e+03 Max:-1.5844010522128334e+01 RMS:+9.8310890327340439e+02 +air_pressure_thickness | Min:+6.0599999953541761e-01 Max:+1.7747677648323079e+03 RMS:+9.5676512006998769e+02 +surface_pressure | Min:+5.3259705655314101e+04 Max:+1.0392378167916714e+05 RMS:+9.8893465602866549e+04 +specific_humidity | Min:+9.5164908108891825e-09 Max:+2.0222136340880194e-02 RMS:+4.8552459174929334e-03 +cloud_liquid_ice | Min:-1.3545705512023003e-20 Max:+6.7304686933261399e-04 RMS:+1.0726563909939355e-05 +cloud_liquid_water | Min:-5.4244251425755909e-20 Max:+1.2879383569881558e-03 RMS:+3.8382491358281577e-05 +ozone_mass_mixing_ratio | Min:+2.9375003505643131e-08 Max:+1.8014885502109894e-05 RMS:+4.4946424525503736e-06 +surface_geopotential_height | Min:-2.7018394470214844e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.3367721414977348e+02 RMS:+2.2844482914802999e+01 +sea_surface_temperature | Min:+2.0791388472150163e+02 Max:+3.4773327272108133e+02 RMS:+2.8888781974396971e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2044502210464319e+02 Max:+3.1531527244154063e+02 RMS:+2.8916372621979713e+02 +soilMoistureVolumetric | Min:+2.0000000000000000e-02 Max:+1.0000000000000000e+00 RMS:+8.7096638468255239e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8134236127502426e+00 RMS:+1.8222715253202781e-01 +surface_eastward_wind | Min:-2.0302650327509099e+01 Max:+2.1760551255897649e+01 RMS:+5.2972810149144989e+00 +surface_northward_wind | Min:-1.4968894650435200e+01 Max:+1.6765905429678224e+01 RMS:+4.2782356748931996e+00 +f10m | Min:+9.3257572069704375e-01 Max:+1.0782447572529907e+00 RMS:+9.9542831934707332e-01 +---------------------------------------------------------------------------------------------------- +Initial state for member 2: +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.2853490758012072e+01 Max:+8.7248708527964936e+01 RMS:+1.5955809745480765e+01 +northward_wind | Min:-7.2178651628585953e+01 Max:+7.2568167230757609e+01 RMS:+7.7335061167195889e+00 +air_temperature | Min:+1.7660670217895057e+02 Max:+3.1526174222386965e+02 RMS:+2.4989392943476341e+02 +layer_thickness | Min:-2.8750852837791022e+03 Max:-1.5794597440684603e+01 RMS:+9.8301208643901532e+02 +air_pressure_thickness | Min:+6.0599999948625027e-01 Max:+1.7752652524725063e+03 RMS:+9.5675980922035808e+02 +surface_pressure | Min:+5.3317702550070273e+04 Max:+1.0394629485957995e+05 RMS:+9.8892949759388735e+04 +specific_humidity | Min:+2.1514597275760548e-08 Max:+1.9663168048133908e-02 RMS:+4.8569105861498299e-03 +cloud_liquid_ice | Min:-1.3544569699620215e-20 Max:+7.9557019872326799e-04 RMS:+1.0816147029169270e-05 +cloud_liquid_water | Min:-5.4200711162051571e-20 Max:+1.2298889446687945e-03 RMS:+3.8689917911663205e-05 +ozone_mass_mixing_ratio | Min:+1.6238717942558199e-08 Max:+1.8031521448783218e-05 RMS:+4.4947640660308833e-06 +surface_geopotential_height | Min:-2.7018394470214844e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.3446253401369569e+02 RMS:+2.2874187237166272e+01 +sea_surface_temperature | Min:+2.0978258608237891e+02 Max:+3.4063292812032523e+02 RMS:+2.8892010225961866e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2042860927849489e+02 Max:+3.1556639379821877e+02 RMS:+2.8916436305504556e+02 +soilMoistureVolumetric | Min:+2.0000000000000000e-02 Max:+1.0000000000000000e+00 RMS:+8.7096997815200794e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8153278546401408e+00 RMS:+1.8214466028068999e-01 +surface_eastward_wind | Min:-1.9122075401123020e+01 Max:+2.1444683230863411e+01 RMS:+5.3022867151420767e+00 +surface_northward_wind | Min:-1.4756460531574159e+01 Max:+1.8507846311761583e+01 RMS:+4.2802135707024282e+00 +f10m | Min:+9.3238101450200428e-01 Max:+1.0793518217027296e+00 RMS:+9.9539536810295792e-01 +---------------------------------------------------------------------------------------------------- +Initial state for member 3: +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.3776366655868109e+01 Max:+8.6331467223030344e+01 RMS:+1.5960680883840784e+01 +northward_wind | Min:-7.0176400159320124e+01 Max:+6.9531049915936578e+01 RMS:+7.7410680097841684e+00 +air_temperature | Min:+1.7648447482434227e+02 Max:+3.1491330999751426e+02 RMS:+2.4989313307279673e+02 +layer_thickness | Min:-2.8748181022793874e+03 Max:-1.5822712660806282e+01 RMS:+9.8301820591439434e+02 +air_pressure_thickness | Min:+6.0599999955059858e-01 Max:+1.7742011426782731e+03 RMS:+9.5675144888218676e+02 +surface_pressure | Min:+5.3350124363319999e+04 Max:+1.0389818047809265e+05 RMS:+9.8892179510558097e+04 +specific_humidity | Min:+2.1846447498856659e-08 Max:+2.0007929878326374e-02 RMS:+4.8392192734415156e-03 +cloud_liquid_ice | Min:-6.7740196346531239e-21 Max:+6.2473018245821010e-04 RMS:+1.0889666282638220e-05 +cloud_liquid_water | Min:-5.4107584399974539e-20 Max:+1.2132298501853738e-03 RMS:+3.8405804865664137e-05 +ozone_mass_mixing_ratio | Min:+1.2289325508931378e-08 Max:+1.8036413152177077e-05 RMS:+4.4950884931704925e-06 +surface_geopotential_height | Min:-2.7018394470214844e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.0768588203961116e+02 RMS:+2.2922702270144551e+01 +sea_surface_temperature | Min:+2.0916406214271251e+02 Max:+3.4510570590652480e+02 RMS:+2.8892699554065905e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2045545733453196e+02 Max:+3.1492502526099332e+02 RMS:+2.8916655770658571e+02 +soilMoistureVolumetric | Min:+2.0000000000000000e-02 Max:+1.0000000000000000e+00 RMS:+8.7097084862976482e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8143247567290359e+00 RMS:+1.8207043992662716e-01 +surface_eastward_wind | Min:-1.8951406320589882e+01 Max:+2.1985111394345580e+01 RMS:+5.3062512116922882e+00 +surface_northward_wind | Min:-1.4183550286832059e+01 Max:+1.7289090100273199e+01 RMS:+4.2365567732484486e+00 +f10m | Min:+9.2995810057091766e-01 Max:+1.0787102983488339e+00 RMS:+9.9539268028154582e-01 +---------------------------------------------------------------------------------------------------- +H(x) for member 1: +AMSUA N19 nobs= 83277 Min=201.8068542480469, Max=282.1977844238281, RMS=233.8559407698435 + +sondes nobs= 8481 Min=-33.72957992553711, Max=309.9582214355469, RMS=141.2113995343238 + + +H(x) for member 2: +AMSUA N19 nobs= 83277 Min=201.6491394042969, Max=282.0442810058594, RMS=233.8549246363169 + +sondes nobs= 8481 Min=-30.53144454956055, Max=310.2016296386719, RMS=141.1993510651708 + + +H(x) for member 3: +AMSUA N19 nobs= 83277 Min=201.5822601318359, Max=282.1680603027344, RMS=233.8542062502507 + +sondes nobs= 8481 Min=-32.86095428466797, Max=310.3775329589844, RMS=141.1778363213159 + + +H(x) ensemble background mean: +AMSUA N19 nobs= 83277 Min=201.7046763102213, Max=282.1363016764323, RMS=233.85501147293 + +sondes nobs= 8481 Min=-32.28721110026041, Max=310.1791280110677, RMS=141.1946022861109 + + +background y - H(x): +AMSUA N19 nobs= 83254 Min=-40.12262471516925, Max=14.39438883463544, RMS=1.52021880597115 + +sondes nobs= 3950 Min=-16.79891141255696, Max=16.0742301940918, RMS=4.060200047607062 + + +Background mean : +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.0268509151643670e+01 Max:+8.6686198337381171e+01 RMS:+1.5943048359570170e+01 +northward_wind | Min:-7.1281090590794832e+01 Max:+7.0613804297416578e+01 RMS:+7.6835678597476624e+00 +air_temperature | Min:+1.7652661362892786e+02 Max:+3.1486440984318642e+02 RMS:+2.4989353796113025e+02 +layer_thickness | Min:-2.8742236189948235e+03 Max:-1.5820440207873071e+01 RMS:+9.8304588977244248e+02 +air_pressure_thickness | Min:+6.0599999954215089e-01 Max:+1.7745271604965960e+03 RMS:+9.5675867998450212e+02 +surface_pressure | Min:+5.3309177522901453e+04 Max:+1.0391290736184639e+05 RMS:+9.8892856412110239e+04 +specific_humidity | Min:+8.4477932715987172e-08 Max:+1.9531761470252519e-02 RMS:+4.8455165312756591e-03 +cloud_liquid_ice | Min:-4.5148565665400716e-21 Max:+4.1857236992490481e-04 RMS:+1.0081670582489738e-05 +cloud_liquid_water | Min:-1.8646059632736959e-20 Max:+1.0447516732817988e-03 RMS:+3.3566571025591825e-05 +ozone_mass_mixing_ratio | Min:+2.8043654425670649e-08 Max:+1.7892907435183836e-05 RMS:+4.4944974047442364e-06 +surface_geopotential_height | Min:-2.7018394470214840e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.2527521006769342e+02 RMS:+2.2874231579198337e+01 +sea_surface_temperature | Min:+2.0909325814222842e+02 Max:+3.4400445627039335e+02 RMS:+2.8891122950497800e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2044302957255664e+02 Max:+3.1448974639746052e+02 RMS:+2.8916485102080441e+02 +soilMoistureVolumetric | Min:+1.9999999999999997e-02 Max:+1.0000000000000000e+00 RMS:+8.7096039254926949e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8143587413731397e+00 RMS:+1.8203629732600013e-01 +surface_eastward_wind | Min:-1.9400969882086276e+01 Max:+2.1628152789536944e+01 RMS:+5.2804512030599353e+00 +surface_northward_wind | Min:-1.4483927323189917e+01 Max:+1.6910069485657925e+01 RMS:+4.2391121142819319e+00 +f10m | Min:+9.3258902621206641e-01 Max:+1.0787625575968645e+00 RMS:+9.9540515270826369e-01 +---------------------------------------------------------------------------------------------------- +Analysis mean : +---------------------------------------------------------------------------------------------------- +State print | number of fields = 23 | cube sphere face size: C48 +eastward_wind | Min:-5.0291304963157458e+01 Max:+9.0203018103615022e+01 RMS:+1.5971953263838984e+01 +northward_wind | Min:-7.0394779632316030e+01 Max:+7.6961501223594396e+01 RMS:+7.7135409664762085e+00 +air_temperature | Min:+1.7652661360282033e+02 Max:+3.1505624735856111e+02 RMS:+2.4991092637433198e+02 +layer_thickness | Min:-2.8742236234345746e+03 Max:-1.5810238321247921e+01 RMS:+9.8306092089996048e+02 +air_pressure_thickness | Min:+6.0599999954215089e-01 Max:+1.7747759470992746e+03 RMS:+9.5672069536719698e+02 +surface_pressure | Min:+5.3309177524748637e+04 Max:+1.0391290732216480e+05 RMS:+9.8892856414330425e+04 +specific_humidity | Min:+0.0000000000000000e+00 Max:+1.9755675864190199e-02 RMS:+4.8568939148683366e-03 +cloud_liquid_ice | Min:+0.0000000000000000e+00 Max:+4.4214477981132619e-04 RMS:+1.0672876314612782e-05 +cloud_liquid_water | Min:+0.0000000000000000e+00 Max:+1.8117395287292838e-03 RMS:+3.6027698431839841e-05 +ozone_mass_mixing_ratio | Min:+0.0000000000000000e+00 Max:+1.7891447711963811e-05 RMS:+4.4960673755760298e-06 +surface_geopotential_height | Min:-2.7018394470214840e+01 Max:+5.2697460937500000e+03 RMS:+6.3032575784066080e+02 +slmsk | Min:+0.0000000000000000e+00 Max:+2.0000000000000000e+00 RMS:+6.5853328538727862e-01 +sheleg | Min:+0.0000000000000000e+00 Max:+3.2527521006769342e+02 RMS:+2.2874231579198337e+01 +sea_surface_temperature | Min:+2.0909325814222842e+02 Max:+3.4400445627039335e+02 RMS:+2.8891122950497800e+02 +vtype | Min:+0.0000000000000000e+00 Max:+1.9000000000000000e+01 RMS:+5.6602100164707281e+00 +stype | Min:+0.0000000000000000e+00 Max:+1.6000000000000000e+01 RMS:+4.1039110890529598e+00 +vfrac | Min:+0.0000000000000000e+00 Max:+9.7215068788150627e-01 RMS:+1.9167119887330206e-01 +stc | Min:+2.2044302957255664e+02 Max:+3.1448974639746052e+02 RMS:+2.8916485102080441e+02 +soilMoistureVolumetric | Min:+1.9999999999999997e-02 Max:+1.0000000000000000e+00 RMS:+8.7096039254926949e-01 +totalSnowDepthMeters | Min:+0.0000000000000000e+00 Max:+1.8143587413731397e+00 RMS:+1.8203629732600013e-01 +surface_eastward_wind | Min:-1.9400969882086276e+01 Max:+2.1628152789536944e+01 RMS:+5.2804512030599353e+00 +surface_northward_wind | Min:-1.4483927323189917e+01 Max:+1.6910069485657925e+01 RMS:+4.2391121142819319e+00 +f10m | Min:+9.3258902621206641e-01 Max:+1.0787625575968645e+00 RMS:+9.9540515270826369e-01 +---------------------------------------------------------------------------------------------------- diff --git a/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py b/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py index 24957751a..53eda910e 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_acft_profiles_prepbufr.py @@ -342,7 +342,7 @@ def bufr_to_ioda(config, logger): # Create the dimensions dims = {'Location': np.arange(0, lat.shape[0])} - iodafile = f"{cycle_type}.t{hh}z.acft_profiles.tm00.nc" + iodafile = f"{cycle_type}.t{hh}z.aircraft.tm00.nc" OUTPUT_PATH = os.path.join(ioda_dir, iodafile) logger.debug(f" ... ... Create OUTPUT file: {OUTPUT_PATH}") diff --git a/ush/ioda/bufr2ioda/bufr2ioda_adpupa.py b/ush/ioda/bufr2ioda/bufr2ioda_adpupa.py index 04ef049f2..5e282b376 100755 --- a/ush/ioda/bufr2ioda/bufr2ioda_adpupa.py +++ b/ush/ioda/bufr2ioda/bufr2ioda_adpupa.py @@ -206,7 +206,6 @@ def bufr_to_ioda(config, logger): dewpointTemperatureOE = np.float32(np.ma.masked_array(np.full((len(tmdp)), 0.0))) windEastwardOE = np.float32(np.ma.masked_array(np.full((len(wspd)), 0.0))) windNorthwardOE = np.float32(np.ma.masked_array(np.full((len(wspd)), 0.0))) - specificHumidityOE = np.float32(np.ma.masked_array(np.full((len(qob)), 0.0))) end_time = time.time() running_time = end_time - start_time @@ -226,6 +225,7 @@ def bufr_to_ioda(config, logger): qob = Compute_SpecificHumidity_from_dewPoint_and_Pressure(tmdp, prlc) logger.debug(f' qob min/max = {qob.min()} {qob.max()}') + specificHumidityOE = np.float32(np.ma.masked_array(np.full((len(qob)), 0.0))) end_time = time.time() running_time = end_time - start_time From 4e211881af23f6756f45bd795dcc250d7a7da783 Mon Sep 17 00:00:00 2001 From: Andrew Collard <40322596+ADCollard@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:03:08 -0400 Subject: [PATCH 2/4] Feature/jcb darth vader (#1256) This PR updates `ush/ufoeval/run_ufo_hofx_test.sh` to use the JCB framework. This references issue #1113 --------- Co-authored-by: CoryMartin-NOAA Co-authored-by: Emily Liu --- modulefiles/GDAS/hera.intel.lua | 1 + ush/eva/gen_eva_obs_yaml.py | 4 +- ush/ufoeval/run_ufo_hofx_test.sh | 116 ++++++++++++++++++++++++------- ush/ufoeval/test_yamls.sh | 4 +- 4 files changed, 97 insertions(+), 28 deletions(-) diff --git a/modulefiles/GDAS/hera.intel.lua b/modulefiles/GDAS/hera.intel.lua index 0d5c080c3..613205f6f 100644 --- a/modulefiles/GDAS/hera.intel.lua +++ b/modulefiles/GDAS/hera.intel.lua @@ -74,6 +74,7 @@ load("py-scipy/1.11.3") load("py-xarray/2023.7.0") load("py-f90nml/1.4.3") load("py-pip/23.1.2") +load("py-click/8.1.7") setenv("CC","mpiicc") setenv("FC","mpiifort") diff --git a/ush/eva/gen_eva_obs_yaml.py b/ush/eva/gen_eva_obs_yaml.py index 5ec301b09..9a500dd07 100755 --- a/ush/eva/gen_eva_obs_yaml.py +++ b/ush/eva/gen_eva_obs_yaml.py @@ -63,8 +63,8 @@ def gen_eva_obs_yaml(inputyaml, templateyaml, outputdir): os.makedirs(outputdir) # now loop over all observation spaces in input JEDI YAML file for obsspace in evaobs: - name = obsspace['name'] - cycle = obsspace['diagfile'].split('.')[-2] + name = obsspace['name'].replace(" ", "_").lower() + cycle = obsspace['diagfile'].split('_')[-1].split('.')[-2] logging.info(f'Now processing: {name}') # get the dictionary of replacements set up replacements = { diff --git a/ush/ufoeval/run_ufo_hofx_test.sh b/ush/ufoeval/run_ufo_hofx_test.sh index 5cb77fb6e..8d685d231 100755 --- a/ush/ufoeval/run_ufo_hofx_test.sh +++ b/ush/ufoeval/run_ufo_hofx_test.sh @@ -28,7 +28,7 @@ usage() { # ============================================================================== -cycle=2021080100 +cycle=2024021900 run_filtering=YES run_eva=YES eva_stats_only=NO @@ -77,6 +77,8 @@ if [ $machine = orion ]; then workdir=/work2/noaa/da/$LOGNAME/ufoeval/$cycle/${obtype} fi GDASApp=${GDASApp:-/work2/noaa/da/$LOGNAME/git/GDASApp/} # Change this to your own branch + JCBinstall=${JCBinstall:-/work2/noaa/da/cmartin/CI/GDASApp/opt} + JCBpylib=$JCBinstall/lib/python3.7/site-packages elif [ $machine = hera ]; then if [ $run_filtering == NO ]; then workdir=/scratch1/NCEPDEV/stmp2/$LOGNAME/ufoeval/$cycle/${obtype}_noqc @@ -84,6 +86,8 @@ elif [ $machine = hera ]; then workdir=/scratch1/NCEPDEV/stmp2/$LOGNAME/ufoeval/$cycle/${obtype} fi GDASApp=${GDASApp:-/scratch1/NCEPDEV/da/$LOGNAME/git/GDASApp/} # Change this to your own branch + JCBinstall=${JCBinstall:-/scratch1/NCEPDEV/da/Cory.R.Martin/CI/GDASApp/opt} + JCBpylib=$JCBinstall/lib/python3.10/site-packages else echo "Machine " $machine "not found" exit 1 @@ -94,17 +98,12 @@ if [ $keep_output = YES ]; then workdir=${workdir}_datetime fi -if [ $run_filtering == NO ]; then - yamlpath=$GDASApp/parm/atm/obs/testing/${obtype}_noqc.yaml -else - yamlpath=$GDASApp/parm/atm/obs/testing/${obtype}.yaml -fi exename=test_ObsFilters.x #-------------- Do not modify below this line ---------------- # paths that should only be changed by an expert user -dataprocdate=20230811 # Production date of test data +dataprocdate=20240815 # Production date of test data obtype_short=${obtype:0:4} if [ $obtype_short = "cris" ] || [ $obtype_short = "iasi" ] || [ $obtype_short = "hirs" ] || [ $obtype_short = "sevi" ] || \ @@ -116,7 +115,7 @@ else fi if [ $machine = orion ]; then - export Datapath='/work2/noaa/da/eliu/UFO_eval/data/gsi_geovals_l127/nofgat_aug2021/'$dataprocdate + export Datapath='/work2/noaa/da/acollard/UFO_eval/data/gsi_geovals_l127/nofgat_feb2024/'$dataprocdate FixDir=/work2/noaa/da/cmartin/GDASApp/fix elif [ $machine = hera ]; then export Datapath='/scratch1/NCEPDEV/da/Emily.Liu/UFO_eval/data/gsi_geovals_l127/nofgat_aug2021/'$dataprocdate @@ -133,14 +132,29 @@ BCDir=$Datapath/bc/ # other variables that should not change often export CDATE=$cycle export assim_freq=6 +export half_assim_freq=$(($assim_freq / 2)) export GDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${assim_freq} hours") +export BDATE=$(date +%Y%m%d%H -d "${CDATE:0:8} ${CDATE:8:2} - ${half_assim_freq} hours") export PDY=${CDATE:0:8} export cyc=${CDATE:8:2} +export YYYY=${CDATE:0:4} +export MM=${CDATE:4:2} +export DD=${CDATE:6:2} export gPDY=${GDATE:0:8} export gcyc=${GDATE:8:2} +export bPDY=${BDATE:0:8} +export bcyc=${BDATE:8:2} +export bYYYY=${BDATE:0:4} +export bMM=${BDATE:4:2} +export bDD=${BDATE:6:2} export CASE="C768" export CASE_ANL="C384" export LEVS="128" +export DATA=./ +export COMPONENT=atmos +export OPREFIX=gdas.t${cyc}z +export APREFIX=gdas.t${cyc}z +export GPREFIX=gdas.t${gcyc}z # Load Modules for GDASApp module use $GDASApp/modulefiles @@ -157,12 +171,13 @@ ln -sf $FixDir/crtm/2.4.0 $workdir/crtm # copy BC files if [ $radiance = "YES" ]; then - cp -rf $BCDir/${obtype}*${GDATE}* $workdir/. + cp -rf $BCDir/${GPREFIX}.${obtype}.tlapse.txt $workdir/${GPREFIX}.${obtype}.tlapse.txt + cp -rf $BCDir/${GPREFIX}.${obtype}.satbias.nc $workdir/${GPREFIX}.${obtype}.satbias.nc fi # Copy obs and geovals -cp -rf $GeoDir/${obtype}_geoval_${cycle}*.nc4 $workdir/. -cp -rf $ObsDir/${obtype}_obs_${cycle}*.nc4 $workdir/. +cp -rf $GeoDir/${obtype}_geoval_${cycle}.nc4 $workdir/${OPREFIX}.${obtype}_geoval.tm00.nc +cp -rf $ObsDir/${obtype}_obs_${cycle}.nc4 $workdir/${OPREFIX}.${obtype}.tm00.nc # Link executable ln -sf $GDASApp/build/bin/$exename $workdir/. @@ -170,22 +185,75 @@ ln -sf $GDASApp/build/bin/$exename $workdir/. echo "Generating YAML" # Copy/generate YAML for test executable -# First, create the input YAMLs for the genYAML script -export DATA=./ -export COMPONENT=atmos -export OPREFIX=gdas.t${cyc}z -export APREFIX=gdas.t${cyc}z -export GPREFIX=gdas.t${gcyc}z +# need to add JCB to PATH and PYTHONPATH +export PYTHONPATH=$PYTHONPATH:$JCBpylib +export PATH=$PATH:$JCBinstall/bin +# First, create the input file for JCB cat > $workdir/temp.yaml << EOF -time window: - begin: '{{ WINDOW_BEGIN | to_isotime }}' - end: '{{ WINDOW_END | to_isotime }}' - bound to include: begin -observations: -- !INC $yamlpath +# Search path for model and obs for JCB +# ------------------------------------- +algorithm_path: "$GDASApp/parm/jcb-algorithms" +app_path_algorithm: "$GDASApp/parm/jcb-gdas/algorithm/atmosphere" +app_path_model: "$GDASApp/parm/jcb-gdas/model/atmosphere" +app_path_observations: "$GDASApp/parm/jcb-gdas/observations/atmosphere" +app_path_observation_chronicle: "$GDASApp/parm/jcb-gdas/observation_chronicle/atmosphere" + + +# Places where we deviate from the generic file name of a yaml +# ------------------------------------------------------------ +#final_increment_file: final_increment_gaussian +final_increment_file: final_increment_cubed_sphere +output_ensemble_increments_file: output_ensemble_increments_cubed_sphere +model_file: model_pseudo +initial_condition_file: background # Initial conditions for 4D apps is background + + +# Assimilation window +# ------------------- +window_begin: "${bYYYY}-${bMM}-${bDD}T${bcyc}:00:00Z" +window_length: "PT${assim_freq}H" +bound_to_include: begin + +# Default background time is for 3D applications +atmosphere_background_time_iso: "${YYYY}-${MM}-${DD}T${cyc}:00:00Z" + +algorithm: test_obs_filters + +# Observation things +# ------------------ +observations: [${obtype}] + +crtm_coefficient_path: "$workdir/crtm/" + +# Naming conventions for observational files +atmosphere_obsdatain_path: "$workdir" +atmosphere_obsdatain_prefix: "$OPREFIX." +atmosphere_obsdatain_suffix: ".tm00.nc" + +atmosphere_obsdataout_path: "$workdir" +atmosphere_obsdataout_prefix: diag_ +atmosphere_obsdataout_suffix: "_${cycle}.nc" + +# Naming conventions for bias correction files +atmosphere_obsbiasin_path: "$workdir" +atmosphere_obsbiasin_prefix: "$GPREFIX." +atmosphere_obsbiasin_suffix: ".satbias.nc" +atmosphere_obstlapsein_prefix: "$GPREFIX." +atmosphere_obstlapsein_suffix: ".tlapse.txt" +atmosphere_obsbiascovin_prefix: "$GPREFIX." +atmosphere_obsbiascovin_suffix: ".satbias_cov.nc" + +atmosphere_obsbiasout_path: "$workdir" +atmosphere_obsbiasout_prefix: "$APREFIX." +atmosphere_obsbiasout_suffix: ".satbias.nc" +atmosphere_obsbiascovout_prefix: "$APREFIX." +atmosphere_obsbiascovout_suffix: ".satbias_cov.nc" EOF -$GDASApp/ush/genYAML --input $workdir/temp.yaml --output $workdir/${obtype}_${cycle}.yaml +# jcb render dictionary_of_templates.yaml jedi_config.yaml +echo "Calling JCB Render" +jcb render $workdir/temp.yaml $workdir/${obtype}_${cycle}.yaml +echo "Called JCB Render" if [ $? -ne 0 ]; then echo "YAML creation failed" diff --git a/ush/ufoeval/test_yamls.sh b/ush/ufoeval/test_yamls.sh index d46056bd8..4c721f9af 100755 --- a/ush/ufoeval/test_yamls.sh +++ b/ush/ufoeval/test_yamls.sh @@ -14,7 +14,7 @@ if [ $? -ne 0 ]; then fi # Process tests wiht QC -for file in `find ../../parm/atm/obs/testing/*.yaml -type f -not -name "*noqc*"`; do +for file in `find ../../parm/jcb-gdas/observations/atmosphere -type f`; do basefile=${file##*/} obtype="${basefile%.*}" ./run_ufo_hofx_test.sh -x $obtype > $WORKDIR/$obtype.log 2> $WORKDIR/$obtype.err @@ -26,7 +26,7 @@ for file in `find ../../parm/atm/obs/testing/*.yaml -type f -not -name "*noqc*"` done # Process tests without QC (HofX + Observation error assignment) -for file in `ls ../../parm/atm/obs/testing/*_noqc.yaml`; do +for file in `find ../../parm/jcb-gdas/observations/atmosphere -type f`; do basefile=${file##*/} obtype="${basefile%_noqc.*}" ./run_ufo_hofx_test.sh -x -q $obtype > $WORKDIR/${obtype}_noqc.log 2> $WORKDIR/${obtype}_noqc.err From c848bf0e38c97a4fa120a81577eeabba149c808a Mon Sep 17 00:00:00 2001 From: DavidNew-NOAA <134300700+DavidNew-NOAA@users.noreply.github.com> Date: Thu, 22 Aug 2024 09:49:24 -0400 Subject: [PATCH 3/4] Fix small bug in SLURM output filename for ensemble FV3 increment jjob test (#1260) Fix small bug in SLURM output filename for ensemble FV3 increment jjob test --- test/atm/global-workflow/jjob_ens_inc.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/atm/global-workflow/jjob_ens_inc.sh b/test/atm/global-workflow/jjob_ens_inc.sh index 1c26b664e..194cbe3a3 100755 --- a/test/atm/global-workflow/jjob_ens_inc.sh +++ b/test/atm/global-workflow/jjob_ens_inc.sh @@ -47,7 +47,7 @@ fi # Execute j-job if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then - sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=batch --time=00:30:00 --export=ALL --wait ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT --job-name=atmensanlfv3inc-%j.out + sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=batch --time=00:30:00 --export=ALL --wait --output=atmensanlfv3inc-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT else ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_FV3_INCREMENT fi From 09594d1c032fd187f9869ac74b2b5b351112e93c Mon Sep 17 00:00:00 2001 From: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:23:45 -0400 Subject: [PATCH 4/4] enable atmospheric lgetkf ctests to run in combined and split modes (#1262) --- test/atm/global-workflow/jjob_ens_init.sh | 4 ++++ test/atm/global-workflow/jjob_ens_letkf.sh | 3 +++ test/atm/global-workflow/jjob_ens_obs.sh | 3 +++ test/atm/global-workflow/jjob_ens_sol.sh | 3 +++ test/atm/global-workflow/setup_workflow_exp.sh | 5 +++++ 5 files changed, 18 insertions(+) diff --git a/test/atm/global-workflow/jjob_ens_init.sh b/test/atm/global-workflow/jjob_ens_init.sh index 1e4ae1f97..9aa1265be 100755 --- a/test/atm/global-workflow/jjob_ens_init.sh +++ b/test/atm/global-workflow/jjob_ens_init.sh @@ -110,6 +110,10 @@ for imem in $(seq 1 $NMEM_ENS); do done done +# Set lobsdiag_forenkf=.false. to run letkf as single observer and solver job +# NOTE: atmensanlinit creates input yaml for atmensanlletkf job +cp $EXPDIR/config.base_lobsdiag_forenkf_false $EXPDIR/config.base + # Execute j-job if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then sbatch --ntasks=1 --account=$ACCOUNT --qos=batch --time=00:10:00 --export=ALL --wait --output=atmensanlinit-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE diff --git a/test/atm/global-workflow/jjob_ens_letkf.sh b/test/atm/global-workflow/jjob_ens_letkf.sh index 69c22ad6d..93715541d 100755 --- a/test/atm/global-workflow/jjob_ens_letkf.sh +++ b/test/atm/global-workflow/jjob_ens_letkf.sh @@ -48,6 +48,9 @@ elif [[ $machine = 'ORION' || $machine = 'HERCULES' ]]; then export UTILROOT=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2 fi +# Set lobsdiag_forenkf=.false. to run letkf as combined observer and solver job +cp $EXPDIR/config.base_lobsdiag_forenkf_false $EXPDIR/config.base + # Execute j-job if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=batch --time=00:30:00 --export=ALL --wait --output=atmensanlletkf-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_LETKF diff --git a/test/atm/global-workflow/jjob_ens_obs.sh b/test/atm/global-workflow/jjob_ens_obs.sh index e96c30a0a..5118e52e8 100755 --- a/test/atm/global-workflow/jjob_ens_obs.sh +++ b/test/atm/global-workflow/jjob_ens_obs.sh @@ -48,6 +48,9 @@ elif [[ $machine = 'ORION' || $machine = 'HERCULES' ]]; then export UTILROOT=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2 fi +# Set lobsdiag_forenkf=.true. to run letkf as stand-alone observer job +cp $EXPDIR/config.base_lobsdiag_forenkf_true $EXPDIR/config.base + # Execute j-job if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=debug --time=00:30:00 --export=ALL --wait --output=atmensanlobs-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_OBS diff --git a/test/atm/global-workflow/jjob_ens_sol.sh b/test/atm/global-workflow/jjob_ens_sol.sh index 53cfb87d4..cd1c40094 100755 --- a/test/atm/global-workflow/jjob_ens_sol.sh +++ b/test/atm/global-workflow/jjob_ens_sol.sh @@ -48,6 +48,9 @@ elif [[ $machine = 'ORION' || $machine = 'HERCULES' ]]; then export UTILROOT=/work2/noaa/da/python/opt/intel-2022.1.2/prod_util/1.2.2 fi +# Set lobsdiag_forenkf=.true. to run letkf as stand-alone solver job +cp $EXPDIR/config.base_lobsdiag_forenkf_true $EXPDIR/config.base + # Execute j-job if [[ $machine = 'HERA' || $machine = 'ORION' || $machine = 'HERCULES' ]]; then sbatch --nodes=1 --ntasks=36 --account=$ACCOUNT --qos=debug --time=00:30:00 --export=ALL --wait --output=atmensanlsol-%j.out ${HOMEgfs}/jobs/JGLOBAL_ATMENS_ANALYSIS_SOL diff --git a/test/atm/global-workflow/setup_workflow_exp.sh b/test/atm/global-workflow/setup_workflow_exp.sh index c8165a2f1..d793733ae 100755 --- a/test/atm/global-workflow/setup_workflow_exp.sh +++ b/test/atm/global-workflow/setup_workflow_exp.sh @@ -51,4 +51,9 @@ echo " " echo "$expdir/../config.yaml is" cat $expdir/../config.yaml +# config.base contains with lobsdiag_forenkf=.true. Create config.base with lobsdiag_forenkf=.false. for jjob_ens_letkf.sh +EXPDIR=$expdir/$pslot +cp $EXPDIR/config.base $EXPDIR/config.base_lobsdiag_forenkf_true +sed 's/export lobsdiag_forenkf=".true."/export lobsdiag_forenkf=".false."/' $EXPDIR/config.base > $EXPDIR/config.base_lobsdiag_forenkf_false + exit $?