def build_model_data(model_run, debug=False): """ Take a Calliope model_run and convert it into an xarray Dataset, ready for constraint generation. Timeseries data is also extracted from file at this point, and the time dimension added to the data Parameters ---------- model_run : AttrDict preprocessed model_run dictionary, as produced by Calliope.core.preprocess_model debug : bool, default = False Used to debug steps within build_model_data, particularly before/after time dimension addition. If True, more information is returned Returns ------- data : xarray Dataset Dataset with optimisation parameters as variables, optimisation sets as coordinates, and other information in attributes. data_dict : dict, only returned if debug = True dictionary of parameters, prior to time dimension addition. Used here to populate the Dataset (using `from_dict()`) data_pre_time : xarray Dataset, only returned if debug = True Dataset, prior to time dimension addition, with optimisation parameters as variables, optimisation sets as coordinates, and other information in attributes. """ # We build up a dictionary of the data, then convert it to an xarray Dataset # before applying time dimensions data = xr.Dataset( coords=add_sets(model_run), attrs=add_attributes(model_run) ) data_dict = dict() data_dict.update(constraints_to_dataset(model_run)) data_dict.update(costs_to_dataset(model_run)) data_dict.update(location_specific_to_dataset(model_run)) data_dict.update(tech_specific_to_dataset(model_run)) data_dict.update(carrier_specific_to_dataset(model_run)) data.merge(xr.Dataset.from_dict(data_dict), inplace=True) add_lookup_arrays(data, model_run) if debug: data_pre_time = data.copy(deep=True) add_time_dimension(data, model_run) # Carrier information uses DataArray indexing in the function, so we merge # these directly into the main xarray Dataset if debug: return data, data_dict, data_pre_time else: return data