Regrid MLD from deBoyer et al (2004)#

This notebook documents the steps needed to regrid the MLD dataset to a nominal 1/4 deg MOM grid (tx1_4).

%matplotlib inline
import xarray as xr
import xesmf
import numpy as np
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt
fname = '../../mesh/tx1_4_grid.nc'
ds_out = xr.open_dataset(fname).rename({'tlon': 'lon','tlat': 'lat', 'qlon': 'lon_b','qlat': 'lat_b',})
ds_out
<xarray.Dataset>
Dimensions:  (ny: 1080, nx: 1440, nxp: 1441, nyp: 1081)
Dimensions without coordinates: ny, nx, nxp, nyp
Data variables: (12/20)
    lon      (ny, nx) float64 ...
    lat      (ny, nx) float64 ...
    ulon     (ny, nxp) float64 ...
    ulat     (ny, nxp) float64 ...
    vlon     (nyp, nx) float64 ...
    vlat     (nyp, nx) float64 ...
    ...       ...
    tarea    (ny, nx) float64 ...
    tmask    (ny, nx) float64 ...
    angle    (ny, nx) float64 ...
    depth    (ny, nx) float64 ...
    ar       (ny, nx) float64 ...
    egs      (ny, nx) float64 ...
Attributes:
    Description:  CESM MOM6 1/4 degree grid
    Author:       Frank, Fred, Gustavo (gmarques@ucar.edu)
    Created:      2022-12-27T10:20:11.076318
    type:         Glogal 1/4 degree grid file
infile = '/glade/campaign/cgd/oce/datasets/obs/mld/deBoyer_2004/mld_DR003_c1m_reg2.0.nc'
ds_in = xr.open_dataset(infile, decode_times=False)
ds_in.mld[0,:].plot(vmin=0, vmax=1000);
../../_images/34f1b961d3fc4b536eb852c2202de96c52bafd5bf11b408836f92c7be38dd3d4.png
# mask bad values
for t in range(len(ds_in.time)):
    tmp = np.nan_to_num(ds_in.mld[t,:].values, copy=True, posinf=0, neginf=0)
    ds_in['mld'][t,:,:] = tmp #.where(tmp == tmp).where(tmp>=0).where(tmp<1.0e6)
ds_in.mld[1,:].where(ds_in.mask==1).plot(vmin=0, vmax=1000)
<matplotlib.collections.QuadMesh at 0x2b50104d2a60>
../../_images/cbda40001b21ffaf1713c4d16ca702ce2a7634b8107dc9aab0fccd216f1ff5f2.png
def regrid_mld(fld, ds_in, ds_out, method='bilinear'):

    regrid = xesmf.Regridder(
        ds_in,
        ds_out,
        method=method,
        periodic=True,
    )
    fld_out = regrid(ds_in[fld])
    return fld_out
ds_out = regrid_mld('mld', ds_in, ds_out).rename('mld')

Visual inspection#

Make sure original and remapped plots look similar.

# visual inspection. Make sure original and remapped plots look similar
for t in range(len(ds_in.time)):
  fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(18,4))
  ds_out[t,:,:].plot.pcolormesh(ax=axes[0], vmin=0,vmax=1000)
  ds_in['mld'][t,:,:].plot.pcolormesh(ax=axes[1], vmin=0,vmax=1000)
  axes[0].set_title('Remapped')
  axes[1].set_title('Original grid')
  plt.suptitle('Month ='+ str(t+1))
../../_images/99e87fa8ad97cbb621bc12ac743c85e154ca75e1ab62d628bf71b813c8486f7b.png ../../_images/609ccea61401bbbbf0b9d8e91eebf850563bdccf28f825a819982c3192db9ed1.png ../../_images/843e7f4599eca0330b8426095a3752f5774271784636719724c52128513eb643.png ../../_images/67caa207085206017effd6f639f67969237ce5e569ee9702d636a3877e2973fb.png ../../_images/62a3e30a7b07424f35b250c3185613679e8ad37e8d72e4985cf92e729fa135cf.png ../../_images/479acef1fdc0c7273fbf784e7d79da1036b45100a3b0809e3889ec17bd274b84.png ../../_images/e4a616ba6d4d4289b5292d9c9b7c83b8ce66518497f6bedecafc3e99a4b8ec68.png ../../_images/ead1b6bd47b984b4f95dbc2a5bfe412a5f9a272db6cbc60400d330a9f2116ba1.png ../../_images/a3b398f525b6879be908d11ea6d9efe1d999e077f9cba22c79d15bce9585dfe6.png ../../_images/90af8ed334a894a9b59e3e620e66d120f10d8314f6165500924403a63e191f90.png ../../_images/fcc5dc3ff99f6584eda2c76890d8ff27941fc5e17f7d6cf56ca271cc13ab3b21.png ../../_images/cba85d2ebcd352e175373b45e23efac66347770e05ebaba23743d9ca13168c1a.png
ds_out.attrs['author'] = 'Gustavo Marques (gmarques@ucar.edu)'
ds_out.attrs['description'] = 'MLD using density criterion of 0.03 kg/m3 difference (de Boyer Montegut et al., JGR 2004)'
ds_out.attrs['date'] = datetime.now().isoformat()
ds_out.attrs['infile'] = infile
ds_out.attrs['url'] = 'https://github.com/NCAR/tx1_4/mld/deBoyer2004/'
# save
fname = 'deBoyer04_MLD_remapped_to_tx1_4.nc'
ds_out.to_netcdf(fname)