Commit d8c0381b authored by William F Godoy's avatar William F Godoy
Browse files

Test for string attributes

Addressing #960
parent 23a58b9d
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -10,6 +10,9 @@

#include "adios2_f2c_common.h"

#include "adios2/core/Attribute.h"
#include <string.h> //strcpy

#ifdef __cplusplus
extern "C" {
#endif
@@ -67,12 +70,37 @@ void FC_GLOBAL(adios2_attribute_data_f2c,
                                          const adios2_attribute **attribute,
                                          int *ierr)
{
    *size = -1;
    try
    {
        int type;
        FC_GLOBAL(adios2_attribute_type_f2c, ADIOS2_ATTRIBUTE_TYPE_F2C)
        (&type, attribute, ierr);

        if (type == adios2_type_string)
        {
            const adios2::core::Attribute<std::string> *attributeCpp =
                reinterpret_cast<const adios2::core::Attribute<std::string> *>(
                    *attribute);

            char *dataT = reinterpret_cast<char *>(data);

            for (auto e = 0; e < *size; ++e)
            {
                attributeCpp->m_DataArray[e].copy(
                    &dataT[e * adios2_string_array_element_max_size],
                    attributeCpp->m_DataArray[e].size());
            }
        }
        else
        {
            size_t sizeC;
    *ierr = static_cast<int>(adios2_attribute_data(data, &sizeC, *attribute));
    if (*ierr == static_cast<int>(adios2_error_none))
            *ierr = static_cast<int>(
                adios2_attribute_data(data, &sizeC, *attribute));
        }
    }
    catch (...)
    {
        *size = static_cast<int>(sizeC);
        *ierr = adios2_error_exception;
    }
}

+23 −1
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ module adios2_attribute_data_mod
        module procedure adios2_attribute_data_integer8

        ! 1D Array
        !module procedure adios2_attribute_data_string_1d
        module procedure adios2_attribute_data_string_1d
        module procedure adios2_attribute_data_real_1d
        module procedure adios2_attribute_data_dp_1d
        module procedure adios2_attribute_data_integer1_1d
@@ -130,6 +130,28 @@ contains
    end subroutine

    ! 1D Array
    subroutine adios2_attribute_data_string_1D(data, attribute, ierr)
        character*(*), dimension(:), intent(out):: data
        type(adios2_attribute), intent(in):: attribute
        integer, intent(out):: ierr
        ! local
        integer:: i
        character(len=adios2_string_array_element_max_size), &
            dimension(attribute%length):: dataMax

        call adios2_attribute_check_type(attribute, adios2_type_string, &
                                        'attribute_data', ierr)
        if (ierr == 0) then
            call adios2_attribute_data_f2c(dataMax, attribute%length, &
                                           attribute%f2c, ierr)
        end if

        do i=1, attribute%length
            data(i) = trim(dataMax(i))
        end do

    end subroutine

    subroutine adios2_attribute_data_real_1d(data, attribute, ierr)
        real, dimension(:), intent(out):: data
        type(adios2_attribute), intent(in):: attribute
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ module small_test_data
    implicit none

    character(len=16), parameter, dimension(3) :: data_Strings = &
                                                  (/'Attribute one  ', 'Attribute two  ', 'Attribute three'/)
                                                  (/'Attribute oneXX', 'Attribute twoXX', 'Attribute three'/)

    integer(kind=1), parameter, dimension(10) :: data_I8 = &
                                                 (/0, 1, -2, 3, -4, 5, -6, 7, -8, 9/)
+24 −17
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ program TestBPWriteAttributes
    real :: r32_value
    real(kind=8):: r64_value

    character(len=15), dimension(3):: iString_array
    integer(kind=1), dimension(3):: i8_array
    integer(kind=2), dimension(3):: i16_array
    integer(kind=4), dimension(3):: i32_array
@@ -110,54 +111,55 @@ program TestBPWriteAttributes

    if(attributes_in(1)%valid .eqv. .false.) stop 'attribute iString not found'
    if(attributes_in(1)%type /= adios2_type_string) stop 'attribute iString wrong type'
    if(attributes_in(1)%length /= 1) stop 'attribute iString lenght is not 1'
    if(attributes_in(1)%length /= 1) stop 'attribute iString length is not 1'
    if(attributes_in(1)%is_value .eqv. .false.) stop 'attribute iString must be value'
    call adios2_attribute_data( iString_value, attributes_in(1), ierr)
    if( iString_value /=  'ADIOS2 String attribute' ) stop 'attribute iString data error'

    if(attributes_in(2)%valid .eqv. .false.) stop 'attribute i8 not found'
    if(attributes_in(2)%type /= adios2_type_integer1) stop 'attribute i8 wrong type'
    if(attributes_in(2)%length /= 1) stop 'attribute i8 lenght is not 1'
    if(attributes_in(2)%length /= 1) stop 'attribute i8 length is not 1'
    if(attributes_in(2)%is_value .eqv. .false.) stop 'attribute i8 must be value'
    call adios2_attribute_data( i8_value, attributes_in(2), ierr)
    if( i8_value /=  data_I8(1) ) stop 'attribute i8 data error'

    if(attributes_in(3)%valid .eqv. .false.) stop 'attribute i16 not found'
    if(attributes_in(3)%type /= adios2_type_integer2) stop 'attribute i16 wrong type'
    if(attributes_in(3)%length /= 1) stop 'attribute i16 lenght is not 1'
    if(attributes_in(3)%length /= 1) stop 'attribute i16 length is not 1'
    if(attributes_in(3)%is_value .eqv. .false.) stop 'attribute i16 must be value'
    call adios2_attribute_data( i16_value, attributes_in(3), ierr)
    if( i16_value /=  data_I16(1) ) stop 'attribute i16 data error'

    if(attributes_in(4)%valid .eqv. .false.) stop 'attribute i32 not found'
    if(attributes_in(4)%type /= adios2_type_integer4) stop 'attribute i32 wrong type'
    if(attributes_in(4)%length /= 1) stop 'attribute i32 lenght is not 1'
    if(attributes_in(4)%length /= 1) stop 'attribute i32 length is not 1'
    if(attributes_in(4)%is_value .eqv. .false.) stop 'attribute i32 must be value'
    call adios2_attribute_data( i32_value, attributes_in(4), ierr)
    if( i32_value /=  data_I32(1) ) stop 'attribute i32 data error'

    if(attributes_in(5)%valid .eqv. .false.) stop 'attribute i64 not found'
    if(attributes_in(5)%type /= adios2_type_integer8) stop 'attribute i64 wrong type'
    if(attributes_in(5)%length /= 1) stop 'attribute i64 lenght is not 1'
    if(attributes_in(5)%length /= 1) stop 'attribute i64 length is not 1'
    if(attributes_in(5)%is_value .eqv. .false.) stop 'attribute i64 must be value'
    call adios2_attribute_data( i64_value, attributes_in(5), ierr)
    if( i64_value /=  data_I64(1) ) stop 'attribute i64 data error'

    if(attributes_in(6)%valid .eqv. .false.) stop 'attribute r32 not found'
    if(attributes_in(6)%type /= adios2_type_real) stop 'attribute r32 wrong type'
    if(attributes_in(6)%length /= 1) stop 'attribute r32 lenght is not 1'
    if(attributes_in(6)%length /= 1) stop 'attribute r32 length is not 1'
    if(attributes_in(6)%is_value .eqv. .false.) stop 'attribute r32 must be value'
    call adios2_attribute_data( r32_value, attributes_in(6), ierr)
    if( r32_value /=  data_R32(1) ) stop 'attribute r32 data error'

    if(attributes_in(7)%valid .eqv. .false.) stop 'attribute r64 not found'
    if(attributes_in(7)%type /= adios2_type_dp) stop 'attribute r64 wrong type'
    if(attributes_in(7)%length /= 1) stop 'attribute r64 lenght is not 1'
    if(attributes_in(7)%length /= 1) stop 'attribute r64 length is not 1'
    if(attributes_in(7)%is_value .eqv. .false.) stop 'attribute r64 must be value'
    call adios2_attribute_data( r64_value, attributes_in(7), ierr)
    if( r64_value /=  data_R64(1) ) stop 'attribute r64 data error'

    ! Array
    call adios2_inquire_attribute(attributes_in(8), ioRead, 'att_Strings_array', ierr)
    call adios2_inquire_attribute(attributes_in(9), ioRead, 'att_i8_array', ierr)
    call adios2_inquire_attribute(attributes_in(10), ioRead, 'att_i16_array', ierr)
    call adios2_inquire_attribute(attributes_in(11), ioRead, 'att_i32_array', ierr)
@@ -165,9 +167,18 @@ program TestBPWriteAttributes
    call adios2_inquire_attribute(attributes_in(13), ioRead, 'att_r32_array', ierr)
    call adios2_inquire_attribute(attributes_in(14), ioRead, 'att_r64_array', ierr)

    if(attributes_in(8)%valid .eqv. .false.) stop 'attribute string array not found'
    if(attributes_in(8)%type /= adios2_type_string) stop 'attribute string array wrong type'
    if(attributes_in(8)%length /= 3) stop 'attribute string array length is not 3'
    if(attributes_in(8)%is_value .eqv. .true.) stop 'attribute string array must be array'
    call adios2_attribute_data( iString_array, attributes_in(8), ierr)
    do i=1,3
       if( iString_array(i) /= data_Strings(i) ) stop 'attribute string array data error'
    end do

    if(attributes_in(9)%valid .eqv. .false.) stop 'attribute i8 array not found'
    if(attributes_in(9)%type /= adios2_type_integer1) stop 'attribute i8 array wrong type'
    if(attributes_in(9)%length /= 3) stop 'attribute i8 array lenght is not 1'
    if(attributes_in(9)%length /= 3) stop 'attribute i8 array length is not 3'
    if(attributes_in(9)%is_value .eqv. .true.) stop 'attribute i8 array must be array'
    call adios2_attribute_data( i8_array, attributes_in(9), ierr)
    do i=1,3
@@ -176,7 +187,7 @@ program TestBPWriteAttributes

    if(attributes_in(10)%valid .eqv. .false.) stop 'attribute i16 array not found'
    if(attributes_in(10)%type /= adios2_type_integer2) stop 'attribute i16 array wrong type'
    if(attributes_in(10)%length /= 3) stop 'attribute i16 array lenght is not 1'
    if(attributes_in(10)%length /= 3) stop 'attribute i16 array length is not 3'
    if(attributes_in(10)%is_value .eqv. .true.) stop 'attribute i16 array must be array'
    call adios2_attribute_data( i16_array, attributes_in(10), ierr)
    do i=1,3
@@ -185,7 +196,7 @@ program TestBPWriteAttributes

    if(attributes_in(11)%valid .eqv. .false.) stop 'attribute i32 array not found'
    if(attributes_in(11)%type /= adios2_type_integer4) stop 'attribute i32 array wrong type'
    if(attributes_in(11)%length /= 3) stop 'attribute i32 array lenght is not 1'
    if(attributes_in(11)%length /= 3) stop 'attribute i32 array length is not 3'
    if(attributes_in(11)%is_value .eqv. .true.) stop 'attribute i32 array must be array'
    call adios2_attribute_data( i32_array, attributes_in(11), ierr)
    do i=1,3
@@ -194,7 +205,7 @@ program TestBPWriteAttributes

    if(attributes_in(12)%valid .eqv. .false.) stop 'attribute i64 array not found'
    if(attributes_in(12)%type /= adios2_type_integer8) stop 'attribute i64 array wrong type'
    if(attributes_in(12)%length /= 3) stop 'attribute i64 array lenght is not 1'
    if(attributes_in(12)%length /= 3) stop 'attribute i64 array length is not 3'
    if(attributes_in(12)%is_value .eqv. .true.) stop 'attribute i64 array must be array'
    call adios2_attribute_data( i64_array, attributes_in(12), ierr)
    do i=1,3
@@ -203,7 +214,7 @@ program TestBPWriteAttributes

    if(attributes_in(13)%valid .eqv. .false.) stop 'attribute r32 array not found'
    if(attributes_in(13)%type /= adios2_type_real) stop 'attribute r32 array wrong type'
    if(attributes_in(13)%length /= 3) stop 'attribute r32 array lenght is not 1'
    if(attributes_in(13)%length /= 3) stop 'attribute r32 array length is not 3'
    if(attributes_in(13)%is_value .eqv. .true.) stop 'attribute r32 array must be array'
    call adios2_attribute_data( r32_array, attributes_in(13), ierr)
    do i=1,3
@@ -212,21 +223,17 @@ program TestBPWriteAttributes

    if(attributes_in(14)%valid .eqv. .false.) stop 'attribute r64 array not found'
    if(attributes_in(14)%type /= adios2_type_dp) stop 'attribute r64 array wrong type'
    if(attributes_in(14)%length /= 3) stop 'attribute r64 array lenght is not 1'
    if(attributes_in(14)%length /= 3) stop 'attribute r64 array length is not 3'
    if(attributes_in(14)%is_value .eqv. .true.) stop 'attribute r64 array must be array'
    call adios2_attribute_data( r64_array, attributes_in(14), ierr)
    do i=1,3
       if( r64_array(i) /=  data_R64(i) ) stop 'attribute r64 array data error'
    end do



    call adios2_close(bpReader, ierr)





    call adios2_finalize(adios, ierr)

    call MPI_Finalize(ierr)