Remap OISST to tx2_3

Remap OISST to tx2_3#

%matplotlib inline
import xarray as xr
import xesmf
import numpy as np
import datetime
import matplotlib.pyplot as plt
today = datetime.date.today().strftime("%y%m%d")
print(today)
260306
fname = '../mesh/tx2_3v3_grid.nc'
ds_out = xr.open_dataset(fname).rename({'tlon': 'lon','tlat': 'lat', 'qlon': 'lon_b',
                                        'qlat': 'lat_b', 'nx' : 'xh', 'ny' : 'yh',
                                        'depth' : 'z_l', 'tmask':'mask'})
ds_out
<xarray.Dataset> Size: 42MB
Dimensions:  (yh: 480, xh: 540, nxp: 541, nyp: 481)
Dimensions without coordinates: yh, xh, nxp, nyp
Data variables: (12/20)
    lon      (yh, xh) float64 2MB ...
    lat      (yh, xh) float64 2MB ...
    ulon     (yh, nxp) float64 2MB ...
    ulat     (yh, nxp) float64 2MB ...
    vlon     (nyp, xh) float64 2MB ...
    vlat     (nyp, xh) float64 2MB ...
    ...       ...
    tarea    (yh, xh) float64 2MB ...
    mask     (yh, xh) float64 2MB ...
    angle    (yh, xh) float64 2MB ...
    z_l      (yh, xh) float64 2MB ...
    ar       (yh, xh) float64 2MB ...
    egs      (yh, xh) float64 2MB ...
Attributes:
    Description:  CESM MOM6 2/3 degree grid
    Author:       Frank, Fred, Gustavo (gmarques@ucar.edu)
    Created:      2026-03-05T14:49:28.971877
    type:         Glogal 2/3 degree grid file
infile = '/glade/campaign/cgd/oce/datasets/obs/OI.SST.v2/monthly/sst.mean.????.??.nc'
ds_in = xr.open_mfdataset(infile)
ds_in
<xarray.Dataset> Size: 2GB
Dimensions:  (time: 444, lat: 720, lon: 1440)
Coordinates:
  * time     (time) datetime64[ns] 4kB 1982-01-16 ... 2018-12-16
  * lat      (lat) float32 3kB -89.88 -89.62 -89.38 -89.12 ... 89.38 89.62 89.88
  * lon      (lon) float32 6kB 0.125 0.375 0.625 0.875 ... 359.4 359.6 359.9
Data variables:
    sst      (time, lat, lon) float32 2GB dask.array<chunksize=(1, 720, 1440), meta=np.ndarray>
