Drinking water disinfection efficiency: Difference between revisions

From Opasnet
Jump to navigation Jump to search
Line 97: Line 97:
=== Calculations ===
=== Calculations ===


<rcode  
CT-value = Chlorine residue concentration (mg/l)* time (min)
name="disinfectionall"  
 
label="Initialize disinfection all"  
<rcode
embed=1
name="doses"
label="Initialize default doses"
>
  #This is code "Op_en7955/doses" on page [[Drinking water disinfection efficiency]]
  library(OpasnetUtils)
 
UVCT = data.frame(UVCT = 0)
UVCT = Ovariable("UVCT", data = UVCT)
 
OzoneDose = data.frame(OzoneDoseResult = 0)
OzoneDose = Ovariable("OzoneDose", data = OzoneDose)
 
objects.store(UVCT, OzoneDose)
 
cat("Ovariables UVCT and OzoneDose saved.\n")
 
</rcode>
 
<rcode
name="sensitivity"
label="Initialize sensitivities"
>
>
#This is code "Op_en7955/disinfectionall" on page [[Drinking water disinfection efficiency]]
#This is code "Op_en7955/sensitivity" on page [[Drinking water disinfection efficiency]]
library(OpasnetUtils)
library(OpasnetUtils)


DisinfectionAll <- Ovariable("DisinfectionAll", ddata = "Op_en7955", save = TRUE)
UVSensitivity <- Ovariable("UVSensitivity", ddata = "Op_en7955", subset="Drinking water UV disinfection efficiency")
OzSensitivity <- OVariable("OzSensitivity", ddata = "Op_en7955", subset="Drinking water ozonization efficiency")


cat("Ovariable DisinfectionAll saved.\n")
objects.store(UVSensitivity, OzSensitivity)


cat("Ovariables UVSensitivity and OzSensitivity saved.\n")
</rcode>
</rcode>


Cut the data saved to the previous ovariable by chosen disinfection methods. The default choice includes UV and Ozonization. The creation of the ovariable with the choices can be found on page [[Drinking water treatment efficiency]]
The code below saves the constant for immediate demand and decay constant as well as the time used as the time ozone affects the water. The current constants are from Haas & Kaymak 2003<ref name="haas2003"/>, the averages of the constants they found for different experiments. Their water temperature in all experiments was 15°C and pH approximately 8. The value on time is based on nothing, but a value is needed for the model to run
<rcode
name="constants"
label="Initialize D, k and t"
>
 
  #This is code "Op_en7956/constants" on page [[Drinking water chlorination efficiency]]
  library(OpasnetUtils)


<rcode  
D <- 0.25 # immediate demand
name="variable"  
k <- 0.54 # decay constant
label="Initialize disinfection"  
t <- 60 # the time the ozone affects, min
embed=1
 
objects.store(D, k)
 
cat("Constants D and k saved.\n")
 
</rcode>
 
<rcode
name="CT_ozone"
label="Initialize CT_ozone"
>
>
#This is code "Op_en7955/variable" on page [[Drinking water disinfection efficiency]]
# This is code "Op_en7955/CT_ozone" on page [[Drinking water disinfection efficiency]]
library(OpasnetUtils)
library(OpasnetUtils)
library(reshape2)
CTOzone <- Ovariable(
  "CTOzone",
  dependencies =  data.frame(
    Name = c("OzoneDose", "k", "D", "t"),
    Ident = c("Op_en7955/doses", "Op_en7955/constants", "Op_en7955/constants", "Op_en7955/constants")),
  formula = function(...){
# Integral of concentration along Times:
# Int(OzoneDose*D*exp(-k*t)) = OzoneDose*D*(-1/k)*exp(-k*t)
# Definite integral from 0 to t = OzoneDose*D*(-1/k)*exp(-k*t) - OzoneDose*D(-1/k) = OzoneDose*D/k (1-exp(-k*t))
CTOzone <- OzoneDose*D/k*(1-exp(-k*t))
return(CTOzone)
}


Disinfection <- Ovariable("Disinfection",
                                dependencies=data.frame(
                                  Name = c("DisinfectionAll", "Treatment"),
                                  Ident = c("Op_en7955/disinfectionall", "Op_en7954/treatmentchoice")
                                ),
                                formula = function(...){
                                  return(DisinfectionAll*Treatment)
                                }
)
)


objects.store(Disinfection)
objects.store(CTOzone)
cat("Ovariable Disinfection saved. \n")
 
cat("Ovariable CTOzone saved.\n")
 
</rcode>
 
 
<rcode
name="ozefficiency"
label="Initialize ozonization efficiency"
>
# This is code "Op_en7955/ozefficiency" on page [[Drinking water chlorination efficiency]]
library(OpasnetUtils)
library(reshape2)
 
