From de33553985085fc53324d87fb31825abee7fbe80 Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Thu, 11 Jul 2024 12:45:16 -0700 Subject: [PATCH 1/4] read in IOP lev data before surface pressure adjustment is applied --- .../eamxx/src/share/iop/intensive_observation_period.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/components/eamxx/src/share/iop/intensive_observation_period.cpp b/components/eamxx/src/share/iop/intensive_observation_period.cpp index 657f7ad742a..70f1c41b603 100644 --- a/components/eamxx/src/share/iop/intensive_observation_period.cpp +++ b/components/eamxx/src/share/iop/intensive_observation_period.cpp @@ -541,6 +541,15 @@ read_iop_file_data (const util::TimeStamp& current_ts) scorpio::read_var(iop_file,"Ps",ps_data,iop_file_time_idx); surface_pressure.sync_to_dev(); + // Read in IOP lev data + auto data = iop_file_pressure.get_view().data(); + scorpio::read_var(iop_file,"lev",data); + + // Convert to pressure to millibar (file gives pressure in Pa) + for (int ilev=0; ilev(); From 0f86fe3c757f4abcb9e3ccbe6cab97258e5e5502 Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Thu, 11 Jul 2024 16:21:55 -0700 Subject: [PATCH 2/4] add minimum threshold when checking lat and lon relative error for IOP file to prevent NaN --- .../eamxx/src/share/iop/intensive_observation_period.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/eamxx/src/share/iop/intensive_observation_period.cpp b/components/eamxx/src/share/iop/intensive_observation_period.cpp index 70f1c41b603..42ea7d0ec03 100644 --- a/components/eamxx/src/share/iop/intensive_observation_period.cpp +++ b/components/eamxx/src/share/iop/intensive_observation_period.cpp @@ -268,9 +268,9 @@ initialize_iop_file(const util::TimeStamp& run_t0, scorpio::read_var(iop_file,"lon",&iop_file_lon); const Real rel_lat_err = std::fabs(iop_file_lat - m_params.get("target_latitude"))/ - m_params.get("target_latitude"); + ekat::impl::max(m_params.get("target_latitude"),0.1); const Real rel_lon_err = std::fabs(std::fmod(iop_file_lon + 360.0, 360.0)-m_params.get("target_longitude"))/ - m_params.get("target_longitude"); + ekat::impl::max(m_params.get("target_longitude"),0.1); EKAT_REQUIRE_MSG(rel_lat_err < std::numeric_limits::epsilon(), "Error! IOP file variable \"lat\" does not match target_latitude from IOP parameters.\n"); EKAT_REQUIRE_MSG(rel_lon_err < std::numeric_limits::epsilon(), From a5aec91cf445c5314bd476cb5e192a04a7f4c92b Mon Sep 17 00:00:00 2001 From: Peter Bogenschutz Date: Tue, 16 Jul 2024 10:28:54 -0700 Subject: [PATCH 3/4] change ekat::impl::max instances to std::max and remove unneeded m_helper_fields line --- .../eamxx/src/share/iop/intensive_observation_period.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/eamxx/src/share/iop/intensive_observation_period.cpp b/components/eamxx/src/share/iop/intensive_observation_period.cpp index 42ea7d0ec03..cf20435fd2c 100644 --- a/components/eamxx/src/share/iop/intensive_observation_period.cpp +++ b/components/eamxx/src/share/iop/intensive_observation_period.cpp @@ -268,9 +268,9 @@ initialize_iop_file(const util::TimeStamp& run_t0, scorpio::read_var(iop_file,"lon",&iop_file_lon); const Real rel_lat_err = std::fabs(iop_file_lat - m_params.get("target_latitude"))/ - ekat::impl::max(m_params.get("target_latitude"),0.1); + std::max(m_params.get("target_latitude"),0.1); const Real rel_lon_err = std::fabs(std::fmod(iop_file_lon + 360.0, 360.0)-m_params.get("target_longitude"))/ - ekat::impl::max(m_params.get("target_longitude"),0.1); + std::max(m_params.get("target_longitude"),0.1); EKAT_REQUIRE_MSG(rel_lat_err < std::numeric_limits::epsilon(), "Error! IOP file variable \"lat\" does not match target_latitude from IOP parameters.\n"); EKAT_REQUIRE_MSG(rel_lon_err < std::numeric_limits::epsilon(), @@ -548,7 +548,6 @@ read_iop_file_data (const util::TimeStamp& current_ts) // Convert to pressure to millibar (file gives pressure in Pa) for (int ilev=0; ilev Date: Wed, 17 Jul 2024 09:42:48 -0700 Subject: [PATCH 4/4] cast minimum lat/lon threshold as a real --- .../eamxx/src/share/iop/intensive_observation_period.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/eamxx/src/share/iop/intensive_observation_period.cpp b/components/eamxx/src/share/iop/intensive_observation_period.cpp index cf20435fd2c..6f8474f8d85 100644 --- a/components/eamxx/src/share/iop/intensive_observation_period.cpp +++ b/components/eamxx/src/share/iop/intensive_observation_period.cpp @@ -268,9 +268,9 @@ initialize_iop_file(const util::TimeStamp& run_t0, scorpio::read_var(iop_file,"lon",&iop_file_lon); const Real rel_lat_err = std::fabs(iop_file_lat - m_params.get("target_latitude"))/ - std::max(m_params.get("target_latitude"),0.1); + std::max(m_params.get("target_latitude"),(Real)0.1); const Real rel_lon_err = std::fabs(std::fmod(iop_file_lon + 360.0, 360.0)-m_params.get("target_longitude"))/ - std::max(m_params.get("target_longitude"),0.1); + std::max(m_params.get("target_longitude"),(Real)0.1); EKAT_REQUIRE_MSG(rel_lat_err < std::numeric_limits::epsilon(), "Error! IOP file variable \"lat\" does not match target_latitude from IOP parameters.\n"); EKAT_REQUIRE_MSG(rel_lon_err < std::numeric_limits::epsilon(),