def test_plot_compare_with_nan(plot=True, verbose=True, close_plots=True, *args, **kwargs): if plot and close_plots: import matplotlib.pyplot as plt plt.close("all") s = calc_spectrum( 1900, 2300, # cm-1 molecule="CO", isotope="1,2,3", pressure=1.01325, # bar Tgas=700, # K mole_fraction=0.1, path_length=1, # cm ) s = Radiance_noslit(s) s._q["radiance_noslit"][0] = np.nan # Test get_residual methods when there are nans in the spectra diff1 = get_residual( s, s * 1.2, var="radiance_noslit", ignore_nan=True, normalize=True, normalize_how="mean", ) diff2 = get_residual( s, s * 1.2, var="radiance_noslit", ignore_nan=True, normalize=True, normalize_how="area", ) # TODO Write similar testcase for normalize_how="mean" # Test Plot function when there are Nans in the spectrum: if plot: s.plot(normalize=True) s.plot(normalize=(2200, 2250)) # Test plot_diff function when there are Nans in the spectra: if plot: plot_diff(s, s * 1.2, normalize=True) plot_diff(s, s * 1.2, "radiance_noslit", normalize=(2000, 2100))
def test_broadening_DLM_noneq(verbose=True, plot=False, *args, **kwargs): ''' Test Noneq version of DLM and makes sure it gives the same results as the eq one when used with Tvib=Trot ''' if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() setup_test_line_databases() # add HITRAN-CO2-TEST in ~/.radis if not there # Conditions p = 1 wstep = 0.002 wmin = 2380 # cm-1 wmax = 2400 # cm-1 broadening_max_width = 10 # cm-1 # %% Calculate with RADIS # ---------- sf = SpectrumFactory( wavenum_min=wmin, wavenum_max=wmax, mole_fraction=1, path_length=1, # doesnt change anything wstep=wstep, pressure=p, broadening_max_width=broadening_max_width, isotope='1', verbose=3, warnings={'MissingSelfBroadeningWarning':'ignore', 'NegativeEnergiesWarning':'ignore', 'HighTemperatureWarning':'ignore', 'GaussianBroadeningWarning':'ignore'} ) # 0.2) sf.load_databank('HITRAN-CO2-TEST') # DLM: sf.misc['chunksize'] = 'DLM' s_dlm_eq = sf.eq_spectrum(Tgas=3000) s_dlm_eq.name = 'DLM eq ({0:.2f}s)'.format(s_dlm_eq.conditions['calculation_time']) s_dlm_noneq = sf.non_eq_spectrum(Tvib=3000, Trot=3000) s_dlm_noneq.name = 'DLM noneq ({0:.2f}s)'.format(s_dlm_noneq.conditions['calculation_time']) # Compare res = get_residual(s_dlm_eq, s_dlm_noneq, 'radiance_noslit') if verbose: print('Residual:', res) # plot if plot: plot_diff(s_dlm_eq, s_dlm_noneq) assert res <= 4e-5
def test_broadening_methods_different_wstep(verbose=True, plot=False, *args, **kwargs): ''' Test direct Voigt broadening vs convolution of Gaussian x Lorentzian for different spectral grid resolution ''' if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() setup_test_line_databases() # add HITRAN-CO-TEST in ~/.radis if not there # Conditions T = 3000 p = 1 wmin = 2150 # cm-1 wmax = 2152 # cm-1 broadening_max_width = 10 # cm-1 for i, wstep in enumerate([0.01, 0.1, 0.5]): # %% Calculate with RADIS # ---------- sf = SpectrumFactory( wavenum_min=wmin, wavenum_max=wmax, mole_fraction=1, path_length=1, # doesnt change anything wstep=wstep, pressure=p, broadening_max_width=broadening_max_width, isotope='1', verbose=False, warnings={'MissingSelfBroadeningWarning':'ignore', 'NegativeEnergiesWarning':'ignore', 'HighTemperatureWarning':'ignore', 'GaussianBroadeningWarning':'ignore'} ) # 0.2) sf.load_databank('HITRAN-CO-TEST') # s = pl.non_eq_spectrum(Tvib=T, Trot=T, Ttrans=T) sf._broadening_method = 'voigt' s_voigt = sf.eq_spectrum(Tgas=T, name='direct') sf._broadening_method = 'convolve' s_convolve = sf.eq_spectrum(Tgas=T, name='convolve') res = get_residual(s_voigt, s_convolve, 'abscoeff') if verbose: print('Residual:', res) # plot the last one if plot: plot_diff(s_voigt, s_convolve, 'abscoeff', nfig='test_voigt_broadening_methods'+str(i), title='P {0} bar, T {1} K, wstep {2} cm-1'.format(p, T, wstep)) assert res < 2e-4
def test_noneq_continuum(plot=False, verbose=2, warnings=True, *args, **kwargs): """ Test calculation with pseudo-continuum under nonequilibrium Assert results on emisscoeff dont change Notes ----- Uses HITRAN so it can deployed and tested on `Travis CI <https://travis-ci.com/radis/radis>`_, but we should switch to HITEMP if some HITEMP files can be downloaded automatically at the execution time. """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() if verbose: printm(">>> test_noneq_continuum") sf = SpectrumFactory( wavelength_min=4200, wavelength_max=4500, cutoff=1e-23, molecule="CO2", isotope="1,2", broadening_max_width=10, path_length=0.1, mole_fraction=1e-3, medium="vacuum", optimization=None, verbose=verbose, ) sf.warnings.update({ "MissingSelfBroadeningWarning": "ignore", "NegativeEnergiesWarning": "ignore", "LinestrengthCutoffWarning": "ignore", "HighTemperatureWarning": "ignore", }) sf.fetch_databank( "hitran" ) # uses HITRAN: not really valid at this temperature, but runs on all machines without install # sf.load_databank('HITEMP-CO2-DUNHAM') # to take a real advantage of abscoeff continuum, should calculate with HITEMP sf._export_continuum = True # activate it # Calculate one without pseudo-continuum sf.params.pseudo_continuum_threshold = 0 s1 = sf.non_eq_spectrum(Tvib=2000, Trot=1000) s1.name = "All lines resolved ({0}) ({1:.1f}s)".format( s1.conditions["lines_calculated"], s1.conditions["calculation_time"]) assert s1.conditions["pseudo_continuum_threshold"] == 0 # Calculate one with pseudo-continuum sf.params.pseudo_continuum_threshold = 0.05 s2 = sf.non_eq_spectrum(Tvib=2000, Trot=1000) s2.name = "Semi-continuum + {0} lines ({1:.1f}s)".format( s2.conditions["lines_calculated"], s2.conditions["calculation_time"]) assert s2.conditions["pseudo_continuum_threshold"] == 0.05 assert "abscoeff_continuum" in s2.get_vars() assert "emisscoeff_continuum" in s2.get_vars() # Plot if plot: plot_diff( s1, s2, "radiance_noslit", Iunit="µW/cm2/sr/nm", nfig="test_noneq_continuum: diff", ) plt.figure("test_noneq_continuum: show continuum").clear() s2.plot("emisscoeff", label=s2.name, nfig="test_noneq_continuum: show continuum") s2.plot( "emisscoeff_continuum", nfig="same", label="Pseudo-continuum (aggreg. {0:g} lines)".format( s2.conditions["lines_in_continuum"]), force=True, ) # Compare res = get_residual(s1, s2, "abscoeff") + get_residual(s1, s2, "emisscoeff") if verbose: printm("residual:", res) assert res < 5.2e-6
def test_broadening_DLM_FT(verbose=True, plot=False, *args, **kwargs): """ Test use of DLM with and without Fourier Transform Ensures that results are the same, and compare calculation times. """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() setup_test_line_databases() # add HITRAN-CO-TEST in ~/.radis if not there # Conditions T = 3000 p = 1 wstep = 0.002 wmin = 2000 # cm-1 wmax = 2300 # cm-1 broadening_max_width = 10 # cm-1 # %% Calculate with RADIS # ---------- sf = SpectrumFactory( wavenum_min=wmin, wavenum_max=wmax, mole_fraction=1, path_length=1, # doesnt change anything wstep=wstep, pressure=p, broadening_max_width=broadening_max_width, isotope="1", verbose=verbose, chunksize="DLM", warnings={ "MissingSelfBroadeningWarning": "ignore", "NegativeEnergiesWarning": "ignore", "HighTemperatureWarning": "ignore", "GaussianBroadeningWarning": "ignore", }, ) # 0.2) sf.load_databank("HITRAN-CO-TEST") # DLM, real space if verbose: print("\nConvolve version \n") sf._broadening_method = "convolve" s_dlm = sf.eq_spectrum(Tgas=T) s_dlm.name = "DLM ({0:.2f}s)".format(s_dlm.conditions["calculation_time"]) # DLM , with Fourier if verbose: print("\nFFT version \n") sf.params.broadening_method = "fft" s_dlm_fft = sf.eq_spectrum(Tgas=T) s_dlm_fft.name = "DLM FFT ({0:.2f}s)".format( s_dlm_fft.conditions["calculation_time"]) # Compare res = get_residual(s_dlm, s_dlm_fft, "abscoeff") if verbose: print("Residual:", res) # plot if plot: plot_diff(s_dlm, s_dlm_fft, "abscoeff") plt.legend() assert res < 5e-6
def test_broadening_DLM(verbose=True, plot=False, *args, **kwargs): """ Test use of lineshape template for broadening calculation. Ensures that results are the same with and without DLM. """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() setup_test_line_databases() # add HITRAN-CO-TEST in ~/.radis if not there # Conditions T = 3000 p = 1 wstep = 0.002 wmin = 2150 # cm-1 wmax = 2152 # cm-1 broadening_max_width = 10 # cm-1 # %% Calculate with RADIS # ---------- sf = SpectrumFactory( wavenum_min=wmin, wavenum_max=wmax, mole_fraction=1, path_length=1, # doesnt change anything wstep=wstep, pressure=p, broadening_max_width=broadening_max_width, isotope="1", verbose=False, warnings={ "MissingSelfBroadeningWarning": "ignore", "NegativeEnergiesWarning": "ignore", "HighTemperatureWarning": "ignore", "GaussianBroadeningWarning": "ignore", }, ) # 0.2) sf.load_databank("HITRAN-CO-TEST") # Reference: calculate without DLM assert sf.misc["chunksize"] is None s_ref = sf.eq_spectrum(Tgas=T) s_ref.name = "Reference ({0:.2f}s)".format( s_ref.conditions["calculation_time"]) # DLM: sf.misc["chunksize"] = "DLM" sf.params.broadening_method = "convolve" s_dlm = sf.eq_spectrum(Tgas=T) s_dlm.name = "DLM ({0:.2f}s)".format(s_dlm.conditions["calculation_time"]) # DLM Voigt with Whiting approximation: sf.params.broadening_method = "voigt" s_dlm_voigt = sf.eq_spectrum(Tgas=T) s_dlm_voigt.name = "DLM Whiting ({0:.2f}s)".format( s_dlm_voigt.conditions["calculation_time"]) # Compare res = get_residual(s_ref, s_dlm, "abscoeff") res_voigt = get_residual(s_dlm, s_dlm_voigt, "abscoeff") if verbose: print("Residual:", res) # plot the last one if plot: plot_diff(s_ref, s_dlm, "abscoeff") plt.legend() plot_diff(s_dlm, s_dlm_voigt, "abscoeff") assert res < 1.2e-5 assert res_voigt < 1e-5
def test_broadening_methods_different_wstep(verbose=True, plot=False, *args, **kwargs): """ Test direct Voigt broadening vs convolution of Gaussian x Lorentzian for different spectral grid resolution """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() setup_test_line_databases() # add HITRAN-CO-TEST in ~/.radis if not there # Conditions T = 3000 p = 1 wmin = 2150 # cm-1 wmax = 2152 # cm-1 broadening_max_width = 10 # cm-1 for i, wstep in enumerate([0.01, 0.1, 0.5]): # %% Calculate with RADIS # ---------- sf = SpectrumFactory( wavenum_min=wmin, wavenum_max=wmax, mole_fraction=1, path_length=1, # doesnt change anything wstep=wstep, pressure=p, broadening_max_width=broadening_max_width, isotope="1", optimization=None, verbose=False, warnings={ "MissingSelfBroadeningWarning": "ignore", "NegativeEnergiesWarning": "ignore", "HighTemperatureWarning": "ignore", "GaussianBroadeningWarning": "ignore", "AccuracyError": "ignore", "AccuracyWarning": "ignore", }, ) # 0.2) sf.load_databank("HITRAN-CO-TEST") # s = pl.non_eq_spectrum(Tvib=T, Trot=T, Ttrans=T) sf.params.broadening_method = "voigt" s_voigt = sf.eq_spectrum(Tgas=T, name="direct") sf.params.broadening_method = "convolve" s_convolve = sf.eq_spectrum(Tgas=T, name="convolve") res = get_residual(s_voigt, s_convolve, "abscoeff") if verbose: print("Residual:", res) # plot the last one if plot: plot_diff( s_voigt, s_convolve, "abscoeff", nfig="test_voigt_broadening_methods" + str(i), title="P {0} bar, T {1} K, wstep {2} cm-1".format(p, T, wstep), ) assert res < 2e-4
def test_broadening_methods_different_conditions(verbose=True, plot=False, *args, **kwargs): """ Test direct Voigt broadening vs convolution of Gaussian x Lorentzian for different spectral grid resolution Notes ----- Reference broadening calculated manually with the HWHM formula of `HITRAN.org <https://hitran.org/docs/definitions-and-units/>`_ """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() setup_test_line_databases() # add HITRAN-CO-TEST in ~/.radis if not there # Conditions wstep = 0.005 wmin = 2150.4 # cm-1 wmax = 2151.4 # cm-1 broadening_max_width = 2 # cm-1 for (T, p, fwhm_lorentz, fwhm_gauss) in [ # K, bar, expected FWHM for Lotentz, gauss (cm-1) (3000, 1, 0.02849411, 0.01594728), (300, 1, 0.16023415, 0.00504297), (3000, 0.01, 0.00028494, 0.01594728), ]: # %% Calculate with RADIS # ---------- sf = SpectrumFactory( wavenum_min=wmin, wavenum_max=wmax, mole_fraction=1, path_length=1, # doesnt change anything wstep=wstep, pressure=p, broadening_max_width=broadening_max_width, isotope="1", verbose=False, warnings={ "MissingSelfBroadeningWarning": "ignore", "NegativeEnergiesWarning": "ignore", "HighTemperatureWarning": "ignore", "OutOfRangeLinesWarning": "ignore", "GaussianBroadeningWarning": "ignore", "CollisionalBroadeningWarning": "ignore", }, ) sf.load_databank("HITRAN-CO-TEST") # Manually filter line database, keep one line only: sf.df0.drop(sf.df0[sf.df0.vu != 1].index, inplace=True) assert isclose(sf.df0.wav, 2150.856008) # Calculate spectra (different broadening methods) sf.params.broadening_method = "voigt" s_voigt = sf.eq_spectrum(Tgas=T, name="direct") # assert broadening FWHM are correct assert isclose(2 * float(sf.df1.hwhm_gauss), fwhm_gauss) assert isclose(2 * float(sf.df1.hwhm_lorentz), fwhm_lorentz) sf.params.broadening_method = "convolve" s_convolve = sf.eq_spectrum(Tgas=T, name="convolve") # assert broadening FWHM are correct assert isclose(2 * float(sf.df1.hwhm_gauss), fwhm_gauss) assert isclose(2 * float(sf.df1.hwhm_lorentz), fwhm_lorentz) res = get_residual(s_voigt, s_convolve, "abscoeff") if verbose: print( "{0} K, {1} bar: FWHM lorentz = {2:.3f} cm-1, FWHM gauss = {3:.3f} cm-1" .format(T, p, 2 * float(sf.df1.hwhm_lorentz), 2 * float(sf.df1.hwhm_gauss))) if plot: plot_diff( s_voigt, s_convolve, "abscoeff", title= r"T {0} K, p {1} bar: w$_\mathrm{{L}}$ {2:.3f}, w$_\mathrm{{G}}$ {3:.3f} cm$^{{-1}}$" .format(T, p, 2 * float(sf.df1.hwhm_lorentz), float(sf.df1.hwhm_gauss)), ) # assert all broadening methods match assert res < 2e-4
def test_noneq_continuum(plot=False, verbose=2, warnings=True, *args, **kwargs): ''' Test calculation with pseudo-continuum under nonequilibrium Assert results on emisscoeff dont change Notes ----- Uses HITRAN so it can deployed and tested on [Travis]_, but we should switch to HITEMP if some HITEMP files can be downloaded automatically at the execution time. ''' if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() try: if verbose: printm('>>> test_noneq_continuum') sf = SpectrumFactory(wavelength_min=4200, wavelength_max=4500, parallel=False, bplot=False, cutoff=1e-23, molecule='CO2', isotope='1,2', db_use_cached=True, broadening_max_width=10, path_length=0.1, mole_fraction=1e-3, medium='vacuum', verbose=verbose) sf.warnings.update({ 'MissingSelfBroadeningWarning': 'ignore', 'NegativeEnergiesWarning': 'ignore', 'LinestrengthCutoffWarning': 'ignore', 'HighTemperatureWarning': 'ignore' }) sf.fetch_databank( ) # uses HITRAN: not really valid at this temperature, but runs on all machines without install # sf.load_databank('HITEMP-CO2-DUNHAM') # to take a real advantage of abscoeff continuum, should calculate with HITEMP sf._export_continuum = True # activate it # Calculate one without pseudo-continuum sf.params.pseudo_continuum_threshold = 0 s1 = sf.non_eq_spectrum(Tvib=2000, Trot=1000) s1.name = 'All lines resolved ({0}) ({1:.1f}s)'.format( s1.conditions['lines_calculated'], s1.conditions['calculation_time']) assert s1.conditions['pseudo_continuum_threshold'] == 0 # Calculate one with pseudo-continuum sf.params.pseudo_continuum_threshold = 0.05 s2 = sf.non_eq_spectrum(Tvib=2000, Trot=1000) s2.name = 'Semi-continuum + {0} lines ({1:.1f}s)'.format( s2.conditions['lines_calculated'], s2.conditions['calculation_time']) assert s2.conditions['pseudo_continuum_threshold'] == 0.05 assert 'abscoeff_continuum' in s2.get_vars() assert 'emisscoeff_continuum' in s2.get_vars() # Plot if plot: plot_diff(s1, s2, 'radiance_noslit', Iunit='µW/cm2/sr/nm', nfig='test_noneq_continuum: diff') s2.plot('emisscoeff', label=s2.name, nfig='test_noneq_continuum: show continuum') s2.plot('emisscoeff_continuum', nfig='same', label='Pseudo-continuum (aggreg. {0:g} lines)'.format( s2.conditions['lines_in_continuum']), force=True) # Compare res = get_residual(s1, s2, 'abscoeff') + get_residual( s1, s2, 'emisscoeff') if verbose: printm('residual:', res) assert res < 5e-6 except DatabankNotFound as err: assert IgnoreMissingDatabase(err, __file__, warnings)
def test_plot_all_CO2_bandheads(verbose=True, plot=False, *args, **kwargs): """In this test we use the :meth:`~radis.lbl.bands.BandFactory.non_eq_bands` method to calculate separately all vibrational bands of CO2, and compare them with the final Spectrum. """ # Note: only with iso1 at the moment if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() Tgas = 1000 sf = SpectrumFactory( wavelength_min=4160, wavelength_max=4220, mole_fraction=1, path_length=0.3, cutoff=1e-23, molecule="CO2", isotope=1, optimization=None, verbose=verbose, ) sf.warnings["MissingSelfBroadeningWarning"] = "ignore" sf.warnings["NegativeEnergiesWarning"] = "ignore" sf.warnings["HighTemperatureWarning"] = "ignore" sf.fetch_databank("hitran") s_tot = sf.non_eq_spectrum(Tvib=Tgas, Trot=Tgas) s_bands = sf.non_eq_bands(Tvib=Tgas, Trot=Tgas) if verbose: printm("{0} bands in spectrum".format(len(s_bands))) assert len(s_bands) == 6 # Ensure that recombining gives the same s_merged = MergeSlabs(*list(s_bands.values())) assert s_tot.compare_with(s_merged, "radiance_noslit", plot=False) if verbose: printm("Recombining bands give the same Spectrum") # %% if plot: s_tot.apply_slit(1, "nm") s_tot.name = "Full spectrum" s_tot.plot(wunit="nm", lw=3) for band, s in s_bands.items(): s.plot(wunit="nm", nfig="same") plt.legend(loc="upper left") plt.ylim(ymax=0.25) # %% Compare with equilibrium bands now s_bands_eq = sf.eq_bands(Tgas) s_merged_eq = MergeSlabs(*list(s_bands_eq.values())) assert get_residual(s_tot, s_merged_eq, "radiance_noslit") < 1.5e-5 return True
def test_get_residual(): from radis import calc_spectrum, experimental_spectrum s1 = calc_spectrum( 1900, 2300, molecule="CO", isotope="1,2,3", pressure=1.01325, Tgas=1000, mole_fraction=0.1, ) s1.apply_slit(1, "nm") w1, I1 = s1.get("radiance", copy=False, wunit=s1.get_waveunit()) # Fake experimental spectrum (identical) s_expe_1 = experimental_spectrum(w1, I1, Iunit="mW/cm2/sr/nm", wunit="cm-1") residual1 = get_residual( s1, s_expe_1, "radiance", # ignore_nan=False, normalize=True, ) assert residual1 == 0 # Fake experimental spectrum with a new unit (but identical) I2 = I1 * 1e-3 s_expe_2 = experimental_spectrum(w1, I2, Iunit="W/cm2/sr/nm", wunit="cm-1") residual2 = get_residual( s1, s_expe_2, "radiance", normalize=False, ) assert residual2 < 1e-10 for bool_how in ["max", "area", "mean"]: residual2_bis = get_residual( s1, s_expe_2, "radiance", ignore_nan=False, normalize=True, normalize_how=bool_how, ) # print('residu2 ={}'.format(residual2)) assert residual2_bis < 1e-13 # Fake experimental spectrum with a nan I3 = I1.copy() I3[0] = np.nan s_expe_3 = experimental_spectrum(w1, I3, Iunit="W/cm2/sr/nm", wunit="cm-1") # Intrestingly, the "mean" method seams to be not adapted for spectra with nans criterion = [1e-10, 2e-6, 2e-2] for index, bool_how in enumerate(["max", "area", "mean"]): residual3 = get_residual( s1, s_expe_3, "radiance", ignore_nan=True, normalize=True, normalize_how=bool_how, ) # print('residu3 ={}'.format(residual3)) assert residual3 < criterion[index]
def test_optically_thick_limit_1iso(verbose=True, plot=True, *args, **kwargs): """ Test that we find Planck in the optically thick limit In particular, this test will fail if : - linestrength are not properly calculated - at noneq, linestrength and emission integrals are mixed up The test should be run for 1 and several isotopes, because different calculations paths are used internally, and this can lead to different errors. Also, this test is used to run with DEBUG_MODE = True, which will check that isotopes and molecule ids are what we expect in all the groupby() loops that make the production code very fast. Notes ----- switched from large band calculation with [HITRAN-2016]_ to a calculation with the embedded [HITEMP-2010]_ fragment (shorter range, but no need to download files) """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() # Force DEBUG_MODE DEBUG_MODE = radis.DEBUG_MODE radis.DEBUG_MODE = True try: wavenum_min = 2284.2 wavenum_max = 2284.6 P = 0.017 # bar wstep = 0.001 # cm-1 Tgas = 1200 # %% Generate some CO2 emission spectra # -------------- sf = SpectrumFactory( wavenum_min=wavenum_min, wavenum_max=wavenum_max, molecule="CO2", mole_fraction=1, path_length=0.05, cutoff=1e-25, broadening_max_width=1, export_populations=False, #'vib', export_lines=False, isotope=1, use_cached=True, wstep=wstep, pseudo_continuum_threshold=0, pressure=P, verbose=False, ) # sf.fetch_databank('astroquery') sf.warnings["NegativeEnergiesWarning"] = "ignore" sf.load_databank("HITEMP-CO2-TEST") pb = ProgressBar(3, active=verbose) s_eq = sf.eq_spectrum(Tgas=Tgas, mole_fraction=1, name="Equilibrium") pb.update(1) s_2T = sf.non_eq_spectrum(Tvib=Tgas, Trot=Tgas, mole_fraction=1, name="Noneq (2T)") pb.update(2) s_4T = sf.non_eq_spectrum(Tvib=(Tgas, Tgas, Tgas), Trot=Tgas, mole_fraction=1, name="Noneq (4T)") pb.update(3) s_plck = sPlanck( wavelength_min=2000, # =wavelength_min, wavelength_max= 5000, # =wavelength_max - wstep, # there is a border effect on last point T=Tgas, ) pb.done() # %% Post process: # MAke optically thick, and compare with Planck for s in [s_eq, s_2T, s_4T]: s.rescale_path_length(1e6) if plot: nfig = "test_opt_thick_limit_1iso {0}".format(s.name) plt.figure(nfig).clear() s.plot(wunit="nm", nfig=nfig, lw=4) s_plck.plot(wunit="nm", nfig=nfig, Iunit="mW/cm2/sr/nm", lw=2) plt.legend() if verbose: printm( "Residual between opt. thick CO2 spectrum ({0}) and Planck: {1:.2g}" .format( s.name, get_residual(s, s_plck, "radiance_noslit", ignore_nan=True), )) # assert get_residual(s, s_plck, 'radiance_noslit', ignore_nan=True) < 1e-3 assert get_residual(s, s_plck, "radiance_noslit", ignore_nan=True) < 0.9e-4 if verbose: printm("Tested optically thick limit is Planck (1 isotope): OK") finally: # Reset DEBUG_MODE radis.DEBUG_MODE = DEBUG_MODE
def test_plot_all_CO2_bandheads(verbose=True, plot=False, *args, **kwargs): ''' In this test we use the :meth:`~radis.lbl.bands.BandFactory.non_eq_bands` method to calculate separately all vibrational bands of CO2, and compare them with the final Spectrum. ''' # Note: only with iso1 at the moment if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() verbose = True Tgas = 1000 sf = SpectrumFactory(wavelength_min=4160, wavelength_max=4220, mole_fraction=1, path_length=0.3, cutoff=1e-23, molecule='CO2', isotope=1, db_use_cached=True, lvl_use_cached=True, verbose=verbose) sf.warnings['MissingSelfBroadeningWarning'] = 'ignore' sf.warnings['NegativeEnergiesWarning'] = 'ignore' sf.warnings['HighTemperatureWarning'] = 'ignore' sf.fetch_databank() s_tot = sf.non_eq_spectrum(Tvib=Tgas, Trot=Tgas) s_bands = sf.non_eq_bands(Tvib=Tgas, Trot=Tgas) if verbose: printm('{0} bands in spectrum'.format(len(s_bands))) assert len(s_bands) == 6 # Ensure that recombining gives the same s_merged = MergeSlabs(*list(s_bands.values())) assert s_tot.compare_with(s_merged, 'radiance_noslit', plot=False) if verbose: printm('Recombining bands give the same Spectrum') # %% if plot: s_tot.apply_slit(1, 'nm') s_tot.name = 'Full spectrum' s_tot.plot(wunit='nm', lw=3) for band, s in s_bands.items(): s.plot(wunit='nm', nfig='same') plt.legend(loc='upper left') plt.ylim(ymax=0.25) # %% Compare with equilibrium bands now s_bands_eq = sf.eq_bands(Tgas) s_merged_eq = MergeSlabs(*list(s_bands_eq.values())) assert get_residual(s_tot, s_merged_eq, 'radiance_noslit') < 1e-5 return True
def test_abscoeff_continuum(plot=False, verbose=2, warnings=True, threshold=0.1, *args, **kwargs): """ Test calculation with pseudo-continuum Assert results on abscoeff dont change Notes ----- Uses HITRAN so it can deployed and tested on [Travis]_, but we should switch to HITEMP if some HITEMP files can be downloaded automatically at the execution time. """ if plot: # Make sure matplotlib is interactive so that test are not stuck in pytest plt.ion() try: if verbose: printm(">>> test_abscoeff_continuum") sf = SpectrumFactory( wavelength_min=4200, wavelength_max=4500, parallel=False, bplot=False, cutoff=1e-23, molecule="CO2", isotope="1,2", db_use_cached=True, broadening_max_width=10, path_length=0.1, mole_fraction=1e-3, medium="vacuum", verbose=verbose, ) sf.warnings.update({ "MissingSelfBroadeningWarning": "ignore", "NegativeEnergiesWarning": "ignore", "LinestrengthCutoffWarning": "ignore", "HighTemperatureWarning": "ignore", }) sf.fetch_databank( ) # uses HITRAN: not really valid at this temperature, but runs on all machines without install # sf.load_databank('HITEMP-CO2-DUNHAM') # to take a real advantage of abscoeff continuum, should calculate with HITEMP sf._export_continuum = True # activate it # Calculate one without pseudo-continuum sf.params.pseudo_continuum_threshold = 0 s1 = sf.eq_spectrum(Tgas=2000) s1.name = "All lines resolved ({0}) ({1:.1f}s)".format( s1.conditions["lines_calculated"], s1.conditions["calculation_time"]) assert s1.conditions["pseudo_continuum_threshold"] == 0 # Calculate one with pseudo-continuum sf.params.pseudo_continuum_threshold = threshold s2 = sf.eq_spectrum(Tgas=2000) s2.name = "Semi-continuum + {0} lines ({1:.1f}s)".format( s2.conditions["lines_calculated"], s2.conditions["calculation_time"]) assert s2.conditions["pseudo_continuum_threshold"] == threshold assert "abscoeff_continuum" in s2.get_vars() # Plot if plot: plot_diff( s1, s2, "radiance_noslit", Iunit="µW/cm2/sr/nm", nfig="test_abscoeff_continuum: diff", ) s2.plot( "abscoeff", label="Full spectrum", nfig="test_abscoeff_continuum: show continuum", force=True, ) s2.plot( "abscoeff_continuum", nfig="same", label="Pseudo-continuum".format( s2.conditions["lines_in_continuum"]), force=True, ) plt.legend() # Compare res = get_residual(s1, s2, "abscoeff") if verbose: printm("residual:", res) globals().update(locals()) assert res < 1.32e-6 except DatabankNotFound as err: assert IgnoreMissingDatabase(err, __file__, warnings)