OzoneEfficiency <- Ovariable("OzoneEfficiency", dependencies = data.frame(
  Name = c("CTOzone", "OzSensitivity"),
  Ident = c("Op_en7955/CTOzone", "Op_en7955/sensitivity")),
  formula = function(...){
 
  OzSensitivity <- EvalOutput(OzSensitivity)
 
  # make CTOzone into an Ovariable, if it's not already
  if(!"ovariable" %in% class(CTOzone)) CTOzone <- Ovariable(name=CTOzone, output=data.frame(Result=CTOzone))
  CTOzone <- EvalOutput(CTOzone)
  sensname <- paste0(OzSensitivity@name,"Result") # put "OzSensitivityResult" into sensname
  ctname <- paste0(CTOzone@name,"Result") # put "CTOzoneResult" into ctname
 
  ova <- merge(OzSensitivity, CTOzone) # merge to get the variables into the same table
  ova$Logdecrease <- as.numeric(as.character(ova$Logdecrease)) # make sure Logdecrease-column is numeric
 
  out <- aggregate(
    1:nrow(ova@output), #take a set of row numbers included in ova...
    by = ova@output[ova@marginal & colnames(ova@output)!="Logdecrease"], #...that has a unique combination of values in the
            # index-columns, except Logdecrease. It takes the row numbers with different values of Logdecrease, with the
            # combination of other indices unique.
      FUN = function(x) {
      tmp <- ova@output[x,] # actually takes those rows whose numbers were selected above from ova
      ord <- order(tmp$Logdecrease) # saves the order of rows ordered based on Logdecrease, smallest first.
      if(sum(tmp[[sensname]], na.rm=TRUE)==0) return(0) # if all the ct:s in this set of rows are 0, return 0
      out <- approx( # Otherwise use approx to interpolate the log-decrease for the ct value(s) from earlier
        x=tmp[[sensname]][ord],
        y=tmp$Logdecrease[ord],
        xout=tmp[[ctname]][1],
        rule=1:2
      )$y
      return(out)
    }
  )
  colnames(out)[colnames(out)=="x"] <- "Result"
  return(out)
 
  }
)
 
objects.store(OzoneEfficiency)
 
cat("Ovariable OzoneEfficiency saved.\n")
 
</rcode>
 
<rcode
name="uvefficiency"
label="Initialize UV efficiency"
>
# This is code "Op_en7955/uvefficiency" on page [[Drinking water chlorination efficiency]]
library(OpasnetUtils)
library(reshape2)
 
UVEfficiency <- Ovariable("UVEfficiency", dependencies = data.frame(
  Name = c("UVCT", "UVSensitivity"),
  Ident = c("Op_en7955/doses", "Op_en7955/sensitivity")),
  formula = function(...){
 
  UVSensitivity <- EvalOutput(UVSensitivity)
 
  # make CTOzone into an Ovariable, if it's not already
  if(!"ovariable" %in% class(UVCT)) UVCT <- Ovariable(name=UVCT, output=data.frame(Result=CTOzone))
  CTOzone <- EvalOutput(UVCT)
  sensname <- paste0(UVSensitivity@name,"Result") # put "UVSensitivityResult" into sensname
  ctname <- paste0(CTOzone@name,"Result") # put "CTOzoneResult" into ctname
 
  ova <- merge(UVSensitivity, UVCT) # merge to get the variables into the same table
  ova$Logdecrease <- as.numeric(as.character(ova$Logdecrease)) # make sure Logdecrease-column is numeric
 
  out <- aggregate(
    1:nrow(ova@output), #take a set of row numbers included in ova...
    by = ova@output[ova@marginal & colnames(ova@output)!="Logdecrease"], #...that has a unique combination of values in the
            # index-columns, except Logdecrease. It takes the row numbers with different values of Logdecrease, with the
            # combination of other indices unique.
      FUN = function(x) {
      tmp <- ova@output[x,] # actually takes those rows whose numbers were selected above from ova
      ord <- order(tmp$Logdecrease) # saves the order of rows ordered based on Logdecrease, smallest first.
      if(sum(tmp[[sensname]], na.rm=TRUE)==0) return(0) # if all the ct:s in this set of rows are 0, return 0
      out <- approx( # Otherwise use approx to interpolate the log-decrease for the ct value(s) from earlier
        x=tmp[[sensname]][ord],
        y=tmp$Logdecrease[ord],
        xout=tmp[[ctname]][1],
        rule=1:2
      )$y
      return(out)
    }
  )
  colnames(out)[colnames(out)=="x"] <- "Result"
  return(out)
 
  }
)
 
objects.store(UVEfficiency)
 
cat("Ovariable UVEfficiency saved.\n")


</rcode>
</rcode>

Revision as of 09:47, 11 September 2019


Question

What is the efficiency of drinking water disinfection methods, reported in log-clearance?

Answer

+ Show code

Rationale

Data

References of efficiency of disinfection methods
Method Campylobacter E.coli O157:H7 Rotavirus Norovirus Cryptosporidium Giardia
UV [1] [1] [1] [1] [1] [1]
Ozonization [2] [2]

UV

