ARTS 2.5.4 (git: 31ce4f0e)
refraction.cc
Go to the documentation of this file.
1/* Copyright (C) 2002-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
30/*===========================================================================
31 === External declarations
32 ===========================================================================*/
33
34#include "refraction.h"
35#include <cmath>
36#include "arts_constants.h"
37#include "auto_md.h"
38#include "matpack_complex.h"
39#include "geodetic.h"
40#include "interpolation.h"
41#include "special_interp.h"
42#include "check_input.h"
43#include "arts_conversions.h"
44
48
49/*===========================================================================
50 === The functions (in alphabetical order)
51 ===========================================================================*/
52
54
75 const Vector& f_grid,
76 const Numeric& t) {
77 chk_if_in_range("t", t, TEMP_0_C - 40, TEMP_0_C + 100);
78 chk_if_in_range("min of f_grid", min(f_grid), 10e9, 1000e9);
79 chk_if_in_range("max of f_grid", max(f_grid), 10e9, 1000e9);
80
81 const Index nf = f_grid.nelem();
82
83 complex_n.resize(nf, 2);
84
85 // Implementation following epswater93.m (by C. Mätzler), part of Atmlab,
86 // but numeric values strictly following the paper version (146, not 146.4)
87 const Numeric theta = 1 - 300 / t;
88 const Numeric e0 = 77.66 - 103.3 * theta;
89 const Numeric e1 = 0.0671 * e0;
90 const Numeric f1 = 20.2 + 146 * theta + 316 * theta * theta;
91 const Numeric e2 = 3.52;
92 const Numeric f2 = 39.8 * f1;
93
94 for (Index iv = 0; iv < nf; iv++) {
95 const Complex ifGHz(0.0, f_grid[iv] / 1e9);
96
97 Complex n = sqrt(e2 + (e1 - e2) / (Numeric(1.0) - ifGHz / f2) +
98 (e0 - e1) / (Numeric(1.0) - ifGHz / f1));
99
100 complex_n(iv, 0) = n.real();
101 complex_n(iv, 1) = n.imag();
102 }
103}
104
106
125 const Vector& f_grid,
126 const Numeric& t) {
127 chk_if_in_range("t", t, 20., 280.);
128 chk_if_in_range("min of f_grid", min(f_grid), 10e6, 3000e9);
129 chk_if_in_range("max of f_grid", max(f_grid), 10e6, 3000e9);
130
131 const Index nf = f_grid.nelem();
132
133 complex_n.resize(nf, 2);
134
135 // some parametrization constants
136 const Numeric B1 = 0.0207;
137 const Numeric B2 = 1.16e-11;
138 const Numeric b = 335.;
139
140 const Numeric deltabeta = exp(-9.963 + 0.0372 * (t - 273));
141 const Numeric ebdt = exp(b / t);
142 const Numeric betam = (B1 / t) * ebdt / ((ebdt - 1.) * (ebdt - 1.));
143
144 const Numeric theta = 300. / t - 1;
145 const Numeric alfa = (0.00504 + 0.0062 * theta) * exp(-22.1 * theta);
146 const Numeric reps = 3.1884 + 9.1e-4 * (t - 273);
147
148 for (Index iv = 0; iv < nf; iv++) {
149 Numeric f = f_grid[iv] / 1e9;
150 Numeric beta = betam + B2 * f * f + deltabeta;
151 Numeric ieps = alfa / f + beta * f;
152
153 Complex eps(reps, ieps);
154 Complex n = sqrt(eps);
155 complex_n(iv, 0) = n.real();
156 complex_n(iv, 1) = n.imag();
157 }
158}
159
161
188 Numeric& refr_index_air,
189 Numeric& refr_index_air_group,
190 const Agenda& refr_index_air_agenda,
191 ConstVectorView p_grid,
192 ConstVectorView refellipsoid,
193 ConstTensor3View z_field,
194 ConstTensor3View t_field,
195 ConstTensor4View vmr_field,
196 ConstVectorView f_grid,
197 const Numeric& r) {
198 Numeric rtp_pressure, rtp_temperature;
199 Vector rtp_vmr;
200
201 // Pressure grid position
202 ArrayOfGridPos gp(1);
203 gridpos(gp, z_field(joker, 0, 0), Vector(1, r - refellipsoid[0]));
204
205 // Altitude interpolation weights
206 Matrix itw(1, 2);
207 interpweights(itw, gp);
208
209 // Pressure
210 Vector dummy(1);
211 itw2p(dummy, p_grid, gp, itw);
212 rtp_pressure = dummy[0];
213
214 // Temperature
215 interp(dummy, itw, t_field(joker, 0, 0), gp);
216 rtp_temperature = dummy[0];
217
218 // VMR
219 const Index ns = vmr_field.nbooks();
220 //
221 rtp_vmr.resize(ns);
222 //
223 for (Index is = 0; is < ns; is++) {
224 interp(dummy, itw, vmr_field(is, joker, 0, 0), gp);
225 rtp_vmr[is] = dummy[0];
226 }
227
229 refr_index_air,
230 refr_index_air_group,
231 rtp_pressure,
232 rtp_temperature,
233 rtp_vmr,
234 f_grid,
235 refr_index_air_agenda);
236}
237
239
268 Numeric& refr_index_air,
269 Numeric& refr_index_air_group,
270 const Agenda& refr_index_air_agenda,
271 ConstVectorView p_grid,
272 ConstVectorView lat_grid,
273 ConstVectorView refellipsoid,
274 ConstTensor3View z_field,
275 ConstTensor3View t_field,
276 ConstTensor4View vmr_field,
277 ConstVectorView f_grid,
278 const Numeric& r,
279 const Numeric& lat) {
280 Numeric rtp_pressure, rtp_temperature;
281 Vector rtp_vmr;
282
283 // Determine the geometric altitudes at *lat*
284 const Index np = p_grid.nelem();
285 Vector z_grid(np);
286 ArrayOfGridPos gp_lat(1);
287 //
288 gridpos(gp_lat, lat_grid, lat);
289 z_at_lat_2d(z_grid, p_grid, lat_grid, z_field(joker, joker, 0), gp_lat[0]);
290
291 // Determine the ellipsoid radius at *lat*
292 const Numeric rellips = refell2d(refellipsoid, lat_grid, gp_lat[0]);
293
294 // Altitude (equal to pressure) grid position
295 ArrayOfGridPos gp_p(1);
296 gridpos(gp_p, z_grid, Vector(1, r - rellips));
297
298 // Altitude interpolation weights
299 Matrix itw(1, 2);
300 Vector dummy(1);
301 interpweights(itw, gp_p);
302
303 // Pressure
304 itw2p(dummy, p_grid, gp_p, itw);
305 rtp_pressure = dummy[0];
306
307 // Temperature
308 itw.resize(1, 4);
309 interpweights(itw, gp_p, gp_lat);
310 interp(dummy, itw, t_field(joker, joker, 0), gp_p, gp_lat);
311 rtp_temperature = dummy[0];
312
313 // VMR
314 const Index ns = vmr_field.nbooks();
315 //
316 rtp_vmr.resize(ns);
317 //
318 for (Index is = 0; is < ns; is++) {
319 interp(dummy, itw, vmr_field(is, joker, joker, 0), gp_p, gp_lat);
320 rtp_vmr[is] = dummy[0];
321 }
322
324 refr_index_air,
325 refr_index_air_group,
326 rtp_pressure,
327 rtp_temperature,
328 rtp_vmr,
329 f_grid,
330 refr_index_air_agenda);
331}
332
361 Numeric& refr_index_air,
362 Numeric& refr_index_air_group,
363 const Agenda& refr_index_air_agenda,
364 ConstVectorView p_grid,
365 ConstVectorView lat_grid,
366 ConstVectorView lon_grid,
367 ConstVectorView refellipsoid,
368 ConstTensor3View z_field,
369 ConstTensor3View t_field,
370 ConstTensor4View vmr_field,
371 ConstVectorView f_grid,
372 const Numeric& r,
373 const Numeric& lat,
374 const Numeric& lon) {
375 Numeric rtp_pressure, rtp_temperature;
376 Vector rtp_vmr;
377
378 // Determine the geometric altitudes at *lat* and *lon*
379 const Index np = p_grid.nelem();
380 Vector z_grid(np);
381 ArrayOfGridPos gp_lat(1), gp_lon(1);
382 //
383 gridpos(gp_lat, lat_grid, lat);
384 gridpos(gp_lon, lon_grid, lon);
386 z_grid, p_grid, lat_grid, lon_grid, z_field, gp_lat[0], gp_lon[0]);
387
388 // Determine the elipsoid radius at *lat*
389 const Numeric rellips = refell2d(refellipsoid, lat_grid, gp_lat[0]);
390
391 // Altitude (equal to pressure) grid position
392 ArrayOfGridPos gp_p(1);
393 gridpos(gp_p, z_grid, Vector(1, r - rellips));
394
395 // Altitude interpolation weights
396 Matrix itw(1, 2);
397 Vector dummy(1);
398 interpweights(itw, gp_p);
399
400 // Pressure
401 itw2p(dummy, p_grid, gp_p, itw);
402 rtp_pressure = dummy[0];
403
404 // Temperature
405 itw.resize(1, 8);
406 interpweights(itw, gp_p, gp_lat, gp_lon);
407 interp(dummy, itw, t_field, gp_p, gp_lat, gp_lon);
408 rtp_temperature = dummy[0];
409
410 // VMR
411 const Index ns = vmr_field.nbooks();
412 //
413 rtp_vmr.resize(ns);
414 //
415 for (Index is = 0; is < ns; is++) {
416 interp(
417 dummy, itw, vmr_field(is, joker, joker, joker), gp_p, gp_lat, gp_lon);
418 rtp_vmr[is] = dummy[0];
419 }
420
422 refr_index_air,
423 refr_index_air_group,
424 rtp_pressure,
425 rtp_temperature,
426 rtp_vmr,
427 f_grid,
428 refr_index_air_agenda);
429}
430
432
458 Numeric& refr_index_air,
459 Numeric& refr_index_air_group,
460 Numeric& dndr,
461 const Agenda& refr_index_air_agenda,
462 ConstVectorView p_grid,
463 ConstVectorView refellipsoid,
464 ConstTensor3View z_field,
465 ConstTensor3View t_field,
466 ConstTensor4View vmr_field,
467 ConstVectorView f_grid,
468 const Numeric& r) {
470 refr_index_air,
471 refr_index_air_group,
472 refr_index_air_agenda,
473 p_grid,
474 refellipsoid,
475 z_field,
476 t_field,
477 vmr_field,
478 f_grid,
479 r);
480
481 const Numeric n0 = refr_index_air;
482 Numeric dummy;
483
485 refr_index_air,
486 dummy,
487 refr_index_air_agenda,
488 p_grid,
489 refellipsoid,
490 z_field,
491 t_field,
492 vmr_field,
493 f_grid,
494 r + 1);
495
496 dndr = refr_index_air - n0;
497
498 refr_index_air = n0;
499}
500
502
535 Numeric& refr_index_air,
536 Numeric& refr_index_air_group,
537 Numeric& dndr,
538 Numeric& dndlat,
539 const Agenda& refr_index_air_agenda,
540 ConstVectorView p_grid,
541 ConstVectorView lat_grid,
542 ConstVectorView refellipsoid,
543 ConstTensor3View z_field,
544 ConstTensor3View t_field,
545 ConstTensor4View vmr_field,
546 ConstVectorView f_grid,
547 const Numeric& r,
548 const Numeric& lat) {
550 refr_index_air,
551 refr_index_air_group,
552 refr_index_air_agenda,
553 p_grid,
554 lat_grid,
555 refellipsoid,
556 z_field,
557 t_field,
558 vmr_field,
559 f_grid,
560 r,
561 lat);
562
563 const Numeric n0 = refr_index_air;
564 Numeric dummy;
565
567 refr_index_air,
568 dummy,
569 refr_index_air_agenda,
570 p_grid,
571 lat_grid,
572 refellipsoid,
573 z_field,
574 t_field,
575 vmr_field,
576 f_grid,
577 r + 1,
578 lat);
579
580 dndr = refr_index_air - n0;
581
582 const Numeric dlat = 1e-4;
583
585 refr_index_air,
586 dummy,
587 refr_index_air_agenda,
588 p_grid,
589 lat_grid,
590 refellipsoid,
591 z_field,
592 t_field,
593 vmr_field,
594 f_grid,
595 r,
596 lat + dlat);
597
598 dndlat = (refr_index_air - n0) / (DEG2RAD * dlat * r);
599
600 refr_index_air = n0;
601}
602
604
641 Numeric& refr_index_air,
642 Numeric& refr_index_air_group,
643 Numeric& dndr,
644 Numeric& dndlat,
645 Numeric& dndlon,
646 const Agenda& refr_index_air_agenda,
647 ConstVectorView p_grid,
648 ConstVectorView lat_grid,
649 ConstVectorView lon_grid,
650 ConstVectorView refellipsoid,
651 ConstTensor3View z_field,
652 ConstTensor3View t_field,
653 ConstTensor4View vmr_field,
654 ConstVectorView f_grid,
655 const Numeric& r,
656 const Numeric& lat,
657 const Numeric& lon) {
659 refr_index_air,
660 refr_index_air_group,
661 refr_index_air_agenda,
662 p_grid,
663 lat_grid,
664 lon_grid,
665 refellipsoid,
666 z_field,
667 t_field,
668 vmr_field,
669 f_grid,
670 r,
671 lat,
672 lon);
673
674 const Numeric n0 = refr_index_air;
675 Numeric dummy;
676
678 refr_index_air,
679 dummy,
680 refr_index_air_agenda,
681 p_grid,
682 lat_grid,
683 lon_grid,
684 refellipsoid,
685 z_field,
686 t_field,
687 vmr_field,
688 f_grid,
689 r + 1,
690 lat,
691 lon);
692
693 dndr = refr_index_air - n0;
694
695 const Numeric dlat = 1e-4;
696
698 refr_index_air,
699 dummy,
700 refr_index_air_agenda,
701 p_grid,
702 lat_grid,
703 lon_grid,
704 refellipsoid,
705 z_field,
706 t_field,
707 vmr_field,
708 f_grid,
709 r,
710 lat + dlat,
711 lon);
712
713 dndlat = (refr_index_air - n0) / (DEG2RAD * dlat * r);
714
715 const Numeric dlon = 1e-4;
716
718 refr_index_air,
719 dummy,
720 refr_index_air_agenda,
721 p_grid,
722 lat_grid,
723 lon_grid,
724 refellipsoid,
725 z_field,
726 t_field,
727 vmr_field,
728 f_grid,
729 r,
730 lat,
731 lon + dlon);
732
733 dndlon = (refr_index_air - n0) / (DEG2RAD * dlon * r * cos(DEG2RAD * lat));
734
735 refr_index_air = n0;
736}
737
739 const Index& only_valid_range,
740 const Numeric& frequency,
741 const Numeric& temperature,
742 const Numeric& density) {
743 //convert frequency to wavelength
744 const Numeric wavelength = Conversion::freq2wavelen(frequency) * 1e6; // [µm]
745
746 //Reference values
747 const Numeric T_star = 273.15; // [K]
748 const Numeric rho_star = 1000; // [kg/m^3]
749 const Numeric lambda_star = 0.589; // [µm]
750
751 //check input
752 bool T_ok = (temperature > T_star - 12) && (temperature < T_star + 500);
753 bool rho_ok = (density > 0) && (density < 1060);
754 bool wvl_ok = (wavelength > 0.2) && (wavelength < 1.9);
755
756 if (only_valid_range) {
757 ARTS_USER_ERROR_IF(!T_ok,
758 "Refractive index is calculated outside range of "
759 "validity \n",
760 "Temperature must be between ",
761 T_star - 12,
762 "K and ",
763 T_star + 500,
764 "K\n"
765 "Desired temperature: ",
766 temperature,
767 "K \n")
768
769 ARTS_USER_ERROR_IF(!rho_ok,
770 "Refractive index is calculated outside range of "
771 "validity \n",
772 "Density must be between ",
773 0,
774 "kg m^-3 and ",
775 1060,
776 "kg m^-3\n"
777 "Desired density: ",
778 density,
779 "kg m^-3 \n")
780
781 Numeric frq_upper_limit = Conversion::wavelen2freq(0.2 * 1e-6);
782 Numeric frq_lower_limit = Conversion::wavelen2freq(1.9 * 1e-6);
783
784 ARTS_USER_ERROR_IF(!wvl_ok,
785 "Refractive index is calculated outside range of "
786 "validity \n",
787 "Frequency must be between ",
788 frq_lower_limit,
789 "Hz and ",
790 frq_upper_limit,
791 "Hz\n"
792 "Desired density: ",
793 frequency,
794 "Hz \n")
795 }
796
797 //coefficients
798 const Numeric a0 = 0.244257733;
799 const Numeric a1 = 9.74634476e-3;
800 const Numeric a2 = -3.73234996e-3;
801 const Numeric a3 = 2.68678472e-4;
802 const Numeric a4 = 1.58920570e-3;
803 const Numeric a5 = 2.45934259e-3;
804 const Numeric a6 = 0.900704920;
805 const Numeric a7 = -1.66626219e-2;
806
807 const Numeric lambda_uv = 0.2292020;
808 const Numeric lambda_ir = 5.432937;
809
810 //normalize input variables
811 Numeric T_bar = temperature / T_star;
812 Numeric rho_bar = density / rho_star;
813 Numeric lambda_bar = wavelength / lambda_star;
814
815 //set up right hands side of eq A1
816 Numeric rhs = a0;
817 rhs += a1 * rho_bar;
818 rhs += a2 * T_bar;
819 rhs += a3 * lambda_bar * lambda_bar * T_bar;
820 rhs += a4 / (lambda_bar * lambda_bar);
821 rhs += a5 / (lambda_bar * lambda_bar - lambda_uv * lambda_uv);
822 rhs += a6 / (lambda_bar * lambda_bar - lambda_ir * lambda_ir);
823 rhs += a7 * rho_bar * rho_bar;
824
825 Complex a;
826 a = rho_bar * rhs;
827
828 //solve Eq A1 (see paper in documentation after n
829 Complex n_cmplx = sqrt(-2 * a - 1);
830 n_cmplx /= sqrt(a - 1);
831
832 //refractive index
833 n = - real(n_cmplx);
834}
Constants of physical expressions as constexpr.
Common ARTS conversions.
void refr_index_air_agendaExecute(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, const Numeric rtp_pressure, const Numeric rtp_temperature, const Vector &rtp_vmr, const Vector &f_grid, const Agenda &input_agenda)
Definition: auto_md.cc:25709
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
The Agenda class.
Definition: agenda_class.h:69
A constant view of a Tensor3.
Definition: matpackIII.h:130
A constant view of a Tensor4.
Definition: matpackIV.h:131
Index nbooks() const noexcept
Definition: matpackIV.h:139
A constant view of a Vector.
Definition: matpackI.h:512
Index nelem() const noexcept
Returns the number of elements.
Definition: matpackI.h:536
The Matrix class.
Definition: matpackI.h:1261
void resize(Index r, Index c)
Resize function.
Definition: matpackI.cc:1010
The Vector class.
Definition: matpackI.h:899
void resize(Index n)
Resize function.
Definition: matpackI.cc:390
Workspace class.
Definition: workspace_ng.h:53
#define ARTS_USER_ERROR_IF(condition,...)
Definition: debug.h:134
Numeric refell2d(ConstVectorView refellipsoid, ConstVectorView lat_grid, const GridPos gp)
refell2d
Definition: geodetic.cc:1305
void gridpos(ArrayOfGridPos &gp, ConstVectorView old_grid, ConstVectorView new_grid, const Numeric &extpolfac)
Set up a grid position Array.
void interpweights(VectorView itw, const GridPos &tc)
Red 1D interpolation weights.
Numeric interp(ConstVectorView itw, ConstVectorView a, const GridPos &tc)
Red 1D Interpolate.
Header file for interpolation.cc.
#define beta
#define ns
#define min(a, b)
#define max(a, b)
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
#define a2
#define a1
std::complex< Numeric > Complex
constexpr Numeric real(Complex c) noexcept
real
constexpr Numeric e
Elementary charge convenience name [C].
constexpr Numeric temperature_at_0c
Global constant, Temperature in Celsius of 0 Kelvin.
constexpr auto deg2rad(auto x) noexcept
Converts degrees to radians.
constexpr auto freq2wavelen(auto x) noexcept
Conversion from Hz to wavelength.
constexpr auto rad2deg(auto x) noexcept
Converts radians to degrees.
constexpr auto wavelen2freq(auto x) noexcept
Conversion from wavelength to Hz.
invlib::Vector< ArtsVector > Vector
invlib wrapper type for ARTS vectors.
Definition: oem.h:31
Numeric sqrt(const Rational r)
Square root.
Definition: rational.h:705
void refr_gradients_3d(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, Numeric &dndr, Numeric &dndlat, Numeric &dndlon, const Agenda &refr_index_air_agenda, ConstVectorView p_grid, ConstVectorView lat_grid, ConstVectorView lon_grid, ConstVectorView refellipsoid, ConstTensor3View z_field, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView f_grid, const Numeric &r, const Numeric &lat, const Numeric &lon)
refr_gradients_3d
Definition: refraction.cc:640
void get_refr_index_3d(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, const Agenda &refr_index_air_agenda, ConstVectorView p_grid, ConstVectorView lat_grid, ConstVectorView lon_grid, ConstVectorView refellipsoid, ConstTensor3View z_field, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView f_grid, const Numeric &r, const Numeric &lat, const Numeric &lon)
Definition: refraction.cc:360
void complex_n_ice_matzler06(Matrix &complex_n, const Vector &f_grid, const Numeric &t)
complex_n_ice_matzler06
Definition: refraction.cc:124
void get_refr_index_1d(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, const Agenda &refr_index_air_agenda, ConstVectorView p_grid, ConstVectorView refellipsoid, ConstTensor3View z_field, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView f_grid, const Numeric &r)
get_refr_index_1d
Definition: refraction.cc:187
void refr_gradients_2d(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, Numeric &dndr, Numeric &dndlat, const Agenda &refr_index_air_agenda, ConstVectorView p_grid, ConstVectorView lat_grid, ConstVectorView refellipsoid, ConstTensor3View z_field, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView f_grid, const Numeric &r, const Numeric &lat)
refr_gradients_2d
Definition: refraction.cc:534
constexpr Numeric DEG2RAD
Definition: refraction.cc:45
void get_refr_index_2d(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, const Agenda &refr_index_air_agenda, ConstVectorView p_grid, ConstVectorView lat_grid, ConstVectorView refellipsoid, ConstTensor3View z_field, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView f_grid, const Numeric &r, const Numeric &lat)
get_refr_index_2d
Definition: refraction.cc:267
constexpr Numeric RAD2DEG
Definition: refraction.cc:46
void refr_gradients_1d(Workspace &ws, Numeric &refr_index_air, Numeric &refr_index_air_group, Numeric &dndr, const Agenda &refr_index_air_agenda, ConstVectorView p_grid, ConstVectorView refellipsoid, ConstTensor3View z_field, ConstTensor3View t_field, ConstTensor4View vmr_field, ConstVectorView f_grid, const Numeric &r)
refr_gradients_1d
Definition: refraction.cc:457
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
constexpr Numeric TEMP_0_C
Definition: refraction.cc:47
Refraction functions.
void itw2p(VectorView p_values, ConstVectorView p_grid, const ArrayOfGridPos &gp, ConstMatrixView itw)
Converts interpolation weights to pressures.
void z_at_latlon(VectorView z, ConstVectorView p_grid, ConstVectorView lat_grid, ConstVectorView lon_grid, ConstTensor3View z_field, const GridPos &gp_lat, const GridPos &gp_lon)
Returns the geomtrical altitudes of p_grid for one latitude and one longitude.
void z_at_lat_2d(VectorView z, ConstVectorView p_grid, ConstVectorView lat_grid, ConstMatrixView z_field, const GridPos &gp_lat)
Returns the geomtrical altitudes of p_grid for one latitude.
Header file for special_interp.cc.
#define a
#define b