A process that runs the bccaq.netcdf.wrapper function from ClimDown.
Bias Correction/Constructed Analogues with Quantile mapping reordering (BCCAQ) is composed of the following steps.
from birdy import WPSClient
from netCDF4 import Dataset
from pkg_resources import resource_filename
from wps_tools.testing import get_target_url
from tempfile import NamedTemporaryFile
from datetime import date
import requests
import os
# Ensure we are in the working directory with access to the data
while os.path.basename(os.getcwd()) != "chickadee":
os.chdir('../')
# NBVAL_IGNORE_OUTPUT
url = get_target_url("chickadee")
print(f"Using chickadee on {url}")
Using chickadee on https://docker-dev03.pcic.uvic.ca/twitcher/ows/proxy/chickadee/wps
chickadee = WPSClient(url)
# NBVAL_IGNORE_OUTPUT
chickadee.bccaq?
Signature: chickadee.bccaq( gcm_file, obs_file=None, varname=None, num_cores='4', loglevel='INFO', units_bool=True, n_pr_bool=True, tasmax_units='celsius', tasmin_units='celsius', pr_units='kg m-2 d-1', max_gb=1.0, start_date=datetime.date(1971, 1, 1), end_date=datetime.date(2005, 12, 31), num_analogues='30', delta_days='45', trimmed_mean=0.0, tol=0.1, multiyear=True, expand_multiyear=True, multiyear_window_length='30', trace=0.005, jitter_factor=0.01, pr_tau='1001', tasmax_tau='101', tasmin_tau='101', pr_seasonal=True, tasmax_seasonal=False, tasmin_seasonal=False, pr_ratio=True, tasmax_ratio=False, tasmin_ratio=False, out_file=None, ) Docstring: Full statistical downscaling of coarse scale global climate model (GCM) output to a fine spatial resolution Parameters ---------- gcm_file : ComplexData:mimetype:`application/x-netcdf`, :mimetype:`application/x-ogc-dods` Filename of GCM simulations obs_file : ComplexData:mimetype:`application/x-netcdf`, :mimetype:`application/x-ogc-dods` Filename of high-res gridded historical observations varname : string Name of the NetCDF variable to downscale (e.g. 'tasmax') out_file : string Filename to create with the climate imprint outputs num_cores : {'1', '2', '3', '4'}positiveInteger The number of cores to use for parallel execution loglevel : {'CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG', 'NOTSET'}string Logging level units_bool : boolean Check the input units and convert them to the target output units n_pr_bool : boolean Check for and eliminate negative precipitation values tasmax_units : string Units used for tasmax in output file tasmin_units : string Units used for tasmin in output file pr_units : string Units used for pr in output file max_gb : float Anapproximately how much RAM to use in the chunk I/O loop. It’s best to set this to about 1/3 to 1/4 of what you want the high-water mark to be start_date : date Defines the stat of the calibration period end_date : date Defines the end of the calibration period num_analogues : positiveInteger The number of temporal analogues that the CA algorithm will search for and match. The higher this number, the longer the execution time of the reordering step. delta_days : positiveInteger An integer describing the size of the window on either side of a day - Not recommeded to change trimmed_mean : float The fraction (0 to 0.5) of observations to be trimmed from each extreme of the distribution before the mean is computed - Not recommended to change tol : float Tuning parameter used in ridge regression to calculate weights - Not recommended to change multiyear : boolean Apply over multi-year chunks - Not recommended to change expand_multiyear : boolean Fold incomplete multi-year block into previous - Not recommended to change multiyear_window_length : positiveInteger Number of years to run if multiyear is true - Not recommended to change trace : float Treat values below trace as left censored - Not recommended to change jitter_factor : float Adds random noise to data to accomodate ties - Not recommended to change pr_tau : positiveInteger Number of empirical quantiles for pr variable (NULL=sample length) - Not recommended to change tasmax_tau : positiveInteger Number of empirical quantiles for tasmax variable (NULL=sample length) - Not recommended to change tasmin_tau : positiveInteger Number of empirical quantiles for tasmin variable (NULL=sample length) - Not recommended to change pr_seasonal : boolean Apply over sliding 3-month windows - Not recommended to change tasmax_seasonal : boolean Apply over sliding 3-month windows - Not recommended to change tasmin_seasonal : boolean Apply over sliding 3-month windows - Not recommended to change pr_ratio : boolean Preserve relative trends in pr ratio variable - Not recommended to change tasmax_ratio : boolean Preserve relative trends in tasmax ratio variable - Not recommended to change tasmin_ratio : boolean Preserve relative trends in tasmin ratio variable - Not recommended to change Returns ------- output : ComplexData:mimetype:`application/x-netcdf` Output Netcdf File File: ~/code/birds/chickadee/</tmp/chickadee-venv/lib/python3.8/site-packages/birdy/client/base.py-2> Type: method
out_file = NamedTemporaryFile(suffix=".nc", prefix="output_", dir="/tmp", delete=True)
output = chickadee.bccaq(
gcm_file=resource_filename("tests", "/data/tiny_gcm.nc"),
obs_file=resource_filename("tests", "/data/tiny_obs.nc"),
varname="tasmax",
end_date=date(1972, 12, 31),
out_file=out_file.name,
num_cores=4
)
out_file.close()
output_data = output.get()[0]
Access the output with nc_to_dataset() or auto_construct_outputs() from wps_tools.output_handling
# NBVAL_IGNORE_OUTPUT
from wps_tools.output_handling import nc_to_dataset, auto_construct_outputs
output_dataset = nc_to_dataset(output_data)
<class 'netCDF4._netCDF4.Dataset'> root group (NETCDF3_CLASSIC data model, file format NETCDF3): dimensions(sizes): lon(26), lat(26), time(3651) variables(dimensions): float64 lon(lon), float64 lat(lat), float64 time(time), float32 tasmax(time,lat,lon) groups:
# NBVAL_IGNORE_OUTPUT
auto_construct_outputs(output.get())
[<class 'netCDF4._netCDF4.Dataset'> root group (NETCDF3_CLASSIC data model, file format NETCDF3): dimensions(sizes): lon(26), lat(26), time(3651) variables(dimensions): float64 lon(lon), float64 lat(lat), float64 time(time), float32 tasmax(time,lat,lon) groups: ]
expected_data = Dataset(resource_filename("tests","/data/bccaq_expected_output.nc"))
for key, value in expected_data.dimensions.items():
assert str(output_dataset.dimensions[key]) == str(value)