Skip to content

Commit

Permalink
Merge commit 'fc257260b40ba25dbb059732cbe06a71b3eb03bd'
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomei committed Mar 28, 2024
2 parents ee2bdba + fc25726 commit 1a1d302
Show file tree
Hide file tree
Showing 45 changed files with 2,168 additions and 586 deletions.
3 changes: 2 additions & 1 deletion agrolib/criteria1DWidget/criteria1DWidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "criteria1DMeteo.h"
#include "utilities.h"
#include "basicMath.h"
#include "root.h"

#include <QFileInfo>
#include <QFileDialog>
Expand Down Expand Up @@ -1026,7 +1027,7 @@ void Criteria1DWidget::on_actionExecuteCase()
return;
}

if (!myProject.computeUnit(myProject.myCase.unit))
if (! myProject.computeUnit(myProject.myCase.unit))
{
QMessageBox::critical(nullptr, "Error!", myProject.projectError);
}
Expand Down
79 changes: 54 additions & 25 deletions agrolib/criteriaModel/criteria1DProject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,13 @@ bool Crit1DProject::readSettings()

dbMeteoName = projectSettings->value("db_meteo","").toString();
if (dbMeteoName.left(1) == ".")
dbMeteoName = path + dbMeteoName;
if (dbMeteoName.right(3) == "xml")
{
dbMeteoName = QDir::cleanPath(path + dbMeteoName);
}
if (dbMeteoName.right(3).toUpper() == "XML")
{
isXmlMeteoGrid = true;
}

