ARTS  2.2.66
GasAbsLookup Class Reference

An absorption lookup table. More...

#include <gas_abs_lookup.h>

Public Member Functions

 GasAbsLookup ()
 
void Adapt (const ArrayOfArrayOfSpeciesTag &current_species, ConstVectorView current_f_grid, const Verbosity &verbosity)
 Adapt lookup table to current calculation. More...
 
void Extract (Matrix &sga, const Index &p_interp_order, const Index &t_interp_order, const Index &h2o_interp_order, const Index &f_interp_order, const Numeric &p, const Numeric &T, ConstVectorView abs_vmrs, ConstVectorView new_f_grid, const Numeric &extpolfac) const
 Extract scalar gas absorption coefficients from the lookup table. More...
 
const VectorGetFgrid () const
 
const VectorGetPgrid () const
 

Private Attributes

ArrayOfArrayOfSpeciesTag species
 The species tags for which the table is valid. More...
 
ArrayOfIndex nonlinear_species
 The species tags with non-linear treatment. More...
 
Vector f_grid
 The frequency grid [Hz]. More...
 
ArrayOfGridPosPoly fgp_default
 Frequency grid positions. More...
 
Vector p_grid
 The pressure grid for the table [Pa]. More...
 
Vector log_p_grid
 The natural log of the pressure grid. More...
 
Matrix vmrs_ref
 The reference VMR profiles. More...
 
Vector t_ref
 The reference temperature profile [K]. More...
 
Vector t_pert
 The vector of temperature perturbations [K]. More...
 
Vector nls_pert
 The vector of perturbations for the VMRs of the nonlinear species. More...
 
Tensor4 xsec
 Absorption cross sections. More...
 

Friends

void xml_read_from_stream (istream &is_xml, GasAbsLookup &gal, bifstream *pbifs, const Verbosity &verbosity)
 Reads GasAbsLookup from XML input stream. More...
 
void xml_write_to_stream (ostream &os_xml, const GasAbsLookup &gal, bofstream *pbofs, const String &name, const Verbosity &verbosity)
 Writes GasAbsLookup to XML output stream. More...
 
void abs_lookupCalc (Workspace &ws, GasAbsLookup &abs_lookup, Index &abs_lookup_is_adapted, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfArrayOfSpeciesTag &abs_nls, const Vector &f_grid, const Vector &abs_p, const Matrix &abs_vmrs, const Vector &abs_t, const Vector &abs_t_pert, const Vector &abs_nls_pert, const Agenda &abs_xsec_agenda, const Verbosity &verbosity)
 WORKSPACE METHOD: abs_lookupCalc. More...
 
Numeric calc_lookup_error (Workspace &ws, const GasAbsLookup &al, const Index &abs_p_interp_order, const Index &abs_t_interp_order, const Index &abs_nls_interp_order, const bool ignore_errors, const Agenda &abs_xsec_agenda, const Numeric &local_p, const Numeric &local_t, const Vector &local_vmrs, const Verbosity &verbosity)
 Compare lookup and LBL calculation. More...
 
void abs_lookupTestAccuracy (Workspace &ws, const GasAbsLookup &abs_lookup, const Index &abs_lookup_is_adapted, const Index &abs_p_interp_order, const Index &abs_t_interp_order, const Index &abs_nls_interp_order, const Agenda &abs_xsec_agenda, const Verbosity &verbosity)
 WORKSPACE METHOD: abs_lookupTestAccuracy. More...
 
void abs_lookupTestAccMC (Workspace &ws, const GasAbsLookup &abs_lookup, const Index &abs_lookup_is_adapted, const Index &abs_p_interp_order, const Index &abs_t_interp_order, const Index &abs_nls_interp_order, const Index &mc_seed, const Agenda &abs_xsec_agenda, const Verbosity &verbosity)
 WORKSPACE METHOD: abs_lookupTestAccMC. More...
 
void nca_read_from_file (const int ncid, GasAbsLookup &gal, const Verbosity &)
 Reads a GasAbsLookup table from a NetCDF file. More...
 
void nca_write_to_file (const int ncid, const GasAbsLookup &gal, const Verbosity &)
 Writes a GasAbsLookup table to a NetCDF file. More...
 

Detailed Description

An absorption lookup table.

This class holds an absorption lookup table, as well as all information that is necessary to use the table to extract absorption. Extraction routines are implemented as member functions.

Definition at line 46 of file gas_abs_lookup.h.

Constructor & Destructor Documentation

◆ GasAbsLookup()

