sw_meteo_obtain: Extract meteorological data from external source and format...

sw_meteo_obtainR Documentation

Extract meteorological data from external source and format for rSOILWAT2

Description

Extract meteorological data from external source and format for rSOILWAT2

Usage

sw_meteo_obtain_DayMet(x, start_year, end_year, rawdata = NULL, ...)

sw_meteo_obtain_SCAN(x, start_year, end_year, rawdata = NULL, ...)

Arguments

x

Identifying information for the station/location for which meteorological data is requested, see details.

start_year

A integer value. The first calendar year of the simulation.

end_year

A integer value. The last calendar year of the simulation.

rawdata

A data object retrieved previously.

...

Additional arguments are ignored.

Value

A list with the following elements

  • "metadata": site metadata (if available)

  • "rawdata": data as downloaded (or argument rawdata if provided)

  • "weatherDF": data frame with weather data formatted for rSOILWAT2

  • "vals_missing": logical matrix indicating which weather values in "weatherDF" are missing

  • "desc_rsds": solar radiation descriptor (if available)

  • "use_cloudCoverMonthly": flag indicating need for monthly cloud cover

  • "use_windSpeedMonthly": flag indicating need for monthly wind speed

  • "use_humidityMonthly": flag indicating need for monthly humidity

  • "dailyInputFlags": logical vector indicating which weather variables contain at least some values (see calc_dailyInputFlags())

Details

sw_meteo_obtain_DayMet() uses data from ⁠DayMet ORNL DAAC⁠ via daymetr::download_daymet(). The argument x is a named vector with "longitude" and "latitude" in decimal degrees. "DayMet" uses a "noleap" ("365_day") calendar which is converted to a "standard" calendar (i.e., one with leap days); this results in missing values on inserted leap days (see code example). "DayMet" does not contain wind speed which is a required input.

sw_meteo_obtain_SCAN() uses data from USDA-NRCS SCAN/SNOTEL stations via soilDB::fetchSCAN(). The argument x takes a NRCS SCAN/SNOTEL station code.

Examples

## Example: Daymet weather for "Mccracken Mesa" location
##   (see `mm_scan[["metadata"]]`)
if (requireNamespace("curl") && curl::has_internet()) {
  mm_dm <- rSOILWAT2::sw_meteo_obtain_DayMet(
    x = c(longitude = -109.3378, latitude = 37.44671),
    start_year = 2015,
    end_year = 2023
  )

  # Fill in missing values on leap days
  mm_dm_wdata <- rSOILWAT2::dbW_fixWeather(mm_dm[["weatherDF"]])

  # Prepare a SOILWAT2 simulation
  swin <- rSOILWAT2::sw_exampleData
  rSOILWAT2::swYears_EndYear(swin) <- 2023
  rSOILWAT2::swYears_StartYear(swin) <- 2015
  swin@weather@desc_rsds <- mm_dm[["desc_rsds"]]
  swin@weather@use_cloudCoverMonthly <- mm_dm[["use_cloudCoverMonthly"]]
  swin@weather@use_windSpeedMonthly <- mm_dm[["use_windSpeedMonthly"]]
  swin@weather@use_humidityMonthly <- mm_dm[["use_humidityMonthly"]]
  swin@weather@dailyInputFlags <- mm_dm[["dailyInputFlags"]]

  # Set mean monthly climate values to missing
  # (except wind speed which is missing in DayMet)
  rSOILWAT2::swCloud_Humidity(swin)[] <- NA_real_
  rSOILWAT2::swCloud_WindSpeed(swin)[] <- rep(1.5, times = 12L)
  rSOILWAT2::swCloud_SkyCover(swin)[] <- NA_real_

  # Obtain atmospheric CO2 concentration
  rSOILWAT2::swCarbon_Scenario(swin) <- "CMIP6_historical|CMIP6_SSP119"
  rSOILWAT2::swCarbon_CO2ppm(swin) <- rSOILWAT2::lookup_annual_CO2a(
    start = 2015,
    end = 2023,
    name_co2 = rSOILWAT2::swCarbon_Scenario(swin)
  )

  # Run simulation (after providing remaining inputs, e.g., soils)
  swout <- try(
    rSOILWAT2::sw_exec(
      inputData = swin,
      weatherList = mm_dm_wdata[["weatherData"]],
      quiet = TRUE
    ),
    silent = TRUE
  )
}

## Example: SCAN station "Mccracken Mesa"
if (requireNamespace("curl") && curl::has_internet()) {
  mm_scan <- try(
    rSOILWAT2::sw_meteo_obtain_SCAN(
      x = 2140, # SCAN station code
      start_year = 2015,
      end_year = 2023
    )
  )
}

if (
  exists("mm_scan") && !inherits(mm_scan, "try-error") &&
  exists("mm_dm") &&
  requireNamespace("graphics")
) {
  vars <- c("Tmax_C", "Tmin_C", "PPT_cm")
  par_prev <- graphics::par(mfrow = grDevices::n2mfrow(length(vars)))

  for (k in seq_along(vars)) {
    graphics::plot(
      x = mm_scan[["weatherDF"]][[vars[[k]]]],
      y = mm_dm[["weatherDF"]][[vars[[k]]]],
      xlab = paste("SCAN", vars[[k]]),
      ylab = paste("DayMet", vars[[k]])
    )
    graphics::abline(a = 0, b = 1, col = "red")
  }

  graphics::par(par_prev)
}


Burke-Lauenroth-Lab/Rsoilwat documentation built on June 2, 2025, 7:30 a.m.