Source code for pysurfex.fa

"""FA support."""
import logging

try:
    from epygram.formats import resource
except ImportError:
    resource = None


from .geo import ConfProj
from .interpolation import Interpolation


[docs]class Fa(object): """Fichier Arpege."""
[docs] def __init__(self, fname): """Construct a FA object. Args: fname (str): filename """ self.fname = fname self.projection = None self.lons = None self.lats = None self.nearest = None self.linear = None
[docs] def field(self, varname, validtime): """Read a field. Args: varname (_type_): _description_ validtime (_type_): _description_ Raises: ModuleNotFoundError: You need epygram to read FA files NotImplementedError: Geometry not implemented Returns: tuple: np.field, surfex.Geometry """ if resource is None: raise ModuleNotFoundError("You need epygram to read FA files") else: fa_file = resource(self.fname, openmode="r") field = fa_file.readfield(varname) # TODO this might not work with forcing... zone = "CI" crnrs = field.geometry.gimme_corners_ij(subzone=zone) range_x = slice(crnrs["ll"][0], crnrs["lr"][0] + 1) range_y = slice(crnrs["lr"][1], crnrs["ur"][1] + 1) # TODO: check time logging.info( "Not checking validtime for FA variable at the moment: %s", str(validtime) ) if ( field.geometry.name == "lambert" or field.geometry.name == "polar_stereographic" ): n_y = field.geometry.dimensions["Y_CIzone"] n_x = field.geometry.dimensions["X_CIzone"] lon0 = field.geometry.projection["reference_lon"].get("degrees") lat0 = field.geometry.projection["reference_lat"].get("degrees") c0, c1 = field.geometry.getcenter() lonc = c0.get("degrees") latc = c1.get("degrees") d_x = field.geometry.grid["X_resolution"] d_y = field.geometry.grid["Y_resolution"] ilone = field.geometry.dimensions["X"] - n_x ilate = field.geometry.dimensions["Y"] - n_y domain = { "nam_conf_proj": {"xlon0": lon0, "xlat0": lat0}, "nam_conf_proj_grid": { "xloncen": lonc, "xlatcen": latc, "nimax": n_x, "njmax": n_y, "xdx": d_x, "xdy": d_y, "ilone": ilone, "ilate": ilate, }, } geo_out = ConfProj(domain) data = field.data[range_y, range_x].T else: raise NotImplementedError(field.geometry.name + " not implemented yet!") return data, geo_out
[docs] def points(self, varname, geo, validtime=None, interpolation="nearest"): """Read a 2-D field and interpolates it to requested positions. Args: varname (str): Variable name geo (surfex.geo.Geo): Geometry validtime (as_datetime): Validtime interpolation (str, optional): Interpoaltion method. Defaults to "nearest". Returns: tuple: field, interpolator """ field, geo_in = self.field(varname, validtime) interpolator = Interpolation(interpolation, geo_in, geo) field = interpolator.interpolate(field) return field, interpolator