dbForecastName = projectSettings->value("db_forecast","").toString();
if (dbForecastName.left(1) == ".")
Expand Down Expand Up @@ -146,6 +150,10 @@ bool Crit1DProject::readSettings()
{
firstSimulationDate = projectSettings->value("firstDate",0).toDate();
if (! firstSimulationDate.isValid())
{
firstSimulationDate = projectSettings->value("first_date",0).toDate();
}
if (! firstSimulationDate.isValid())
{
firstSimulationDate = QDate(1800,1,1);
}
Expand All @@ -155,6 +163,10 @@ bool Crit1DProject::readSettings()
{
lastSimulationDate = projectSettings->value("lastDate",0).toDate();
if (! lastSimulationDate.isValid())
{
lastSimulationDate = projectSettings->value("last_date",0).toDate();
}
if (! lastSimulationDate.isValid())
{
lastSimulationDate = QDate(1800,1,1);
}
Expand Down Expand Up @@ -358,7 +370,7 @@ int Crit1DProject::initializeProject(QString settingsFileName)
return ERROR_SETTINGS_WRONGFILENAME;
}

if (!readSettings())
if (! readSettings())
return ERROR_SETTINGS_MISSINGDATA;

logger.setLog(path, projectName, addDateTimeLogFile);
Expand Down Expand Up @@ -468,26 +480,38 @@ bool Crit1DProject::setSoil(QString soilCode, QString &errorStr)

bool Crit1DProject::setMeteoXmlGrid(QString idMeteo, QString idForecast, unsigned int memberNr)
{
unsigned row, col;
// check date
QDate NODATE = QDate(1800, 1, 1);
if (! firstSimulationDate.isValid() || firstSimulationDate == NODATE )
{
projectError = "Missing first simulation date.";
return false;
}
if (! lastSimulationDate.isValid() || lastSimulationDate == NODATE )
{
projectError = "Missing last simulation date.";
return false;
}
unsigned nrDays = unsigned(firstSimulationDate.daysTo(lastSimulationDate)) + 1;

if (!observedMeteoGrid->meteoGrid()->findMeteoPointFromId(&row, &col, idMeteo.toStdString()) )
unsigned row, col;
if (! observedMeteoGrid->meteoGrid()->findMeteoPointFromId(&row, &col, idMeteo.toStdString()) )
{
projectError = "Missing observed meteo cell: " + idMeteo;
return false;
}

if (!observedMeteoGrid->gridStructure().isFixedFields())
if (! observedMeteoGrid->gridStructure().isFixedFields())
{
if (!observedMeteoGrid->loadGridDailyData(projectError, idMeteo, firstSimulationDate, lastSimulationDate))
if (! observedMeteoGrid->loadGridDailyData(projectError, idMeteo, firstSimulationDate, lastSimulationDate))
{
projectError = "Missing observed data: " + idMeteo;
return false;
}
}
else
{
if (!observedMeteoGrid->loadGridDailyDataFixedFields(projectError, idMeteo, firstSimulationDate, lastSimulationDate))
if (! observedMeteoGrid->loadGridDailyDataFixedFields(projectError, idMeteo, firstSimulationDate, lastSimulationDate))
{
if (projectError == "Missing MeteoPoint id")
{
Expand All @@ -501,11 +525,12 @@ bool Crit1DProject::setMeteoXmlGrid(QString idMeteo, QString idForecast, unsigne
}
}

if (this->isShortTermForecast)
if (isShortTermForecast)
{
if (!this->forecastMeteoGrid->gridStructure().isFixedFields())
if (! forecastMeteoGrid->gridStructure().isFixedFields())
{
if (!this->forecastMeteoGrid->loadGridDailyData(projectError, idForecast, lastSimulationDate.addDays(1), lastSimulationDate.addDays(daysOfForecast)))
if (! forecastMeteoGrid->loadGridDailyData(projectError, idForecast, lastSimulationDate.addDays(1),
lastSimulationDate.addDays(daysOfForecast)))
{
if (projectError == "Missing MeteoPoint id")
{
Expand All @@ -520,7 +545,8 @@ bool Crit1DProject::setMeteoXmlGrid(QString idMeteo, QString idForecast, unsigne
}
else
{
if (!this->forecastMeteoGrid->loadGridDailyDataFixedFields(projectError, idForecast, lastSimulationDate.addDays(1), lastSimulationDate.addDays(daysOfForecast)))
if (! forecastMeteoGrid->loadGridDailyDataFixedFields(projectError, idForecast,
lastSimulationDate.addDays(1), lastSimulationDate.addDays(daysOfForecast)))
{
if (projectError == "Missing MeteoPoint id")
{
Expand All @@ -536,16 +562,17 @@ bool Crit1DProject::setMeteoXmlGrid(QString idMeteo, QString idForecast, unsigne
nrDays += unsigned(daysOfForecast);
}

if (this->isEnsembleForecast)
if (isEnsembleForecast)
{
if (this->forecastMeteoGrid->gridStructure().isFixedFields())
if (forecastMeteoGrid->gridStructure().isFixedFields())
{
projectError = "DB grid fixed fields: not available";
return false;
}
else
{
if (!this->forecastMeteoGrid->loadGridDailyDataEnsemble(projectError, idForecast, int(memberNr), lastSimulationDate.addDays(1), lastSimulationDate.addDays(daysOfForecast)))
if (! forecastMeteoGrid->loadGridDailyDataEnsemble(projectError, idForecast, int(memberNr),
lastSimulationDate.addDays(1), lastSimulationDate.addDays(daysOfForecast)))
{
if (projectError == "Missing MeteoPoint id")
{
Expand All @@ -561,55 +588,57 @@ bool Crit1DProject::setMeteoXmlGrid(QString idMeteo, QString idForecast, unsigne
nrDays += unsigned(daysOfForecast);
}

myCase.meteoPoint.latitude = this->observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->latitude;
myCase.meteoPoint.longitude = this->observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->longitude;
myCase.meteoPoint.latitude = observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->latitude;
myCase.meteoPoint.longitude = observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->longitude;
myCase.meteoPoint.initializeObsDataD(nrDays, getCrit3DDate(firstSimulationDate));

float tmin, tmax, tavg, prec;
long lastIndex = long(firstSimulationDate.daysTo(lastSimulationDate)) + 1;
for (int i = 0; i < lastIndex; i++)
{
Crit3DDate myDate = getCrit3DDate(firstSimulationDate.addDays(i));
tmin = this->observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMin);
tmin = observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMin);
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyAirTemperatureMin, tmin);

tmax = this->observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMax);
tmax = observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMax);
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyAirTemperatureMax, tmax);

tavg = this->observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureAvg);
tavg = observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureAvg);
if (int(tavg) == int(NODATA))
{
tavg = (tmax + tmin)/2;
}
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyAirTemperatureAvg, tavg);

prec = this->observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyPrecipitation);
prec = observedMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyPrecipitation);
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyPrecipitation, prec);
}

if (isShortTermForecast || isEnsembleForecast)
{
QDate start = lastSimulationDate.addDays(1);
QDate end = lastSimulationDate.addDays(daysOfForecast);
for (int i = 0; i< start.daysTo(end)+1; i++)
{
Crit3DDate myDate = getCrit3DDate(start.addDays(i));
tmin = this->forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMin);
tmin = forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMin);
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyAirTemperatureMin, tmin);

tmax = this->forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMax);
tmax = forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureMax);
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyAirTemperatureMax, tmax);

tavg = this->forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureAvg);
tavg = forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyAirTemperatureAvg);
if (int(tavg) == int(NODATA))
{
tavg = (tmax + tmin)/2;
}
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyAirTemperatureAvg, tavg);

