source: branches/publications/ORCHIDEE-GMv3.2/ORCHIDEE/src_sticslai/Besoins_en_froid.f90 @ 6940

Last change on this file since 6940 was 6940, checked in by jinfeng.chang, 4 years ago

add missing files for ORCHIDEE-GMv3.2

File size: 15.6 KB
Line 
1!> Module of vernalisation or chilling requirements
2!> - Stics book paragraphe 2.3.4, page 33-36
3!>
4!! Winter crops and perennial crops in temperate climate zones have vernalisation or chilling requirements.  The formalisations classically applied and used
5!! in STICS differ for herbaceous plants (vernalisation) and woody plants (dormancy).  For herbaceous plants, the resting state is considered not to be total,
6!! and the "vernalisation" formalisation which applies to herbaceous plants allows a partial accumulation of development units during winter rest.
7!! For woody plants the "dormancy" formalisations are much severe, and development units are only active when all chilling requirements have been met.
8!! Consequently, non-compliance with vernalisation requirements slows (rfvi <1 for herbaceous plants) or stops (rfvi = 0 for ligneous plants) the development of crops.
9!! For woody plants the post-dormancy period is characterized by the phasic course between dormancy break (ifindorm) and budding (ILEV), i.e. stdordebour.
10!>  - Vernalisation (achieved by function "Vernalisation" in this module)
11!!   Vernalisation requirements are defined by the genotype-dependent number of vernalising days (jvc) and the vernalising value of a given day (jvi) depends on
12!!   crop temperature.  Vernalising days are counted from germination (IGER) for annual crops because an active metabolism is required to initiate the process,
13!!   or from the julvernal day for perennial crops.  A minimum number of vernalising days, jvcmini is required. The progress in crop vernalisation, rfvi,
14!!   gradually increases until it reaches the value of 1.
15!!   tfroid (optimum vernalisation temperature) and ampfroid (thermal semi-amplitude of the vernalising effect) are parameters which provide the range of
16!!   vernalising activity of temperatures. ampfroid indicates the sensitivity of the species to vernalisation: if it is low, the range of vernalising temperatures
17!!   is narrow and a long period will be necessary to meet the requirements; if it is high, the temperature range is broader and results in more rapid vernalisation.
18!>  - Dormancy (achieved by functions "Dormancy_Richardson" and "Dormancy_Bidabe" in this module)
19!!   This module deals with the perennial dormancy and not with the dormancy break of annual crop grains such as wheat, barley or pea that can lead to germination
20!!   of the grain on the plants before harvest.
21!!   The aim is to calculate the day of break of dormancy (IFINDORM), which makes it possible to change the rfvi variable from 0 to 1, bearing in mind that it is
22!!   always possible to impose this date and ignore the following dormancy calculations. Two options are available to calculate the break of dormancy, relying on
23!!   well known formulae used for fruit trees for both vegetative or reproductive buds, and minimal and maximal values of the air temperature (tmin and tmax).
24!>      - The first dormancy calculation included in STICS (see function "Dormancy_Richardson") is the one by Richardson et al. (1974), developed for peach trees.
25!!       It is based on accumulated chilling hourly units (cuh) effective to ensure break of dormancy. The relationship between cuh and hourly temperature
26!!       is a "stepped" function.
27!!       In order to be able to use bibliographic references to chilling requirements, we reconstitute hourly temperatures in accordance with Richardson's proposals
28!!       (Richardson et al., 1974): min at 0 hour, tmax at 12 hours and linear interpolation between the two. The active sum of cuh starts in the autumn as soon
29!!       as the cuh are positive, defining idebdorm. The instability which may be generated by alternating positive and negative cuh has no effect on the final
30!!       result for dormancy break.
31!>      - The second dormancy calculation (see function "Dormancy_Bidabe") is derived from the formulation proposed by Bidabe in 1965 to calculate dormancy and
32!!       post-dormancy durations for apple trees, based on the Q10 notion which corresponds to exponential type responses to temperature.
33!!       In STICS, we just use what concerns the dormancy period, since the post-dormancy period (i.e. from IFINDORM to ILEV)
34!!       is accounted for by the positive responses to temperature. The daily responses are accumulated (cu) until the current day (I) from a starting date (idebdorm)
35!!       generally taken to be during the autumn or the summer (Garcia de Cortazar, 2006). It has little effect on the calculation. The genetic-dependent parameter
36!!       for the amount of chilling requirement is jvc.
37!*-----------------------------------------------------------------------------------------------------------------------------------------------------------* c!!
38module Besoins_en_froid
39
40USE Stics
41
42IMPLICIT NONE
43PRIVATE
44PUBLIC Vernalisation
45
46contains
47
48
49!> *************************************************** !
50!! * Calcul des besoins en froid (sortie de develop) * !
51!< *************************************************** !
52
53!> I comment the subroutine broid----xcwu
54
55
56!subroutine bfroid(tdev,P_codebfroid,caljvc,P_jvc,P_jvcmini,rfvi,etatvernal,P_codeperenne,P_culturean,P_codeinitprec,maxwth, &
57!!                  nbjanrec,nrecbutoir,P_tfroid,P_ampfroid,jjul,P_codedormance,thor,cu_min,cu_veille,cu,ndebdorm,n,P_q10,tmin,tmax)
58!! DR 20/07/2012 on a plus besoin de jjul
59!                  nbjanrec,nrecbutoir,P_tfroid,P_ampfroid,P_codedormance, &
60!                  !   thor,cu_min,cu_veille,cu,ndebdorm,n,P_q10,tmin,tmax)
61!                  !-- apparemment, en trop, inutile ,numcult)
62!
63!implicit none
64!
65!!: les ARGUMENTS
66!  real,     intent(IN)     :: tdev 
67!  integer,  intent(IN)     :: P_codebfroid  !> // PARAMETER // option of calculation of chilling requirements // code 1/2 // PARPLT // 0
68!  real,     intent(INOUT)  :: caljvc 
69!  real,     intent(IN)     :: P_jvc  !> // PARAMETER // Number of vernalizing days // day // PARPLT // 1
70!  real,     intent(IN)     :: P_jvcmini  !> // PARAMETER // Minimum number of vernalising days  // day // PARPLT // 1
71!  real,     intent(OUT)    :: rfvi   !> // OUTPUT // Slowing effect of the vernalization on plant development // 0-1
72!  logical,  intent(INOUT)  :: etatvernal 
73!  integer,  intent(IN)     :: P_codeperenne  !> // PARAMETER // option defining the annual (1) or perenial (2) character of the plant // code 1/2 // PARPLT // 0
74!  integer,  intent(IN)     :: P_culturean  !> // PARAMETER // crop status 1 = over 1 calendar year ,other than 1  = on two calendar years (winter crop in northern hemisphere) // code 0/1 // P_USM/USMXML // 0
75!  integer,  intent(IN)     :: P_codeinitprec  !> // PARAMETER // reinitializing initial status in case of chaining simulations : yes (1), no (2) // code 1/2 // PARAM // 0
76!  integer,  intent(INOUT)  :: maxwth 
77!  integer,  intent(IN)     :: nbjanrec 
78!  integer,  intent(OUT)    :: nrecbutoir 
79!  real,     intent(IN)     :: P_tfroid  !> // PARAMETER // optimal temperature for vernalisation // degree C // PARPLT // 1
80!  real,     intent(IN)     :: P_ampfroid  !> // PARAMETER // semi thermal amplitude thermique for vernalising effect // degree C // PARPLT // 1
81!! DR 20/07/2012 on a plus besoin de jjul
82!!  integer,  intent(IN)     :: jjul
83!  integer,  intent(IN)     :: P_codedormance  !> // PARAMETER // option of calculation of dormancy and chilling requirement // code 1/2 // PARPLT // 0
84!  real,     intent(IN)     :: thor(24) 
85!  real,     intent(IN)     :: cu_min 
86!  real,     intent(IN)     :: cu_veille 
87!  real,     intent(INOUT)  :: cu 
88!  integer,  intent(INOUT)  :: ndebdorm 
89!  integer,  intent(IN)     :: n 
90!  real,     intent(IN)     :: P_q10  !> // PARAMETER // P_Q10 used for the dormancy break calculation  // SD // PARPLT // 1
91!  real,     intent(IN)     :: tmin   !> // OUTPUT // Minimum active temperature of air // degree C
92!  real,     intent(IN)     :: tmax   !> // OUTPUT // Maximum active temperature of air // degree C
93!  !--integer, intent(IN) :: numcult
94!
95!
96!  !: Cas des cultures vernalisantes NB le 13/3
97!  if (P_codebfroid == 2) then
98!    call Vernalisation(tdev,P_jvc,P_jvcmini,P_codeperenne,P_culturean,       &  ! IN
99!                       P_codeinitprec,nbjanrec,P_tfroid,P_ampfroid,n, &  ! IN   !!DR 20/07/2012 pas besoin de jjul
100!                       rfvi,nrecbutoir,maxwth,caljvc,etatvernal)        ! OUT & INOUT
101!  endif
102!
103!  !: Cas des cultures dormantes NB le 13/3
104!  !- calcul des Chill Units (Richardson, 1974)
105!  ! dr et igc 28/08/2012 test s'applique seulement à Richardson
106!  !if (P_codebfroid == 3 .and. P_codedormance <= 2) then
107!  if (P_codebfroid == 3 .and. P_codedormance == 2) then
108!    call Dormancy_Richardson(thor,n,cu_min,cu_veille,ndebdorm,cu)
109!  endif
110!
111!  !: calcul des besoins en froid selon Bidabe
112!  if (P_codebfroid == 3 .and. P_codedormance == 3) then
113!    call Dormancy_Bidabe(n,ndebdorm,P_q10,tmin,tmax,cu_veille,cu)
114!  endif
115!
116!return
117!end subroutine bfroid
118
119
120
121
122
123!DR et IGC 28/08/2012 on a renommé Stics_Bfroid2 Vernalisation
124!DR 20/07/2012 pas besoin de jjul
125!subroutine Vernalisation(tdev,P_jvc,P_jvcmini,P_codeperenne,P_culturean,P_codeinitprec,nbjanrec,P_tfroid,P_ampfroid,jjul,n, & !IN
126
127subroutine Vernalisation(tdev,            &     ! IN
128                         !P_jvc,
129                         !P_jvcmini,
130                         !P_codeperenne,
131                         !P_culturean,
132                         !P_codeinitprec,
133                         !nbjanrec,
134                         !P_tfroid,
135                         !P_ampfroid,
136                         !n,               & !IN
137                         rfvi,            &     ! OUT
138                         !nrecbutoir,
139                         !maxwth,
140                         caljvc,          &     ! INOUT
141                         etatvernal)            ! OUT
142
143!USE Messages
144
145!: ARGUMENTS
146!  0.1  INPUT
147   real,    intent(IN)    :: tdev 
148!  real,    intent(IN)    :: P_jvc  !> // PARAMETER // Number of vernalizing days // day // PARPLT // 1
149!  real,    intent(IN)    :: P_jvcmini  !> // PARAMETER // Minimum number of vernalising days  // day // PARPLT // 1
150!  integer, intent(IN)    :: P_codeperenne  !> // PARAMETER // option defining the annual (1) or perenial (2) character of the plant // code 1/2 // PARPLT // 0
151!  integer, intent(IN)    :: P_culturean  !> // PARAMETER // crop status 1 = over 1 calendar year ,other than 1  = on two calendar years (winter crop in northern hemisphere) // code 0/1 // 
152!  integer, intent(IN)    :: P_codeinitprec  !> // PARAMETER // reinitializing initial status in case of chaining simulations : yes (1), no (2) // code 1/2 // PARAM // 0
153!  integer, intent(IN)    :: nbjanrec 
154!  real,    intent(IN)    :: P_tfroid  !> // PARAMETER // optimal temperature for vernalisation // degree C // PARPLT // 1
155!  real,    intent(IN)    :: P_ampfroid  !> // PARAMETER // semi thermal amplitude thermique for vernalising effect // degree C // PARPLT // 1
156!!  integer, intent(IN)    :: jjul
157!  integer, intent(IN)    :: n 
158
159
160!  0.2 INOUT
161!  integer, intent(INOUT) :: maxwth 
162   real,    intent(INOUT) :: caljvc     
163   logical, intent(INOUT) :: etatvernal     
164
165!  0.3 OUTPUT
166!  integer, intent(OUT)   :: nrecbutoir 
167   real,    intent(OUT)   :: rfvi   !> // OUTPUT // Slowing effect of the vernalization on plant development // 0-1
168
169
170!  0.4 VARIABLES LOCALES
171  real :: jvi 
172
173
174  if (caljvc >= P_jvc) then
175    rfvi = 1.0
176    etatvernal = .TRUE.
177    caljvc  =  0.0
178    !if (P_codeperenne == 2 .and. P_culturean /= 1 .and. P_codeinitprec == 2) then
179    ! DR!   !!!!! 19/02/08 on fait un test pour la prairie ca merde!!!!!!!
180    ! maxwth  =  n
181    ! dr! 19/02/08 test
182    !  if (nbjanrec == 366)then
183    !    maxwth = 366
184    !  else
185    !    maxwth = 365
186    !  endif
187    !  nrecbutoir  =  maxwth
188    !endif
189  else
190    jvi = 1 - ((P_tfroid - tdev) / P_ampfroid)**2
191    jvi = amax1(jvi,0.)
192    caljvc = caljvc + jvi
193    if (caljvc >= P_jvc) then
194      rfvi = 1
195    else
196      rfvi = (caljvc -  P_jvcmini) / (P_jvc - P_jvcmini)
197      rfvi = amax1(rfvi,0.0)
198    endif
199    !: PB - 27/12/2004
200    !- si l'on est pendant la vernalisation et que l'on enchaine les années,
201    !- alors on repousse la date d'enchainement jusqu'à la fin de la vernalisation.
202    !if (n == maxwth) then
203    !  if (P_codeperenne == 2 .and. P_codeinitprec == 2) then
204    !    maxwth  =  maxwth + 1
205    !    nrecbutoir  =  maxwth
206    !    call EnvoyerMsgHistorique(431)
207    !  endif
208    !endif
209  endif
210 
211
212return
213end subroutine Vernalisation
214
215
216
217!======================================================================================!
218!======================================================================================!
219!======================================================================================!
220
221
222!!DR et IGC 28/08/2012 on a renommé Stics_Bfroid3_Dorm12 Dormancy_Richardson
223!subroutine Dormancy_Richardson(thor,n,cu_min,cu_veille,ndebdorm,cu)
224!
225!!: ARGUMENTS
226!! IN
227!  real,    intent(IN)    :: thor(24) 
228!  integer, intent(IN)    :: n 
229!  real,    intent(IN)    :: cu_min 
230!  real,    intent(IN)    :: cu_veille 
231!! INOUT
232!  integer, intent(INOUT) :: ndebdorm 
233!  real,    intent(INOUT) :: cu 
234!
235!!: VARIABLES LOCALES
236!  real    :: cuj  !> 
237!  real    :: cuh 
238!  integer :: ih 
239!
240!!: thor en argument
241!!-- ** 1/ reconstitution des températures horaires
242!!--    do ih = 1,12
243!!--      thor(ih) = tmin(n)+ih*(tmax(n)-tmin(n))/12.0
244!!--    end do
245!!--    do ih = 13,24
246!!--      thor(ih) = tmax(n)-(ih-12)*(tmax(n)-tmin(n+1))/12.0
247!!--    end do
248!
249!    !: Calcul des C(hill) U(nits)
250!    cuj = 0.0
251!    cuh = 0.0
252!    do ih = 1,24
253!      if (thor(ih) <= 1.4) cuh = 0.0
254!      if (thor(ih) > 1.4 .and. thor(ih) <= 2.4)  cuh = 0.5
255!      if (thor(ih) > 2.4 .and. thor(ih) <= 9.1)  cuh = 1.0
256!      if (thor(ih) > 9.1 .and. thor(ih) <= 12.4) cuh = 0.5
257!      if (thor(ih) > 12.4 .and. thor(ih) <= 15.9) cuh = 0.0
258!      if (thor(ih) > 15.9 .and. thor(ih) <= 17.5) cuh = -0.5
259!      if (thor(ih) > 17.5) cuh = -1
260!      ! Cumul horaire
261!      cuj = cuj+cuh
262!    end do
263!
264!    ! Cumul journalier
265!    cu = cu_veille + cuj
266!
267!    !: Rectification erreur dans l'entrée en dormance
268!    !- si températures faibles occasionnelles
269!    if (cu < 0) ndebdorm = 0
270!
271!    !: Détermination de l'entrée en dormance
272!    if (cu > cu_min .and. ndebdorm == 0) then
273!      ndebdorm = n
274!      cu = 0.
275!    endif
276!
277!return
278!end subroutine Dormancy_Richardson
279!
280!
281!!======================================================================================!
282!!======================================================================================!
283!!======================================================================================!
284!
285!!DR et IGC 28/08/2012 on a renommé Stics_Bfroid3_Dorm3 Dormancy_Bidabe
286!subroutine Dormancy_Bidabe(n,ndebdorm,P_q10,tmin,tmax,cu_veille,cu)
287!
288!!: ARGUMENTS
289!! IN
290!  integer,  intent(IN)    :: n 
291!  integer,  intent(IN)    :: ndebdorm 
292!  real,     intent(IN)    :: P_q10  !> // PARAMETER // P_Q10 used for the dormancy break calculation  // SD // PARPLT // 1
293!  real,     intent(IN)    :: tmin   !> // OUTPUT // Minimum active temperature of air // degree C
294!  real,     intent(IN)    :: tmax   !> // OUTPUT // Maximum active temperature of air // degree C
295!  real,     intent(IN)    :: cu_veille 
296!
297!! INOUT
298!  real,     intent(INOUT) :: cu 
299!
300!
301!! ** début du cumul imposé à ndebdorm (cd initial)
302!    if (n < ndebdorm) then
303!      cu = 0.
304!    else
305!      cu = cu_veille + P_q10**(-tmin/10.) + P_q10**(-tmax/10.)
306!    endif
307!
308!return
309!end subroutine Dormancy_Bidabe
310!
311
312
313end module Besoins_en_froid
Note: See TracBrowser for help on using the repository browser.