GasAbsLookup::GasAbsLookup ( )
inline

Definition at line 48 of file gas_abs_lookup.h.

Member Function Documentation

◆ Adapt()

void GasAbsLookup::Adapt ( const ArrayOfArrayOfSpeciesTag current_species,
ConstVectorView  current_f_grid,
const Verbosity verbosity 
)

Adapt lookup table to current calculation.

This method has the following tasks:

  1. Find and remember the indices of the current species in the lookup table. At the same time verify that each species is included in the table exactly once. As a special case, if a species is missing, but is trivial (a species for which no lookup information should be generated anyway), then we take note of that
  2. Find and remember the frequencies of the current calculation in the lookup table. At the same time verify that all frequencies are included and that no frequency occurs twice.
  3. Use the species and frequency index lists to build the new lookup table.
  4. Replace original table by the new one.
  5. Initialize log_p_grid.

The method is intended to be called only once per ARTS job, more or less directly from a corresponding workspace method. Therefore, runtime errors are thrown, rather than assertions, if something is wrong.

Parameters
[in]current_speciesThe list of species for the current calculation.
[in]current_f_gridThe list of frequencies for the current calculation.
[in]verbosityVerbosity settings.
Date
2002-12-12

Definition at line 124 of file gas_abs_lookup.cc.

References chk_contains(), chk_if_decreasing(), chk_if_in_range(), chk_if_increasing(), chk_matrix_ncols(), chk_matrix_nrows(), chk_size(), chk_vector_length(), CREATE_OUT2, CREATE_OUT3, f_grid, fgp_default, find_new_grid_in_old_grid(), get_tag_group_name(), gridpos_poly(), is_unique(), joker, log_p_grid, ConstTensor4View::nbooks(), ConstTensor4View::ncols(), Array< base >::nelem(), ConstVectorView::nelem(), nls_pert, nonlinear_species, p_grid, Tensor4::resize(), Vector::resize(), Matrix::resize(), species, t_pert, t_ref, transform(), SpeciesTag::TYPE_FREE_ELECTRONS, SpeciesTag::TYPE_PARTICLES, SpeciesTag::TYPE_ZEEMAN, vmrs_ref, and xsec.

Referenced by abs_lookupAdapt().

◆ Extract()

void GasAbsLookup::Extract ( Matrix sga,
const Index p_interp_order,
const Index t_interp_order,
const Index h2o_interp_order,
const Index f_interp_order,
const Numeric p,
const Numeric T,
ConstVectorView  abs_vmrs,
ConstVectorView  new_f_grid,
const Numeric extpolfac 
) const

Extract scalar gas absorption coefficients from the lookup table.

This carries out a simple interpolation in temperature, pressure, and sometimes frequency. The interpolated value is then scaled by the ratio between actual VMR and reference VMR. In the case of nonlinear species the interpolation goes also over H2O VMR.

All input parameters must be in the range coverd by the table. Violation will result in a runtime error. Those checks are here, because they are a bit difficult to make outside, due to the irregularity of the grids. Otherwise there are no runtime checks in this function, only assertions. This is, because the function is called many times inside the RT calculation.

In this case pressure is not an altitude coordinate, so we are free to choose the type of interpolation that gives lowest interpolation errors or is easiest. I tested both linear and log p interpolation with the result that log p interpolation is slightly better, so that is used.

Parameters
[out]sgaA Matrix with scalar gas absorption coefficients [1/m]. Dimension is adjusted automatically to [n_species,f_grid].
[in]p_interp_orderInterpolation order for pressure.
[in]t_interp_orderInterpolation order for temperature.
[in]h2o_interp_orderInterpolation order for water vapor.
[in]f_interp_orderInterpolation order for frequency. This should normally be zero, except for calculations with Doppler shift.
[in]pThe pressures [Pa].
[in]TThe temperature [K].
[in]abs_vmrsThe VMRs [absolute number]. Dimension: [species].
[in]new_f_gridThe frequency grid where absorption should be extracted. With frequency interpolation order 0, this has to match the lookup table's internal grid, or have exactly 1 element. With higher frequency interpolation order it can be an arbitrary grid.
[in]extpolfacHow much extrapolation to allow. Useful for Doppler calculations. (But there even better to make the lookup table grid wider and denser than the calculation grid.)
Date
2002-09-20, 2003-02-22, 2007-05-22, 2013-04-29
Author
Stefan Buehler

Definition at line 593 of file gas_abs_lookup.cc.