prec = this->forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyPrecipitation);
prec = forecastMeteoGrid->meteoGrid()->meteoPointPointer(row, col)->getMeteoPointValueD(myDate, dailyPrecipitation);
myCase.meteoPoint.setMeteoPointValueD(myDate, dailyPrecipitation, prec);
}
}

return true;
}

Expand Down
37 changes: 29 additions & 8 deletions agrolib/dbMeteoGrid/dbMeteoGrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2306,15 +2306,14 @@ bool Crit3DMeteoGridDbHandler::loadGridAllMonthlyData(QString &myError, QDate fi
{
if (! _meteoGrid->findMeteoPointFromId(&row, &col, pointCode.toStdString()) )
{
myError = "Missing MeteoPoint id";
return false;
continue;
}
lastPointCode = pointCode;
}

if (! getValue(qry.value("VariableCode"), &varCode))
{
myError = "Missing VariableCode";
myError = "Missing VariableCode: " + QString::number(varCode);
return false;
}

Expand All @@ -2330,7 +2329,10 @@ bool Crit3DMeteoGridDbHandler::loadGridAllMonthlyData(QString &myError, QDate fi
}

if (! _meteoGrid->meteoPointPointer(row, col)->setMeteoPointValueM(getCrit3DDate(monthDate), variable, value))
{
myError = "Error in setMeteoPointValueM()";
return false;
}
}
}

Expand Down Expand Up @@ -2438,14 +2440,17 @@ std::vector<float> Crit3DMeteoGridDbHandler::loadGridDailyVar(QString *myError,
return dailyVarList;
}

std::vector<float> Crit3DMeteoGridDbHandler::exportAllDataVar(QString *myError, frequencyType freq, meteoVariable variable, QString id, std::vector<QString> &dateStr)
std::vector<float> Crit3DMeteoGridDbHandler::exportAllDataVar(QString *myError, frequencyType freq, meteoVariable variable, QString id, QDateTime myFirstTime, QDateTime myLastTime, std::vector<QString> &dateStr)
{
QString myDateStr;
float value;
std::vector<float> allDataVarList;

QSqlQuery myQuery(_db);
QString tableName;
QString statement;
QString startDate;
QString endDate;
int idVar;

if (freq == daily)
Expand All @@ -2457,6 +2462,10 @@ std::vector<float> Crit3DMeteoGridDbHandler::exportAllDataVar(QString *myError,
return allDataVarList;
}
tableName = _tableDaily.prefix + id + _tableDaily.postFix;
startDate = myFirstTime.date().toString("yyyy-MM-dd");
endDate = myLastTime.date().toString("yyyy-MM-dd");
statement = QString( "SELECT * FROM `%1` WHERE VariableCode = '%2' AND `%3` >= '%4' AND `%3`<= '%5'")
.arg(tableName).arg(idVar).arg(_tableDaily.fieldTime).arg(startDate).arg(endDate);
}
else if (freq == hourly)
{
Expand All @@ -2467,15 +2476,16 @@ std::vector<float> Crit3DMeteoGridDbHandler::exportAllDataVar(QString *myError,
return allDataVarList;
}
tableName = _tableHourly.prefix + id + _tableHourly.postFix;
startDate = myFirstTime.date().toString("yyyy-MM-dd") + " " + myFirstTime.time().toString("hh:mm");
endDate = myLastTime.date().toString("yyyy-MM-dd") + " " + myLastTime.time().toString("hh:mm");
statement = QString( "SELECT * FROM `%1` WHERE VariableCode = '%2' AND `%3` >= '%4' AND `%3`<= '%5'")
.arg(tableName).arg(idVar).arg(_tableHourly.fieldTime).arg(startDate).arg(endDate);
}
else
{
*myError = "Frequency should be daily or hourly";
return allDataVarList;
}

QString statement = QString( "SELECT * FROM `%1` WHERE VariableCode = '%2'")
.arg(tableName).arg(idVar);
QDateTime dateTime;
QDate date;
if( !myQuery.exec(statement) )
Expand Down Expand Up @@ -3672,6 +3682,17 @@ bool Crit3DMeteoGridDbHandler::isHourly()
return true;
}

bool Crit3DMeteoGridDbHandler::isMonthly()
{
if ( ! _firstMonthlyDate.isValid() || _firstMonthlyDate.year() == 1800
|| ! _lastMonthlyDate.isValid() || _lastMonthlyDate.year() == 1800 )
{
return false;
}

return true;
}


