From abc822a08fbe1f917a411c99210b8d6d4982bbe5 Mon Sep 17 00:00:00 2001 From: William F Godoy Date: Fri, 1 Feb 2019 15:23:15 -0500 Subject: [PATCH] C and Fortran string variable values #1120 and #1121 --- bindings/C/c/adios2_c_engine.cpp | 41 ++++++- .../Fortran/modules/adios2_engine_get_mod.f90 | 4 + .../Fortran/modules/adios2_engine_put_mod.f90 | 4 + .../modules/contains/adios2_engine_get.f90 | 15 +++ .../contains/adios2_engine_get_by_name.f90 | 15 ++- .../contains/adios2_engine_get_deferred.f90 | 15 +++ .../adios2_engine_get_deferred_by_name.f90 | 11 ++ .../modules/contains/adios2_engine_put.f90 | 16 +++ .../contains/adios2_engine_put_by_name.f90 | 18 ++- .../contains/adios2_engine_put_deferred.f90 | 16 +++ .../adios2_engine_put_deferred_by_name.f90 | 13 +++ testing/adios2/bindings/C/SmallTestData_c.h | 2 + .../adios2/bindings/C/TestBPWriteTypes.cpp | 13 ++- .../bindings/fortran/SmallTestData_mod.f90 | 2 +- .../bindings/fortran/TestBPWriteTypes.f90 | 14 ++- .../engine/bp/TestBPWriteAggregateRead.cpp | 107 +++++++++--------- 16 files changed, 237 insertions(+), 69 deletions(-) diff --git a/bindings/C/c/adios2_c_engine.cpp b/bindings/C/c/adios2_c_engine.cpp index 5aaff0770d..5ab9e5f5b8 100644 --- a/bindings/C/c/adios2_c_engine.cpp +++ b/bindings/C/c/adios2_c_engine.cpp @@ -154,6 +154,16 @@ adios2_error adios2_put(adios2_engine *engine, adios2_variable *variable, { // not supported } + else if (type == "string") + { + const std::string dataStr(reinterpret_cast(data)); + adios2::core::Engine &engineCpp = + *reinterpret_cast(engine); + + engineCpp.Put(*dynamic_cast *>( + variableBase), + dataStr); + } #define declare_template_instantiation(T) \ else if (type == adios2::helper::GetType()) \ { \ @@ -168,7 +178,7 @@ adios2_error adios2_put(adios2_engine *engine, adios2_variable *variable, *dynamic_cast *>(variableBase), \ reinterpret_cast(data), modeCpp); \ } - ADIOS2_FOREACH_TYPE_1ARG(declare_template_instantiation) + ADIOS2_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation) #undef declare_template_instantiation return adios2_error_none; @@ -205,13 +215,18 @@ adios2_error adios2_put_by_name(adios2_engine *engine, { // not supported } + else if (type == "string") + { + const std::string dataStr(reinterpret_cast(data)); + engineCpp.Put(variable_name, dataStr); + } #define declare_template_instantiation(T) \ else if (type == adios2::helper::GetType()) \ { \ engineCpp.Put(variable_name, reinterpret_cast(data), \ modeCpp); \ } - ADIOS2_FOREACH_TYPE_1ARG(declare_template_instantiation) + ADIOS2_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation) #undef declare_template_instantiation return adios2_error_none; } @@ -252,12 +267,24 @@ adios2_error adios2_get(adios2_engine *engine, adios2_variable *variable, adios2::core::VariableBase *variableBase = reinterpret_cast(variable); + const std::string type(variableBase->m_Type); if (type == "compound") { // not supported } + else if (type == "string") + { + adios2::core::Engine &engineCpp = + *reinterpret_cast(engine); + + std::string dataStr; + engineCpp.Get(*dynamic_cast *>( + variableBase), + dataStr); + dataStr.copy(reinterpret_cast(values), dataStr.size()); + } #define declare_template_instantiation(T) \ else if (type == adios2::helper::GetType()) \ { \ @@ -270,7 +297,7 @@ adios2_error adios2_get(adios2_engine *engine, adios2_variable *variable, *dynamic_cast *>(variableBase), \ reinterpret_cast(values), modeCpp); \ } - ADIOS2_FOREACH_TYPE_1ARG(declare_template_instantiation) + ADIOS2_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation) #undef declare_template_instantiation return adios2_error_none; } @@ -304,12 +331,18 @@ adios2_error adios2_get_by_name(adios2_engine *engine, { // not supported } + else if (type == "string") + { + std::string dataStr; + engineCpp.Get(variable_name, dataStr); + dataStr.copy(reinterpret_cast(data), dataStr.size()); + } #define declare_template_instantiation(T) \ else if (type == adios2::helper::GetType()) \ { \ engineCpp.Get(variable_name, reinterpret_cast(data), modeCpp); \ } - ADIOS2_FOREACH_TYPE_1ARG(declare_template_instantiation) + ADIOS2_FOREACH_PRIMITIVE_TYPE_1ARG(declare_template_instantiation) #undef declare_template_instantiation return adios2_error_none; } diff --git a/bindings/Fortran/modules/adios2_engine_get_mod.f90 b/bindings/Fortran/modules/adios2_engine_get_mod.f90 index c8a796b625..9422827a06 100644 --- a/bindings/Fortran/modules/adios2_engine_get_mod.f90 +++ b/bindings/Fortran/modules/adios2_engine_get_mod.f90 @@ -17,6 +17,7 @@ module adios2_engine_get_mod interface adios2_get ! Single Value + module procedure adios2_get_string module procedure adios2_get_real module procedure adios2_get_dp module procedure adios2_get_complex @@ -87,6 +88,7 @@ module adios2_engine_get_mod module procedure adios2_get_integer8_6d ! Single Value + module procedure adios2_get_by_name_string module procedure adios2_get_by_name_real module procedure adios2_get_by_name_dp module procedure adios2_get_by_name_complex @@ -157,6 +159,7 @@ module adios2_engine_get_mod module procedure adios2_get_by_name_integer8_6d ! Single Value + module procedure adios2_get_deferred_string module procedure adios2_get_deferred_real module procedure adios2_get_deferred_dp module procedure adios2_get_deferred_complex @@ -228,6 +231,7 @@ module adios2_engine_get_mod ! Deferred Signature ! Single Value + module procedure adios2_get_deferred_by_name_string module procedure adios2_get_deferred_by_name_real module procedure adios2_get_deferred_by_name_dp module procedure adios2_get_deferred_by_name_complex diff --git a/bindings/Fortran/modules/adios2_engine_put_mod.f90 b/bindings/Fortran/modules/adios2_engine_put_mod.f90 index c1ddfa0a95..c8f3419e6b 100644 --- a/bindings/Fortran/modules/adios2_engine_put_mod.f90 +++ b/bindings/Fortran/modules/adios2_engine_put_mod.f90 @@ -17,6 +17,7 @@ module adios2_engine_put_mod interface adios2_put ! Single Value + module procedure adios2_put_string module procedure adios2_put_real module procedure adios2_put_dp module procedure adios2_put_complex @@ -87,6 +88,7 @@ module adios2_engine_put_mod module procedure adios2_put_integer8_6d ! Single Value + module procedure adios2_put_by_name_string module procedure adios2_put_by_name_real module procedure adios2_put_by_name_dp module procedure adios2_put_by_name_complex @@ -157,6 +159,7 @@ module adios2_engine_put_mod module procedure adios2_put_by_name_integer8_6d ! Single Value + module procedure adios2_put_deferred_string module procedure adios2_put_deferred_real module procedure adios2_put_deferred_dp module procedure adios2_put_deferred_complex @@ -228,6 +231,7 @@ module adios2_engine_put_mod ! Deferred Signature ! Single Value + module procedure adios2_put_deferred_by_name_string module procedure adios2_put_deferred_by_name_real module procedure adios2_put_deferred_by_name_dp module procedure adios2_put_deferred_by_name_complex diff --git a/bindings/Fortran/modules/contains/adios2_engine_get.f90 b/bindings/Fortran/modules/contains/adios2_engine_get.f90 index 47406ca738..17a3667f53 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_get.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_get.f90 @@ -9,6 +9,21 @@ ! ! Single data +subroutine adios2_get_string(engine, variable, data, launch, ierr) + type(adios2_engine), intent(in):: engine + type(adios2_variable), intent(in):: variable + character*(*), intent(out):: data + integer, intent(in):: launch + integer, intent(out):: ierr + + call adios2_variable_check_type(variable, adios2_type_string, & + 'get string', ierr) + if (ierr == 0) then + call adios2_get_f2c(engine%f2c, variable%f2c, data, launch, ierr) + end if + +end subroutine + subroutine adios2_get_real(engine, variable, data, launch, ierr) type(adios2_engine), intent(in):: engine type(adios2_variable), intent(in):: variable diff --git a/bindings/Fortran/modules/contains/adios2_engine_get_by_name.f90 b/bindings/Fortran/modules/contains/adios2_engine_get_by_name.f90 index 1f3c48c737..e5d66d02dd 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_get_by_name.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_get_by_name.f90 @@ -10,8 +10,19 @@ ! ! Single values -subroutine adios2_get_by_name_real(engine, name, data, & - launch, ierr) +subroutine adios2_get_by_name_string(engine, name, data, launch, ierr) + type(adios2_engine), intent(in):: engine + character*(*), intent(in) :: name + character*(*), intent(out):: data + integer, intent(in):: launch + integer, intent(out):: ierr + + call adios2_get_by_name_f2c(engine%f2c, TRIM(ADJUSTL(name))//char(0), & + data, launch, ierr) + +end subroutine + +subroutine adios2_get_by_name_real(engine, name, data, launch, ierr) type(adios2_engine), intent(in):: engine character*(*), intent(in) :: name real, intent(out):: data diff --git a/bindings/Fortran/modules/contains/adios2_engine_get_deferred.f90 b/bindings/Fortran/modules/contains/adios2_engine_get_deferred.f90 index e557d7ed63..886b9defbd 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_get_deferred.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_get_deferred.f90 @@ -10,6 +10,21 @@ ! ! Single data +subroutine adios2_get_deferred_string(engine, variable, data, ierr) + type(adios2_engine), intent(in):: engine + type(adios2_variable), intent(in):: variable + character*(*), intent(out):: data + integer, intent(out):: ierr + + call adios2_variable_check_type(variable, adios2_type_string, & + 'get string', ierr) + if (ierr == 0) then + call adios2_get_f2c(engine%f2c, variable%f2c, data, adios2_mode_sync, & + ierr) + end if + +end subroutine + subroutine adios2_get_deferred_real(engine, variable, data, ierr) type(adios2_engine), intent(in):: engine type(adios2_variable), intent(in):: variable diff --git a/bindings/Fortran/modules/contains/adios2_engine_get_deferred_by_name.f90 b/bindings/Fortran/modules/contains/adios2_engine_get_deferred_by_name.f90 index 12ddea9150..5050f9120e 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_get_deferred_by_name.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_get_deferred_by_name.f90 @@ -10,6 +10,17 @@ ! ! Single Value +subroutine adios2_get_deferred_by_name_string(engine, name, data, ierr) + type(adios2_engine), intent(in):: engine + character*(*), intent(in) :: name + character*(*), intent(out):: data + integer, intent(out):: ierr + + call adios2_get_by_name_f2c(engine%f2c, TRIM(ADJUSTL(name))//char(0), & + data, adios2_mode_sync, ierr) + +end subroutine + subroutine adios2_get_deferred_by_name_real(engine, name, data, ierr) type(adios2_engine), intent(in):: engine character*(*), intent(in) :: name diff --git a/bindings/Fortran/modules/contains/adios2_engine_put.f90 b/bindings/Fortran/modules/contains/adios2_engine_put.f90 index 839b3eb0f9..ad9fabf378 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_put.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_put.f90 @@ -9,6 +9,22 @@ ! ! Single data +subroutine adios2_put_string(engine, variable, data, launch, ierr) + type(adios2_engine), intent(in):: engine + type(adios2_variable), intent(in):: variable + character*(*), intent(in):: data + integer, intent(in):: launch + integer, intent(out):: ierr + + call adios2_variable_check_type(variable, adios2_type_string, & + 'put string', ierr) + if (ierr == 0) then + call adios2_put_f2c(engine%f2c, variable%f2c, & + TRIM(ADJUSTL(data))//char(0), launch, ierr) + end if + +end subroutine + subroutine adios2_put_real(engine, variable, data, launch, ierr) type(adios2_engine), intent(in):: engine type(adios2_variable), intent(in):: variable diff --git a/bindings/Fortran/modules/contains/adios2_engine_put_by_name.f90 b/bindings/Fortran/modules/contains/adios2_engine_put_by_name.f90 index d03161e986..a65f3c28ab 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_put_by_name.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_put_by_name.f90 @@ -10,16 +10,26 @@ ! ! Single values -subroutine adios2_put_by_name_real(engine, name, data, & - launch, ierr) +subroutine adios2_put_by_name_string(engine, name, data, launch, ierr) + type(adios2_engine), intent(in):: engine + character*(*), intent(in) :: name + character*(*), intent(in) :: data + integer, intent(in):: launch + integer, intent(out):: ierr + + call adios2_put_by_name_f2c(engine%f2c, TRIM(ADJUSTL(name))//char(0), & + TRIM(ADJUSTL(data))//char(0), launch, ierr) + +end subroutine + +subroutine adios2_put_by_name_real(engine, name, data, launch, ierr) type(adios2_engine), intent(in):: engine character*(*), intent(in) :: name real, intent(in):: data integer, intent(in):: launch integer, intent(out):: ierr - call adios2_put_by_name_f2c(engine%f2c, & - TRIM(ADJUSTL(name))//char(0), & + call adios2_put_by_name_f2c(engine%f2c, TRIM(ADJUSTL(name))//char(0), & data, launch, ierr) end subroutine diff --git a/bindings/Fortran/modules/contains/adios2_engine_put_deferred.f90 b/bindings/Fortran/modules/contains/adios2_engine_put_deferred.f90 index 2668f8051f..dd52d96364 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_put_deferred.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_put_deferred.f90 @@ -10,6 +10,22 @@ ! ! Single data +subroutine adios2_put_deferred_string(engine, variable, data, ierr) + type(adios2_engine), intent(in):: engine + type(adios2_variable), intent(in):: variable + character*(*), intent(in):: data + integer, intent(out):: ierr + + call adios2_variable_check_type(variable, adios2_type_string, & + 'put string', ierr) + if (ierr == 0) then + call adios2_put_f2c(engine%f2c, variable%f2c, & + TRIM(ADJUSTL(data))//char(0), adios2_mode_sync, & + ierr) + end if + +end subroutine + subroutine adios2_put_deferred_real(engine, variable, data, ierr) type(adios2_engine), intent(in):: engine type(adios2_variable), intent(in):: variable diff --git a/bindings/Fortran/modules/contains/adios2_engine_put_deferred_by_name.f90 b/bindings/Fortran/modules/contains/adios2_engine_put_deferred_by_name.f90 index 13b5dda198..06e7cf7f2e 100644 --- a/bindings/Fortran/modules/contains/adios2_engine_put_deferred_by_name.f90 +++ b/bindings/Fortran/modules/contains/adios2_engine_put_deferred_by_name.f90 @@ -10,6 +10,19 @@ ! ! Single Value +subroutine adios2_put_deferred_by_name_string(engine, name, data, ierr) + type(adios2_engine), intent(in):: engine + character*(*), intent(in) :: name + character*(*), intent(in):: data + integer, intent(out):: ierr + + call adios2_put_by_name_f2c(engine%f2c, TRIM(ADJUSTL(name))//char(0), & + TRIM(ADJUSTL(data))//char(0), & + adios2_mode_deferred, ierr) + +end subroutine + + subroutine adios2_put_deferred_by_name_real(engine, name, data, ierr) type(adios2_engine), intent(in):: engine character*(*), intent(in) :: name diff --git a/testing/adios2/bindings/C/SmallTestData_c.h b/testing/adios2/bindings/C/SmallTestData_c.h index c0801f875c..7957106d61 100644 --- a/testing/adios2/bindings/C/SmallTestData_c.h +++ b/testing/adios2/bindings/C/SmallTestData_c.h @@ -8,6 +8,8 @@ #include +const char dataStr[] = "A string variable"; + size_t data_Nx = 10; int8_t data_I8[10] = {0, 1, -2, 3, -4, 5, -6, 7, -8, 9}; diff --git a/testing/adios2/bindings/C/TestBPWriteTypes.cpp b/testing/adios2/bindings/C/TestBPWriteTypes.cpp index 8adeb25fc0..434210e9fb 100644 --- a/testing/adios2/bindings/C/TestBPWriteTypes.cpp +++ b/testing/adios2/bindings/C/TestBPWriteTypes.cpp @@ -2,7 +2,7 @@ * Distributed under the OSI-approved Apache License, Version 2.0. See * accompanying file Copyright.txt for details. * - * TestBPWriteTypes.c + * TestBPWriteTypes.cpp : test the C bindings * * Created on: Aug 9, 2017 * Author: William F Godoy godoywf@ornl.gov @@ -72,6 +72,8 @@ TEST_F(BPWriteTypesCC, ADIOS2BPWriteTypes) // Define variables in ioH { + adios2_define_variable(ioH, "varStr", adios2_type_string, 0, NULL, + NULL, NULL, adios2_constant_dims_true); adios2_define_variable(ioH, "varI8", adios2_type_int8_t, 1, shape, start, count, adios2_constant_dims_true); adios2_define_variable(ioH, "varI16", adios2_type_int16_t, 1, shape, @@ -99,6 +101,7 @@ TEST_F(BPWriteTypesCC, ADIOS2BPWriteTypes) start, count, adios2_constant_dims_true); } // inquire variables + adios2_variable *varStr = adios2_inquire_variable(ioH, "varStr"); adios2_variable *varI8 = adios2_inquire_variable(ioH, "varI8"); adios2_variable *varI16 = adios2_inquire_variable(ioH, "varI16"); adios2_variable *varI32 = adios2_inquire_variable(ioH, "varI32"); @@ -114,6 +117,8 @@ TEST_F(BPWriteTypesCC, ADIOS2BPWriteTypes) adios2_engine *engineH = adios2_open(ioH, "ctypes.bp", adios2_mode_write); + adios2_put(engineH, varStr, dataStr, adios2_mode_sync); + adios2_put(engineH, varI8, data_I8, adios2_mode_deferred); adios2_put(engineH, varI8, data_I8, adios2_mode_deferred); adios2_put(engineH, varI16, data_I16, adios2_mode_deferred); adios2_put(engineH, varI32, data_I32, adios2_mode_deferred); @@ -213,6 +218,7 @@ TEST_F(BPWriteTypesCC, ADIOS2BPWriteTypes) auto mmR64 = std::minmax_element(&data_R64[0], &data_R64[data_Nx]); // add min and max here + adios2_variable *varStr = adios2_inquire_variable(ioH, "varStr"); adios2_variable *varI8 = adios2_inquire_variable(ioH, "varI8"); adios2_variable *varI16 = adios2_inquire_variable(ioH, "varI16"); adios2_variable *varI32 = adios2_inquire_variable(ioH, "varI32"); @@ -226,6 +232,11 @@ TEST_F(BPWriteTypesCC, ADIOS2BPWriteTypes) adios2_variable *varR32 = adios2_inquire_variable(ioH, "varR32"); adios2_variable *varR64 = adios2_inquire_variable(ioH, "varR64"); + char inString[30] = {}; + adios2_get(engineH, varStr, inString, adios2_mode_sync); + + EXPECT_EQ(dataStr, std::string(inString)); + int8_t minI8, maxI8; int16_t minI16, maxI16; int32_t minI32, maxI32; diff --git a/testing/adios2/bindings/fortran/SmallTestData_mod.f90 b/testing/adios2/bindings/fortran/SmallTestData_mod.f90 index 2b284e1a1a..f459010535 100644 --- a/testing/adios2/bindings/fortran/SmallTestData_mod.f90 +++ b/testing/adios2/bindings/fortran/SmallTestData_mod.f90 @@ -10,7 +10,7 @@ module small_test_data implicit none - character(len=16), parameter, dimension(3) :: data_Strings = & + character(len=15), parameter, dimension(3) :: data_Strings = & (/'Attribute oneXX', 'Attribute twoXX', 'Attribute three'/) integer(kind=1), parameter, dimension(10) :: data_I8 = & diff --git a/testing/adios2/bindings/fortran/TestBPWriteTypes.f90 b/testing/adios2/bindings/fortran/TestBPWriteTypes.f90 index d794879f39..0fb902e4f3 100644 --- a/testing/adios2/bindings/fortran/TestBPWriteTypes.f90 +++ b/testing/adios2/bindings/fortran/TestBPWriteTypes.f90 @@ -9,8 +9,9 @@ program TestBPWriteTypes type(adios2_adios) :: adios type(adios2_io) :: ioWrite, ioRead - type(adios2_variable), dimension(12) :: variables + type(adios2_variable), dimension(13) :: variables type(adios2_engine) :: bpWriter, bpReader + character(len=15) :: inString ! read handlers integer :: ndims @@ -103,7 +104,10 @@ program TestBPWriteTypes call adios2_define_variable(variables(12), ioWrite, "gvar_R64", & adios2_type_dp, ierr) - do i=1,12 + call adios2_define_variable(variables(13), ioWrite, "gvar_Str", & + adios2_type_string, ierr) + + do i=1,13 if( variables(i)%valid .eqv. .false. ) stop 'Invalid adios2_define_variable' end do @@ -135,6 +139,7 @@ program TestBPWriteTypes call adios2_put(bpWriter, variables(10), data_I64(1), ierr) call adios2_put(bpWriter, variables(11), data_R32(1), ierr) call adios2_put(bpWriter, variables(12), data_R64(1), ierr) + call adios2_put(bpWriter, variables(13), data_Strings(1), ierr) end if call adios2_put(bpWriter, variables(1), data_I8, ierr) @@ -199,6 +204,11 @@ program TestBPWriteTypes if (ndims /= 1) stop 'var_R64 ndims is not 1' if (shape_in(1) /= isize*inx) stop 'var_R64 shape_in read failed' + call adios2_inquire_variable(variables(13), ioRead, "gvar_Str", ierr) + call adios2_get(bpReader, variables(13), inString, ierr) + call adios2_perform_gets(bpReader, ierr) + if( inString /= data_Strings(1) ) stop 'gvar_Str read failed' + call adios2_close(bpReader, ierr) ! Deallocates adios and calls its destructor diff --git a/testing/adios2/engine/bp/TestBPWriteAggregateRead.cpp b/testing/adios2/engine/bp/TestBPWriteAggregateRead.cpp index c145ffbfba..3138e64242 100644 --- a/testing/adios2/engine/bp/TestBPWriteAggregateRead.cpp +++ b/testing/adios2/engine/bp/TestBPWriteAggregateRead.cpp @@ -14,24 +14,13 @@ #include "../SmallTestData.h" -class BPWriteAggregateReadTest : public ::testing::Test -{ -public: - BPWriteAggregateReadTest() = default; - - SmallTestData m_TestData; -}; - -//****************************************************************************** -// 1D 1x8 test data -//****************************************************************************** - -// ADIOS2 BP write, native ADIOS1 read -TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) +// ADIOS2 BP write +void WriteAggRead1D8(const std::string substreams) { // Each process would write a 1x8 array and all processes would // form a mpiSize * Nx 1D array - const std::string fname("ADIOS2BPWriteAggregateRead1D8.bp"); + const std::string fname("ADIOS2BPWriteAggregateRead1D8_" + substreams + + ".bp"); int mpiRank = 0, mpiSize = 1; // Number of rows @@ -42,7 +31,6 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) MPI_Comm_rank(MPI_COMM_WORLD, &mpiRank); MPI_Comm_size(MPI_COMM_WORLD, &mpiSize); - // Write test data using BP adios2::ADIOS adios(MPI_COMM_WORLD, adios2::DebugON); @@ -51,8 +39,7 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) if (mpiSize > 1) { - const int subStreams = mpiSize / 2; - io.SetParameter("Substreams", std::to_string(subStreams)); + io.SetParameter("Substreams", substreams); } // Declare 1D variables (NumOfProcesses * Nx) @@ -88,12 +75,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) io.AddTransport("file"); - // QUESTION: It seems that BPFilterWriter cannot overwrite existing - // files - // Ex. if you tune Nx and NSteps, the test would fail. But if you clear - // the cache in - // ${adios2Build}/testing/adios2/engine/bp/ADIOS2BPWriteADIOS1Read1D8.bp.dir, - // then it works + SmallTestData m_TestData; + adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write); for (size_t step = 0; step < NSteps; ++step) @@ -135,7 +118,6 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) // fill in the variable with values from starting index to // starting index + count bpWriter.BeginStep(); - bpWriter.Put(var_iString, currentTestData.S1); bpWriter.Put(var_i8, currentTestData.I8.data()); bpWriter.Put(var_i16, currentTestData.I16.data()); @@ -260,6 +242,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) var_r32.SetSelection(sel); var_r64.SetSelection(sel); + SmallTestData m_TestData; + for (size_t t = 0; t < NSteps; ++t) { var_i8.SetStepSelection({t, 1}); @@ -320,16 +304,12 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) } } -//****************************************************************************** -// 2D 2x4 test data -//****************************************************************************** - -// ADIOS2 BP write, native ADIOS1 read -TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D2x4) +void WriteAggRead2D4x2(const std::string substreams) { // Each process would write a 2x4 array and all processes would // form a 2D 2 * (numberOfProcess*Nx) matrix where Nx is 4 here - const std::string fname("ADIOS2BPWriteAggregateRead2D2x4Test.bp"); + const std::string fname("ADIOS2BPWriteAggregateRead2D2x4_" + substreams + + ".bp"); int mpiRank = 0, mpiSize = 1; // Number of rows @@ -357,7 +337,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D2x4) } // Declare 2D variables (Ny * (NumOfProcesses * Nx)) - // The local process' part (start, count) can be defined now or later + // The local process' part (start, count) can be defined now or + // later // before Write(). { const adios2::Dims shape{Ny, static_cast(Nx * mpiSize)}; @@ -388,6 +369,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D2x4) io.SetEngine("BPFile"); io.AddTransport("file"); + SmallTestData m_TestData; + adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write); for (size_t step = 0; step < NSteps; ++step) @@ -558,6 +541,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D2x4) var_r32.SetSelection(sel); var_r64.SetSelection(sel); + SmallTestData m_TestData; + for (size_t t = 0; t < NSteps; ++t) { var_i8.SetStepSelection({t, 1}); @@ -618,15 +603,12 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D2x4) } } -//****************************************************************************** -// 2D 4x2 test data -//****************************************************************************** - -TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D4x2) +void WriteAggRead2D2x4(const std::string substreams) { // Each process would write a 4x2 array and all processes would // form a 2D 4 * (NumberOfProcess * Nx) matrix where Nx is 2 here - const std::string fname("ADIOS2BPWriteAggregateRead2D4x2Test.bp"); + const std::string fname("ADIOS2BPWriteAggregateRead2D4x2_" + substreams + + ".bp"); int mpiRank = 0, mpiSize = 1; // Number of rows @@ -647,12 +629,12 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D4x2) if (mpiSize > 1) { - const int subStreams = mpiSize / 2; - io.SetParameter("Substreams", std::to_string(subStreams)); + io.SetParameter("Substreams", substreams); } // Declare 2D variables (4 * (NumberOfProcess * Nx)) - // The local process' part (start, count) can be defined now or later + // The local process' part (start, count) can be defined now or + // later // before Write(). { adios2::Dims shape{static_cast(Ny), @@ -685,6 +667,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D4x2) io.AddTransport("file"); + SmallTestData m_TestData; + adios2::Engine bpWriter = io.Open(fname, adios2::Mode::Write); for (size_t step = 0; step < NSteps; ++step) @@ -850,6 +834,8 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D4x2) var_r32.SetSelection(sel); var_r64.SetSelection(sel); + SmallTestData m_TestData; + for (size_t t = 0; t < NSteps; ++t) { var_i8.SetStepSelection({t, 1}); @@ -906,23 +892,34 @@ TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D4x2) } } -TEST_F(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateSubStreamsException) +class BPWriteAggregateReadTest : public ::testing::TestWithParam { - // Each process would write a 4x2 array and all processes would - // form a 2D 4 * (NumberOfProcess * Nx) matrix where Nx is 2 here - const std::string fname("dummy.bp"); +public: + BPWriteAggregateReadTest() = default; - int mpiSize = 1; - MPI_Comm_size(MPI_COMM_WORLD, &mpiSize); + SmallTestData m_TestData; - adios2::ADIOS adios(MPI_COMM_WORLD, adios2::DebugON); - adios2::IO io = adios.DeclareIO("TestIO"); - io.SetParameter("Substreams", std::to_string(mpiSize + 1)); - EXPECT_NO_THROW(io.Open(fname, adios2::Mode::Write)); + virtual void SetUp() {} + virtual void TearDown() {} +}; + +TEST_P(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead1D8) +{ + WriteAggRead1D8(GetParam()); +} + +TEST_P(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D2x4) +{ + WriteAggRead2D2x4(GetParam()); } -//****************************************************************************** -// main -//****************************************************************************** + +TEST_P(BPWriteAggregateReadTest, ADIOS2BPWriteAggregateRead2D4x2) +{ + WriteAggRead2D4x2(GetParam()); +} + +INSTANTIATE_TEST_CASE_P(Substreams, BPWriteAggregateReadTest, + ::testing::Values("1", "2", "3", "4", "5")); int main(int argc, char **argv) {