References abs, DEBUG_ONLY, f_grid, fgp_default, find_first_species_tg(), gridpos_poly(), interp(), interpweights(), is_size(), is_zeeman(), joker, log_p_grid, Array< base >::nelem(), ConstVectorView::nelem(), nls_pert, nonlinear_species, ConstTensor4View::npages(), number_density(), p_grid, Tensor4::resize(), Vector::resize(), Matrix::resize(), Tensor5::resize(), species, species_index_from_species_name(), t_pert, t_ref, SpeciesTag::TYPE_FREE_ELECTRONS, SpeciesTag::TYPE_PARTICLES, vmrs_ref, w(), and xsec.

Referenced by calc_lookup_error(), and propmat_clearskyAddFromLookup().

◆ GetFgrid()

const Vector & GasAbsLookup::GetFgrid ( ) const

Definition at line 1229 of file gas_abs_lookup.cc.

References f_grid.

Referenced by f_gridFromGasAbsLookup().

◆ GetPgrid()

const Vector & GasAbsLookup::GetPgrid ( ) const

Definition at line 1235 of file gas_abs_lookup.cc.

References p_grid.

Referenced by p_gridFromGasAbsLookup().

Friends And Related Function Documentation

◆ abs_lookupCalc

void abs_lookupCalc ( Workspace ws,
GasAbsLookup abs_lookup,
Index abs_lookup_is_adapted,
const ArrayOfArrayOfSpeciesTag abs_species,
const ArrayOfArrayOfSpeciesTag abs_nls,
const Vector f_grid,
const Vector abs_p,
const Matrix abs_vmrs,
const Vector abs_t,
const Vector abs_t_pert,
const Vector abs_nls_pert,
const Agenda abs_xsec_agenda,
const Verbosity verbosity 
)
friend

WORKSPACE METHOD: abs_lookupCalc.

Creates a gas absorption lookup table.

The lookup table stores absorption cross-sections as a function of pressure. Additionally, absorption can be stored as a function of temperature for temperature perturbations from a reference profile.

Additionally, absorption can be stored as a function of water vapor VMR perturbations from a reference profile. The variable abs_nls specifies, for which species water vapor perturbations should be generated.

Note, that the absorbing gas can be any gas, but the perturbing gas is always H2O.

In contrast to other absorption functions, this method does not use the input variable abs_h2o. This is because abs_h2o has to be set interally to allow perturbations. If there are more than one H2O species, the first is assumed to be the main one.

Author
Stefan Buehler
Parameters
[in,out]wsWorkspace
[out]abs_lookupWS Output
[out]abs_lookup_is_adaptedWS Output
[in]abs_speciesWS Input
[in]abs_nlsWS Input
[in]f_gridWS Input
[in]abs_pWS Input
[in]abs_vmrsWS Input
[in]abs_tWS Input
[in]abs_t_pertWS Input
[in]abs_nls_pertWS Input
[in]abs_xsec_agendaWS Input

Definition at line 63 of file m_abs_lookup.cc.

◆ abs_lookupTestAccMC

void abs_lookupTestAccMC ( Workspace ws,
const GasAbsLookup abs_lookup,
const Index abs_lookup_is_adapted,
const Index abs_p_interp_order,
const Index abs_t_interp_order,
const Index abs_nls_interp_order,
const Index mc_seed,
const Agenda abs_xsec_agenda,
const Verbosity verbosity 
)
friend

WORKSPACE METHOD: abs_lookupTestAccMC.

Test accuracy of absorption lookup table with Monte Carlo Algorithm.

Explicitly compare absorption from the lookup table with line-by-line calculations for random conditions.

The quantities returned are the mean value and standard deviation of the absolute value of the relative error in percent. The relative error itself is computed for a large number of cases (pressure, temperature, and H2O VMR combinations). In the frequency dimension the maximum value is taken for each case.

Produces no workspace output, only output to the output streams.

Author
Stefan Buehler
Parameters
[in,out]wsWorkspace
[in]abs_lookupWS Input
[in]abs_lookup_is_adaptedWS Input
[in]abs_p_interp_orderWS Input
[in]abs_t_interp_orderWS Input
[in]abs_nls_interp_orderWS Input
[in]mc_seedWS Input
[in]abs_xsec_agendaWS Input

Definition at line 2800 of file m_abs_lookup.cc.

◆ abs_lookupTestAccuracy

void abs_lookupTestAccuracy ( Workspace ws,
const GasAbsLookup abs_lookup,
const Index abs_lookup_is_adapted,
const Index abs_p_interp_order,
const Index abs_t_interp_order,
const Index abs_nls_interp_order,
const Agenda abs_xsec_agenda,
const Verbosity verbosity 
)
friend

