Approximate sizing of rainwater tanks

A recent paper by Khastagir and Jayasuriya from RMIT provides a quick way to estimate the size of a rain tank that is required to meet demands with a specified reliability.

Equations are provided that establish a relationship between:

  • A = Roof area (m2)
  • D = Annual water demand (L/year)
  • R = Rainfall (mm)
  • C = Tank volume (L)
  • Reliability

Equations are of the form:

y = ax^{bx}

Where:

y = \frac{C}{A^{3/2}}

x = \frac{D}{A \cdot R}

For 85% reliability y = 0.08e^{5.58x}

For 90% reliability y = 0.15e^{5.16x}

For 95% reliability y = 0.29e^{4.85x}

Relationships for three reliabilities are shown in the following figure which shows the scatter of data that has been used to fit the equations.

Relationship between tank capacity, reliability, roof area, tank capacity and rainfall (Khastagir and Jayasuriya, 2010)

Relationship between tank capacity, reliability, roof area, demand and rainfall (Khastagir and Jayasuriya, 2010)

Example:

What tank size is required to provide 95% reliability for a 3 person household, roof area = 200 m2, annual rainfall = 700 mm, demand is for toilet flushing.

The paper uses a standard set of demands:

  • Toilet flushing = 16 L per person per day
  • Laundry = 40 L per person per day

For a three person household, annual demand for toilet flushing will be 365 \times 3 \times 16 = 17520 \text{L} .

Therefore, x = \frac{D}{A \cdot R} = \frac{17520}{200 \cdot 700} = 0.125

For 95% reliability y = 0.29e^{4.85x} = 0.531

Therefore, the required tank capacity is:

0.531 \times 200^{3/2} = 1.5 \text{kL}

Comparsion

We can compare these results to another tank sizing guide provided in Chapter 12 of WSUD: Engineering procedures stormwater.  This book provides the following chart for tank sizing.  The chart was developed based on modelling that used rainfall data from Melbourne with a mean annual rainfall 657 mm.

Tank sizing chart

Relationship between toilet flushing water supply reliability and rainwater tank size for Melbourne (source: WSUD: Engineering Procedures Stormwater)

Demand is for toilet flushing at a rate of 20 L per person per day, higher than the 16 L used by Khastagir and Jayasuriya.

Our three person household has a equivalent of 1.5 persons per 100 m2 of roof area.  For a reliability of 90%, the required tank size is 0.7 * 200 = 1.4 kL.

Using the Khastagir and Jayasuriya approach.

D = 20 x 3 x 365 = 21,900 L

R = 657

x = \frac{D}{A \cdot R} = \frac{21900}{200 \cdot 657} = 0.16

For 90% reliability y = 0.15e^{5.16x} = 0.34

Therefore, the required tank capacity is:

0.335 \times 200^{3/2} \approx 1 \; \text{kL}

So the capacities are in the same ballpark and either is probably ok for an initial estimate. Better estimates could be obtained through modelling (for example, see Mitchell, 2007). The advantage of the Khastagir and Jayasuriya approach is that it easy to generalise to different demands, roof areas and rainfalls.

A vectorized R function to implement the method of Khastagir and Jayasuriya is provided below.

CalcTankCapacity <- function(roof.area, demand.annual, rainfall.annual, reliability=c(85, 90, 95)) {
    
  reliability.allowed <- c(85, 90, 95)
    
  if(!all(reliability %in% reliability.allowed)) stop("Some reliability values are not supported")
  
  # recycle arguments to allow vectorization
  
  arg.list <- lapply(as.list(match.call())[-1], eval)  # arguments provided to the function
  arg.lengths <- sapply(arg.list,length)  
  
  equal.elements <- function(x, tol = .Machine$double.eps ^ 0.5 ) {diff(range(x)) < tol}
  
  if(!equal.elements(arg.lengths)) { # if arguments don't all have the same length
    max.length <- max(sapply(arg.list, length)) 
    arg.list <- lapply(arg.list, rep, length=max.length)  # recycle 
    
    for (i in 1:length(arg.list)){  # assign values back to arguments
      assign(names(arg.list)[i],arg.list[[i]])
    }
  }
  
  tank.capacity <- numeric(length=max(arg.lengths))
  
  x <- demand.annual/(roof.area * rainfall.annual)

  tank.capacity[reliability == 85] <- 
    roof.area[reliability == 85]^(3/2) * 0.08*exp(5.58*x[reliability == 85])
  
  tank.capacity[reliability == 90] <- 
    roof.area[reliability == 90]^(3/2) * 0.15*exp(5.16*x[reliability == 90])
  
  tank.capacity[reliability == 95] <- 
    roof.area[reliability == 95]^(3/2) * 0.29*exp(4.85*x[reliability == 95])
   
  
  data.frame(roof.area = roof.area,
             demand.annual = demand.annual,
             rainfall.annual = rainfall.annual,
             reliability = reliability,
             tank.capacity = tank.capacity)
   
}

# Example

roof.area <- 200
demand.annual <- 21900
rainfall.annual <-657
reliability <- c(85, 90, 95)
CalcTankCapacity(roof.area, demand.annual, rainfall.annual, reliability)

#      roof.area demand.annual rainfall.annual reliability tank.capacity
# 1       200         21900             657          85       573.494
# 2       200         21900             657          90      1002.604
# 3       200         21900             657          95      1840.762
# 

One thought on “Approximate sizing of rainwater tanks

  1. Pingback: Approximate sizing of rainwater tanks – II | tonyladson

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s