def sspeed(depth: Union[np.ndarray, xr.Variable], latitude: np.ndarray, temperature: np.ndarray, salinity: np.ndarray) -> np.ndarray: """ Calculates the speed of sound. Required Arguments: * depth: The depth(s) in meters * latitude: The latitude(s) in degrees North * temperature: The temperatures(s) in Celsius * salinity: The salinity (unitless) """ depth, latitude, temperature, salinity = __validate_depth_lat_temp_sal( depth, latitude, temperature, salinity) press = __calc_pressure(depth, latitude) if salinity.shape != press.shape: # pad array shape to match otherwise seawater freaks out press = press[..., np.newaxis] speed = seawater.svel(salinity, temperature, press) return np.squeeze(speed)
def build_data(ping_xyt_template, ds_strong, xyt0, rx_xy): matrix = ds_strong.matrix.values temps = ds_strong.temp.values tx_beacon = np.zeros(matrix.shape[0], np.int32) for p, tag in enumerate(ds_strong.tag.values): tx_beacon[p] = 1 + np.nonzero(ds_strong.rx_beacon.values == tag)[0][0] data = dict( Np=matrix.shape[0], Nb=matrix.shape[1], rx_t=(matrix - xyt0[2]) * time_scale, rx_c=seawater.svel(0, ds_strong['temp'], 0) / time_scale, rx_x=rx_xy[:, 0] - xyt0[0], rx_y=rx_xy[:, 1] - xyt0[1], tx_x=ping_xyt_template[:, 0] - xyt0[0], tx_y=ping_xyt_template[:, 1] - xyt0[1], # tx_t=ping_xyt_template[:,2]-xyt0[2], tx_beacon=tx_beacon, sigma_t=0.0005 * time_scale, # 0.5ms timing precision ) # explicitly pass in the indexing for matrix to linear Nb = data['Nb'] dist_k = np.zeros((Nb, Nb), np.int32) for ai in range(Nb): for bi in range(ai + 1, Nb): a = ai + 1 b = bi + 1 k = (Nb * (Nb - 1) / 2) - (Nb - a + 1) * (Nb - a) / 2 + b - a dist_k[ai, bi] = dist_k[bi, ai] = k data['dist_k'] = dist_k data['Ndist'] = (Nb * (Nb - 1)) // 2 return data
def load_data(self): super(SoundSpeedPlotter, self).load_data() self.pressure = [ seawater.pres(self.temperature_depths[idx], ll[0]) for idx, ll in enumerate(self.points) ] ureg = pint.UnitRegistry() try: u = ureg.parse_units(self.variable_units[0].lower()) except: u = ureg.dimensionless if u == ureg.boltzmann_constant: u = ureg.kelvin if u == ureg.kelvin: unit = "Celsius" temperature_c = ureg.Quantity(self.temperature, u).to(ureg.celsius).magnitude else: temperature_c = self.temperature self.sspeed = seawater.svel(self.salinity, temperature_c, self.pressure)
def sspeed( depth: Union[np.ndarray, xr.Variable], latitude: np.ndarray, temperature: np.ndarray, salinity: np.ndarray, ) -> np.ndarray: """ Calculates the speed of sound. Required Arguments: * depth: The depth(s) in meters * latitude: The latitude(s) in degrees North * temperature: The temperatures(s) in Celsius * salinity: The salinity (unitless) """ depth, latitude, temperature, salinity = __validate_depth_lat_temp_sal( depth, latitude, temperature, salinity) press = __calc_pressure(depth, latitude) if salinity.shape != press.shape: # Need to pad press so it can broadcast against temperature and salinity. # eg. if using GIOPS and salinity has shape (3, 50, 3, 12) then press has # shape (50, 3). This logic pads press to give shape (1, 50, 3, 1). for ax, val in enumerate(salinity.shape): if ax > press.ndim - 1 or press.shape[ax] != val: press = np.expand_dims(press, axis=ax) speed = seawater.svel(salinity, temperature, press) return np.squeeze(speed)
def load_data(self): super(SoundSpeedPlotter, self).load_data() self.pressure = [seawater.pres(self.temperature_depths[idx], ll[0]) for idx, ll in enumerate(self.points)] self.sspeed = seawater.svel( self.salinity, self.temperature, self.pressure )
def load_data(self): super(SoundSpeedPlotter, self).load_data() self.pressure = [ seawater.pres(self.temperature_depths[idx], ll[0]) for idx, ll in enumerate(self.points) ] self.sspeed = seawater.svel(self.salinity, self.temperature, self.pressure)
def sspeed(depth, latitude, temperature, salinity): """ Calculates the speed of sound. Parameters: depth: The depth(s) in meters latitude: The latitude(s) in degrees North temperature: The temperatures(s) in Celsius salinity: The salinity (unitless) """ try: press = [seawater.pres(d, latitude) for d in depth] except TypeError: press = seawater.pres(depth, latitude) speed = seawater.svel(salinity, temperature, press) return np.array(speed)
def gen_dim(self, dim_name): """ Desc: Auto-generates and stores other dimensions if they can be calculated from other stored dimensions ie:// density(S,T,P) """ if dim_name is 'pressure': z = self.get_dim('z') p = sw.eos80.pres(z, self.lat) self.add_dim('pressure', p) elif dim_name is 'density': s = self.get_dim('salinity') t = self.get_dim('temperature') p = self.get_dim('pressure') d = sw.eos80.dens(s, t, p) self.add_dim('density', d) elif dim_name is 'bfrq': s = self.get_dim('salinity') t = self.get_dim('temperature') p = self.get_dim('pressure') strat = sw.geostrophic.bfrq(s, t, p, lat=self.lat) self.add_dim('bfrq', np.hstack(strat[0])) # Brunt Vaisala Frequency self.add_dim('ppv', np.hstack(strat[1])) # Planetary Potential Vorticity self.add_dim('pmp', np.hstack(strat[2])) # Midpoint pressure elif dim_name is 'svel': s = self.get_dim('salinity') t = self.get_dim('temperature') p = self.get_dim('pressure') svel = sw.svel(s, t, p) self.add_dim('svel', svel) else: print("Cannot be generated from stored information") return None
#%% var_name = 'Temperature' depthg_gridded, tempg_gridded, timegg = \ grid_glider_data_thredd(timeg,latg,long,depthg,tempg,var_name,inst_id) #%% var_name = 'Salinity' depthg_gridded, saltg_gridded, timegg = \ grid_glider_data_thredd(timeg,latg,long,depthg,saltg,var_name,inst_id) #%% Calculate sound velocity glider svelg = sw.svel(saltg,tempg,pressg) var_name = 'Sound Velocity' depthg_gridded, svelg_gridded, timegg = \ grid_glider_data_thredd(timeg,latg,long,depthg,svelg,var_name,inst_id,\ contour_plot='no') #%% Calculate sound velocity GOFS 3.1 svel31 = sw.svel(salt31,temp31,np.tile(depth31,(len(timestamp31),1)).T) #%% Fig temperatuer glider var_name = 'Temperature' fig, ax=plt.subplots(figsize=(10, 3), facecolor='w', edgecolor='w')
#Mapping Sound Profile onto IW Field try: T = mprof['T'] S = mprof['S'] except KeyError: print("No scalars to map") exit(0) #Compute interpolation and potential derivative of T&S tprof = interp.UnivariateSpline(mprof['depth'], mprof['T']) adtg = interp.UnivariateSpline(mprof['depth'], sw.adtg(mprof['S'], mprof['T'], mprof['depth'])) sprof = interp.UnivariateSpline(mprof['depth'], mprof['S']) sg = sprof.derivative() cprof = interp.UnivariateSpline( mprof['depth'], sw.svel(mprof['S'], mprof['T'], mprof['depth'])) #Maps displacment to anomaly mat = functools.partial(map_anom, mean=tprof, grad=adtg) mas = functools.partial(map_anom, mean=sprof, grad=sg) mac = functools.partial(map_svel, func=sw.svel) maca = functools.partial(map_svel_anom, func=cprof) map_scalars(p['path'], 'T', mat) map_scalars(p['path'], 'S', mas) map_scalars(p['path'], 'c', mac) map_scalars(p['path'], 'ca', maca)
def test(fileout='python-test.txt'): r"""Copy of the Matlab test. Modifications: Phil Morgan 03-12-12. Lindsay Pender, Converted to ITS-90. """ f = open(fileout, 'w') asterisks = '*' * 76 f.write(asterisks) f.write('\n TEST REPORT ') f.write('\n') f.write('\n SEA WATER LIBRARY %s' % sw.__version__) f.write('\n') # Show some info about this Python. f.write('\npython version: %s' % sys.version) f.write('\n on %s computer %s' % (uname()[0], uname()[-1])) f.write('\n') f.write('\n') f.write(asctime(localtime())) f.write('\n') f.write('\n') # Test main module ptmp. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: ptmp') f.write('\n** and SUB-MODULE: adtg') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') # Test 1 - data from Unesco 1983 p45. T = np.array([[0, 0, 0, 0, 0, 0], [10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40]]) T = T / 1.00024 S = np.array([[25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35]]) P = np.array([[0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000]]) Pr = np.array([0, 0, 0, 0, 0, 0]) UN_ptmp = np.array([[0, -0.3061, -0.9667, 0, -0.3856, -1.0974], [10, 9.3531, 8.4684, 10, 9.2906, 8.3643], [20, 19.0438, 17.9426, 20, 18.9985, 17.8654], [30, 28.7512, 27.4353, 30, 28.7231, 27.3851], [40, 38.4607, 36.9254, 40, 38.4498, 36.9023]]) PT = sw.ptmp(S, T, P, Pr) * 1.00024 # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p45)') f.write('\n%s' % asterisks) f.write('\n') m, n = S.shape # TODO: so many loops there must be a better way. for icol in range(0, n): f.write('\n Sal Temp Press PTMP ptmp') f.write('\n (psu) (C) (db) (C) (C)\n') result = np.vstack( (S[:, icol], T[:, icol], P[:, icol], UN_ptmp[:, icol], PT[:, icol])) for iline in range(0, m): f.write(" %4.0f %4.0f %5.0f %8.4f %11.5f\n" % tuple(result[:, iline])) # Test main module svan. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: svan') f.write('\n** and SUB-MODULE: dens dens0 smow seck pden ptmp') f.write('\n%s' % asterisks) # Test data FROM: Unesco Tech. Paper in Marine Sci. No. 44, p22. s = np.array([0, 0, 0, 0, 35, 35, 35, 35]) p = np.array([0, 10000, 0, 10000, 0, 10000, 0, 10000]) t = np.array([0, 0, 30, 30, 0, 0, 30, 30]) / 1.00024 UN_svan = np.array( [2749.54, 2288.61, 3170.58, 3147.85, 0.0, 0.00, 607.14, 916.34]) SVAN = sw.svan(s, t, p) # DISPLAY RESULTS f.write('\n') f.write('\n%s' % asterisks) f.write('\n') f.write('\nComparison of accepted values from UNESCO 1983') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p22)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n Sal Temp Press SVAN svan') f.write('\n (psu) (C) (db) (1e-8*m3/kg) (1e-8*m3/kg)\n') result = np.vstack([s, t, p, UN_svan, 1e+8 * SVAN]) for iline in range(0, len(SVAN)): f.write(" %4.0f %4.0f %5.0f %11.2f %11.3f\n" % tuple(result[:, iline])) # Test main module salt. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: salt') f.write('\n** and SUB-MODULE: salrt salrp sals') f.write('\n%s' % asterisks) f.write('\n') # Test 1 - data from Unesco 1983 p9. R = np.array([1, 1.2, 0.65]) # cndr = R. T = np.array([15, 20, 5]) / 1.00024 P = np.array([0, 2000, 1500]) #Rt = np.array([ 1, 1.0568875, 0.81705885]) UN_S = np.array([35, 37.245628, 27.995347]) S = sw.salt(R, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n(Unesco Tech. Paper in Marine Sci. No. 44, p9)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n Temp Press R S salt') f.write('\n (C) (db) (no units) (psu) (psu)\n') table = np.vstack([T, P, R, UN_S, S]) m, n = table.shape for iline in range(0, n): f.write(" %4.0f %4.0f %8.2f %11.6f %14.7f\n" % tuple(table[:, iline])) # Test main module cndr. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: cndr') f.write('\n** and SUB-MODULE: salds') f.write('\n%s' % asterisks) # Test 1 - data from Unesco 1983 p9. T = np.array([0, 10, 0, 10, 10, 30]) / 1.00024 P = np.array([0, 0, 1000, 1000, 0, 0]) S = np.array([25, 25, 25, 25, 40, 40]) UN_R = np.array( [0.498088, 0.654990, 0.506244, 0.662975, 1.000073, 1.529967]) R = sw.cndr(S, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p14)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') f.write('\n Temp Press S cndr cndr') f.write('\n (C) (db) (psu) (no units) (no units)\n') table = np.vstack([T, P, S, UN_R, R]) m, n = table.shape for iline in range(0, n): f.write(" %4.0f %4.0f %8.6f %11.6f %14.8f\n" % tuple(table[:, iline])) # Test main module depth. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: depth') f.write('\n%s' % asterisks) # Test data - matrix "pressure", vector "lat" Unesco 1983 data p30. lat = np.array([0, 30, 45, 90]) P = np.array([[500, 500, 500, 500], [5000, 5000, 5000, 5000], [10000, 10000, 10000, 10000]]) UN_dpth = np.array([[496.65, 496.00, 495.34, 494.03], [4915.04, 4908.56, 4902.08, 4889.13], [9725.47, 9712.65, 9699.84, 9674.23]]) dpth = sw.dpth(P, lat) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from Unesco 1983 ') f.write('\n(Unesco Tech. Paper in Marine Sci. No. 44, p28)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') for irow in range(0, 3): f.write('\n Lat Press DPTH dpth') f.write('\n (degree) (db) (meter) (meter)\n') table = np.vstack([lat, P[irow, :], UN_dpth[irow, :], dpth[irow, :]]) m, n = table.shape for iline in range(0, n): f.write(" %6.3f %6.0f %8.2f %8.3f\n" % tuple(table[:, iline])) # Test main module fp. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: fp') f.write('\n%s' % asterisks) # Test 1 - UNESCO data p.30. S = np.array([[5, 10, 15, 20, 25, 30, 35, 40], [5, 10, 15, 20, 25, 30, 35, 40]]) P = np.array([[0, 0, 0, 0, 0, 0, 0, 0], [500, 500, 500, 500, 500, 500, 500, 500]]) UN_fp = np.array( [[-0.274, -0.542, -0.812, -1.083, -1.358, -1.638, -1.922, -2.212], [-0.650, -0.919, -1.188, -1.460, -1.735, -2.014, -2.299, -2.589]]) FP = sw.fp(S, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p30)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') for irow in range(0, 2): f.write('\n Sal Press fp fp') f.write('\n (psu) (db) (C) (C)\n') table = np.vstack( [S[irow, :], P[irow, :], UN_fp[irow, :], FP[irow, :]]) m, n = table.shape for iline in range(0, n): f.write(" %4.0f %5.0f %8.3f %11.4f\n" % tuple(table[:, iline])) # Test main module cp. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: cp') f.write('\n%s' % asterisks) # Test 1. # Data from Pond and Pickard Intro. Dynamical Oceanography 2nd ed. 1986 T = np.array([[0, 0, 0, 0, 0, 0], [10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40]]) / 1.00024 S = np.array([[25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35]]) P = np.array([[0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000]]) UN_cp = np.array([[4048.4, 3896.3, 3807.7, 3986.5, 3849.3, 3769.1], [4041.8, 3919.6, 3842.3, 3986.3, 3874.7, 3804.4], [4044.8, 3938.6, 3866.7, 3993.9, 3895.0, 3828.3], [4049.1, 3952.0, 3883.0, 4000.7, 3909.2, 3844.3], [4051.2, 3966.1, 3905.9, 4003.5, 3923.9, 3868.3]]) CP = sw.cp(S, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p37)') f.write('\n%s' % asterisks) f.write('\n') m, n = S.shape f.write('\n') for icol in range(0, n): f.write('\n Sal Temp Press Cp cp') f.write('\n (psu) (C) (db) (J/kg.C) (J/kg.C)\n') result = np.vstack( [S[:, icol], T[:, icol], P[:, icol], UN_cp[:, icol], CP[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %5.0f %8.1f %11.2f\n" % tuple(result[:, iline])) # Test main module svel. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: svel') f.write('\n%s' % asterisks) # Test 1. # Data from Pond and Pickard Intro. Dynamical Oceanography 2nd ed. 1986 T = np.array([[0, 0, 0, 0, 0, 0], [10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40]]) / 1.00024 S = np.array([[25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35]]) P = np.array([[0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000]]) UN_svel = np.array([[1435.8, 1520.4, 1610.4, 1449.1, 1534.0, 1623.2], [1477.7, 1561.3, 1647.4, 1489.8, 1573.4, 1659.0], [1510.3, 1593.6, 1676.8, 1521.5, 1604.5, 1687.2], [1535.2, 1619.0, 1700.6, 1545.6, 1629.0, 1710.1], [1553.4, 1638.0, 1719.2, 1563.2, 1647.3, 1727.8]]) SVEL = sw.svel(S, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p50)') f.write('\n%s' % asterisks) f.write('\n') m, n = SVEL.shape f.write('\n') for icol in range(0, n): f.write('\n Sal Temp Press SVEL svel') f.write('\n (psu) (C) (db) (m/s) (m/s)\n') result = np.vstack([ S[:, icol], T[:, icol], P[:, icol], UN_svel[:, icol], SVEL[:, icol] ]) for iline in range(0, m): f.write(" %4.0f %4.0f %5.0f %8.1f %11.3f\n" % tuple(result[:, iline])) # Test submodules alpha beta aonb. f.write('\n%s' % asterisks) f.write('\n** and SUB-MODULE: alpha beta aonb') f.write('\n%s' % asterisks) # Data from McDouogall 1987. s = 40 PT = 10 p = 4000 beta_lit = 0.72088e-03 aonb_lit = 0.34763 alpha_lit = aonb_lit * beta_lit BETA = sw.beta(s, PT, p, pt=True) ALPHA = sw.alpha(s, PT, p, pt=True) AONB = sw.aonb(s, PT, p, pt=True) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from MCDOUGALL 1987 ') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') f.write('\n Sal Temp Press BETA beta') f.write('\n (psu) (C) (db) (psu^-1) (psu^-1)\n') table = np.hstack([s, PT, p, beta_lit, BETA]) f.write(" %4.0f %4.0f %5.0f %11.4e %11.5e\n" % tuple(table)) f.write('\n Sal Temp Press AONB aonb') f.write('\n (psu) (C) (db) (psu C^-1) (psu C^-1)\n') table = np.hstack([s, PT, p, aonb_lit, AONB]) f.write(" %4.0f %4.0f %5.0f %8.5f %11.6f\n" % tuple(table)) f.write('\n Sal Temp Press ALPHA alpha') f.write('\n (psu) (C) (db) (psu^-1) (psu^-1)\n') table = np.hstack([s, PT, p, alpha_lit, ALPHA]) f.write(" %4.0f %4.0f %5.0f %11.4e %11.4e\n" % tuple(table)) # Test main moduleS satO2 satN2 satAr. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: satO2 satN2 satAr') f.write('\n%s' % asterisks) f.write('\n') # Data from Weiss 1970. T = np.array([[-1, -1], [10, 10], [20, 20], [40, 40]]) / 1.00024 S = np.array([[20, 40], [20, 40], [20, 40], [20, 40]]) lit_O2 = np.array([[9.162, 7.984], [6.950, 6.121], [5.644, 5.015], [4.050, 3.656]]) lit_N2 = np.array([[16.28, 14.01], [12.64, 11.01], [10.47, 9.21], [7.78, 6.95]]) lit_Ar = np.array([[0.4456, 0.3877], [0.3397, 0.2989], [0.2766, 0.2457], [0.1986, 0.1794]]) O2 = sw.satO2(S, T) N2 = sw.satN2(S, T) Ar = sw.satAr(S, T) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from Weiss, R.F. 1979 ') f.write('\n"The solubility of nitrogen, oxygen and argon in water') f.write('\n and seawater." Deep-Sea Research., 1970, Vol 17, pp721-735.') f.write('\n%s' % asterisks) f.write('\n') m, n = S.shape f.write('\n') for icol in range(0, n): f.write('\n Sal Temp O2 satO2') f.write('\n (psu) (C) (ml/l) (ml/l)\n') result = np.vstack( [S[:, icol], T[:, icol], lit_O2[:, icol], O2[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %8.2f %9.3f\n" % tuple(result[:, iline])) for icol in range(0, n): f.write('\n Sal Temp N2 satN2') f.write('\n (psu) (C) (ml/l) (ml/l)\n') result = np.vstack( [S[:, icol], T[:, icol], lit_N2[:, icol], N2[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %8.2f %9.3f\n" % tuple(result[:, iline])) for icol in range(0, n): f.write('\n Sal Temp Ar satAr') f.write('\n (psu) (C) (ml/l) (ml/l)\n') result = np.vstack( [S[:, icol], T[:, icol], lit_Ar[:, icol], Ar[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %8.4f %9.4f\n" % tuple(result[:, iline]))
def effective_clock_offset(rxs, ds_tot): ds = ds_tot.sel(rx=rxs) # weird. sometimes adds an extra array(..,dtype=object) layer ds['rx_beacon'] = ('rx', ), [ ds_tot.rx_beacon.sel(rx=rx).item() for rx in rxs ] beacon_to_xy = dict([(ds.rx_beacon.values[i], (ds.rx_x.values[i], ds.rx_y.values[i])) for i in range(ds.dims['rx'])]) # both beacons heard it is_multirx = (np.isfinite(ds.matrix).sum(axis=1) > 1).values # it came from one of them. is_selfaware = np.zeros_like(is_multirx) for i, tag in enumerate(ds.tag.values): if tag not in beacon_to_xy: continue else: # And did the rx see itself? local_rx = np.nonzero(ds.rx_beacon.values == tag)[0] if local_rx.size and np.isfinite(ds.matrix.values[i, local_rx[0]]): is_selfaware[i] = True sel_pings = is_multirx & is_selfaware ds_strong = ds.isel(index=sel_pings) matrix = ds_strong.matrix.values rx_xy = np.c_[ds_strong.rx_x.values, ds_strong.rx_y.values] temps = ds_strong.temp.values tx_beacon = np.zeros(matrix.shape[0], np.int32) for p, tag in enumerate(ds_strong.tag.values): tx_beacon[p] = np.nonzero(ds_strong.rx_beacon.values == tag)[0][0] rx_c = seawater.svel(0, ds_strong['temp'], 0) / time_scale # occasional missing data... rx_c = utils.fill_invalid(rx_c, axis=1) # do the calculation manually for two rxs: ab_mask = (tx_beacon == 0) ba_mask = (tx_beacon == 1) assert np.all(ab_mask | ba_mask) # somebody has to hear it # how much 'later' b saw it than a t = matrix[:, 0] # take rx 0 as the reference # without rx_c, transit time varies from 0.051970 to 0.051945 # for a variation of 0.48ppt # with rx_c, transit time distance varies 0.07721 to 0.07710 # for a variation of 1.4ppt, and it introduces some step changes. # so for this application it's better to have the smaller variation # that also changes smoothly, rather than correct back to a precise # distance deltas = (matrix[:, 1] - matrix[:, 0]) # * rx_c.mean(axis=1) # partial time series dt_ab = deltas[ab_mask] dt_ba = deltas[ba_mask] dt_ab_dense = np.interp(t, t[ab_mask], deltas[ab_mask]) dt_ba_dense = np.interp(t, t[ba_mask], deltas[ba_mask]) # proxy for the uncertainty. Not scaled! dt_ab_dense_std = np.abs(t - utils.nearest_val(t[ab_mask], t)) dt_ba_dense_std = np.abs(t - utils.nearest_val(t[ba_mask], t)) dt_offset = 0.5 * (dt_ab_dense + dt_ba_dense ) # sum of clock offset and travel asymmetry dt_transit = 0.5 * (dt_ab_dense - dt_ba_dense) # transit time dt_std = dt_ab_dense_std + dt_ba_dense_std ds = xr.Dataset() ds['time'] = ('time', ), t ds['offset'] = ('time', ), dt_offset ds['transit'] = ('time', ), dt_transit ds['error'] = ('time', ), dt_std ds['c'] = ('time', ), rx_c.mean(axis=1) ds['rx'] = ('rx', ), rxs return ds
def test(fileout='python-test.txt'): r"""Copy of the Matlab test. Modifications: Phil Morgan 03-12-12. Lindsay Pender, Converted to ITS-90. """ f = open(fileout, 'w') asterisks = '*' * 76 f.write(asterisks) f.write('\n TEST REPORT ') f.write('\n') f.write('\n SEA WATER LIBRARY %s' % sw.__version__) f.write('\n') # Show some info about this Python. f.write('\npython version: %s' % sys.version) f.write('\n on %s computer %s' % (uname()[0], uname()[-1])) f.write('\n') f.write('\n') f.write(asctime(localtime())) f.write('\n') f.write('\n') # Test main module ptmp. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: ptmp') f.write('\n** and SUB-MODULE: adtg') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') # Test 1 - data from Unesco 1983 p45. T = np.array([[0, 0, 0, 0, 0, 0], [10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40]]) T = T / 1.00024 S = np.array([[25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35]]) P = np.array([[0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000]]) Pr = np.array([0, 0, 0, 0, 0, 0]) UN_ptmp = np.array([[0, -0.3061, -0.9667, 0, -0.3856, -1.0974], [10, 9.3531, 8.4684, 10, 9.2906, 8.3643], [20, 19.0438, 17.9426, 20, 18.9985, 17.8654], [30, 28.7512, 27.4353, 30, 28.7231, 27.3851], [40, 38.4607, 36.9254, 40, 38.4498, 36.9023]]) PT = sw.ptmp(S, T, P, Pr) * 1.00024 # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p45)') f.write('\n%s' % asterisks) f.write('\n') m, n = S.shape # TODO: so many loops there must be a better way. for icol in range(0, n): f.write('\n Sal Temp Press PTMP ptmp') f.write('\n (psu) (C) (db) (C) (C)\n') result = np.vstack((S[:, icol], T[:, icol], P[:, icol], UN_ptmp[:, icol], PT[:, icol])) for iline in range(0, m): f.write(" %4.0f %4.0f %5.0f %8.4f %11.5f\n" % tuple(result[:, iline])) # Test main module svan. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: svan') f.write('\n** and SUB-MODULE: dens dens0 smow seck pden ptmp') f.write('\n%s' % asterisks) # Test data FROM: Unesco Tech. Paper in Marine Sci. No. 44, p22. s = np.array([0, 0, 0, 0, 35, 35, 35, 35]) p = np.array([0, 10000, 0, 10000, 0, 10000, 0, 10000]) t = np.array([0, 0, 30, 30, 0, 0, 30, 30]) / 1.00024 UN_svan = np.array([2749.54, 2288.61, 3170.58, 3147.85, 0.0, 0.00, 607.14, 916.34]) SVAN = sw.svan(s, t, p) # DISPLAY RESULTS f.write('\n') f.write('\n%s' % asterisks) f.write('\n') f.write('\nComparison of accepted values from UNESCO 1983') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p22)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n Sal Temp Press SVAN svan') f.write('\n (psu) (C) (db) (1e-8*m3/kg) (1e-8*m3/kg)\n') result = np.vstack([s, t, p, UN_svan, 1e+8 * SVAN]) for iline in range(0, len(SVAN)): f.write(" %4.0f %4.0f %5.0f %11.2f %11.3f\n" % tuple(result[:, iline])) # Test main module salt. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: salt') f.write('\n** and SUB-MODULE: salrt salrp sals') f.write('\n%s' % asterisks) f.write('\n') # Test 1 - data from Unesco 1983 p9. R = np.array([1, 1.2, 0.65]) # cndr = R. T = np.array([15, 20, 5]) / 1.00024 P = np.array([0, 2000, 1500]) #Rt = np.array([ 1, 1.0568875, 0.81705885]) UN_S = np.array([35, 37.245628, 27.995347]) S = sw.salt(R, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n(Unesco Tech. Paper in Marine Sci. No. 44, p9)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n Temp Press R S salt') f.write('\n (C) (db) (no units) (psu) (psu)\n') table = np.vstack([T, P, R, UN_S, S]) m, n = table.shape for iline in range(0, n): f.write(" %4.0f %4.0f %8.2f %11.6f %14.7f\n" % tuple(table[:, iline])) # Test main module cndr. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: cndr') f.write('\n** and SUB-MODULE: salds') f.write('\n%s' % asterisks) # Test 1 - data from Unesco 1983 p9. T = np.array([0, 10, 0, 10, 10, 30]) / 1.00024 P = np.array([0, 0, 1000, 1000, 0, 0]) S = np.array([25, 25, 25, 25, 40, 40]) UN_R = np.array([0.498088, 0.654990, 0.506244, 0.662975, 1.000073, 1.529967]) R = sw.cndr(S, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p14)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') f.write('\n Temp Press S cndr cndr') f.write('\n (C) (db) (psu) (no units) (no units)\n') table = np.vstack([T, P, S, UN_R, R]) m, n = table.shape for iline in range(0, n): f.write(" %4.0f %4.0f %8.6f %11.6f %14.8f\n" % tuple(table[:, iline])) # Test main module depth. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: depth') f.write('\n%s' % asterisks) # Test data - matrix "pressure", vector "lat" Unesco 1983 data p30. lat = np.array([0, 30, 45, 90]) P = np.array([[500, 500, 500, 500], [5000, 5000, 5000, 5000], [10000, 10000, 10000, 10000]]) UN_dpth = np.array([[496.65, 496.00, 495.34, 494.03], [4915.04, 4908.56, 4902.08, 4889.13], [9725.47, 9712.65, 9699.84, 9674.23]]) dpth = sw.dpth(P, lat) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from Unesco 1983 ') f.write('\n(Unesco Tech. Paper in Marine Sci. No. 44, p28)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') for irow in range(0, 3): f.write('\n Lat Press DPTH dpth') f.write('\n (degree) (db) (meter) (meter)\n') table = np.vstack([lat, P[irow, :], UN_dpth[irow, :], dpth[irow, :]]) m, n = table.shape for iline in range(0, n): f.write(" %6.3f %6.0f %8.2f %8.3f\n" % tuple(table[:, iline])) # Test main module fp. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: fp') f.write('\n%s' % asterisks) # Test 1 - UNESCO data p.30. S = np.array([[5, 10, 15, 20, 25, 30, 35, 40], [5, 10, 15, 20, 25, 30, 35, 40]]) P = np.array([[0, 0, 0, 0, 0, 0, 0, 0], [500, 500, 500, 500, 500, 500, 500, 500]]) UN_fp = np.array([[-0.274, -0.542, -0.812, -1.083, -1.358, -1.638, -1.922, -2.212], [-0.650, -0.919, -1.188, -1.460, -1.735, -2.014, -2.299, -2.589]]) FP = sw.fp(S, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p30)') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') for irow in range(0, 2): f.write('\n Sal Press fp fp') f.write('\n (psu) (db) (C) (C)\n') table = np.vstack([S[irow, :], P[irow, :], UN_fp[irow, :], FP[irow, :]]) m, n = table.shape for iline in range(0, n): f.write(" %4.0f %5.0f %8.3f %11.4f\n" % tuple(table[:, iline])) # Test main module cp. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: cp') f.write('\n%s' % asterisks) # Test 1. # Data from Pond and Pickard Intro. Dynamical Oceanography 2nd ed. 1986 T = np.array([[0, 0, 0, 0, 0, 0], [10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40]]) / 1.00024 S = np.array([[25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35]]) P = np.array([[0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000]]) UN_cp = np.array([[4048.4, 3896.3, 3807.7, 3986.5, 3849.3, 3769.1], [4041.8, 3919.6, 3842.3, 3986.3, 3874.7, 3804.4], [4044.8, 3938.6, 3866.7, 3993.9, 3895.0, 3828.3], [4049.1, 3952.0, 3883.0, 4000.7, 3909.2, 3844.3], [4051.2, 3966.1, 3905.9, 4003.5, 3923.9, 3868.3]]) CP = sw.cp(S, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p37)') f.write('\n%s' % asterisks) f.write('\n') m, n = S.shape f.write('\n') for icol in range(0, n): f.write('\n Sal Temp Press Cp cp') f.write('\n (psu) (C) (db) (J/kg.C) (J/kg.C)\n') result = np.vstack([S[:, icol], T[:, icol], P[:, icol], UN_cp[:, icol], CP[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %5.0f %8.1f %11.2f\n" % tuple(result[:, iline])) # Test main module svel. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: svel') f.write('\n%s' % asterisks) # Test 1. # Data from Pond and Pickard Intro. Dynamical Oceanography 2nd ed. 1986 T = np.array([[0, 0, 0, 0, 0, 0], [10, 10, 10, 10, 10, 10], [20, 20, 20, 20, 20, 20], [30, 30, 30, 30, 30, 30], [40, 40, 40, 40, 40, 40]]) / 1.00024 S = np.array([[25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35], [25, 25, 25, 35, 35, 35]]) P = np.array([[0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000], [0, 5000, 10000, 0, 5000, 10000]]) UN_svel = np.array([[1435.8, 1520.4, 1610.4, 1449.1, 1534.0, 1623.2], [1477.7, 1561.3, 1647.4, 1489.8, 1573.4, 1659.0], [1510.3, 1593.6, 1676.8, 1521.5, 1604.5, 1687.2], [1535.2, 1619.0, 1700.6, 1545.6, 1629.0, 1710.1], [1553.4, 1638.0, 1719.2, 1563.2, 1647.3, 1727.8]]) SVEL = sw.svel(S, T, P) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from UNESCO 1983 ') f.write('\n (Unesco Tech. Paper in Marine Sci. No. 44, p50)') f.write('\n%s' % asterisks) f.write('\n') m, n = SVEL.shape f.write('\n') for icol in range(0, n): f.write('\n Sal Temp Press SVEL svel') f.write('\n (psu) (C) (db) (m/s) (m/s)\n') result = np.vstack([S[:, icol], T[:, icol], P[:, icol], UN_svel[:, icol], SVEL[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %5.0f %8.1f %11.3f\n" % tuple(result[:, iline])) # Test submodules alpha beta aonb. f.write('\n%s' % asterisks) f.write('\n** and SUB-MODULE: alpha beta aonb') f.write('\n%s' % asterisks) # Data from McDouogall 1987. s = 40 PT = 10 p = 4000 beta_lit = 0.72088e-03 aonb_lit = 0.34763 alpha_lit = aonb_lit * beta_lit BETA = sw.beta(s, PT, p, pt=True) ALPHA = sw.alpha(s, PT, p, pt=True) AONB = sw.aonb(s, PT, p, pt=True) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from MCDOUGALL 1987 ') f.write('\n%s' % asterisks) f.write('\n') f.write('\n') f.write('\n Sal Temp Press BETA beta') f.write('\n (psu) (C) (db) (psu^-1) (psu^-1)\n') table = np.hstack([s, PT, p, beta_lit, BETA]) f.write(" %4.0f %4.0f %5.0f %11.4e %11.5e\n" % tuple(table)) f.write('\n Sal Temp Press AONB aonb') f.write('\n (psu) (C) (db) (psu C^-1) (psu C^-1)\n') table = np.hstack([s, PT, p, aonb_lit, AONB]) f.write(" %4.0f %4.0f %5.0f %8.5f %11.6f\n" % tuple(table)) f.write('\n Sal Temp Press ALPHA alpha') f.write('\n (psu) (C) (db) (psu^-1) (psu^-1)\n') table = np.hstack([s, PT, p, alpha_lit, ALPHA]) f.write(" %4.0f %4.0f %5.0f %11.4e %11.4e\n" % tuple(table)) # Test main moduleS satO2 satN2 satAr. f.write('\n%s' % asterisks) f.write('\n** TESTING MODULE: satO2 satN2 satAr') f.write('\n%s' % asterisks) f.write('\n') # Data from Weiss 1970. T = np.array([[-1, -1], [10, 10], [20, 20], [40, 40]]) / 1.00024 S = np.array([[20, 40], [20, 40], [20, 40], [20, 40]]) lit_O2 = np.array([[9.162, 7.984], [6.950, 6.121], [5.644, 5.015], [4.050, 3.656]]) lit_N2 = np.array([[16.28, 14.01], [12.64, 11.01], [10.47, 9.21], [7.78, 6.95]]) lit_Ar = np.array([[0.4456, 0.3877], [0.3397, 0.2989], [0.2766, 0.2457], [0.1986, 0.1794]]) O2 = sw.satO2(S, T) N2 = sw.satN2(S, T) Ar = sw.satAr(S, T) # Display results. f.write('\n') f.write('\n%s' % asterisks) f.write('\nComparison of accepted values from Weiss, R.F. 1979 ') f.write('\n"The solubility of nitrogen, oxygen and argon in water') f.write('\n and seawater." Deep-Sea Research., 1970, Vol 17, pp721-735.') f.write('\n%s' % asterisks) f.write('\n') m, n = S.shape f.write('\n') for icol in range(0, n): f.write('\n Sal Temp O2 satO2') f.write('\n (psu) (C) (ml/l) (ml/l)\n') result = np.vstack([S[:, icol], T[:, icol], lit_O2[:, icol], O2[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %8.2f %9.3f\n" % tuple(result[:, iline])) for icol in range(0, n): f.write('\n Sal Temp N2 satN2') f.write('\n (psu) (C) (ml/l) (ml/l)\n') result = np.vstack([S[:, icol], T[:, icol], lit_N2[:, icol], N2[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %8.2f %9.3f\n" % tuple(result[:, iline])) for icol in range(0, n): f.write('\n Sal Temp Ar satAr') f.write('\n (psu) (C) (ml/l) (ml/l)\n') result = np.vstack([S[:, icol], T[:, icol], lit_Ar[:, icol], Ar[:, icol]]) for iline in range(0, m): f.write(" %4.0f %4.0f %8.4f %9.4f\n" % tuple(result[:, iline]))
tx_beacon[i]=-1 else: tx_beacon[i]=np.nonzero(ds.rx_beacon.values==tag)[0][0] # And did the rx see itself? is_selfaware[i]=np.isfinite(ds.matrix.values[i,tx_beacon[i]]) ds['tx_beacon']=('index',),tx_beacon is_beacon=tx_beacon>=0 temps=ds.temp.values # WHOA -- comparisons to the beacon-beacon transits suggest # that this has some significant error. The inferred and # calculated speeds of sound are close-ish if temperature is # offset 4.5 degC. rx_c=seawater.svel(0,ds['temp']-4.5,0) # occasional missing data... rx_c=utils.fill_invalid(rx_c,axis=1) ds['c']=('index','rx'),rx_c ## sel_pings=is_multirx&is_selfaware ds_strong=ds.isel(index=sel_pings) ## # Calculate time deltas for each ordered pair of receivers Nping=ds_strong.dims['index'] Nrx=ds_strong.dims['rx']