aboutsummaryrefslogblamecommitdiff
path: root/tests/testthat/test_PELMO.R
blob: be0b41030c393bc798cb96f56a3a6e53a83df903 (plain) (tree)
1
                 
















                                                                            
                                                    
                                                
 


                                                                     
                                                


                                                       


                                             
                                             
 



                                                                                
                                                           

   

                                              


                                                       

                                               
                                                                                             



                                                                        

                                       
                                     












                                                                               



                                                       
                            
 


                                                          





                                                           
                                     


                                             


                                                                     
 


                                                               





         
                                 
 
                                                 


                                                       
 






                                                           
 


















                                                                                                
 


                                                                               

                                               




                                                             
                                                             














                                                                              

                                                               


                                                       






























                                                                                               
library(testthat)
library(pfm)
context("Create PELMO runs from psm files and execute them")
PELMO_base <- system.file("FOCUSPELMO.553", package = "PELMO.installeR")

test_archive <- system.file("testdata/FOCUS_PELMO.tar.bz2", package = "pfm")
test_dir <- tempdir()
untar(test_archive, exdir = test_dir, compressed = "bzip2")

runs <- list(
  list(
    psm = "Pesticide_D",
    fbe = c("Por"),
    vbe = c("Por")),
  list(
    psm = "Pesticide_D_1_day_pre_em_every_third_year",
    pot = c("Cha", "Ham")),
  list(
    psm = "Pesticide_D_1_May_every_other_year_mets",
    win = names(FOCUS_GW_scenarios_2012$names)))

# Check if we have wine on the path
wine_installed <- system('wine --version', ignore.stdout = TRUE) == 0

test_that("PELMO paths are correctly created", {
  if (!wine_installed) {
    skip("A wine installation is needed for this test")
  }
  psm_paths = c(
     PELMO_path(runs[[1]]$psm, "fbe", "Por"),
     PELMO_path(runs[[2]]$psm, "pot", "Ham"),
     PELMO_path(runs[[3]]$psm, "win", "Cha"))

  for (i in seq_along(psm_paths)) {
    psm_file <- file.path(test_dir, psm_paths[i], paste0(runs[[i]]$psm, ".psm"))
    expect_true(file.exists(psm_file))
    psm_new_location <- file.path(PELMO_base, basename(psm_file))
    file.copy(psm_file, psm_new_location, overwrite = TRUE)
  }
})

test_that("PELMO runs are correctly set up", {
  if (!wine_installed) {
    skip("A wine installation is needed for this test")
  }

  # Prepare runs in analogy to the test archive
  PELMO_runs(runs, psm_dir = PELMO_base, execute = FALSE, evaluate = FALSE, overwrite = TRUE)

  # Check that input files are correctly generated in the right location
  for (run in runs) {
    psm <- run$psm
    crops <- setdiff(names(run), "psm")
    for (crop in crops) {
      for (scenario in run[[crop]]) {
        pp <- PELMO_path(psm, crop, scenario)

        input_new <- readLines(file.path(PELMO_base, "FOCUS", pp, "pelmo.inp"))
        input_test <- readLines(file.path(test_dir, pp, "pelmo.inp"))

        # Check if the input files are correctly reproduced
        expect_identical(input_new, input_test)
      }
    }
  }
})

test_that("PELMO runs can be run and give the expected result files", {
  if (!wine_installed) {
    skip("A wine installation is needed for this test")
  }

  run_PELMO(runs, cores = 7)

  plm_files <- c("CHEM.PLM", "ECHO.PLM",
                 "KONZCHEM.PLM", "KONZC_A1", "KONZC_B1",
                 "PLNTPEST.plm", "PLOT.PLM", "WASSER.PLM")

  # Check that if output is the same as in the test archive
  for (run in runs) {
    psm <- run$psm
    crops <- setdiff(names(run), "psm")
    for (crop in crops) {
      for (scenario in run[[crop]]) {
        pp <- PELMO_path(psm, crop, scenario)

        for (plm in plm_files) {
          if (file.exists(file.path(test_dir, pp, plm))) {
            new <- readLines(file.path(PELMO_base, "FOCUS", pp, plm))
            test <- readLines(file.path(test_dir, pp, plm))

            # Check if the ouput files are correctly reproduced
            expect_identical(new, test)
          }
        }
      }
    }
  }
})