Drinking water UV disinfection efficiency(mJ/cm^2)
ObsPathogen012345
1campylobacter0 3 7 10 14 NA
2E.coli O157:H70 5 9 14 19 NA
3rotavirus0 10 20 29 39 NA
4norovirus0 NA NA NA NA NA
5cryptosporidium0 3 6 12 NA NA
6giardia0 2 5 11 NA NA
  • E.coli and Campulobacter jejuni corrected for environmental spp.
  • Cryptosporidium and giardia: no correction for environmental spp. (research needed).
  • Rotavirus SA-11
  • For noro: 0.8 log inactivation was estimated for a UV fluence of 20mJ/cm2. At higher fluences (40 and 70mJ/cm^2) all samples were negative. However, it is uncertain to which degree inactivation assessed with RT-PCR is representative for inactivation assessed with infectivity assays.
  • For water with low turbidity and high UV transmission?

The log decreases follow the formula [1]

log10(Nt/N) = -k * Fluence

where Nt is the microbial concentration after contact time t. Fluence is the product of the UV fluence rate (mW/cm2) and the exposure t (mWs/cm2 = mJ/cm2).

OR

log10(Nt/N) = -k * Fluence - b

where b is the y-intercept. This is used in cases where small amounts of UV don't have an effect, and the log linear decrease only begins at a certain level of UV. For some microbes there is also an upper limit to log decrease, after which adding fluence doesn't decrease the microbe concentration.

Ozone

Ozone decay model:[2]

C = (C0 - D)exp(k*t)

Where D is instantaneous demand, k is decay constant, t is time and C is residual

Ozone has a half-life in pure distilled water of approximately 40 min at pH 7.6, but this decreases to 10 min at pH 8.5 at 14.6°C. Rising temperatures increase the rate of decomposition. [3]

Drinking water ozonization efficiency(mg/min l^-1)
ObsPathogen012345
1campylobacter0 NA NA NA NA NA
2E.coli O157:H70 NA 0.02 NA NA NA
3rotavirus0 NA 0.006-0.06 NA NA NA
4norovirus0 NA NA NA NA NA
5cryptosporidium0 4 11 22 NA NA
6giardia0 NA 1.8-2 NA NA NA
  • E.coli, rota, Giardia muris cysts: temperature 5°C and pH 6-7 [4]
  • Cryptosporidium temperature 13°C, also available for 1°C and 22°C[4]

Calculations

CT-value = Chlorine residue concentration (mg/l)* time (min)

+ Show code

+ Show code

The code below saves the constant for immediate demand and decay constant as well as the time used as the time ozone affects the water. The current constants are from Haas & Kaymak 2003[2], the averages of the constants they found for different experiments. Their water temperature in all experiments was 15°C and pH approximately 8. The value on time is based on nothing, but a value is needed for the model to run

+ Show code

+ Show code


+ Show code

+ Show code

See also


  • Youxian Wu, Thomas Clevenger,* and Baolin Deng 2005. Impacts of Goethite Particles on UV Disinfection of Drinking Water [3]
  • Charlotte Farrella, Francis Hassarda, Bruce Jefferson, Tangui Leziarta, Andreas Nocker, Peter Jarvis 2018. Turbidity composition and the relationship with microbial attachment and UV inactivation efficacy. [4]
  • John C.H. Chang, Susan F. Ossoff, David C. Lobe, Mark H. Dorfman, Constance M. Dumais, Robert G.Qualls, J. Donald Johnson 1985. UV Inactivation of Pathogenic and Indicator Microorganisms. [5]
  • Charles N.Haas, Baris Kaymak 2003. Effect of initial microbial density on inactivation of Giardia muris by ozone. [6]
  • Drinking Water and Health: Volume 2. II The Disinfection of Drinking Water [7]
  • WHO: Water sanitation and health. Guidelines. 3 Inactivation (disinfection) processes. [8]
  • Agnieszka Joanna Brodowska, Agnieszka Nowak, Alina Kondratiuk-Janyska, Marcin Piatkowski, Krzysztof ́Smigielski 2017. Modelling the Ozone-Based Treatments forInactivation of Microorganisms. [9]

References

  1. 1.0 1.1 1.2 1.3 1.4 1.5 1.6 Hijnen et al. 2006: Inactivation credit of UV radiation for viruses, bacteria and protozoan (oo)cyst in water: a review. Water Research 40(1) p3-22
  2. 2.0 2.1 2.2 2.3 Haas CN, Kaymak B. 2003. Effect of initial microbial density on inactivation of Giardia muris by ozone.Water Res. 2003 Jul;37(12):2980-8.
  3. Drinking Water and Health, Volume 2. II The Disinfection of Drinking Water. Safe Drinking Water Committee, Board on Toxicology and Environmental Health Hazards, Assembly of Life Sciences. ISBN: 0-309-55406-3, 408 pages, 1980. PDF available from the National Academies Press [1]
  4. 4.0 4.1 World Health Organization 2004 Water Treatment and Pathogen Control: Process Efficiency in Achieving Safe Drinking Water: 3 Inactivation (disinfection) processes. Edited by Mark W LeChevallier and Kwok-Keung Au. ISBN: 1 84339 069 8. Published by IWA Publishing, London, UK. [2]