Commit be37ca74 authored by Béla Wiegel's avatar Béla Wiegel Committed by Gerrit Erichsen
Browse files

Implemented HDF5 Reader into CharLGUI

    performance to be optimized yet

Bug fix in HDF5 Reader: cell finder sometimes returned more than one cell
parent 4f298247
......@@ -14,7 +14,6 @@
#include <fstream>
#define C_RESTRICTED "Implementation of HDF5 File Processing only supports specific cases. Enhancement of implementation needed."
H5Read::H5Read(QString fileLocation) :
......@@ -202,9 +201,11 @@ H5Read::~H5Read()
if (m_LatLonGrid != nullptr) delete m_LatLonGrid;
if (m_binaryFileRead != nullptr) delete m_binaryFileRead;
if (HDF5DEBUG) qDebug() << "H5 dtor called";
}
vector<float> H5Read::extractTimeSeries(QString datasetName, float lat, float lon)
vector<float> H5Read::extractTimeSeries(QString datasetName, float lat, float lon) const
{
vector<float> timeSeries;
......@@ -231,6 +232,10 @@ vector<float> H5Read::extractTimeSeries(QString datasetName, float lat, float lo
else if (foundIndices.size() > 1)
{
qCritical() << "HDF5 file processing:" << "Found more than one index:" << foundIndices.size();
for (int cell : foundIndices)
{
if (HDF5DEBUG) qDebug() << " cell coordinates:" << m_LatLonGrid->getPair(cell);
}
}
int foundIndex = foundIndices[0];
......@@ -238,7 +243,7 @@ vector<float> H5Read::extractTimeSeries(QString datasetName, float lat, float lo
int index = m_LocalHeap->getDatasetIndex(datasetName);
if (index == -1)
{
qCritical() << C_ERR << "Cannot find DatasetIndex" << datasetName;
qCritical() << C_ERR << "Cannot find DatasetIndex" << datasetName << "in file" << m_fileLocation;
return timeSeries;
}
QList<quint64> dimensionSizes = m_GroupSymbolTable->getDimensionSizes(index);
......@@ -322,7 +327,7 @@ vector<float> H5Read::extractTimeSeries(QString datasetName, float lat, float lo
return timeSeries;
}
vector<float> H5Read::extractTimeSeries(QString datasetName, int index)
vector<float> H5Read::extractTimeSeries(QString datasetName, int index) const
{
// get time series based on index in LatLon grid
......@@ -333,7 +338,7 @@ vector<float> H5Read::extractTimeSeries(QString datasetName, int index)
return extractTimeSeries(datasetName, lat, lon);
}
vector<int> H5Read::getIndicesInPolygon(QPolygonF polygon)
vector<int> H5Read::getIndicesInPolygon(QPolygonF polygon) const
{
return m_LatLonGrid->getIndicesInPolygon(polygon);
}
......@@ -343,12 +348,12 @@ void H5Read::bufferEntireFile()
m_binaryFileRead->bufferEntireFile();
}
pair<float, float> H5Read::getCoordinatesByCellIndex(int index)
pair<float, float> H5Read::getCoordinatesByCellIndex(int index) const
{
return m_LatLonGrid->getPair(index);
}
LocalHeap * H5Read::getLocalHeap()
const LocalHeap * H5Read::getLocalHeap() const
{
return m_LocalHeap;
}
......
......@@ -10,34 +10,38 @@
#include <QDataStream>
#define C_ERR "Error in HDF5 file Processing:"
#define HDF5DEBUG true
using namespace std;
class CHARLFILETOOLSSHARED_EXPORT H5Read
{
public:
H5Read() = default;
H5Read(QString fileLocation);
H5Read(const H5Read&) = default;
H5Read& operator=(const H5Read&) = default;
~H5Read();
vector<float> extractTimeSeries(QString datasetName, float lat, float lon);
vector<float> extractTimeSeries(QString datasetName, int index);
vector<int> getIndicesInPolygon(QPolygonF polygon);
vector<float> extractTimeSeries(QString datasetName, float lat, float lon) const;
vector<float> extractTimeSeries(QString datasetName, int index) const;
vector<int> getIndicesInPolygon(QPolygonF polygon) const;
void bufferEntireFile();
pair<float, float> getCoordinatesByCellIndex(int index);
pair<float, float> getCoordinatesByCellIndex(int index) const;
LocalHeap * getLocalHeap();
const LocalHeap * getLocalHeap() const;
bool ok() const;
private:
QString m_fileLocation;
BinaryFileRead * m_binaryFileRead;
BinaryFileRead * m_binaryFileRead = nullptr;
LocalHeap * m_LocalHeap;
GroupSymbolTable * m_GroupSymbolTable;
LatLonGrid * m_LatLonGrid;
LocalHeap * m_LocalHeap = nullptr;
GroupSymbolTable * m_GroupSymbolTable = nullptr;
LatLonGrid * m_LatLonGrid = nullptr;
bool m_ok;
};
......
......@@ -63,6 +63,15 @@ int LatLonGrid::getSize()
return (int)m_data.size();
}
QPointF LatLonGrid::getLonLat(int index)
{
pair<float, float> pair = getPair(index);
QPointF p;
p.setX(pair.second);
p.setY(pair.first);
return p;
}
std::pair<float, float> operator -(const std::pair<float, float>& a, const std::pair<float, float>& b)
{
return std::make_pair(a.first - b.first, a.second - b.second);
......@@ -88,29 +97,50 @@ pair<float, float> operator * (const std::pair<float, float> &a, const float &fa
return make_pair(a.first * factor, a.second * factor);
}
//bool LatLonGrid::inCell(int index, float lat, float lon)
//{
// pair<float, float> latlonBL = getPair(index);
// int indexTop = top(index);
// int indexRight = right(index);
// if (indexTop == -1 || indexRight == -1)
// return false;
// pair<float, float> latlonT = getPair(indexTop);
// pair<float, float> latlonR = getPair(indexRight);
// pair<float, float> delta = make_pair(lat, lon) - latlonBL;
// pair<float, float> deltaV = latlonT - latlonBL;
// pair<float, float> deltaH = latlonR - latlonBL;
// pair<float, float> deltaVH = deltaV + deltaH;
// if (delta < make_pair(0.1, 0.1) && delta > make_pair(-0.1, -0.1))
// int hjk = 10;
// if (delta < deltaVH && (delta > make_pair(0.0, 0.0) || delta == make_pair(0.0, 0.0)))
// return true;
// else
// return false;
//}
bool LatLonGrid::inCell(int index, float lat, float lon)
{
pair<float, float> latlonBL = getPair(index);
int indexTop = top(index);
int indexRight = right(index);
if (indexTop == -1 || indexRight == -1)
int indexTopRight = top(indexRight);
if (indexTop == -1 || indexRight == -1 || indexTopRight == -1)
return false;
pair<float, float> latlonT = getPair(indexTop);
pair<float, float> latlonR = getPair(indexRight);
QPolygonF rhombus;
rhombus
<< getLonLat(index)
<< getLonLat(indexTop)
<< getLonLat(indexTopRight)
<< getLonLat(indexRight);
pair<float, float> delta = make_pair(lat, lon) - latlonBL;
pair<float, float> deltaV = latlonT - latlonBL;
pair<float, float> deltaH = latlonR - latlonBL;
pair<float, float> deltaVH = deltaV + deltaH;
QPointF p(lon, lat);
if (delta < make_pair(0.1, 0.1) && delta > make_pair(-0.1, -0.1))
int hjk = 10;
if (delta < deltaVH && (delta > make_pair(0.0, 0.0) || delta == make_pair(0.0, 0.0)))
return true;
else
return false;
return rhombus.containsPoint(p, Qt::OddEvenFill);
}
int LatLonGrid::right(int index)
......@@ -136,16 +166,16 @@ int LatLonGrid::bottom(int index)
return newIndex;
}
const int LatLonGrid::top(int index)
int LatLonGrid::top(int index)
{
if (getXY(index).second == 0)
return -1;
int newIndex = index - 1;
if (getXY(newIndex) == pair<int, int>(-1, -1))
return -1;
if (getXY(newIndex).second == 0)
return -1;
return newIndex;
}
......@@ -174,7 +204,7 @@ vector<int> LatLonGrid::getIndicesInPolygon(QPolygonF polygon)
foundIndices.push_back((int)i);
}
// qDebug() << "Elapsed time for finding cells in polygon:" << timer.restart();
// if (HDF5DEBUG) qDebug() << "Elapsed time for finding cells in polygon:" << timer.restart();
m_doneIndicesInPolygonRequests.insert(abstractedPolygon, foundIndices);
......
......@@ -16,11 +16,12 @@ public:
int getIndex(int x, int y);
pair<int, int> getXY(int index);
int getSize();
QPointF getLonLat(int index);
bool inCell(int index, float lat, float lon);
int right(int index);
int bottom(int index);
const int top(int index);
int top(int index);
vector<int> getIndicesInPolygon(QPolygonF polygon);
......
#include "MessageAttribute.h"
#define HDF5DEBUG true
MessageAttribute::MessageAttribute(QDataStream * stream) : Message(stream)
{
qDebug() << "MessageAttribute: Begin" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << "MessageAttribute: Begin" << m_stream->device()->pos();
*m_stream
>> m_Version;
......@@ -37,7 +39,7 @@ MessageAttribute::MessageAttribute(QDataStream * stream) : Message(stream)
m_dataSpace = new MessageDataSpace(m_stream);
fillUp8ByteBoundary(m_DataspaceSize);
qDebug() << "MessageAttribute: Begin of Data" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << "MessageAttribute: Begin of Data" << m_stream->device()->pos();
m_Data = std::vector<uchar>(m_dataType->size());
for (int i = 0; i < m_dataType->size(); ++i)
......
......@@ -2,6 +2,8 @@
#include <QDebug>
#define HDF5DEBUG true
const QString _C_ERR = "Error in HDF5 file Processing (ObjectHeader Version 1):";
ObjectHeaderV1::ObjectHeaderV1(QDataStream * stream, BinaryFileRead * binaryFileRead) :
......@@ -11,7 +13,7 @@ ObjectHeaderV1::ObjectHeaderV1(QDataStream * stream, BinaryFileRead * binaryFile
m_binaryFileRead(binaryFileRead)
{
m_startBit = stream->device()->pos();
qDebug() << "Begin ObjectHeader:" << m_startBit;
if (HDF5DEBUG) qDebug() << "Begin ObjectHeader:" << m_startBit;
*stream >> m_version;
if (m_version != 1)
......@@ -33,7 +35,7 @@ void ObjectHeaderV1::processStream(bool continued)
{
if (!continued)
{
qDebug() << "+++ +++ Start processing of Object Header. +++ +++ ";
if (HDF5DEBUG) qDebug() << "+++ +++ Start processing of Object Header. +++ +++ ";
}
while (!atEnd())
......@@ -52,38 +54,38 @@ void ObjectHeaderV1::processStream(bool continued)
switch (messageType)
{
case 0x0000: // NIL Message
qDebug() << " + Found Message: NIL. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: NIL. At" << m_stream->device()->pos();
break;
case 0x0001: // Dataspace Message
qDebug() << " + Found Message: Dataspace. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Dataspace. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
m_dataspace = new MessageDataSpace(m_stream, sizeOfHeaderMessageData);
break;
case 0x0003: // Datatype Message
qDebug() << " + Found Message: Datatype. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Datatype. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
m_datatype = new MessageDataType(m_stream);
break;
case 0x0005: // Data Storage - Fill Value Message
qDebug() << " + Found Message: Fill Value. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Fill Value. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
m_fillValue = new MessageFillValue(m_stream);
break;
case 0x0008: // Data Layout Message
qDebug() << " + Found Message: Data Layout. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Data Layout. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
m_dataLayout = new MessageDataLayout(m_stream);
break;
case 0x0010: // Continuation Message
qDebug() << " + Found Message: Continuation. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Continuation. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
......@@ -110,7 +112,7 @@ void ObjectHeaderV1::processStream(bool continued)
break;
case 0x0011: // B-Tree Message
{
qDebug() << " + Found Message: B-Tree. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: B-Tree. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
......@@ -119,7 +121,7 @@ void ObjectHeaderV1::processStream(bool continued)
break;
case 0x0012: // Object Modification Time Message
{
qDebug() << " + Found Message: Object Modification Time Message. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Object Modification Time Message. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
......@@ -128,7 +130,7 @@ void ObjectHeaderV1::processStream(bool continued)
break;
case 0x000C: // Attribute Message
{
qDebug() << " + Found Message: Attribute. At" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << " + Found Message: Attribute. At" << m_stream->device()->pos();
*m_stream >> headerMessageFlags;
m_stream->skipRawData(3);
......@@ -157,18 +159,18 @@ void ObjectHeaderV1::processStream(bool continued)
quint32 pos = m_stream->device()->pos();
quint8 remaining = fillUp8ByteBoundary(pos - m_startBit);
qDebug() << "Length of ObjectHeader:" << pos - m_startBit << "| Remaining to 8-byte boundary:" << remaining;
qDebug() << "Position after ObjectHeader:" << m_stream->device()->pos();
if (HDF5DEBUG) qDebug() << "Length of ObjectHeader:" << pos - m_startBit << "| Remaining to 8-byte boundary:" << remaining;
if (HDF5DEBUG) qDebug() << "Position after ObjectHeader:" << m_stream->device()->pos();
if (m_foundHeaderMessages < m_TotalNumberOfHeaderMessages)
qDebug() << "ObjectHeader processing ended before processing of total number of header messages:"
if (HDF5DEBUG) qDebug() << "ObjectHeader processing ended before processing of total number of header messages:"
<< QString::number(m_foundHeaderMessages) + " of " + QString::number(m_TotalNumberOfHeaderMessages) << "\n";
if (m_status == FAILURE)
qDebug() << _C_ERR << "Ended with Error.";
if (HDF5DEBUG) qDebug() << _C_ERR << "Ended with Error.";
m_status = OK;
qDebug() << "+++ Finished processing of Object Header\n";
if (HDF5DEBUG) qDebug() << "+++ Finished processing of Object Header\n";
}
bool ObjectHeaderV1::atEnd()
......
......@@ -11,12 +11,6 @@
#define C_RESTRICTED "Implementation of HDF5 File Processing only supports specific cases. Enhancement of implementation needed."
#ifndef D
#define D if(DEBUG)
#endif
static const bool DEBUG = true;
class ObjectHeaderV1
{
public:
......
#include "Superblock.h"
#define HDF5DEBUG true
Superblock::Superblock(QDataStream * stream, BinaryFileRead * binaryFileRead) :
m_ok(false)
{
......@@ -8,7 +10,7 @@ Superblock::Superblock(QDataStream * stream, BinaryFileRead * binaryFileRead) :
// Find format signature (assume it at beginning of file)
bool equal = true;
qDebug() << stream->device()->size();
if (HDF5DEBUG) qDebug() << stream->device()->size();
for (int i = 0; i < 8; i++)
{
*stream >> m_formatSignature[i];
......
......@@ -73,6 +73,20 @@ HEADERS += CharLGui.h \
WindowLocationsCreator.h \
PlantDataReaderDialog.h
#CharLFileTools
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../CharLFileTools/release/ -lCharLFileTools
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../CharLFileTools/debug/ -lCharLFileTools
else:unix: LIBS += -L$$OUT_PWD/../CharLFileTools/ -lCharLFileTools
INCLUDEPATH += $$PWD/../CharLFileTools
DEPENDPATH += $$PWD/../CharLFileTools
#MapGraphics_CharL
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../MapGraphics_CharL/release/ -lMapGraphics_CharL
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../MapGraphics_CharL/debug/ -lMapGraphics_CharL
else:unix: LIBS += -L$$OUT_PWD/../MapGraphics_CharL/ -lMapGraphics_CharL
INCLUDEPATH += $$PWD/../MapGraphics_CharL
DEPENDPATH += $$PWD/../MapGraphics_CharL
#Algorithm itself
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../CharLAlgorithm/release/ -lCharLAlgorithm
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../CharLAlgorithm/debug/ -lCharLAlgorithm
......@@ -80,6 +94,9 @@ else:unix: LIBS += -L$$OUT_PWD/../CharLAlgorithm/ -lCharLAlgorithm
INCLUDEPATH += $$PWD/../CharLAlgorithm
DEPENDPATH += $$PWD/../CharLAlgorithm
#Eigen
INCLUDEPATH += $$PWD/../../libs/src/Eigen3/Eigen
#CoinUtils
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../libs/CoinUtils/release/ -lCoinUtils
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../libs/CoinUtils/debug/ -lCoinUtils
......@@ -120,24 +137,6 @@ USE_GUROBI{
DEPENDPATH += 'C:/gurobi702/win64/include'
}
#Eigen
INCLUDEPATH += $$PWD/../../libs/src/Eigen3/Eigen
#CharLFileTools
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../CharLFileTools/release/ -lCharLFileTools
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../CharLFileTools/debug/ -lCharLFileTools
else:unix: LIBS += -L$$OUT_PWD/../CharLFileTools/ -lCharLFileTools
INCLUDEPATH += $$PWD/../CharLFileTools
DEPENDPATH += $$PWD/../CharLFileTools
#MapGraphics_CharL
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../MapGraphics_CharL/release/ -lMapGraphics_CharL
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../MapGraphics_CharL/debug/ -lMapGraphics_CharL
else:unix: LIBS += -L$$OUT_PWD/../MapGraphics_CharL/ -lMapGraphics_CharL
INCLUDEPATH += $$PWD/../MapGraphics_CharL
DEPENDPATH += $$PWD/../MapGraphics_CharL
RESOURCES += \
images.qrc \
data.qrc
......@@ -13,6 +13,8 @@
#include "PlantDataReaderDialog.h"
#include "PolygonCalculations.h"
#include <WeatherDataCalculations/WeatherDataFunctions.h>
CharLGui::CharLGui(QWidget *parent)
: QMainWindow(parent),
m_algorithm()
......@@ -45,6 +47,94 @@ void CharLGui::onLockConfiguration(bool locked)
if (!m_modelLocations->matchLocationsToNodes())
qWarning() << "Attention: matching Locations and Nodes failed.";
}
// following constants should be defined in Preferences
const bool getMean = false;
const bool bufferFile = true;
// read data from HDF5 files
// iterate every data type on it's own to reduce memory usage due to file buffering
for (int i = 0; i < m_modelLocations->rowCount(); i++)
{
LocationsTableItem * location = m_modelLocations->getMutableItem(i);
if (location == nullptr)
continue;
// wind data
if (location->getWindDataIndex() >= 0 && location->getWindDataIndex() < m_modelWindData->rowCount())
{
const DataTableItem * dataItem = static_cast<const DataTableItem*>(m_modelWindData->getItem(location->getWindDataIndex()));
if (dataItem->getDataFileH5()->ok() && dataItem->getDataFileTwoH5()->ok())
{
// buffer file
if (bufferFile)
{
dataItem->getDataFileH5()->bufferEntireFile();
dataItem->getDataFileTwoH5()->bufferEntireFile();
}
// zonal wind
vector<float> data = getMean ?
WeatherDataFunctions::readDataMean(*dataItem->getDataFileH5(), WeatherDataFunctions::Wind, 2, location->getMapPolygon()):
WeatherDataFunctions::readDataCentroid(*dataItem->getDataFileH5(), WeatherDataFunctions::Wind, 2, location->getLatitude(), location->getLongitude());
getMean ? location->setWeatherWindZMean(data) : location->setWeatherWindZCenter(data);
// meridional wind
data = getMean ?
WeatherDataFunctions::readDataMean(*dataItem->getDataFileTwoH5(), WeatherDataFunctions::Wind, 1, location->getMapPolygon()):
WeatherDataFunctions::readDataCentroid(*dataItem->getDataFileTwoH5(), WeatherDataFunctions::Wind, 1, location->getLatitude(), location->getLongitude());
getMean ? location->setWeatherWindMMean(data) : location->setWeatherWindMCenter(data);
}
}
}
for (int i = 0; i < m_modelLocations->rowCount(); i++)
{
LocationsTableItem * location = m_modelLocations->getMutableItem(i);
if (location == nullptr)
continue;
// solar data
if (location->getSolarDataIndex() >= 0 && location->getSolarDataIndex() < m_modelSolarData->rowCount())
{
const DataTableItem * dataItem = static_cast<const DataTableItem*>(m_modelSolarData->getItem(location->getSolarDataIndex()));
if (dataItem->getDataFileH5()->ok() && dataItem->getDataFileTwoH5()->ok())
{
// direct irradiation
vector<float> data = getMean ?
WeatherDataFunctions::readDataMean(*dataItem->getDataFileH5(), WeatherDataFunctions::Irradiation, 1, location->getMapPolygon()):
WeatherDataFunctions::readDataCentroid(*dataItem->getDataFileH5(), WeatherDataFunctions::Irradiation, 1, location->getLatitude(), location->getLongitude());
getMean ? location->setWeatherIrrDirMean(data) : location->setWeatherIrrDirCenter(data);
// diffuse irradiation
data = getMean ?
WeatherDataFunctions::readDataMean(*dataItem->getDataFileTwoH5(), WeatherDataFunctions::Irradiation, 2, location->getMapPolygon()):
WeatherDataFunctions::readDataCentroid(*dataItem->getDataFileTwoH5(), WeatherDataFunctions::Irradiation, 2, location->getLatitude(), location->getLongitude());
getMean ? location->setWeatherIrrDifMean(data) : location->setWeatherIrrDifCenter(data);
}
}
}
for (int i = 0; i < m_modelLocations->rowCount(); i++)
{
LocationsTableItem * location = m_modelLocations->getMutableItem(i);
if (location == nullptr)
continue;
// temperature data
if (location->getTemperatureDataIndex() >= 0 && location->getTemperatureDataIndex() < m_modelTemperatureData->rowCount())
{
const DataTableItem * dataItem = static_cast<const DataTableItem*>(m_modelTemperatureData->getItem(location->getTemperatureDataIndex()));
if (dataItem->getDataFileH5()->ok() && dataItem->getDataFileTwoH5()->ok())
{
// temperature
vector<float> data = getMean ?
WeatherDataFunctions::readDataMean(*dataItem->getDataFileH5(), WeatherDataFunctions::Temperature, 1, location->getMapPolygon()):
WeatherDataFunctions::readDataCentroid(*dataItem->getDataFileH5(), WeatherDataFunctions::Temperature, 1, location->getLatitude(), location->getLongitude());
getMean ? location->setWeatherTempMean(data) : location->setWeatherTempCenter(data);
}
}
}
}
void CharLGui::onRunClicked(bool clicked)
......
......@@ -6,8 +6,6 @@
#include "SimulationPreferences.h"
#include "HDF5/H5Read.h"
//////////////////////////////////////////
/// ITEM IMPLEMENTATION ///////////////////////////////////////////////////////////////////////
//////////////////////////////////////////
......@@ -21,7 +19,11 @@ DataTableItem::DataTableItem(const Preferences * preferences, QString name, bool
m_dataFileTwo(fileNameTwo),
m_dataForecastFile(fileNameForecast),
m_dataForecastFileTwo(fileNameForecastTwo),