Diagnostic.cpp 3.47 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
 *
 * 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 <ParametresPlante.hpp>
#include <ParametresVariete.hpp>
#include <ParametresSimuInit.hpp>

namespace sunflo {

using namespace vle::discrete_time;

class Diagnostic : public DiscreteTimeDyn
{
public :
    ParametresVariete pv;
    ParametresPlante pp;
    ParametresSimuInit psi;
    bool first_compute;

    /*Sync*/ Var TT_A2;
    /*Sync*/ Var ChgtPhasePhenoPlante;
    /*Sync*/ Var ETRETM;


    /// # Jours de stress jusqu'a la floraison (estimationTTentreSemisEtLevee_casPhaseSemisLeveeSimulee - F1)
    /// # (pas utilisé dans le modèle, sortie de Diagnostic)
    Var ISH1;

    /// # Jours de stress Autour de la floraison (F1 + 350°Cd)
    /// # (pas utilisé dans le modèle, sortie de Diagnostic)
    Var ISH2;

    /// # Jours de stress après la floraison (F1+350 °Cd – M3)
    /// # (pas utilisé dans le modèle, sortie de Diagnostic)
    Var ISH3;

    Diagnostic(const vle::devs::DynamicsInit& model,
            const vle::devs::InitEventList& events) :
                DiscreteTimeDyn(model, events)
    {
        pv.initialiser(events);
        psi.initialiser(events);
        pp.initialiser(events);

        TT_A2.init(this, "TT_A2", events);
        ChgtPhasePhenoPlante.init(this, "ChgtPhasePhenoPlante", events);
        ETRETM.init(this, "ETRETM", events);
        ISH1.init(this, "ISH1" , events);
        ISH2.init(this, "ISH2" , events);
        ISH3.init(this, "ISH3" , events);
65
66

        first_compute = true;
67
68
69
70
71
72
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
    }

    virtual ~Diagnostic() { }

    virtual void compute(const vle::devs::Time& /*time*/ )
    {
        if (first_compute) {
            first_compute = false;
            ISH1 = 0.0; //codeMMpourMemo Initial Value = 0.0
            ISH2 = 0.0; //codeMMpourMemo Initial Value = 0.0
            ISH3 = 0.0; //codeMMpourMemo Initial Value = 0.0
        } else {
            {
                double ddt = 0.0;
                if ( ETRETM() > psi.SeuilETRETM ){
                    ddt = 0.0;
                } else if ( TT_A2() > pv.date_TT_F1 ){
                    ddt = 0.0;
                } else if ( TT_A2() <= 0.0 ){
                    // traduit condition TT_A2 <= 0
                    ddt = 0.0;
                } else {
                    ddt = 1.0;
                }
                ISH1 = ISH1(-1) + ddt;
            }

            {
                double ddt = 0.0;

                if ( ETRETM() > psi.SeuilETRETM ){
                    ddt = 0.0;
                } else if ( TT_A2() > (pv.date_TT_F1 + pp.date_TT_F1M0) ){
                    ddt = 0.0;
                } else if ( TT_A2() < pv.date_TT_F1 ){
                    ddt = 0.0;
                } else {
                    ddt = 1.0;
                }
                ISH2 = ISH2(-1) + ddt;
            }


            {
                double ddt = 0.0;

                if ( ETRETM() > psi.SeuilETRETM ){
                    ddt = 0.0;
                } else if ( TT_A2() > pv.date_TT_M3 ){
                    ddt = 0.0;
                } else if ( TT_A2() < (pv.date_TT_F1 + pp.date_TT_F1M0) ){
                    ddt = 0.0;
                } else {
                    ddt = 1.0;
                }
                ISH3 = ISH3(-1) + ddt;
            }
        }
    }
};

} // namespace sunflo

DECLARE_DYNAMICS(sunflo::Diagnostic);