!> Module of vernalisation or chilling requirements !> - Stics book paragraphe 2.3.4, page 33-36 !> !! Winter crops and perennial crops in temperate climate zones have vernalisation or chilling requirements. The formalisations classically applied and used !! in STICS differ for herbaceous plants (vernalisation) and woody plants (dormancy). For herbaceous plants, the resting state is considered not to be total, !! and the "vernalisation" formalisation which applies to herbaceous plants allows a partial accumulation of development units during winter rest. !! For woody plants the "dormancy" formalisations are much severe, and development units are only active when all chilling requirements have been met. !! Consequently, non-compliance with vernalisation requirements slows (rfvi <1 for herbaceous plants) or stops (rfvi = 0 for ligneous plants) the development of crops. !! For woody plants the post-dormancy period is characterized by the phasic course between dormancy break (ifindorm) and budding (ILEV), i.e. stdordebour. !> - Vernalisation (achieved by function "Vernalisation" in this module) !! Vernalisation requirements are defined by the genotype-dependent number of vernalising days (jvc) and the vernalising value of a given day (jvi) depends on !! crop temperature. Vernalising days are counted from germination (IGER) for annual crops because an active metabolism is required to initiate the process, !! or from the julvernal day for perennial crops. A minimum number of vernalising days, jvcmini is required. The progress in crop vernalisation, rfvi, !! gradually increases until it reaches the value of 1. !! tfroid (optimum vernalisation temperature) and ampfroid (thermal semi-amplitude of the vernalising effect) are parameters which provide the range of !! vernalising activity of temperatures. ampfroid indicates the sensitivity of the species to vernalisation: if it is low, the range of vernalising temperatures !! 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. !> - Dormancy (achieved by functions "Dormancy_Richardson" and "Dormancy_Bidabe" in this module) !! 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 !! of the grain on the plants before harvest. !! 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 !! always possible to impose this date and ignore the following dormancy calculations. Two options are available to calculate the break of dormancy, relying on !! 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). !> - The first dormancy calculation included in STICS (see function "Dormancy_Richardson") is the one by Richardson et al. (1974), developed for peach trees. !! It is based on accumulated chilling hourly units (cuh) effective to ensure break of dormancy. The relationship between cuh and hourly temperature !! is a "stepped" function. !! In order to be able to use bibliographic references to chilling requirements, we reconstitute hourly temperatures in accordance with Richardson's proposals !! (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 !! 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 !! result for dormancy break. !> - The second dormancy calculation (see function "Dormancy_Bidabe") is derived from the formulation proposed by Bidabe in 1965 to calculate dormancy and !! post-dormancy durations for apple trees, based on the Q10 notion which corresponds to exponential type responses to temperature. !! In STICS, we just use what concerns the dormancy period, since the post-dormancy period (i.e. from IFINDORM to ILEV) !! 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) !! 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 !! for the amount of chilling requirement is jvc. !*-----------------------------------------------------------------------------------------------------------------------------------------------------------* c!! module Besoins_en_froid USE Stics IMPLICIT NONE PRIVATE PUBLIC Vernalisation contains !> *************************************************** ! !! * Calcul des besoins en froid (sortie de develop) * ! !< *************************************************** ! !> I comment the subroutine broid----xcwu !subroutine bfroid(tdev,P_codebfroid,caljvc,P_jvc,P_jvcmini,rfvi,etatvernal,P_codeperenne,P_culturean,P_codeinitprec,maxwth, & !! nbjanrec,nrecbutoir,P_tfroid,P_ampfroid,jjul,P_codedormance,thor,cu_min,cu_veille,cu,ndebdorm,n,P_q10,tmin,tmax) !! DR 20/07/2012 on a plus besoin de jjul ! nbjanrec,nrecbutoir,P_tfroid,P_ampfroid,P_codedormance, & ! ! thor,cu_min,cu_veille,cu,ndebdorm,n,P_q10,tmin,tmax) ! !-- apparemment, en trop, inutile ,numcult) ! !implicit none ! !!: les ARGUMENTS ! real, intent(IN) :: tdev ! integer, intent(IN) :: P_codebfroid !> // PARAMETER // option of calculation of chilling requirements // code 1/2 // PARPLT // 0 ! real, intent(INOUT) :: caljvc ! real, intent(IN) :: P_jvc !> // PARAMETER // Number of vernalizing days // day // PARPLT // 1 ! real, intent(IN) :: P_jvcmini !> // PARAMETER // Minimum number of vernalising days // day // PARPLT // 1 ! real, intent(OUT) :: rfvi !> // OUTPUT // Slowing effect of the vernalization on plant development // 0-1 ! logical, intent(INOUT) :: etatvernal ! integer, intent(IN) :: P_codeperenne !> // PARAMETER // option defining the annual (1) or perenial (2) character of the plant // code 1/2 // PARPLT // 0 ! 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 ! integer, intent(IN) :: P_codeinitprec !> // PARAMETER // reinitializing initial status in case of chaining simulations : yes (1), no (2) // code 1/2 // PARAM // 0 ! integer, intent(INOUT) :: maxwth ! integer, intent(IN) :: nbjanrec ! integer, intent(OUT) :: nrecbutoir ! real, intent(IN) :: P_tfroid !> // PARAMETER // optimal temperature for vernalisation // degree C // PARPLT // 1 ! real, intent(IN) :: P_ampfroid !> // PARAMETER // semi thermal amplitude thermique for vernalising effect // degree C // PARPLT // 1 !! DR 20/07/2012 on a plus besoin de jjul !! integer, intent(IN) :: jjul ! integer, intent(IN) :: P_codedormance !> // PARAMETER // option of calculation of dormancy and chilling requirement // code 1/2 // PARPLT // 0 ! real, intent(IN) :: thor(24) ! real, intent(IN) :: cu_min ! real, intent(IN) :: cu_veille ! real, intent(INOUT) :: cu ! integer, intent(INOUT) :: ndebdorm ! integer, intent(IN) :: n ! real, intent(IN) :: P_q10 !> // PARAMETER // P_Q10 used for the dormancy break calculation // SD // PARPLT // 1 ! real, intent(IN) :: tmin !> // OUTPUT // Minimum active temperature of air // degree C ! real, intent(IN) :: tmax !> // OUTPUT // Maximum active temperature of air // degree C ! !--integer, intent(IN) :: numcult ! ! ! !: Cas des cultures vernalisantes NB le 13/3 ! if (P_codebfroid == 2) then ! call Vernalisation(tdev,P_jvc,P_jvcmini,P_codeperenne,P_culturean, & ! IN ! P_codeinitprec,nbjanrec,P_tfroid,P_ampfroid,n, & ! IN !!DR 20/07/2012 pas besoin de jjul ! rfvi,nrecbutoir,maxwth,caljvc,etatvernal) ! OUT & INOUT ! endif ! ! !: Cas des cultures dormantes NB le 13/3 ! !- calcul des Chill Units (Richardson, 1974) ! ! dr et igc 28/08/2012 test s'applique seulement à Richardson ! !if (P_codebfroid == 3 .and. P_codedormance <= 2) then ! if (P_codebfroid == 3 .and. P_codedormance == 2) then ! call Dormancy_Richardson(thor,n,cu_min,cu_veille,ndebdorm,cu) ! endif ! ! !: calcul des besoins en froid selon Bidabe ! if (P_codebfroid == 3 .and. P_codedormance == 3) then ! call Dormancy_Bidabe(n,ndebdorm,P_q10,tmin,tmax,cu_veille,cu) ! endif ! !return !end subroutine bfroid !DR et IGC 28/08/2012 on a renommé Stics_Bfroid2 Vernalisation !DR 20/07/2012 pas besoin de jjul !subroutine Vernalisation(tdev,P_jvc,P_jvcmini,P_codeperenne,P_culturean,P_codeinitprec,nbjanrec,P_tfroid,P_ampfroid,jjul,n, & !IN subroutine Vernalisation(tdev, & ! IN !P_jvc, !P_jvcmini, !P_codeperenne, !P_culturean, !P_codeinitprec, !nbjanrec, !P_tfroid, !P_ampfroid, !n, & !IN rfvi, & ! OUT !nrecbutoir, !maxwth, caljvc, & ! INOUT etatvernal) ! OUT !USE Messages !: ARGUMENTS ! 0.1 INPUT real, intent(IN) :: tdev ! real, intent(IN) :: P_jvc !> // PARAMETER // Number of vernalizing days // day // PARPLT // 1 ! real, intent(IN) :: P_jvcmini !> // PARAMETER // Minimum number of vernalising days // day // PARPLT // 1 ! integer, intent(IN) :: P_codeperenne !> // PARAMETER // option defining the annual (1) or perenial (2) character of the plant // code 1/2 // PARPLT // 0 ! 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 // ! integer, intent(IN) :: P_codeinitprec !> // PARAMETER // reinitializing initial status in case of chaining simulations : yes (1), no (2) // code 1/2 // PARAM // 0 ! integer, intent(IN) :: nbjanrec ! real, intent(IN) :: P_tfroid !> // PARAMETER // optimal temperature for vernalisation // degree C // PARPLT // 1 ! real, intent(IN) :: P_ampfroid !> // PARAMETER // semi thermal amplitude thermique for vernalising effect // degree C // PARPLT // 1 !! integer, intent(IN) :: jjul ! integer, intent(IN) :: n ! 0.2 INOUT ! integer, intent(INOUT) :: maxwth real, intent(INOUT) :: caljvc logical, intent(INOUT) :: etatvernal ! 0.3 OUTPUT ! integer, intent(OUT) :: nrecbutoir real, intent(OUT) :: rfvi !> // OUTPUT // Slowing effect of the vernalization on plant development // 0-1 ! 0.4 VARIABLES LOCALES real :: jvi if (caljvc >= P_jvc) then rfvi = 1.0 etatvernal = .TRUE. caljvc = 0.0 !if (P_codeperenne == 2 .and. P_culturean /= 1 .and. P_codeinitprec == 2) then ! DR! !!!!! 19/02/08 on fait un test pour la prairie ca merde!!!!!!! ! maxwth = n ! dr! 19/02/08 test ! if (nbjanrec == 366)then ! maxwth = 366 ! else ! maxwth = 365 ! endif ! nrecbutoir = maxwth !endif else jvi = 1 - ((P_tfroid - tdev) / P_ampfroid)**2 jvi = amax1(jvi,0.) caljvc = caljvc + jvi if (caljvc >= P_jvc) then rfvi = 1 else rfvi = (caljvc - P_jvcmini) / (P_jvc - P_jvcmini) rfvi = amax1(rfvi,0.0) endif !: PB - 27/12/2004 !- si l'on est pendant la vernalisation et que l'on enchaine les années, !- alors on repousse la date d'enchainement jusqu'à la fin de la vernalisation. !if (n == maxwth) then ! if (P_codeperenne == 2 .and. P_codeinitprec == 2) then ! maxwth = maxwth + 1 ! nrecbutoir = maxwth ! call EnvoyerMsgHistorique(431) ! endif !endif endif return end subroutine Vernalisation !======================================================================================! !======================================================================================! !======================================================================================! !!DR et IGC 28/08/2012 on a renommé Stics_Bfroid3_Dorm12 Dormancy_Richardson !subroutine Dormancy_Richardson(thor,n,cu_min,cu_veille,ndebdorm,cu) ! !!: ARGUMENTS !! IN ! real, intent(IN) :: thor(24) ! integer, intent(IN) :: n ! real, intent(IN) :: cu_min ! real, intent(IN) :: cu_veille !! INOUT ! integer, intent(INOUT) :: ndebdorm ! real, intent(INOUT) :: cu ! !!: VARIABLES LOCALES ! real :: cuj !> ! real :: cuh ! integer :: ih ! !!: thor en argument !!-- ** 1/ reconstitution des températures horaires !!-- do ih = 1,12 !!-- thor(ih) = tmin(n)+ih*(tmax(n)-tmin(n))/12.0 !!-- end do !!-- do ih = 13,24 !!-- thor(ih) = tmax(n)-(ih-12)*(tmax(n)-tmin(n+1))/12.0 !!-- end do ! ! !: Calcul des C(hill) U(nits) ! cuj = 0.0 ! cuh = 0.0 ! do ih = 1,24 ! if (thor(ih) <= 1.4) cuh = 0.0 ! if (thor(ih) > 1.4 .and. thor(ih) <= 2.4) cuh = 0.5 ! if (thor(ih) > 2.4 .and. thor(ih) <= 9.1) cuh = 1.0 ! if (thor(ih) > 9.1 .and. thor(ih) <= 12.4) cuh = 0.5 ! if (thor(ih) > 12.4 .and. thor(ih) <= 15.9) cuh = 0.0 ! if (thor(ih) > 15.9 .and. thor(ih) <= 17.5) cuh = -0.5 ! if (thor(ih) > 17.5) cuh = -1 ! ! Cumul horaire ! cuj = cuj+cuh ! end do ! ! ! Cumul journalier ! cu = cu_veille + cuj ! ! !: Rectification erreur dans l'entrée en dormance ! !- si températures faibles occasionnelles ! if (cu < 0) ndebdorm = 0 ! ! !: Détermination de l'entrée en dormance ! if (cu > cu_min .and. ndebdorm == 0) then ! ndebdorm = n ! cu = 0. ! endif ! !return !end subroutine Dormancy_Richardson ! ! !!======================================================================================! !!======================================================================================! !!======================================================================================! ! !!DR et IGC 28/08/2012 on a renommé Stics_Bfroid3_Dorm3 Dormancy_Bidabe !subroutine Dormancy_Bidabe(n,ndebdorm,P_q10,tmin,tmax,cu_veille,cu) ! !!: ARGUMENTS !! IN ! integer, intent(IN) :: n ! integer, intent(IN) :: ndebdorm ! real, intent(IN) :: P_q10 !> // PARAMETER // P_Q10 used for the dormancy break calculation // SD // PARPLT // 1 ! real, intent(IN) :: tmin !> // OUTPUT // Minimum active temperature of air // degree C ! real, intent(IN) :: tmax !> // OUTPUT // Maximum active temperature of air // degree C ! real, intent(IN) :: cu_veille ! !! INOUT ! real, intent(INOUT) :: cu ! ! !! ** début du cumul imposé à ndebdorm (cd initial) ! if (n < ndebdorm) then ! cu = 0. ! else ! cu = cu_veille + P_q10**(-tmin/10.) + P_q10**(-tmax/10.) ! endif ! !return !end subroutine Dormancy_Bidabe ! end module Besoins_en_froid