def test_Ma_0(): """Check expected values for Ma = 0.""" val0 = np.array([1., 1., 1., 0., 0., 0., np.nan, np.nan]) Y0 = {var_test_sup[i]: val0[i] for i in range(len(var_test_sup))} for v in var_test_sup: print(v, Y0[v], cf.from_Ma( v, np.atleast_1d(0.), ga)) assert np.isclose( cf.from_Ma( v, np.atleast_1d(0.), ga), Y0[v], atol=1e-7, equal_nan=True) if np.isfinite(Y0[v]): assert np.isclose( cf.to_Ma( v, np.atleast_1d(Y0[v]), ga), 0.0, atol=1e-7, equal_nan=True)
def test_Ma_inf(): """Check expected values for Ma = i.""" val_inf = np.array([np.inf, np.inf, np.inf, np.sqrt(2.), 0., np.inf, np.sqrt((ga - 1.)/ 2. / ga), 0.]) Y0 = {var_test_sup[i]: val_inf[i] for i in range(len(var_test_sup))} for v in var_test_sup: print(v) assert np.isclose( cf.from_Ma( v, np.atleast_1d(np.inf), ga), Y0[v], atol=1e-7)
def test_explicit_sup(): """Compare quantity values to CUED Data Book, supersonic.""" for v in var_test_sup: for _ in range(Nrep): Ysup = cf.from_Ma(v, dat_sup['Ma'], ga) err_sup = np.abs(Ysup / dat_sup[v] - 1.) imax = np.argmax(err_sup) assert err_sup[imax] < 0.005, \ "Ma={0} => {1}={2} with error={3}".format( dat_sup['Ma'][imax], v, Ysup[imax], err_sup[imax])
def test_Ma_1(): """Check inversion for values near Ma = 1.""" dMa = 0.0001 Ma_fw = np.array([-dMa, 0., dMa]) + 1. for v in var_test_sup: Y_fw = cf.from_Ma( v, Ma_fw, ga) Ma_bk = cf.to_Ma( v, Y_fw, ga) if v in ['mcpTo_APo','A_Acrit']: Ma_bk[-1] = cf.to_Ma( v, Y_fw[-1], ga, True) err = Ma_fw-Ma_bk print(v, err) assert np.all(np.abs(err[~np.isnan(Ma_bk)])<1e-5)
def test_derivative(): """Check explicit derivative against a numerical approximation.""" for v in var_test_sup: Ma = np.linspace(0., 3.) # Explicit dYdMa = cf.derivative_from_Ma(v, Ma, ga) # Numerical approximation Y = cf.from_Ma(v, Ma, ga) dYdMa_numerical = np.gradient(Y, Ma) # Check discrepancy err = dYdMa / dYdMa_numerical - 1. print(v) assert np.max(err[np.isfinite(err)]) < 0.05