WORKSPACE METHOD: abs_lookupTestAccuracy.

Test accuracy of absorption lookup table.

Explicitly compare absorption from the lookup table with line-by-line calculations for strategically selected conditions (in-between the lookup table grid points).

For error units see abs_lookupTestAccMC

Produces no workspace output, only output to the output streams.

Author
Stefan Buehler
Parameters
[in,out]wsWorkspace
[in]abs_lookupWS Input
[in]abs_lookup_is_adaptedWS Input
[in]abs_p_interp_orderWS Input
[in]abs_t_interp_orderWS Input
[in]abs_nls_interp_orderWS Input
[in]abs_xsec_agendaWS Input

Definition at line 2462 of file m_abs_lookup.cc.

◆ calc_lookup_error

Numeric calc_lookup_error ( Workspace ws,
const GasAbsLookup al,
const Index abs_p_interp_order,
const Index abs_t_interp_order,
const Index abs_nls_interp_order,
const bool  ignore_errors,
const Agenda abs_xsec_agenda,
const Numeric local_p,
const Numeric local_t,
const Vector local_vmrs,
const Verbosity verbosity 
)
friend

Compare lookup and LBL calculation.

This is a helper function used by abs_lookupTestAccuracy. It takes local p, T, and VMR conditions, performs lookup table extraction and line by line absorption calculation, and compares the difference.

Parameters
alLookup table
abs_p_interp_orderPressure interpolation order.
abs_t_interp_orderTemperature interpolation order.
abs_nls_interp_orderH2O interpolation order.
ignore_errorsIf true, we ignore runtime errors in lookup table extraction. This is handy, because in some cases it is not easy to make sure that all local conditions are inside the valid range for the lookup table.
local_p
local_t
local_vmrs
Returns
The maximum of the absolute value of the relative difference between lookup and LBL, in percent. Or -1 if the case should be ignored according to the "ignore_errors" flag.

Definition at line 2344 of file m_abs_lookup.cc.

◆ nca_read_from_file

void nca_read_from_file ( const int  ncid,
GasAbsLookup gal,
const Verbosity  
)
friend

Reads a GasAbsLookup table from a NetCDF file.

Parameters
[in]ncidNetCDF file descriptor
[in]galGasAbsLookup
Author
Oliver Lemke

Definition at line 51 of file nc_io_compound_types.cc.

◆ nca_write_to_file

void nca_write_to_file ( const int  ncid,
const GasAbsLookup gal,
const Verbosity  
)
friend

Writes a GasAbsLookup table to a NetCDF file.

Parameters
[in]ncidNetCDF file descriptor
[out]galGasAbsLookup
Author
Oliver Lemke

Definition at line 74 of file nc_io_compound_types.cc.

◆ xml_read_from_stream

void xml_read_from_stream ( istream &  is_xml,
GasAbsLookup gal,
bifstream pbifs,
const Verbosity verbosity 
)
friend

Reads GasAbsLookup from XML input stream.

Parameters
is_xmlXML Input stream
galGasAbsLookup return value
pbifsPointer to binary input stream. NULL in case of ASCII file.

Definition at line 138 of file xml_io_compound_types.cc.

◆ xml_write_to_stream

void xml_write_to_stream ( ostream &  os_xml,
const GasAbsLookup gal,
bofstream pbofs,
const String name,
const Verbosity verbosity 
)
friend

Writes GasAbsLookup to XML output stream.

Parameters
os_xmlXML Output stream
galGasAbsLookup
pbofsPointer to binary file stream. NULL for ASCII output.
nameOptional name attribute

Definition at line 169 of file xml_io_compound_types.cc.

Member Data Documentation

◆ f_grid

Vector GasAbsLookup::f_grid
private

The frequency grid [Hz].

Must be sorted in ascending order.

Definition at line 169 of file gas_abs_lookup.h.

