Skip to content
Closed
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
15 changes: 15 additions & 0 deletions core/src/ModelMetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,21 @@ void ModelMetadata::setDimensionsFromFile(const std::string& filename)
if (dim.isNull()) {
dim = ncFile.getDim(dimensionSpec.altName);
}
#ifdef USE_XIOS
// Account for the fact that XIOS writes dimensions differently if only one
// discretisation is written out. If the dimension is still null at this point then we
// assume that the only discretisation used is HDomain-based, i.e., HField, DGField, or
// DGSField.
if (dim.isNull()) {
if (dimensionSpec.name == "x_dim") {
dim = ncFile.getDim("x");
} else if (dimensionSpec.name == "y_dim") {
dim = ncFile.getDim("y");
} else {
continue;
}
}
#endif
// If we didn't find a dimension with the dimensions name or altName, throw.
if (dim.isNull()) {
throw std::out_of_range(
Expand Down
374 changes: 156 additions & 218 deletions core/src/Xios.cpp

Large diffs are not rendered by default.

41 changes: 18 additions & 23 deletions core/src/include/Xios.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -83,40 +83,18 @@ class Xios : public Configured<Xios> {
ModelArray::Type getFieldType(const std::string& fieldId);
void setFieldType(const std::string& fieldId, const ModelArray::Type& type);

/* File */
void createFile(const std::string& fileId, const int& fieldType);
void setFileType(const std::string& fileId, const std::string& fileType);
void setFileOutputFreq(const std::string& fileId, const Duration& outputFreq);
void setFileParAccess(const std::string& fileId, const std::string& parAccess);
std::string getFileType(const std::string& fileId);
Duration getFileOutputFreq(const std::string& fileId);
std::string getFileMode(const std::string& fileId);
std::string getFileParAccess(const std::string& fileId);
void fileAddField(const std::string& fileId, const std::string& fieldId);
std::vector<std::string> fileGetFieldIds(const std::string& fileId);

enum {
ENABLED_KEY,
OUTPUT_FIELD_NAMES_KEY,
OUTPUT_SPLITFREQ_KEY,
INPUT_FIELD_NAMES_KEY,
DIAGNOSTIC_PERIOD_KEY,
DIAGNOSTIC_FILE_KEY,
DIAGNOSTIC_FIELD_NAMES_KEY,
DIAGNOSTIC_SPLITFREQ_KEY,
FORCING_PERIOD_KEY,
FORCING_FILE_KEY,
FORCING_FIELD_NAMES_KEY,
};

// TODO: Make the following enum private
enum {
OUTPUT_RESTART,
INPUT_RESTART,
DIAGNOSTIC,
FORCING,
};

protected:
bool isConfigured;

Expand Down Expand Up @@ -192,20 +170,37 @@ class Xios : public Configured<Xios> {
/* File */
xios::CFileGroup* getFileGroup();
xios::CFile* getFile(const std::string& fileId);
void setFileMode(const std::string& fileId, const std::string& mode);
std::string outputFileId;
std::string outputFormatStr = "%y-%mo-%dT%h:%mi:%sZ";
std::string inputFileId;
std::string diagnosticFilename;
std::string diagnosticFileId;
std::string diagnosticFormatStr = "%y-%mo-%dT%h:%mi:%sZ";
std::string forcingFilename;
std::string forcingFileId;
enum {
OUTPUT_RESTART,
INPUT_RESTART,
DIAGNOSTIC,
FORCING,
};
const std::map<int, std::string&> fileMap = {
{ OUTPUT_RESTART, outputFileId },
{ INPUT_RESTART, inputFileId },
{ DIAGNOSTIC, diagnosticFileId },
{ FORCING, forcingFileId },
};
void setupFiles();
void createFile(const std::string& fileId);
void fileAddField(const std::string& fileId, const std::string& fieldId);
std::vector<std::string> fileGetFieldIds(const std::string& fileId);
const std::map<std::string, std::string> formatStrMap = {
{ "%Y", "%y" },
{ "%m-", "%mo-" },
{ "%H", "%h" },
{ "%M", "%mi" },
{ "%S", "%s" },
};

/* I/O */
void read(const std::string& fieldId, ModelArray& modelarray);
Expand Down
7 changes: 3 additions & 4 deletions core/src/include/xios_c_interface.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,16 +146,15 @@ void cxios_set_file_output_freq(xios::CFile* file_hdl, cxios_duration output_fre
void cxios_set_file_split_freq(xios::CFile* file_hdl, cxios_duration split_freq_c);
void cxios_set_file_mode(xios::CFile* file_hdl, const char* mode, int mode_size);
void cxios_set_file_par_access(xios::CFile* file_hdl, const char* par_access, int par_access_size);
void cxios_get_file_type(xios::CFile* file_hdl, char* type, int type_size);
void cxios_get_file_output_freq(xios::CFile* file_hdl, cxios_duration* output_freq_c);
void cxios_get_file_mode(xios::CFile* file_hdl, char* mode, int mode_size);
void cxios_get_file_par_access(xios::CFile* file_hdl, char* par_access, int par_access_size);
void cxios_set_file_split_freq_format(
xios::CFile* file_hdl, const char* split_freq_format, int split_freq_format_size);
bool cxios_is_defined_file_name(xios::CFile* file_hdl);
bool cxios_is_defined_file_type(xios::CFile* file_hdl);
bool cxios_is_defined_file_output_freq(xios::CFile* file_hdl);
bool cxios_is_defined_file_split_freq(xios::CFile* file_hdl);
bool cxios_is_defined_file_mode(xios::CFile* file_hdl);
bool cxios_is_defined_file_par_access(xios::CFile* file_hdl);
bool cxios_is_defined_file_split_freq_format(xios::CFile* file_hdl);
void cxios_xml_tree_add_fieldtofile(
xios::CFile* file, xios::CField** field, const char* _id, int _id_len);

Expand Down
74 changes: 57 additions & 17 deletions core/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -217,63 +217,103 @@ if(ENABLE_MPI)
)
target_link_libraries(testXiosField_MPI3 PRIVATE nextsimlib doctest::doctest)

add_executable(testXiosFile_MPI2 "XiosFile_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosFile_MPI2 PRIVATE USE_XIOS)
add_executable(testXiosReadForcing_MPI2 "XiosReadForcing_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosReadForcing_MPI2
PRIVATE
USE_XIOS
TEST_FILES_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"
)
target_include_directories(
testXiosReadForcing_MPI2
PRIVATE
${PHYSICS_INCLUDE_DIRS}
"${MODEL_INCLUDE_DIR}"
"${XIOS_INCLUDE_LIST}"
"${ModulesRoot}/StructureModule"
)
target_link_libraries(testXiosReadForcing_MPI2 PRIVATE nextsimlib doctest::doctest)

add_executable(testXiosReadDiagnostic_MPI2 "XiosReadDiagnostic_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosReadDiagnostic_MPI2
PRIVATE
USE_XIOS
TEST_FILES_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"
)
target_include_directories(
testXiosReadDiagnostic_MPI2
PRIVATE
${PHYSICS_INCLUDE_DIRS}
"${MODEL_INCLUDE_DIR}"
"${XIOS_INCLUDE_LIST}"
"${ModulesRoot}/StructureModule"
)
target_link_libraries(testXiosReadDiagnostic_MPI2 PRIVATE nextsimlib doctest::doctest)

add_executable(testXiosReadRestart_MPI2 "XiosReadRestart_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosReadRestart_MPI2
PRIVATE
USE_XIOS
TEST_FILES_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"
)
target_include_directories(
testXiosFile_MPI2
testXiosReadRestart_MPI2
PRIVATE
${PHYSICS_INCLUDE_DIRS}
"${MODEL_INCLUDE_DIR}"
"${XIOS_INCLUDE_LIST}"
"${ModulesRoot}/StructureModule"
)
target_link_libraries(testXiosFile_MPI2 PRIVATE nextsimlib doctest::doctest)
target_link_libraries(testXiosReadRestart_MPI2 PRIVATE nextsimlib doctest::doctest)

add_executable(testXiosRead_MPI2 "XiosRead_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosRead_MPI2
add_executable(testXiosWriteDiagnostic_MPI2 "XiosWriteDiagnostic_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosWriteDiagnostic_MPI2
PRIVATE
USE_XIOS
TEST_FILES_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"
)
target_include_directories(
testXiosRead_MPI2
testXiosWriteDiagnostic_MPI2
PRIVATE
${PHYSICS_INCLUDE_DIRS}
"${MODEL_INCLUDE_DIR}"
"${XIOS_INCLUDE_LIST}"
"${ModulesRoot}/StructureModule"
)
target_link_libraries(testXiosRead_MPI2 PRIVATE nextsimlib doctest::doctest)
target_link_libraries(testXiosWriteDiagnostic_MPI2 PRIVATE nextsimlib doctest::doctest)

add_executable(testXiosWrite_MPI2 "XiosWrite_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosWrite_MPI2
add_executable(testXiosWriteRestart_MPI2 "XiosWriteRestart_test.cpp" "MainMPI.cpp")
target_compile_definitions(testXiosWriteRestart_MPI2
PRIVATE
USE_XIOS
TEST_FILES_DIR=\"${CMAKE_CURRENT_BINARY_DIR}\"
)
target_include_directories(
testXiosWrite_MPI2
testXiosWriteRestart_MPI2
PRIVATE
${PHYSICS_INCLUDE_DIRS}
"${MODEL_INCLUDE_DIR}"
"${XIOS_INCLUDE_LIST}"
"${ModulesRoot}/StructureModule"
)
target_link_libraries(testXiosWrite_MPI2 PRIVATE nextsimlib doctest::doctest)
target_link_libraries(testXiosWriteRestart_MPI2 PRIVATE nextsimlib doctest::doctest)

set(XIOS_TESTS
testXiosCalendar_MPI1
testXiosAxis_MPI3
testXiosField_MPI3
testXiosFile_MPI2
testXiosRead_MPI2
testXiosWrite_MPI2
testXiosReadForcing_MPI2
testXiosReadDiagnostic_MPI2
testXiosReadRestart_MPI2
testXiosWriteDiagnostic_MPI2
testXiosWriteRestart_MPI2
)

add_mpi_test("${XIOS_TESTS}")

# Ensure XiosWrite_test is run before XiosRead_test
set_tests_properties(testXiosRead_MPI2 PROPERTIES DEPENDS testXiosWrite_MPI2)
# Ensure XiosWrite<Diagnostic/Restart>_test are run before XiosRead<Diagnostic/Restart>_test
set_tests_properties(testXiosReadRestart_MPI2 PROPERTIES DEPENDS testXiosWriteRestart_MPI2)
set_tests_properties(testXiosReadDiagnostic_MPI2
PROPERTIES DEPENDS testXiosWriteDiagnostic_MPI2)
else()
add_executable(testHaloExchangeCB_MPI3
"HaloExchangeCB_test.cpp"
Expand Down
142 changes: 0 additions & 142 deletions core/test/XiosFile_test.cpp

This file was deleted.

Loading
Loading