From 5e4179c7c6498ee2ce80a58252da7ea522dca3d7 Mon Sep 17 00:00:00 2001 From: Travis Sluka Date: Thu, 18 May 2023 11:40:42 -0600 Subject: [PATCH 1/3] add vader to build, but dont use it --- .travis.yml | 2 +- CMakeLists.txt | 1 + bundle/CMakeLists.txt | 1 + src/soca/CMakeLists.txt | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 17bb0a512..f83328a8c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ env: global: - MAIN_REPO=soca - - LIB_REPOS="gsw mom6 icepack oops ioda ufo saber" + - LIB_REPOS="gsw mom6 icepack oops vader ioda ufo saber" - BUILD_OPT="-DBUILD_ICEPACK=ON" - BUILD_OPT_mom6="-DENABLE_OCEAN_BGC=ON" - BUILD_OPT_oops="-DENABLE_QG_MODEL=OFF -DENABLE_LORENZ95_MODEL=OFF" diff --git a/CMakeLists.txt b/CMakeLists.txt index 824352e53..dc78ef3bf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,7 @@ find_package( eckit 1.11.6 REQUIRED) find_package( fckit 0.7.0 REQUIRED) find_package( atlas 0.20.2 REQUIRED) find_package( oops 1.3.0 REQUIRED) +find_package( vader 1.3.0 REQUIRED) find_package( saber 1.0.0 REQUIRED) find_package( ioda 1.0.0 REQUIRED) find_package( ufo 1.3.0 REQUIRED) diff --git a/bundle/CMakeLists.txt b/bundle/CMakeLists.txt index 8f8a33e6c..ae78a0725 100644 --- a/bundle/CMakeLists.txt +++ b/bundle/CMakeLists.txt @@ -54,6 +54,7 @@ option(BUILD_UFSM6C6 "download and install the UFS" OFF) # required repositories ecbuild_bundle( PROJECT oops GIT "https://github.com/jcsda-internal/oops.git" UPDATE BRANCH develop ) +ecbuild_bundle( PROJECT vader GIT "https://github.com/jcsda-internal/vader.git" UPDATE BRANCH develop ) ecbuild_bundle( PROJECT saber GIT "https://github.com/jcsda-internal/saber.git" UPDATE BRANCH develop ) ecbuild_bundle( PROJECT ioda GIT "https://github.com/jcsda-internal/ioda.git" UPDATE BRANCH develop ) ecbuild_bundle( PROJECT gsw GIT "https://github.com/jcsda-internal/GSW-Fortran.git" UPDATE BRANCH develop ) diff --git a/src/soca/CMakeLists.txt b/src/soca/CMakeLists.txt index 539bcfc06..65a6cd592 100644 --- a/src/soca/CMakeLists.txt +++ b/src/soca/CMakeLists.txt @@ -42,6 +42,7 @@ target_link_libraries( soca PUBLIC oops ) target_link_libraries( soca PUBLIC saber ) target_link_libraries( soca PUBLIC ioda ) target_link_libraries( soca PUBLIC ufo ) +target_link_libraries( soca PUBLIC vader ) if ( BUILD_ICEPACK ) target_link_libraries( soca PUBLIC icepack ) endif() From b9f662251916dd3b0585ee25fbd40f203102f8e1 Mon Sep 17 00:00:00 2001 From: Travis Sluka Date: Mon, 22 May 2023 11:57:28 -0600 Subject: [PATCH 2/3] add State::fromFieldSet --- src/soca/State/State.cc | 7 +++++++ src/soca/State/State.h | 3 ++- src/soca/State/StateFortran.h | 4 ++++ src/soca/State/soca_state.interface.F90 | 21 +++++++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/soca/State/State.cc b/src/soca/State/State.cc index 92f7f3969..f76f2e4a6 100644 --- a/src/soca/State/State.cc +++ b/src/soca/State/State.cc @@ -257,4 +257,11 @@ namespace soca { // get field, with halo, and no masked values soca_state_to_fieldset_f90(toFortran(), vars_, fset.get(), false); } + + // ----------------------------------------------------------------------------- + + void State::fromFieldSet(const atlas::FieldSet &fs) { + // set field, with halo, and no masked values + soca_state_from_fieldset_f90(toFortran(), vars_, fs.get(), false); + } } // namespace soca diff --git a/src/soca/State/State.h b/src/soca/State/State.h index 5e53f20e6..79d2aa759 100644 --- a/src/soca/State/State.h +++ b/src/soca/State/State.h @@ -101,8 +101,9 @@ namespace soca { void zero(); void accumul(const double &, const State &); - /// Interfaces required for OOPS interpolation + /// ATLAS Interfaces void toFieldSet(atlas::FieldSet &) const; + void fromFieldSet(const atlas::FieldSet &); private: void print(std::ostream &) const override; diff --git a/src/soca/State/StateFortran.h b/src/soca/State/StateFortran.h index 09b37bf11..56316f55c 100644 --- a/src/soca/State/StateFortran.h +++ b/src/soca/State/StateFortran.h @@ -71,6 +71,10 @@ namespace soca { const oops::Variables &, atlas::field::FieldSetImpl *, const bool &); + void soca_state_from_fieldset_f90(const F90flds &, + const oops::Variables &, + const atlas::field::FieldSetImpl *, + const bool &); } } // namespace soca #endif // SOCA_STATE_STATEFORTRAN_H_ diff --git a/src/soca/State/soca_state.interface.F90 b/src/soca/State/soca_state.interface.F90 index 3a5a48ca6..27c80e86d 100644 --- a/src/soca/State/soca_state.interface.F90 +++ b/src/soca/State/soca_state.interface.F90 @@ -481,4 +481,25 @@ subroutine soca_state_to_fieldset_c(c_key_self, c_vars, c_fieldset, c_masked) & call self%to_fieldset(vars, afieldset, logical(c_masked)) end subroutine +! ------------------------------------------------------------------------------ +!> C++ interface for soca_increment_mod::soca_increment::from_fieldset() +subroutine soca_state_from_fieldset_c(c_key_self, c_vars, c_afieldset, c_masked) & + bind (c,name='soca_state_from_fieldset_f90') +integer(c_int), intent(in) :: c_key_self +type(c_ptr), value, intent(in) :: c_vars +type(c_ptr), value, intent(in) :: c_afieldset +logical(c_bool), intent(in) :: c_masked + +type(soca_state), pointer :: self +type(oops_variables) :: vars +type(atlas_fieldset) :: afieldset + +call soca_state_registry%get(c_key_self, self) +vars = oops_variables(c_vars) +afieldset = atlas_fieldset(c_afieldset) + +call self%from_fieldset(vars, afieldset, logical(c_masked)) + +end subroutine + end module soca_state_mod_c From e505aaa4bb5d0357fedb6ef0a6b2357fef1ce15c Mon Sep 17 00:00:00 2001 From: Travis Sluka Date: Mon, 22 May 2023 11:57:49 -0600 Subject: [PATCH 3/3] variablechange "uses" vader --- src/soca/VariableChange/VariableChange.cc | 68 +++++++++++++++++++---- src/soca/VariableChange/VariableChange.h | 5 ++ 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/soca/VariableChange/VariableChange.cc b/src/soca/VariableChange/VariableChange.cc index 48e3a956c..53be6f7c7 100644 --- a/src/soca/VariableChange/VariableChange.cc +++ b/src/soca/VariableChange/VariableChange.cc @@ -22,6 +22,9 @@ namespace soca { VariableChange::VariableChange(const Parameters_ & params, const Geometry & geometry) { + // setup vader + vader_.reset(new vader::Vader(params.vader)); + // Create the variable change variableChange_.reset(VariableChangeFactory::create(geometry, params.variableChangeParametersWrapper.variableChangeParameters.value())); @@ -44,8 +47,27 @@ void VariableChange::changeVar(State & x, const oops::Variables & vars) const { // TODO(travis) rename in/out variables so that skipping this // works for Model2Ana (i.e. we need rotated/unrotate u/v renamed different) // // If the variables are the same, don't bother doing anything! - // if (!(x.variables() == vars)) { - + // if (!(x.variables() == vars)) + + // call Vader + // ---------------------------------------------------------------------------- + // Record start variables + oops::Variables varsFilled = x.variables(); + oops::Variables varsVader = vars; + varsVader -= varsFilled; // Pass only the needed variables + + // Call Vader. On entry, varsVader holds the vars requested from Vader; on exit, + // it holds the vars NOT fulfilled by Vader, i.e., the vars still to be requested elsewhere. + // vader_->changeVar also returns the variables fulfilled by Vader. These variables are allocated + // and populated and added to the FieldSet (xfs). + atlas::FieldSet xfs; + x.toFieldSet(xfs); + varsFilled += vader_->changeVar(xfs, varsVader); + x.updateFields(varsFilled); + x.fromFieldSet(xfs); + + // soca specific transforms + // ---------------------------------------------------------------------------- // Create output state State xout(x.geometry(), vars, x.time()); @@ -56,7 +78,6 @@ void VariableChange::changeVar(State & x, const oops::Variables & vars) const { x.updateFields(vars); x = xout; - // } Log::trace() << "VariableChange::changeVar done" << std::endl; } @@ -73,18 +94,41 @@ void VariableChange::changeVarInverse(State & x, << vars << std::endl; // If the variables are the same, don't bother doing anything! - if (!(x.variables() == vars)) { - // Create output state - State xout(x.geometry(), vars, x.time()); - - // Call variable change - variableChange_->changeVarInverse(x, xout); - - // Copy data from temporary state + if (vars <= x.variables()) { x.updateFields(vars); - x = xout; + oops::Log::info() << "VariableChange::changeVarInverse done (identity)" << std::endl; + return; } + // call Vader + // ---------------------------------------------------------------------------- + // Record start variables + oops::Variables varsFilled = x.variables(); + oops::Variables varsVader = vars; + varsVader -= varsFilled; // Pass only the needed variables + + // Call Vader. On entry, varsVader holds the vars requested from Vader; on exit, + // it holds the vars NOT fulfilled by Vader, i.e., the vars still to be requested elsewhere. + // vader_->changeVar also returns the variables fulfilled by Vader. These variables are allocated + // and populated and added to the FieldSet (xfs). + atlas::FieldSet xfs; + x.toFieldSet(xfs); + varsFilled += vader_->changeVar(xfs, varsVader); + x.updateFields(varsFilled); + x.fromFieldSet(xfs); + + // soca specific transforms + // ----------------------------------------------------------------------------- + // Create output state + State xout(x.geometry(), vars, x.time()); + + // Call variable change + variableChange_->changeVarInverse(x, xout); + + // Copy data from temporary state + x.updateFields(vars); + x = xout; + Log::trace() << "VariableChange::changeVarInverse done" << std::endl; } diff --git a/src/soca/VariableChange/VariableChange.h b/src/soca/VariableChange/VariableChange.h index 950dc9ad4..554431bee 100644 --- a/src/soca/VariableChange/VariableChange.h +++ b/src/soca/VariableChange/VariableChange.h @@ -18,8 +18,11 @@ #include "oops/util/parameters/Parameters.h" #include "oops/util/Printable.h" +#include "vader/vader.h" + #include "soca/VariableChange/Base/VariableChangeBase.h" +// Forward declarations namespace soca { class Geometry; class State; @@ -32,6 +35,7 @@ class VariableChangeParameters : public oops::VariableChangeParametersBase { public: // Wrapper to VariableChange parameters VariableChangeParametersWrapper variableChangeParametersWrapper{this}; + oops::Parameter vader{"vader", {}, this}; }; // ----------------------------------------------------------------------------- @@ -51,6 +55,7 @@ class VariableChange : public util::Printable { private: void print(std::ostream &) const override; std::unique_ptr variableChange_; + std::unique_ptr vader_; }; // -----------------------------------------------------------------------------