ARTS  2.3.1285(git:92a29ea9-dirty)
m_cia.cc
Go to the documentation of this file.
1 /* Copyright (C) 2012 Oliver Lemke <olemke@core-dump.info> and Stefan
2  Buehler <sbuehler@ltu.se>.
3 
4  This program is free software; you can redistribute it and/or modify it
5  under the terms of the GNU General Public License as published by the
6  Free Software Foundation; either version 2, or (at your option) any
7  later version.
8 
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with this program; if not, write to the Free Software
16  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
17  USA. */
18 
29 #include "absorption.h"
30 #include "arts.h"
31 #include "auto_md.h"
32 #include "cia.h"
33 #include "file.h"
34 #include "messages.h"
35 #include "physics_funcs.h"
36 #include "xml_io.h"
37 
38 extern const Numeric SPEED_OF_LIGHT;
39 
40 /* Workspace method: Doxygen documentation will be auto-generated */
41 void abs_xsec_per_speciesAddCIA( // WS Output:
42  ArrayOfMatrix& abs_xsec_per_species,
43  ArrayOfArrayOfMatrix& dabs_xsec_per_species_dx,
44  // WS Input:
45  const ArrayOfArrayOfSpeciesTag& abs_species,
46  const ArrayOfRetrievalQuantity& jacobian_quantities,
47  const ArrayOfIndex& abs_species_active,
48  const Vector& f_grid,
49  const Vector& abs_p,
50  const Vector& abs_t,
51  const Matrix& abs_vmrs,
52  const ArrayOfCIARecord& abs_cia_data,
53  // WS Generic Input:
54  const Numeric& T_extrapolfac,
55  const Index& robust,
56  // Verbosity object:
57  const Verbosity& verbosity) {
59 
60  {
61  // Check that all parameters that should have the number of tag
62  // groups as a dimension are consistent:
63  const Index n_tgs = abs_species.nelem();
64  const Index n_xsec = abs_xsec_per_species.nelem();
65  const Index nr_vmrs = abs_vmrs.nrows();
66  // const Index n_cia = abs_cia_data.nelem();
67 
68  if (n_tgs != n_xsec || n_tgs != nr_vmrs) // ||
69  // n_tgs != n_cia)
70  {
71  ostringstream os;
72  os << "The following variables must all have the same dimension:\n"
73  << "abs_species: " << n_tgs << "\n"
74  << "abs_xsec_per_species: " << n_xsec << "\n"
75  << "abs_vmrs.nrows: " << nr_vmrs << "\n";
76  // << "abs_cia_data: " << n_cia;
77  throw runtime_error(os.str());
78  }
79  }
80 
81  // Jacobian overhead START
82  /* NOTE: The calculations below are inefficient and could
83  be made much better by using interp in Extract to
84  return the derivatives as well. */
85  const bool do_jac = supports_CIA(jacobian_quantities);
86  const bool do_freq_jac = do_frequency_jacobian(jacobian_quantities);
87  const bool do_temp_jac = do_temperature_jacobian(jacobian_quantities);
88  Vector dfreq, dabs_t;
89  const Numeric df = frequency_perturbation(jacobian_quantities);
90  const Numeric dt = temperature_perturbation(jacobian_quantities);
91  const ArrayOfIndex jacobian_quantities_position =
92  equivalent_propmattype_indexes(jacobian_quantities);
93 
94  if (do_freq_jac) {
95  dfreq = f_grid;
96  dfreq += df;
97  }
98  if (do_temp_jac) {
99  dabs_t.resize(abs_t.nelem());
100  dabs_t = abs_t;
101  dabs_t += dt;
102  }
103  // Jacobian overhead END
104 
105  // Useful if there is no Jacobian to calculate
106  ArrayOfMatrix empty;
107 
108  {
109  // Check that all parameters that should have the the dimension of p_grid
110  // are consistent:
111  const Index n_p = abs_p.nelem();
112  const Index n_t = abs_t.nelem();
113  const Index nc_vmrs = abs_vmrs.ncols();
114 
115  if (n_p != n_t || n_p != nc_vmrs) {
116  ostringstream os;
117  os << "The following variables must all have the same dimension:\n"
118  << "abs_p: " << n_p << "\n"
119  << "abs_t: " << n_t << "\n"
120  << "abs_vmrs.ncols: " << nc_vmrs;
121  throw runtime_error(os.str());
122  }
123  }
124 
125  // Allocate a vector with dimension frequencies for constructing our
126  // cross-sections before adding them (more efficient to allocate this here
127  // outside of the loops)
128  Vector xsec_temp(f_grid.nelem());
129 
130  // Jacobian vectors START
131  Vector dxsec_temp_dT;
132  Vector dxsec_temp_dF;
133  if (do_freq_jac) dxsec_temp_dF.resize(f_grid.nelem());
134  if (do_temp_jac) dxsec_temp_dT.resize(f_grid.nelem());
135  // Jacobian vectors END
136 
137  // Loop over CIA data sets.
138  // Index ii loops through the outer array (different tag groups),
139  // index s through the inner array (different tags within each goup).
140  for (Index ii = 0; ii < abs_species_active.nelem(); ii++) {
141  const Index i = abs_species_active[ii];
142 
143  for (Index s = 0; s < abs_species[i].nelem(); s++) {
144  const SpeciesTag& this_species = abs_species[i][s];
145 
146  // Check if this is a CIA tag
147  if (this_species.Type() != SpeciesTag::TYPE_CIA) continue;
148 
149  // Get convenient references of this CIA data record and this
150  // absorption cross-section record:
151  Index this_cia_index = cia_get_index(
152  abs_cia_data, this_species.Species(), this_species.CIASecond());
153 
154  assert(this_cia_index != -1);
155 
156  const CIARecord& this_cia = abs_cia_data[this_cia_index];
157  Matrix& this_xsec = abs_xsec_per_species[i];
158 
159  if (out2.sufficient_priority()) {
160  // Some nice output to out2:
161  out2 << " CIA Species found: " + this_species.Name() + "\n";
162  }
163 
164  // Check that the dimension of this_xsec is
165  // consistent with abs_p and f_grid.
166  if (this_xsec.nrows() != f_grid.nelem()) {
167  ostringstream os;
168  os << "Wrong dimension of abs_xsec_per_species.nrows for species " << i
169  << ":\n"
170  << "should match f_grid (" << f_grid.nelem() << ") but is "
171  << this_xsec.nrows() << ".";
172  throw runtime_error(os.str());
173  }
174  if (this_xsec.ncols() != abs_p.nelem()) {
175  ostringstream os;
176  os << "Wrong dimension of abs_xsec_per_species.ncols for species " << i
177  << ":\n"
178  << "should match abs_p (" << abs_p.nelem() << ") but is "
179  << this_xsec.ncols() << ".";
180  throw runtime_error(os.str());
181  }
182 
183  // Find out index of VMR for the second CIA species.
184  // (The index for the first species is simply i.)
185  Index i_sec = find_first_species_tg(abs_species, this_cia.Species(1));
186 
187  // Catch the case that the VMR for the second species does not exist:
188  if (i_sec < 0) {
189  ostringstream os;
190  os << "VMR profile for second species in CIA species pair does not exist.\n"
191  << "Tag " << this_species.Name() << " needs a VMR profile of "
192  << this_cia.MoleculeName(1) << "!";
193  throw runtime_error(os.str());
194  }
195 
196  // Loop over pressure:
197  for (Index ip = 0; ip < abs_p.nelem(); ip++) {
198  // Get the binary absorption cross sections from the CIA data:
199  try {
200  this_cia.Extract(xsec_temp,
201  f_grid,
202  abs_t[ip],
203  this_species.CIADataset(),
204  T_extrapolfac,
205  robust,
206  verbosity);
207  if (do_freq_jac)
208  this_cia.Extract(dxsec_temp_dF,
209  dfreq,
210  abs_t[ip],
211  this_species.CIADataset(),
212  T_extrapolfac,
213  robust,
214  verbosity);
215  if (do_temp_jac)
216  this_cia.Extract(dxsec_temp_dT,
217  f_grid,
218  dabs_t[ip],
219  this_species.CIADataset(),
220  T_extrapolfac,
221  robust,
222  verbosity);
223  } catch (const std::runtime_error& e) {
224  ostringstream os;
225  os << "Problem with CIA species " << this_species.Name() << ":\n"
226  << e.what();
227  throw runtime_error(os.str());
228  }
229 
230  // We have to multiply with the number density of the second CIA species.
231  // We do not have to multiply with the first, since we still
232  // want to return a (unary) absorption cross-section, not an
233  // absorption coefficient.
234 
235  // Calculate number density from pressure and temperature.
236  const Numeric n =
237  abs_vmrs(i_sec, ip) * number_density(abs_p[ip], abs_t[ip]);
238 
239  if (!do_jac) {
240  xsec_temp *= n;
241  // Add to result variable:
242  this_xsec(joker, ip) += xsec_temp;
243  } else {
244  const Numeric dn_dT =
245  abs_vmrs(i_sec, ip) * dnumber_density_dt(abs_p[ip], abs_t[ip]);
246 
247  for (Index iv = 0; iv < xsec_temp.nelem(); iv++) {
248  this_xsec(iv, ip) += n * xsec_temp[iv];
249  for (Index iq = 0; iq < jacobian_quantities_position.nelem();
250  iq++) {
252  jacobian_quantities[jacobian_quantities_position[iq]]))
253  dabs_xsec_per_species_dx[i][iq](iv, ip) +=
254  n * (dxsec_temp_dF[iv] - xsec_temp[iv]) / df;
255  else if (jacobian_quantities[jacobian_quantities_position[iq]] ==
257  dabs_xsec_per_species_dx[i][iq](iv, ip) +=
258  n * (dxsec_temp_dT[iv] - xsec_temp[iv]) / dt +
259  xsec_temp[iv] * dn_dT;
260  else if (species_match(jacobian_quantities
261  [jacobian_quantities_position[iq]],
262  this_species.BathSpecies()))
263  dabs_xsec_per_species_dx[i][iq](iv, ip) +=
264  number_density(abs_p[ip], abs_t[ip]) * xsec_temp[iv];
265  }
266  }
267  }
268  }
269  }
270  }
271 }
272 
273 /* Workspace method: Doxygen documentation will be auto-generated */
274 void CIARecordReadFromFile( // WS GOutput:
275  CIARecord& cia_record,
276  // WS Generic Input:
277  const String& species_tag,
278  const String& filename,
279  // Verbosity object:
280  const Verbosity& verbosity) {
281  SpeciesTag species(species_tag);
282 
283  if (species.Type() != SpeciesTag::TYPE_CIA) {
284  ostringstream os;
285  os << "Invalid species tag " << species_tag << ".\n"
286  << "This is not recognized as a CIA type.\n";
287  throw std::runtime_error(os.str());
288  }
289 
290  cia_record.SetSpecies(species.Species(), species.CIASecond());
291  cia_record.ReadFromCIA(filename, verbosity);
292 }
293 
294 /* Workspace method: Doxygen documentation will be auto-generated */
295 void abs_cia_dataAddCIARecord( // WS Output:
296  ArrayOfCIARecord& abs_cia_data,
297  // WS GInput:
298  const CIARecord& cia_record,
299  const Index& clobber,
300  // WS Input:
301  const Verbosity&) {
302  Index cia_index =
303  cia_get_index(abs_cia_data, cia_record.Species(0), cia_record.Species(1));
304  if (cia_index == -1)
305  abs_cia_data.push_back(cia_record);
306  else if (clobber)
307  abs_cia_data[cia_index] = cia_record;
308  else
309  abs_cia_data[cia_index].AppendDataset(cia_record);
310 }
311 
312 /* Workspace method: Doxygen documentation will be auto-generated */
313 void abs_cia_dataReadFromCIA( // WS Output:
314  ArrayOfCIARecord& abs_cia_data,
315  // WS Input:
316  const ArrayOfArrayOfSpeciesTag& abs_species,
317  const String& catalogpath,
318  const Verbosity& verbosity) {
319  ArrayOfString subfolders;
320  subfolders.push_back("Main-Folder/");
321  subfolders.push_back("Alternate-Folder/");
322 
323  abs_cia_data.resize(0);
324 
325  // Loop species tag groups to find CIA tags.
326  // Index sp loops through the tag groups, index iso through the tags within
327  // each group. Despite the name, iso does not denote the isotope!
328  for (Index sp = 0; sp < abs_species.nelem(); sp++) {
329  for (Index iso = 0; iso < abs_species[sp].nelem(); iso++) {
330  if (abs_species[sp][iso].Type() != SpeciesTag::TYPE_CIA) continue;
331 
332  ArrayOfString cia_names;
333 
334  Index cia_index = cia_get_index(abs_cia_data,
335  abs_species[sp][iso].Species(),
336  abs_species[sp][iso].CIASecond());
337 
338  // If cia_index is not -1, we have already read this datafile earlier
339  if (cia_index != -1) continue;
340 
341  cia_names.push_back(
342  species_name_from_species_index(abs_species[sp][iso].Species()) +
343  "-" +
344  species_name_from_species_index(abs_species[sp][iso].CIASecond()));
345 
346  cia_names.push_back(
347  species_name_from_species_index(abs_species[sp][iso].CIASecond()) +
348  "-" +
349  species_name_from_species_index(abs_species[sp][iso].Species()));
350 
351  ArrayOfString checked_dirs;
352 
353  bool found = false;
354  for (Index fname = 0; !found && fname < cia_names.nelem(); fname++) {
355  String cia_name = cia_names[fname];
356 
357  for (Index dir = 0; !found && dir < subfolders.nelem(); dir++) {
358  ArrayOfString files;
359  checked_dirs.push_back(catalogpath + "/" + subfolders[dir] +
360  cia_name + "/");
361  try {
362  list_directory(files, *(checked_dirs.end() - 1));
363  } catch (const std::runtime_error& e) {
364  continue;
365  }
366 
367  for (Index i = files.nelem() - 1; i >= 0; i--) {
368  if (files[i].find(cia_name) != 0 ||
369  files[i].rfind(".cia") != files[i].length() - 4) {
370  files.erase(files.begin() + i);
371  }
372  }
373  if (files.nelem()) {
374  CIARecord ciar;
375 
376  found = true;
377  String catfile = *(checked_dirs.end() - 1) + files[0];
378 
379  ciar.SetSpecies(abs_species[sp][iso].Species(),
380  abs_species[sp][iso].CIASecond());
381  ciar.ReadFromCIA(catfile, verbosity);
382 
383  abs_cia_data.push_back(ciar);
384  }
385  }
386  }
387 
388  if (!found) {
389  ostringstream os;
390  os << "Error: No data file found for CIA species " << cia_names[0]
391  << endl
392  << "Looked in directories: " << checked_dirs;
393 
394  throw runtime_error(os.str());
395  }
396  }
397  }
398 }
399 
400 /* Workspace method: Doxygen documentation will be auto-generated */
401 void abs_cia_dataReadFromXML( // WS Output:
402  ArrayOfCIARecord& abs_cia_data,
403  // WS Input:
404  const ArrayOfArrayOfSpeciesTag& abs_species,
405  const String& filename,
406  const Verbosity& verbosity) {
407  xml_read_from_file(filename, abs_cia_data, verbosity);
408 
409  // Check that all CIA tags from abs_species are present in the
410  // XML file
411 
412  vector<String> missing_tags;
413 
414  // Loop species tag groups to find CIA tags.
415  // Index sp loops through the tag groups, index iso through the tags within
416  // each group. Despite the name, iso does not denote the isotope!
417  for (Index sp = 0; sp < abs_species.nelem(); sp++) {
418  for (Index iso = 0; iso < abs_species[sp].nelem(); iso++) {
419  if (abs_species[sp][iso].Type() != SpeciesTag::TYPE_CIA) continue;
420 
421  Index cia_index = cia_get_index(abs_cia_data,
422  abs_species[sp][iso].Species(),
423  abs_species[sp][iso].CIASecond());
424 
425  // If cia_index is -1, this CIA tag was not present in the input file
426  if (cia_index == -1) {
427  missing_tags.push_back(
428  species_name_from_species_index(abs_species[sp][iso].Species()) +
429  "-" +
430  species_name_from_species_index(abs_species[sp][iso].CIASecond()));
431  }
432  }
433  }
434 
435  if (missing_tags.size()) {
436  ostringstream os;
437  bool first = true;
438 
439  os << "Error: The following CIA tag(s) are missing in input file: ";
440  for (size_t i = 0; i < missing_tags.size(); i++) {
441  if (!first)
442  os << ", ";
443  else
444  first = false;
445  os << missing_tags[i];
446  }
447  throw runtime_error(os.str());
448  }
449 }
450 
451 /* Workspace method: Doxygen documentation will be auto-generated */
452 void CIAInfo( // Generic Input:
453  const String& catalogpath,
454  const ArrayOfString& cia_tags,
455  const Verbosity& verbosity) {
456  CREATE_OUT1;
457 
458  ArrayOfArrayOfSpeciesTag species_tags;
459 
460  for (Index i = 0; i < cia_tags.nelem(); i++) {
461  ArrayOfSpeciesTag this_species_tag;
462 
463  ArrayOfString species_names;
464 
465  cia_tags[i].split(species_names, "-");
466 
467  if (species_names.nelem() != 2) {
468  ostringstream os;
469  os << "ERROR: Cannot parse CIA tag: " << cia_tags[i];
470  throw runtime_error(os.str());
471  }
472 
473  this_species_tag.push_back(
474  SpeciesTag(species_names[0] + "-CIA-" + species_names[1] + "-0"));
475 
476  species_tags.push_back(this_species_tag);
477  }
478 
479  ArrayOfCIARecord cia_data;
480 
481  abs_cia_dataReadFromCIA(cia_data, species_tags, catalogpath, verbosity);
482 
483  Print(cia_data, 1, verbosity);
484 }
void iso(Array< IsotopologueRecord >::iterator &ii, String name, const ArrayOfNumeric &coeff, const ArrayOfNumeric &temp_range, const Index &coefftype)
Initialize isotopologue and move iterator to next one.
INDEX Index
The type to use for all integer numbers and indices.
Definition: matpack.h:39
ArrayOfIndex equivalent_propmattype_indexes(const ArrayOfRetrievalQuantity &js)
Returns a list of positions for the derivatives in Propagation Matrix calculations.
Definition: jacobian.cc:1099
QuantumIdentifier::QType Index LowerQuantumNumbers Index Numeric CIASecond
Header file for work with HITRAN collision induced absorption (CIA).
void Print(Workspace &ws, const Agenda &x, const Index &level, const Verbosity &verbosity)
Definition: m_general.cc:76
Index nelem() const
Number of elements.
Definition: array.h:195
QuantumIdentifier::QType Index LowerQuantumNumbers Species
Index CIADataset() const
CIA dataset index inside this CIA file.
Index CIASecond() const
Species index of the 2nd CIA species.
String Name() const
Return the full name of the tag.
Declarations having to do with the four output streams.
void abs_cia_dataReadFromXML(ArrayOfCIARecord &abs_cia_data, const ArrayOfArrayOfSpeciesTag &abs_species, const String &filename, const Verbosity &verbosity)
WORKSPACE METHOD: abs_cia_dataReadFromXML.
Definition: m_cia.cc:401
The Vector class.
Definition: matpackI.h:860
void CIARecordReadFromFile(CIARecord &cia_record, const String &species_tag, const String &filename, const Verbosity &verbosity)
WORKSPACE METHOD: CIARecordReadFromFile.
Definition: m_cia.cc:274
Index Species() const
Molecular species index.
void CIAInfo(const String &catalogpath, const ArrayOfString &cia_tags, const Verbosity &verbosity)
WORKSPACE METHOD: CIAInfo.
Definition: m_cia.cc:452
Index Type() const
Return the type of this tag.
Numeric frequency_perturbation(const ArrayOfRetrievalQuantity &js) noexcept
Returns the frequency perturbation if it exists.
Definition: jacobian.cc:1312
void ReadFromCIA(const String &filename, const Verbosity &verbosity)
Read CIA catalog file.
Definition: cia.cc:316
const Numeric SPEED_OF_LIGHT
This file contains basic functions to handle XML data files.
This file contains basic functions to handle ASCII files.
Numeric number_density(const Numeric &p, const Numeric &t)
number_density
Index nelem() const
Returns the number of elements.
Definition: matpackI.cc:51
String species_name_from_species_index(const Index spec_ind)
Return species name for given species index.
Definition: absorption.cc:569
void Extract(VectorView result, ConstVectorView f_grid, const Numeric &temperature, const Index &dataset, const Numeric &T_extrapolfac, const Index &robust, const Verbosity &verbosity) const
Vector version of extract.
Definition: cia.cc:249
bool is_frequency_parameter(const RetrievalQuantity &t) noexcept
Returns if the Retrieval quantity is a frequency parameter in propagation matrix calculations.
Definition: jacobian.cc:1120
bool supports_CIA(const ArrayOfRetrievalQuantity &js)
Returns if the array supports CIA derivatives.
Definition: jacobian.cc:1200
Index ncols() const
Returns the number of columns.
Definition: matpackI.cc:432
The global header file for ARTS.
void abs_cia_dataAddCIARecord(ArrayOfCIARecord &abs_cia_data, const CIARecord &cia_record, const Index &clobber, const Verbosity &)
WORKSPACE METHOD: abs_cia_dataAddCIARecord.
Definition: m_cia.cc:295
_CS_string_type str() const
Definition: sstream.h:491
void list_directory(ArrayOfString &files, String dirname)
Return list of files in directory.
Definition: file.cc:543
#define CREATE_OUTS
Definition: messages.h:209
A tag group can consist of the sum of several of these.
#define CREATE_OUT1
Definition: messages.h:205
Index find_first_species_tg(const ArrayOfArrayOfSpeciesTag &tgs, const Index &spec)
Find first occurrence of species in tag groups.
Numeric temperature_perturbation(const ArrayOfRetrievalQuantity &js) noexcept
Returns the temperature perturbation if it exists.
Definition: jacobian.cc:1304
void xml_read_from_file(const String &filename, T &type, const Verbosity &verbosity)
Reads data from XML file.
Definition: xml_io.cc:901
const Joker joker
Numeric dnumber_density_dt(const Numeric &p, const Numeric &t)
dnumber_density_dT
void abs_cia_dataReadFromCIA(ArrayOfCIARecord &abs_cia_data, const ArrayOfArrayOfSpeciesTag &abs_species, const String &catalogpath, const Verbosity &verbosity)
WORKSPACE METHOD: abs_cia_dataReadFromCIA.
Definition: m_cia.cc:313
NUMERIC Numeric
The type to use for all floating point numbers.
Definition: matpack.h:33
The Matrix class.
Definition: matpackI.h:1193
void abs_xsec_per_speciesAddCIA(ArrayOfMatrix &abs_xsec_per_species, ArrayOfArrayOfMatrix &dabs_xsec_per_species_dx, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfRetrievalQuantity &jacobian_quantities, const ArrayOfIndex &abs_species_active, const Vector &f_grid, const Vector &abs_p, const Vector &abs_t, const Matrix &abs_vmrs, const ArrayOfCIARecord &abs_cia_data, const Numeric &T_extrapolfac, const Index &robust, const Verbosity &verbosity)
WORKSPACE METHOD: abs_xsec_per_speciesAddCIA.
Definition: m_cia.cc:41
Declarations required for the calculation of absorption coefficients.
bool do_temperature_jacobian(const ArrayOfRetrievalQuantity &js) noexcept
Returns if the array wants the temperature derivative.
Definition: jacobian.cc:1279
bool species_match(const RetrievalQuantity &rq, const ArrayOfSpeciesTag &ast)
Returns if the Retrieval quantity is VMR derivative for all the species in the species tags...
Definition: jacobian.cc:1244
This can be used to make arrays out of anything.
Definition: array.h:40
void SetSpecies(const Index first, const Index second)
Set CIA species.
Definition: cia.h:147
void resize(Index n)
Resize function.
Definition: matpackI.cc:404
String MoleculeName(const Index i) const
Return each molecule name (as a string) that is associated with this CIARecord.
Definition: cia.cc:277
CIA data for a single pair of molecules.
Definition: cia.h:67
Index cia_get_index(const ArrayOfCIARecord &cia_data, const Index sp1, const Index sp2)
Get the index in cia_data for the two given species.
Definition: cia.cc:237
Index Species(const Index i) const
Return CIA species index.
Definition: cia.h:96
bool do_frequency_jacobian(const ArrayOfRetrievalQuantity &js) noexcept
Returns if the array wants a frequency derivative.
Definition: jacobian.cc:1296
This file contains declerations of functions of physical character.
Index nrows() const
Returns the number of rows.
Definition: matpackI.cc:429
Index BathSpecies() const
Molecular species index.