pfm_PECgw <- evaluate_PELMO(runs)

test_that("PELMO runs are correctly evaluated", {
  if (!wine_installed) {
    skip("A wine installation is needed for this test")
  }

  # Check that if output is the same as in the test archive
  for (run in runs) {
    psm <- run$psm
    crops <- setdiff(names(run), "psm")
    for (crop in crops) {
      for (scenario in run[[crop]]) {
        pp <- PELMO_path(psm, crop, scenario)

        period_file <- readLines(file.path(test_dir, pp, "period.plm"), encoding = "latin1")

        result_lines <- grep("^\tResults for.*in the percolate at 1 m soil depth$", period_file)
        acronyms <- gsub(".*\\((.*)\\).*", "\\1", period_file[result_lines])
        names(result_lines) <- acronyms

        results <- list()
        for (acronym in acronyms) {
          results[[acronym]] <- list()
          conc_lines <- result_lines[acronym] + 5:24
          tmp <- read.table(text = period_file[conc_lines], sep = "\t")
          results[[acronym]]$periods <- data.frame(
            period = as.integer(tmp$V2),
            flux = tmp$V3,
            percolate = tmp$V4,
            conc = tmp$V5)
          tmp80 <- read.table(text = period_file[result_lines[acronym] + 27], sep = "\t")
          results[[acronym]]$focus <- tmp80[[1, "V5"]]
        }

        period_pfm_file <- file.path(PELMO_base, "FOCUS", pp, "period_pfm.rda")
        load(period_pfm_file)

        #message(psm, " ", crop, " ", scenario)

        # Test for equality of all the components separately,
        # as we need to adapt the tolerance
        for (acronym in acronyms) {
          p_pelmo <- results[[acronym]]$periods
          p_test <- results_pfm[[acronym]]$periods
          expect_equal(p_test$flux, p_pelmo$flux, tol = 1e-6)
          expect_equal(p_test$percolate, p_pelmo$percolate)
          # PELMO sets the concentration to 0 when the percolate is zero.
          # We get NaN, which is more reasonable, but we need to
          # take this into account for testing
          p_test$conc <- ifelse(is.na(p_test$conc), 0, p_test$conc)
          expect_equal(p_test$conc, p_pelmo$conc, tol = 1e-3, scale = 1)

          # FOCUS PEC
          expect_equal(results_pfm[[acronym]]$focus, results[[acronym]]$focus,
                       tol = 1e-3, scale = 1)
        }
      }
    }
  }
})

test_that("PECgw from FOCUS summary files can be reproduced", {
  if (!wine_installed) {
    skip("A wine installation is needed for this test")
  }
  focus_summary <- list()

  for (run in runs) {
    psm <- run$psm
    focus_summary[[psm]] <- list()

    crops <- setdiff(names(run), "psm")
    for (crop in crops) {
      scenarios <- run[[crop]]

      # Read contents of summary text file copied from the GUI output. We only
      # have results for one crop per psm file, so the crop is not in the file
      # name.
      sumfile_path <- system.file(paste0("testdata/FOCUS_Summary_", psm,
                                         ".txt"), package = "pfm")
      sumfile <- readLines(sumfile_path, encoding = "latin1")
      result_anchors <- grep("Results for", sumfile)
      acronyms <- gsub(".*\\((.*)\\).*", "\\1", sumfile[result_anchors])
      names(result_anchors) <- acronyms
      focus_summary[[psm]][[crop]] <- matrix(nrow = length(scenarios), ncol = length(acronyms),
                                             dimnames = list(scenarios, acronyms))
      for (acronym in acronyms) {
        tmp <- sumfile[result_anchors[acronym] + 4 + (1:length(scenarios))]
        tmp_frame <- read.table(text = tmp, sep = "\t")
        PECgw <- tmp_frame$V5
        focus_summary[[psm]][[crop]][, acronym] <- PECgw
      }
    }
  }
  expect_equal(pfm_PECgw, focus_summary)
})

Contact - Imprint