From bf627c3cf23f30e4f950b273b036e9e2e41f05f2 Mon Sep 17 00:00:00 2001 From: ftomei Date: Mon, 29 Jul 2024 20:34:05 +0200 Subject: [PATCH] update 3D --- agrolib/soilFluxes3D/header/soilFluxes3D.h | 1 + agrolib/soilFluxes3D/soilFluxes3D.cpp | 27 ++- bin/CRITERIA3D/CRITERIA3D.pro | 2 + bin/CRITERIA3D/criteria3DProject.cpp | 27 ++- bin/CRITERIA3D/dialogWaterFluxesSettings.cpp | 57 +++-- bin/CRITERIA3D/dialogWaterFluxesSettings.h | 22 +- bin/CRITERIA3D/mainwindow.cpp | 241 +++++++------------ bin/CRITERIA3D/mainwindow.h | 128 ++++------ bin/CRITERIA3D/mainwindow.ui | 68 +----- bin/CRITERIA3D/shared/project3D.cpp | 43 +++- bin/CRITERIA3D/shared/project3D.h | 6 +- 11 files changed, 276 insertions(+), 346 deletions(-) diff --git a/agrolib/soilFluxes3D/header/soilFluxes3D.h b/agrolib/soilFluxes3D/header/soilFluxes3D.h index 7341310c6..28d51d5ad 100644 --- a/agrolib/soilFluxes3D/header/soilFluxes3D.h +++ b/agrolib/soilFluxes3D/header/soilFluxes3D.h @@ -51,6 +51,7 @@ // WATER __EXTERN int DLL_EXPORT __STDCALL setHydraulicProperties(int waterRetentionCurve, int conductivityMeanType, float horizVertRatioConductivity); __EXTERN int DLL_EXPORT __STDCALL setWaterContent(long index, double myWaterContent); + __EXTERN int DLL_EXPORT __STDCALL setDegreeOfSaturation(long nodeIndex, double degreeOfSaturation); __EXTERN int DLL_EXPORT __STDCALL setMatricPotential(long index, double psi); __EXTERN int DLL_EXPORT __STDCALL setTotalPotential(long index, double totalPotential); __EXTERN int DLL_EXPORT __STDCALL setPrescribedTotalPotential(long index, double prescribedTotalPotential); diff --git a/agrolib/soilFluxes3D/soilFluxes3D.cpp b/agrolib/soilFluxes3D/soilFluxes3D.cpp index 33d9fc196..af54b8089 100644 --- a/agrolib/soilFluxes3D/soilFluxes3D.cpp +++ b/agrolib/soilFluxes3D/soilFluxes3D.cpp @@ -499,7 +499,7 @@ int DLL_EXPORT __STDCALL setHydraulicProperties(int waterRetentionCurve, /*! * \brief setWaterContent * \param nodeIndex - * \param waterContent [m^3 m^-3] + * \param waterContent [m] surface - [m3 m-3] sub-surface * \return OK/ERROR */ int DLL_EXPORT __STDCALL setWaterContent(long nodeIndex, double waterContent) @@ -531,6 +531,31 @@ int DLL_EXPORT __STDCALL setHydraulicProperties(int waterRetentionCurve, } + /*! + * \brief setDegreeOfSaturation + * \param nodeIndex + * \param degreeOfSaturation [-] (only sub-surface) + * \return OK/ERROR + */ + int DLL_EXPORT __STDCALL setDegreeOfSaturation(long nodeIndex, double degreeOfSaturation) + { + if (nodeListPtr == nullptr) return MEMORY_ERROR; + + if ((nodeIndex < 0) || (nodeIndex >= myStructure.nrNodes)) return INDEX_ERROR; + + if (nodeListPtr[nodeIndex].isSurface) return INDEX_ERROR; + + if ((degreeOfSaturation < 0.) || (degreeOfSaturation > 1.)) return PARAMETER_ERROR; + + nodeListPtr[nodeIndex].Se = degreeOfSaturation; + nodeListPtr[nodeIndex].H = nodeListPtr[nodeIndex].z - psi_from_Se(nodeIndex); + nodeListPtr[nodeIndex].oldH = nodeListPtr[nodeIndex].H; + nodeListPtr[nodeIndex].k = computeK(nodeIndex); + + return CRIT3D_OK; + } + + /*! * \brief setWaterSinkSource * \param nodeIndex diff --git a/bin/CRITERIA3D/CRITERIA3D.pro b/bin/CRITERIA3D/CRITERIA3D.pro index 823c42d90..cdabb801c 100644 --- a/bin/CRITERIA3D/CRITERIA3D.pro +++ b/bin/CRITERIA3D/CRITERIA3D.pro @@ -85,6 +85,7 @@ CONFIG(debug, debug|release) { SOURCES += \ + dialogModelProcesses.cpp \ dialogWaterFluxesSettings.cpp \ shared/project3D.cpp \ mainwindow.cpp \ @@ -98,6 +99,7 @@ SOURCES += \ HEADERS += \ + dialogModelProcesses.h \ dialogWaterFluxesSettings.h \ shared/project3D.h \ mainwindow.h \ diff --git a/bin/CRITERIA3D/criteria3DProject.cpp b/bin/CRITERIA3D/criteria3DProject.cpp index 6e58092ed..016930c02 100644 --- a/bin/CRITERIA3D/criteria3DProject.cpp +++ b/bin/CRITERIA3D/criteria3DProject.cpp @@ -422,7 +422,7 @@ bool Crit3DProject::runModels(QDateTime firstTime, QDateTime lastTime, bool isRe for (int hour = firstHour; hour <= lastHour; hour++) { setCurrentHour(hour); - if (currentSeconds == 3600) + if (currentSeconds == 0 || currentSeconds == 3600) isRestart = false; if (! runModelHour(currentOutputPath, isRestart)) @@ -458,7 +458,7 @@ bool Crit3DProject::runModels(QDateTime firstTime, QDateTime lastTime, bool isRe saveModelsState(); } - logInfoGUI("Computation done."); + logInfoGUI("Computation is finished."); return true; } @@ -980,10 +980,13 @@ bool Crit3DProject::runModelHour(const QString& hourlyOutputPath, bool isRestart qApp->processEvents(); } - // initalize sink / source - for (unsigned long i = 0; i < nrNodes; i++) + if (processes.computeWater) { - waterSinkSource.at(size_t(i)) = 0.; + // initalize sink / source + for (unsigned long i = 0; i < nrNodes; i++) + { + waterSinkSource.at(size_t(i)) = 0.; + } } if (processes.computeCrop || processes.computeWater) @@ -999,13 +1002,15 @@ bool Crit3DProject::runModelHour(const QString& hourlyOutputPath, bool isRestart saveHourlyMeteoOutput(referenceEvapotranspiration, hourlyOutputPath, myDateTime); } - assignETreal(); - qApp->processEvents(); - } + if (processes.computeCrop) + { + updateDailyTemperatures(); + } + if (processes.computeWater) + { + assignETreal(); + } - if (processes.computeCrop) - { - updateDailyTemperatures(); qApp->processEvents(); } diff --git a/bin/CRITERIA3D/dialogWaterFluxesSettings.cpp b/bin/CRITERIA3D/dialogWaterFluxesSettings.cpp index eab6317d7..555211402 100644 --- a/bin/CRITERIA3D/dialogWaterFluxesSettings.cpp +++ b/bin/CRITERIA3D/dialogWaterFluxesSettings.cpp @@ -4,50 +4,46 @@ DialogWaterFluxesSettings::DialogWaterFluxesSettings() { - setWindowTitle("3D water fluxes settings"); + setWindowTitle("Soil water flow settings"); - QGroupBox* processesGroupBox = new QGroupBox("Required processes"); - QLabel *snowLabel = new QLabel(tr("Snow model")); - snowProcess = new QCheckBox(); - QLabel *cropLabel = new QLabel(tr("Crop (evapotransp.)")); - cropProcess = new QCheckBox(); - QLabel *waterLabel = new QLabel(tr("Water flow")); - waterFluxesProcess = new QCheckBox(); - - QHBoxLayout *layoutProcesses = new QHBoxLayout(); - layoutProcesses->addWidget(snowProcess); - layoutProcesses->addWidget(snowLabel); - layoutProcesses->addWidget(cropProcess); - layoutProcesses->addWidget(cropLabel); - layoutProcesses->addWidget(waterFluxesProcess); - layoutProcesses->addWidget(waterLabel); - processesGroupBox->setLayout(layoutProcesses); - - // accuracy + // model accuracy + _isUpdateAccuracy = false; accuracySlider = new QSlider(Qt::Horizontal); accuracySlider->setRange(1, 5); accuracySlider->setSingleStep(1); accuracySlider->setPageStep(1); accuracySlider->setTickInterval(1); accuracySlider->setTickPosition(QSlider::TicksBelow); + updateButton = new QPushButton(" Update accuracy "); QHBoxLayout *accuracyLayout = new QHBoxLayout(); accuracyLayout->addWidget(accuracySlider); + accuracyLayout->addWidget(updateButton); QGroupBox *accuracyGroupBox = new QGroupBox("Model accuracy"); accuracyGroupBox->setLayout(accuracyLayout); - // initial water potential [m] - QGroupBox* initialGroupBox = new QGroupBox("Initial conditions"); - QLabel *initialWaterPotentialLabel = new QLabel(tr("Initial water potential [m]")); + // initial conditions + QLabel *initialWaterPotentialLabel = new QLabel(tr("Water potential [m]")); initialWaterPotentialEdit = new QLineEdit(); initialWaterPotentialEdit->setFixedWidth(50); QDoubleValidator* waterPotentialValidator = new QDoubleValidator(-1000.0, 1.0, 2, initialWaterPotentialEdit); waterPotentialValidator->setNotation(QDoubleValidator::StandardNotation); initialWaterPotentialEdit->setValidator(waterPotentialValidator); - QGridLayout *layoutInitial = new QGridLayout(); - layoutInitial->addWidget(initialWaterPotentialLabel, 0, 0); - layoutInitial->addWidget(initialWaterPotentialEdit, 0, 1); - initialGroupBox->setLayout(layoutInitial); + QLabel *initialDegreeLabel = new QLabel(tr("Degree of saturation [-]")); + initialDegreeOfSaturationEdit = new QLineEdit(); + initialDegreeOfSaturationEdit->setFixedWidth(50); + QDoubleValidator* degreeSatValidator = new QDoubleValidator(0.0, 1.0, 3, initialDegreeOfSaturationEdit); + degreeSatValidator->setNotation(QDoubleValidator::StandardNotation); + initialDegreeOfSaturationEdit->setValidator(degreeSatValidator); + + QGridLayout *layoutInitialConditions = new QGridLayout(); + layoutInitialConditions->addWidget(initialWaterPotentialLabel, 0, 0); + layoutInitialConditions->addWidget(initialWaterPotentialEdit, 0, 1); + layoutInitialConditions->addWidget(initialDegreeLabel, 1, 0); + layoutInitialConditions->addWidget(initialDegreeOfSaturationEdit, 1, 1); + + QGroupBox* initialConditionsGroupBox = new QGroupBox("Initial conditions"); + initialConditionsGroupBox->setLayout(layoutInitialConditions); // computation depth [m] QGroupBox* depthGroupBox = new QGroupBox("Computation depth"); @@ -68,7 +64,7 @@ DialogWaterFluxesSettings::DialogWaterFluxesSettings() layoutDepth->addWidget(imposedComputationDepthEdit, 2, 1); depthGroupBox->setLayout(layoutDepth); - // soil + // soil properties QGroupBox* soilGroupBox = new QGroupBox("Soil properties"); QVBoxLayout *soilLayout = new QVBoxLayout; useWaterRetentionFitting = new QRadioButton("Use water retention data"); @@ -80,15 +76,16 @@ DialogWaterFluxesSettings::DialogWaterFluxesSettings() connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); + connect(updateButton, &QPushButton::pressed, this, &DialogWaterFluxesSettings::updateAccuracy); QVBoxLayout *mainLayout = new QVBoxLayout(); - mainLayout->addWidget(processesGroupBox); - mainLayout->addWidget(accuracyGroupBox); - mainLayout->addWidget(initialGroupBox); + mainLayout->addWidget(initialConditionsGroupBox); mainLayout->addWidget(depthGroupBox); mainLayout->addWidget(soilGroupBox); + mainLayout->addWidget(accuracyGroupBox); mainLayout->addWidget(buttonBox); setLayout(mainLayout); show(); } + diff --git a/bin/CRITERIA3D/dialogWaterFluxesSettings.h b/bin/CRITERIA3D/dialogWaterFluxesSettings.h index 104866eb8..485c2c6d9 100644 --- a/bin/CRITERIA3D/dialogWaterFluxesSettings.h +++ b/bin/CRITERIA3D/dialogWaterFluxesSettings.h @@ -11,12 +11,19 @@ { private: QLineEdit *initialWaterPotentialEdit; + QLineEdit *initialDegreeOfSaturationEdit; QLineEdit *imposedComputationDepthEdit; + bool _isUpdateAccuracy; + + private slots : + void updateAccuracy() { _isUpdateAccuracy = true; } + public: - QCheckBox *snowProcess; - QCheckBox *cropProcess; - QCheckBox *waterFluxesProcess; + QPushButton *updateButton; + + QRadioButton *initialWaterPotential; + QRadioButton *initialDegreeOfSaturation; QRadioButton *onlySurface; QRadioButton *allSoilDepth; @@ -33,11 +40,20 @@ void setInitialWaterPotential(double value) { initialWaterPotentialEdit->setText(QString::number(value)); } + double getInitialDegreeOfSaturation() const + { return initialDegreeOfSaturationEdit->text().toDouble(); } + + void setInitialDegreeOfSaturation(double value) + { initialDegreeOfSaturationEdit->setText(QString::number(value)); } + double getImposedComputationDepth() const { return imposedComputationDepthEdit->text().toDouble(); } void setImposedComputationDepth(double value) { imposedComputationDepthEdit->setText(QString::number(value)); } + + bool isUpdateAccuracy() const + { return _isUpdateAccuracy; } }; diff --git a/bin/CRITERIA3D/mainwindow.cpp b/bin/CRITERIA3D/mainwindow.cpp index 139bda912..f5451d528 100644 --- a/bin/CRITERIA3D/mainwindow.cpp +++ b/bin/CRITERIA3D/mainwindow.cpp @@ -42,6 +42,7 @@ #include "dialogNewPoint.h" #include "glWidget.h" #include "dialogWaterFluxesSettings.h" +#include "dialogModelProcesses.h" #include "utilities.h" #include "formText.h" @@ -2120,59 +2121,7 @@ void MainWindow::on_actionRadiation_run_model_triggered() } -//-------------------- MENU SNOW MODEL ----------------------- -void MainWindow::on_actionSnow_initialize_triggered() -{ - if (myProject.initializeSnowModel()) - { - myProject.logInfoGUI("Snow model successfully initialized."); - } -} - -void MainWindow::on_actionSnow_run_model_triggered() -{ - if (! myProject.snowMaps.isInitialized) - { - myProject.logInfoGUI("Initialize snow model before."); - return; - } - - QDateTime firstTime, lastTime; - if (! selectDates (firstTime, lastTime)) - return; - - myProject.processes.initialize(); - myProject.processes.setComputeSnow(true); - - startModels(firstTime, lastTime); -} - - -void MainWindow::on_actionSnow_compute_next_hour_triggered() -{ - if (! myProject.snowMaps.isInitialized) - { - if (! myProject.initializeSnowModel()) - return; - } - - QDateTime currentTime; - if (myProject.getCurrentHour() == 23) - { - currentTime.setDate(myProject.getCurrentDate().addDays(1)); - currentTime.setTime(QTime(0, 0, 0, 0)); - } - else - { - currentTime = myProject.getCurrentTime().addSecs(HOUR_SECONDS); - } - - myProject.processes.initialize(); - myProject.processes.setComputeSnow(true); - - startModels(currentTime, currentTime); -} - +//------------------------------- MENU 3D MODEL ------------------------------------ void MainWindow::on_actionSnow_settings_triggered() { @@ -2192,7 +2141,7 @@ void MainWindow::on_actionSnow_settings_triggered() return; } else - { + { myProject.snowModel.snowParameters.tempMinWithRain = dialogSnowSetting.getSnowThresholdValue(); myProject.snowModel.snowParameters.tempMaxWithSnow = dialogSnowSetting.getRainfallThresholdValue(); myProject.snowModel.snowParameters.snowWaterHoldingCapacity = dialogSnowSetting.getWaterHoldingValue(); @@ -2206,21 +2155,35 @@ void MainWindow::on_actionSnow_settings_triggered() myProject.logError("Error writing snow parameters"); } } - return; } -//--------------------- MENU WATER FLUXES ----------------------- +void MainWindow::on_actionCriteria3D_set_processes_triggered() +{ + DialogModelProcesses dialogProcesses; + + dialogProcesses.snowProcess->setChecked(myProject.processes.computeSnow); + dialogProcesses.cropProcess->setChecked(myProject.processes.computeCrop); + dialogProcesses.waterFluxesProcess->setChecked(myProject.processes.computeWater); + + dialogProcesses.exec(); + + if (dialogProcesses.result() == QDialog::Accepted) + { + myProject.processes.setComputeSnow(dialogProcesses.snowProcess->isChecked()); + myProject.processes.setComputeCrop(dialogProcesses.cropProcess->isChecked()); + myProject.processes.setComputeWater(dialogProcesses.waterFluxesProcess->isChecked()); + } +} -void MainWindow::on_actionWaterFluxes_settings_triggered() + +void MainWindow::on_actionCriteria3D_waterFluxes_settings_triggered() { DialogWaterFluxesSettings dialogWaterFluxes; dialogWaterFluxes.setInitialWaterPotential(myProject.waterFluxesParameters.initialWaterPotential); - dialogWaterFluxes.setImposedComputationDepth(myProject.waterFluxesParameters.imposedComputationDepth); + dialogWaterFluxes.setInitialDegreeOfSaturation(myProject.waterFluxesParameters.initialDegreeOfSaturation); - dialogWaterFluxes.snowProcess->setChecked(myProject.processes.computeSnow); - dialogWaterFluxes.cropProcess->setChecked(myProject.processes.computeCrop); - dialogWaterFluxes.waterFluxesProcess->setChecked(myProject.processes.computeWater); + dialogWaterFluxes.setImposedComputationDepth(myProject.waterFluxesParameters.imposedComputationDepth); dialogWaterFluxes.accuracySlider->setValue(myProject.waterFluxesParameters.modelAccuracy); @@ -2234,13 +2197,17 @@ void MainWindow::on_actionWaterFluxes_settings_triggered() dialogWaterFluxes.useWaterRetentionFitting->setChecked(myProject.fittingOptions.useWaterRetentionData); dialogWaterFluxes.exec(); - if (dialogWaterFluxes.result() != QDialog::Accepted) + + if (dialogWaterFluxes.isUpdateAccuracy()) { - return; + myProject.waterFluxesParameters.modelAccuracy = dialogWaterFluxes.accuracySlider->value(); } - else + + if (dialogWaterFluxes.result() == QDialog::Accepted) { myProject.waterFluxesParameters.initialWaterPotential = dialogWaterFluxes.getInitialWaterPotential(); + myProject.waterFluxesParameters.initialDegreeOfSaturation = dialogWaterFluxes.getInitialDegreeOfSaturation(); + myProject.waterFluxesParameters.imposedComputationDepth = dialogWaterFluxes.getImposedComputationDepth(); myProject.waterFluxesParameters.computeOnlySurface = dialogWaterFluxes.onlySurface->isChecked(); myProject.waterFluxesParameters.computeAllSoilDepth = dialogWaterFluxes.allSoilDepth->isChecked(); @@ -2249,18 +2216,14 @@ void MainWindow::on_actionWaterFluxes_settings_triggered() myProject.fittingOptions.useWaterRetentionData = dialogWaterFluxes.useWaterRetentionFitting->isChecked(); - myProject.processes.setComputeSnow(dialogWaterFluxes.snowProcess->isChecked()); - myProject.processes.setComputeCrop(dialogWaterFluxes.cropProcess->isChecked()); - myProject.processes.setComputeWater(dialogWaterFluxes.waterFluxesProcess->isChecked()); - /*if (! myProject.writeCriteria3DParameters()) { myProject.logError("Error writing soil fluxes parameters"); }*/ - } - // layer thickness - // lateral conductivity ratio + // layer thickness + // lateral conductivity ratio + } } @@ -2312,33 +2275,55 @@ void MainWindow::on_actionCriteria3D_Initialize_triggered() return; } } - else - { - myProject.initializeCrop(); - } if (myProject.processes.computeWater) + { + if (! myProject.processes.computeCrop) + { + if (! myProject.initializeCrop()) + { + myProject.logError(); + return; + } + } + if (! myProject.initializeCriteria3DModel()) { myProject.logError(); return; } + } - if (myProject.processes.computeCrop || myProject.processes.computeWater) + if (!myProject.processes.computeSnow && ! myProject.processes.computeCrop && ! myProject.processes.computeWater) { - initializeCriteria3DInterface(); - myProject.isCriteria3DInitialized = true; - myProject.logInfoGUI("Criteria3D model initialized"); + myProject.logWarning("Set up at least one process: view menu 'Set active processes'"); + return; } + + initializeCriteria3DInterface(); + myProject.isCriteria3DInitialized = true; + myProject.logInfoGUI("The model is initialized."); } void MainWindow::on_actionCriteria3D_compute_next_hour_triggered() { - if (! myProject.isCriteria3DInitialized) + if (myProject.processes.computeCrop || myProject.processes.computeWater) { - myProject.logError("Initialize 3D water fluxes before"); - return; + if (! myProject.isCriteria3DInitialized) + { + myProject.logError("Initialize 3D model before"); + return; + } + } + + if (myProject.processes.computeSnow) + { + if (! myProject.snowMaps.isInitialized) + { + if (! myProject.initializeSnowModel()) + return; + } } QDateTime currentTime; @@ -2358,10 +2343,22 @@ void MainWindow::on_actionCriteria3D_compute_next_hour_triggered() void MainWindow::on_actionCriteria3D_run_models_triggered() { - if (! myProject.isCriteria3DInitialized) + if (myProject.processes.computeCrop || myProject.processes.computeWater) { - myProject.logError("Initialize 3D water fluxes before"); - return; + if (! myProject.isCriteria3DInitialized) + { + myProject.logError("Initialize 3D water fluxes before"); + return; + } + } + + if (myProject.processes.computeSnow) + { + if (! myProject.snowMaps.isInitialized) + { + myProject.logInfoGUI("Initialize snow model before."); + return; + } } QDateTime firstTime, lastTime; @@ -2467,79 +2464,6 @@ void MainWindow::on_flagSave_state_endRun_triggered(bool isChecked) } -void MainWindow::on_actionSave_state_triggered() -{ - if (myProject.isProjectLoaded) - { - if (myProject.saveModelsState()) - { - myProject.logInfoGUI("State model successfully saved: " + myProject.getCurrentDate().toString() - + " H:" + QString::number(myProject.getCurrentHour())); - } - } - else - { - myProject.logError(ERROR_STR_MISSING_PROJECT); - } -} - - -void MainWindow::on_actionLoad_external_state_triggered() -{ - if (! myProject.isProjectLoaded) - { - myProject.logError(ERROR_STR_MISSING_PROJECT); - return; - } - - QString stateDirectory = QFileDialog::getExistingDirectory(this, tr("Open Directory"), "", - QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks); - if (myProject.loadModelState(stateDirectory)) - { - updateDateTime(); - loadMeteoPointsDataSingleDay(myProject.getCurrentDate(), true); - redrawMeteoPoints(currentPointsVisualization, true); - } - else - { - myProject.logError(); - } -} - - -void MainWindow::on_actionLoad_state_triggered() -{ - if (! myProject.isProjectLoaded) - { - myProject.logError(ERROR_STR_MISSING_PROJECT); - return; - } - - QList stateList = myProject.getAllSavedState(); - if (stateList.size() == 0) - { - myProject.logError("Missing state in directory:\n" + myProject.getProjectPath() + PATH_STATES); - return; - } - - DialogLoadState dialogLoadState(stateList); - if (dialogLoadState.result() != QDialog::Accepted) - return; - - QString stateDirectory = myProject.getProjectPath() + PATH_STATES + dialogLoadState.getSelectedState(); - if (myProject.loadModelState(stateDirectory)) - { - updateDateTime(); - loadMeteoPointsDataSingleDay(myProject.getCurrentDate(), true); - redrawMeteoPoints(currentPointsVisualization, true); - } - else - { - myProject.logError(); - } -} - - //-------------------- MENU METEO POINTS ----------------------------- void MainWindow::on_actionPoints_clear_selection_triggered() { @@ -3477,3 +3401,4 @@ void MainWindow::on_actionCreate_new_land_use_map_triggered() myProject.loadLandUseMap(completeFileName); } + diff --git a/bin/CRITERIA3D/mainwindow.h b/bin/CRITERIA3D/mainwindow.h index b1f026295..5e75a3c38 100644 --- a/bin/CRITERIA3D/mainwindow.h +++ b/bin/CRITERIA3D/mainwindow.h @@ -63,11 +63,18 @@ void on_opacitySliderRasterInput_sliderMoved(int position); void on_opacitySliderRasterOutput_sliderMoved(int position); + // Menu show + void on_actionShow_3D_viewer_triggered(); + void on_viewer3DClosed(); + void on_slopeChanged(); + void on_flagView_not_active_points_toggled(bool state); void on_actionView_PointsHide_triggered(); void on_actionView_PointsLocation_triggered(); void on_actionView_PointsCurrentVariable_triggered(); + void on_flagView_values_toggled(bool arg1); + void on_actionView_SoilMap_triggered(); void on_actionHide_Soil_map_triggered(); @@ -88,29 +95,6 @@ void on_actionView_MeteoVariable_None_triggered(); void on_actionView_Radiation_None_triggered(); - void on_actionMapOpenStreetMap_triggered(); - void on_actionMapESRISatellite_triggered(); - void on_actionMapTerrain_triggered(); - void on_actionMapGoogle_hybrid_satellite_triggered(); - void on_actionMapGoogle_satellite_triggered(); - - void on_actionProjectSettings_triggered(); - - void on_actionVariableQualitySpatial_triggered(); - void on_actionInterpolationSettings_triggered(); - void on_actionProxy_analysis_triggered(); - void on_actionComputePeriod_meteoVariables_triggered(); - void on_actionComputeHour_meteoVariables_triggered(); - - void on_actionRadiation_settings_triggered(); - void on_actionRadiation_compute_current_hour_triggered(); - void on_actionRadiation_run_model_triggered(); - - void on_actionSnow_settings_triggered(); - void on_actionSnow_initialize_triggered(); - void on_actionSnow_compute_next_hour_triggered(); - void on_actionSnow_run_model_triggered(); - void on_actionView_Snow_water_equivalent_triggered(); void on_actionView_Snow_surface_temperature_triggered(); void on_actionView_Snow_internal_energy_triggered(); @@ -135,23 +119,8 @@ void on_actionView_SurfaceWaterContent_automatic_range_triggered(); void on_actionView_SurfaceWaterContent_fixed_range_triggered(); - void on_actionSave_state_triggered(); - void on_actionLoad_state_triggered(); - void on_flagSave_state_daily_step_toggled(bool isChecked); - - void on_actionCriteria3D_Initialize_triggered(); - void on_actionCriteria3D_compute_next_hour_triggered(); - void on_actionCriteria3D_run_models_triggered(); - void on_actionCriteria3D_update_subHourly_triggered(bool isChecked); - void on_actionCriteria3D_load_state_triggered(); - void on_actionCriteria3D_load_external_state_triggered(); - void on_actionCriteria3D_save_state_triggered(); - - void on_buttonModelPause_clicked(); - void on_buttonModelStop_clicked(); - void on_buttonModelStart_clicked(); - // menu meteo points + void on_actionPoints_clear_selection_triggered(); void on_actionDelete_Points_Selected_triggered(); void on_actionDelete_Points_NotActive_triggered(); void on_actionPoints_activate_all_triggered(); @@ -159,63 +128,71 @@ void on_actionPoints_activate_selected_triggered(); void on_actionPoints_deactivate_selected_triggered(); void on_actionPoints_activate_from_point_list_triggered(); - void on_actionPoints_deactivate_from_point_list_triggered(); - void on_actionPoints_activate_with_criteria_triggered(); - void on_actionPoints_deactivate_with_criteria_triggered(); - void on_actionPoints_delete_data_selected_triggered(); + void on_actionPoints_delete_data_not_active_triggered(); + void on_actionPoints_deactivate_with_no_data_triggered(); - void on_actionPoints_clear_selection_triggered(); + // Menu data spatialization + void on_actionVariableQualitySpatial_triggered(); + void on_actionInterpolationSettings_triggered(); + void on_actionProxy_analysis_triggered(); - void on_actionPoints_delete_data_not_active_triggered(); + void on_actionTopographicDistanceMapWrite_triggered(); + void on_actionTopographicDistanceMapLoad_triggered(); - void on_actionPoints_deactivate_with_no_data_triggered(); + void on_actionComputePeriod_meteoVariables_triggered(); + void on_actionComputeHour_meteoVariables_triggered(); - void on_actionOutputPoints_clear_selection_triggered(); + // Menu soalr radiation + void on_actionRadiation_settings_triggered(); + void on_actionRadiation_compute_current_hour_triggered(); + void on_actionRadiation_run_model_triggered(); - void on_actionOutputPoints_deactivate_all_triggered(); + // menu 3D model + void on_actionSnow_settings_triggered(); + void on_actionCriteria3D_Initialize_triggered(); + void on_actionCriteria3D_compute_next_hour_triggered(); + void on_actionCriteria3D_run_models_triggered(); + void on_actionCriteria3D_update_subHourly_triggered(bool isChecked); + void on_actionCriteria3D_load_state_triggered(); + void on_actionCriteria3D_load_external_state_triggered(); + void on_actionCriteria3D_save_state_triggered(); - void on_actionOutputPoints_deactivate_selected_triggered(); + void on_flagSave_state_daily_step_toggled(bool isChecked); + void on_flagSave_state_endRun_triggered(bool isChecked); - void on_flagHide_outputPoints_toggled(bool isChecked); + void on_buttonModelPause_clicked(); + void on_buttonModelStop_clicked(); + void on_buttonModelStart_clicked(); + // menu output points + void on_actionOutputPoints_clear_selection_triggered(); + void on_actionOutputPoints_deactivate_all_triggered(); + void on_actionOutputPoints_deactivate_selected_triggered(); + void on_flagHide_outputPoints_toggled(bool isChecked); void on_flagView_not_active_outputPoints_toggled(bool isChecked); - void on_actionOutputPoints_activate_all_triggered(); - void on_actionOutputPoints_activate_selected_triggered(); - void on_actionOutputPoints_newFile_triggered(); - void on_actionOutputDB_new_triggered(); - void on_actionOutputDB_open_triggered(); - void on_actionOutputPoints_delete_selected_triggered(); - void on_flagOutputPoints_save_output_toggled(bool isChecked); - void on_flagCompute_only_points_toggled(bool isChecked); - void on_actionLoad_OutputPoints_triggered(); - void on_actionOutputPoints_add_triggered(); - void on_flagView_values_toggled(bool arg1); - - void on_actionLoad_external_state_triggered(); - - void on_actionTopographicDistanceMapWrite_triggered(); - - void on_actionTopographicDistanceMapLoad_triggered(); - - void on_actionShow_3D_viewer_triggered(); + // Menu settings + void on_actionMapOpenStreetMap_triggered(); + void on_actionMapESRISatellite_triggered(); + void on_actionMapTerrain_triggered(); + void on_actionMapGoogle_hybrid_satellite_triggered(); + void on_actionMapGoogle_satellite_triggered(); + void on_actionProjectSettings_triggered(); - void on_viewer3DClosed(); - void on_slopeChanged(); void on_actionLoad_land_use_map_triggered(); @@ -231,17 +208,16 @@ void on_layerNrEdit_valueChanged(int layerIndex); - void on_actionWaterFluxes_settings_triggered(); - - void on_flagSave_state_endRun_triggered(bool isChecked); - void on_flag_increase_slope_triggered(bool isChecked); - void on_actionView_Water_potential_triggered(); void on_actionCreate_new_land_use_map_triggered(); + void on_actionCriteria3D_set_processes_triggered(); + + void on_actionCriteria3D_waterFluxes_settings_triggered(); + protected: /*! * \brief mouseReleaseEvent call moveCenter diff --git a/bin/CRITERIA3D/mainwindow.ui b/bin/CRITERIA3D/mainwindow.ui index 0a0d795dd..2a10fae2a 100644 --- a/bin/CRITERIA3D/mainwindow.ui +++ b/bin/CRITERIA3D/mainwindow.ui @@ -1293,7 +1293,7 @@ 0 1752 9 - 15 + 12 @@ -1971,11 +1971,13 @@ - + - Water fluxes + 3D model - + + + @@ -2144,21 +2146,6 @@ - - - Snow model - - - - - - - - - - - - Solar radiation @@ -2252,8 +2239,7 @@ - - + @@ -2301,7 +2287,7 @@ Spatial quality control - + Water fluxes settings... @@ -2475,16 +2461,6 @@ New (from csv)... - - - Load state... - - - - - Save state - - false @@ -2493,11 +2469,6 @@ Snow settings... - - - Run model... - - Snow Water Equivalent @@ -2513,14 +2484,6 @@ Energy content (snow pack or soil) - - - Initialize - - - Initialize snow model - - Snow fall @@ -2575,11 +2538,6 @@ Age of snow - - - Compute next hour - - Snowmelt @@ -2797,11 +2755,6 @@ Latent heat - - - Load external state... - - Write... @@ -2957,6 +2910,11 @@ Create new land use map... + + + Set active processes... + + diff --git a/bin/CRITERIA3D/shared/project3D.cpp b/bin/CRITERIA3D/shared/project3D.cpp index 3f20230a5..30c226cf7 100644 --- a/bin/CRITERIA3D/shared/project3D.cpp +++ b/bin/CRITERIA3D/shared/project3D.cpp @@ -56,8 +56,11 @@ void WaterFluxesParameters::initialize() computeOnlySurface = false; computeAllSoilDepth = true; - initialWaterPotential = -3.0; // [m] default: field capacity - imposedComputationDepth = 0.3; // [m] + isInitialWaterPotential = true; + initialWaterPotential = -2.0; // [m] default: field capacity + initialDegreeOfSaturation = 0.8; // [-] + + imposedComputationDepth = 1.0; // [m] horizVertRatioConductivity = 10.0; // [-] default: ten times modelAccuracy = 3; // [-] default: error on the third digit @@ -161,8 +164,8 @@ void Project3D::initializeProject3D() nrNodes = 0; nrLateralLink = 8; - currentSeconds = 0; - previousTotalWaterContent = 0; + currentSeconds = 0; // [s] + previousTotalWaterContent = 0; // [m3] totalPrecipitation = 0; totalEvaporation = 0; @@ -382,7 +385,7 @@ bool Project3D::initialize3DModel() int digitMBR = waterFluxesParameters.modelAccuracy; soilFluxes3D::setNumericalParameters(minimumDeltaT, 3600, 100, 10, 12, digitMBR); - if (! initializeMatricPotential(waterFluxesParameters.initialWaterPotential)) // [m] + if (! initializeWaterContent()) { logError(); return false; @@ -784,7 +787,7 @@ bool Project3D::setCrit3DTopography() } -bool Project3D::initializeMatricPotential(float psi) +bool Project3D::initializeWaterContent() { long index; int myResult; @@ -800,14 +803,34 @@ bool Project3D::initializeMatricPotential(float psi) if (index != long(indexMap.at(layer).header->flag)) { if (layer == 0) - myResult = soilFluxes3D::setMatricPotential(index, 0); + { + // surface + if (waterFluxesParameters.isInitialWaterPotential && waterFluxesParameters.initialWaterPotential > 0) + { + myResult = soilFluxes3D::setMatricPotential(index, waterFluxesParameters.initialWaterPotential); + } + else + { + myResult = soilFluxes3D::setMatricPotential(index, 0); + } + } else - myResult = soilFluxes3D::setMatricPotential(index, psi); + { + // sub-surface + if (waterFluxesParameters.isInitialWaterPotential) + { + myResult = soilFluxes3D::setMatricPotential(index, waterFluxesParameters.initialWaterPotential); + } + else + { + myResult = soilFluxes3D::setDegreeOfSaturation(index, waterFluxesParameters.initialDegreeOfSaturation); + } + } if (isCrit3dError(myResult, error)) { - errorString = "setMatricPotential: " + error + " in row:" - + QString::number(row) + " col:" + QString::number(col); + errorString = "Function initializeWaterContent: " + error + "\n"; + errorString += "In row:" + QString::number(row) + " col:" + QString::number(col); return false; } } diff --git a/bin/CRITERIA3D/shared/project3D.h b/bin/CRITERIA3D/shared/project3D.h index ae7be8a50..2471d19b2 100644 --- a/bin/CRITERIA3D/shared/project3D.h +++ b/bin/CRITERIA3D/shared/project3D.h @@ -20,8 +20,10 @@ class WaterFluxesParameters { public: - double initialWaterPotential; // [m] + double initialDegreeOfSaturation; // [-] + bool isInitialWaterPotential; + double imposedComputationDepth; // [m] double horizVertRatioConductivity; // [-] @@ -72,7 +74,7 @@ bool setCrit3DSoils(); bool setCrit3DTopography(); bool setCrit3DNodeSoil(); - bool initializeMatricPotential(float psi); + bool initializeWaterContent(); public: bool isCriteria3DInitialized;