Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions bundle/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ endif()
ecbuild_bundle( PROJECT iodaconv SOURCE "../sorc/iodaconv" )
endif()

# rdas mega executable
ecbuild_bundle( PROJECT rdas SOURCE "../mains" )

# ioda, ufo, fv3-jedi, and saber test data
#---------------------------------
if(CLONE_JCSDADATA)
Expand Down Expand Up @@ -140,6 +143,7 @@ endif()

ecbuild_bundle( PROJECT rrfs-test SOURCE "../rrfs-test" )
endif(CLONE_RRFSDATA)

endif(BUILD_RDASBUNDLE)

# Finalize bundle
Expand Down
35 changes: 35 additions & 0 deletions mains/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Build the big rdas executable used for all generic JEDI applications
# --------------------------------------------------------------------

#---------------------------------

# Standard compiler flags
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_FORTRAN_STANDARD 08)
set(CMAKE_FORTRAN_STANDARD_REQUIRED ON)
set(CMAKE_FORTRAN_EXTENSIONS OFF)

if ( FV3_DYCORE )

find_package( fv3jedi REQUIRED )
ecbuild_add_executable( TARGET rdas_fv3jedi.x
SOURCES rdas_fv3jedi.cc
LIBS fv3jedi
)

endif()

if ( MPAS_DYCORE )

find_package( mpasjedi REQUIRED )
ecbuild_add_executable( TARGET rdas_mpasjedi.x
SOURCES rdas_mpasjedi.cc
LIBS mpasjedi
)

endif()
108 changes: 108 additions & 0 deletions mains/rdas_fv3jedi.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
// -------------------------------------------------------------------------------------------------

#include <functional>
#include <map>

#include "fv3jedi/ObsLocalization/instantiateObsLocFactory.h"
#include "fv3jedi/Utilities/Traits.h"

#include "oops/generic/instantiateModelFactory.h"
#include "saber/oops/instantiateCovarFactory.h"
#include "saber/oops/ErrorCovarianceToolbox.h"
#include "ufo/instantiateObsErrorFactory.h"
#include "ufo/instantiateObsFilterFactory.h"
#include "ufo/ObsTraits.h"

#include "oops/runs/ConvertState.h"
#include "oops/runs/HofX4D.h"
#include "oops/runs/LocalEnsembleDA.h"
#include "oops/runs/Run.h"
#include "oops/runs/Variational.h"

// -------------------------------------------------------------------------------------------------

template<typename Traits>
int runApp(int argc, char** argv, const std::string appName) {

// Create the Run object
oops::Run run(argc, argv);

// Instantiate oops factories
oops::instantiateModelFactory<Traits>();

// Instantiate saber factories
saber::instantiateCovarFactory<Traits>();

// Intantiate ufo factories
ufo::instantiateObsErrorFactory();
ufo::instantiateObsFilterFactory();

// Localization for ensemble DA
if (appName == "localensembleda") {
fv3jedi::instantiateObsLocFactory();
}

// Application pointer
std::unique_ptr<oops::Application> app;

// Define a map from app names to lambda functions that create unique_ptr to Applications
std::map<std::string, std::function<std::unique_ptr<oops::Application>()>> apps;

apps["convertstate"] = []() {
Comment thread
ShunLiu-NOAA marked this conversation as resolved.
return std::make_unique<oops::ConvertState<Traits>>();
};
apps["bump"] = []() {
return std::make_unique<saber::ErrorCovarianceToolbox<Traits>>();
};
apps["hofx4d"] = []() {
return std::make_unique<oops::HofX4D<Traits, ufo::ObsTraits>>();
};
apps["localensembleda"] = []() {
return std::make_unique<oops::LocalEnsembleDA<fv3jedi::Traits, ufo::ObsTraits>>();
};
apps["variational"] = []() {
return std::make_unique<oops::Variational<Traits, ufo::ObsTraits>>();
};

// Create application object and point to it
auto it = apps.find(appName);

// Run the application
return run.execute(*(it->second()));
}

// -------------------------------------------------------------------------------------------------

int main(int argc, char ** argv) {
// Check that the number of arguments is correct
// ----------------------------------------------
ASSERT_MSG(argc >= 2, "Usage: " + std::string(argv[0]) + " <application> <options>");

// Get the application to be run
std::string app = argv[1];
for (char &c : app) {c = std::tolower(c);}

// Check that the application is recognized
// ----------------------------------------
const std::set<std::string> validApps = {
"convertstate",
"bump",
"hofx4d",
"localensembleda",
"variational"
};
ASSERT_MSG(validApps.find(app) != validApps.end(), "Application not recognized: " + app);

// Remove program from argc and argv
// --------------------------------------------
argv[1] = argv[0]; // Move executable name to second position
argv += 1; // Move pointer up two
argc -= 1; // Remove 1 from count

// Call application specific main functions
// ----------------------------------------
fv3jedi::instantiateObsLocFactory();
return runApp<fv3jedi::Traits>(argc, argv, app);
}

