cohorte.hpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. /**
  2. * @file tests/plot/cohorte.hpp
  3. * @author The PARADEVS Development Team
  4. * See the AUTHORS or Authors.txt file
  5. */
  6. /*
  7. * PARADEVS - the multimodeling and simulation environment
  8. * This file is a part of the PARADEVS environment
  9. *
  10. * Copyright (C) 2013-2015 ULCO http://www.univ-litoral.fr
  11. * Copyright (C) 2009 INRA
  12. *
  13. * This program is free software: you can redistribute it and/or modify
  14. * it under the terms of the GNU General Public License as published by
  15. * the Free Software Foundation, either version 3 of the License, or
  16. * (at your option) any later version.
  17. *
  18. * This program is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * You should have received a copy of the GNU General Public License
  24. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  25. */
  26. #ifndef TESTS_PLOT_COHORTE_HPP
  27. #define TESTS_PLOT_COHORTE_HPP 1
  28. namespace paradevs { namespace tests { namespace plot {
  29. class Cohorte
  30. {
  31. public:
  32. Cohorte(int id, double InocPrim, double P1, double P2, double P3,
  33. double P4, double P5, double P6, double P7, double P8,
  34. double P9, double P10, double P11, double P12, double P13,
  35. double P14, double d0, double d1, double dc, double cum0,
  36. double cum1, double topt, double tmin, double fact, double ssa)
  37. {
  38. ID = id;
  39. count_AFFAIB = 0;
  40. TUDESPO = 0.0;
  41. CUMDDS = 0.0;
  42. SURVIE = 1.0;
  43. SPORES = InocPrim;
  44. GRAVI = 0.0;
  45. POIDS = 0.0;
  46. RET = 0.0;
  47. TINCUB = 0.0;
  48. AGE = 0.0;
  49. KASPOTHEO = 0.0;
  50. TRED = 0.0;
  51. AFFAIB = 0.0;
  52. KASPOREELLE = 0.0;
  53. POSPO = 0.0;
  54. SPOSPO = 0.0;
  55. TUSPORU = 0.0;
  56. CUMSPO = 0.0;
  57. ACTISPO = 0.0;
  58. SPORUL = 0.0;
  59. SURFMIL = 0.0;
  60. p1 = P1;
  61. p2 = P2;
  62. p3 = P3;
  63. p4 = P4;
  64. p5 = P5;
  65. p6 = P6;
  66. p7 = P7;
  67. p8 = P8;
  68. p9 = P9;
  69. p10 = P10;
  70. p11 = P11;
  71. p12 = P12;
  72. p13 = P13;
  73. p14 = P14;
  74. D0 = d0;
  75. D1 = d1;
  76. Dc = dc;
  77. CUM0 = cum0;
  78. CUM1 = cum1;
  79. Topt = topt;
  80. Tmin = tmin;
  81. FACT = fact;
  82. SSA = ssa;
  83. }
  84. virtual ~Cohorte()
  85. { };
  86. void compute(double Tmoy, double HR)
  87. {
  88. if (CUMDDS < D1) { //Compartiment Survie et Contamination
  89. //TUDESPO
  90. if (Tmoy < 18.0) {
  91. TUDESPO = p1 * Tmoy + p2;
  92. } else {
  93. TUDESPO = p3;
  94. }
  95. //CUMDDS
  96. CUMDDS += TUDESPO;
  97. //SURVIE
  98. if (HR > 90.0) {
  99. SURVIE = 1.0;
  100. } else if (CUMDDS <= Dc) {
  101. SURVIE = 1 - CUMDDS / Dc;
  102. } else {
  103. SURVIE = 0.0;
  104. }
  105. //SPORES
  106. SPORES *= SURVIE;
  107. //GRAVI
  108. if (HR < 90.0) {
  109. GRAVI = 0.0;
  110. } else {
  111. GRAVI = (CUMDDS - D0) / (D1 - D0);
  112. }
  113. //POIDS
  114. POIDS = SPORES * GRAVI;
  115. } else { //Compartiment Incubation et Sporulation
  116. //potentielle & réelle
  117. //RET
  118. if (Tmoy <= Topt) {
  119. RET = 0.0;
  120. } else {
  121. RET = p5 * std::pow((Tmoy - Topt), p6);
  122. }
  123. //TINCUB
  124. if (Tmoy <= 18.0) {
  125. TINCUB = p4 * Tmoy;
  126. } else {
  127. TINCUB = p4 * Tmoy - RET;
  128. }
  129. //AGE
  130. AGE += TINCUB;
  131. if (AGE > p7)
  132. {
  133. //KASPOTHEO
  134. if (AGE < p8) {
  135. KASPOTHEO = FACT * (AGE - p7) / p7;
  136. } else if (AGE < p9) {
  137. KASPOTHEO = FACT * (p9 - AGE) / p9;
  138. } else {
  139. KASPOTHEO = 0.0;
  140. }
  141. //TRED
  142. if (Tmoy <= 18.0) {
  143. TRED = 0.0;
  144. } else {
  145. TRED = FACT * p10 * std::pow(Tmoy - Topt, p6);
  146. }
  147. //AFFAIB
  148. count_AFFAIB++;
  149. if (count_AFFAIB % 12 != 1) {
  150. AFFAIB += TRED;
  151. } else {
  152. AFFAIB = TRED; // Remise a 0 de AFFAIB toutes
  153. // les 12 heures
  154. }
  155. //KASPOREELLE
  156. KASPOREELLE = KASPOTHEO - AFFAIB;
  157. //POSPO
  158. POSPO = POIDS * KASPOREELLE;
  159. //SPOSPO
  160. SPOSPO += POSPO;
  161. //TUSPORU
  162. if (HR <= 90.0) {
  163. TUSPORU = 0.0;
  164. } else {
  165. TUSPORU = p11 * std::pow(Tmoy - Tmin, 2) *
  166. (p13 - p14 * (Tmoy - Tmin));
  167. }
  168. //CUMSPO
  169. CUMSPO += TUSPORU;
  170. //ACTISPO
  171. if (CUMSPO < CUM0) {
  172. ACTISPO = 0.0;
  173. } else if (CUMSPO < CUM1) {
  174. ACTISPO = (CUMSPO - CUM0) / (CUM1 - CUM0);
  175. } else {
  176. ACTISPO = 1.0;
  177. }
  178. //SPORUL
  179. SPORUL = ACTISPO * SPOSPO;
  180. //SURFMIL
  181. SURFMIL = SPORUL * SSA;
  182. }
  183. }
  184. }
  185. double age() const
  186. { return AGE; }
  187. double sporul() const
  188. { return SPORUL; }
  189. private:
  190. int ID;
  191. unsigned int count_AFFAIB;
  192. //paramètres du modèle de cohorte
  193. double p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14;
  194. double D0, D1, Dc;
  195. double CUM0, CUM1;
  196. double Topt, Tmin;
  197. double FACT, SSA;
  198. //variables d'état du modèle de cohorte
  199. double TUDESPO; // Unité de développement des spores en 1
  200. // heure en fonction de la température horaire
  201. double CUMDDS; // Evolution du développement des spores depuis
  202. // l'instant initiale (arrivée de l'inoculum
  203. // primaire). Il faut 100 unités pour que
  204. // commence la germinantion des spores. A 150
  205. // unités, toutes les spores ont germé.
  206. double SURVIE; // Calcul de la survie des spores en fonction
  207. // de l'HR et de CUMDDS. Si HR > 90, toutes
  208. // les spores survivent ; si HR<90, la
  209. // mortalité des spores augmente au fur et à
  210. // mesure que CUMDDS apporche de 100. Les
  211. // spores qui ont commencé à émettre un tube
  212. // germinantif meurent en 1 heure si HR < 90.
  213. double SPORES; // C'est le nombre de spores au cours du temps
  214. // en fonction de la survie. Cette variable
  215. // donne à la fin (CUMDDS = 150) le nombre de
  216. // spores réellement prêtes pour germer après
  217. // la mortatilté due aus conditions climatiques.
  218. double GRAVI; // Proportion de spores (parmi celles qui ont
  219. // survecu = SPORES) ayant germé en fonction de HR
  220. double POIDS; // Cette variable donne le nombre de spores
  221. // contaminatrices, càd celles qui entrent en
  222. // période d'incubation et qui sont
  223. // susceptibles de sporuler en fonction des
  224. // conditions de développement et climatiques
  225. double RET; // Les températures > 18 °C diminuent la
  226. // valeur de TINCUB. Cette variable permet de
  227. // calculer cette diminution.
  228. double TINCUB; // Unité de développement horaire des
  229. // mycéliums pour provoquer les lésions (en
  230. // fonction de la témpérature horaire)
  231. double AGE; // C'est la valeur au cours du temps du
  232. // développement des mycéliums. 75 = nombre
  233. // d'unités nécessaire pour la période
  234. // d'incubation, ce qui correspond au début
  235. // sporulation si condition favorable 150 =
  236. // âge maximale de la lésion correspondant au
  237. // maximum de sporulation 225 = toute la
  238. // lésion est nécrosée, ce qui correspond à la
  239. // fin de la sporulation si condition favorable
  240. double KASPOTHEO; // C'est la capacité de sporulation
  241. // théorique d'une spore qui commence
  242. // uniquement après qu'on ait atteint AGE =
  243. // 75. Il augmente et atteint son maximum à
  244. // AGE =150 et diminue jusqu'à 0 vers AGE = 225.
  245. double TRED; // Quand T > 18 °C, il y a réduction de KASPO,
  246. // cette variable quantifie cette diminution
  247. // en fonction de la température horaire.
  248. double AFFAIB; // C'est la somme de TRED qui est calculée par
  249. // période de 12 heures.
  250. double KASPOREELLE; // C'est la capacité de sporulation réelle
  251. // après enlèvement des effets dus à AFFAIB
  252. double POSPO; // C'est la capacité de sporulation de
  253. // l'ensemble des spores contaminatrices (POIDS)
  254. double SPOSPO; // Potentiel de sporulation des lésions
  255. // (causées par toutes les spores
  256. // contaminatrices, tant que les conditions
  257. // sont favorables) jusqu'à ce qu'elles ne
  258. // sont plus en mesure de sporuler (necrose
  259. // des lésions).
  260. double TUSPORU; // Unité de développement de la sporulation en
  261. // fonction de la température horaire
  262. double CUMSPO; // Degré de développement de la sporulation au
  263. // cours du temps.
  264. double ACTISPO; // Proportion de spores effectivement
  265. // produites par rapport à sporulation
  266. // potentielle. Il faut CUMSPO = 6 pour
  267. // débuter la sporulation réelle CUMSPO = 10,
  268. // le potentiel est atteint
  269. double SPORUL; // C'est le nombre de spores réellement
  270. // produites et prêtes à être dispersées.
  271. double SURFMIL; // Conversion du nombre de spores en une
  272. // taille de lésion. Elle correspond à la
  273. // surface mildiousée.
  274. };
  275. } } } // namespace paradevs tests plot
  276. #endif