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