Пример #1
0
def test_eos_ds_dask():
    fname = DATASETS.fetch('cesm_pop_monthly.T62_g17.nc')
    ds = xr.open_dataset(fname,
                         decode_times=False,
                         decode_coords=False,
                         chunks={'z_t': 20})
    rho = pop_tools.eos(ds.SALT, ds.TEMP, depth=ds.z_t * 1e-2)
    assert isinstance(rho, xr.DataArray)
Пример #2
0
def mld_dsigma(SALT, TEMP, dsigma=0.03, rho_chunks={'nlat': 16, 'nlon': 16}):
    """
    Compute MLD based on ∆σ criterion. Uses xarray.map_blocks.
    
    Parameters
    ----------
    
    SALT : xarray.DataArray
      Salinity
    TEMP : xarray.DataArray
      Potential temperature
    dsigma : float, optional
      The value for ∆σ.
      
    Returns
    -------
    
    MLD : xarray.DataArray
      The MLD (m) defined as the point in the water column where
      density exceeds rho[0] + dsigma.      
    """

    # determine dimensionality
    dims_in = SALT.dims
    assert dims_in == TEMP.dims, 'dimension mismatch'
    assert 'z_t' in SALT.coords, 'z_t not found in SALT coords'

    # drop ancillary coordinates (this may not be necessary)
    SALT = SALT.reset_coords(drop=True)
    TEMP = TEMP.reset_coords(drop=True)

    # compute density
    rho = pop_tools.eos(SALT.chunk({'z_t': 10}),
                        TEMP.chunk({'z_t': 10}),
                        depth=SALT.z_t * 0.).compute()

    if 'nlat' in rho.dims:
        rho = rho.assign_coords({
            'nlat':
            xr.DataArray(np.arange(len(SALT.nlat)), dims=('nlat')),
            'nlon':
            xr.DataArray(np.arange(len(SALT.nlon)), dims=('nlon')),
        })
    rho = rho.chunk(rho_chunks).persist()

    # compute and return MLD
    template = rho.isel(z_t=0).drop('z_t')
    template.attrs['long_name'] = 'MLD'
    template.attrs['units'] = SALT.z_t.attrs['units']
    template.name = 'MLD'

    return xr.map_blocks(
        _interp_mld,
        rho,
        kwargs=dict(dsigma=dsigma),
        template=template,
    )
Пример #3
0
def test_eos_ds_dask():
    ds = xr.open_dataset(
        f'{testdata_dir}/cesm_pop_monthly.T62_g17.nc',
        decode_times=False,
        decode_coords=False,
        chunks={'z_t': 20},
    )
    rho = pop_tools.eos(ds.SALT, ds.TEMP, depth=ds.z_t * 1e-2)
    assert isinstance(rho, xr.DataArray)
Пример #4
0
def test_eos_xarray_2():
    ds = xr.open_dataset(f'{testdata_dir}/cesm_pop_monthly.T62_g17.nc',
                         decode_times=False,
                         decode_coords=False)
    rho, drhodS, drhodT = pop_tools.eos(ds.SALT,
                                        ds.TEMP,
                                        depth=ds.z_t * 1e-2,
                                        return_coefs=True)
    assert isinstance(rho, xr.DataArray)
Пример #5
0
def test_eos_xarray_2():
    fname = DATASETS.fetch('cesm_pop_monthly.T62_g17.nc')
    ds = xr.open_dataset(fname, decode_times=False, decode_coords=False)
    rho, drhodS, drhodT = pop_tools.eos(ds.SALT,
                                        ds.TEMP,
                                        depth=ds.z_t * 1e-2,
                                        return_coefs=True)
    assert isinstance(rho, xr.DataArray)
    assert isinstance(drhodS, xr.DataArray)
    assert isinstance(drhodT, xr.DataArray)
