Source code for xbout.fastoutput

import re
import xarray as xr
from xbout.load import _expand_filepaths


[docs] def open_fastoutput(datapath="BOUT.fast.*.nc"): """ Opens fast output data and combines into a single dataset. """ # Get list of all files filepaths, filetype = _expand_filepaths(datapath) # Iterate over all files, extracting DataArrays ready for combining fo_data = [] for i, filepath in enumerate(filepaths): fo = xr.open_dataset(filepath) if i == 0: # Get time coordinate from first file time = fo["time"] # Time is global, and we already extracted it fo = fo.drop_vars("time", errors="ignore") # There might be no virtual probe in this region if len(fo.data_vars) > 0: for name, da in fo.items(): # Save the physical position (in index units) da = da.expand_dims(x=1, y=1, z=1) da = da.assign_coords( x=xr.DataArray([da.attrs["ix"]], dims=["x"]), y=xr.DataArray([da.attrs["iy"]], dims=["y"]), z=xr.DataArray([da.attrs["iz"]], dims=["z"]), ) # Re-attach the time coordinate da = da.assign_coords(time=time) # We saved the position, so don't care what number the variable was # Only need it's name (i.e. n, T, etc.) regex = re.compile(r"(\D+)([0-9]+)") match = regex.match(name) if match is None: raise ValueError(f"Regex could not parse the variable named {name}") var, num = match.groups() da.name = var # Must promote DataArrays to Datasets until we require xarray-0.19.0 # where xarray GH #3248 is fixed ds = xr.Dataset({var: da}) fo_data.append(ds) fo.close() # This will merge different variables, and arrange by physical position full_fo = xr.combine_by_coords(fo_data, combine_attrs="drop_conflicts") return full_fo