// -------------------------------------------------------------------------------------------------
116 changes: 116 additions & 0 deletions mains/rdas_mpasjedi.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// -------------------------------------------------------------------------------------------------

#include <functional>
#include <map>

#include "oops/generic/instantiateModelFactory.h"
#include "saber/oops/instantiateCovarFactory.h"
#include "saber/oops/ErrorCovarianceToolbox.h"
#include "saber/oops/instantiateLocalizationFactory.h"
#include "ufo/instantiateObsErrorFactory.h"
#include "ufo/instantiateObsFilterFactory.h"
#include "ufo/instantiateObsLocFactory.h"
#include "ufo/ObsTraits.h"

#include "oops/runs/ConvertState.h"
#include "oops/runs/HofX4D.h"
#include "oops/runs/LocalEnsembleDA.h"
#include "oops/runs/Run.h"
#include "oops/runs/Variational.h"
#include "mpasjedi/Traits.h"

// -------------------------------------------------------------------------------------------------

template<typename Traits>
int runApp(int argc, char** argv, const std::string appName) {

// Create the Run object
oops::Run run(argc, argv);

// Instantiate oops factories
oops::instantiateModelFactory<Traits>();

// Instantiate saber factories
saber::instantiateCovarFactory<Traits>();

// Intantiate ufo factories
ufo::instantiateObsErrorFactory();
ufo::instantiateObsFilterFactory();

// Localization for ensemble DA
if (appName == "localensembleda") {
ufo::instantiateObsLocFactory<Traits>();
}

// Localization for variational DA
if (appName == "variational") {
saber::instantiateLocalizationFactory<Traits>();
}

// Intantiate ufo factories
ufo::instantiateObsErrorFactory();
ufo::instantiateObsFilterFactory();

// Application pointer
std::unique_ptr<oops::Application> app;

// Define a map from app names to lambda functions that create unique_ptr to Applications
std::map<std::string, std::function<std::unique_ptr<oops::Application>()>> apps;

apps["convertstate"] = []() {
return std::make_unique<oops::ConvertState<Traits>>();
};
apps["bump"] = []() {
return std::make_unique<saber::ErrorCovarianceToolbox<Traits>>();
};
apps["hofx4d"] = []() {
return std::make_unique<oops::HofX4D<Traits, ufo::ObsTraits>>();
};
apps["localensembleda"] = []() {
return std::make_unique<oops::LocalEnsembleDA<mpas::Traits, ufo::ObsTraits>>();
};
apps["variational"] = []() {
return std::make_unique<oops::Variational<Traits, ufo::ObsTraits>>();
};

// Create application object and point to it
auto it = apps.find(appName);

// Run the application
return run.execute(*(it->second()));
}

// -------------------------------------------------------------------------------------------------

int main(int argc, char ** argv) {
// Check that the number of arguments is correct
// ----------------------------------------------
ASSERT_MSG(argc >= 2, "Usage: " + std::string(argv[0]) + " <application> <options>");

// Get the application to be run
std::string app = argv[1];
for (char &c : app) {c = std::tolower(c);}

// Check that the application is recognized
// ----------------------------------------
const std::set<std::string> validApps = {
"convertstate",
"bump",
"hofx4d",
"localensembleda",
"variational"
};
ASSERT_MSG(validApps.find(app) != validApps.end(), "Application not recognized: " + app);

// Remove program from argc and argv
// --------------------------------------------
argv[1] = argv[0]; // Move executable name to second position
argv += 1; // Move pointer up two
argc -= 1; // Remove 1 from count

// Call application specific main functions
// ----------------------------------------
return runApp<mpas::Traits>(argc, argv, app);
}

// -------------------------------------------------------------------------------------------------
1 change: 1 addition & 0 deletions rrfs-test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ if (CLONE_RRFSDATA)
set(RESTORE_MPI_ARGS ${MPI_ARGS})
set(MPI_ARGS "${MPI_ARGS} --exclusive")
endif()
set(MPI_ARGS "${MPI_ARGS} --ntasks-per-node=18")
Comment thread
CoryMartin-NOAA marked this conversation as resolved.

get_all_keys(rrfs_mpasjedi_tests caselist)
foreach(case ${caselist})
Expand Down