Skip to content
Snippets Groups Projects
HDF5WriterP.cpp 2.58 KiB
Newer Older
guj's avatar
guj committed
/*
guj's avatar
guj committed
 * Distributed under the OSI-approved Apache License, Version 2.0.  See
 * accompanying file Copyright.txt for details.
 *
guj's avatar
guj committed
 * HDF5WriterP.cpp
 *
guj's avatar
guj committed
 *  Created on: March 20, 2017
 *      Author: Junmin
guj's avatar
guj committed
 */

#include "HDF5WriterP.h"
guj's avatar
guj committed

#include "adios2/ADIOSMPI.h"
#include "adios2/helper/adiosFunctions.h" //CSVToVector
guj's avatar
guj committed

namespace adios2
guj's avatar
guj committed
{
guj's avatar
guj committed

William F Godoy's avatar
William F Godoy committed
HDF5WriterP::HDF5WriterP(IO &io, const std::string &name, const Mode mode,
                         MPI_Comm mpiComm)
William F Godoy's avatar
William F Godoy committed
: Engine("HDF5Writer", io, name, mode, mpiComm), m_H5File(io.m_DebugMode)
guj's avatar
guj committed
{
    m_EndMessage = ", in call to IO HDF5Writer Open " + m_Name + "\n";
guj's avatar
guj committed
    Init();
guj's avatar
guj committed
}

HDF5WriterP::~HDF5WriterP() { Close(); }
guj's avatar
guj committed

William F Godoy's avatar
William F Godoy committed
StepStatus HDF5WriterP::BeginStep(StepMode mode, const float timeoutSeconds)
pnorbert's avatar
pnorbert committed
{
    return StepStatus::OK;
pnorbert's avatar
pnorbert committed
}

void HDF5WriterP::EndStep() { m_H5File.Advance(); }

void HDF5WriterP::Close(const int transportIndex) { m_H5File.Close(); }

// PRIVATE
void HDF5WriterP::Init()
guj's avatar
guj committed
{
    if (m_OpenMode != Mode::Write && m_OpenMode != Mode::Append)
guj's avatar
guj committed
    {
        throw std::invalid_argument(
William F Godoy's avatar
William F Godoy committed
            "ERROR: HDF5Writer only support OpenMode::Write or "
            "OpenMode::Append "
guj's avatar
guj committed
            ", in call to ADIOS Open or HDF5Writer constructor\n");
    }
guj's avatar
guj committed

guj's avatar
guj committed
#ifdef NEVER
    m_H5File.Init(m_Name, m_MPIComm, true);
guj's avatar
guj committed
#else
    // enforce .h5 ending
    std::string suffix = ".h5";
    std::string wrongSuffix = ".bp";

    int ss = m_Name.size();
    int wpos = m_Name.find(wrongSuffix);

    if (wpos == ss - wrongSuffix.size())
    {
        // is a file with .bp ending
        std::string updatedName = m_Name.substr(0, wpos) + suffix;
        m_H5File.Init(updatedName, m_MPIComm, true);
    }
    else
    {
        m_H5File.Init(m_Name, m_MPIComm, true);
    }

#endif
guj's avatar
guj committed
}

#define declare_type(T)                                                        \
    void HDF5WriterP::DoPutSync(Variable<T> &variable, const T *values)        \
    {                                                                          \
        DoPutSyncCommon(variable, values);                                     \
    }                                                                          \
    void HDF5WriterP::DoPutDeferred(Variable<T> &variable, const T *values)    \
        DoPutSyncCommon(variable, values);                                     \
    }
ADIOS2_FOREACH_TYPE_1ARG(declare_type)
#undef declare_type
guj's avatar
guj committed

template <class T>
void HDF5WriterP::DoPutSyncCommon(Variable<T> &variable, const T *values)
guj's avatar
guj committed
{
    variable.SetData(values);
    m_H5File.Write(variable, values);
guj's avatar
guj committed
}

} // end namespace adios2