ARTS  2.3.1285(git:92a29ea9-dirty)
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;
51  emis.resize(ndat, nchan);
52  emis = NAN;
53  emis_err.resize(ndat, nchan);
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};
INDEX Index
The type to use for all integer numbers and indices.
Definition: matpack.h:39
static const std::array< Numeric, 30 > a3_eveh
Definition: telsem.h:385
static const std::array< Numeric, 30 > b2_eveh
Definition: telsem.h:388
This file contains the definition of the TELSEM atlas format.
ArrayOfIndex ncells
Definition: telsem.h:361
std::pair< Numeric, Numeric > get_coordinates(Index cellnum) const
Definition: telsem.cc:229
Numeric interp_freq2(Numeric emiss19, Numeric emiss37, Numeric emiss85, Numeric f, Index class2) const
Definition: telsem.cc:250
TelsemAtlas()=default
Index calc_cellnum(Numeric lat, Numeric lon) const
Definition: telsem.cc:142
void read(std::istream &is)
Definition: telsem.cc:46
The Vector class.
Definition: matpackI.h:860
static const std::array< Numeric, 30 > b0_eveh
Definition: telsem.h:386
bool contains(Index cellnumber) const
Definition: telsem.h:83
static const std::array< Numeric, 30 > a0_eveh
Definition: telsem.h:382
Index ndat
Definition: telsem.h:351
ArrayOfIndex classes2
Definition: telsem.h:372
void equare()
Definition: telsem.cc:93
ArrayOfIndex correspondence
Definition: telsem.h:376
#define b2
Definition: complex.h:59
The implementation for String, the ARTS string class.
Definition: mystring.h:55
static const std::array< Numeric, 4 > rapport54_43
Definition: telsem.h:391
void telsem_calc_correspondence()
Definition: telsem.cc:134
Index calc_cellnum_nearest_neighbor(Numeric lat, Numeric lon) const
Definition: telsem.cc:174
Numeric DEG2RAD
static const std::array< Numeric, 30 > a0_k0
Definition: telsem.h:379
#define b0
static const std::array< Numeric, 30 > a1_eveh
Definition: telsem.h:383
static const std::array< Numeric, 30 > a0_k1
Definition: telsem.h:380
#define a1
Definition: complex.h:56
static const std::array< Numeric, 4 > rapport43_32
Definition: telsem.h:390
ArrayOfIndex classes1
Definition: telsem.h:371
NUMERIC Numeric
The type to use for all floating point numbers.
Definition: matpack.h:33
String name
Definition: telsem.h:355
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
static const std::array< Numeric, 30 > b1_eveh
Definition: telsem.h:387
static const std::array< Numeric, 30 > a0_k2
Definition: telsem.h:381
Numeric pow(const Rational base, Numeric exp)
Power of.
Definition: rational.h:628
static const std::array< Numeric, 30 > b3_eveh
Definition: telsem.h:389
Numeric dlat
Definition: telsem.h:359
ArrayOfIndex firstcells
Definition: telsem.h:363
void cycle_lat_lon(Numeric &lat, Numeric &lon)
Cyclic latitude longitude coordinates.
Definition: geodetic.cc:1300
A telsem atlas.
Definition: telsem.h:57
A constant view of a Vector.
Definition: matpackI.h:476
#define a2
Definition: complex.h:58
Matrix emis_err
Definition: telsem.h:367
Numeric PI
Matrix emis
Definition: telsem.h:365
#define b1
Definition: complex.h:57
friend std::ostream & operator<<(std::ostream &os, const TelsemAtlas &ta)
Definition: telsem.cc:346
Index nchan
Definition: telsem.h:353
static const std::array< Numeric, 30 > a2_eveh
Definition: telsem.h:384
Numeric EARTH_RADIUS
Numeric sqrt(const Rational r)
Square root.
Definition: rational.h:620
void resize(Index r, Index c)
Resize function.
Definition: matpackI.cc:1056
ArrayOfIndex cellnums
Definition: telsem.h:374