ElaborationRendement.cpp 7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
 *
 * Copyright (C) 2009-2014 INRA.
 * Copyright (C) 2009-2014 CETIOM.
 *
 *
 * TODO licence
 */

// @@tagdynamic@@
// @@tagdepends: vle.discrete-time @@endtagdepends


#include <math.h>
#include <vle/DiscreteTime.hpp>
#include <sunflo_utils.hpp>
#include <Phenologie.hpp>
#include <ParametresVariete.hpp>
19
#include <ParametresRendement.hpp>
20
21
22
23
24
25
26
27
28


namespace sunflo {

using namespace vle::discrete_time;

class ElaborationRendement : public DiscreteTimeDyn
{
public :
29
    ParametresRendement pr;
30
31
32
33
34
    ParametresVariete pv;
    bool first_compute;

    /*Sync*/ Var PhasePhenoPlante;
    /*Sync*/ Var TDM;
35
   // /*Sync*/ Var INN;
RemiM's avatar
RemiM committed
36

37
38
39
40
41
42
43
44
45
46
47
    /// # Rendement (0% humidité, 0% impuretés)
    Var RDT;
    /// # Modèle linéaire expliquant l’indice de récolte
    Var IRs;
    /// Capture de TDM a un instant donne (ex TDMF1)
    Var photo_TDM_CROISSANCEACTIVE_A_FLORAISON;
    /// Capture de IRs a un instant donne (ex IR)
    Var photo_IRs_aFinMATURATION;
    /// Capture de RDT a un instant donne
    Var photo_RDT_aFinMATURATION;

RemiM's avatar
RemiM committed
48

49
50
51
52
53
54
// Jours de stress végétatifs (E1 - F1) (covariables statistiques)
    Var NET_EF;
// Jours de stress végétatifs (F1 - M0) (covariables statistiques)
    Var NET_FM;
// Jours de stress végétatifs (M0 - M3) (covariables statistiques)
    Var NET_MH;
55
56
// Somme temps thermique après floraison (M0 - M3) (covariables statistiques)
    Var TT_MH;
57
58
59
60
61

    ElaborationRendement(const vle::devs::DynamicsInit& model,
            const vle::devs::InitEventList& events) :
                DiscreteTimeDyn(model, events)
    {
RemiM's avatar
RemiM committed
62

63
        pr.initialiser( events );
64
65
66
67
68
69
70
71
72
73
74
        pv.initialiser( events );


        PhasePhenoPlante.init(this, "PhasePhenoPlante", events);
        TDM.init(this, "TDM", events);
        RDT.init(this, "RDT" , events);
        IRs.init(this, "IRs" , events);
        photo_TDM_CROISSANCEACTIVE_A_FLORAISON.init(this, "photo_TDM_CROISSANCEACTIVE_A_FLORAISON" , events);
        photo_IRs_aFinMATURATION.init(this, "photo_IRs_aFinMATURATION" , events);
        photo_RDT_aFinMATURATION.init(this, "photo_RDT_aFinMATURATION" , events);
        first_compute = true;
75
76
77
78
79

	// Jours de stress végétatifs (E1 - F1) (covariables statistiques)
	    NET_EF.init(this, "NET_EF", events);
	    NET_FM.init(this, "NET_FM", events);
	    NET_MH.init(this, "NET_MH", events);
80
	    TT_MH.init(this, "TT_MH", events);
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
    }

    virtual ~ElaborationRendement() { }