Attributes:
    Conventions:    CF-1.5
    title:          NOAA High-resolution Blended Analysis: Daily Values using...
    institution:    NOAA/NCDC
    source:         NOAA/NCDC  ftp://eclipse.ncdc.noaa.gov/pub/OI-daily-v2/
    comment:        Reynolds, et al., 2007: Daily High-Resolution-Blended Ana...
    history:        Mon Dec 23 22:15:20 2019: ncra -F -d time,1,31 sst.day.me...
    references:     https://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oiss...
    dataset_title:  NOAA Daily Optimum Interpolation Sea Surface Temperature
    NCO:            netCDF Operators version 4.8.1 (Homepage = http://nco.sf....
def regrid_tracer(fld, ds_in, ds_out, method='bilinear'):

    regrid = xesmf.Regridder(
        ds_in,
        ds_out,
        method=method,
        periodic=True,
    )
    fld_out = regrid(ds_in[fld])#[0,0,:]#.where(ds_in.lat>ds_out.geolat.min())
    return fld_out

Potential temperature#

sst = regrid_tracer('sst', ds_in, ds_out).rename('sst')
sst
<xarray.DataArray 'sst' (time: 444, yh: 480, xh: 540)> Size: 460MB
dask.array<astype, shape=(444, 480, 540), dtype=float32, chunksize=(1, 480, 540), chunktype=numpy.ndarray>
Coordinates:
  * time     (time) datetime64[ns] 4kB 1982-01-16 ... 2018-12-16
Dimensions without coordinates: yh, xh
Attributes:
    regrid_method:  bilinear
# add coordinates
sst = sst.assign_coords(geolat=ds_out.lat, geolon=ds_out.lon)
sst
<xarray.DataArray 'sst' (time: 444, yh: 480, xh: 540)> Size: 460MB
dask.array<astype, shape=(444, 480, 540), dtype=float32, chunksize=(1, 480, 540), chunktype=numpy.ndarray>
Coordinates:
  * time     (time) datetime64[ns] 4kB 1982-01-16 ... 2018-12-16
    geolat   (yh, xh) float64 2MB -81.56 -81.56 -81.56 ... 50.27 50.11 49.99
    geolon   (yh, xh) float64 2MB -286.7 -286.0 -285.3 ... 72.97 72.98 73.0
Dimensions without coordinates: yh, xh
Attributes:
    regrid_method:  bilinear

Visual inspection#

Make sure original and remapped plots look similar.

# visual inspection. Make sure original and remapped plots look similar
for t in range(12):
  fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(18,4))
  sst[t,:,:].plot.pcolormesh(x='geolon',y='geolat',ax=axes[0], vmin=-2,vmax=30)
  ds_in['sst'][t,:,:].plot.pcolormesh(ax=axes[1], vmin=-2,vmax=30)
  axes[0].set_title('Remapped')
  axes[1].set_title('Original grid')
  plt.suptitle('Month ='+ str(t+1))
/glade/u/apps/opt/miniforge/envs/npl-2026a/lib/python3.13/site-packages/dask/config.py:786: FutureWarning: Dask configuration key 'allowed-failures' has been deprecated; please use 'distributed.scheduler.allowed-failures' instead
  warnings.warn(
../_images/aa30d52b1b81eeae83f445cfa056610e1ba390eb45f36540181ae3480d32ae4a.png ../_images/a79ee27b3c177256a37e5ddfd8b87c8132dc45866034fb71409b7af5c0abc570.png ../_images/a56c8b130aa1c7ca47a8d03f708d6ed8b14304462fb475a740ff87b7c0bb02db.png ../_images/dd75fa96bf94d776a2ee0f7e27fcab51e3a2bb5bc5e6c43e6cccd5c4a4cf49eb.png ../_images/274b4d7daafd1001aafd0cd04ddd8a8865b156c869e944d21323e28259a4916a.png ../_images/c039c3c7736c029cd5458bbb432b0c0d869866f35c961ed0052fee845443322f.png ../_images/ed382707bc3a007ec54d9193fc82e02b64a2a1906ce691a2073714fe452d7782.png ../_images/9caa65477bbd91ca5ecbf4c99ccfe034cbbfad60a3a517b875fd53bd4dfcb7ed.png ../_images/977ff6af0a9427212cdc96ac19fd499a9c5f9edf709ef96df359bf7162804973.png ../_images/b96f8699bc437842a2951168d57f8dbd037411e0ec35128f8a004009dd479572.png ../_images/7518a1474241d3cede3793ffc65b04188cdd69e83ec3e85e1c569b73a760ee37.png ../_images/1122895d9a35b8b03e0813c4cb4980fb083c83d7f6e8f0003857d5245a188a50.png
# Global attrs
sst.attrs['title'] = 'Monthly OISSTv2 remapped to tx2_3v3'
sst.attrs['references'] = 'https://www.esrl.noaa.gov/psd/data/gridded/data.noaa.oisst.v2.highres.html'
sst.attrs['author'] = 'Gustavo Marques (gmarques@ucar.edu)'
sst.attrs['date'] = today
sst.attrs['infile'] = infile
sst.attrs['url'] = 'https://github.com/NCAR/tx2_3/oisst'
# save
fname = 'oisstv2_to_tx2_3v3_{}.nc'.format(today)
sst.to_netcdf(fname)