Пример #6
0
                             })
    sigma_mid.encoding['_FillValue'] = None
    sigma_bot = xr.DataArray(sig2_bot,
                             dims=['sigma_bot'],
                             attrs={
                                 'long_name': 'Sigma2 at bottom of layer',
                                 'units': 'kg/m^3'
                             })
    sigma_bot.encoding['_FillValue'] = None

    # Compute POP sigma2 field (NOTE: this is only necessary if sigmacoord=True)
    # using pop_tools:
    depth = xr.DataArray(np.ones(np.shape(salt)) * 2000.,
                         dims=salt.dims,
                         coords=salt.coords)
    sigma2 = pop_tools.eos(salt=salt, temp=temp, depth=depth)
    sigma2 = sigma2 - 1000.
    # using gsw functions:
    # first, convert model depth to pressure
    #    (gsw function require numpy arrays, not xarray, so use ".values")
    #    (use [:,None,None] syntax to conform the z_t and tlat into 3D arrays)
    #press = gsw.p_from_z(-z_t.values[:,None,None],tlat.values[None,:,:])
    # compute absolute salinity from practical salinity
    #SA = gsw.SA_from_SP(salt,press[None,:,:,:],tlon.values[None,None,:,:],tlat.values[None,None,:,:])
    # compute conservative temperature from potential temperature
    #CT = gsw.CT_from_pt(SA,temp.values)
    #sigma2 = gsw.sigma2(SA,CT)
    time3 = timer.time()
    print('Timing:  EOS call =  ', time3 - time2a, 's')

    # convert to DataArray & regrid from T-grid to U-grid
Пример #7
0
def test_eos_numpy_1():
    rho = pop_tools.eos(35.0, 20.0, pressure=2000.0)
    np.testing.assert_almost_equal(rho, 1033.2133865866824181, decimal=14)
Пример #8
0
def test_eos_numpy_3():
    rho, drhodS, drhodT = pop_tools.eos(35.0,
                                        20.0,
                                        pressure=2000.0,
                                        return_coefs=True)
    np.testing.assert_almost_equal(rho, 1033.2133865866824181, decimal=14)
Пример #9
0
def test_eos_numpy_2():
    rho = pop_tools.eos(35.0, 20.0, depth=1976.5347494030665985)
    np.testing.assert_almost_equal(rho, 1033.2133865866824181, decimal=14)
Пример #10
0
tlat = ds['TLAT']
tarea = ds['TAREA']
ssd = ds['RHO'].isel(z_t=0)
ssd = ssd.drop(['z_t'])
sst = ds['TEMP'].isel(z_t=0)
sss_psu = ds['SALT'].isel(z_t=0)
sss_msu = sss_psu.copy() / 1000.
sss_msu.attrs['units'] = 'kg/kg'
nt = np.shape(sst)[0]
ny = np.shape(sst)[1]
nx = np.shape(sst)[2]

# Compute rho, alpha, & beta using pop-tools.eos
depth = xr.DataArray(np.zeros(np.shape(sst)), dims=sst.dims, coords=sst.coords)
rho, drhods, drhodt = pop_tools.eos(salt=sss_psu,
                                    temp=sst,
                                    return_coefs=True,
                                    depth=depth)
alpha = (drhodt / rho) * -1  # 1/degC
beta = (drhods / rho)  # kg(Seawater)/kg(SALT)
sigma0 = rho - 1000.
sigma0 = sigma0.drop(['z_t'])
sigma0.attrs['units'] = 'kg/m^3'
sigma0.attrs['long_name'] = 'Sigma referenced to z=0'
sigma0.encoding['_FillValue'] = 1.e30

depth = depth + 2000.
tmp = pop_tools.eos(salt=sss_psu, temp=sst, return_coefs=False, depth=depth)
sigma2 = tmp - 1000.
sigma2 = sigma2.drop(['z_t'])
sigma2.attrs['units'] = 'kg/m^3'
sigma2.attrs['long_name'] = 'Sigma referenced to z=2000'