    /**********************************************************************//**
     *
     * Traitement effectue a chaque pas de temps.
     *
     * Description de la facon dont le code ModelMaker de depart a ete interprete, traduit sous VLE : voir TRADUCTION_DE_MODELMAKER_EN_VLE dans la classe de documentation DOCsunfloV1.
     *
     **************************************************************************/
    virtual void compute(const vle::devs::Time& /*time*/)
    {
        if (first_compute) {
            first_compute = false;
            {
                double RDT_tmp = 0.0;
                if ( ( PhasePhenoPlante() >= PHASEPHENOPLANTE_DESSICATION )
                        && ( PhasePhenoPlante() < PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 >= date_TT_M3
                    RDT_tmp = TDM() * photo_IRs_aFinMATURATION() / 10.0;
                } else {
                    RDT_tmp = TDM() * IRs() / 10.0;
                }
                RDT = RDT_tmp;
            }
107
            photo_RDT_aFinMATURATION = 0.0; 
108
109
        } else {

110
111
            if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_CROISSANCEACTIVE) and
                    (PhasePhenoPlante() == PHASEPHENOPLANTE_FLORAISON)){
112
113
                //photo_TDM_CROISSANCEACTIVE_A_FLORAISON = TDM(-1); // derniere valeur en CROISSANCEACTIVE
                photo_TDM_CROISSANCEACTIVE_A_FLORAISON = TDM(); // première valeur en floraison
114
115
116
117
118
119
120
            } else if ( PhasePhenoPlante() >= PHASEPHENOPLANTE_FLORAISON ){
                photo_TDM_CROISSANCEACTIVE_A_FLORAISON = photo_TDM_CROISSANCEACTIVE_A_FLORAISON(-1);
            } else {
                photo_TDM_CROISSANCEACTIVE_A_FLORAISON = photo_TDM_CROISSANCEACTIVE_A_FLORAISON(-1);
            }


121
122
            {
                double IRs_tmp = 0.0;
123

124
125
126
127
128
                if ( ( PhasePhenoPlante() < PHASEPHENOPLANTE_FLORAISON)
                        || ( PhasePhenoPlante() >= PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 < date_TT_F1
                    IRs_tmp = 0.0;
                } else {
RemiM's avatar
RemiM committed
129
130
		// GY converted (no impurity, no humidity,  0.91 * 0.98 = 0.8918)
                    IRs_tmp = 0.8918*(0.416 + (-1.42e-04) * photo_TDM_CROISSANCEACTIVE_A_FLORAISON()
131
132
                                    + (1.19e-03) * NET_EF() + (-8.45e-04) * NET_FM()
                                    + (-2.47e-04) * NET_MH() 
RemiM's avatar
RemiM committed
133
                                    + (-3.61e-04) * TT_MH() + 7.75e-01 * pv.IRg);
134
135
136
                }
                IRs = IRs_tmp;
            }
137
138
139
            if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                    (PhasePhenoPlante() == PHASEPHENOPLANTE_DESSICATION)){

140
141
                photo_IRs_aFinMATURATION = IRs(-1); // derniere valeur en MATURATION et non pas 1ere en DESSICATION

142
143
144
            } else if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                    (PhasePhenoPlante() == PHASEPHENOPLANTE_RECOLTEE)){

145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
                photo_IRs_aFinMATURATION = IRs(-1); // derniere valeur en MATURATION et non pas 1ere en RECOLTEE

            } else if ( PhasePhenoPlante() >= PHASEPHENOPLANTE_DESSICATION ){
                photo_IRs_aFinMATURATION = photo_IRs_aFinMATURATION(-1);
            } else {
                photo_IRs_aFinMATURATION = photo_IRs_aFinMATURATION(-1);
            }

            {
                double RDT_tmp = 0.0;

                if ( ( PhasePhenoPlante() >= PHASEPHENOPLANTE_DESSICATION )
                        && ( PhasePhenoPlante() < PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 >= date_TT_M3
                    RDT_tmp = TDM() * photo_IRs_aFinMATURATION() / 10.0;
                } else {
161
162
163
164
                    double dI = IRs() - IRs(-1);
                    double dT = TDM() - TDM(-1);
                    //RDT_tmp = TDM() * IRs() / 10.0;
                    RDT_tmp = RDT(-1) + (TDM(-1)*dI + IRs(-1)*dT +dI*dT)/ 10.0;
165
166
167
                }
                RDT = RDT_tmp;

168
169
                if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                        (PhasePhenoPlante() == PHASEPHENOPLANTE_DESSICATION)){
170
171

                    photo_RDT_aFinMATURATION = RDT(-1); // derniere valeur en MATURATION et non pas 1ere en DESSICATION
172
173
174
                } else if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                        (PhasePhenoPlante() == PHASEPHENOPLANTE_RECOLTEE)){

175
176
177
178
179
180
181
182
183
184
185
186
187
                    photo_RDT_aFinMATURATION = RDT(-1); // derniere valeur en MATURATION et non pas 1ere en RECOLTEE
                } else {
                    photo_RDT_aFinMATURATION = photo_RDT_aFinMATURATION(-1);
                }
            }
        }
    }
};

} // namespace sunflo

DECLARE_DYNAMICS(sunflo::ElaborationRendement);