Skip to content

Commit

Permalink
update 3D
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomei committed Jul 29, 2024
1 parent c443528 commit bf627c3
Show file tree
Hide file tree
Showing 11 changed files with 276 additions and 346 deletions.
1 change: 1 addition & 0 deletions agrolib/soilFluxes3D/header/soilFluxes3D.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
27 changes: 26 additions & 1 deletion agrolib/soilFluxes3D/soilFluxes3D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions bin/CRITERIA3D/CRITERIA3D.pro
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ CONFIG(debug, debug|release) {


SOURCES += \
dialogModelProcesses.cpp \
dialogWaterFluxesSettings.cpp \
shared/project3D.cpp \
mainwindow.cpp \
Expand All @@ -98,6 +99,7 @@ SOURCES += \


HEADERS += \
dialogModelProcesses.h \
dialogWaterFluxesSettings.h \
shared/project3D.h \
mainwindow.h \
Expand Down
27 changes: 16 additions & 11 deletions bin/CRITERIA3D/criteria3DProject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -458,7 +458,7 @@ bool Crit3DProject::runModels(QDateTime firstTime, QDateTime lastTime, bool isRe
saveModelsState();
}

logInfoGUI("Computation done.");
logInfoGUI("Computation is finished.");

return true;
}
Expand Down Expand Up @@ -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)
Expand All @@ -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();
}

Expand Down
57 changes: 27 additions & 30 deletions bin/CRITERIA3D/dialogWaterFluxesSettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand All @@ -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");
Expand All @@ -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();
}

22 changes: 19 additions & 3 deletions bin/CRITERIA3D/dialogWaterFluxesSettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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; }
};


Expand Down
Loading

0 comments on commit bf627c3

Please sign in to comment.