Unverified Commit 2841275f authored by William F Godoy's avatar William F Godoy Committed by GitHub
Browse files

Merge pull request #1053 from williamfgc/f90_attr_data

F90 attribute data read
parents 0e8290a0 d8c0381b
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -134,6 +134,26 @@ adios2_error adios2_attribute_is_value(adios2_bool *result,
    }
}

adios2_error adios2_attribute_size(size_t *size,
                                   const adios2_attribute *attribute)
{
    try
    {
        adios2::helper::CheckForNullptr(attribute,
                                        "in call to adios2_attribute_size");
        const adios2::core::AttributeBase *attributeBase =
            reinterpret_cast<const adios2::core::AttributeBase *>(attribute);

        *size = attributeBase->m_IsSingleValue ? 1 : attributeBase->m_Elements;
        return adios2_error_none;
    }
    catch (...)
    {
        return static_cast<adios2_error>(
            adios2::helper::ExceptionToError("adios2_attribute_size"));
    }
}

adios2_error adios2_attribute_data(void *data, size_t *size,
                                   const adios2_attribute *attribute)
{
+10 −0
Original line number Diff line number Diff line
@@ -55,6 +55,16 @@ adios2_error adios2_attribute_type_string(char *type, size_t *size,
adios2_error adios2_attribute_is_value(adios2_bool *result,
                                       const adios2_attribute *attribute);

/**
 * Returns the number of elements (as in C++ STL size() function) if attribute
 * is a 1D array. If single value returns 1
 * @param size output, number of elements in attribute
 * @param attribute handler
 * @return adios2_error 0: success, see enum adios2_error for errors
 */
adios2_error adios2_attribute_size(size_t *size,
                                   const adios2_attribute *attribute);

/**
 * Retrieve attribute data pointer (read-only)
 * @param data output attribute values, must be pre-allocated
+5 −2
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ FortranCInterface_VERIFY(CXX QUIET)

set(F2C
     ${CMAKE_CURRENT_SOURCE_DIR}/f2c/adios2_f2c_adios.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/f2c/adios2_f2c_attribute.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/f2c/adios2_f2c_io.cpp 
     ${CMAKE_CURRENT_SOURCE_DIR}/f2c/adios2_f2c_variable.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/f2c/adios2_f2c_engine.cpp
@@ -23,6 +24,8 @@ set(MODULES
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_functions_allocate_mod.f90  
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_parameters_mod.f90 
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_adios_mod.f90
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_attribute_mod.f90
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_attribute_data_mod.f90 
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_io_mod.f90 
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_io_define_variable_mod.f90
     ${CMAKE_CURRENT_SOURCE_DIR}/modules/adios2_io_define_attribute_mod.f90
+109 −0
Original line number Diff line number Diff line
/*
 * Distributed under the OSI-approved Apache License, Version 2.0.  See
 * accompanying file Copyright.txt for details.
 *
 * adios2_f2c_attribute.cpp
 *
 *  Created on: Dec 10, 2018
 *      Author: William F Godoy godoywf@ornl.gov
 */

#include "adios2_f2c_common.h"

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

#ifdef __cplusplus
extern "C" {
#endif

void FC_GLOBAL(adios2_attribute_is_value_f2c, ADIOS2_ATTRIBUTE_IS_VALUE_F2C)(
    int *is_value, const adios2_attribute **attribute, int *ierr)
{
    adios2_bool isValueC;
    *ierr = static_cast<int>(adios2_attribute_is_value(&isValueC, *attribute));
    if (*ierr == static_cast<int>(adios2_error_none))
    {
        *is_value = (isValueC == adios2_true) ? 1 : 0;
    }
}

void FC_GLOBAL(adios2_attribute_type_f2c,
               ADIOS2_ATTRIBUTE_TYPE_F2C)(int *type,
                                          const adios2_attribute **attribute,
                                          int *ierr)
{
    *type = -1;
    adios2_type typeC;
    *ierr = static_cast<int>(adios2_attribute_type(&typeC, *attribute));
    if (*ierr == static_cast<int>(adios2_error_none))
    {
        *type = static_cast<int>(typeC);
    }
}

void FC_GLOBAL(adios2_attribute_length_f2c,
               ADIOS2_ATTRIBUTE_LENGTH_F2C)(int *length,
                                            const adios2_attribute **attribute,
                                            int *ierr)
{
    *length = -1;
    size_t lengthC;
    *ierr = static_cast<int>(adios2_attribute_size(&lengthC, *attribute));
    if (*ierr == static_cast<int>(adios2_error_none))
    {
        *length = static_cast<int>(lengthC);
    }
}

void FC_GLOBAL(adios2_attribute_value_f2c,
               ADIOS2_ATTRIBUTE_VALUE_F2C)(void *data,
                                           const adios2_attribute **attribute,
                                           int *ierr)
{
    size_t size = 0;
    *ierr = static_cast<int>(adios2_attribute_data(data, &size, *attribute));
}

void FC_GLOBAL(adios2_attribute_data_f2c,
               ADIOS2_ATTRIBUTE_DATA_F2C)(void *data, int *size,
                                          const adios2_attribute **attribute,
                                          int *ierr)
{
    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));
        }
    }
    catch (...)
    {
        *ierr = adios2_error_exception;
    }
}

#ifdef __cplusplus
}
#endif
+2 −2
Original line number Diff line number Diff line
@@ -294,7 +294,7 @@ void FC_GLOBAL(adios2_set_operation_parameter_f2c,
}

void FC_GLOBAL(adios2_variable_min_f2c,
               adios2_variable_MIN_F2C)(void *min,
               ADIOS2_VARIABLE_MIN_F2C)(void *min,
                                        const adios2_variable **variable,
                                        int *ierr)
{
@@ -302,7 +302,7 @@ void FC_GLOBAL(adios2_variable_min_f2c,
}

void FC_GLOBAL(adios2_variable_max_f2c,
               adios2_variable_MAX_F2C)(void *max,
               ADIOS2_VARIABLE_MAX_F2C)(void *max,
                                        const adios2_variable **variable,
                                        int *ierr)
{
Loading