Referenced by Adapt(), calc_lookup_error(), Extract(), GetFgrid(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ fgp_default

ArrayOfGridPosPoly GasAbsLookup::fgp_default
private

Frequency grid positions.

This is not stored with the table, it is calculated by the abs_lookupAdapt method.

We are precalculating this for the trivial case that we want to extract all frequencies. (Nearest neighbor interpolation onto exactly the same frequency grid.) This is the most comon case, so no point in doing it over and over again.

Definition at line 179 of file gas_abs_lookup.h.

Referenced by Adapt(), and Extract().

◆ log_p_grid

Vector GasAbsLookup::log_p_grid
private

The natural log of the pressure grid.

This is not stored with the table, it is calculated by the abs_lookupAdapt method.

We are interpolating the cross sections in log(p). Storing this with the table avoids having to calculate it over and over again.

Definition at line 191 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccMC(), abs_lookupTestAccuracy(), Adapt(), and Extract().

◆ nls_pert

Vector GasAbsLookup::nls_pert
private

The vector of perturbations for the VMRs of the nonlinear species.

These apply to all the species that have been set as nonlinear_species.

Fractional units are used! Example: [0,.5,1,10,100], meaning from VMR 0 to 100 times the profile given in abs_vmrs. The reference value should normally be included, hence nls_pert should always include the value 1.

If nonlinear_species is an empty vector, it means that there are no nonlinear species. Then nls_pert must also be an empty vector.

Definition at line 235 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccMC(), abs_lookupTestAccuracy(), Adapt(), Extract(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ nonlinear_species

ArrayOfIndex GasAbsLookup::nonlinear_species
private

The species tags with non-linear treatment.

This is the list of species for which the H2O VMR should be varied when calculating the lookup
table. This must be inside the range of species. If nonlinear_species is an empty vector, it means that all species should be treated linearly. (No absorption for perturbed species profiles is stored.)

Definition at line 165 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccMC(), abs_lookupTestAccuracy(), Adapt(), Extract(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ p_grid

Vector GasAbsLookup::p_grid
private

The pressure grid for the table [Pa].

Must be sorted in decreasing order.

Definition at line 183 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccuracy(), Adapt(), Extract(), GetPgrid(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ species

ArrayOfArrayOfSpeciesTag GasAbsLookup::species
private

◆ t_pert

Vector GasAbsLookup::t_pert
private

The vector of temperature perturbations [K].

This can have any number of elements. Example: [-20,-10,0,10,20]. The actual temperatures for which absorption is stored are t_ref + t_pert for each level. The reference temperature itself should normally also be included, hence t_pert should always include 0. Must be sorted in ascending order!

The vector t_pert may be an empty vector (nelem()=0), which marks the special case that no interpolation in temperature should be done. If t_pert is not empty, you will get an error message if you try to extract absorption for temperatures outside the range of t_pert.

Definition at line 220 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccMC(), abs_lookupTestAccuracy(), Adapt(), Extract(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ t_ref

Vector GasAbsLookup::t_ref
private

The reference temperature profile [K].

This is a temperature profile. The dimension must be the same as p_grid.

Definition at line 206 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccMC(), abs_lookupTestAccuracy(), Adapt(), Extract(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ vmrs_ref

Matrix GasAbsLookup::vmrs_ref
private

The reference VMR profiles.

The VMRs for all species, associated with p_grid. Dimension: [n_species, n_p_grid]. These VMRs are needed to scale the absorption coefficient to other VMRs. We are never working with "absorption cross-sections", always with real absorption coefficients, so we have to remember the associated VMR values.

Physical unit: Absolute value.

Definition at line 201 of file gas_abs_lookup.h.

Referenced by abs_lookupTestAccMC(), abs_lookupTestAccuracy(), Adapt(), Extract(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().

◆ xsec

Tensor4 GasAbsLookup::xsec
private

Absorption cross sections.

Physical unit: m^2

Attention
We want to interpolate these beasts in pressure. To keep interpolation errors small it is better to store cross-sections, not coefficients. The absorption coefficient alpha is given by alpha = xsec * n, where n is the number density.

Dimension: [ a, b, c, d ]

Simplest case (no temperature perturbations, no vmr perturbations):
a = 1
b = n_species
c = n_f_grid
d = n_p_grid

Standard case (temperature perturbations, but no vmr perturbations):
a = n_t_pert
b = n_species
c = n_f_grid
d = n_p_grid

Full case (with temperature perturbations and vmr perturbations):
a = n_t_pert
b = n_species + n_nonlinear_species * ( n_nls_pert - 1 )
c = n_f_grid
d = n_p_grid

Note that the last three dimensions are identical to the dimensions of abs_per_tg in ARTS-1-0. This should simplify computation of the lookup table with the old ARTS version.

Definition at line 269 of file gas_abs_lookup.h.

Referenced by Adapt(), Extract(), nca_read_from_file(), nca_write_to_file(), xml_read_from_stream(), and xml_write_to_stream().


The documentation for this class was generated from the following files: