diff --git a/core/src/ParaGridIO_Xios.cpp b/core/src/ParaGridIO_Xios.cpp index 7f8b63292..3f9b47b74 100644 --- a/core/src/ParaGridIO_Xios.cpp +++ b/core/src/ParaGridIO_Xios.cpp @@ -74,6 +74,10 @@ ModelState ParaGridIO::getModelState(const std::string& filePath) DGSField field(ModelArray::Type::DGSTRESS); field.resize(); state.merge(ModelState { { { fieldId, field } }, {} }); + } else if (type == ModelArray::Type::CG) { + CGField field(ModelArray::Type::CG); + field.resize(); + state.merge(ModelState { { { fieldId, field } }, {} }); } else { throw std::runtime_error("ParaGridIO::getModelState: field type for field " + fieldId + " is not supported."); diff --git a/core/src/Xios.cpp b/core/src/Xios.cpp index f99c8e21a..82e344fe8 100644 --- a/core/src/Xios.cpp +++ b/core/src/Xios.cpp @@ -676,7 +676,7 @@ void Xios::affixModelMetadata() // Set corresponding dimensions size_t localLength; - size_t start = 0; + size_t start; if (dimType == ModelArray::Dimension::X) { localLength = metadata.getLocalExtentX(); start = metadata.getLocalCornerX(); @@ -689,8 +689,15 @@ void Xios::affixModelMetadata() } else if (dimType == ModelArray::Dimension::YVERTEX) { localLength = metadata.getLocalExtentY() + 1; start = metadata.getLocalCornerY(); + } else if (dimType == ModelArray::Dimension::XCG) { + localLength = CGDEGREE * metadata.getLocalExtentX() + 1; + start = CGDEGREE * metadata.getLocalCornerX(); + } else if (dimType == ModelArray::Dimension::YCG) { + localLength = CGDEGREE * metadata.getLocalExtentY() + 1; + start = CGDEGREE * metadata.getLocalCornerY(); } else { localLength = dim.getSize(); + start = 0; } ModelArray::setDimension(dimType, dim.getSize(), localLength, start); } @@ -703,7 +710,7 @@ void Xios::affixModelMetadata() { "ydimxdimdg_comp", ModelArray::Type::DG }, { "yxdgstress_comp", ModelArray::Type::DGSTRESS }, { "ydimxdimdgstress_comp", ModelArray::Type::DGSTRESS }, - { "ycgxcg", ModelArray::Type::CG }, + { "y_cgx_cg", ModelArray::Type::CG }, { "yvertexxvertexncoords", ModelArray::Type::VERTEX }, }; @@ -785,9 +792,15 @@ void Xios::affixModelMetadata() if (dim == ModelArray::Dimension::X) { cxios_set_domain_ni_glo(domain, metadata.getGlobalExtentX()); cxios_set_domain_ni(domain, metadata.getLocalExtentX()); + cxios_set_domain_ibegin(domain, metadata.getLocalCornerX()); } else if (dim == ModelArray::Dimension::XVERTEX) { cxios_set_domain_ni_glo(domain, metadata.getGlobalExtentX() + 1); cxios_set_domain_ni(domain, metadata.getLocalExtentX() + 1); + cxios_set_domain_ibegin(domain, metadata.getLocalCornerX()); + } else if (dim == ModelArray::Dimension::XCG) { + cxios_set_domain_ni_glo(domain, CGDEGREE * metadata.getGlobalExtentX() + 1); + cxios_set_domain_ni(domain, CGDEGREE * metadata.getLocalExtentX() + 1); + cxios_set_domain_ibegin(domain, CGDEGREE * metadata.getLocalCornerX()); } else { throw std::runtime_error( "Xios: Could not set domain extents based on dimension '" @@ -801,7 +814,6 @@ void Xios::affixModelMetadata() throw std::runtime_error( "Xios: Failed to set local x-size for domain '" + domainId + "'"); } - cxios_set_domain_ibegin(domain, metadata.getLocalCornerX()); if (!cxios_is_defined_domain_ibegin(domain)) { throw std::runtime_error( "Xios: Failed to set local starting x-index for domain '" + domainId + "'"); @@ -820,9 +832,15 @@ void Xios::affixModelMetadata() if (dim == ModelArray::Dimension::Y) { cxios_set_domain_nj_glo(domain, metadata.getGlobalExtentY()); cxios_set_domain_nj(domain, metadata.getLocalExtentY()); + cxios_set_domain_jbegin(domain, metadata.getLocalCornerY()); } else if (dim == ModelArray::Dimension::YVERTEX) { cxios_set_domain_nj_glo(domain, metadata.getGlobalExtentY() + 1); cxios_set_domain_nj(domain, metadata.getLocalExtentY() + 1); + cxios_set_domain_jbegin(domain, metadata.getLocalCornerY()); + } else if (dim == ModelArray::Dimension::YCG) { + cxios_set_domain_nj_glo(domain, CGDEGREE * metadata.getGlobalExtentY() + 1); + cxios_set_domain_nj(domain, CGDEGREE * metadata.getLocalExtentY() + 1); + cxios_set_domain_jbegin(domain, CGDEGREE * metadata.getLocalCornerY()); } else { throw std::runtime_error( "Xios: Could not set domain extents based on dimension '" @@ -836,7 +854,6 @@ void Xios::affixModelMetadata() throw std::runtime_error( "Xios: Failed to set local y-size for domain '" + domainId + "'"); } - cxios_set_domain_jbegin(domain, metadata.getLocalCornerY()); if (!cxios_is_defined_domain_jbegin(domain)) { throw std::runtime_error( "Xios: Failed to set local starting y-index for domain '" + domainId + "'"); @@ -1654,14 +1671,14 @@ void Xios::write(const std::string fieldId, ModelArray& modelarray) std::set fieldNames = configGetFieldNames(readAccess); if (fieldNames.find(fieldId) == fieldNames.end()) { throw std::runtime_error( - "Xios::write: field " + fieldId + " has not been configured for writing with XIOS."); + "Xios::write: field '" + fieldId + "' has not been configured for writing with XIOS."); } if (modelarray.nDimensions() != 2) { throw std::invalid_argument("Only ModelArrays of dimension 2 are supported"); } auto dims = modelarray.dimensions(); auto type = modelarray.getType(); - if (type == ModelArray::Type::H) { + if ((type == ModelArray::Type::H) || (type == ModelArray::Type::CG)) { cxios_write_data_k82( fieldId.c_str(), fieldId.length(), modelarray.getData(), dims[0], dims[1], -1); } else if (type == ModelArray::Type::VERTEX) { @@ -1675,7 +1692,7 @@ void Xios::write(const std::string fieldId, ModelArray& modelarray) dims[1], ModelArray::size(ModelArray::Dimension::DGSTRESS), -1); } else { throw std::invalid_argument( - "Only HFields, VertexFields, DGFields, and DGSFields are supported"); + "Only HFields, VertexFields, DGFields, DGSFields, and CGFields are supported"); } } @@ -1691,14 +1708,14 @@ void Xios::read(const std::string fieldId, ModelArray& modelarray) std::set fieldNames = configGetFieldNames(readAccess); if (fieldNames.find(fieldId) == fieldNames.end()) { throw std::runtime_error( - "Xios::read: field " + fieldId + " has not been configured for reading with XIOS."); + "Xios::read: field '" + fieldId + "' has not been configured for reading with XIOS."); } if (modelarray.nDimensions() != 2) { throw std::invalid_argument("Only ModelArrays of dimension 2 are supported"); } auto dims = modelarray.dimensions(); auto type = modelarray.getType(); - if (type == ModelArray::Type::H) { + if ((type == ModelArray::Type::H) || (type == ModelArray::Type::CG)) { cxios_read_data_k82( fieldId.c_str(), fieldId.length(), modelarray.getData(), dims[0], dims[1]); } else if (type == ModelArray::Type::VERTEX) { @@ -1712,7 +1729,7 @@ void Xios::read(const std::string fieldId, ModelArray& modelarray) dims[1], ModelArray::size(ModelArray::Dimension::DGSTRESS)); } else { throw std::invalid_argument( - "Only HFields, VertexFields, DGFields, and DGSFields are supported"); + "Only HFields, VertexFields, DGFields, DGSFields, and CGFields are supported"); } } } diff --git a/core/src/include/Xios.hpp b/core/src/include/Xios.hpp index 471b59cbe..04218813d 100644 --- a/core/src/include/Xios.hpp +++ b/core/src/include/Xios.hpp @@ -196,6 +196,7 @@ class Xios : public Configured { { ModelArray::Type::VERTEX, "VertexDomain" }, { ModelArray::Type::DG, "HDomain" }, { ModelArray::Type::DGSTRESS, "HDomain" }, + { ModelArray::Type::CG, "CGDomain" }, }; xios::CDomainGroup* getDomainGroup(); xios::CDomain* getDomain(std::string domainId); @@ -221,6 +222,7 @@ class Xios : public Configured { { ModelArray::Type::VERTEX, "VertexGrid" }, { ModelArray::Type::DG, "DGGrid" }, { ModelArray::Type::DGSTRESS, "DGSGrid" }, + { ModelArray::Type::CG, "CGGrid" }, }; /* File */ diff --git a/core/test/XiosRead_test.cpp b/core/test/XiosRead_test.cpp index 2e05cf7df..53077fab7 100644 --- a/core/test/XiosRead_test.cpp +++ b/core/test/XiosRead_test.cpp @@ -25,6 +25,7 @@ const std::string forcingFilename = testFilesDir + "/xios_test_forcing.nc"; static const int DG = 3; static const int DGSTRESSCOMP = 8; +static const int CGDEGREE = 2; namespace Nextsim { @@ -48,10 +49,10 @@ MPI_TEST_CASE("TestXiosRead", 2) config << "partition_file = xios_test_partition_metadata_2.nc" << std::endl; config << "[XiosInput]" << std::endl; config << "field_names = " << maskName << "," << coordsName << "," << hiceName << "," - << ticeName << std::endl; + << ticeName << "," << uName << std::endl; config << "[XiosForcing]" << std::endl; config << "filename = " << forcingFilename << std::endl; - config << "field_names = " << uName << std::endl; + config << "field_names = " << hsnowName << std::endl; config << "period = P0-0T01:30:00" << std::endl; std::unique_ptr pcstream(new std::stringstream(config.str())); Configurator::addStream(std::move(pcstream)); @@ -110,26 +111,53 @@ MPI_TEST_CASE("TestXiosRead", 2) metadata.setTime(xiosHandler.getCalendarStart()); REQUIRE(xiosHandler.getCalendarStep() == 0); ModelState restarts = grid.getModelState(restartFilename); + const int rank = xiosHandler.getClientMPIRank(); for (auto& entry : restarts.data) { - for (size_t j = 0; j < ny; ++j) { - for (size_t i = 0; i < nx; ++i) { - if (entry.first == maskName) { + if (entry.first == maskName) { + for (size_t j = 0; j < ny; ++j) { + for (size_t i = 0; i < nx; ++i) { REQUIRE(entry.second(i, j) == doctest::Approx(j >= 1 ? 1.0 : 0.0)); - } else if (entry.first == coordsName) { - REQUIRE(entry.second.components({ i, j })[0] == doctest::Approx(i)); + } + } + } else if (entry.first == coordsName) { + for (size_t j = 0; j < ny + 1; ++j) { + for (size_t i = 0; i < nx + 1; ++i) { + if (rank == 0) { + REQUIRE(entry.second.components({ i, j })[0] == doctest::Approx(i)); + } else { + REQUIRE(entry.second.components({ i, j })[0] == doctest::Approx(i + 2)); + } REQUIRE(entry.second.components({ i, j })[1] == doctest::Approx(j)); - } else if (entry.first == hiceName) { + } + } + } else if (entry.first == hiceName) { + for (size_t j = 0; j < ny; ++j) { + for (size_t i = 0; i < nx; ++i) { for (size_t d = 0; d < DG; ++d) { float expected = 1.0 * (d + DG * (i + nx * j)); REQUIRE(entry.second.components({ i, j })[d] == doctest::Approx(expected)); } - } else if (entry.first == ticeName) { + } + } + } else if (entry.first == ticeName) { + for (size_t j = 0; j < ny; ++j) { + for (size_t i = 0; i < nx; ++i) { for (size_t d = 0; d < DGSTRESSCOMP; ++d) { REQUIRE(entry.second.components({ i, j })[d] == doctest::Approx(2.0 * (d + DGSTRESSCOMP * (i + nx * j)))); } } } + } else if (entry.first == uName) { + for (size_t j = 0; j < CGDEGREE * ny + 1; ++j) { + for (size_t i = 0; i < CGDEGREE * nx + 1; ++i) { + if (rank == 0) { + REQUIRE(entry.second(i, j) == doctest::Approx((i + 1) * (j + 1))); + } else { + REQUIRE(entry.second(i, j) == doctest::Approx((i + 5) * (j + 1))); + } + } + } } } @@ -143,9 +171,10 @@ MPI_TEST_CASE("TestXiosRead", 2) TimePoint time = xiosHandler.getCurrentDate(); ModelState forcings = pio->readForcingTimeStatic(forcingFieldNames, time, forcingFilename); for (auto& entry : forcings.data) { + REQUIRE(entry.first == hsnowName); for (size_t j = 0; j < ny; ++j) { for (size_t i = 0; i < nx; ++i) { - REQUIRE(entry.second(i, j) == doctest::Approx(ts)); + REQUIRE(entry.second(i, j) == doctest::Approx(0.1 * ts)); } } } diff --git a/core/test/XiosWrite_test.cpp b/core/test/XiosWrite_test.cpp index 254c2ff0c..c7ab491eb 100644 --- a/core/test/XiosWrite_test.cpp +++ b/core/test/XiosWrite_test.cpp @@ -25,6 +25,7 @@ const std::string diagnosticFilename = testFilesDir + "/xios_test_diagnostic.nc" static const int DG = 3; static const int DGSTRESSCOMP = 8; +static const int CGDEGREE = 2; namespace Nextsim { @@ -48,10 +49,11 @@ MPI_TEST_CASE("TestXiosWrite", 2) config << "restart_period = P0-0T01:30:00" << std::endl; config << "[XiosOutput]" << std::endl; config << "field_names = " << maskName << "," << coordsName << "," << hiceName << "," - << ticeName << std::endl; + << ticeName << "," << uName << std::endl; + config << "period = P0-0T01:30:00" << std::endl; config << "[XiosDiagnostic]" << std::endl; config << "filename = " << diagnosticFilename << std::endl; - config << "field_names = " << uName << std::endl; + config << "field_names = " << hsnowName << std::endl; config << "period = P0-0T01:30:00" << std::endl; std::unique_ptr pcstream(new std::stringstream(config.str())); Configurator::addStream(std::move(pcstream)); @@ -81,10 +83,22 @@ MPI_TEST_CASE("TestXiosWrite", 2) const size_t ny_glo = 2; const size_t nx = 2; const size_t ny = 2; - ModelArray::setDimension(ModelArray::Dimension::X, nx_glo, nx, 0); - ModelArray::setDimension(ModelArray::Dimension::Y, ny_glo, ny, 0); - ModelArray::setDimension(ModelArray::Dimension::XVERTEX, nx_glo + 1, nx + 1, 0); - ModelArray::setDimension(ModelArray::Dimension::YVERTEX, ny_glo + 1, ny + 1, 0); + size_t nx_start; + const size_t ny_start = 0; + const int rank = xiosHandler.getClientMPIRank(); + if (rank == 0) { + nx_start = 0; + } else { + nx_start = nx_glo - nx; + } + ModelArray::setDimension(ModelArray::Dimension::X, nx_glo, nx, nx_start); + ModelArray::setDimension(ModelArray::Dimension::XVERTEX, nx_glo + 1, nx + 1, nx_start); + ModelArray::setDimension( + ModelArray::Dimension::XCG, CGDEGREE * nx_glo + 1, CGDEGREE * nx + 1, CGDEGREE * nx_start); + ModelArray::setDimension(ModelArray::Dimension::Y, ny_glo, ny, ny_start); + ModelArray::setDimension(ModelArray::Dimension::YVERTEX, ny_glo + 1, ny + 1, ny_start); + ModelArray::setDimension( + ModelArray::Dimension::YCG, CGDEGREE * ny_glo + 1, CGDEGREE * ny + 1, ny_start); ModelArray::setNComponents(ModelArray::Type::DG, DG); ModelArray::setNComponents(ModelArray::Type::DGSTRESS, DGSTRESSCOMP); ModelArray::setNComponents(ModelArray::Type::VERTEX, ModelArray::nCoords); @@ -101,7 +115,8 @@ MPI_TEST_CASE("TestXiosWrite", 2) xiosHandler.setFieldType(coordsName, ModelArray::Type::VERTEX); xiosHandler.setFieldType(hiceName, ModelArray::Type::DG); xiosHandler.setFieldType(ticeName, ModelArray::Type::DGSTRESS); - xiosHandler.setFieldType(uName, ModelArray::Type::H); + xiosHandler.setFieldType(uName, ModelArray::Type::CG); + xiosHandler.setFieldType(hsnowName, ModelArray::Type::H); // Set file split frequency for restarts (but not diagnostics) // NOTE: Files are created when the XIOS handler is constructed @@ -122,8 +137,13 @@ MPI_TEST_CASE("TestXiosWrite", 2) coordinates.resize(); for (size_t j = 0; j < ny + 1; ++j) { for (size_t i = 0; i < nx + 1; ++i) { - coordinates.components({ i, j })[0] = (double)i; - coordinates.components({ i, j })[1] = (double)j; + if (rank == 0) { + coordinates.components({ i, j })[0] = (double)i; + coordinates.components({ i, j })[1] = (double)j; + } else { + coordinates.components({ i, j })[0] = (double)(i + 2); + coordinates.components({ i, j })[1] = (double)j; + } } } DGField hice(ModelArray::Type::DG); @@ -144,8 +164,19 @@ MPI_TEST_CASE("TestXiosWrite", 2) } } } - HField u(ModelArray::Type::H); - u.resize(); + CGField uice(ModelArray::Type::CG); + uice.resize(); + for (size_t j = 0; j < CGDEGREE * ny + 1; ++j) { + for (size_t i = 0; i < CGDEGREE * nx + 1; ++i) { + if (rank == 0) { + uice(i, j) = (double)((i + 1) * (j + 1)); + } else { + uice(i, j) = (double)((i + 5) * (j + 1)); + } + } + } + HField hsnow(ModelArray::Type::H); + hsnow.resize(); // Check files with the expected names don't exist yet REQUIRE_FALSE(std::filesystem::exists("xios_test_output*.nc")); @@ -165,7 +196,7 @@ MPI_TEST_CASE("TestXiosWrite", 2) // Update diagnostics for (size_t j = 0; j < ny; ++j) { for (size_t i = 0; i < nx; ++i) { - u(i, j) = ts; + hsnow(i, j) = 0.1 * ts; } } @@ -175,10 +206,11 @@ MPI_TEST_CASE("TestXiosWrite", 2) { coordsName, coordinates }, { hiceName, hice }, { ticeName, tice }, + { uName, uice }, }, {} }; ModelState diagnostics = { { - { uName, u }, + { hsnowName, hsnow }, }, {} }; @@ -191,7 +223,7 @@ MPI_TEST_CASE("TestXiosWrite", 2) REQUIRE(std::filesystem::exists("xios_test_output_20230317171100-20230317201059.nc")); REQUIRE(std::filesystem::exists("xios_test_output_20230317201100-20230317231059.nc")); REQUIRE(std::filesystem::exists("xios_test_diagnostic.nc")); - if (xiosHandler.getClientMPIRank() == 0) { + if (rank == 0) { std::filesystem::remove("xios_test_output_20230317171100-20230317201059.nc"); std::filesystem::remove("xios_test_output_20230317201100-20230317231059.nc"); std::filesystem::remove("xios_test_diagnostic.nc"); diff --git a/core/test/xios_test_forcing.cdl b/core/test/xios_test_forcing.cdl index ff403bc21..3a0c048d1 100644 --- a/core/test/xios_test_forcing.cdl +++ b/core/test/xios_test_forcing.cdl @@ -5,8 +5,8 @@ dimensions: y = 2 ; xvertex = 5 ; yvertex = 3 ; - x_cg = 2 ; - y_cg = 2 ; + x_cg = 9 ; + y_cg = 5 ; dg_comp = 3 ; dgstress_comp = 8 ; ncoords = 2 ; @@ -39,12 +39,12 @@ variables: time_counter:time_origin = "2020-01-23 00:08:15" ; time_counter:bounds = "time_counter_bounds" ; double time_counter_bounds(time_counter, axis_nbounds) ; - float u(time_counter, y, x) ; - u:online_operation = "instant" ; - u:interval_operation = "5400 s" ; - u:interval_write = "5400 s" ; - u:cell_methods = "time: point" ; - u:coordinates = "time_instant" ; + float hsnow(time_counter, y, x) ; + hsnow:online_operation = "instant" ; + hsnow:interval_operation = "5400 s" ; + hsnow:interval_write = "5400 s" ; + hsnow:cell_methods = "time: point" ; + hsnow:coordinates = "time_instant" ; // global attributes: :structure_name = "parametric_rectangular" ; @@ -77,15 +77,15 @@ data: 99351165, 99351165, 99356565, 99356565 ; - u = - 0, 0, 0, 0, - 0, 0, 0, 0, - 1, 1, 1, 1, - 1, 1, 1, 1, - 2, 2, 2, 2, - 2, 2, 2, 2, - 3, 3, 3, 3, - 3, 3, 3, 3, - 4, 4, 4, 4, - 4, 4, 4, 4 ; + hsnow = + 0.0, 0.0, 0.0, 0.0, + 0.0, 0.0, 0.0, 0.0, + 0.1, 0.1, 0.1, 0.1, + 0.1, 0.1, 0.1, 0.1, + 0.2, 0.2, 0.2, 0.2, + 0.2, 0.2, 0.2, 0.2, + 0.3, 0.3, 0.3, 0.3, + 0.3, 0.3, 0.3, 0.3, + 0.4, 0.4, 0.4, 0.4, + 0.4, 0.4, 0.4, 0.4 ; } diff --git a/core/test/xios_test_input.cdl b/core/test/xios_test_input.cdl index a5cd6d585..f46c7f3ce 100644 --- a/core/test/xios_test_input.cdl +++ b/core/test/xios_test_input.cdl @@ -5,8 +5,8 @@ dimensions: y = 2 ; xvertex = 5 ; yvertex = 3 ; - x_cg = 2 ; - y_cg = 2 ; + x_cg = 9 ; + y_cg = 5 ; dg_comp = 3 ; dgstress_comp = 8 ; ncoords = 2 ; @@ -31,6 +31,16 @@ variables: yvertex:standard_name = "vertex latitude" ; yvertex:long_name = "Vertex latitude" ; yvertex:units = "degrees_north" ; + float x_cg(x_cg) ; + x_cg:axis = "XCG" ; + x_cg:standard_name = "CG longitude" ; + x_cg:long_name = "Continuous Galerkin longitude" ; + x_cg:units = "degrees_east" ; + float y_cg(y_cg) ; + y_cg:axis = "YCG" ; + y_cg:standard_name = "CG latitude" ; + y_cg:long_name = "Continuous Galerkin latitude" ; + y_cg:units = "degrees_north" ; float DGAxis(dg_comp) ; DGAxis:axis = "DG" ; DGAxis:standard_name = "DG DoFs" ; @@ -58,6 +68,9 @@ variables: float tice(y, x, dgstress_comp) ; tice:online_operation = "once" ; tice:coordinates = "lat lon DGSAxis" ; + float u(y_cg, x_cg) ; + u:online_operation = "once" ; + u:coordinates = "lat lon" ; // global attributes: :structure_name = "parametric_rectangular" ; @@ -77,21 +90,21 @@ data: xvertex = -1, -0.5, 0, 0.5, 1 ; coords = - 0, 0, - 1, 0, 0, 0, 1, 0, 2, 0, - 0, 1, - 1, 1, + 3, 0, + 4, 0, 0, 1, 1, 1, 2, 1, + 3, 1, + 4, 1, 0, 2, 1, 2, - 0, 2, - 1, 2, - 2, 2 ; + 2, 2, + 3, 2, + 4, 2 ; hice = 0, 1, 2, @@ -116,4 +129,11 @@ data: 48, 50, 52, 54, 56, 58, 60, 62, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62 ; + + u = + 1, 2, 3, 4, 5, 6, 7, 8, 9, + 2, 4, 6, 8, 10, 12, 14, 16, 18, + 3, 6, 9, 12, 15, 18, 21, 24, 27, + 4, 8, 12, 16, 20, 24, 28, 32, 36, + 5, 10, 15, 20, 25, 30, 35, 40, 45; } diff --git a/docs/xios.rst b/docs/xios.rst index 3aa7084e4..26fd9720b 100644 --- a/docs/xios.rst +++ b/docs/xios.rst @@ -79,9 +79,10 @@ building with MPI, you will need to pass the MPI communicator to this member function when calling it. The XIOS I/O implementation supports fields of ``HField``, ``VertexField``, -``DGField``, and ``DGSField``. When reading from file, the field type will -be deduced from its dimension. When writing to file, the field type should be -set using the ``setFieldType`` member function of the ``Xios`` handler class. +``DGField``, ``DGSField``, and ``CGField``. When reading from file, the field +type will be deduced from its dimension. When writing to file, the field type +should be set using the ``setFieldType`` member function of the ``Xios`` handler +class. Developer notes ^^^^^^^^^^^^^^^