ARTS 2.5.11 (git: 725533f0)
telsem.cc
Go to the documentation of this file.
1
7#include "telsem.h"
8#include <cmath>
9#include <utility>
10#include "arts_constants.h"
11#include "arts_conversions.h"
12#include "check_input.h"
13#include "double_imanip.h"
14#include "geodetic.h"
15
16inline constexpr Numeric EARTH_RADIUS=Constant::earth_radius;
17inline constexpr Numeric DEG2RAD=Conversion::deg2rad(1);
18inline constexpr Numeric PI=Constant::pi;
19
21// TelsemAtlas Class
23
25 std::ifstream ifs(filename, std::ifstream::in);
26 read(ifs);
27}
28
29void TelsemAtlas::read(std::istream& is) {
30 name = "ssmi_mean_emis_climato";
31 nchan = 7;
32 dlat = 0.25;
33 is >> ndat;
34 emis.resize(ndat, nchan);
35 emis = NAN;
36 emis_err.resize(ndat, nchan);
37 emis_err = NAN;
38 classes1.resize(ndat);
39 classes1 = -1;
40 classes2.resize(ndat);
41 classes2 = -1;
42 cellnums.resize(ndat);
43 cellnums = -1;
44
45 equare();
46
47 Index cellnum;
48 Index class1;
49 Index class2;
50 Vector ssmi(2 * nchan);
51 Index ipos = -1;
52 for (Index j = 0; j < ndat; j++) {
53 is >> cellnum;
54 ARTS_USER_ERROR_IF (is.fail(), "Error reading cellnum.");
55 for (Index nssmi = 0; nssmi < 2 * nchan; nssmi++) {
56 is >> double_imanip() >> ssmi[nssmi];
57 ARTS_USER_ERROR_IF (is.fail(), "Error reading emissivity.");
58 }
59
60 is >> class1 >> class2;
61 ARTS_USER_ERROR_IF (is.fail(), "Error reading classes.");
62 if (class1 > 0 && class2 > 0 && ipos < ndat) {
63 ipos++;
64 for (Index i = 0; i < nchan; i++) {
65 emis(ipos, i) = ssmi[i];
66 emis_err(ipos, i) = std::sqrt(ssmi[nchan + i]);
67 }
68 cellnums[ipos] = cellnum;
69 classes1[ipos] = class1;
70 classes2[ipos] = class2;
71 }
72 }
74}
75
77 Index maxlat = static_cast<Index>(180.0 / dlat);
78
79 ncells.resize(maxlat);
80 firstcells.resize(maxlat);
81
82 // Total number of cells.
83 //Index totcel = 0.0;
84
85 Numeric rcelat = dlat * PI / 180.0;
86
87 Numeric hezon = EARTH_RADIUS * sin(rcelat);
88 Numeric aezon = 2.0 * PI * EARTH_RADIUS * hezon;
89 Numeric aecell = aezon * dlat / 360.0;
90
91 for (Index i = 0; i < maxlat / 2; ++i) {
92 Numeric xlatb = static_cast<Numeric>(i) * dlat;
93 Numeric xlate = xlatb + dlat;
94 Numeric rlatb = DEG2RAD * xlatb;
95 Numeric rlate = DEG2RAD * xlate;
96 Numeric htb = EARTH_RADIUS * sin(rlatb);
97 Numeric hte = EARTH_RADIUS * sin(rlate);
98 Numeric htzone = hte - htb;
99 Numeric azone = 2.0 * PI * EARTH_RADIUS * htzone;
100 Numeric rcells = azone / aecell;
101 Index icellr = static_cast<Index>(rcells + 0.5);
102
103 //totcel += 2 * icellr;
104
105 Index lat1 = i + maxlat / 2;
106 Index lat2 = maxlat / 2 - 1 - i;
107 ncells[lat1] = icellr;
108 ncells[lat2] = icellr;
109 }
110
111 firstcells[0] = 0;
112 for (Index i = 1; i < maxlat; ++i) {
113 firstcells[i] = firstcells[i - 1] + ncells[i];
114 }
115}
116
118 correspondence.resize(660066);
119 correspondence = -1;
120 for (Index j = 0; j < ndat; j++) {
121 correspondence[cellnums[j]] = j;
122 }
123}
124
125Index TelsemAtlas::calc_cellnum(Numeric lat, Numeric lon) const {
126 ARTS_USER_ERROR_IF ((lat < -90.0) || (lat > 90.0),
127 "Latitude input must be within the range [-90.0, 90.0].");
128
129 ARTS_USER_ERROR_IF ((lon < 0.0) || (lon > 360.0),
130 "Longitude input must be within the range [0.0, 360.0].");
131
132 // Avoid corner cases that hit the outermost edge of the atlas cells.
133 if (lat == 90.0) {
134 lat -= 0.125;
135 }
136
137 if (lon == 360.0) {
138 lat -= 0.125;
139 }
140
141 Index cellnum = 0;
142 Index ilat = static_cast<Index>((lat + 90.0) / dlat);
143 Index ilon =
144 static_cast<Index>(lon / (360.0 / static_cast<Numeric>(ncells[ilat]))) +
145 1;
146 for (Index i = 0; i < ilat; ++i) {
147 cellnum += ncells[i];
148 }
149 cellnum += ilon;
150 return cellnum;
151}
152
154 Numeric lon) const {
155 Index cellnum = calc_cellnum(lat, lon);
156 if (contains(cellnum)) {
157 return cellnum;
158 }
159
160 Numeric di = 1.0;
161
162 while (true) {
163 Numeric lat_new, lon_new;
164
165 for (Numeric i = -di; i < di; i += 1.0) {
166 lat_new = lat + i * dlat;
167 lon_new = lon - di * dlat;
168 cycle_lat_lon(lat_new, lon_new);
169 cellnum = calc_cellnum(lat_new, lon_new);
170 if (contains(cellnum)) {
171 return cellnum;
172 }
173 }
174
175 for (Numeric i = -di; i < di; i += 1.0) {
176 lat_new = lat + i * dlat;
177 lon_new = lon + di * dlat;
178 cycle_lat_lon(lat_new, lon_new);
179 cellnum = calc_cellnum(lat_new, lon_new);
180 if (contains(cellnum)) {
181 return cellnum;
182 }
183 }
184
185 for (Numeric i = -di; i < di; i += 1.0) {
186 lat_new = lat - di * dlat;
187 lon_new = lon + i * dlat;
188 cycle_lat_lon(lat_new, lon_new);
189 cellnum = calc_cellnum(lat_new, lon_new);
190 if (contains(cellnum)) {
191 return cellnum;
192 }
193 }
194
195 for (Numeric i = -di; i < di; i += 1.0) {
196 lat_new = lat + di * dlat;
197 lon_new = lon + i * dlat;
198 cycle_lat_lon(lat_new, lon_new);
199 cellnum = calc_cellnum(lat_new, lon_new);
200 if (contains(cellnum)) {
201 return cellnum;
202 }
203 }
204 di += 1.0;
205 }
206}
207
208std::pair<Numeric, Numeric> TelsemAtlas::get_coordinates(Index cellnum) const {
209 Index index_lat_max = static_cast<Index>(180.0 / dlat);
210 Index index_lat = -1;
211 Index index_lon = -1;
212 if (cellnum >= firstcells[index_lat_max - 1]) {
213 index_lat = index_lat_max;
214 index_lon = cellnum - firstcells[index_lat_max];
215 } else {
216 for (Index i = 0; i < index_lat_max; ++i) {
217 if ((cellnum >= firstcells[i]) && (cellnum < firstcells[i + 1])) {
218 index_lat = i;
219 index_lon = cellnum - firstcells[i];
220 }
221 }
222 }
223 Numeric lat = (static_cast<Numeric>(index_lat) - 0.5) * dlat - 90.0;
224 Numeric lon = (static_cast<Numeric>(index_lon) - 0.5) *
225 (360.0 / static_cast<Numeric>(ncells[index_lat]));
226 return std::make_pair(lat, lon);
227}
228
229Numeric TelsemAtlas::interp_freq2(Numeric emiss19,
230 Numeric emiss37,
231 Numeric emiss85,
232 Numeric f,
233 Index class2) const {
234 Numeric emiss = 0.0;
235 if (f <= 19.35) {
236 emiss = emiss19;
237 } else if ((19.35 < f) && (f <= 37.0)) {
238 const Numeric a = (37.0 - f) / (37.0 - 19.35);
239 const Numeric b = (f - 19.35) / (37.0 - 19.35);
240 emiss = a * emiss19 + b * emiss37;
241 } else if ((f > 37.0) && (f < 85.5)) {
242 const Numeric b = (85.5 - f) / (85.5 - 37.0);
243 const Numeric c = (f - 37.0) / (85.5 - 37.0);
244 emiss = b * emiss37 + c * emiss85;
245 } else if (85.5 <= f) {
246 emiss = emiss85;
247 if ((class2 > 9) && (class2 < 14) && (emiss85 > emiss37)) {
248 if (f <= 150.0) {
249 emiss = emiss85 + (f - 85.5) * (emiss85 - emiss37) / (85.5 - 37.0) *
250 rapport43_32[class2 - 10];
251 } else if ((f > 150.0) && (f <= 190.0)) {
252 emiss = emiss85 + (150.0 - 85.5) * (emiss85 - emiss37) / (85.5 - 37.0) *
253 rapport43_32[class2 - 10];
254 emiss += (f - 150.0) * (emiss - emiss85) / (150.0 - 85.5) *
255 rapport54_43[class2 - 10];
256 } else if (f > 190.0) {
257 emiss = emiss85 + (150.0 - 85.5) * (emiss85 - emiss37) / (85.5 - 37.0) *
258 rapport43_32[class2 - 10];
259 emiss += (190.0 - 150.0) * (emiss - emiss85) / (150.0 - 85.5) *
260 rapport54_43[class2 - 10];
261 }
262 if (emiss > 1.0) {
263 emiss = 1.0;
264 }
265 }
266 }
267 return emiss;
268}
269
270std::pair<Numeric, Numeric> TelsemAtlas::emis_interp(
271 Numeric theta,
272 Numeric freq,
273 Index class1,
274 Index class2,
275 const ConstVectorView& ev,
276 const ConstVectorView& eh) const {
277 Vector emiss_scal_h(3);
278 Vector emiss_scal_v(3);
279
280 for (Index i = 0; i < 3; ++i) {
281 Numeric e0 = a0_k0[i + (class1 - 1) * 3] +
282 a0_k1[i + (class1 - 1) * 3] * ev[i] +
283 a0_k2[i + (class1 - 1) * 3] * eh[i];
284
285 Numeric a0 = a0_eveh[i + (class1 - 1) * 3];
286 Numeric a1 = a1_eveh[i + (class1 - 1) * 3];
287 Numeric a2 = a2_eveh[i + (class1 - 1) * 3];
288 Numeric a3 = a3_eveh[i + (class1 - 1) * 3];
289 Numeric b0 = b0_eveh[i + (class1 - 1) * 3];
290 Numeric b1 = b1_eveh[i + (class1 - 1) * 3];
291 Numeric b2 = b2_eveh[i + (class1 - 1) * 3];
292 Numeric b3 = b3_eveh[i + (class1 - 1) * 3];
293
294 Numeric s1_v = (theta - 53.0) / -53.0 * (e0 - a0) / a0;
295 Numeric em53_v = a3 * pow(53.0, 3.0) + a2 * pow(53.0, 2.0) + a1 * 53.0 + a0;
296 Numeric s2_v = theta / 53.0 * (ev[i] - em53_v) / em53_v;
297 Numeric s_v = 1.0 + s1_v + s2_v;
298
299 Numeric emtheta_v =
300 a3 * pow(theta, 3) + a2 * pow(theta, 2) + a1 * theta + a0;
301 emiss_scal_v[i] = s_v * emtheta_v;
302
303 Numeric s1_h = (theta - 53.0) / -53.0 * (e0 - b0) / b0;
304 Numeric em53_h = b3 * pow(53.0, 3.0) + b2 * pow(53.0, 2.0) + b1 * 53.0 + b0;
305 Numeric s2_h = theta / 53.0 * (eh[i] - em53_h) / em53_h;
306 Numeric s_h = 1.0 + s1_h + s2_h;
307
308 Numeric emtheta_h =
309 b3 * pow(theta, 3) + b2 * pow(theta, 2) + b1 * theta + b0;
310 emiss_scal_h[i] = s_h * emtheta_h;
311 }
312
313 Numeric emiss_h = interp_freq2(
314 emiss_scal_h[0], emiss_scal_h[1], emiss_scal_h[2], freq, class2);
315 Numeric emiss_v = interp_freq2(
316 emiss_scal_v[0], emiss_scal_v[1], emiss_scal_v[2], freq, class2);
317
318 if (emiss_v < emiss_h) {
319 emiss_v = 0.5 * (emiss_v + emiss_h);
320 emiss_h = emiss_v;
321 }
322 return std::make_pair(emiss_v, emiss_h);
323}
324
325std::ostream& operator<<(std::ostream& os, const TelsemAtlas& ta) {
326 os << ta.name << std::endl;
327 return os;
328}
329
331// Regression Coefficients
333
334const std::array<Numeric, 30> TelsemAtlas::a0_k0 = {
335 0.11509, 0.091535, 0.34796, 0.10525, 0.16627, 0.24434,
336 0.29217, 0.23809, 0.28954, 0.17516, 0.19459, 0.28697,
337 0.10521, 0.12126, 0.30278, 0.18212, 0.19625, 0.14551,
338 -0.19202, 0.5411, 0.03739, 0.10292, 0.5486, -0.058937,
339 -0.022672, 0.44492, -0.058448, -0.33894, -0.17621, 0.14742};
340
341const std::array<Numeric, 30> TelsemAtlas::a0_k1 = {
342 0.61168, 0.59095, 0.7918, 0.60271, 0.69213, 0.62218, 0.32728, 0.34334,
343 0.37062, 0.51217, 0.4491, 0.50101, 0.48913, 0.41932, 0.29734, 0.64474,
344 0.30637, 0.031107, 1.0405, 0.17538, 1.3215, 0.61819, 0.31298, 1.7218,
345 0.87761, 0.47583, 1.2583, 1.0959, 0.92842, 0.51033};
346
347const std::array<Numeric, 30> TelsemAtlas::a0_k2 = {
348 0.26726, 0.32033, -0.14778, 0.28547, 0.13592, 0.13193, 0.37178, 0.41813,
349 0.33875, 0.30203, 0.35479, 0.20189, 0.40663, 0.47493, 0.40668, 0.14811,
350 0.52382, 0.86634, 0.14286, 0.27164, -0.37947, 0.2737, 0.12001, -0.67315,
351 0.13492, 0.065463, -0.19316, 0.24905, 0.25475, 0.34637};
352
353const std::array<Numeric, 30> TelsemAtlas::a0_eveh = {
354 0.9592599869E+00, 0.9565299749E+00, 0.9511899948E+00, 0.9560700059E+00,
355 0.9541199803E+00, 0.9483199716E+00, 0.9461100101E+00, 0.9439799786E+00,
356 0.9387800097E+00, 0.9317600131E+00, 0.9289000034E+00, 0.9236800075E+00,
357 0.9208700061E+00, 0.9190599918E+00, 0.9105200171E+00, 0.9162799716E+00,
358 0.8937299848E+00, 0.8014699817E+00, 0.9570500255E+00, 0.9213600159E+00,
359 0.7893999815E+00, 0.9639400244E+00, 0.9530599713E+00, 0.8850200176E+00,
360 0.9685299993E+00, 0.9622600079E+00, 0.9118800163E+00, 0.8997200131E+00,
361 0.9012699723E+00, 0.9107499719E+00};
362
363const std::array<Numeric, 30> TelsemAtlas::a1_eveh = {
364 0.3627802414E-07, -0.7778328204E-08, 0.4396108011E-07, 0.2503205394E-06,
365 0.1996262995E-06, 0.2929977541E-06, 0.4190530660E-06, 0.3655744649E-06,
366 0.3519195673E-06, 0.5574374313E-06, 0.5273076340E-06, 0.5376484182E-06,
367 0.1026844529E-05, 0.9679998811E-06, 0.8616486866E-06, 0.3180800832E-06,
368 0.2886778532E-06, 0.2310362675E-06, -0.1118036366E-06, -0.1502856577E-06,
369 0.4842232926E-07, -0.8410978580E-08, -0.3478669441E-07, 0.2209441590E-06,
370 0.2485776633E-06, 0.1800235907E-06, 0.2510202251E-06, 0.2687000915E-06,
371 0.1740325644E-06, 0.3562134339E-06};
372
373const std::array<Numeric, 30> TelsemAtlas::a2_eveh = {
374 0.3067140824E-05, 0.2520012231E-05, 0.4831396382E-05, 0.8213598448E-05,
375 0.7378375358E-05, 0.1022081960E-04, 0.1225889173E-04, 0.1165553113E-04,
376 0.1188659007E-04, 0.1693615741E-04, 0.1648317448E-04, 0.1715818144E-04,
377 0.2744720041E-04, 0.2642072104E-04, 0.2671847506E-04, 0.1349592094E-04,
378 0.1261523357E-04, 0.5447756394E-05, 0.2064244654E-05, 0.1919016057E-06,
379 0.5940860319E-06, 0.5334760772E-05, 0.4130339221E-05, 0.4104662821E-05,
380 0.6530796327E-05, 0.5727014013E-05, 0.7451782039E-05, 0.1071246970E-04,
381 0.9539280654E-05, 0.1034286015E-04};
382
383const std::array<Numeric, 30> TelsemAtlas::a3_eveh = {
384 -0.2004991551E-07, -0.6895366056E-07, -0.2047409282E-06, -0.7322448425E-07,
385 -0.1273002681E-06, -0.2729916844E-06, -0.9421125213E-07, -0.1683332300E-06,
386 -0.2726891637E-06, -0.1317753799E-06, -0.2107972250E-06, -0.3556060904E-06,
387 -0.1889465580E-06, -0.2757958271E-06, -0.4909850304E-06, 0.7339644004E-08,
388 -0.4058669560E-06, -0.4146343997E-06, 0.6170279931E-07, -0.1998567996E-06,
389 -0.4713119139E-07, -0.1361754887E-07, -0.1765622955E-06, -0.2348146637E-06,
390 -0.3901189061E-07, -0.1305666189E-06, -0.1533838798E-06, -.2679148992E-07,
391 -0.4441960044E-07, -0.1815613899E-06};
392
393const std::array<Numeric, 30> TelsemAtlas::b0_eveh = {
394 0.9592599869E+00, 0.9565299749E+00, 0.9511899948E+00, 0.9560700059E+00,
395 0.9541199803E+00, 0.9483199716E+00, 0.9461100101E+00, 0.9439799786E+00,
396 0.9387800097E+00, 0.9317600131E+00, 0.9289000034E+00, 0.9236800075E+00,
397 0.9208700061E+00, 0.9190599918E+00, 0.9105200171E+00, 0.9162799716E+00,
398 0.8937299848E+00, 0.8014699817E+00, 0.9570500255E+00, 0.9213600159E+00,
399 0.7893999815E+00, 0.9639400244E+00, 0.9530599713E+00, 0.8850200176E+00,
400 0.9685299993E+00, 0.9622600079E+00, 0.9118800163E+00, 0.8997200131E+00,
401 0.9012699723E+00, 0.9107499719E+00};
402
403const std::array<Numeric, 30> TelsemAtlas::b1_eveh = {
404 0.3626608347E-07, -0.7786279177E-08, 0.4393379172E-07, 0.2502746099E-06,
405 0.1995944388E-06, 0.2929554341E-06, 0.4189516289E-06, 0.3655020180E-06,
406 0.3518483140E-06, 0.5572838404E-06, 0.5271903092E-06, 0.5375342766E-06,
407 0.1026605219E-05, 0.9677979733E-06, 0.8614680951E-06, 0.3179358714E-06,
408 0.2884899004E-06, 0.2308632219E-06, -0.1118781370E-06, -0.1503948681E-06,
409 0.4834672396E-07, -0.8455684153E-08, -0.3485171618E-07, 0.2208606134E-06,
410 0.2485595019E-06, 0.1799959364E-06, 0.2509846695E-06, 0.2686167306E-06,
411 0.1739760478E-06, 0.3561317214E-06};
412
413const std::array<Numeric, 30> TelsemAtlas::b2_eveh = {
414 0.3065537157E-05, 0.2518960400E-05, 0.4829731552E-05, 0.8209894986E-05,
415 0.7375769655E-05, 0.1021809931E-04, 0.1225203869E-04, 0.1165053800E-04,
416 0.1188218721E-04, 0.1692612022E-04, 0.1647546378E-04, 0.1715117833E-04,
417 0.2743142431E-04, 0.2640772436E-04, 0.2670711910E-04, 0.1348545720E-04,
418 0.1260529825E-04, 0.5439695997E-05, 0.2058213340E-05, 0.1860650656E-06,
419 0.5898303925E-06, 0.5330772183E-05, 0.4126528893E-05, 0.4100859314E-05,
420 0.6528573977E-05, 0.5725009032E-05, 0.7449450095E-05, 0.1070590315E-04,
421 0.9534271157E-05, 0.1033751869E-04};
422
423const std::array<Numeric, 30> TelsemAtlas::b3_eveh = {
424 -0.1370247134E-06, -0.1436897747E-06, -0.2954870411E-06, -0.3118435643E-06,
425 -0.2916583242E-06, -0.4311032171E-06, -0.5048401022E-06, -0.4662823869E-06,
426 -0.5206445053E-06, -0.7210980471E-06, -0.6662896794E-06, -0.7548637200E-06,
427 -0.1110204039E-05, -0.1030801400E-05, -0.1140921199E-05, -0.6330818110E-06,
428 -0.9186441048E-06, -0.7947813856E-06, -0.3242539890E-06, -0.5027602583E-06,
429 -0.2777987334E-06, -0.2747250676E-06, -0.3811997260E-06, -0.4102405455E-06,
430 -0.1994112324E-06, -0.2555484855E-06, -0.2842682534E-06, -0.4413041665E-06,
431 -0.3717419474E-06, -0.4975536854E-06};
432
433const std::array<Numeric, 4> TelsemAtlas::rapport43_32 = {
434 0.62, 0.37, 0.46, 0.63};
435const std::array<Numeric, 4> TelsemAtlas::rapport54_43 = {
436 0.30, 0.60, 0.47, 0.35};
Constants of physical expressions as constexpr.
Common ARTS conversions.
A telsem atlas.
Definition telsem.h:42
void read(std::istream &is)
Definition telsem.cc:29
static const std::array< Numeric, 30 > a0_eveh
Definition telsem.h:367
ArrayOfIndex ncells
Definition telsem.h:346
static const std::array< Numeric, 30 > b1_eveh
Definition telsem.h:372
Matrix emis
Definition telsem.h:350
static const std::array< Numeric, 30 > a1_eveh
Definition telsem.h:368
Index calc_cellnum(Numeric lat, Numeric lon) const
Definition telsem.cc:125
bool contains(Index cellnumber) const
Definition telsem.h:68
void equare()
Definition telsem.cc:76
static const std::array< Numeric, 30 > b2_eveh
Definition telsem.h:373
ArrayOfIndex classes2
Definition telsem.h:357
Index nchan
Definition telsem.h:338
Index calc_cellnum_nearest_neighbor(Numeric lat, Numeric lon) const
Definition telsem.cc:153
static const std::array< Numeric, 30 > a0_k0
Definition telsem.h:364
static const std::array< Numeric, 30 > b0_eveh
Definition telsem.h:371
ArrayOfIndex correspondence
Definition telsem.h:361
Numeric dlat
Definition telsem.h:344
static const std::array< Numeric, 30 > b3_eveh
Definition telsem.h:374
static const std::array< Numeric, 4 > rapport54_43
Definition telsem.h:376
static const std::array< Numeric, 4 > rapport43_32
Definition telsem.h:375
Matrix emis_err
Definition telsem.h:352
static const std::array< Numeric, 30 > a0_k2
Definition telsem.h:366
ArrayOfIndex cellnums
Definition telsem.h:359
static const std::array< Numeric, 30 > a3_eveh
Definition telsem.h:370
static const std::array< Numeric, 30 > a0_k1
Definition telsem.h:365
ArrayOfIndex classes1
Definition telsem.h:356
static const std::array< Numeric, 30 > a2_eveh
Definition telsem.h:369
std::pair< Numeric, Numeric > get_coordinates(Index cellnum) const
Definition telsem.cc:208
ArrayOfIndex firstcells
Definition telsem.h:348
void telsem_calc_correspondence()
Definition telsem.cc:117
TelsemAtlas()=default
Index ndat
Definition telsem.h:336
Numeric interp_freq2(Numeric emiss19, Numeric emiss37, Numeric emiss85, Numeric f, Index class2) const
Definition telsem.cc:229
String name
Definition telsem.h:340
std::pair< Numeric, Numeric > emis_interp(Numeric theta, Numeric freq, Index class1, Index class2, const ConstVectorView &ev, const ConstVectorView &eh) const
Definition telsem.cc:270
Input manipulator class for doubles to enable nan and inf parsing.
#define ARTS_USER_ERROR_IF(condition,...)
Definition debug.h:137
constexpr Numeric DEG2RAD
Definition disort.cc:47
constexpr Numeric PI
Definition disort.cc:46
Fast double input stream with support for parsing nan and inf.
void cycle_lat_lon(Numeric &lat, Numeric &lon)
Cyclic latitude longitude coordinates.
Definition geodetic.cc:1415
constexpr Numeric EARTH_RADIUS
Definition m_planets.cc:31
constexpr Numeric pi
The following mathematical constants are generated in python Decimal package by the code:
constexpr Numeric earth_radius
Global constant, the radius of the Earth [m].
constexpr auto deg2rad(auto x) noexcept
Converts degrees to radians.
constexpr Numeric EARTH_RADIUS
Definition telsem.cc:16
constexpr Numeric DEG2RAD
Definition telsem.cc:17
std::ostream & operator<<(std::ostream &os, const TelsemAtlas &ta)
Definition telsem.cc:325
constexpr Numeric PI
Definition telsem.cc:18
This file contains the definition of the TELSEM atlas format.
#define a
#define c
#define b