def compute_rp(filename): """ Compute Rp - the ratio of the change in salinity relative to temperature. Allows for identification of profiles which are susceptible to double diffusion or salt fingering """ plt.style.use('seaborn') name = filename[:-3] datadir = "Data/ctd_files/gridded_calibrated_updated" data = xr.open_dataset(os.path.join(datadir, filename)) # fig,ax = plt.subplots(1,2,sharey=True) temp = data['ptemp'] psal = data['ab_sal'] depth = data['DEPTH'] sigma_t = data['Gsw_sigma0A0'] [rho, alpha, beta] = gsw.rho_alpha_beta(psal, temp, depth) rp = (beta[:-1] * np.diff(psal)) / (alpha[:-1] * np.diff(temp)) fig, ax = plt.subplots(2, 2) fig.suptitle(name.replace('_', ' ')) ax[1, 1].plot(rp, depth[:-1] * -1) ax[1, 0].plot(rho, depth * -1) ax[0, 1].plot(psal, depth * -1) ax[0, 0].plot(temp, depth * -1) plt.show()
def raw_to_zref(d, zref): temp = d['TEMP'] psal = d['PSAL'] pres = d['PRES'] temp_qc = d['TEMP_QC'] psal_qc = d['PSAL_QC'] pres_qc = d['PRES_QC'] lon = d['LONGITUDE'] lat = d['LATITUDE'] klist, ierr = remove_bad_qc(d) if ierr == 0: Tis = temp[klist] SP = psal[klist] p = pres[klist] CT, SA, z = insitu_to_absolute(Tis, SP, p, lon, lat, zref) Ti, Si, dTidz, dSidz = interp_at_zref(CT, SA, z, zref, klist) pi = gsw.p_from_z(-zref, lat) #Ri = gsw.rho(Si, Ti, pi) Ri, alpha, beta = gsw.rho_alpha_beta(Si, Ti, pi) g = gsw.grav(lat, pi) BVF2i = g * (beta * dSidz - alpha * dTidz) flag = True else: zero = zref * 0. Ti, Si, Ri, BVF2i = zero, zero, zero, zero flag = False return {'CT': Ti, 'SA': Si, 'RHO': Ri, 'BVF2': BVF2i}, flag
def compute_alpha_beta(data, temperature_var='SST', salinity_var='SSS'): p = 0 * data['lon'] SA = gsw.SA_from_SP(data[salinity_var], p, data['lon'], data['lat']) CT = gsw.CT_from_t(SA, data[temperature_var], p) rho, alpha, beta = gsw.rho_alpha_beta(SA, CT, p) return data.assign(alpha=xr.DataArray(alpha, dims='time'), beta=xr.DataArray(beta, dims='time'))
def compute_density(data): p = 0 * data['lon'] SA = gsw.SA_from_SP(data['SSS'], p, data['lon'], data['lat']) CT = gsw.CT_from_t(SA, data['SST'], p) rho, alpha, beta = gsw.rho_alpha_beta(SA, CT, p) #b = 9.81 * (1 - rho / 1025.) data['SSS'].data = SA data['SST'].data = CT return data.assign(SSrho=xr.DataArray(rho, dims='time'), SSalpha=xr.DataArray(alpha, dims='time'), SSbeta=xr.DataArray(beta, dims='time'))
def brunt_vaisala(datadir, filenames, desc=''): #Load required variables lat = [] lon = [] temp = [] sal = [] depth = [] for i in filenames: d = xr.open_dataset(os.path.join(datadir, i)) temp.append(d.TEMP.values) sal.append(d.PSAL.values) lon.append(np.nanmean(d.lon.values)) lat.append(np.nanmean(d.lat.values)) depth = -np.abs(d.DEPTH.values) coords = lon #compute alpha and beta [rho, alpha, beta] = gsw.rho_alpha_beta(sal, temp, depth) g = 9.8 N = np.sqrt(g * ((alpha[:, :-1] * (np.diff(temp) / np.diff(depth))) - (beta[:, :-1] * (np.diff(sal) / np.diff(depth)))) ) ##computed this way so that the influence of temperature #vs salinity can be separated #plot N xx, yy = np.meshgrid(lon, depth[:-1]) plt.pcolormesh(xx, yy, N.T) cb = plt.colorbar(extend='both') cb.set_label('N') #plt.show() plt.savefig('Figures/Transect/transect_N.pdf') plt.savefig('Figures/Transect/transect_N.png') plt.close() return N, np.asarray(rho), depth, lon, lat
def alphabeta(SA, CT, depth): import gsw as gsw _, y = np.meshgrid(SA[1, :], depth) _, alpha, beta = gsw.rho_alpha_beta(SA, CT, y) return alpha, beta