Nothing
      ################################################################################
# "Working with dynamic models for agriculture"
# R script for practical work
# Daniel Wallach (INRA), David Makowski (INRA), James W. Jones (U.of Florida),
# Francois Brun (ACTA), Sylvain Toulet (INRA, internship 2012)
# version : 2012-04-23
# Model described in the book, Appendix. Models used as illustrative examples: description and R code
################################ FUNCTIONS #####################################
################################################################################
#' @title WaterBalance model - calculate change in soil water for one day
#' @description WaterBalance model - calculate change in soil water for one day
#' @param WAT0 : Water at the beginning of the day (mm).
#' @param RAIN : Rainfall of day (mm)
#' @param ETr : Evapotranspiration of day (mm)
#' @param param : a vector of parameters
#' @param FC : Water content at field capacity (cm^3.cm^-3)
#' @param WP : Water content at wilting Point (cm^3.cm^-3)
#' @return WAT1 : Water at the beginning of the day+1 (mm).
#' @export
watbal.update = function(WAT0,RAIN, ETr,param,WP,FC){
  WHC =(param["WHC"])
	MUF = (param["MUF"])
	DC = (param["DC"])
	z = (param["z"])
	CN = (param["CN"])
	# Maximum abstraction (for run off)
	S = 25400/CN-254
	# Initial Abstraction (for run off)
	IA = 0.2*S
  # WATfc : Maximum Water content at field capacity (mm)
  WATfc = FC*z
  # WATwp : Water content at wilting Point (mm)
  WATwp = WP*z
  # Change in Water Before Drainage (Precipitation - Runoff)
	if (RAIN>IA){RO = (RAIN-0.2*S)^2/(RAIN+0.8*S)}else{RO = 0}
  # Calculating the amount of deep drainage
  if (WAT0+RAIN-RO > WATfc){DR = DC*(WAT0+RAIN-RO-WATfc)}else{DR = 0}
	# Calculating the amount of water lost by transpiration (after drainage)
  TR = min(MUF*(WAT0+RAIN-RO-DR-WATwp), ETr)
	dWAT = RAIN - RO -DR -TR
  WAT1 = WAT0 + dWAT
  return(WAT1)
}
################################################################################
#' @title WaterBalance model - calculate soil water over designated time period
#' @description WaterBalance model - calculate soil water over designated time period
#' @param param : a vector of parameters
#' @param weather : weather data.frame for one single year
#' @param WP : Water content at wilting Point (cm^3.cm^-3)
#' @param FC : Water content at field capacity (cm^3.cm^-3)
#' @param WAT0 : Initial Water content (mm). If NA WAT0=z*FC
#' @return data.frame with daily RAIN, ETR, Water at the beginning of the day (absolute : WAT, mm and relative value : WATp, -)
#' @export
watbal.model = function(param, weather, WP, FC, WAT0=NA)
{
  z = (param["z"])
  # input variable describing the soil
	# WP : Water content at wilting Point (cm^3.cm^-3)
	# FC : Water content at field capacity (cm^3.cm^-3)
	# WAT0 : Initial Water content (mm)
	if (is.na(WAT0)) {WAT0 = z*FC}
	# Initialize variable
  # WAT : Water at the beginning of the day (mm) : State variable
  WAT = rep(NA, nrow(weather))
  # initialisation use Amount of water at the beginning
  WAT[1]=WAT0
  # integration loops
  for (day in 1:(nrow(weather)-1))
	{
    WAT[day+1]= watbal.update(WAT[day],weather$RAIN[day], weather$ETr[day],param,WP,FC)[1]
	}
  # Volumetric Soil Water content (fraction : mm.mm-1)
  WATp=WAT/z
	return(data.frame(day = weather$day, RAIN = weather$RAIN, ETr = weather$ETr, WAT = WAT, WATp=WATp));
}
################################################################################
#' @title Define values of the parameters for the WaterBalance model
#' @description Define values of the parameters for the WaterBalance model
#' @return matrix with parameter values (nominal, binf, bsup)
#' @export
watbal.define.param = function()
{
	# nominal, binf, bsup
	# WHC  : Water Holding Capacity of the soil (cm^3 cm^-3)
	WHC = c(0.13, 0.05, 0.18);
	# MUF : Water Uptake coefficient (mm^3 mm^-3)
	MUF = c(0.096, 0.06, 0.11);
	# DC :  Drainage coefficient (mm^3 mm^-3)
	DC = c(0.55, 0.25, 0.75);
	# z : root zone depth (mm)
	z = c(400, 300, 600);
	# CN : Runoff curve number
	CN = c(65, 15, 90); # nominal = 58 in the description ??
	
	param = data.frame(WHC, MUF, DC, z, CN);
	row.names(param) = c("nominal","binf","bsup");
	param = as.matrix(param)
  attributes(param)$description=t(t(c("WHC"="Water Holding Capacity of the soil (cm3.cm-3)",
  "MUF" = "Water Uptake coefficient (mm^3 mm^-3)", "DC" = "Drainage coefficient (mm3.mm-3)",
  "z" = "root zone depth (mm)",  "CN" = "Runoff curve number")))
	return(param)
}
################################################################################
#' @title Read weather data for the WaterBalance model (West of France Weather)
#' @description Read weather data for the WaterBalance model (West of France Weather)
#' @param working.year : year for the subset of weather data (default=NA : all the year)
#' @param working.site : site for the subset of weather data (default=NA : all the site)
#' @return data.frame with daily weather data for one or several site(s) and for one or several year(s)
#' @export
# Reading Weather data function
watbal.weather = function(working.year=NA, working.site=NA)
    {
    #day month year R Tmax Tmin rain ETP
    # R : solar radiation (MJ)
    # Tmax : maximum temperature (degC)
    # Tmin : minimum temperature (degC)
    weather=weather_FranceWest
    names(weather)[names(weather)=="WEDAY"]= "day"
    names(weather)[names(weather)=="WEYR"]= "year"
    names(weather)[names(weather)=="SRAD"]= "I"
    names(weather)[names(weather)=="TMAX"]= "Tmax"
    names(weather)[names(weather)=="TMIN"]= "Tmin"
    names(weather)[names(weather)=="RAIN"]= "RAIN"
    names(weather)[names(weather)=="ETr"]= "ETr"
    # if argument working.year/working.site is specified, work on one particular year/site
    if (!is.na(working.year)&!is.na(working.site)) {weather=weather[(weather$year==working.year)&(weather$idsite==working.site),] }
    else{
      if (!is.na(working.year)) {weather<-weather[(weather$year==working.year),]}
      if (!is.na(working.site)) {weather<-weather[(weather$idsite==working.site),]}}
    return (weather)
    }
