From 6a09d2aa47b13b895769f05f3cec1ca439ff8e00 Mon Sep 17 00:00:00 2001
From: rinkk <karsten.rink@ufz.de>
Date: Thu, 29 Aug 2019 12:07:02 +0200
Subject: [PATCH] work state with zlib linking error

---
 .../DataExplorer/NetCdfDialog/CMakeLists.txt  |  11 +-
 .../NetCdfDialog/NetCdfConfigureDialog.cpp    | 144 ++++++++++--------
 .../NetCdfDialog/NetCdfConfigureDialog.h      |   6 +-
 scripts/cmake/Find.cmake                      |   2 +
 4 files changed, 95 insertions(+), 68 deletions(-)

diff --git a/Applications/DataExplorer/NetCdfDialog/CMakeLists.txt b/Applications/DataExplorer/NetCdfDialog/CMakeLists.txt
index 68c16fb9c32..c34b1332692 100644
--- a/Applications/DataExplorer/NetCdfDialog/CMakeLists.txt
+++ b/Applications/DataExplorer/NetCdfDialog/CMakeLists.txt
@@ -4,15 +4,16 @@ if(BUILD_SHARED_LIBS)
             LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 endif()
 target_link_libraries(NetCdfDialogLib
-                      PUBLIC Qt5::Widgets
-                      PRIVATE MathLib vtknetcdfcpp)
+                      PUBLIC Qt5::Widgets ${ZLIB_LIBRARIES}
+                      PRIVATE MathLib ${NETCDF_LIBRARIES_C}
+                              ${NETCDF_LIBRARIES_CXX} ${HDF5_LIBRARIES})
 set_property(TARGET NetCdfDialogLib PROPERTY FOLDER "DataExplorer")
 
 # Workaround for system installed VTK (tested on arch)
 if(NOT OGS_USE_CONAN)
-    target_include_directories(
-        NetCdfDialogLib SYSTEM
-        PUBLIC ${VTK_INSTALL_PREFIX}/include/vtk/vtknetcdfcpp)
+    target_include_directories(NetCdfDialogLib SYSTEM
+                               PUBLIC ${NETCDF_INCLUDES_C}
+                               PUBLIC ${NETCDF_INCLUDES_CXX})
 endif()
 
 add_autogen_include(NetCdfDialogLib)
diff --git a/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.cpp b/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.cpp
index 23458e16ca4..49fd033f722 100644
--- a/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.cpp
+++ b/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.cpp
@@ -21,16 +21,18 @@
 
 #include <vtkImageImport.h>
 
+using namespace netCDF;
+
 // Constructor
 NetCdfConfigureDialog::NetCdfConfigureDialog(std::string const& fileName, QDialog* parent)
-: QDialog(parent), _currentFile(new NcFile(fileName.c_str(), NcFile::ReadOnly)),
+    : QDialog(parent), _currentFile(fileName.c_str(), NcFile::read),
   _currentInitialDateTime(QDateTime()), _currentMesh(nullptr), _currentRaster(nullptr), _currentPath(fileName)
 {
     setupUi(this);
 
     int const idx = setVariableSelect(); // set up variables of the file in the combobox
     comboBoxVariable->setCurrentIndex(idx); //pre-select the variable with the biggest number of dimensions...valueWithMaxDim()
-    _currentVar = _currentFile->get_var(idx);
+    _currentVar = _currentFile.getVar(comboBoxVariable->itemText(idx).toStdString());
 
     setDimensionSelect();
 
@@ -45,7 +47,7 @@ NetCdfConfigureDialog::~NetCdfConfigureDialog() = default;
 void NetCdfConfigureDialog::accept()
 {
     QMessageBox valueErrorBox;
-    if (_currentVar->num_dims() < 2){
+    if (_currentVar.getDimCount() < 2){
         valueErrorBox.setText("Selected Variable has not enough dimensions.");
         valueErrorBox.exec();
     }else if (doubleSpinBoxDim2Start->value() == doubleSpinBoxDim2Start->maximum()){
@@ -56,7 +58,6 @@ void NetCdfConfigureDialog::accept()
         valueErrorBox.exec();
     }else{
         createDataObject();
-        delete _currentFile;
         this->done(QDialog::Accepted);
     }
 }
@@ -64,13 +65,13 @@ void NetCdfConfigureDialog::accept()
 // Instructions if the Cancel-Button has been pressed.
 void NetCdfConfigureDialog::reject()
 {
-    delete _currentFile;
     this->done(QDialog::Rejected);
 }
 
 void NetCdfConfigureDialog::on_comboBoxVariable_currentIndexChanged(int id)
 {
-    _currentVar = _currentFile->get_var(_id_map[id]);
+    std::string const var_name = comboBoxVariable->itemText(_id_map[id]).toStdString();
+    _currentVar = _currentFile.getVar(var_name);
     setDimensionSelect();
 }
 
@@ -89,7 +90,7 @@ void NetCdfConfigureDialog::on_comboBoxDim1_currentIndexChanged(int id)
 //set up y-axis/lon
 void NetCdfConfigureDialog::on_comboBoxDim2_currentIndexChanged(int id)
 {
-    if (_currentVar->num_dims() > 1)
+    if (_currentVar.getDimCount() > 1)
     {
         if (id == -1) id = 0;
         double firstValue=0, lastValue=0;
@@ -103,7 +104,7 @@ void NetCdfConfigureDialog::on_comboBoxDim2_currentIndexChanged(int id)
 //set up time
 void NetCdfConfigureDialog::on_comboBoxDim3_currentIndexChanged(int id)
 {
-    if (_currentVar->num_dims() > 2)
+    if (_currentVar.getDimCount() > 2)
     {
         if (id == -1) id = 0;
         double firstValue=0, lastValue=0;
@@ -141,7 +142,7 @@ void NetCdfConfigureDialog::on_comboBoxDim3_currentIndexChanged(int id)
 //set up additional dimension
 void NetCdfConfigureDialog::on_comboBoxDim4_currentIndexChanged(int id)
 {
-    if (_currentVar->num_dims() > 3)
+    if (_currentVar.getDimCount() > 3)
     {
         if (id == -1) id = 0;
         double firstValue=0, lastValue=0;
@@ -158,17 +159,20 @@ int NetCdfConfigureDialog::setVariableSelect()
 {
     int max_dim = 0;
     int max_dim_idx = 0;
-    auto const n_vars = _currentFile->num_vars();
-    for (int i = 0; i < n_vars; i++)
+    auto const& names =_currentFile.getVars();
+    //auto const n_vars = _currentFile.getVarCount();
+    //for (int i = 0; i < n_vars; i++)
+    for (auto it = names.cbegin(); it != names.cend(); ++it)
     {
-        NcVar const& focusedVar = *_currentFile->get_var(i);
-        if (focusedVar.num_dims() > 1)
+        //NcVar const& focusedVar = _currentFile.getVar(i);
+        int const var_dim_count = it->second.getDimCount();
+        if (var_dim_count > 1)
         {
-            _id_map.push_back(i);
-            comboBoxVariable->addItem(focusedVar.name());
-            if (focusedVar.num_dims() > max_dim)
+            //_id_map.push_back(i);
+            comboBoxVariable->addItem(QString::fromStdString(it->first));
+            if (var_dim_count > max_dim)
             {
-                max_dim = focusedVar.num_dims();
+                max_dim = var_dim_count;
                 max_dim_idx = comboBoxVariable->count() - 1;
             }
         }
@@ -178,7 +182,7 @@ int NetCdfConfigureDialog::setVariableSelect()
 
 void NetCdfConfigureDialog::setDimensionSelect()
 {
-    int const dim = _currentVar->num_dims();
+    int const dim = _currentVar.getDimCount();
     std::array<QComboBox*,4> dim_box = {{ comboBoxDim1, comboBoxDim2, comboBoxDim3, comboBoxDim4 }};
 
     for (int i = 0; i < 4; ++i)
@@ -190,7 +194,7 @@ void NetCdfConfigureDialog::setDimensionSelect()
     for (int i=0; i < dim; ++i) //write dimension-names into selection-boxes
     {
         for (int j = 0; j < dim; ++j)
-            dim_box[j]->addItem(_currentVar->get_dim(i)->name());
+            dim_box[j]->addItem(QString::fromStdString(_currentVar.getDim(i).getName()));
     }
     comboBoxDim1->setCurrentIndex(dim-2);
     on_comboBoxDim1_currentIndexChanged(dim-2);
@@ -218,29 +222,36 @@ void NetCdfConfigureDialog::setDimensionSelect()
 
 void NetCdfConfigureDialog::getDimEdges(int dimId, unsigned &size, double &firstValue, double &lastValue)
 {
-    if ((_currentFile->get_var(_currentVar->get_dim(dimId)->name())) != nullptr)
+    size = 0;
+    firstValue = 0;
+    lastValue = 0;
+    if (_currentFile.getVar(_currentVar.getDim(dimId).getName()).isNull())
+        return;
+
+    NcVar const& tmpVarOfDim = _currentFile.getVar(_currentVar.getDim(dimId).getName());
+    if ((tmpVarOfDim.getDimCount()) == 1)
     {
-        NcVar *tmpVarOfDim = _currentFile->get_var(_currentVar->get_dim(dimId)->name());
-        if ((tmpVarOfDim->num_dims()) == 1)
-        {
-            int sizeOfDim = tmpVarOfDim->get_dim(0)->size();
-            size = sizeOfDim;
-            double *arrayOfDimStart = new double[1]; //[1] = {0};
-            long edgeOfArray = 1; //[1] = {1};
-            long edgeOrigin[1] = {0};
-            tmpVarOfDim->set_cur(edgeOrigin);
-            tmpVarOfDim->get(arrayOfDimStart,edgeOfArray);
-            firstValue = arrayOfDimStart[0];
-            double arrayOfDimEnd[1] = {0};
-            edgeOrigin[0] = sizeOfDim - 1;
-            tmpVarOfDim->set_cur(edgeOrigin);
-            tmpVarOfDim->get(arrayOfDimEnd,edgeOfArray);
-            lastValue = arrayOfDimEnd[0];
-        }
-    }else{
-        size = 0;
-        firstValue = 0;
-        lastValue = 0;
+        /*
+        int sizeOfDim = tmpVarOfDim.getDim(0).getSize();
+        size = sizeOfDim;
+        double *arrayOfDimStart = new double[1]; //[1] = {0};
+        long edgeOfArray = 1; //[1] = {1};
+        long edgeOrigin[1] = {0};
+        tmpVarOfDim.set_cur(edgeOrigin);
+        tmpVarOfDim->get(arrayOfDimStart,edgeOfArray);
+        firstValue = arrayOfDimStart[0];
+        double arrayOfDimEnd[1] = {0};
+        edgeOrigin[0] = sizeOfDim - 1;
+        tmpVarOfDim->set_cur(edgeOrigin);
+        tmpVarOfDim->get(arrayOfDimEnd,edgeOfArray);
+        lastValue = arrayOfDimEnd[0];
+        */
+        size = tmpVarOfDim.getDim(0).getSize();
+        std::vector<std::size_t> start_val{{0}};
+        std::vector<std::size_t> length{{1}};
+        tmpVarOfDim.getVar(start_val, length, &firstValue);
+        start_val[0] = size-1;
+        tmpVarOfDim.getVar(start_val, length, &lastValue);
     }
 }
 
@@ -264,33 +275,45 @@ long NetCdfConfigureDialog::convertDateToMinutes(QDateTime initialDateTime, QDat
 
 int NetCdfConfigureDialog::getTimeStep()
 {
-    NcVar* timeVar = _currentFile->get_var(comboBoxDim2->currentIndex());
+    NcVar const& timeVar =
+        _currentFile.getVar(comboBoxDim2->currentText().toStdString());
 
     double const datesToMinutes = convertDateToMinutes(_currentInitialDateTime,dateTimeEditDim3->date(),dateTimeEditDim3->time());
 
     double timeArray[1] = {datesToMinutes};
-    double currentTime = timeVar->get_index(timeArray);
+    /*
+    double currentTime = timeVar.get_index(timeArray);
     if (currentTime < 0) currentTime=0; //if the value isn't found in the array, set it to 0 as default...
     return static_cast<int>(currentTime);
+    */
+    /** TODO **/
+    return 0;
 }
 
 int NetCdfConfigureDialog::getDim4() const
 {
-    NcVar* dim3Var = _currentFile->get_var(comboBoxDim4->currentIndex());
+    /** TODO **/
+    /*
+    NcVar const& dim3Var =
+        _currentFile.getVar(comboBoxDim4->currentText().toStdString());
     int timeArray[1] = {spinBoxDim4->value()};
-    int currentValueDim3 = dim3Var->get_index(timeArray);
-    if (currentValueDim3 < 0) currentValueDim3=0; //if the value isn't found in the array, set it to 0 as default...
+    int currentValueDim3 = dim3Var.get_index(timeArray);
+    if (currentValueDim3 < 0)
+        currentValueDim3=0; //if the value isn't found in the array, set it to 0 as default...
     return currentValueDim3;
+    */
+    return 0;
 }
 
 double NetCdfConfigureDialog::getResolution()
 {
     if (comboBoxDim1->currentIndex() > -1)
     {
-        NcVar* latVar = _currentFile->get_var(comboBoxDim1->currentIndex());
+        NcVar const& latVar =
+            _currentFile.getVar(comboBoxDim1->currentText().toStdString());
         double firstValue = 0, lastValue = 0;
         unsigned size = 0;
-        getDimEdges(latVar->id(), size, firstValue, lastValue);
+        getDimEdges(latVar.getId(), size, firstValue, lastValue);
         if (size < 2)
         {
             return 1;
@@ -306,7 +329,7 @@ double NetCdfConfigureDialog::getResolution()
 
 void NetCdfConfigureDialog::createDataObject()
 {
-    auto* length = new std::size_t[_currentVar->num_dims()];
+    auto* length = new std::size_t[_currentVar.getDimCount()];
     double originLon = 0, originLat = 0;
     double lastLon = 0, lastLat = 0;
     unsigned sizeLon = 0, sizeLat = 0;
@@ -314,7 +337,7 @@ void NetCdfConfigureDialog::createDataObject()
     getDimEdges(comboBoxDim2->currentIndex(), sizeLon, originLon, lastLon);
 
 
-    for(int i=0; i < _currentVar->num_dims(); i++) length[i]=1;
+    for(int i=0; i < _currentVar.getDimCount(); i++) length[i]=1;
 
     // set array edges: lat x lon
     length[comboBoxDim1->currentIndex()]=sizeLat;
@@ -325,18 +348,21 @@ void NetCdfConfigureDialog::createDataObject()
     for(std::size_t i=0; i < (sizeLat*sizeLon); i++) data_array[i]=0;
 
     //Time-Dimension:
-    if (_currentVar->num_dims() > 2)
+    /*
+    if (_currentVar.getDimCount() > 2)
     {
-        auto* newOrigin = new long[_currentVar->num_dims()];
-        for (int i=0; i < _currentVar->num_dims(); i++) newOrigin[i]=0;
+        auto* newOrigin = new long[_currentVar.getDimCount()];
+        for (int i=0; i < _currentVar.getDimCount(); i++) newOrigin[i]=0;
         newOrigin[comboBoxDim3->currentIndex()] = getTimeStep(); //set origin to selected time
-        _currentVar->set_cur(newOrigin);
+        _currentVar.set_cur(newOrigin);
         //Dimension 4:
-        if (_currentVar->num_dims() > 3) newOrigin[comboBoxDim4->currentIndex()] = getDim4(); //if there are is a 4th dimension
+        if (_currentVar.getDimCount() > 3) newOrigin[comboBoxDim4->currentIndex()] = getDim4(); //if there are is a 4th dimension
         delete [] newOrigin;
     }
-
-    _currentVar->get(data_array,length); //create Array of Values
+    */
+    std::vector<std::size_t> data_origin {{0, 0}};
+    std::vector<std::size_t> data_length {{sizeLat, sizeLon}};
+    _currentVar.getVar(data_origin, data_length, data_array);  // create Array of Values
 
     for (std::size_t i=0; i < (sizeLat*sizeLon); i++)
     {
@@ -371,7 +397,7 @@ void NetCdfConfigureDialog::createDataObject()
             useIntensity = MeshLib::UseIntensityAs::DATAVECTOR;
         }
         _currentMesh = MeshLib::RasterToMesh::convert(
-            data_array, header, meshElemType, useIntensity, _currentVar->name());
+            data_array, header, meshElemType, useIntensity, _currentVar.getName());
     }
     else
     {
@@ -439,5 +465,3 @@ void NetCdfConfigureDialog::on_radioMesh_toggled(bool isTrue)
         this->comboBoxUseIntensity->setEnabled(true);
     }
 }
-
-
diff --git a/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.h b/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.h
index eb23e363acd..829384c4e85 100644
--- a/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.h
+++ b/Applications/DataExplorer/NetCdfDialog/NetCdfConfigureDialog.h
@@ -9,7 +9,7 @@
 
 #pragma once
 
-#include <netcdfcpp.h>
+#include <netcdf>
 
 #include <QDialog>
 #include "ui_NetCdfConfigure.h"
@@ -65,8 +65,8 @@ private:
     QString setName();
     void reverseNorthSouth(double* data, std::size_t width, std::size_t height);
 
-    NcFile *_currentFile;
-    NcVar *_currentVar;
+    netCDF::NcFile _currentFile;
+    netCDF::NcVar _currentVar;
     QDateTime _currentInitialDateTime;
     MeshLib::Mesh* _currentMesh;
     VtkGeoImageSource* _currentRaster;
diff --git a/scripts/cmake/Find.cmake b/scripts/cmake/Find.cmake
index 254955b29e1..ca1fe4811f2 100644
--- a/scripts/cmake/Find.cmake
+++ b/scripts/cmake/Find.cmake
@@ -106,6 +106,8 @@ if(OGS_USE_NETCDF)
     set(NETCDF_ROOT ${CONAN_NETCDF-C_ROOT})
     set(NETCDF_CXX_ROOT ${CONAN_NETCDF-CXX_ROOT})
     find_package(NetCDF REQUIRED)
+    find_package(HDF5 REQUIRED)
+    find_package(ZLIB REQUIRED)
 endif()
 
 # lapack
-- 
GitLab