diff --git a/testing/adios2/engine/adios1/CMakeLists.txt b/testing/adios2/engine/adios1/CMakeLists.txt index f5e94b86bebb2b11bb3e0119eab7d6abd5397f95..e71473103c8005ed6fff2b4c2c4963db67662eec 100644 --- a/testing/adios2/engine/adios1/CMakeLists.txt +++ b/testing/adios2/engine/adios1/CMakeLists.txt @@ -3,7 +3,12 @@ # accompanying file Copyright.txt for details. #------------------------------------------------------------------------------# -add_executable(TestADIOS1WriteRead TestADIOS1WriteRead.cpp) -target_link_libraries(TestADIOS1WriteRead adios2 gtest) +# MPI versions of the test are not properly implemented at the moment +if(NOT ADIOS_USE_MPI) + find_package(ADIOS1 COMPONENTS sequential REQUIRED) -add_test(NAME adios2::engine::adios1::write_read COMMAND TestADIOS1WriteRead) + add_executable(TestADIOS1WriteRead TestADIOS1WriteRead.cpp) + target_link_libraries(TestADIOS1WriteRead adios2 gtest adios1::adios) + + add_test(NAME adios2::engine::adios1::write_read COMMAND TestADIOS1WriteRead) +endif() diff --git a/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp b/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp index 97479324516168c9cf17f57fda0b00f94ce7a382..2f803267d5d50752c3b6bc2d21b4adaf54dfade6 100644 --- a/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp +++ b/testing/adios2/engine/adios1/TestADIOS1WriteRead.cpp @@ -3,11 +3,13 @@ * accompanying file Copyright.txt for details. */ #include <cstdint> +#include <cstring> #include <iostream> #include <stdexcept> #include <adios2.h> +#include <adios_read.h> #include <gtest/gtest.h> @@ -26,6 +28,9 @@ public: //****************************************************************************** TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read1D8) { + std::string fname = "ADIOS2ADIOS1WriteADIOS1Read1D8.bp"; + + // Write test data using ADIOS2 { adios::ADIOS adios(adios::Verbose::WARN, true); @@ -52,8 +57,7 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read1D8) method.SetEngine("ADIOS1Writer"); method.AddTransport("File"); - auto engine = - adios.Open("ADIOS2ADIOS1WriteADIOS1Read1D8.bp", "w", method); + auto engine = adios.Open(fname, "w", method); ASSERT_NE(engine, nullptr); for (size_t step = 0; step < 3; ++step) @@ -71,16 +75,16 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read1D8) auto &var_r64 = adios.GetVariable<double>("r64"); // Write each one - engine->Write(var_i8, m_TestData.I8.cbegin() + step); - engine->Write(var_i16, m_TestData.I16.cbegin() + step); - engine->Write(var_i32, m_TestData.I32.cbegin() + step); - engine->Write(var_i64, m_TestData.I64.cbegin() + step); - engine->Write(var_u8, m_TestData.U8.cbegin() + step); - engine->Write(var_u16, m_TestData.U16.cbegin() + step); - engine->Write(var_u32, m_TestData.U32.cbegin() + step); - engine->Write(var_u64, m_TestData.U64.cbegin() + step); - engine->Write(var_r32, m_TestData.R32.cbegin() + step); - engine->Write(var_r64, m_TestData.R64.cbegin() + step); + engine->Write(var_i8, m_TestData.I8.data() + step); + engine->Write(var_i16, m_TestData.I16.data() + step); + engine->Write(var_i32, m_TestData.I32.data() + step); + engine->Write(var_i64, m_TestData.I64.data() + step); + engine->Write(var_u8, m_TestData.U8.data() + step); + engine->Write(var_u16, m_TestData.U16.data() + step); + engine->Write(var_u32, m_TestData.U32.data() + step); + engine->Write(var_u64, m_TestData.U64.data() + step); + engine->Write(var_r32, m_TestData.R32.data() + step); + engine->Write(var_r64, m_TestData.R64.data() + step); // Advance to the next time step engine->Advance(); @@ -89,6 +93,113 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read1D8) // Close the file engine->Close(); } + + // Read test data using ADIOS1 +#ifdef ADIOS2_HAVE_MPI + // Read everything from rank 0 + int rank; + MPI_Comm_rank(); + if(rank == 0) +#endif + { + adios_read_init_method(ADIOS_READ_METHOD_BP, MPI_COMM_WORLD, + "verbose=3"); + + // Open the file for reading + ADIOS_FILE *f = adios_read_open_file( + fname.c_str(), ADIOS_READ_METHOD_BP, MPI_COMM_WORLD); + ASSERT_NE(f, nullptr); + + // Check the variables exist + ADIOS_VARINFO *var_i8 = adios_inq_var(f, "i8"); + ASSERT_NE(var_i8, nullptr); + ADIOS_VARINFO *var_i16 = adios_inq_var(f, "i16"); + ASSERT_NE(var_i16, nullptr); + ADIOS_VARINFO *var_i32 = adios_inq_var(f, "i32"); + ASSERT_NE(var_i32, nullptr); + ADIOS_VARINFO *var_i64 = adios_inq_var(f, "i64"); + ASSERT_NE(var_i64, nullptr); + ADIOS_VARINFO *var_u8 = adios_inq_var(f, "u8"); + ASSERT_NE(var_u8, nullptr); + ADIOS_VARINFO *var_u16 = adios_inq_var(f, "u16"); + ASSERT_NE(var_u16, nullptr); + ADIOS_VARINFO *var_u32 = adios_inq_var(f, "u32"); + ASSERT_NE(var_u32, nullptr); + ADIOS_VARINFO *var_u64 = adios_inq_var(f, "u64"); + ASSERT_NE(var_u64, nullptr); + ADIOS_VARINFO *var_r32 = adios_inq_var(f, "r32"); + ASSERT_NE(var_r32, nullptr); + ADIOS_VARINFO *var_r64 = adios_inq_var(f, "r64"); + ASSERT_NE(var_r64, nullptr); + + std::array<char, 8> I8; + std::array<int16_t, 8> I16; + std::array<int32_t, 8> I32; + std::array<int64_t, 8> I64; + std::array<unsigned char, 8> U8; + std::array<uint16_t, 8> U16; + std::array<uint32_t, 8> U32; + std::array<uint64_t, 8> U64; + std::array<float, 8> R32; + std::array<double, 8> R64; + + uint64_t start[1] = {0}; + uint64_t count[1] = {8}; + ADIOS_SELECTION *sel = adios_selection_boundingbox(1, start, count); + + // Read stuff + for (size_t t = 0; t < 3; ++t) + { + // Read the current step + adios_schedule_read_byid(f, sel, var_i8->varid, t, 1, I8.data()); + adios_schedule_read_byid(f, sel, var_i16->varid, t, 1, I16.data()); + adios_schedule_read_byid(f, sel, var_i32->varid, t, 1, I32.data()); + adios_schedule_read_byid(f, sel, var_i64->varid, t, 1, I64.data()); + adios_schedule_read_byid(f, sel, var_u8->varid, t, 1, U8.data()); + adios_schedule_read_byid(f, sel, var_u16->varid, t, 1, U16.data()); + adios_schedule_read_byid(f, sel, var_u32->varid, t, 1, U32.data()); + adios_schedule_read_byid(f, sel, var_u64->varid, t, 1, U64.data()); + adios_schedule_read_byid(f, sel, var_r32->varid, t, 1, R32.data()); + adios_schedule_read_byid(f, sel, var_r64->varid, t, 1, R64.data()); + adios_perform_reads(f, 1); + + // Check if it's correct + for (size_t i = 0; i < 8; ++i) + { + std::stringstream ss; + ss << "t=" << t << " i=" << i; + std::string msg = ss.str(); + + EXPECT_EQ(I8[i], m_TestData.I8[i + t]) << msg; + EXPECT_EQ(I16[i], m_TestData.I16[i + t]) << msg; + EXPECT_EQ(I32[i], m_TestData.I32[i + t]) << msg; + EXPECT_EQ(I64[i], m_TestData.I64[i + t]) << msg; + EXPECT_EQ(U8[i], m_TestData.U8[i + t]) << msg; + EXPECT_EQ(U16[i], m_TestData.U16[i + t]) << msg; + EXPECT_EQ(U32[i], m_TestData.U32[i + t]) << msg; + EXPECT_EQ(U64[i], m_TestData.U64[i + t]) << msg; + EXPECT_EQ(R32[i], m_TestData.R32[i + t]) << msg; + EXPECT_EQ(R64[i], m_TestData.R64[i + t]) << msg; + } + } + + adios_selection_delete(sel); + + // Cleanup variable structures + adios_free_varinfo(var_i8); + adios_free_varinfo(var_i16); + adios_free_varinfo(var_i32); + adios_free_varinfo(var_i64); + adios_free_varinfo(var_u8); + adios_free_varinfo(var_u16); + adios_free_varinfo(var_u32); + adios_free_varinfo(var_u64); + adios_free_varinfo(var_r32); + adios_free_varinfo(var_r64); + + // Cleanup file + adios_read_close(f); + } } //****************************************************************************** @@ -96,6 +207,9 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read1D8) //****************************************************************************** TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D2x4) { + std::string fname = "ADIOS2ADIOS1WriteADIOS1Read2D2x4Test.bp"; + + // Write test data using ADIOS2 { adios::ADIOS adios(adios::Verbose::WARN, true); @@ -126,8 +240,7 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D2x4) method.SetEngine("ADIOS1Writer"); method.AddTransport("File"); - auto engine = - adios.Open("ADIOS2ADIOS1WriteADIOS1Read2D2x4Test.bp", "w", method); + auto engine = adios.Open(fname, "w", method); ASSERT_NE(engine, nullptr); for (size_t step = 0; step < 3; ++step) @@ -145,16 +258,16 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D2x4) auto &var_r64 = adios.GetVariable<double>("r64"); // Write each one - engine->Write(var_i8, m_TestData.I8.cbegin() + step); - engine->Write(var_i16, m_TestData.I16.cbegin() + step); - engine->Write(var_i32, m_TestData.I32.cbegin() + step); - engine->Write(var_i64, m_TestData.I64.cbegin() + step); - engine->Write(var_u8, m_TestData.U8.cbegin() + step); - engine->Write(var_u16, m_TestData.U16.cbegin() + step); - engine->Write(var_u32, m_TestData.U32.cbegin() + step); - engine->Write(var_u64, m_TestData.U64.cbegin() + step); - engine->Write(var_r32, m_TestData.R32.cbegin() + step); - engine->Write(var_r64, m_TestData.R64.cbegin() + step); + engine->Write(var_i8, m_TestData.I8.data() + step); + engine->Write(var_i16, m_TestData.I16.data() + step); + engine->Write(var_i32, m_TestData.I32.data() + step); + engine->Write(var_i64, m_TestData.I64.data() + step); + engine->Write(var_u8, m_TestData.U8.data() + step); + engine->Write(var_u16, m_TestData.U16.data() + step); + engine->Write(var_u32, m_TestData.U32.data() + step); + engine->Write(var_u64, m_TestData.U64.data() + step); + engine->Write(var_r32, m_TestData.R32.data() + step); + engine->Write(var_r64, m_TestData.R64.data() + step); // Advance to the next time step engine->Advance(); @@ -163,6 +276,113 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D2x4) // Close the file engine->Close(); } + + // Read test data using ADIOS1 +#ifdef ADIOS2_HAVE_MPI + // Read everything from rank 0 + int rank; + MPI_Comm_rank(); + if(rank == 0) +#endif + { + adios_read_init_method(ADIOS_READ_METHOD_BP, MPI_COMM_WORLD, + "verbose=3"); + + // Open the file for reading + ADIOS_FILE *f = adios_read_open_file( + fname.c_str(), ADIOS_READ_METHOD_BP, MPI_COMM_WORLD); + ASSERT_NE(f, nullptr); + + // Check the variables exist + ADIOS_VARINFO *var_i8 = adios_inq_var(f, "i8"); + ASSERT_NE(var_i8, nullptr); + ADIOS_VARINFO *var_i16 = adios_inq_var(f, "i16"); + ASSERT_NE(var_i16, nullptr); + ADIOS_VARINFO *var_i32 = adios_inq_var(f, "i32"); + ASSERT_NE(var_i32, nullptr); + ADIOS_VARINFO *var_i64 = adios_inq_var(f, "i64"); + ASSERT_NE(var_i64, nullptr); + ADIOS_VARINFO *var_u8 = adios_inq_var(f, "u8"); + ASSERT_NE(var_u8, nullptr); + ADIOS_VARINFO *var_u16 = adios_inq_var(f, "u16"); + ASSERT_NE(var_u16, nullptr); + ADIOS_VARINFO *var_u32 = adios_inq_var(f, "u32"); + ASSERT_NE(var_u32, nullptr); + ADIOS_VARINFO *var_u64 = adios_inq_var(f, "u64"); + ASSERT_NE(var_u64, nullptr); + ADIOS_VARINFO *var_r32 = adios_inq_var(f, "r32"); + ASSERT_NE(var_r32, nullptr); + ADIOS_VARINFO *var_r64 = adios_inq_var(f, "r64"); + ASSERT_NE(var_r64, nullptr); + + std::array<char, 8> I8; + std::array<int16_t, 8> I16; + std::array<int32_t, 8> I32; + std::array<int64_t, 8> I64; + std::array<unsigned char, 8> U8; + std::array<uint16_t, 8> U16; + std::array<uint32_t, 8> U32; + std::array<uint64_t, 8> U64; + std::array<float, 8> R32; + std::array<double, 8> R64; + + uint64_t start[1] = {0}; + uint64_t count[1] = {8}; + ADIOS_SELECTION *sel = adios_selection_boundingbox(1, start, count); + + // Read stuff + for (size_t t = 0; t < 3; ++t) + { + // Read the current step + adios_schedule_read_byid(f, sel, var_i8->varid, t, 1, I8.data()); + adios_schedule_read_byid(f, sel, var_i16->varid, t, 1, I16.data()); + adios_schedule_read_byid(f, sel, var_i32->varid, t, 1, I32.data()); + adios_schedule_read_byid(f, sel, var_i64->varid, t, 1, I64.data()); + adios_schedule_read_byid(f, sel, var_u8->varid, t, 1, U8.data()); + adios_schedule_read_byid(f, sel, var_u16->varid, t, 1, U16.data()); + adios_schedule_read_byid(f, sel, var_u32->varid, t, 1, U32.data()); + adios_schedule_read_byid(f, sel, var_u64->varid, t, 1, U64.data()); + adios_schedule_read_byid(f, sel, var_r32->varid, t, 1, R32.data()); + adios_schedule_read_byid(f, sel, var_r64->varid, t, 1, R64.data()); + adios_perform_reads(f, 1); + + // Check if it's correct + for (size_t i = 0; i < 8; ++i) + { + std::stringstream ss; + ss << "t=" << t << " i=" << i; + std::string msg = ss.str(); + + EXPECT_EQ(I8[i], m_TestData.I8[i + t]) << msg; + EXPECT_EQ(I16[i], m_TestData.I16[i + t]) << msg; + EXPECT_EQ(I32[i], m_TestData.I32[i + t]) << msg; + EXPECT_EQ(I64[i], m_TestData.I64[i + t]) << msg; + EXPECT_EQ(U8[i], m_TestData.U8[i + t]) << msg; + EXPECT_EQ(U16[i], m_TestData.U16[i + t]) << msg; + EXPECT_EQ(U32[i], m_TestData.U32[i + t]) << msg; + EXPECT_EQ(U64[i], m_TestData.U64[i + t]) << msg; + EXPECT_EQ(R32[i], m_TestData.R32[i + t]) << msg; + EXPECT_EQ(R64[i], m_TestData.R64[i + t]) << msg; + } + } + + adios_selection_delete(sel); + + // Cleanup variable structures + adios_free_varinfo(var_i8); + adios_free_varinfo(var_i16); + adios_free_varinfo(var_i32); + adios_free_varinfo(var_i64); + adios_free_varinfo(var_u8); + adios_free_varinfo(var_u16); + adios_free_varinfo(var_u32); + adios_free_varinfo(var_u64); + adios_free_varinfo(var_r32); + adios_free_varinfo(var_r64); + + // Cleanup file + adios_read_close(f); + } } //****************************************************************************** @@ -170,6 +390,9 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D2x4) //****************************************************************************** TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D4x2) { + std::string fname = "ADIOS2ADIOS1WriteADIOS1Read2D4x2Test.bp"; + + // Write test data using ADIOS2 { adios::ADIOS adios(adios::Verbose::WARN, true); @@ -200,8 +423,7 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D4x2) method.SetEngine("ADIOS1Writer"); method.AddTransport("File"); - auto engine = - adios.Open("ADIOS2ADIOS1WriteADIOS1Read2D4x2Test.bp", "w", method); + auto engine = adios.Open(fname, "w", method); ASSERT_NE(engine, nullptr); for (size_t step = 0; step < 3; ++step) @@ -219,16 +441,16 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D4x2) auto &var_r64 = adios.GetVariable<double>("r64"); // Write each one - engine->Write(var_i8, m_TestData.I8.cbegin() + step); - engine->Write(var_i16, m_TestData.I16.cbegin() + step); - engine->Write(var_i32, m_TestData.I32.cbegin() + step); - engine->Write(var_i64, m_TestData.I64.cbegin() + step); - engine->Write(var_u8, m_TestData.U8.cbegin() + step); - engine->Write(var_u16, m_TestData.U16.cbegin() + step); - engine->Write(var_u32, m_TestData.U32.cbegin() + step); - engine->Write(var_u64, m_TestData.U64.cbegin() + step); - engine->Write(var_r32, m_TestData.R32.cbegin() + step); - engine->Write(var_r64, m_TestData.R64.cbegin() + step); + engine->Write(var_i8, m_TestData.I8.data() + step); + engine->Write(var_i16, m_TestData.I16.data() + step); + engine->Write(var_i32, m_TestData.I32.data() + step); + engine->Write(var_i64, m_TestData.I64.data() + step); + engine->Write(var_u8, m_TestData.U8.data() + step); + engine->Write(var_u16, m_TestData.U16.data() + step); + engine->Write(var_u32, m_TestData.U32.data() + step); + engine->Write(var_u64, m_TestData.U64.data() + step); + engine->Write(var_r32, m_TestData.R32.data() + step); + engine->Write(var_r64, m_TestData.R64.data() + step); // Advance to the next time step engine->Advance(); @@ -237,6 +459,113 @@ TEST_F(ADIOS1WriteReadTest, ADIOS2ADIOS1WriteADIOS1Read2D4x2) // Close the file engine->Close(); } + + // Read test data using ADIOS1 +#ifdef ADIOS2_HAVE_MPI + // Read everything from rank 0 + int rank; + MPI_Comm_rank(); + if(rank == 0) +#endif + { + adios_read_init_method(ADIOS_READ_METHOD_BP, MPI_COMM_WORLD, + "verbose=3"); + + // Open the file for reading + ADIOS_FILE *f = adios_read_open_file( + fname.c_str(), ADIOS_READ_METHOD_BP, MPI_COMM_WORLD); + ASSERT_NE(f, nullptr); + + // Check the variables exist + ADIOS_VARINFO *var_i8 = adios_inq_var(f, "i8"); + ASSERT_NE(var_i8, nullptr); + ADIOS_VARINFO *var_i16 = adios_inq_var(f, "i16"); + ASSERT_NE(var_i16, nullptr); + ADIOS_VARINFO *var_i32 = adios_inq_var(f, "i32"); + ASSERT_NE(var_i32, nullptr); + ADIOS_VARINFO *var_i64 = adios_inq_var(f, "i64"); + ASSERT_NE(var_i64, nullptr); + ADIOS_VARINFO *var_u8 = adios_inq_var(f, "u8"); + ASSERT_NE(var_u8, nullptr); + ADIOS_VARINFO *var_u16 = adios_inq_var(f, "u16"); + ASSERT_NE(var_u16, nullptr); + ADIOS_VARINFO *var_u32 = adios_inq_var(f, "u32"); + ASSERT_NE(var_u32, nullptr); + ADIOS_VARINFO *var_u64 = adios_inq_var(f, "u64"); + ASSERT_NE(var_u64, nullptr); + ADIOS_VARINFO *var_r32 = adios_inq_var(f, "r32"); + ASSERT_NE(var_r32, nullptr); + ADIOS_VARINFO *var_r64 = adios_inq_var(f, "r64"); + ASSERT_NE(var_r64, nullptr); + + std::array<char, 8> I8; + std::array<int16_t, 8> I16; + std::array<int32_t, 8> I32; + std::array<int64_t, 8> I64; + std::array<unsigned char, 8> U8; + std::array<uint16_t, 8> U16; + std::array<uint32_t, 8> U32; + std::array<uint64_t, 8> U64; + std::array<float, 8> R32; + std::array<double, 8> R64; + + uint64_t start[1] = {0}; + uint64_t count[1] = {8}; + ADIOS_SELECTION *sel = adios_selection_boundingbox(1, start, count); + + // Read stuff + for (size_t t = 0; t < 3; ++t) + { + // Read the current step + adios_schedule_read_byid(f, sel, var_i8->varid, t, 1, I8.data()); + adios_schedule_read_byid(f, sel, var_i16->varid, t, 1, I16.data()); + adios_schedule_read_byid(f, sel, var_i32->varid, t, 1, I32.data()); + adios_schedule_read_byid(f, sel, var_i64->varid, t, 1, I64.data()); + adios_schedule_read_byid(f, sel, var_u8->varid, t, 1, U8.data()); + adios_schedule_read_byid(f, sel, var_u16->varid, t, 1, U16.data()); + adios_schedule_read_byid(f, sel, var_u32->varid, t, 1, U32.data()); + adios_schedule_read_byid(f, sel, var_u64->varid, t, 1, U64.data()); + adios_schedule_read_byid(f, sel, var_r32->varid, t, 1, R32.data()); + adios_schedule_read_byid(f, sel, var_r64->varid, t, 1, R64.data()); + adios_perform_reads(f, 1); + + // Check if it's correct + for (size_t i = 0; i < 8; ++i) + { + std::stringstream ss; + ss << "t=" << t << " i=" << i; + std::string msg = ss.str(); + + EXPECT_EQ(I8[i], m_TestData.I8[i + t]) << msg; + EXPECT_EQ(I16[i], m_TestData.I16[i + t]) << msg; + EXPECT_EQ(I32[i], m_TestData.I32[i + t]) << msg; + EXPECT_EQ(I64[i], m_TestData.I64[i + t]) << msg; + EXPECT_EQ(U8[i], m_TestData.U8[i + t]) << msg; + EXPECT_EQ(U16[i], m_TestData.U16[i + t]) << msg; + EXPECT_EQ(U32[i], m_TestData.U32[i + t]) << msg; + EXPECT_EQ(U64[i], m_TestData.U64[i + t]) << msg; + EXPECT_EQ(R32[i], m_TestData.R32[i + t]) << msg; + EXPECT_EQ(R64[i], m_TestData.R64[i + t]) << msg; + } + } + + adios_selection_delete(sel); + + // Cleanup variable structures + adios_free_varinfo(var_i8); + adios_free_varinfo(var_i16); + adios_free_varinfo(var_i32); + adios_free_varinfo(var_i64); + adios_free_varinfo(var_u8); + adios_free_varinfo(var_u16); + adios_free_varinfo(var_u32); + adios_free_varinfo(var_u64); + adios_free_varinfo(var_r32); + adios_free_varinfo(var_r64); + + // Cleanup file + adios_read_close(f); + } } //******************************************************************************