################################################################################
#' @title WaterBalance model - Variant with another order of calculation and ARID index
#' @description WaterBalance model - Variant with another order of calculation and ARID index
#' @param WHC : Water Holding Capacity of the soil (cm^3 cm^-3)
#' @param MUF : Water Uptake coefficient (mm^3 mm^-3)
#' @param DC : Drainage coefficient (mm^3 mm^-3)
#' @param z : root zone depth (mm)
#' @param CN : Runoff curve number
#' @param weather : weather data.frame for one single year
#' @param WP : Water content at wilting Point (cm^3.cm^-3)
#' @param FC : Water content at field capacity (cm^3.cm^-3)
#' @param WAT0 : Initial Water content (mm). If NA WAT0=z*FC
#' @return data.frame with daily RAIN, ETR, Water at the beginning of the day (absolute : WAT, mm and relative value : WATp, -)
#' @export
watbal.model.arid = function(WHC, MUF, DC, z, CN, weather, WP, FC, WAT0=NA)
{
    #WHC :Water Holding Capacity of the soil (cm3.cm-3)
    #MUF :Water Uptake coefficient (mm^3 mm^-3)        
    #DC :Drainage coefficient (mm3.mm-3)              
    #z :root zone depth (mm)                         
    #CN :Runoff curve number 
  	
    # Maximum abstraction (for run off)
	S = 25400/CN-254
	# Initial Abstraction (for run off)
	IA = 0.2*S
    # WATfc : Maximum Water content at field capacity (mm)
    WATfc = FC*z
    # WATwp : Water content at wilting Point (mm)
    WATwp = WP*z
    
    # input variable describing the soil
	# WP : Water content at wilting Point (cm^3.cm^-3)
	# FC : Water content at field capacity (cm^3.cm^-3)
	# WAT0 : Initial Water content (mm)
	if (is.na(WAT0)) {WAT0 = z*FC}
	# Initialize variable
    # WAT : Water at the beginning of the day (mm) : State variable
    WAT = rep(NA, nrow(weather))
    
    # supplementary variable ARID drought index. 
    # computed as the ratio of transpiration to potential transpiration. (See Woli, 2010)        
    # A value of ARID = 0 means that there is no water stress in the crop; a value of ARID=1 means a maximum stress with no growth
    ARID = rep(NA, nrow(weather))
    
    # initialisation-use Amount of water at the beginning
    WAT[1]=WAT0
    ARID[1] = NA
    # integration loops
    for (day in 1:(nrow(weather)-1))
	{
        # Calculate rate of change of state variable WAT
	  # Compute maximum water uptake by plant roots on a day, RWUM
          RWUM = MUF*(WAT[day]-WATwp)
        # Calculate the amount of water lost by transpiration (TR)-prior to RAIN, RO, and DR 
          TR = min(RWUM, weather$ETr[day])       
        # Compute Surface Runoff (RO)
	    if (weather$RAIN[day]>IA){RO = (weather$RAIN[day]-0.2*S)^2/(weather$RAIN[day]+0.8*S)}else{RO = 0}
        # Calculate the amount of deep drainage (DR)
         if (WAT[day]+weather$RAIN[day]-RO > WATfc){DR = DC*(WAT[day]+weather$RAIN[day]-RO-WATfc)}else{DR = 0}
        # Update state variables 
	    dWAT = weather$RAIN[day] - RO -DR -TR
          WAT[day+1] = WAT[day] + dWAT
        # compute the ARID index. Note that it is an auxilliary variable, not a "state variable" as is WAT[day]
        if (TR < weather$ETr[day])   {ARID[day+1] = 1 - TR/weather$ETr[day]}      else    {ARID[day+1] = 0.0}
	}
    
    # Volumetric Soil Water content (fraction : mm.mm-1)
    WATp=WAT/z
	return(data.frame(day = weather$day, RAIN = weather$RAIN, ETr = weather$ETr, WAT = WAT, WATp=WATp, ARID=ARID));
}
# End of file
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.