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