def fluxbudget_bolus_visop(ds,mask,varn,kza=0,kzo=None,S0=34.8,t=0): """Compute flux of `varn` into region `mask` due to eddy (bolus) velocity""" _warn_virtual_salt_flux_units() dsvar = ds.variables dxt = dsvar['DXT'][:] * 1e-2 dyt = dsvar['DYT'][:] * 1e-2 dz = dsvar['dz'][:] * 1e-2 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in xrange(kza,kzo): # get bolus velocity uflux = _fill0(dsvar['UISOP'][t,k]) * 1e-2 # m s-1 vflux = _fill0(dsvar['VISOP'][t,k]) * 1e-2 # m s-1 # get scalar data if varn == 'heat': scalar = _fill0(dsvar['TEMP'][t,k]) elif varn == 'salt': scalar = _fill0(dsvar['SALT'][t,k]) elif varn == 'freshwater': scalar = (S0 - _fill0(dsvar['SALT'][t,k])) / S0 # multiply flux by scalar uflux *= scalar vflux *= scalar # multiply by horizontal grid spacing uflux *= dyt vflux *= dxt # multiply by vertical grid spacing uflux *= dz[k] vflux *= dz[k] # compute budget fluxbudget += budget_over_region_2D(uflux,vflux,scalar=None,mask=mask) if varn == 'heat': fluxbudget *= (1e3 * 4e3 * 1e-15) # PW return fluxbudget
def fluxbudget_VVEL(ds,mask,varn,kza=0,kzo=None,S0=34.8,t=0): """Integrate horizontal flux using VVEL*SCALAR""" _warn_virtual_salt_flux_units() dsvar = ds.variables dxu = dsvar['DXU'][:] * 1e-2 dyu = dsvar['DYU'][:] * 1e-2 dz = dsvar['dz'][:] * 1e-2 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in xrange(kza,kzo): uflux = _fill0(dsvar['UVEL'][t,k]) * 1e-2 uflux *= dyu uflux *= dz[k] vflux = _fill0(dsvar['VVEL'][t,k]) * 1e-2 vflux *= dxu vflux *= dz[k] if not varn: scalar = None elif varn == 'heat': scalar = _fill0(dsvar['TEMP'][t,k]) elif varn == 'salt': scalar = _fill0(dsvar['SALT'][t,k]) elif varn == 'freshwater': scalar = (S0 - _fill0(dsvar['SALT'][t,k])) / S0 fluxbudget += budget_over_region_2D(uflux,vflux,scalar=scalar,mask=mask,grid='ArakawaB') if varn == 'heat': fluxbudget *= (1e3 * 4e3 * 1e-15) # PW return fluxbudget
def fluxbudget_bolus_visop(ds,mask,varn,kza=0,kzo=None,S0=34.8,t=0): """Compute flux of `varn` into region `mask` due to eddy (bolus) velocity""" _warn_virtual_salt_flux_units() dsvar = ds.variables dxt = dsvar['DXT'][:] * 1e-2 dyt = dsvar['DYT'][:] * 1e-2 dz = dsvar['dz'][:] * 1e-2 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in range(kza,kzo): # get bolus velocity uflux = _fill0(dsvar['UISOP'][t,k]) * 1e-2 # m s-1 vflux = _fill0(dsvar['VISOP'][t,k]) * 1e-2 # m s-1 # get scalar data if varn == 'heat': scalar = _fill0(dsvar['TEMP'][t,k]) elif varn == 'salt': scalar = _fill0(dsvar['SALT'][t,k]) elif varn == 'freshwater': scalar = (S0 - _fill0(dsvar['SALT'][t,k])) / S0 # multiply flux by scalar uflux *= scalar vflux *= scalar # multiply by horizontal grid spacing uflux *= dyt vflux *= dxt # multiply by vertical grid spacing uflux *= dz[k] vflux *= dz[k] # compute budget fluxbudget += budget_over_region_2D(uflux,vflux,scalar=None,mask=mask) if varn == 'heat': fluxbudget *= (1e3 * 4e3 * 1e-15) # PW return fluxbudget
def fluxbudget_VVEL(ds,mask,varn,kza=0,kzo=None,S0=34.8,t=0): """Integrate horizontal flux using VVEL*SCALAR""" _warn_virtual_salt_flux_units() dsvar = ds.variables dxu = dsvar['DXU'][:] * 1e-2 dyu = dsvar['DYU'][:] * 1e-2 dz = dsvar['dz'][:] * 1e-2 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in range(kza,kzo): uflux = _fill0(dsvar['UVEL'][t,k]) * 1e-2 uflux *= dyu uflux *= dz[k] vflux = _fill0(dsvar['VVEL'][t,k]) * 1e-2 vflux *= dxu vflux *= dz[k] if not varn: scalar = None elif varn == 'heat': scalar = _fill0(dsvar['TEMP'][t,k]) elif varn == 'salt': scalar = _fill0(dsvar['SALT'][t,k]) elif varn == 'freshwater': scalar = (S0 - _fill0(dsvar['SALT'][t,k])) / S0 fluxbudget += budget_over_region_2D(uflux,vflux,scalar=scalar,mask=mask,grid='ArakawaB') if varn == 'heat': fluxbudget *= (1e3 * 4e3 * 1e-15) # PW return fluxbudget
def fluxbudget_UESVNS(ds,mask,varn='salt',kza=0,kzo=None,t=0): """Integrate horizontal flux using UES and VNS variables""" _warn_virtual_salt_flux_units() dsvar = ds.variables dz = dsvar['dz'][:] * 1e-2 tarea = dsvar['UAREA'][:] * 1e-4 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in xrange(kza,kzo): uflux = _fill0(dsvar['UES'][t,k]) uflux *= tarea uflux *= dz[k] vflux = _fill0(dsvar['VNS'][t,k]) vflux *= tarea vflux *= dz[k] fluxbudget += budget_over_region_2D(uflux,vflux,scalar=None,mask=mask) return fluxbudget
def fluxbudget_UESVNS(ds,mask,varn='salt',kza=0,kzo=None,t=0): """Integrate horizontal flux using UES and VNS variables""" _warn_virtual_salt_flux_units() dsvar = ds.variables dz = dsvar['dz'][:] * 1e-2 tarea = dsvar['UAREA'][:] * 1e-4 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in range(kza,kzo): uflux = _fill0(dsvar['UES'][t,k]) uflux *= tarea uflux *= dz[k] vflux = _fill0(dsvar['VNS'][t,k]) vflux *= tarea vflux *= dz[k] fluxbudget += budget_over_region_2D(uflux,vflux,scalar=None,mask=mask) return fluxbudget
def fluxbudget_diffusion(ds,mask,varn,kza=0,kzo=None,S0=34.8,t=0): """Compute flux of `varn` into region `mask` due to diffusion""" _warn_virtual_salt_flux_units() dsvar = ds.variables dxt = dsvar['DXT'][:] * 1e-2 dyt = dsvar['DYT'][:] * 1e-2 dz = dsvar['dz'][:] * 1e-2 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in xrange(kza,kzo): # get scalar data if varn == 'heat': scalar = _fill0(dsvar['TEMP'][t,k]) elif varn == 'salt': scalar = _fill0(dsvar['SALT'][t,k]) elif varn == 'freshwater': scalar = (S0 - _fill0(dsvar['SALT'][t,k])) / S0 # get gradient uflux = central_differences(scalar,dxt,axis=1) # [scalar] m-1 vflux = central_differences(scalar,dyt,axis=0) # [scalar] m-1 # multiply gradient by diffusion coefficient kappa = _fill0(dsvar['KAPPA_ISOP'][t,k] * 1e-4) # m2 s-1 uflux *= kappa vflux *= kappa # multiply by horizontal grid spacing uflux *= dyt vflux *= dxt # multiply by vertical grid spacing uflux *= dz[k] vflux *= dz[k] # compute budget fluxbudget += budget_over_region_2D(uflux,vflux,scalar=None,mask=mask) # convert to right units if varn == 'heat': fluxbudget *= (1e3 * 4e3 * 1e-15) # PW return fluxbudget
def fluxbudget_diffusion(ds,mask,varn,kza=0,kzo=None,S0=34.8,t=0): """Compute flux of `varn` into region `mask` due to diffusion""" _warn_virtual_salt_flux_units() dsvar = ds.variables dxt = dsvar['DXT'][:] * 1e-2 dyt = dsvar['DYT'][:] * 1e-2 dz = dsvar['dz'][:] * 1e-2 if kzo is None: kzo = len(dz) fluxbudget = 0. for k in range(kza,kzo): # get scalar data if varn == 'heat': scalar = _fill0(dsvar['TEMP'][t,k]) elif varn == 'salt': scalar = _fill0(dsvar['SALT'][t,k]) elif varn == 'freshwater': scalar = (S0 - _fill0(dsvar['SALT'][t,k])) / S0 # get gradient uflux = central_differences(scalar,dxt,axis=1) # [scalar] m-1 vflux = central_differences(scalar,dyt,axis=0) # [scalar] m-1 # multiply gradient by diffusion coefficient kappa = _fill0(dsvar['KAPPA_ISOP'][t,k] * 1e-4) # m2 s-1 uflux *= kappa vflux *= kappa # multiply by horizontal grid spacing uflux *= dyt vflux *= dxt # multiply by vertical grid spacing uflux *= dz[k] vflux *= dz[k] # compute budget fluxbudget += budget_over_region_2D(uflux,vflux,scalar=None,mask=mask) # convert to right units if varn == 'heat': fluxbudget *= (1e3 * 4e3 * 1e-15) # PW return fluxbudget