QDate Crit3DMeteoGridDbHandler::getFirstDailyDate() const
{
Expand Down Expand Up @@ -3709,7 +3730,7 @@ QDate Crit3DMeteoGridDbHandler::getLastHourlyDate() const
return _lastHourlyDate;
}

QDate Crit3DMeteoGridDbHandler::getFirsMonthlytDate() const
QDate Crit3DMeteoGridDbHandler::getFirstMonthlytDate() const
{
if (_firstMonthlyDate.year() == 1800)
{
Expand Down
5 changes: 3 additions & 2 deletions agrolib/dbMeteoGrid/dbMeteoGrid.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@
std::vector<float> loadGridDailyVarFixedFields(QString *myError, QString meteoPoint, meteoVariable variable, QDate first, QDate last, QDate* firstDateDB);
std::vector<float> loadGridHourlyVar(QString *myError, QString meteoPoint, meteoVariable variable, QDateTime first, QDateTime last, QDateTime* firstDateDB);
std::vector<float> loadGridHourlyVarFixedFields(QString *myError, QString meteoPoint, meteoVariable variable, QDateTime first, QDateTime last, QDateTime* firstDateDB);
std::vector<float> exportAllDataVar(QString *myError, frequencyType freq, meteoVariable variable, QString id, std::vector<QString> &dateStr);
std::vector<float> exportAllDataVar(QString *myError, frequencyType freq, meteoVariable variable, QString id, QDateTime myFirstTime, QDateTime myLastTime, std::vector<QString> &dateStr);
bool getYearList(QString *myError, QString meteoPoint, QList<QString>* yearList);
bool idDailyList(QString *myError, QList<QString>* idMeteoList);

Expand Down Expand Up @@ -168,11 +168,12 @@
QDate getLastDailyDate() const;
QDate getFirstHourlyDate() const;
QDate getLastHourlyDate() const;
QDate getFirsMonthlytDate() const;
QDate getFirstMonthlytDate() const;
QDate getLastMonthlyDate() const;

bool isDaily();
bool isHourly();
bool isMonthly();

bool saveLogProcedures(QString *myError, QString nameProc, QDate date);

Expand Down
17 changes: 13 additions & 4 deletions agrolib/dbMeteoPoints/dbMeteoPointsHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,7 @@ std::vector<float> Crit3DMeteoPointsDbHandler::loadDailyVar(QString *myError, me
return dailyVarList;
}

std::vector<float> Crit3DMeteoPointsDbHandler::exportAllDataVar(QString *myError, frequencyType freq, meteoVariable variable, QString id, std::vector<QString> &dateStr)
std::vector<float> Crit3DMeteoPointsDbHandler::exportAllDataVar(QString *myError, frequencyType freq, meteoVariable variable, QString id, QDateTime myFirstTime, QDateTime myLastTime, std::vector<QString> &dateStr)
{
QString myDateStr;
QDateTime dateTime;
Expand All @@ -699,24 +699,33 @@ std::vector<float> Crit3DMeteoPointsDbHandler::exportAllDataVar(QString *myError

QSqlQuery myQuery(_db);
QString tableName;
QString startDate;
QString endDate;
QString statement;

if (freq == daily)
{
tableName = id + "_D";
startDate = myFirstTime.date().toString("yyyy-MM-dd");
endDate = myLastTime.date().toString("yyyy-MM-dd");
statement = QString( "SELECT * FROM `%1` WHERE `%2` = %3 AND date_time >= DATE('%4') AND date_time <= DATE('%5')")
.arg(tableName).arg(FIELD_METEO_VARIABLE).arg(idVar).arg(startDate).arg(endDate);

}
else if (freq == hourly)
{
tableName = id + "_H";
startDate = myFirstTime.date().toString("yyyy-MM-dd") + " " + myFirstTime.time().toString("hh:mm");
endDate = myLastTime.date().toString("yyyy-MM-dd") + " " + myLastTime.time().toString("hh:mm");
statement = QString( "SELECT * FROM `%1` WHERE `%2` = %3 AND date_time >= DATETIME('%4') AND date_time <= DATETIME('%5')")
.arg(tableName).arg(FIELD_METEO_VARIABLE).arg(idVar).arg(startDate).arg(endDate);
}
else
{
*myError = "Frequency should be daily or hourly";
return allDataVarList;
}

QString statement = QString( "SELECT * FROM `%1` WHERE `%2` = %3")
.arg(tableName).arg(FIELD_METEO_VARIABLE).arg(idVar);

if( !myQuery.exec(statement) )
{
*myError = myQuery.lastError().text();
Expand Down
Loading

0 comments on commit 1a1d302

Please sign in to comment.