ElaborationRendement.cpp 10.8 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
35
36
37
38
    ParametresVariete pv;
    bool first_compute;

    /*Sync*/ Var PhasePhenoPlante;
    /*Sync*/ Var TT_F1;
    /*Sync*/ Var TDM;
    /*Sync*/ Var ETRETM;
    /*Sync*/ Var TRPF;
    /*Sync*/ Var INN;
RemiM's avatar
RemiM committed
39
40
   /*Sync*/ Var Foo;

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    /// # Rendement (0% humidité, 0% impuretés)
    Var RDT;
    /// # Jours de stress végétatifs (E1 - F1) (covariables statistiques)
    Var JSE;
    /// # Jours de stress à la floraison (F1 - M0) (covariables statistiques)
    Var JSF;
    /// # Jours de stress après la floraison (M0 - M3) (covariables statistiques)
    Var JSM;
    /// # Modèle linéaire expliquant l’indice de récolte
    Var IRs;
    /// Capture de INN a un instant donne (ex INNF1)
    Var photo_INN_CROISSANCEACTIVE_A_FLORAISON;
    /// 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
60
61
62
/////////////////////////////REMI ADDS//////////////////////////////////
    Var Foo2;
////////////////////////////////////////////////////////////////////////
63
64
65
66
67

    ElaborationRendement(const vle::devs::DynamicsInit& model,
            const vle::devs::InitEventList& events) :
                DiscreteTimeDyn(model, events)
    {
RemiM's avatar
RemiM committed
68
69
70
71
/////////////////////////////REMI ADDS//////////////////////////////////
        Foo.init(this, "Foo", events);
        Foo2.init(this, "Foo2", events);  
////////////////////////////////////////////////////////////////////////
72
        pr.initialiser( events );
73
74
75
76
77
78
79
80
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
107
108
109
110
111
112
113
        pv.initialiser( events );


        PhasePhenoPlante.init(this, "PhasePhenoPlante", events);
        TT_F1.init(this, "TT_F1", events);
        TDM.init(this, "TDM", events);
        ETRETM.init(this, "ETRETM", events);
        TRPF.init(this, "TRPF", events);
        INN.init(this, "INN", events);
        RDT.init(this, "RDT" , events);
        JSE.init(this, "JSE" , events);
        JSF.init(this, "JSF" , events);
        JSM.init(this, "JSM" , events);
        IRs.init(this, "IRs" , events);
        photo_INN_CROISSANCEACTIVE_A_FLORAISON.init(this, "photo_INN_CROISSANCEACTIVE_A_FLORAISON" , 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;
    }

    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;
            JSE = 0.0; //codeMMpourMemo Initial Value = 0.0
            JSF = 0.0; //codeMMpourMemo Initial Value = 0.0
            JSM = 0.0; //codeMMpourMemo Initial Value = 0.0
            photo_TDM_CROISSANCEACTIVE_A_FLORAISON = 0.0; //codeMMpourMemo  TDMF1 = 0
            photo_INN_CROISSANCEACTIVE_A_FLORAISON = 0.0; //codeMMpourMemo  INNF1 = 0
            IRs = 0.0;
            photo_IRs_aFinMATURATION = 0.0;
RemiM's avatar
RemiM committed
114
115
116
/////////////////////////////REMI ADDS//////////////////////////////////
	    Foo2 = 0;
////////////////////////////////////////////////////////////////////////
117
118
119
120
121
122
123
124
125
126
127
128
129
            {
                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;
            }
            photo_RDT_aFinMATURATION = 0.0;
        } else {
RemiM's avatar
RemiM committed
130
131
132
133
134
/////////////////////////////REMI ADDS//////////////////////////////////
            {
                Foo2 = 3*Foo();
            }
////////////////////////////////////////////////////////////////////////
135
136
137
            {
                double ddt = 0.0;

138
                if ( ETRETM() > pr.SeuilETRETM ){
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
                    ddt = 0.0;
                } else if ( ( PhasePhenoPlante() >= PHASEPHENOPLANTE_FLORAISON)
                        && ( PhasePhenoPlante() < PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 > date_TT_F1
                    ddt = 0.0;
                } else if ( ( PhasePhenoPlante() < PHASEPHENOPLANTE_CROISSANCEACTIVE)
                        || ( PhasePhenoPlante() >= PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 < date_TT_E1
                    ddt = 0.0;
                } else {
                    ddt = 1.0;
                }
                JSE = JSE(-1) + ddt;
            }

            {
                double ddt = 0.0;

157
                if ( ETRETM() > pr.SeuilETRETM ){
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
                    ddt = 0.0;

                } else if ( ( PhasePhenoPlante() >= PHASEPHENOPLANTE_MATURATION)
                        && ( PhasePhenoPlante() < PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 > date_TT_M0
                    ddt = 0.0;
                } else if ( ( PhasePhenoPlante() < PHASEPHENOPLANTE_FLORAISON)
                        || ( PhasePhenoPlante() >= PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 < date_TT_F1
                    ddt = 0.0;
                } else {
                    ddt = 1.0;
                }
                JSF = JSF(-1) + ddt;
            }

            {
                double ddt = 0.0;

177
                if ( ETRETM() > pr.SeuilETRETM ){
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
                    ddt = 0.0;

                } else if ( ( PhasePhenoPlante() >= PHASEPHENOPLANTE_DESSICATION)
                        && ( PhasePhenoPlante() < PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 > date_TT_M3
                    ddt = 0.0;
                } else if ( ( PhasePhenoPlante() < PHASEPHENOPLANTE_MATURATION)
                        || ( PhasePhenoPlante() >= PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 < date_TT_M0
                    ddt = 0.0;
                } else {
                    ddt = 1.0;
                }
                JSM = JSM(-1) + ddt;
            }

194
195
            if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_CROISSANCEACTIVE) and
                    (PhasePhenoPlante() == PHASEPHENOPLANTE_FLORAISON)){
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
                photo_TDM_CROISSANCEACTIVE_A_FLORAISON = TDM(-1); // derniere valeur en CROISSANCEACTIVE
                photo_INN_CROISSANCEACTIVE_A_FLORAISON = INN(-1); // derniere valeur en CROISSANCEACTIVE
            } else if ( PhasePhenoPlante() >= PHASEPHENOPLANTE_FLORAISON ){
                photo_TDM_CROISSANCEACTIVE_A_FLORAISON = photo_TDM_CROISSANCEACTIVE_A_FLORAISON(-1);
                photo_INN_CROISSANCEACTIVE_A_FLORAISON = photo_INN_CROISSANCEACTIVE_A_FLORAISON(-1);
            } else {
                photo_TDM_CROISSANCEACTIVE_A_FLORAISON = photo_TDM_CROISSANCEACTIVE_A_FLORAISON(-1);
                photo_INN_CROISSANCEACTIVE_A_FLORAISON = photo_INN_CROISSANCEACTIVE_A_FLORAISON(-1);
            }

            {
                double IRs_tmp = 0.0;

                if ( ( PhasePhenoPlante() < PHASEPHENOPLANTE_FLORAISON)
                        || ( PhasePhenoPlante() >= PHASEPHENOPLANTE_RECOLTEE) ){
                    // traduit condition TT_A2 < date_TT_F1
                    IRs_tmp = 0.0;
                } else {
                    IRs_tmp = 9.370e-02 + (-1.552e-04) * photo_TDM_CROISSANCEACTIVE_A_FLORAISON()
                                    + (-2.828e-03) * JSE() + (-2.557e-03) * JSF()
                                    + (-1.940e-03) * JSM() + (-3.907e-04) * TRPF()
                                    + 1.274e-04 * TT_F1() + 8.189e-01 * pv.IRg;
                }
                IRs = IRs_tmp;
            }

222
223
224
            if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                    (PhasePhenoPlante() == PHASEPHENOPLANTE_DESSICATION)){

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

227
228
229
            } else if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                    (PhasePhenoPlante() == PHASEPHENOPLANTE_RECOLTEE)){

230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
                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 {
246
247
248
249
                    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;
250
251
252
                }
                RDT = RDT_tmp;

253
254
                if ((PhasePhenoPlante(-1) == PHASEPHENOPLANTE_MATURATION) and
                        (PhasePhenoPlante() == PHASEPHENOPLANTE_DESSICATION)){
255
256

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

260
261
262
263
264
265
266
267
268
269
270
271
272
                    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);