Commit c484d1ee authored by Ronan Trépos's avatar Ronan Trépos
Browse files

sunflo: remove obsolete ConduiteCulture

parent 07240034
......@@ -84,7 +84,7 @@
<port name="ISH3"/>
</out>
</model>
<model observables="phenologie" conditions="CONFIG_SimuInit,CONFIG_Variete,phenologie,EXPERT_Plante,CONFIG_Plante,EXPERT_SimuInit" width="100" dynamics="Phenologie" height="105" x="252" y="22" name="phenologie" type="atomic">
<model observables="phenologie" conditions="CONFIG_Variete,EXPERT_SimuInit,CONFIG_SimuInit,CONFIG_Plante,EXPERT_Plante,phenologie" width="100" dynamics="Phenologie" height="105" x="252" y="22" name="phenologie" type="atomic">
<in>
<port name="ActionRecolte"/>
<port name="ActionSemis"/>
......@@ -1405,11 +1405,12 @@
<port name="zSemis">
<double>30.000000000000000</double>
</port>
<port name="fertilization_2">
<double>0</double>
</port>
<port name="irrigation_2">
<double>0</double>
</port>
<port name="fertilization_2">
<string>0</string>
</port>
</condition>
<condition name="phenologie">
......
/**
*
* Copyright (C) 2009-2014 INRA.
* Copyright (C) 2009-2014 CETIOM.
*
*
* TODO licence
*/
// @@tagdynamic@@
// @@tagdepends: vle.discrete-time @@endtagdepends
#include <vector>
#include <vle/utils/DateTime.hpp>
#include <vle/utils/Tools.hpp>
#include <vle/DiscreteTime.hpp>
#include <ConduiteCulture.hpp>
#include <sunflo_utils.hpp>
#define VALEURDOUBLENONSIGNIFIANTE (-777.0) //TODO to remove
namespace sunflo {
struct Apport {
std::string date_jjmm;
ValeurActionConduite ActionIrrigation;
double DoseIrrigation;
ValeurActionConduite ActionFertilisation;
double DoseFertilisation;
Apport( std::string date_jjmm ){
this->date_jjmm = date_jjmm;
unsetActionIrrigation();
unsetActionFertilisation();
}
Apport( std::string date_jjmm, ValeurActionConduite ActionIrrigation, double DoseIrrigation, ValeurActionConduite ActionFertilisation, double DoseFertilisation ){
this->date_jjmm = date_jjmm;
if ( ActionIrrigation == ACTIONCONDUITE_ACTIVE ){
setActionIrrigation( DoseIrrigation );
} else {
unsetActionIrrigation();
}
if ( ActionFertilisation == ACTIONCONDUITE_ACTIVE ){
setActionFertilisation( DoseFertilisation );
} else {
unsetActionFertilisation();
}
}
void setActionIrrigation( double Dose ){
ActionIrrigation = ACTIONCONDUITE_ACTIVE;
DoseIrrigation = Dose;
}
void setActionFertilisation( double Dose ){
ActionFertilisation = ACTIONCONDUITE_ACTIVE;
DoseFertilisation = Dose;
}
void unsetActionIrrigation( void ){
ActionIrrigation = ACTIONCONDUITE_INACTIVE;
DoseIrrigation = 0.0;
}
void unsetActionFertilisation( void ){
ActionFertilisation = ACTIONCONDUITE_INACTIVE;
DoseFertilisation = 0.0;
}
};
using namespace vle::discrete_time;
class ConduiteCulture : public DiscreteTimeDyn
{
public :
//Variable etats conduite (interne)
Var EtatConduite;
std::vector<Apport>::iterator apportAadministrer;
//Variable etats conduite
Var ActionSemis;
Var zSemis;
Var densite;
Var ActionRecolte;
Var ActionFerti;
Var DoseFerti;
Var ActionIrrig;
Var DoseIrrig;
double pdensite;
std::string jsemis;
std::string jrecolte;
double pzSemis;
double begin_date;
/// lesApportsIrrigation et lesApportsFertilisation servent a creer lesApports au travers duquel ils seront exploites.
std::map < std::string, double > lesApportsIrrigation;
std::map < std::string, double > lesApportsFertilisation;
/// Parametre interne \n
/// lesApports regroupe les informations de lesApportsIrrigation et lesApportsFertilisation classees par ordre chronologique.
/// ConduiteCulture utilise lesApports et non pas directement lesApportsIrrigation et lesApportsfertilisation.
std::vector < Apport > lesApports;
public :
ConduiteCulture(const vle::devs::DynamicsInit& model,
const vle::devs::InitEventList& events) :
vle::discrete_time::DiscreteTimeDyn(model, events)
{
ActionSemis.init(this,"ActionSemis", events );
zSemis.init(this,"zSemis", events );
densite.init(this,"densite", events );
ActionRecolte.init(this,"ActionRecolte", events );
ActionFerti.init(this,"ActionFerti", events );
DoseFerti.init(this,"DoseFerti", events );
ActionIrrig.init(this,"ActionIrrig", events );
DoseIrrig.init(this,"DoseIrrig", events );
EtatConduite.init(this,"EtatConduite", events );
pdensite = events.getDouble("densite");
jsemis = events.getString("jsemis");
jrecolte = events.getString("jrecolte");
pzSemis = events.getDouble("zSemis");
begin_date = vle::utils::DateTime::toJulianDayNumber(
events.getString("begin_date"));
if (events.exist("apports_irrigation")) {
const vle::value::Map& map = events.getMap("apports_irrigation");
const vle::value::MapValue& lst = map.value();
for ( vle::value::MapValue::const_iterator it = lst.begin(); it != lst.end(); ++it ){
std::string date_jjmm = it->first;
double doseApport = vle::value::toDouble(it->second);
if (doseApport > 0.0) {
lesApportsIrrigation[date_jjmm] = doseApport;
}
}
} else if (events.exist("apport_irrig_1") && events.exist("date_irrig_1")){
for (unsigned int i=6; i!=0; i--) {
std::string event_apport(
vle::utils::format("apport_irrig_%i", i).c_str());
std::string event_date(
vle::utils::format("date_irrig_%i", i).c_str());
if (events.exist(event_apport) && events.exist(event_date)) {
lesApportsIrrigation[events.getString(event_date)] = events.getDouble(event_apport);
}
}
}
if (events.exist("apports_fertilisation")) {
const vle::value::Map& map = events.getMap("apports_fertilisation");
const vle::value::MapValue& lst = map.value();
for ( vle::value::MapValue::const_iterator it = lst.begin(); it != lst.end(); ++it ){
std::string date_jjmm = it->first;
double doseApport = vle::value::toDouble(it->second);
lesApportsFertilisation[date_jjmm] = doseApport;
}
// t->trace("LA MAP : ", map.writeToString());
} else if (events.exist("apport_ferti_1") && events.exist("date_ferti_1")) {
for (unsigned int i=4; i!=0; i--) {
std::string event_apport(
vle::utils::format("apport_ferti_%i", i));
std::string event_date(
vle::utils::format("date_ferti_%i", i));
if (events.exist(event_apport) && events.exist(event_date)) {
lesApportsFertilisation[events.getString(event_date)] = events.getDouble(event_apport);
}
}
}
// d'une part rentrer les irrigations dans les Apports
for ( std::map < std::string, double >::const_iterator it = lesApportsIrrigation.begin();
it != lesApportsIrrigation.end(); ++it ){
std::string date_jjmm = it->first;
double DoseIrrigation = it->second;
Apport apport( date_jjmm, ACTIONCONDUITE_ACTIVE, DoseIrrigation, ACTIONCONDUITE_INACTIVE, 0.0 );
// rangement de apport au bon endroit dans lesApports
bool estInsere = false;
std::vector<Apport>::iterator itApports = lesApports.begin();
while ( ( itApports != lesApports.end() ) && ( estInsere == false ) ){
if ( utils::ordreChronologique( itApports->date_jjmm, date_jjmm ) ){
itApports++; // avancer
} else { // stop
lesApports.insert( itApports, apport ); // apport insere
estInsere = true;
}
}
if ( estInsere == false ){
lesApports.push_back( apport ); // apport mis dans lesApports a la fin
}
}
// d'autre part rentrer les fertilisations dans les Apports
for ( std::map < std::string, double >::const_iterator it = lesApportsFertilisation.begin();
it != lesApportsFertilisation.end(); ++it ){
std::string date_jjmm = it->first;
double DoseFertilisation = it->second;
Apport apport( date_jjmm, ACTIONCONDUITE_INACTIVE, 0.0, ACTIONCONDUITE_ACTIVE, DoseFertilisation );
// rangement de apport au bon endroit dans lesApports
bool estInsere = false;
std::vector<Apport>::iterator itApports = lesApports.begin();
while ( ( itApports != lesApports.end() ) && ( estInsere == false ) ){
if ( utils::coincidence( itApports->date_jjmm, date_jjmm) ){ // stop
// date_jjmm existe deja (irrigation) dans lesApports
itApports->setActionFertilisation( DoseFertilisation ); // fertilisation ajoutee
estInsere = true;
} else if ( utils::ordreChronologique( itApports->date_jjmm, date_jjmm) ){
itApports++; // avancer
} else { // stop
lesApports.insert( itApports, apport ); // apport insere
estInsere = true;
}
}
if ( estInsere == false ){
lesApports.push_back( apport ); // apport mis dans lesApports a la fin
}
}
ActionSemis.init_value((double)ACTIONCONDUITE_INACTIVE);
zSemis.init_value(VALEURDOUBLENONSIGNIFIANTE);
densite.init_value(VALEURDOUBLENONSIGNIFIANTE);
ActionRecolte.init_value((double)ACTIONCONDUITE_INACTIVE);
ActionFerti.init_value((double)ACTIONCONDUITE_INACTIVE);
DoseFerti.init_value(0.0);
ActionIrrig.init_value((double)ACTIONCONDUITE_INACTIVE);
DoseIrrig.init_value(0.0);
EtatConduite.init_value((double)ETATCONDUITE_PRESEMIS);
apportAadministrer = lesApports.begin();
while ( ( apportAadministrer !=lesApports.end() )
&& ( !utils::ordreChronologique(jsemis, apportAadministrer->date_jjmm ) ) ){
apportAadministrer++;
}
}
virtual ~ConduiteCulture() { }
virtual void compute(const vle::devs::Time& time )
{
double ActionSemis_tmp = ACTIONCONDUITE_INACTIVE; // par defaut
double zSemis_tmp = VALEURDOUBLENONSIGNIFIANTE; // par defaut
double densite_tmp = VALEURDOUBLENONSIGNIFIANTE; // par defaut
double ActionRecolte_tmp = ACTIONCONDUITE_INACTIVE; // par defaut
double ActionFerti_tmp = ACTIONCONDUITE_INACTIVE; // par defaut
double DoseFerti_tmp = 0.0; // par defaut
double ActionIrrig_tmp = ACTIONCONDUITE_INACTIVE; // par defaut
double DoseIrrig_tmp = 0.0; // par defaut
double EtatConduite_tmp = EtatConduite(-1); // par defaut
switch ( (int) EtatConduite(-1) ){
case ETATCONDUITE_PRESEMIS :
if ( utils::coincidence( time + begin_date, jsemis ) ){ // action semis
ActionSemis_tmp = (double)ACTIONCONDUITE_ACTIVE;
zSemis_tmp = pzSemis;
densite_tmp = pdensite;
// pour le cas d'apport a la date du semis (cf FFT_110131_013)
eventuellesIrrigationEtFertilisation( time+ begin_date,
ActionIrrig_tmp, DoseIrrig_tmp,
ActionFerti_tmp, DoseFerti_tmp );
EtatConduite_tmp = ETATCONDUITE_ENCULTURE;
}
break;
case ETATCONDUITE_ENCULTURE :
if (utils::coincidence( time+ begin_date, jrecolte ) ){ // action recolte
ActionRecolte_tmp = (double)ACTIONCONDUITE_ACTIVE;
EtatConduite_tmp = ETATCONDUITE_POSTRECOLTE;
} else { // etude Irrigation et Fertilisation
eventuellesIrrigationEtFertilisation( time+ begin_date,
ActionIrrig_tmp, DoseIrrig_tmp,
ActionFerti_tmp, DoseFerti_tmp );
}
break;
case ETATCONDUITE_POSTRECOLTE :
// ne fait rien
break;
default :
break;
}
ActionSemis = ActionSemis_tmp;
zSemis = zSemis_tmp;
densite = densite_tmp;
ActionRecolte = ActionRecolte_tmp;
ActionFerti = ActionFerti_tmp;
DoseFerti = DoseFerti_tmp;
ActionIrrig = ActionIrrig_tmp;
DoseIrrig = DoseIrrig_tmp;
EtatConduite = EtatConduite_tmp;
}
private :
// Traitement d'administration de l'apport courant s'il existe
// Fonction utilisee par compute
void eventuellesIrrigationEtFertilisation(const vle::devs::Time& time,
double& ActionIrrig_tmp, double& DoseIrrig_tmp,
double& ActionFerti_tmp, double& DoseFerti_tmp )
{
if ( apportAadministrer != lesApports.end() ){
if ( utils::coincidence( time, apportAadministrer->date_jjmm ) ){
if ( apportAadministrer->ActionIrrigation == ACTIONCONDUITE_ACTIVE ){
ActionIrrig_tmp = ACTIONCONDUITE_ACTIVE;
DoseIrrig_tmp = apportAadministrer->DoseIrrigation;
}
if ( apportAadministrer->ActionFertilisation == ACTIONCONDUITE_ACTIVE ){
ActionFerti_tmp = ACTIONCONDUITE_ACTIVE;
DoseFerti_tmp = apportAadministrer->DoseFertilisation;
}
apportAadministrer++; // apport suivant
}
}
}
};
} // namespace
DECLARE_DYNAMICS(sunflo::ConduiteCulture);
/**
*
* Copyright (C) 2009-2014 INRA.
* Copyright (C) 2009-2014 CETIOM.
*
*
* TODO licence
*/
#ifndef SUNFLO_CONDUITE_CULTURE_HPP
#define SUNFLO_CONDUITE_CULTURE_HPP
namespace sunflo {
typedef enum ValeurEtatConduite {
ETATCONDUITE_PRESEMIS = 0,
ETATCONDUITE_ENCULTURE = 1,
ETATCONDUITE_POSTRECOLTE = 2
} ValeurEtatConduite;//TODO remove instance
typedef enum ValeurActionConduite {
ACTIONCONDUITE_INACTIVE = 0,
ACTIONCONDUITE_ACTIVE = 1
} ValeurActionConduite;
} // namespace
#endif
......@@ -12,7 +12,6 @@
#include <vle/DiscreteTime.hpp>
#include <Phenologie.hpp>
#include <ConduiteCulture.hpp>
#include <ParametresPlante.hpp>
#include <ParametresSol.hpp>
#include <ParametresSimuInit.hpp>
......@@ -444,11 +443,11 @@ public :
{
double FE_tmp = FE(-1);
double FR_tmp = FR(-1);
if ((int) ActionFerti() == ACTIONCONDUITE_ACTIVE ){
if ((int) ActionFerti() == 1 ){
FE_tmp = DoseFerti();
}
double pluieEtIrrig_tmp = Pluie();
if ((int) ActionIrrig() == ACTIONCONDUITE_ACTIVE ){
if ((int) ActionIrrig() == 1 ){
pluieEtIrrig_tmp = pluieEtIrrig_tmp + DoseIrrig();
}
if ( pluieEtIrrig_tmp > 5.0 ) {
......@@ -506,7 +505,7 @@ public :
{
double ddt = 0.0;
if ((int) ActionFerti() == ACTIONCONDUITE_ACTIVE ){
if ((int) ActionFerti() == 1 ){
ddt = DoseFerti();
}
Engrais = Engrais(-1) + ddt;
......
......@@ -15,7 +15,6 @@
#include <vle/DiscreteTime.hpp>
#include <sunflo_utils.hpp>
#include <Phenologie.hpp>
#include <ConduiteCulture.hpp>
#include <ParametresPlante.hpp>
#include <ParametresVariete.hpp>
#include <ParametresSol.hpp>
......@@ -369,7 +368,7 @@ public :
double ddt = 0.0;
ddt = Pluie() - vTRC1(-1) - EVj(-1) - D1(-1);
if ( (int)ActionIrrig() == ACTIONCONDUITE_ACTIVE ){
if ( (int)ActionIrrig() == 1 ){
ddt = ddt + DoseIrrig();
}
C1 = C1(-1) + ddt;
......@@ -400,7 +399,7 @@ public :
}
// zRac, EQ7 de la publi
if ( (int)ActionSemis() == ACTIONCONDUITE_ACTIVE ){
if ( (int)ActionSemis() == 1 ){
zRac = zSemis(); // initialisation
} else {
double ddt = vRac(-1);
......@@ -545,7 +544,7 @@ public :
{
// pluieEtIrrig = Pluie + DoseIrrig
double pluieEtIrrig_tmp = Pluie();
if ((int)ActionIrrig() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionIrrig() == 1 ){
pluieEtIrrig_tmp = pluieEtIrrig_tmp + DoseIrrig();
}
if ( pluieEtIrrig_tmp > 4.0 ) { // pluieEtIrrig > 4 mm
......
......@@ -15,7 +15,6 @@
#include <vle/DiscreteTime.hpp>
#include <sunflo_utils.hpp>
#include <Phenologie.hpp>
#include <ConduiteCulture.hpp>
namespace sunflo {
......@@ -78,7 +77,7 @@ public :
virtual void compute(const vle::devs::Time& /*time*/)
{
if ( ( (int)PhasePhenoPlante(-1) == PHASEPHENOPLANTE_NONSEMEE )
&& ( (int)ActionSemis() == ACTIONCONDUITE_ACTIVE)){
&& ( (int)ActionSemis() == 1)){
memo_densite = densite();
}
......
......@@ -17,7 +17,6 @@
#include <Phenologie.hpp>
#include <ParametresPlante.hpp>
#include <ParametresVariete.hpp>
#include <ConduiteCulture.hpp>
namespace sunflo {
......@@ -247,7 +246,7 @@ public :
} else {
if ( ( (int) PhasePhenoPlante(-1) == PHASEPHENOPLANTE_NONSEMEE)
&& ( (int) ActionSemis() == ACTIONCONDUITE_ACTIVE)){
&& ( (int) ActionSemis() == 1)){
memo_densite = densite();
}
traitementTimingOfLeafAppearanceAndSenescence();
......
......@@ -14,7 +14,6 @@
#include <vle/DiscreteTime.hpp>
#include <Phenologie.hpp>
#include <ConduiteCulture.hpp>
#include <ParametresPlante.hpp>
#include <ParametresVariete.hpp>
#include <ParametresSimuInit.hpp>
......@@ -95,14 +94,14 @@ public :
virtual void compute(const vle::devs::Time& time)
{
if ( ( (int)PhasePhenoPlante(-1) == PHASEPHENOPLANTE_NONSEMEE )
&& ( (int)ActionSemis() == ACTIONCONDUITE_ACTIVE ) ){
&& ( (int)ActionSemis() == 1 ) ){
estimationTTentreSemisEtLevee_casPhaseSemisLeveeSimulee =
pp.date_TT_germination + pp.dHE * zSemis();
}
{
if ( ( (int)PhasePhenoPlante(-1) > PHASEPHENOPLANTE_NONSEMEE )
&& ( (int)PhasePhenoPlante(-1) < PHASEPHENOPLANTE_RECOLTEE )
&& ( (int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ) ){
&& ( (int)ActionRecolte() == 1 ) ){
TT_A0 = 0.0;
} else {
double ddt = 0.0;
......@@ -119,7 +118,7 @@ public :
{
if ( ( (int)PhasePhenoPlante(-1) > PHASEPHENOPLANTE_NONSEMEE )
&& ( (int)PhasePhenoPlante(-1) < PHASEPHENOPLANTE_RECOLTEE )
&& ( (int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ) ){
&& ( (int)ActionRecolte() == 1 ) ){
TT_A2 = 0.0;
} else {
double ddt = 0.0;
......@@ -164,7 +163,7 @@ public :
case PHASEPHENOPLANTE_NONSEMEE :
if ((int)ActionSemis() == ACTIONCONDUITE_ACTIVE ){ // instant de semis
if ((int)ActionSemis() == 1 ){ // instant de semis
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_GERMINATION ;
......@@ -177,13 +176,13 @@ public :
}
}
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
throw vle::utils::ModellingError("[Phenologie] Error recolte avant semis");
}
break;
case PHASEPHENOPLANTE_GERMINATION :
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_RECOLTEE ;
throw vle::utils::ModellingError("[Phenologie] Error recolte en germination ");
} else if ( simulationPhaseSemisLevee ){
......@@ -199,7 +198,7 @@ public :
break;
case PHASEPHENOPLANTE_JUVENILE :
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_RECOLTEE ;
throw vle::utils::ModellingError("[Phenologie] Error recolte pendant juvenile");
......@@ -210,7 +209,7 @@ public :
case PHASEPHENOPLANTE_CROISSANCEACTIVE :
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_RECOLTEE ;
throw vle::utils::ModellingError("[Phenologie] Error recolte pendant croissance active");
} else if ( TT_A2() >= pv.date_TT_F1 ){ // date thermique du stade floraison atteinte
......@@ -219,7 +218,7 @@ public :
break;
case PHASEPHENOPLANTE_FLORAISON :
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_RECOLTEE ;
std::cout << "[Phenologie] Error recolte avant floraison" << "\n";
throw vle::utils::ModellingError("[Phenologie] Error recolte avant floraison");
......@@ -231,7 +230,7 @@ public :
case PHASEPHENOPLANTE_MATURATION :
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_RECOLTEE ;
} else if ( TT_A2() >= pv.date_TT_M3 ){ // date
......@@ -246,7 +245,7 @@ public :
break;
case PHASEPHENOPLANTE_DESSICATION :
if ((int)ActionRecolte() == ACTIONCONDUITE_ACTIVE ){
if ((int)ActionRecolte() == 1 ){
PhasePhenoPlante_tmp = PHASEPHENOPLANTE_RECOLTEE ;
}
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment