def ocn_heat_transport(self, dlat=1, grid='g16', method='Flux_adjusted', lat_bd=90):
from scipy import integrate
flux = self._obj
area = dict(g16=utl.tarea_g16, g35=utl.tarea_g35, g37=utl.tarea_g37)
flux_area = flux.copy()
flux_area.values = flux * area[grid] * 1e-4 # convert to m2
lat_bins = np.arange(-90,91,dlat)
lat = np.arange(-89.5,90,dlat)
if 'TLAT' in flux_area.coords.keys():
flux_lat = flux_area.groupby_bins('TLAT', lat_bins, labels = lat).sum('stacked_nlat_nlon')
latax = flux_lat.get_axis_num('TLAT_bins')
elif 'ULAT' in flux_area.coords.keys():
flux_area = flux_area.rename({"ULAT":"TLAT"})
flux_lat = flux_area.groupby_bins('TLAT', lat_bins, labels = lat).sum('stacked_nlat_nlon')
latax = flux_lat.get_axis_num('TLAT_bins')
TLAT_bins = flux_lat.TLAT_bins
if method == "Flux_adjusted":
flux_lat = flux_lat.where(TLAT_bins < lat_bd) # north bound
flat_ave = flux_lat.mean('TLAT_bins')
flux_lat.values = flux_lat - flat_ave # remove bias
flux_lat = flux_lat.fillna(0)
print("The ocean heat trasnport is computed by Flux adjustment.")
elif method == "Flux":
flux_lat = flux_lat.fillna(0)
print("The ocean heat trasnport is computed by original flux.")
else:
raise ValueError("method is not suppoprted.")
flux_lat.values = -np.flip(flux_lat.values, latax) # integrate from north pole
integral = integrate.cumtrapz(flux_lat, x=None, initial=0., axis=latax)
OHT = flux_lat.copy()
OHT["TLAT_bins"] = np.flip(flux_lat.TLAT_bins.values, 0)
OHT.values = integral *1e-15
return OHT
评论列表
文章目录