From 8265948b8b62e705479ba23ed433a6af56d73368 Mon Sep 17 00:00:00 2001 From: Andrea Piacentini Date: Mon, 2 Feb 2026 14:26:50 +0100 Subject: [PATCH 1/3] [bsc] First test with LETKF on the monarch grid --- src/vind/Fields.cc | 6 + src/vind/FieldsIO/FieldsIOBSC.cc | 9 +- test/monarch/CMakeLists.txt | 1 + .../monarch/testinput/letkf_nonlinear_4d.yaml | 317 ++++++++ test/monarch/testref/letkf_nonlinear_4d.ref | 686 ++++++++++++++++++ 5 files changed, 1018 insertions(+), 1 deletion(-) create mode 100644 test/monarch/testinput/letkf_nonlinear_4d.yaml create mode 100644 test/monarch/testref/letkf_nonlinear_4d.ref diff --git a/src/vind/Fields.cc b/src/vind/Fields.cc index 7fe36e2..cc30eeb 100644 --- a/src/vind/Fields.cc +++ b/src/vind/Fields.cc @@ -28,6 +28,7 @@ #include "eckit/mpi/Comm.h" #include "oops/util/ConfigFunctions.h" +#include "oops/util/ConfigHelpers.h" #include "oops/util/FieldSetHelpers.h" #include "oops/util/FieldSetOperations.h" #include "oops/util/FloatCompare.h" @@ -1063,6 +1064,11 @@ void Fields::write(const eckit::Configuration & config) const { } } + // Update member template + if (updatedConfig.has("member")) { + util::setMember(updatedConfig, updatedConfig.getInt("member")); + } + // Rename fields for (auto & field : fset_) { for (const auto & item : geom_.alias()) { diff --git a/src/vind/FieldsIO/FieldsIOBSC.cc b/src/vind/FieldsIO/FieldsIOBSC.cc index f71fb08..c392de3 100644 --- a/src/vind/FieldsIO/FieldsIOBSC.cc +++ b/src/vind/FieldsIO/FieldsIOBSC.cc @@ -339,7 +339,14 @@ void FieldsIOBSC::write(const eckit::Configuration & conf, const size_t lmMax = geom.io().getUnsigned("total number of levels"); // Get write time - const util::DateTime validTime(conf.getString("date")); + util::DateTime validTime; + if (conf.has("date")) { + validTime = util::DateTime(conf.getString("date")); + } else { + if (conf.has("date pattern")) { + validTime = util::DateTime(conf.getString("date pattern")); + } + } // Get timeseries mode const bool singleDate = conf.getBool("single date", true); diff --git a/test/monarch/CMakeLists.txt b/test/monarch/CMakeLists.txt index ece78c3..75634ef 100644 --- a/test/monarch/CMakeLists.txt +++ b/test/monarch/CMakeLists.txt @@ -67,4 +67,5 @@ if ( ENABLE_SABER AND ENABLE_OBS ) create_test( monarch 3densvar_lt ${3DCORES} variational ) create_test( monarch 4densvar ${4DCORES} variational ) create_test( monarch 4densvar_lt ${4DCORES} variational ) + create_test( monarch letkf_nonlinear_4d ${3DCORES} letkf ) endif() diff --git a/test/monarch/testinput/letkf_nonlinear_4d.yaml b/test/monarch/testinput/letkf_nonlinear_4d.yaml new file mode 100644 index 0000000..d725eec --- /dev/null +++ b/test/monarch/testinput/letkf_nonlinear_4d.yaml @@ -0,0 +1,317 @@ +_variables: &vars + - ozone + - carbon_monoxide + - nitrogen_dioxide + - sulfur_dioxide + - pm10 + - pm2p5 +_chemVariables: &chemvars + - ozone +# - carbon_monoxide +# - nitrogen_dioxide +# - sulfur_dioxide +# - pm10 +# - pm2p5 +_incvariables: &incvars + - ozone +_levels: + profile: &levs [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23] +_scalingGas: &scalegas + scaling factor: 1.e-6 +_o3_ObsErrFactor: + total coefficient: &o3_obserr_factor 0.2 +_o3_BkgBheckQCFactor: + threshold: &o3_bkgcheckQC_factor 3.0 +_o3_ObsErrMin: + error parameter: &o3_obserr_min 5.e-10 +_o3_ObsErrCheckMax: + absolute threshold: &o3_obserr_checkmax 5.0e-6 + +# Mnemonics: +_memo: + - &state_ref + date: 2022-07-01T09:00:00Z + filepath: testdata/006/REDUCED_MONARCH_d01_2022063012.nc + format: bsc + state variables: *chemvars + - &member_ref + date: 2022-07-01T09:00:00Z + filepath: testdata/%mem%/REDUCED_MONARCH_d01_2022063012.nc + format: bsc + state variables: *chemvars + - &mean_ref + date: 2022-07-01T09:00:00Z + filepath: testdata/letkf_mean_prior_2022070110.nc + formats: [bsc] + state variables: *chemvars + - &out_ref + date: 2022-07-01T09:00:00Z + member pattern: %mem% + filepath: testdata/letkf_analysis_2022070110_%mem%.nc + formats: [bsc] + state variables: *chemvars +increment variables: *incvars +time window: + begin: 2022-07-01T09:00:00Z + length: PT6H + bound to include: end +geometry: &geom + iterator dimension: 3 + #AP common vertical coordinate: levels + function space: StructuredColumns + grid: + type: structured + xspace: + type: linear + N : 351 + start : -35.0 + end : 35.0 + yspace: + type: linear + N: 271 + start: -27.0 + end : 27.0 + projection : + type: rotated_lonlat + north_pole: [190, 39] + y_numbering: -1 + partitioner: checkerboard + halo: 1 + levels are top down: true + levels count from: 0 + groups: + - variables: *chemvars + levels: 24 + vertical coordinate: + #AP name: levels + profile: *levs + alias: + - in code: ozone + in file: O3 + <<: *scalegas +# - in code: carbon_monoxide +# in file: CO +# <<: *scalegas +# - in code: nitrogen_dioxide +# in file: NO2 +# <<: *scalegas +# - in code: sulfur_dioxide +# in file: SO2 +# <<: *scalegas +# - in code: pm10 +# in file: dry_pm10_mass +# - in code: pm2p5 +# in file: dry_pm2p5_mass + io: + total number of levels: 24 + initial date: 2022-06-30T12:00:00Z + final date: 2022-07-02T00:00:00Z +control member: + states: + - <<: *state_ref + date: 2022-07-01T09:00:00Z + - <<: *state_ref + date: 2022-07-01T10:00:00Z + - <<: *state_ref + date: 2022-07-01T11:00:00Z + - <<: *state_ref + date: 2022-07-01T12:00:00Z + - <<: *state_ref + date: 2022-07-01T13:00:00Z + - <<: *state_ref + date: 2022-07-01T14:00:00Z +background: + members from template: + template: + states: + - <<: *member_ref + date: 2022-07-01T09:00:00Z + - <<: *member_ref + date: 2022-07-01T10:00:00Z + - <<: *member_ref + date: 2022-07-01T11:00:00Z + - <<: *member_ref + date: 2022-07-01T12:00:00Z + - <<: *member_ref + date: 2022-07-01T13:00:00Z + - <<: *member_ref + date: 2022-07-01T14:00:00Z + pattern: %mem% + zero padding: 3 + start: 0 + nmembers: 6 +observations: + observers: + - obs space: + name: AIRBASE_O3 + obsdatain: + engine: + type: H5File + obsfile: testdata/HDAT_AIRBASE_O3-2022070112.nc + obsdataout: + engine: + type: H5File + obsfile: testdata/HSTAT_4D_AIRBASE_O3-2022070112.nc + simulated variables: [ozoneSurface] + distribution: + name: Halo + halo size: 250.0e3 + obs filters: + - filter: Variable Assignment + assignments: + - name: DerivedObsError/ozoneSurface + type: float + function: + name: ObsFunction/Arithmetic + options: + variables: + - name: ObsValue/ozoneSurface + absolute value: [true] + total coefficient: *o3_obserr_factor + - filter: Perform Action + filter variables: + - name: ozoneSurface + action: + name: assign error + error function: + name: ObsFunction/Arithmetic + options: + variables: + - name: DerivedObsError/ozoneSurface + where: + - variable: + name: DerivedObsError/ozoneSurface + minvalue: *o3_obserr_min + - filter: Perform Action + filter variables: + - name: ozoneSurface + action: + name: assign error + error parameter: *o3_obserr_min + where: + - variable: + name: DerivedObsError/ozoneSurface + maxvalue: *o3_obserr_min + - filter: Background Check + filter variables: + - name: ozoneSurface + threshold: *o3_bkgcheckQC_factor + absolute threshold: *o3_obserr_checkmax + obs operator: + name: VertInterp + constant vertical coordinate values: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1] + observation vertical coordinate: air_pressure + interpolation method: nearest-neighbor + observation alias file: testinput/ufo_variable_name_map.yaml + obs error: + covariance model: diagonal + obs localizations: + - localization method: Horizontal Gaspari-Cohn + lengthscale: 250e3 + max nobs: 100 + - localization method: Vertical localization + localization function: Gaspari Cohn + assign constant vertical coordinate to obs: true + constant vertical coordinate value: 23 + vertical lengthscale: 8 +driver: + use control member: false + save prior mean: true + save posterior mean: true + save posterior ensemble: false + save posterior mean increment: true + save posterior ensemble increments: false + save prior variance: true + save posterior variance: true + update obs config with geometry info: true +local ensemble DA: + solver: Deterministic LETKF + #inflation: + # rtps: 0.5 + # rtpp: 0.5 + # mult: 1.1 +output: + states: + - <<: *out_ref + date: 2022-07-01T09:00:00Z + filepath: testdata/letkf_analysis_2022070109_%mem%.nc + - <<: *out_ref + date: 2022-07-01T10:00:00Z + filepath: testdata/letkf_analysis_2022070110_%mem%.nc + - <<: *out_ref + date: 2022-07-01T11:00:00Z + filepath: testdata/letkf_analysis_2022070111_%mem%.nc + - <<: *out_ref + date: 2022-07-01T12:00:00Z + filepath: testdata/letkf_analysis_2022070112_%mem%.nc + - <<: *out_ref + date: 2022-07-01T13:00:00Z + filepath: testdata/letkf_analysis_2022070113_%mem%.nc + - <<: *out_ref + date: 2022-07-01T14:00:00Z + filepath: testdata/letkf_analysis_2022070114_%mem%.nc +output increment: + filepath: testdata/letkf_increment__DATE_.nc + date pattern: _DATE_ + formats: [bsc] + state variables: *chemvars +output ensemble increments: + member pattern: %mem% + filepath: testdata/letkf_ens_increments__DATE__%mem%.nc + date pattern: _DATE_ + formats: [bsc] +# state variables: *chemvars + # states: + # - <<: *out_ref + # date: 2022-07-01T09:00:00Z + # filepath: testdata/letkf_ens_increments_2022070109_%mem%.nc + # - <<: *out_ref + # date: 2022-07-01T10:00:00Z + # filepath: testdata/letkf_ens_increments_2022070110_%mem%.nc + # - <<: *out_ref + # date: 2022-07-01T11:00:00Z + # filepath: testdata/letkf_ens_increments_2022070111_%mem%.nc + # - <<: *out_ref + # date: 2022-07-01T12:00:00Z + # filepath: testdata/letkf_ens_increments_2022070112_%mem%.nc + # - <<: *out_ref + # date: 2022-07-01T13:00:00Z + # filepath: testdata/letkf_ens_increments_2022070113_%mem%.nc + # - <<: *out_ref + # date: 2022-07-01T14:00:00Z + # filepath: testdata/letkf_ens_increments_2022070114_%mem%.nc +output mean prior: + states: + - <<: *mean_ref + date: 2022-07-01T09:00:00Z + filepath: testdata/letkf_mean_prior_2022070109.nc + - <<: *mean_ref + date: 2022-07-01T10:00:00Z + filepath: testdata/letkf_mean_prior_2022070110.nc + - <<: *mean_ref + date: 2022-07-01T11:00:00Z + filepath: testdata/letkf_mean_prior_2022070111.nc + - <<: *mean_ref + date: 2022-07-01T12:00:00Z + filepath: testdata/letkf_mean_prior_2022070112.nc + - <<: *mean_ref + date: 2022-07-01T13:00:00Z + filepath: testdata/letkf_mean_prior_2022070113.nc + - <<: *mean_ref + date: 2022-07-01T14:00:00Z + filepath: testdata/letkf_mean_prior_2022070114.nc +output variance prior: + filepath: testdata/letkf_var_prior__DATE_.nc + date pattern: _DATE_ + formats: [bsc] + state variables: *chemvars +output variance posterior: + filepath: testdata/letkf_var_posterior__DATE_.nc + date pattern: _DATE_ + formats: [bsc] + state variables: *chemvars +test: + reference filename: testref/letkf_nonlinear_4d.ref + test output filename: testdata/letkf_nonlinear_4d.log + float absolute tolerance: 1.e-15 + diff --git a/test/monarch/testref/letkf_nonlinear_4d.ref b/test/monarch/testref/letkf_nonlinear_4d.ref new file mode 100644 index 0000000..a336010 --- /dev/null +++ b/test/monarch/testref/letkf_nonlinear_4d.ref @@ -0,0 +1,686 @@ +Initial state for member 1: +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261961e-06 + + mean = 2.2050368290315077e-07 + + stddev = 3.4176503493971567e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601805e-06 + + mean = 2.2051206032377989e-07 + + stddev = 3.4164161347491349e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941649e-06 + + mean = 2.2046072517000381e-07 + + stddev = 3.4148341471234021e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281492e-06 + + mean = 2.2036370329692849e-07 + + stddev = 3.4133771045461700e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993407e-06 + + mean = 2.2027291696471721e-07 + + stddev = 3.4124398905085154e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149658e-06 + + mean = 2.2019556972445835e-07 + + stddev = 3.4118395414925323e-07 + +Initial state for member 2: +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261961e-06 + + mean = 2.2043028986111152e-07 + + stddev = 3.4179438021845768e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601805e-06 + + mean = 2.2043883314224164e-07 + + stddev = 3.4167047639722790e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941649e-06 + + mean = 2.2038978111085960e-07 + + stddev = 3.4151083253437227e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281492e-06 + + mean = 2.2029598776825603e-07 + + stddev = 3.4136320503961082e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993407e-06 + + mean = 2.2020689660115765e-07 + + stddev = 3.4126835644612987e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149658e-06 + + mean = 2.2013018374542616e-07 + + stddev = 3.4120776669436009e-07 + +Initial state for member 3: +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261961e-06 + + mean = 2.2050651923566914e-07 + + stddev = 3.4175917427939798e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601805e-06 + + mean = 2.2051759987014161e-07 + + stddev = 3.4163460416680799e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941649e-06 + + mean = 2.2046923086720464e-07 + + stddev = 3.4147507798799452e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281492e-06 + + mean = 2.2037497295192111e-07 + + stddev = 3.4132806992602262e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993407e-06 + + mean = 2.2028582892581024e-07 + + stddev = 3.4123354755045881e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149658e-06 + + mean = 2.2020983181859554e-07 + + stddev = 3.4117285970354151e-07 + +Initial state for member 4: +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261961e-06 + + mean = 2.2050797643121301e-07 + + stddev = 3.4175307347050311e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601805e-06 + + mean = 2.2051492215333405e-07 + + stddev = 3.4162999347126287e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941649e-06 + + mean = 2.2046459849023727e-07 + + stddev = 3.4147100042009110e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281492e-06 + + mean = 2.2037045728720796e-07 + + stddev = 3.4132359668645796e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993407e-06 + + mean = 2.2028220673906244e-07 + + stddev = 3.4122838826150419e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149658e-06 + + mean = 2.2020684629594135e-07 + + stddev = 3.4116719167741963e-07 + +Initial state for member 5: +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261961e-06 + + mean = 2.2026628782169531e-07 + + stddev = 3.4188016524184120e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601805e-06 + + mean = 2.2026885609642383e-07 + + stddev = 3.4175924739162016e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941649e-06 + + mean = 2.2021464761045872e-07 + + stddev = 3.4160212989429001e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281492e-06 + + mean = 2.2011695845733105e-07 + + stddev = 3.4145642724734458e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993407e-06 + + mean = 2.2002576945886294e-07 + + stddev = 3.4136258594093300e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149658e-06 + + mean = 2.1994789411592955e-07 + + stddev = 3.4130255417928741e-07 + +Initial state for member 6: +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261961e-06 + + mean = 2.2071571014262548e-07 + + stddev = 3.4165267626397598e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601805e-06 + + mean = 2.2073109718372518e-07 + + stddev = 3.4152570956885040e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941649e-06 + + mean = 2.2068780898938323e-07 + + stddev = 3.4136350296631978e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281492e-06 + + mean = 2.2059841143512269e-07 + + stddev = 3.4121403299810946e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993407e-06 + + mean = 2.2051303508604005e-07 + + stddev = 3.4111764692208924e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149658e-06 + + mean = 2.2043976605353326e-07 + + stddev = 3.4105558453951227e-07 + +H(x) for member 1: + +AIRBASE_O3 nobs= 1 Min=6.3422940767064083e-08, Max=6.3422940767064083e-08, RMS=6.3422940767064083e-08 + +H(x) for member 2: + +AIRBASE_O3 nobs= 1 Min=6.4117381177244354e-08, Max=6.4117381177244354e-08, RMS=6.4117381177244354e-08 + +H(x) for member 3: + +AIRBASE_O3 nobs= 1 Min=6.4863447701802554e-08, Max=6.4863447701802554e-08, RMS=6.4863447701802554e-08 + +H(x) for member 4: + +AIRBASE_O3 nobs= 1 Min=5.5961471300702660e-08, Max=5.5961471300702660e-08, RMS=5.5961471300702660e-08 + +H(x) for member 5: + +AIRBASE_O3 nobs= 1 Min=6.2855019417935763e-08, Max=6.2855019417935763e-08, RMS=6.2855019417935763e-08 + +H(x) for member 6: + +AIRBASE_O3 nobs= 1 Min=5.7135834841393610e-08, Max=5.7135834841393610e-08, RMS=5.7135834841393610e-08 + +H(x) ensemble background mean: + +AIRBASE_O3 nobs= 1 Min=6.1392682534357151e-08, Max=6.1392682534357151e-08, RMS=6.1392682534357151e-08 + +background y - H(x): + +AIRBASE_O3 nobs= 1 Min=2.9327317866421949e-08, Max=2.9327317866421949e-08, RMS=2.9327317866421949e-08 + +Background mean : +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261957e-06 + + mean = 2.2048841106590927e-07 + + stddev = 3.4176573593501040e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601801e-06 + + mean = 2.2049722812827432e-07 + + stddev = 3.4164181628685878e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941644e-06 + + mean = 2.2044779870635763e-07 + + stddev = 3.4148243634426173e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281488e-06 + + mean = 2.2035341519945959e-07 + + stddev = 3.4133520188836458e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993411e-06 + + mean = 2.2026444229594154e-07 + + stddev = 3.4124038036854245e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149654e-06 + + mean = 2.2018834862564615e-07 + + stddev = 3.4117955734297425e-07 + +Analysis mean : +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9180281162261957e-06 + + mean = 2.2048843459898371e-07 + + stddev = 3.4176572482318020e-07 + +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9168646335601801e-06 + + mean = 2.2049726552432539e-07 + + stddev = 3.4164179891728617e-07 + +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9157011508941644e-06 + + mean = 2.2044784834374852e-07 + + stddev = 3.4148241358559716e-07 + +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.9145376682281488e-06 + + mean = 2.2035347403323986e-07 + + stddev = 3.4133517513686785e-07 + +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8966858386993411e-06 + + mean = 2.2026450608606808e-07 + + stddev = 3.4124035149291310e-07 + +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min ~ 0 + + max = 2.8882935047149654e-06 + + mean = 2.2018841388997019e-07 + + stddev = 3.4117952777999592e-07 + +Analysis mean increment : +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = -7.8587988116641861e-10 + + max = 9.7507669695131345e-10 + + mean = 2.3533074387131562e-14 + + stddev = 3.7229921449910584e-12 + +Analysis mean increment : +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = -1.0573064270249229e-09 + + max = 1.1285166307366265e-09 + + mean = 3.7396051168954797e-14 + + stddev = 4.7602976722042035e-12 + +Analysis mean increment : +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = -1.2932667152672405e-09 + + max = 1.0919748893428575e-09 + + mean = 4.9637390874447360e-14 + + stddev = 5.6804132396922385e-12 + +Analysis mean increment : +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = -1.4269261822000226e-09 + + max = 1.2877876303527207e-09 + + mean = 5.8833780264036214e-14 + + stddev = 6.5646219197022937e-12 + +Analysis mean increment : +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = -1.5230112179857752e-09 + + max = 1.3669564314011203e-09 + + mean = 6.3790126498708488e-14 + + stddev = 6.9302435692032853e-12 + +Analysis mean increment : +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = -1.5761749646381015e-09 + + max = 1.3837595102948075e-09 + + mean = 6.5264324010651284e-14 + + stddev = 6.9183850696579129e-12 + +Forecast variance : +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 3.2322326691736302e-16 + + mean = 1.4056476912411174e-18 + + stddev = 6.7400862743498722e-18 + +Forecast variance : +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 3.7667324780114817e-16 + + mean = 1.4965130944443261e-18 + + stddev = 7.2688876452691184e-18 + +Forecast variance : +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 4.2010336925459705e-16 + + mean = 1.5781656929128048e-18 + + stddev = 7.8014238546795059e-18 + +Forecast variance : +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 4.6459370702501131e-16 + + mean = 1.6454264734793880e-18 + + stddev = 8.3152366543534922e-18 + +Forecast variance : +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 4.8900410823519520e-16 + + mean = 1.7003954901676659e-18 + + stddev = 8.7379338590805741e-18 + +Forecast variance : +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 5.4682325622013825e-16 + + mean = 1.7463807108468572e-18 + + stddev = 9.0907446781780370e-18 + +Analysis variance : +- Valid time: 2022-07-01T09:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 3.2322326691736302e-16 + + mean = 1.4056350295276953e-18 + + stddev = 6.7400580407203788e-18 + +Analysis variance : +- Valid time: 2022-07-01T10:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 3.7667324780114817e-16 + + mean = 1.4964928035080463e-18 + + stddev = 7.2688349184059912e-18 + +Analysis variance : +- Valid time: 2022-07-01T11:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 4.2010336925459705e-16 + + mean = 1.5781365372954154e-18 + + stddev = 7.8013317823498836e-18 + +Analysis variance : +- Valid time: 2022-07-01T12:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 4.6459370702501131e-16 + + mean = 1.6453891531155566e-18 + + stddev = 8.3151041848791282e-18 + +Analysis variance : +- Valid time: 2022-07-01T13:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 4.8900410823519520e-16 + + mean = 1.7003544765824239e-18 + + stddev = 8.7377842716203187e-18 + +Analysis variance : +- Valid time: 2022-07-01T14:00:00Z + Geometry: structured [95121] + Fields: + - ozone (24 levels): + + min = 0.0000000000000000e+00 + + max = 5.4682325622013825e-16 + + mean = 1.7463397935143456e-18 + + stddev = 9.0905952190084958e-18 + +H(x) for member 1: + +AIRBASE_O3 nobs= 1 Min=6.4605292563501932e-08, Max=6.4605292563501932e-08, RMS=6.4605292563501932e-08 + +H(x) for member 2: + +AIRBASE_O3 nobs= 1 Min=6.5285072357612984e-08, Max=6.5285072357612984e-08, RMS=6.5285072357612984e-08 + +H(x) for member 3: + +AIRBASE_O3 nobs= 1 Min=6.6015388221140401e-08, Max=6.6015388221140401e-08, RMS=6.6015388221140401e-08 + +H(x) for member 4: + +AIRBASE_O3 nobs= 1 Min=5.7301345947153081e-08, Max=5.7301345947153081e-08, RMS=5.7301345947153081e-08 + +H(x) for member 5: + +AIRBASE_O3 nobs= 1 Min=6.4049360860207197e-08, Max=6.4049360860207197e-08, RMS=6.4049360860207197e-08 + +H(x) for member 6: + +AIRBASE_O3 nobs= 1 Min=5.8450916433807816e-08, Max=5.8450916433807816e-08, RMS=5.8450916433807816e-08 + +H(x) ensemble analysis mean: + +AIRBASE_O3 nobs= 1 Min=6.2617896063903890e-08, Max=6.2617896063903890e-08, RMS=6.2617896063903890e-08 + +analysis y - H(x): + +AIRBASE_O3 nobs= 1 Min=2.8102104336875210e-08, Max=2.8102104336875210e-08, RMS=2.8102104336875210e-08 + +ombg RMS: 2.9327317866421949e-08 +oman RMS: 2.8102104336875210e-08 From 764d83c128f788558eca2c5d2707a73fa071a0c2 Mon Sep 17 00:00:00 2001 From: Andrea Piacentini Date: Tue, 3 Feb 2026 12:17:04 +0100 Subject: [PATCH 2/3] [bsc] Add the "time interpolation" entry in the "get values" section of the observers. Pointing to its default value, but kept for memory in case one would to use a "linear" time interpolation --- test/monarch/testinput/letkf_nonlinear_4d.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/monarch/testinput/letkf_nonlinear_4d.yaml b/test/monarch/testinput/letkf_nonlinear_4d.yaml index d725eec..20f0ac8 100644 --- a/test/monarch/testinput/letkf_nonlinear_4d.yaml +++ b/test/monarch/testinput/letkf_nonlinear_4d.yaml @@ -205,6 +205,8 @@ observations: observation alias file: testinput/ufo_variable_name_map.yaml obs error: covariance model: diagonal + get values: + time interpolation: nearest obs localizations: - localization method: Horizontal Gaspari-Cohn lengthscale: 250e3 From 9978e08509a7a1c1fce1ed819309be8143a84908 Mon Sep 17 00:00:00 2001 From: Benjamin Menetrier Date: Tue, 3 Feb 2026 16:01:12 +0100 Subject: [PATCH 3/3] Cosmetic cleaning --- src/vind/FieldsIO/FieldsIOBSC.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/vind/FieldsIO/FieldsIOBSC.cc b/src/vind/FieldsIO/FieldsIOBSC.cc index c392de3..e92ad87 100644 --- a/src/vind/FieldsIO/FieldsIOBSC.cc +++ b/src/vind/FieldsIO/FieldsIOBSC.cc @@ -342,10 +342,10 @@ void FieldsIOBSC::write(const eckit::Configuration & conf, util::DateTime validTime; if (conf.has("date")) { validTime = util::DateTime(conf.getString("date")); + } else if (conf.has("date pattern")) { + validTime = util::DateTime(conf.getString("date pattern")); } else { - if (conf.has("date pattern")) { - validTime = util::DateTime(conf.getString("date pattern")); - } + throw eckit::UserError("Missing date or date pattern", Here()); } // Get timeseries mode