ARTS 2.5.9 (git: 825fa5f2)
m_refraction.cc
Go to the documentation of this file.
1/* Copyright (C) 2003-2012 Patrick Eriksson <Patrick.Eriksson@chalmers.se>
2
3 This program is free software; you can redistribute it and/or modify it
4 under the terms of the GNU General Public License as published by the
5 Free Software Foundation; either version 2, or (at your option) any
6 later version.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
16 USA. */
17
18/*===========================================================================
19 === File description
20 ===========================================================================*/
21
33/*===========================================================================
34 === External declarations
35 ===========================================================================*/
36
37#include <cmath>
38#include "arts_constants.h"
39#include "species_tags.h"
40#include "absorption.h"
41#include "arts.h"
42#include "check_input.h"
43#include "math_funcs.h"
44#include "matpackI.h"
45#include "messages.h"
46#include "physics_funcs.h"
47#include "refraction.h"
48#include "special_interp.h"
49
52inline constexpr Numeric PI=Constant::pi;
55
56/*===========================================================================
57 === WSMs for refr_index_air
58 ===========================================================================*/
59
60/* Workspace method: Doxygen documentation will be auto-generated */
62 Numeric& refr_index_air_group,
63 const Vector& f_grid,
64 const ArrayOfArrayOfSpeciesTag& abs_species,
65 const Vector& rtp_vmr,
66 const Index& demand_vmr_value,
67 const Verbosity&) {
68 // The expression used is found in many textbooks, e.g. Rybicki and Lightman
69 // (1979). Note that the refractive index corresponds to the phase velocity.
70
71 static const Numeric k = ELECTRON_CHARGE * ELECTRON_CHARGE /
73
74 Numeric edensity = 0;
75
76 Index ife = -1;
77 for (Index sp = 0; sp < abs_species.nelem() && ife < 0; sp++) {
78 if (abs_species[sp].FreeElectrons()) {
79 ife = sp;
80 }
81 }
82
83 if (ife < 0) {
84 if (demand_vmr_value) {
85 throw runtime_error(
86 "Free electrons not found in *abs_species* and "
87 "contribution to refractive index can not be calculated.");
88 }
89 } else {
90 edensity = rtp_vmr[ife];
91
92 if (edensity > 0) {
93 // Check that lowest frequency not too low
94 // Limit at 100 GHz follows Hartmann and Leitinger, Range errors due
95 // to ionospheric and tropospheric effects for signal frequencies
96 // above 100 HMHz, Bull. Goed., 1984.
97 if (f_grid[0] < 100e6) {
98 throw runtime_error(
99 "All frequencies must be >= 100 MHz, but "
100 "this is not the case.");
101 }
102 if (edensity * k / (f_grid[0] * f_grid[0]) > 0.25) {
103 ostringstream os;
104 os << "All frequencies must at least be twice the plasma frequency.\n"
105 << "For this particular point, the plasma frequency is: "
106 << sqrt(edensity * k) / 1e6 << " MHz.";
107 throw runtime_error(os.str());
108 }
109
110 const Numeric f = (f_grid[0] + last(f_grid)) / 2.0;
111 const Numeric a = edensity * k / (f * f);
112 const Numeric n = sqrt(1 - a);
113
114 refr_index_air += n - 1;
115 refr_index_air_group += 1 / n - 1;
116 }
117 }
118}
119
120/* Workspace method: Doxygen documentation will be auto-generated */
122 Numeric& refr_index_air_group,
123 const Numeric& rtp_pressure,
124 const Numeric& rtp_temperature,
125 const Verbosity&) {
126 static const Numeric bn0 = 1.000272620045304;
127 static const Numeric bn02 = bn0 * bn0;
128 static const Numeric bk = 288.16 * (bn02 - 1.0) / (1013.25 * (bn02 + 2.0));
129
130 // Pa -> hPa
131 const Numeric n = sqrt((2.0 * bk * rtp_pressure / 100.0 + rtp_temperature) /
132 (rtp_temperature - bk * rtp_pressure / 100.0)) -
133 1;
134
135 refr_index_air += n;
136 refr_index_air_group += n;
137}
138
139/* Workspace method: Doxygen documentation will be auto-generated */
141 Numeric& refr_index_air_group,
142 const Numeric& rtp_pressure,
143 const Numeric& rtp_temperature,
144 const Vector& rtp_vmr,
145 const ArrayOfArrayOfSpeciesTag& abs_species,
146 const Numeric& k1,
147 const Numeric& k2,
148 const Numeric& k3,
149 const Verbosity&) {
150 if (abs_species.nelem() != rtp_vmr.nelem())
151 throw runtime_error(
152 "The number of tag groups differ between "
153 "*rtp_vmr* and *abs_species*.");
154
155 Index firstH2O = find_first_species(
156 abs_species, Species::fromShortName("H2O"));
157
158 Numeric e;
159 if (firstH2O < 0)
160 //throw runtime_error(
161 // "Water vapour is a required (must be a tag group in *abs_species*)." );
162 e = 0.;
163 else
164 e = rtp_pressure * rtp_vmr[firstH2O];
165
166 const Numeric n =
167 (k1 * (rtp_pressure - e) + (k2 + k3 / rtp_temperature) * e) /
168 rtp_temperature;
169
170 refr_index_air += n;
171 refr_index_air_group += n;
172}
173
174/* Workspace method: Doxygen documentation will be auto-generated */
176 Numeric& refr_index_air,
177 Numeric& refr_index_air_group,
178 const Numeric& rtp_pressure,
179 const Numeric& rtp_temperature,
180 const Vector& rtp_vmr,
181 const ArrayOfArrayOfSpeciesTag& abs_species,
182 const Verbosity&) {
183 //FIXME: Shall n be rescaled for sum(VMW)=1? Doing so now, but is it correct?
184 // Short sensitivity test (tropical, dry air, ~11km tanh) shows that
185 // vmr-normalized n fits significantly better (dtanh~0.5m) than
186 // non-normalized one (dtanh~5m).
187
188 /*
189 for now, hard-coding the reference refindices and refT/p. could make that
190 some re-setabel parameters (like iso ratios... also regarding storing them in
191 file/data struct per species)
192*/
193 const Numeric p0 = 760. * TORR2PA;
194 const Numeric T0 = 273.15;
195
196 // Number of refractive species:
197 const Index nrs = 6;
198
199 // This is hardwired here and quite primitive, but should do the job.
200 // Set refractive index species names.
201 ArrayOfString ref_spec_names(nrs);
202 ref_spec_names[0] = "N2";
203 ref_spec_names[1] = "O2";
204 ref_spec_names[2] = "CO2";
205 ref_spec_names[3] = "H2";
206 ref_spec_names[4] = "He";
207 ref_spec_names[5] = "H2O";
208
209 // Set reference refractive indices
210 // Values from Newell and Baird, 1965
211 Vector ref_n(nrs);
212 ref_n[0] = 293.81e-6;
213 ref_n[1] = 266.95e-6;
214 ref_n[2] = 495.16e-6;
215 ref_n[3] = 135.77e-6;
216 ref_n[4] = 34.51e-6;
217 // value for H2O from H2O contribution according to refr_index_airMicrowavesEarth
218 // at reference conditions
219 // that is: n_H2O = p_ref/T_ref * (k2 + k3/Tref)
220 ref_n[5] = 5338.89e-6;
221
222 // Checks
223 if (abs_species.nelem() != rtp_vmr.nelem())
224 throw runtime_error(
225 "The number of tag groups differ between "
226 "*rtp_vmr* and *abs_species*.");
227 /*
228 further checks:
229 ? non-neg T
230 ?
231*/
232
233 // Data management
234 // Find the location of all refractive species in abs_species. Set to -1 if
235 // not found. The length of array ref_spec_locations is the number of
236 // considered refractive species (in this method: N2, O2, CO2, H2, He).
237 // The value means:
238 // -1 = not in abs_species
239 // N = species is number N in abs_species
240
241 //Can't use this one as it inside gets the broadening species names and
242 //number. Also, we would have to make a workaround for this_species. So,
243 //instead we use a modified version of this function directly included here.
244 /*find_broad_spec_locations(ref_spec_locations,
245 abs_species,
246 this_species);*/
247
248 ArrayOfIndex ref_spec_locations(nrs);
249
250 // Loop over all broadening species and see if we can find them in abs_species.
251 for (Index i = 0; i < nrs; ++i) {
252 // Find associated internal species index (we do the lookup by index, not by name).
253 const Species::Species isi = Species::fromShortName(ref_spec_names[i]);
254
255 // Find position of broadening species isi in abs_species. The called
256 // function returns -1 if not found, which is already the correct
257 // treatment for this case that we also want here.
258 ref_spec_locations[i] = find_first_species(abs_species, isi);
259 }
260
261 // The actual calculation
262 // N_tot = sum (Nref_i * p_i/p_0 * T0/T)
263 // = sum (Nref_i * vmr_i*p/p_0 * T0/T)
264 // = p/p_0 * T0/T * sum ( Nref_i * vmr_i)
265
266 const Numeric ratioT = T0 / rtp_temperature;
267 const Numeric ratiop = rtp_pressure / p0;
268
269 Numeric ref_spec_vmr_sum = 0.;
270 Numeric n = 0.;
271
272 // Add up refractive species, where available:
273 for (Index i = 0; i < nrs; ++i) {
274 if (ref_spec_locations[i] >= 0) {
275 // Add to VMR sum:
276 ref_spec_vmr_sum += rtp_vmr[ref_spec_locations[i]];
277
278 // refraction contribution (excluding the constant factor p/p_0 * T0/T):
279 n += ref_n[i] * rtp_vmr[ref_spec_locations[i]];
280 }
281 }
282
283 /*
284 if ( abs(ref_spec_vmr_sum-1) > 0.1 )
285 {
286 ostringstream os;
287 os << "Error: The total VMR of all your defined refractive\n"
288 << "species is " << ref_spec_vmr_sum
289 << ", more than 10% " << "different from 1.\n";
290 throw runtime_error(os.str());
291 }
292 */
293
294 // normalize refractive index with the considered total VMR:
295 if (ref_spec_vmr_sum != 0) n /= ref_spec_vmr_sum;
296
297 // now applying the constant factor p/p_0 * T0/T:
298 n *= (ratioT * ratiop);
299
300 refr_index_air += n;
301 refr_index_air_group += n;
302}
303
305 const Vector& data_f_grid,
306 const Vector& data_t_grid,
307 const Vector& density_water, //Gin
308 const Index& only_valid_range, //Gin
309 const Verbosity&) {
310 const Index N_f = data_f_grid.nelem();
311 const Index N_t = data_t_grid.nelem();
312 const Index N_d = density_water.nelem();
313
314 if (N_d > 1)
315 ARTS_USER_ERROR_IF(N_d != N_f, R"--(
316density_water must be a Vector of size 1 or must be of the size of *data_t_grid*
317)--")
318
319 complex_refr_index.resize(N_f, N_t, 2);
320 complex_refr_index.set_grid_name(0, "Frequency");
321 complex_refr_index.set_grid(0, data_f_grid);
322 complex_refr_index.set_grid_name(1, "Temperature");
323 complex_refr_index.set_grid(1, data_t_grid);
324 complex_refr_index.set_grid_name(2, "Complex");
325 complex_refr_index.set_grid(2, {"real", "imaginary"});
326
327 Numeric refractive_index;
328 Numeric density = density_water[0];
329
330 for (Index i_f = 0; i_f < N_f; i_f++) {
331 for (Index i_t = 0; i_t < N_t; i_t++) {
332 if (density_water.nelem() > 1 && i_t > 0) density = density_water[i_t];
333
335 only_valid_range,
336 data_f_grid[i_f],
337 data_t_grid[i_t],
338 density);
339
340 complex_refr_index.data(i_f, i_t, 0) = refractive_index;
341 }
342 }
343 complex_refr_index.data(joker, joker, 1) = 0.;
344}
345
346/*===========================================================================
347 === WSMs for complex_refr_index
348 ===========================================================================*/
349
350/* Workspace method: Doxygen documentation will be auto-generated */
352 const Numeric& refr_index_real,
353 const Numeric& refr_index_imag,
354 const Verbosity&) {
355 complex_refr_index.resize(1, 1, 2);
356 complex_refr_index.set_grid_name(0, "Frequency");
357 complex_refr_index.set_grid(0, Vector(1, 0));
358 complex_refr_index.set_grid_name(1, "Temperature");
359 complex_refr_index.set_grid(1, Vector(1, 0));
360 complex_refr_index.set_grid_name(2, "Complex");
361 complex_refr_index.set_grid(2, {"real", "imaginary"});
362
363 complex_refr_index.data(joker, joker, 0) = refr_index_real;
364 complex_refr_index.data(joker, joker, 1) = refr_index_imag;
365}
366
367/* Workspace method: Doxygen documentation will be auto-generated */
369 const Vector& f_grid,
370 const Vector& t_grid,
371 const Verbosity& verbosity) {
372 if (min(t_grid) < 250) {
374 out1 << "WARNING! The minimum chosen temperature is " << min(t_grid)
375 << ". Temperatures below 250 K may lead to incorrect values of"
376 " *complex_refr_index*.\n";
377 }
378
379 const Index nf = f_grid.nelem();
380 const Index nt = t_grid.nelem();
381
382 complex_refr_index.resize(nf, nt, 2);
383 complex_refr_index.set_grid_name(0, "Frequency");
384 complex_refr_index.set_grid(0, f_grid);
385 complex_refr_index.set_grid_name(1, "Temperature");
386 complex_refr_index.set_grid(1, t_grid);
387 complex_refr_index.set_grid_name(2, "Complex");
388 complex_refr_index.set_grid(2, {"real", "imaginary"});
389
390 Matrix complex_n;
391 for (Index t = 0; t < nt; ++t) {
392 complex_n_water_liebe93(complex_n, f_grid, t_grid[t]);
393 complex_refr_index.data(joker, t, joker) = complex_n;
394 }
395}
396
397/* Workspace method: Doxygen documentation will be auto-generated */
399 const Vector& f_grid,
400 const Vector& t_grid,
401 const Verbosity&) {
402 const Index nf = f_grid.nelem();
403 const Index nt = t_grid.nelem();
404
405 // Frequency must be between 10MHz and 3THz
406 const Numeric f_min = 10e6;
407 const Numeric f_max = 3e12;
409 "min of complex_refr_index f_grid", min(f_grid), f_min, f_max);
411 "max of complex_refr_index f_grid", max(f_grid), f_min, f_max);
412
413 // Temperature must be between 213.16 to 272.16 K
414 const Numeric t_min = 20.;
415 const Numeric t_max = 280.;
417 "min of complex_refr_index t_grid", min(t_grid), t_min, t_max);
419 "max of complex_refr_index t_grid", max(t_grid), t_min, t_max);
420
421 complex_refr_index.resize(nf, nt, 2);
422 complex_refr_index.set_grid_name(0, "Frequency");
423 complex_refr_index.set_grid(0, f_grid);
424 complex_refr_index.set_grid_name(1, "Temperature");
425 complex_refr_index.set_grid(1, t_grid);
426 complex_refr_index.set_grid_name(2, "Complex");
427 complex_refr_index.set_grid(2, {"real", "imaginary"});
428
429 Matrix complex_n;
430 for (Index i_t = 0; i_t < nt; ++i_t) {
431 complex_n_ice_matzler06(complex_n, f_grid, t_grid[i_t]);
432 complex_refr_index.data(joker, i_t, joker) = complex_n;
433 }
434}
435
436/* Workspace method: Doxygen documentation will be auto-generated */
438 const Vector& f_grid,
439 const Vector& refr_index_real,
440 const Vector& refr_index_imag,
441 const Numeric& temperature,
442 const Verbosity&) {
443 chk_vector_length("f_grid","refr_index_real",f_grid,refr_index_real);
444 chk_vector_length("f_grid","refr_index_imag",f_grid,refr_index_imag);
445
446 const Index nf = f_grid.nelem();
447
448 complex_refr_index.resize(nf, 1, 2);
449 complex_refr_index.set_grid_name(0, "Frequency");
450 complex_refr_index.set_grid(0, f_grid);
451 complex_refr_index.set_grid_name(1, "Temperature");
452 complex_refr_index.set_grid(1, Vector(1, temperature));
453 complex_refr_index.set_grid_name(2, "Complex");
454 complex_refr_index.set_grid(2, {"real", "imaginary"});
455
456 complex_refr_index.data(joker, 0, 0) = refr_index_real;
457 complex_refr_index.data(joker, 0, 1) = refr_index_imag;
458}
459
460#ifdef ENABLE_REFICE
461/* Workspace method: Doxygen documentation will be auto-generated */
462void complex_refr_indexIceWarren84(GriddedField3& complex_refr_index,
463 const Vector& f_grid,
464 const Vector& t_grid,
465 const Verbosity&) {
467 const Index nf = f_grid.nelem();
468 const Index nt = t_grid.nelem();
469
470 // Frequency must be between 0.0443 to 8.600E+06 microns
471 static constexpr Numeric f_max = 1e6 * SPEED_OF_LIGHT / 0.0443;
472 static constexpr Numeric f_min = 1e6 * SPEED_OF_LIGHT / 8.6e6;
473 chk_if_in_range("min of scat_f_grid", min(f_grid), f_min, f_max);
474 chk_if_in_range("max of scat_f_grid", max(f_grid), f_min, f_max);
475
476 // Temperature must be between 213.16 to 272.16 K
477 const Numeric t_min = 213.16;
478 const Numeric t_max = 272.16;
479 chk_if_in_range("min of scat_t_grid", min(t_grid), t_min, t_max);
480 chk_if_in_range("max of scat_t_grid", max(t_grid), t_min, t_max);
481
482 complex_refr_index.resize(nf, nt, 2);
483 complex_refr_index.set_grid_name(0, "Frequency");
484 complex_refr_index.set_grid(0, f_grid);
485 complex_refr_index.set_grid_name(1, "Temperature");
486 complex_refr_index.set_grid(1, t_grid);
487 complex_refr_index.set_grid_name(2, "Complex");
488 complex_refr_index.set_grid(2, {"real", "imaginary"});
489
490 Complex n;
491 /*#pragma omp parallel for \
492 if (!arts_omp_in_parallel() && nf > 1) \
493 private(n)*/
494 for (Index f = 0; f < nf; ++f)
495 for (Index t = 0; t < nt; ++t) {
496 n = refice_(1e6 * SPEED_OF_LIGHT / f_grid[f], t_grid[t]);
497 complex_refr_index.data(f, t, 0) = n.real();
498 complex_refr_index.data(f, t, 1) = n.imag();
499 }
500}
501
502#else
503
504/* Workspace method: Doxygen documentation will be auto-generated */
505void complex_refr_indexIceWarren84( // Generic output:
507 // Generic input:
508 const Vector&,
509 const Vector&,
510 const Verbosity&) {
511 throw std::runtime_error("ARTS was not compiled with Fortran support.");
512}
513
514#endif
Declarations required for the calculation of absorption coefficients.
base max(const Array< base > &x)
Max function.
Definition: array.h:145
base min(const Array< base > &x)
Min function.
Definition: array.h:161
The global header file for ARTS.
Constants of physical expressions as constexpr.
void chk_if_in_range(const String &x_name, const Index &x, const Index &x_low, const Index &x_high)
chk_if_in_range
Definition: check_input.cc:86
void chk_vector_length(const String &x_name, ConstVectorView x, const Index &l)
chk_vector_length
Definition: check_input.cc:257
constexpr Numeric SPEED_OF_LIGHT
Definition: cia.cc:40
Index nelem() const ARTS_NOEXCEPT
Definition: array.h:92
Index nelem() const noexcept
Returns the number of elements.
Definition: matpackI.h:547
void resize(const GriddedField3 &gf)
Make this GriddedField3 the same size as the given one.
void set_grid_name(Index i, const String &s)
Set grid name.
void set_grid(Index i, const Vector &g)
Set a numeric grid.
The Matrix class.
Definition: matpackI.h:1285
The Vector class.
Definition: matpackI.h:910
#define ARTS_USER_ERROR_IF(condition,...)
Definition: debug.h:134
constexpr Numeric ELECTRON_MASS
Definition: m_refraction.cc:51
void refr_index_airFreeElectrons(Numeric &refr_index_air, Numeric &refr_index_air_group, const Vector &f_grid, const ArrayOfArrayOfSpeciesTag &abs_species, const Vector &rtp_vmr, const Index &demand_vmr_value, const Verbosity &)
WORKSPACE METHOD: refr_index_airFreeElectrons.
Definition: m_refraction.cc:61
void complex_refr_indexConstant(GriddedField3 &complex_refr_index, const Numeric &refr_index_real, const Numeric &refr_index_imag, const Verbosity &)
WORKSPACE METHOD: complex_refr_indexConstant.
void refr_index_airMicrowavesEarth(Numeric &refr_index_air, Numeric &refr_index_air_group, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Vector &rtp_vmr, const ArrayOfArrayOfSpeciesTag &abs_species, const Numeric &k1, const Numeric &k2, const Numeric &k3, const Verbosity &)
WORKSPACE METHOD: refr_index_airMicrowavesEarth.
void complex_refr_indexIceWarren84(GriddedField3 &, const Vector &, const Vector &, const Verbosity &)
WORKSPACE METHOD: complex_refr_indexIceWarren84.
constexpr Numeric VACUUM_PERMITTIVITY
Definition: m_refraction.cc:53
constexpr Numeric TORR2PA
Definition: m_refraction.cc:54
void complex_refr_indexWaterVisibleNIRHarvey98(GriddedField3 &complex_refr_index, const Vector &data_f_grid, const Vector &data_t_grid, const Vector &density_water, const Index &only_valid_range, const Verbosity &)
WORKSPACE METHOD: complex_refr_indexWaterVisibleNIRHarvey98.
void refr_index_airMicrowavesGeneral(Numeric &refr_index_air, Numeric &refr_index_air_group, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Vector &rtp_vmr, const ArrayOfArrayOfSpeciesTag &abs_species, const Verbosity &)
WORKSPACE METHOD: refr_index_airMicrowavesGeneral.
void complex_refr_indexTemperatureConstant(GriddedField3 &complex_refr_index, const Vector &f_grid, const Vector &refr_index_real, const Vector &refr_index_imag, const Numeric &temperature, const Verbosity &)
WORKSPACE METHOD: complex_refr_indexTemperatureConstant.
void complex_refr_indexWaterLiebe93(GriddedField3 &complex_refr_index, const Vector &f_grid, const Vector &t_grid, const Verbosity &verbosity)
WORKSPACE METHOD: complex_refr_indexWaterLiebe93.
constexpr Numeric PI
Definition: m_refraction.cc:52
void complex_refr_indexIceMatzler06(GriddedField3 &complex_refr_index, const Vector &f_grid, const Vector &t_grid, const Verbosity &)
WORKSPACE METHOD: complex_refr_indexIceMatzler06.
void refr_index_airInfraredEarth(Numeric &refr_index_air, Numeric &refr_index_air_group, const Numeric &rtp_pressure, const Numeric &rtp_temperature, const Verbosity &)
WORKSPACE METHOD: refr_index_airInfraredEarth.
constexpr Numeric ELECTRON_CHARGE
Definition: m_refraction.cc:50
Numeric last(ConstVectorView x)
last
Definition: math_funcs.cc:161
Implementation of Matrix, Vector, and such stuff.
NUMERIC Numeric
The type to use for all floating point numbers.
Definition: matpack.h:33
INDEX Index
The type to use for all integer numbers and indices.
Definition: matpack.h:39
const Joker joker
std::complex< Numeric > Complex
Declarations having to do with the four output streams.
#define CREATE_OUT1
Definition: messages.h:204
constexpr Numeric pi
The following mathematical constants are generated in python Decimal package by the code:
constexpr Numeric vacuum_permittivity
Vacuum permittivity [F/m].
constexpr Numeric electron_mass
Mass of resting electron [kg].
constexpr Numeric speed_of_light
Speed of light [m/s] From: https://en.wikipedia.org/wiki/2019_redefinition_of_SI_base_units Date: 201...
constexpr Numeric elementary_charge
Elementary charge [C] From: https://en.wikipedia.org/wiki/2019_redefinition_of_SI_base_units Date: 20...
constexpr auto torr2pa(auto x) noexcept
Conversion from Torr to Pa.
This file contains declerations of functions of physical character.
Complex refice_(const Numeric &wavlen, const Numeric &temp)
Calculates complex refractive index of Ice 1H.
Numeric sqrt(const Rational r)
Square root.
Definition: rational.h:705
void complex_n_ice_matzler06(Matrix &complex_n, const Vector &f_grid, const Numeric &t)
complex_n_ice_matzler06
Definition: refraction.cc:124
void complex_n_water_liebe93(Matrix &complex_n, const Vector &f_grid, const Numeric &t)
complex_n_water_liebe93
Definition: refraction.cc:74
void refractive_index_water_and_steam_VisNIR(Numeric &n, const Index &only_valid_range, const Numeric &frequency, const Numeric &temperature, const Numeric &density)
Refractive index of water and steam for the optical and near infrared .
Definition: refraction.cc:738
Refraction functions.
Header file for special_interp.cc.
Index find_first_species(const ArrayOfArrayOfSpeciesTag &specs, Species::Species spec) noexcept
#define a