Line data Source code
1 : /*******************************************************************************
2 : * ALMA - Atacama Large Millimiter Array
3 : * (c) Instituto de Estructura de la Materia, 2009
4 : *
5 : * This library is free software; you can redistribute it and/or
6 : * modify it under the terms of the GNU Lesser General Public
7 : * License as published by the Free Software Foundation; either
8 : * version 2.1 of the License, or (at your option) any later version.
9 : *
10 : * This library 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 GNU
13 : * Lesser General Public License for more details.
14 : *
15 : * You should have received a copy of the GNU Lesser General Public
16 : * License along with this library; if not, write to the Free Software
17 : * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 : *
19 : * "@(#) $Id: ATMRefractiveIndexProfile.cpp Exp $"
20 : *
21 : * who when what
22 : * -------- -------- ----------------------------------------------
23 : * pardo 24/03/09 created
24 : */
25 :
26 : #include "ATMRefractiveIndexProfile.h"
27 :
28 : #include <iostream>
29 : #include <math.h>
30 : #include <string>
31 : #include <vector>
32 :
33 :
34 :
35 : ATM_NAMESPACE_BEGIN
36 :
37 : // Constructors
38 :
39 1 : RefractiveIndexProfile::RefractiveIndexProfile(const Frequency &freq,
40 1 : const AtmProfile &atmProfile) :
41 1 : AtmProfile(atmProfile), SpectralGrid(freq)
42 : {
43 1 : mkRefractiveIndexProfile();
44 1 : }
45 :
46 101 : RefractiveIndexProfile::RefractiveIndexProfile(const SpectralGrid &spectralGrid,
47 101 : const AtmProfile &atmProfile) :
48 101 : AtmProfile(atmProfile), SpectralGrid(spectralGrid)
49 : {
50 101 : mkRefractiveIndexProfile();
51 101 : }
52 :
53 100 : RefractiveIndexProfile::RefractiveIndexProfile(const RefractiveIndexProfile & a) : AtmProfile(a), SpectralGrid(a)
54 : {
55 : // std::cout<<"Enter RefractiveIndexProfile copy constructor version Fri May 20 00:59:47 CEST 2005"<<endl;
56 :
57 : // level AtmProfile
58 :
59 : // type_ = a.type_;
60 : // prLimit_ = a.prLimit_;
61 : /*
62 : v_hx_.reserve(a.v_hx_.size());
63 : v_px_.reserve(a.v_px_.size());
64 : v_tx_.reserve(a.v_tx_.size());
65 : for(unsigned int n=0; n<a.v_hx_.size(); n++){
66 : v_hx_.push_back(a.v_hx_[n]);
67 : v_px_.push_back(a.v_px_[n]);
68 : v_tx_.push_back(a.v_tx_[n]);
69 : }
70 : */
71 :
72 100 : typeAtm_ = a.typeAtm_;
73 100 : groundTemperature_ = a.groundTemperature_;
74 100 : tropoLapseRate_ = a.tropoLapseRate_;
75 100 : groundPressure_ = a.groundPressure_;
76 100 : relativeHumidity_ = a.relativeHumidity_;
77 100 : wvScaleHeight_ = a.wvScaleHeight_;
78 100 : pressureStep_ = a.pressureStep_;
79 100 : pressureStepFactor_ = a.pressureStepFactor_;
80 100 : altitude_ = a.altitude_;
81 100 : topAtmProfile_ = a.topAtmProfile_;
82 100 : numLayer_ = a.numLayer_;
83 100 : newBasicParam_ = a.newBasicParam_;
84 :
85 : // copy thresholds
86 100 : altitudeThreshold_ = a.altitudeThreshold_;
87 100 : groundPressureThreshold_ = a.groundPressureThreshold_;
88 100 : groundTemperatureThreshold_ = a.groundTemperatureThreshold_;
89 100 : tropoLapseRateThreshold_ = a.tropoLapseRateThreshold_;
90 100 : relativeHumidityThreshold_ = a.relativeHumidityThreshold_;
91 100 : wvScaleHeightThreshold_ = a.wvScaleHeightThreshold_;
92 :
93 100 : v_layerThickness_.reserve(numLayer_);
94 100 : v_layerTemperature_.reserve(numLayer_);
95 100 : v_layerWaterVapor_.reserve(numLayer_);
96 100 : v_layerCO_.reserve(numLayer_);
97 100 : v_layerO3_.reserve(numLayer_);
98 100 : v_layerN2O_.reserve(numLayer_);
99 100 : v_layerNO2_.reserve(numLayer_);
100 100 : v_layerSO2_.reserve(numLayer_);
101 100 : v_layerHCl_.reserve(numLayer_);
102 100 : v_layerHCN_.reserve(numLayer_);
103 :
104 :
105 4285 : for(unsigned int n = 0; n < numLayer_; n++) {
106 4185 : v_layerThickness_.push_back(a.v_layerThickness_[n]);
107 4185 : v_layerTemperature_.push_back(a.v_layerTemperature_[n]);
108 : //cout << "n=" << n << std::endl;
109 4185 : v_layerWaterVapor_.push_back(a.v_layerWaterVapor_[n]);
110 4185 : v_layerPressure_.push_back(a.v_layerPressure_[n]);
111 4185 : v_layerCO_.push_back(a.v_layerCO_[n]);
112 4185 : v_layerO3_.push_back(a.v_layerO3_[n]);
113 4185 : v_layerN2O_.push_back(a.v_layerN2O_[n]);
114 4185 : v_layerNO2_.push_back(a.v_layerNO2_[n]);
115 4185 : v_layerSO2_.push_back(a.v_layerSO2_[n]);
116 4185 : v_layerHCl_.push_back(a.v_layerHCl_[n]);
117 4185 : v_layerHCN_.push_back(a.v_layerHCN_[n]);
118 : }
119 :
120 : // level Spectral Grid
121 100 : freqUnits_ = a.freqUnits_;
122 100 : v_chanFreq_ = a.v_chanFreq_;
123 :
124 100 : v_numChan_ = a.v_numChan_;
125 100 : v_refChan_ = a.v_refChan_;
126 100 : v_refFreq_ = a.v_refFreq_;
127 100 : v_chanSep_ = a.v_chanSep_;
128 100 : v_maxFreq_ = a.v_maxFreq_;
129 100 : v_minFreq_ = a.v_minFreq_;
130 100 : v_intermediateFrequency_ = a.v_intermediateFrequency_;
131 100 : v_loFreq_ = a.v_loFreq_;
132 :
133 100 : v_sidebandSide_ = a.v_sidebandSide_;
134 100 : v_sidebandType_ = a.v_sidebandType_;
135 :
136 100 : vv_assocSpwId_ = a.vv_assocSpwId_;
137 100 : vv_assocNature_ = a.vv_assocNature_;
138 :
139 100 : v_transfertId_ = a.v_transfertId_;
140 :
141 : // level Absorption Profile
142 100 : vv_N_H2OLinesPtr_.reserve(a.v_chanFreq_.size());
143 100 : vv_N_HH16OLinesPtr_.reserve(a.v_chanFreq_.size());
144 100 : vv_N_HH16OV2LinesPtr_.reserve(a.v_chanFreq_.size());
145 100 : vv_N_HH17OLinesPtr_.reserve(a.v_chanFreq_.size());
146 100 : vv_N_HH18OLinesPtr_.reserve(a.v_chanFreq_.size());
147 100 : vv_N_HDOLinesPtr_.reserve(a.v_chanFreq_.size());
148 :
149 :
150 100 : vv_N_H2OContPtr_.reserve(a.v_chanFreq_.size());
151 100 : vv_N_O2LinesPtr_.reserve(a.v_chanFreq_.size());
152 100 : vv_N_16O16OLinesPtr_.reserve(a.v_chanFreq_.size());
153 100 : vv_N_16O16OVIBLinesPtr_.reserve(a.v_chanFreq_.size());
154 100 : vv_N_16O18OLinesPtr_.reserve(a.v_chanFreq_.size());
155 100 : vv_N_16O17OLinesPtr_.reserve(a.v_chanFreq_.size());
156 :
157 100 : vv_N_DryContPtr_.reserve(a.v_chanFreq_.size());
158 :
159 100 : vv_N_O3LinesPtr_.reserve(a.v_chanFreq_.size());
160 100 : vv_N_16O16O16OLinesPtr_.reserve(a.v_chanFreq_.size());
161 100 : vv_N_16O16O16OV1LinesPtr_.reserve(a.v_chanFreq_.size());
162 100 : vv_N_16O16O16OV2LinesPtr_.reserve(a.v_chanFreq_.size());
163 100 : vv_N_16O16O16OV3LinesPtr_.reserve(a.v_chanFreq_.size());
164 100 : vv_N_16O16O18OLinesPtr_.reserve(a.v_chanFreq_.size());
165 100 : vv_N_16O16O17OLinesPtr_.reserve(a.v_chanFreq_.size());
166 100 : vv_N_16O18O16OLinesPtr_.reserve(a.v_chanFreq_.size());
167 100 : vv_N_16O17O16OLinesPtr_.reserve(a.v_chanFreq_.size());
168 :
169 100 : vv_N_COLinesPtr_.reserve(a.v_chanFreq_.size());
170 100 : vv_N_N2OLinesPtr_.reserve(a.v_chanFreq_.size());
171 100 : vv_N_NO2LinesPtr_.reserve(a.v_chanFreq_.size());
172 100 : vv_N_SO2LinesPtr_.reserve(a.v_chanFreq_.size());
173 100 : vv_N_HClLinesPtr_.reserve(a.v_chanFreq_.size());
174 100 : vv_N_HCNLinesPtr_.reserve(a.v_chanFreq_.size());
175 :
176 : std::vector<std::complex<double> >* v_N_H2OLinesPtr;
177 : std::vector<std::complex<double> >* v_N_HH16OLinesPtr;
178 : std::vector<std::complex<double> >* v_N_HH16OV2LinesPtr;
179 : std::vector<std::complex<double> >* v_N_HH17OLinesPtr;
180 : std::vector<std::complex<double> >* v_N_HH18OLinesPtr;
181 : std::vector<std::complex<double> >* v_N_HDOLinesPtr;
182 :
183 :
184 : std::vector<std::complex<double> >* v_N_H2OContPtr;
185 : std::vector<std::complex<double> >* v_N_O2LinesPtr;
186 : std::vector<std::complex<double> >* v_N_16O16OLinesPtr;
187 : std::vector<std::complex<double> >* v_N_16O16OVIBLinesPtr;
188 : std::vector<std::complex<double> >* v_N_16O17OLinesPtr;
189 : std::vector<std::complex<double> >* v_N_16O18OLinesPtr;
190 :
191 : std::vector<std::complex<double> >* v_N_DryContPtr;
192 : std::vector<std::complex<double> >* v_N_O3LinesPtr;
193 : std::vector<std::complex<double> >* v_N_16O16O16OLinesPtr;
194 : std::vector<std::complex<double> >* v_N_16O16O16OV1LinesPtr;
195 : std::vector<std::complex<double> >* v_N_16O16O16OV2LinesPtr;
196 : std::vector<std::complex<double> >* v_N_16O16O16OV3LinesPtr;
197 : std::vector<std::complex<double> >* v_N_16O16O17OLinesPtr;
198 : std::vector<std::complex<double> >* v_N_16O16O18OLinesPtr;
199 : std::vector<std::complex<double> >* v_N_16O17O16OLinesPtr;
200 : std::vector<std::complex<double> >* v_N_16O18O16OLinesPtr;
201 : std::vector<std::complex<double> >* v_N_COLinesPtr;
202 : std::vector<std::complex<double> >* v_N_N2OLinesPtr;
203 : std::vector<std::complex<double> >* v_N_NO2LinesPtr;
204 : std::vector<std::complex<double> >* v_N_SO2LinesPtr;
205 : std::vector<std::complex<double> >* v_N_HClLinesPtr;
206 : std::vector<std::complex<double> >* v_N_HCNLinesPtr;
207 :
208 514 : for(unsigned int nc = 0; nc < v_chanFreq_.size(); nc++) {
209 :
210 414 : v_N_H2OLinesPtr = new std::vector<std::complex<double> > ;
211 414 : v_N_H2OLinesPtr->reserve(numLayer_);
212 414 : v_N_HH16OLinesPtr = new std::vector<std::complex<double> > ;
213 414 : v_N_HH16OLinesPtr->reserve(numLayer_);
214 414 : v_N_HH16OV2LinesPtr = new std::vector<std::complex<double> > ;
215 414 : v_N_HH16OV2LinesPtr->reserve(numLayer_);
216 414 : v_N_HH17OLinesPtr = new std::vector<std::complex<double> > ;
217 414 : v_N_HH17OLinesPtr->reserve(numLayer_);
218 414 : v_N_HH18OLinesPtr = new std::vector<std::complex<double> > ;
219 414 : v_N_HH18OLinesPtr->reserve(numLayer_);
220 414 : v_N_HDOLinesPtr = new std::vector<std::complex<double> > ;
221 414 : v_N_HDOLinesPtr->reserve(numLayer_);
222 :
223 :
224 414 : v_N_H2OContPtr = new std::vector<std::complex<double> > ;
225 414 : v_N_H2OContPtr->reserve(numLayer_);
226 414 : v_N_O2LinesPtr = new std::vector<std::complex<double> > ;
227 414 : v_N_O2LinesPtr->reserve(numLayer_);
228 414 : v_N_16O16OLinesPtr = new std::vector<std::complex<double> > ;
229 414 : v_N_16O16OLinesPtr->reserve(numLayer_);
230 414 : v_N_16O16OVIBLinesPtr = new std::vector<std::complex<double> > ;
231 414 : v_N_16O16OVIBLinesPtr->reserve(numLayer_);
232 414 : v_N_16O17OLinesPtr = new std::vector<std::complex<double> > ;
233 414 : v_N_16O17OLinesPtr->reserve(numLayer_);
234 414 : v_N_16O18OLinesPtr = new std::vector<std::complex<double> > ;
235 414 : v_N_16O18OLinesPtr->reserve(numLayer_);
236 :
237 414 : v_N_DryContPtr = new std::vector<std::complex<double> > ;
238 414 : v_N_DryContPtr->reserve(numLayer_);
239 414 : v_N_O3LinesPtr = new std::vector<std::complex<double> > ;
240 414 : v_N_O3LinesPtr->reserve(numLayer_);
241 414 : v_N_16O16O16OLinesPtr = new std::vector<std::complex<double> > ;
242 414 : v_N_16O16O16OLinesPtr->reserve(numLayer_);
243 414 : v_N_16O16O16OV1LinesPtr = new std::vector<std::complex<double> > ;
244 414 : v_N_16O16O16OV1LinesPtr->reserve(numLayer_);
245 414 : v_N_16O16O16OV2LinesPtr = new std::vector<std::complex<double> > ;
246 414 : v_N_16O16O16OV2LinesPtr->reserve(numLayer_);
247 414 : v_N_16O16O16OV3LinesPtr = new std::vector<std::complex<double> > ;
248 414 : v_N_16O16O16OV3LinesPtr->reserve(numLayer_);
249 :
250 414 : v_N_16O16O17OLinesPtr = new std::vector<std::complex<double> > ;
251 414 : v_N_16O16O17OLinesPtr->reserve(numLayer_);
252 414 : v_N_16O16O18OLinesPtr = new std::vector<std::complex<double> > ;
253 414 : v_N_16O16O18OLinesPtr->reserve(numLayer_);
254 414 : v_N_16O17O16OLinesPtr = new std::vector<std::complex<double> > ;
255 414 : v_N_16O17O16OLinesPtr->reserve(numLayer_);
256 414 : v_N_16O18O16OLinesPtr = new std::vector<std::complex<double> > ;
257 414 : v_N_16O18O16OLinesPtr->reserve(numLayer_);
258 414 : v_N_COLinesPtr = new std::vector<std::complex<double> > ;
259 414 : v_N_COLinesPtr->reserve(numLayer_);
260 414 : v_N_N2OLinesPtr = new std::vector<std::complex<double> > ;
261 414 : v_N_N2OLinesPtr->reserve(numLayer_);
262 414 : v_N_NO2LinesPtr = new std::vector<std::complex<double> > ;
263 414 : v_N_NO2LinesPtr->reserve(numLayer_);
264 414 : v_N_SO2LinesPtr = new std::vector<std::complex<double> > ;
265 414 : v_N_SO2LinesPtr->reserve(numLayer_);
266 414 : v_N_HClLinesPtr = new std::vector<std::complex<double> > ;
267 414 : v_N_HClLinesPtr->reserve(numLayer_);
268 414 : v_N_HCNLinesPtr = new std::vector<std::complex<double> > ;
269 414 : v_N_HCNLinesPtr->reserve(numLayer_);
270 :
271 17502 : for(unsigned int n = 0; n < numLayer_; n++) {
272 :
273 : // std::cout << "numLayer_=" << nc << " " << n << std::endl; // COMMENTED OUT BY JUAN MAY/16/2005
274 :
275 17088 : v_N_H2OLinesPtr->push_back(a.vv_N_H2OLinesPtr_[nc]->at(n));
276 17088 : v_N_HH16OLinesPtr->push_back(a.vv_N_HH16OLinesPtr_[nc]->at(n));
277 17088 : v_N_HH16OV2LinesPtr->push_back(a.vv_N_HH16OV2LinesPtr_[nc]->at(n));
278 17088 : v_N_HH17OLinesPtr->push_back(a.vv_N_HH17OLinesPtr_[nc]->at(n));
279 17088 : v_N_HH18OLinesPtr->push_back(a.vv_N_HH18OLinesPtr_[nc]->at(n));
280 17088 : v_N_HDOLinesPtr->push_back(a.vv_N_HDOLinesPtr_[nc]->at(n));
281 :
282 :
283 17088 : v_N_H2OContPtr->push_back(a.vv_N_H2OContPtr_[nc]->at(n));
284 17088 : v_N_O2LinesPtr->push_back(a.vv_N_O2LinesPtr_[nc]->at(n));
285 17088 : v_N_16O16OLinesPtr->push_back(a.vv_N_16O16OLinesPtr_[nc]->at(n));
286 17088 : v_N_16O16OVIBLinesPtr->push_back(a.vv_N_16O16OVIBLinesPtr_[nc]->at(n));
287 17088 : v_N_16O18OLinesPtr->push_back(a.vv_N_16O18OLinesPtr_[nc]->at(n));
288 17088 : v_N_16O17OLinesPtr->push_back(a.vv_N_16O17OLinesPtr_[nc]->at(n));
289 :
290 :
291 :
292 17088 : v_N_DryContPtr->push_back(a.vv_N_DryContPtr_[nc]->at(n));
293 17088 : v_N_O3LinesPtr->push_back(a.vv_N_O3LinesPtr_[nc]->at(n));
294 17088 : v_N_16O16O16OLinesPtr->push_back(a.vv_N_16O16O16OLinesPtr_[nc]->at(n));
295 17088 : v_N_16O16O16OV1LinesPtr->push_back(a.vv_N_16O16O16OV1LinesPtr_[nc]->at(n));
296 17088 : v_N_16O16O16OV2LinesPtr->push_back(a.vv_N_16O16O16OV2LinesPtr_[nc]->at(n));
297 17088 : v_N_16O16O16OV3LinesPtr->push_back(a.vv_N_16O16O16OV3LinesPtr_[nc]->at(n));
298 17088 : v_N_16O16O17OLinesPtr->push_back(a.vv_N_16O16O17OLinesPtr_[nc]->at(n));
299 17088 : v_N_16O16O18OLinesPtr->push_back(a.vv_N_16O16O18OLinesPtr_[nc]->at(n));
300 17088 : v_N_16O17O16OLinesPtr->push_back(a.vv_N_16O17O16OLinesPtr_[nc]->at(n));
301 17088 : v_N_16O18O16OLinesPtr->push_back(a.vv_N_16O18O16OLinesPtr_[nc]->at(n));
302 17088 : v_N_COLinesPtr->push_back(a.vv_N_COLinesPtr_[nc]->at(n));
303 17088 : v_N_N2OLinesPtr->push_back(a.vv_N_N2OLinesPtr_[nc]->at(n));
304 17088 : v_N_NO2LinesPtr->push_back(a.vv_N_NO2LinesPtr_[nc]->at(n));
305 17088 : v_N_SO2LinesPtr->push_back(a.vv_N_SO2LinesPtr_[nc]->at(n));
306 17088 : v_N_HClLinesPtr->push_back(a.vv_N_HClLinesPtr_[nc]->at(n));
307 17088 : v_N_HCNLinesPtr->push_back(a.vv_N_HCNLinesPtr_[nc]->at(n));
308 :
309 : }
310 :
311 414 : vv_N_H2OLinesPtr_.push_back(v_N_H2OLinesPtr);
312 414 : vv_N_HH16OLinesPtr_.push_back(v_N_HH16OLinesPtr);
313 414 : vv_N_HH16OV2LinesPtr_.push_back(v_N_HH16OV2LinesPtr);
314 414 : vv_N_HH17OLinesPtr_.push_back(v_N_HH17OLinesPtr);
315 414 : vv_N_HH18OLinesPtr_.push_back(v_N_HH18OLinesPtr);
316 414 : vv_N_HDOLinesPtr_.push_back(v_N_HDOLinesPtr);
317 :
318 414 : vv_N_H2OContPtr_.push_back(v_N_H2OContPtr);
319 414 : vv_N_O2LinesPtr_.push_back(v_N_O2LinesPtr);
320 414 : vv_N_16O16OLinesPtr_.push_back(v_N_16O16OLinesPtr);
321 414 : vv_N_16O16OVIBLinesPtr_.push_back(v_N_16O16OVIBLinesPtr);
322 414 : vv_N_16O18OLinesPtr_.push_back(v_N_16O18OLinesPtr);
323 414 : vv_N_16O17OLinesPtr_.push_back(v_N_16O17OLinesPtr);
324 :
325 :
326 :
327 414 : vv_N_DryContPtr_.push_back(v_N_DryContPtr);
328 414 : vv_N_O3LinesPtr_.push_back(v_N_O3LinesPtr);
329 414 : vv_N_16O16O16OLinesPtr_.push_back(v_N_16O16O16OLinesPtr);
330 414 : vv_N_16O16O16OV1LinesPtr_.push_back(v_N_16O16O16OV1LinesPtr);
331 414 : vv_N_16O16O16OV2LinesPtr_.push_back(v_N_16O16O16OV2LinesPtr);
332 414 : vv_N_16O16O16OV3LinesPtr_.push_back(v_N_16O16O16OV3LinesPtr);
333 414 : vv_N_16O16O17OLinesPtr_.push_back(v_N_16O16O17OLinesPtr);
334 414 : vv_N_16O16O18OLinesPtr_.push_back(v_N_16O16O18OLinesPtr);
335 414 : vv_N_16O17O16OLinesPtr_.push_back(v_N_16O17O16OLinesPtr);
336 414 : vv_N_16O18O16OLinesPtr_.push_back(v_N_16O18O16OLinesPtr);
337 414 : vv_N_COLinesPtr_.push_back(v_N_COLinesPtr);
338 414 : vv_N_N2OLinesPtr_.push_back(v_N_N2OLinesPtr);
339 414 : vv_N_NO2LinesPtr_.push_back(v_N_NO2LinesPtr);
340 414 : vv_N_SO2LinesPtr_.push_back(v_N_SO2LinesPtr);
341 414 : vv_N_HClLinesPtr_.push_back(v_N_HClLinesPtr);
342 414 : vv_N_HCNLinesPtr_.push_back(v_N_HCNLinesPtr);
343 :
344 : }
345 :
346 100 : }
347 :
348 0 : RefractiveIndexProfile::RefractiveIndexProfile()
349 : {
350 0 : }
351 :
352 202 : RefractiveIndexProfile::~RefractiveIndexProfile()
353 : {
354 202 : rmRefractiveIndexProfile();
355 202 : }
356 :
357 322 : void RefractiveIndexProfile::rmRefractiveIndexProfile()
358 : {
359 : // for every frequency channel delete the pointer to the absorption profile
360 3601 : for(unsigned int nc = 0; nc < v_chanFreq_.size(); nc++) {
361 3279 : delete vv_N_H2OLinesPtr_[nc];
362 3279 : delete vv_N_HH16OLinesPtr_[nc];
363 3279 : delete vv_N_HH16OV2LinesPtr_[nc];
364 3279 : delete vv_N_HH17OLinesPtr_[nc];
365 3279 : delete vv_N_HH18OLinesPtr_[nc];
366 3279 : delete vv_N_HDOLinesPtr_[nc];
367 :
368 3279 : delete vv_N_H2OContPtr_[nc];
369 3279 : delete vv_N_O2LinesPtr_[nc];
370 3279 : delete vv_N_16O16OLinesPtr_[nc];
371 3279 : delete vv_N_16O16OVIBLinesPtr_[nc];
372 3279 : delete vv_N_16O18OLinesPtr_[nc];
373 3279 : delete vv_N_16O17OLinesPtr_[nc];
374 :
375 :
376 :
377 3279 : delete vv_N_DryContPtr_[nc];
378 3279 : delete vv_N_O3LinesPtr_[nc];
379 3279 : delete vv_N_16O16O16OLinesPtr_[nc];
380 3279 : delete vv_N_16O16O16OV1LinesPtr_[nc];
381 3279 : delete vv_N_16O16O16OV2LinesPtr_[nc];
382 3279 : delete vv_N_16O16O16OV3LinesPtr_[nc];
383 3279 : delete vv_N_16O16O17OLinesPtr_[nc];
384 3279 : delete vv_N_16O16O18OLinesPtr_[nc];
385 3279 : delete vv_N_16O17O16OLinesPtr_[nc];
386 3279 : delete vv_N_16O18O16OLinesPtr_[nc];
387 3279 : delete vv_N_COLinesPtr_[nc];
388 3279 : delete vv_N_N2OLinesPtr_[nc];
389 3279 : delete vv_N_NO2LinesPtr_[nc];
390 3279 : delete vv_N_SO2LinesPtr_[nc];
391 3279 : delete vv_N_HClLinesPtr_[nc];
392 3279 : delete vv_N_HCNLinesPtr_[nc];
393 : }
394 322 : }
395 :
396 120 : bool RefractiveIndexProfile::updateRefractiveIndexProfile(const Length &altitude,
397 : const Pressure &groundPressure,
398 : const Temperature &groundTemperature,
399 : double tropoLapseRate,
400 : const Humidity &relativeHumidity,
401 : const Length &wvScaleHeight)
402 : {
403 :
404 120 : bool updated = false;
405 120 : bool mkNewAtmProfile = updateAtmProfile(altitude,
406 : groundPressure,
407 : groundTemperature,
408 : tropoLapseRate,
409 : relativeHumidity,
410 : wvScaleHeight);
411 120 : unsigned int numLayer = getNumLayer();
412 :
413 120 : if(vv_N_H2OLinesPtr_.size() < v_chanFreq_.size()) {
414 0 : mkNewAtmProfile = true;
415 0 : std::cout << " RefractiveIndexProfile: number of spectral windows has increased"
416 0 : << std::endl;
417 : }
418 120 : if(mkNewAtmProfile) {
419 120 : if(numLayer) {
420 120 : mkRefractiveIndexProfile();
421 120 : updated = true;
422 : } else {
423 0 : std::cout << " RefractiveIndexProfile: ERROR: getNumLayer() returns 0"
424 0 : << std::endl;
425 : }
426 : }
427 120 : return updated;
428 : }
429 :
430 : // NB: this interface is required because the sub-class .... overrides this method.
431 0 : bool RefractiveIndexProfile::setBasicAtmosphericParameters(const Length &altitude,
432 : const Pressure &groundPressure,
433 : const Temperature &groundTemperature,
434 : double tropoLapseRate,
435 : const Humidity &relativeHumidity,
436 : const Length &wvScaleHeight)
437 : {
438 0 : bool updated = updateRefractiveIndexProfile(altitude,
439 : groundPressure,
440 : groundTemperature,
441 : tropoLapseRate,
442 : relativeHumidity,
443 : wvScaleHeight);
444 0 : return updated;
445 : }
446 :
447 222 : void RefractiveIndexProfile::mkRefractiveIndexProfile()
448 : {
449 :
450 : // static const double abun_18o=0.0020439;
451 : // static const double abun_17o=0.0003750;
452 : // static const double abun_D=0.000298444;
453 : // static const double o2_mixing_ratio=0.2092;
454 : // static const double mmol_h2o=18.005059688; // 20*0.0020439+19*(0.0003750+2*0.000298444)+18*(1-0.0020439-0.0003750-2*0.000298444)
455 :
456 : // static bool first = true; // [-Wunused_but_set_variable]
457 :
458 : double abun_O3, abun_CO, abun_N2O, abun_NO2, abun_SO2, abun_HCl, abun_HCN;
459 : double wvt, wv;
460 : // double t; // [-Wunused_but_set_variable]
461 : double nu;
462 : // double nu2, nu_pi; // [-Wunused_but_set_variable]
463 : // double width;
464 : // unsigned int npoints;
465 222 : RefractiveIndex atm;
466 : // double sumAbsO3Lines1, sumAbsCOLines1, sumAbsN2OLines1, sumAbsNO2Lines1, sumAbsSO2Lines1, sumAbsHClLines1, sumAbsHCNLines1;
467 :
468 :
469 : //TODO we will have to put numLayer_ and v_chanFreq_.size() const
470 : //we do not want to resize! ==> pas de setter pour SpectralGrid
471 :
472 : //cout << "vv_N_H2OLinesPtr_.size()=" << vv_N_H2OLinesPtr_.size() << std::endl;
473 222 : if(vv_N_H2OLinesPtr_.size() == 0) { // first time
474 102 : vv_N_H2OLinesPtr_.reserve(v_chanFreq_.size());
475 102 : vv_N_HH16OLinesPtr_.reserve(v_chanFreq_.size());
476 102 : vv_N_HH16OV2LinesPtr_.reserve(v_chanFreq_.size());
477 102 : vv_N_HH17OLinesPtr_.reserve(v_chanFreq_.size());
478 102 : vv_N_HH18OLinesPtr_.reserve(v_chanFreq_.size());
479 102 : vv_N_HDOLinesPtr_.reserve(v_chanFreq_.size());
480 :
481 102 : vv_N_H2OContPtr_.reserve(v_chanFreq_.size());
482 102 : vv_N_O2LinesPtr_.reserve(v_chanFreq_.size());
483 102 : vv_N_16O16OLinesPtr_.reserve(v_chanFreq_.size());
484 102 : vv_N_16O16OVIBLinesPtr_.reserve(v_chanFreq_.size());
485 102 : vv_N_16O17OLinesPtr_.reserve(v_chanFreq_.size());
486 102 : vv_N_16O18OLinesPtr_.reserve(v_chanFreq_.size());
487 :
488 :
489 :
490 102 : vv_N_DryContPtr_.reserve(v_chanFreq_.size());
491 102 : vv_N_O3LinesPtr_.reserve(v_chanFreq_.size());
492 102 : vv_N_16O16O16OLinesPtr_.reserve(v_chanFreq_.size());
493 102 : vv_N_16O16O16OV1LinesPtr_.reserve(v_chanFreq_.size());
494 102 : vv_N_16O16O16OV2LinesPtr_.reserve(v_chanFreq_.size());
495 102 : vv_N_16O16O16OV3LinesPtr_.reserve(v_chanFreq_.size());
496 102 : vv_N_16O16O17OLinesPtr_.reserve(v_chanFreq_.size());
497 102 : vv_N_16O16O18OLinesPtr_.reserve(v_chanFreq_.size());
498 102 : vv_N_16O17O16OLinesPtr_.reserve(v_chanFreq_.size());
499 102 : vv_N_16O18O16OLinesPtr_.reserve(v_chanFreq_.size());
500 102 : vv_N_COLinesPtr_.reserve(v_chanFreq_.size());
501 102 : vv_N_N2OLinesPtr_.reserve(v_chanFreq_.size());
502 102 : vv_N_NO2LinesPtr_.reserve(v_chanFreq_.size());
503 102 : vv_N_SO2LinesPtr_.reserve(v_chanFreq_.size());
504 102 : vv_N_HClLinesPtr_.reserve(v_chanFreq_.size());
505 102 : vv_N_HCNLinesPtr_.reserve(v_chanFreq_.size());
506 : } else {
507 120 : if(vv_N_H2OLinesPtr_.size() == v_chanFreq_.size()) // there are new basic param
508 120 : rmRefractiveIndexProfile(); // delete all the layer profiles for all the frequencies
509 : }
510 :
511 : std::vector<std::complex<double> >* v_N_H2OLinesPtr;
512 : std::vector<std::complex<double> >* v_N_HH16OLinesPtr;
513 : std::vector<std::complex<double> >* v_N_HH16OV2LinesPtr;
514 : std::vector<std::complex<double> >* v_N_HH17OLinesPtr;
515 : std::vector<std::complex<double> >* v_N_HH18OLinesPtr;
516 : std::vector<std::complex<double> >* v_N_HDOLinesPtr;
517 :
518 : std::vector<std::complex<double> >* v_N_H2OContPtr;
519 : std::vector<std::complex<double> >* v_N_O2LinesPtr;
520 : std::vector<std::complex<double> >* v_N_16O16OLinesPtr;
521 : std::vector<std::complex<double> >* v_N_16O16OVIBLinesPtr;
522 : std::vector<std::complex<double> >* v_N_16O17OLinesPtr;
523 : std::vector<std::complex<double> >* v_N_16O18OLinesPtr;
524 :
525 : std::vector<std::complex<double> >* v_N_DryContPtr;
526 : std::vector<std::complex<double> >* v_N_O3LinesPtr;
527 : std::vector<std::complex<double> >* v_N_16O16O16OLinesPtr;
528 : std::vector<std::complex<double> >* v_N_16O16O16OV1LinesPtr;
529 : std::vector<std::complex<double> >* v_N_16O16O16OV2LinesPtr;
530 : std::vector<std::complex<double> >* v_N_16O16O16OV3LinesPtr;
531 : std::vector<std::complex<double> >* v_N_16O16O17OLinesPtr;
532 : std::vector<std::complex<double> >* v_N_16O16O18OLinesPtr;
533 : std::vector<std::complex<double> >* v_N_16O17O16OLinesPtr;
534 : std::vector<std::complex<double> >* v_N_16O18O16OLinesPtr;
535 : std::vector<std::complex<double> >* v_N_COLinesPtr;
536 : std::vector<std::complex<double> >* v_N_N2OLinesPtr;
537 : std::vector<std::complex<double> >* v_N_NO2LinesPtr;
538 : std::vector<std::complex<double> >* v_N_SO2LinesPtr;
539 : std::vector<std::complex<double> >* v_N_HClLinesPtr;
540 : std::vector<std::complex<double> >* v_N_HCNLinesPtr;
541 :
542 : // std::cout << "v_chanFreq_.size()=" << v_chanFreq_.size() << std::endl;
543 : // std::cout << "numLayer_=" << numLayer_ << std::endl;
544 : // std::cout << "v_chanFreq_[0]=" << v_chanFreq_[0] << std::endl;
545 : // check if new spectral windows have been added
546 : unsigned int ncmin;
547 : /* std::cout << "vv_N_H2OLinesPtr_.size()="<<vv_N_H2OLinesPtr_.size()<<endl; */
548 222 : ncmin = vv_N_H2OLinesPtr_.size(); // will be > 0 if spectral window(s) have been added
549 222 : if(newBasicParam_) ncmin = 0;
550 :
551 : // std::cout << "ncmin=" << ncmin << std::endl;
552 :
553 3087 : for(unsigned int nc = ncmin; nc < v_chanFreq_.size(); nc++) {
554 :
555 2865 : v_N_H2OLinesPtr = new std::vector<std::complex<double> > ;
556 2865 : v_N_HH16OLinesPtr = new std::vector<std::complex<double> > ;
557 2865 : v_N_HH16OV2LinesPtr = new std::vector<std::complex<double> > ;
558 2865 : v_N_HH17OLinesPtr = new std::vector<std::complex<double> > ;
559 2865 : v_N_HH18OLinesPtr = new std::vector<std::complex<double> > ;
560 2865 : v_N_HDOLinesPtr = new std::vector<std::complex<double> > ;
561 :
562 2865 : v_N_H2OContPtr = new std::vector<std::complex<double> > ;
563 2865 : v_N_O2LinesPtr = new std::vector<std::complex<double> > ;
564 2865 : v_N_16O16OLinesPtr = new std::vector<std::complex<double> > ;
565 2865 : v_N_16O16OVIBLinesPtr = new std::vector<std::complex<double> > ;
566 2865 : v_N_16O17OLinesPtr = new std::vector<std::complex<double> > ;
567 2865 : v_N_16O18OLinesPtr = new std::vector<std::complex<double> > ;
568 :
569 2865 : v_N_DryContPtr = new std::vector<std::complex<double> > ;
570 2865 : v_N_O3LinesPtr = new std::vector<std::complex<double> > ;
571 2865 : v_N_16O16O16OLinesPtr = new std::vector<std::complex<double> > ;
572 2865 : v_N_16O16O16OV1LinesPtr = new std::vector<std::complex<double> > ;
573 2865 : v_N_16O16O16OV2LinesPtr = new std::vector<std::complex<double> > ;
574 2865 : v_N_16O16O16OV3LinesPtr = new std::vector<std::complex<double> > ;
575 2865 : v_N_16O16O17OLinesPtr = new std::vector<std::complex<double> > ;
576 2865 : v_N_16O16O18OLinesPtr = new std::vector<std::complex<double> > ;
577 2865 : v_N_16O17O16OLinesPtr = new std::vector<std::complex<double> > ;
578 2865 : v_N_16O18O16OLinesPtr = new std::vector<std::complex<double> > ;
579 2865 : v_N_COLinesPtr = new std::vector<std::complex<double> > ;
580 2865 : v_N_N2OLinesPtr = new std::vector<std::complex<double> > ;
581 2865 : v_N_NO2LinesPtr = new std::vector<std::complex<double> > ;
582 2865 : v_N_SO2LinesPtr = new std::vector<std::complex<double> > ;
583 2865 : v_N_HClLinesPtr = new std::vector<std::complex<double> > ;
584 2865 : v_N_HCNLinesPtr = new std::vector<std::complex<double> > ;
585 :
586 :
587 2865 : v_N_H2OLinesPtr->reserve(numLayer_);
588 2865 : v_N_HH16OLinesPtr->reserve(numLayer_);
589 2865 : v_N_HH16OV2LinesPtr->reserve(numLayer_);
590 2865 : v_N_HH17OLinesPtr->reserve(numLayer_);
591 2865 : v_N_HH18OLinesPtr->reserve(numLayer_);
592 2865 : v_N_HDOLinesPtr->reserve(numLayer_);
593 :
594 2865 : v_N_H2OContPtr->reserve(numLayer_);
595 2865 : v_N_O2LinesPtr->reserve(numLayer_);
596 2865 : v_N_16O16OLinesPtr->reserve(numLayer_);
597 2865 : v_N_16O16OVIBLinesPtr->reserve(numLayer_);
598 2865 : v_N_16O17OLinesPtr->reserve(numLayer_);
599 2865 : v_N_16O18OLinesPtr->reserve(numLayer_);
600 :
601 2865 : v_N_DryContPtr->reserve(numLayer_);
602 2865 : v_N_O3LinesPtr->reserve(numLayer_);
603 2865 : v_N_16O16O16OLinesPtr->reserve(numLayer_);
604 2865 : v_N_16O16O16OV1LinesPtr->reserve(numLayer_);
605 2865 : v_N_16O16O16OV2LinesPtr->reserve(numLayer_);
606 2865 : v_N_16O16O16OV3LinesPtr->reserve(numLayer_);
607 2865 : v_N_16O16O17OLinesPtr->reserve(numLayer_);
608 2865 : v_N_16O16O18OLinesPtr->reserve(numLayer_);
609 2865 : v_N_16O17O16OLinesPtr->reserve(numLayer_);
610 2865 : v_N_16O18O16OLinesPtr->reserve(numLayer_);
611 2865 : v_N_COLinesPtr->reserve(numLayer_);
612 2865 : v_N_N2OLinesPtr->reserve(numLayer_);
613 2865 : v_N_NO2LinesPtr->reserve(numLayer_);
614 2865 : v_N_SO2LinesPtr->reserve(numLayer_);
615 2865 : v_N_HClLinesPtr->reserve(numLayer_);
616 2865 : v_N_HCNLinesPtr->reserve(numLayer_);
617 :
618 2865 : nu = 1.0E-9 * v_chanFreq_[nc]; // ATM uses GHz units
619 :
620 : // std::cout << "freq. points =" << v_chanFreq_.size() << std::endl;
621 :
622 : /* TO BE IMPLEMENTED IN NEXT RELEASE
623 :
624 : if (v_chanFreq_.size()>1){
625 : if(nc==0){
626 : width = fabs(v_chanFreq_[nc+1]-v_chanFreq_[nc])*1e-9; // width en GHz para ATM
627 : npoints=(unsigned int)round(width*100); // One point every 10 MHz
628 : }else{
629 : if(nc==v_chanFreq_.size()-1){
630 : width = fabs(v_chanFreq_[nc]-v_chanFreq_[nc-1])*1e-9; // width en GHz para ATM
631 : npoints=(unsigned int)round(width*100); // One point every 10 MHz
632 : }else{
633 : width = fabs((v_chanFreq_[nc+1]-v_chanFreq_[nc-1])/2.0)*1e-9; // width en GHz para ATM
634 : npoints=(unsigned int)round(width*100); // One point every 10 MHz
635 : }
636 : }
637 : }else{
638 : width = 0.001; // default width = 1 MHz = 0.001 GHz
639 : npoints=1;
640 : }
641 :
642 : if(npoints==0){npoints=1;}
643 :
644 : */
645 :
646 :
647 :
648 : // std::cout << "nc =" << nc << " nu=" << nu << " width=" << width << " GHz npoints=" << npoints << std::endl;
649 :
650 : // nu2 = nu * nu; // [-Wunused_but_set_variable]
651 : // nu_pi = nu / M_PI; // [-Wunused_but_set_variable]
652 :
653 86218 : for(unsigned int j = 0; j < numLayer_; j++) {
654 :
655 83353 : wv = v_layerWaterVapor_[j] * 1000.0; // se multiplica por 10**3 por cuestión de unidades en las rutinas fortran.
656 83353 : wvt = wv * v_layerTemperature_[j] / 217.0; // v_layerWaterVapor_[j] está en kg/m**3
657 : // t = v_layerTemperature_[j] / 300.0; // [-Wunused_but_set_variable]
658 :
659 :
660 : // std::cout <<"ATMRefractiveIndexProfile: " << v_layerTemperature_[j] << " K " << v_layerPressure_[j] << " mb " << nu << " GHz " << std::endl;
661 : // std::cout <<"ATMRefractiveIndexProfile: O2" << atm.getRefractivity_o2(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu) << std::endl;
662 : // std::cout << "ATMRefractiveIndexProfile: O2" << atm.getRefractivity_o2(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu,width,npoints) << std::endl;
663 : // std::cout << "ATMRefractiveIndexProfile: H2O" << atm.getRefractivity_h2o(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu) << std::endl;
664 : // std::cout << "ATMRefractiveIndexProfile: H2O" << atm.getRefractivity_h2o(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu,width,npoints) << std::endl;
665 : // std::cout <<"ATMRefractiveIndexProfile: O3" << atm.getRefractivity_o3(v_layerTemperature_[j],v_layerPressure_[j],nu,v_layerO3_[j]) << std::endl;
666 : // std::cout << "ATMRefractiveIndexProfile: O3" << atm.getRefractivity_o3(v_layerTemperature_[j],v_layerPressure_[j],nu,width,npoints,v_layerO3_[j]) << std::endl;
667 : // std::cout <<"ATMRefractiveIndexProfile: CO" << atm.getSpecificRefractivity_co(v_layerTemperature_[j],v_layerPressure_[j],nu) << std::endl;
668 : // std::cout << "ATMRefractiveIndexProfile: CO" << atm.getSpecificRefractivity_co(v_layerTemperature_[j],v_layerPressure_[j],nu,width,npoints) << std::endl;
669 :
670 83353 : v_N_O2LinesPtr->push_back(atm.getRefractivity_o2(v_layerTemperature_[j], v_layerPressure_[j], wvt, nu)); // ,width,npoints)); TO BE IMPLEMENTED IN NEXT RELEASE
671 83353 : v_N_16O16OLinesPtr->push_back(atm.getRefractivity_16o16o(v_layerTemperature_[j], v_layerPressure_[j], wvt, nu)); // ,width,npoints)); TO BE IMPLEMENTED IN NEXT RELEASE
672 83353 : v_N_16O16OVIBLinesPtr->push_back(atm.getRefractivity_16o16o_vib(v_layerTemperature_[j], v_layerPressure_[j], wvt, nu)); // ,width,npoints)); TO BE IMPLEMENTED IN NEXT RELEASE
673 83353 : v_N_16O18OLinesPtr->push_back(atm.getRefractivity_16o18o(v_layerTemperature_[j], v_layerPressure_[j], wvt, nu)); // ,width,npoints)); TO BE IMPLEMENTED IN NEXT RELEASE
674 83353 : v_N_16O17OLinesPtr->push_back(atm.getRefractivity_16o17o(v_layerTemperature_[j], v_layerPressure_[j], wvt, nu)); // ,width,npoints)); TO BE IMPLEMENTED IN NEXT RELEASE
675 :
676 : std::complex<double> cont_h2o =
677 83353 : atm.getRefractivity_cnth2o(v_layerTemperature_[j],
678 83353 : v_layerPressure_[j],
679 : wvt,
680 : nu); // ,width,npoints); TO BE IMPLEMENTED IN NEXT RELEASE
681 : std::complex<double> cont_dry =
682 83353 : atm.getRefractivity_cntdry(v_layerTemperature_[j],
683 83353 : v_layerPressure_[j],
684 : wvt,
685 : nu); // ,width,npoints); TO BE IMPLEMENTED IN NEXT RELEASE
686 :
687 83353 : v_N_H2OContPtr->push_back(cont_h2o);
688 83353 : v_N_DryContPtr->push_back(cont_dry);
689 :
690 83353 : if(v_layerWaterVapor_[j] > 0) {
691 :
692 83353 : v_N_H2OLinesPtr->push_back(atm.getRefractivity_h2o(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu)); // ,width,npoints)); TO BE IMPLEMENTED IN NEXT RELEASE
693 83353 : v_N_HH16OLinesPtr->push_back(atm.getRefractivity_hh16o(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu));
694 83353 : v_N_HH16OV2LinesPtr->push_back(atm.getRefractivity_hh16ov2(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu));
695 83353 : v_N_HH17OLinesPtr->push_back(atm.getRefractivity_hh17o(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu));
696 83353 : v_N_HH18OLinesPtr->push_back(atm.getRefractivity_hh18o(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu));
697 83353 : v_N_HDOLinesPtr->push_back(atm.getRefractivity_hdo(v_layerTemperature_[j],v_layerPressure_[j],wvt,nu));
698 :
699 : } else {
700 0 : v_N_H2OLinesPtr->push_back(0.0);
701 0 : v_N_HH16OLinesPtr->push_back(0.0);
702 0 : v_N_HH16OV2LinesPtr->push_back(0.0);
703 0 : v_N_HH17OLinesPtr->push_back(0.0);
704 0 : v_N_HH18OLinesPtr->push_back(0.0);
705 0 : v_N_HDOLinesPtr->push_back(0.0);
706 : }
707 :
708 : // if(v_layerO3_[j]<0.0||j==10){cout << "v_layerO3_[" << j << "]=" << v_layerO3_[j] << std::endl;}
709 :
710 83353 : if(v_layerO3_[j] > 0) {
711 :
712 83353 : abun_O3 = v_layerO3_[j] * 1E-6;
713 83353 : v_N_O3LinesPtr->push_back(atm.getRefractivity_o3(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6)); // width for nu, npoints, TO BE IMPLEMENTED
714 83353 : v_N_16O16O16OLinesPtr->push_back(atm.getRefractivity_16o16o16o(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
715 83353 : v_N_16O16O16OV1LinesPtr->push_back(atm.getRefractivity_16o16o16o_v1(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
716 83353 : v_N_16O16O16OV2LinesPtr->push_back(atm.getRefractivity_16o16o16o_v2(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
717 83353 : v_N_16O16O16OV3LinesPtr->push_back(atm.getRefractivity_16o16o16o_v3(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
718 83353 : v_N_16O16O17OLinesPtr->push_back(atm.getRefractivity_16o16o17o(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
719 83353 : v_N_16O16O18OLinesPtr->push_back(atm.getRefractivity_16o16o18o(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
720 83353 : v_N_16O17O16OLinesPtr->push_back(atm.getRefractivity_16o17o16o(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
721 83353 : v_N_16O18O16OLinesPtr->push_back(atm.getRefractivity_16o18o16o(v_layerTemperature_[j], v_layerPressure_[j], nu, abun_O3 * 1e6));
722 : // 29JUL2024 29JUL2024 29JUL2024
723 : } else {
724 0 : v_N_O3LinesPtr->push_back(0.0);
725 : }
726 :
727 83353 : if(v_layerCO_[j] > 0) {
728 83353 : abun_CO = v_layerCO_[j] * 1E-6; // in cm^-3
729 166706 : v_N_COLinesPtr->push_back(atm.getEarthSpecificRefractivity_co(v_layerTemperature_[j],
730 83353 : v_layerPressure_[j],
731 : nu) // ,width,npoints) TO BE IMPLEMENTED IN NEXT RELEASE
732 250059 : * abun_CO * 1e6); // m^2 * m^-3 = m^-1
733 : } else {
734 0 : v_N_COLinesPtr->push_back(0.0);
735 : }
736 :
737 83353 : if(v_layerN2O_[j] > 0) {
738 83353 : abun_N2O = v_layerN2O_[j] * 1E-6;
739 166706 : v_N_N2OLinesPtr->push_back(atm.getEarthSpecificRefractivity_n2o(v_layerTemperature_[j],
740 83353 : v_layerPressure_[j],
741 : nu) // ,width,npoints) TO BE IMPLEMENTED IN NEXT RELEASE
742 250059 : * abun_N2O * 1e6); // m^2 * m^-3 = m^-1
743 : } else {
744 0 : v_N_N2OLinesPtr->push_back(0.0);
745 : }
746 :
747 83353 : if(v_layerNO2_[j] > 0) {
748 83353 : abun_NO2 = v_layerNO2_[j] * 1E-6;
749 : // std::cout << "abun_NO2[" << j << "]=" << abun_NO2 << " opacity=" << atm.getSpecificRefractivity_no2(v_layerTemperature_[j], v_layerPressure_[j], nu) * abun_NO2 * 1e6 << std::endl;
750 83353 : v_N_NO2LinesPtr->push_back(atm.getEarthSpecificRefractivity_no2(v_layerTemperature_[j], v_layerPressure_[j], nu) * abun_NO2 * 1e6); // m^2 * m^-3 = m^-1
751 : } else {
752 0 : v_N_NO2LinesPtr->push_back(0.0);
753 : }
754 :
755 83353 : if(v_layerHCl_[j] > 0) {
756 83353 : abun_HCl = v_layerHCl_[j] * 1E-6;
757 166706 : v_N_HClLinesPtr->push_back(atm.getEarthSpecificRefractivity_hcl(v_layerTemperature_[j],
758 83353 : v_layerPressure_[j],
759 : nu) // ,width,npoints) TO BE IMPLEMENTED IN NEXT RELEASE
760 250059 : * abun_HCl * 1e6); // m^2 * m^-3 = m^-1
761 : } else {
762 0 : v_N_HClLinesPtr->push_back(0.0);
763 : }
764 :
765 83353 : if(v_layerHCN_[j] > 0) {
766 83353 : abun_HCN = v_layerHCN_[j] * 1E-6;
767 166706 : v_N_HCNLinesPtr->push_back(atm.getEarthSpecificRefractivity_hcn(v_layerTemperature_[j],
768 83353 : v_layerPressure_[j],
769 : nu) // ,width,npoints) TO BE IMPLEMENTED IN NEXT RELEASE
770 250059 : * abun_HCN * 1e6); // m^2 * m^-3 = m^-1
771 : } else {
772 0 : v_N_HCNLinesPtr->push_back(0.0);
773 : }
774 :
775 83353 : if(v_layerSO2_[j] > 0) {
776 83353 : abun_SO2 = v_layerSO2_[j] * 1E-6;
777 166706 : v_N_SO2LinesPtr->push_back(atm.getEarthSpecificRefractivity_so2(v_layerTemperature_[j],
778 83353 : v_layerPressure_[j],
779 : nu) // ,width,npoints) TO BE IMPLEMENTED IN NEXT RELEASE
780 250059 : * abun_SO2 * 1e6); // m^2 * m^-3 = m^-1
781 : } else {
782 0 : v_N_SO2LinesPtr->push_back(0.0);
783 : }
784 : }
785 :
786 : // if(vv_N_H2OLinesPtr_.size() == 0) first = true; // [-Wunused_but_set_variable]
787 :
788 2865 : if(vv_N_H2OLinesPtr_.size() < v_chanFreq_.size()) {
789 465 : vv_N_H2OLinesPtr_.push_back(v_N_H2OLinesPtr);
790 465 : vv_N_HH16OLinesPtr_.push_back(v_N_HH16OLinesPtr);
791 465 : vv_N_HH16OV2LinesPtr_.push_back(v_N_HH16OV2LinesPtr);
792 465 : vv_N_HH17OLinesPtr_.push_back(v_N_HH17OLinesPtr);
793 465 : vv_N_HH18OLinesPtr_.push_back(v_N_HH18OLinesPtr);
794 465 : vv_N_HDOLinesPtr_.push_back(v_N_HDOLinesPtr);
795 :
796 465 : vv_N_H2OContPtr_.push_back(v_N_H2OContPtr);
797 465 : vv_N_O2LinesPtr_.push_back(v_N_O2LinesPtr);
798 465 : vv_N_16O16OLinesPtr_.push_back(v_N_16O16OLinesPtr);
799 465 : vv_N_16O16OVIBLinesPtr_.push_back(v_N_16O16OVIBLinesPtr);
800 465 : vv_N_16O18OLinesPtr_.push_back(v_N_16O18OLinesPtr);
801 465 : vv_N_16O17OLinesPtr_.push_back(v_N_16O17OLinesPtr);
802 :
803 :
804 :
805 465 : vv_N_DryContPtr_.push_back(v_N_DryContPtr);
806 465 : vv_N_O3LinesPtr_.push_back(v_N_O3LinesPtr);
807 465 : vv_N_16O16O16OLinesPtr_.push_back(v_N_16O16O16OLinesPtr);
808 465 : vv_N_16O16O16OV1LinesPtr_.push_back(v_N_16O16O16OV1LinesPtr);
809 465 : vv_N_16O16O16OV2LinesPtr_.push_back(v_N_16O16O16OV2LinesPtr);
810 465 : vv_N_16O16O16OV3LinesPtr_.push_back(v_N_16O16O16OV3LinesPtr);
811 465 : vv_N_16O16O17OLinesPtr_.push_back(v_N_16O16O17OLinesPtr);
812 465 : vv_N_16O16O18OLinesPtr_.push_back(v_N_16O16O18OLinesPtr);
813 465 : vv_N_16O17O16OLinesPtr_.push_back(v_N_16O17O16OLinesPtr);
814 465 : vv_N_16O18O16OLinesPtr_.push_back(v_N_16O18O16OLinesPtr);
815 465 : vv_N_COLinesPtr_.push_back(v_N_COLinesPtr);
816 465 : vv_N_N2OLinesPtr_.push_back(v_N_N2OLinesPtr);
817 465 : vv_N_NO2LinesPtr_.push_back(v_N_NO2LinesPtr);
818 465 : vv_N_SO2LinesPtr_.push_back(v_N_SO2LinesPtr);
819 465 : vv_N_HClLinesPtr_.push_back(v_N_HClLinesPtr);
820 465 : vv_N_HCNLinesPtr_.push_back(v_N_HCNLinesPtr);
821 : } else {
822 2400 : vv_N_H2OLinesPtr_[nc] = v_N_H2OLinesPtr;
823 2400 : vv_N_HH16OLinesPtr_[nc] = v_N_HH16OLinesPtr;
824 2400 : vv_N_HH16OV2LinesPtr_[nc] = v_N_HH16OV2LinesPtr;
825 2400 : vv_N_HH17OLinesPtr_[nc] = v_N_HH17OLinesPtr;
826 2400 : vv_N_HH18OLinesPtr_[nc] = v_N_HH18OLinesPtr;
827 2400 : vv_N_HDOLinesPtr_[nc] = v_N_HDOLinesPtr;
828 :
829 2400 : vv_N_H2OContPtr_[nc] = v_N_H2OContPtr;
830 2400 : vv_N_O2LinesPtr_[nc] = v_N_O2LinesPtr;
831 2400 : vv_N_16O16OLinesPtr_[nc] = v_N_16O16OLinesPtr;
832 2400 : vv_N_16O16OVIBLinesPtr_[nc] = v_N_16O16OVIBLinesPtr;
833 2400 : vv_N_16O18OLinesPtr_[nc] = v_N_16O18OLinesPtr;
834 2400 : vv_N_16O17OLinesPtr_[nc] = v_N_16O17OLinesPtr;
835 :
836 :
837 :
838 2400 : vv_N_DryContPtr_[nc] = v_N_DryContPtr;
839 2400 : vv_N_O3LinesPtr_[nc] = v_N_O3LinesPtr;
840 2400 : vv_N_16O16O16OLinesPtr_[nc] = v_N_16O16O16OLinesPtr;
841 2400 : vv_N_16O16O16OV1LinesPtr_[nc] = v_N_16O16O16OV1LinesPtr;
842 2400 : vv_N_16O16O16OV2LinesPtr_[nc] = v_N_16O16O16OV2LinesPtr;
843 2400 : vv_N_16O16O16OV3LinesPtr_[nc] = v_N_16O16O16OV3LinesPtr;
844 2400 : vv_N_16O16O17OLinesPtr_[nc] = v_N_16O16O17OLinesPtr;
845 2400 : vv_N_16O16O18OLinesPtr_[nc] = v_N_16O16O18OLinesPtr;
846 2400 : vv_N_16O17O16OLinesPtr_[nc] = v_N_16O17O16OLinesPtr;
847 2400 : vv_N_16O18O16OLinesPtr_[nc] = v_N_16O18O16OLinesPtr;
848 2400 : vv_N_COLinesPtr_[nc] = v_N_COLinesPtr;
849 2400 : vv_N_N2OLinesPtr_[nc] = v_N_N2OLinesPtr;
850 2400 : vv_N_NO2LinesPtr_[nc] = v_N_NO2LinesPtr;
851 2400 : vv_N_SO2LinesPtr_[nc] = v_N_SO2LinesPtr;
852 2400 : vv_N_HClLinesPtr_[nc] = v_N_HClLinesPtr;
853 2400 : vv_N_HCNLinesPtr_[nc] = v_N_HCNLinesPtr;
854 : }
855 :
856 : }
857 :
858 222 : newBasicParam_ = false;
859 : // first = false; // [-Wunused_but_set_variable]
860 222 : }
861 :
862 :
863 0 : Opacity RefractiveIndexProfile::getDryOpacityUpTo(unsigned int nc, Length refalti)
864 : {
865 0 : unsigned int ires; unsigned int numlayerold; Length alti; double fractionLast;
866 0 : Opacity opacityout0; Opacity opacityout1; Opacity zeroOp(0.0,Opacity::UnitNeper);
867 :
868 0 : if(refalti.get(Length::UnitKiloMeter) <= altitude_.get(Length::UnitKiloMeter)) {
869 0 : return zeroOp;
870 : }else{
871 0 : fractionLast = 1.0; numlayerold = numLayer_;
872 0 : opacityout0=getDryOpacity(nc); ires=numlayerold-1; alti=altitude_;
873 0 : for(unsigned int i=0; i<numLayer_; i++){
874 0 : if(alti.get(Length::UnitKiloMeter) < refalti.get(Length::UnitKiloMeter) && (alti.get(Length::UnitKiloMeter)+v_layerThickness_[i]/1000.0) >= refalti.get(Length::UnitKiloMeter))
875 0 : { ires=i; fractionLast = (refalti.get(Length::UnitMeter)-alti.get(Length::UnitMeter))/v_layerThickness_[i]; }
876 0 : alti = alti + Length(v_layerThickness_[i],Length::UnitMeter);
877 : }
878 0 : numLayer_ = ires;
879 0 : opacityout0=getDryOpacity(nc);
880 0 : numLayer_ = ires+1;
881 0 : opacityout1=getDryOpacity(nc);
882 0 : numLayer_ = numlayerold;
883 0 : return opacityout0+(opacityout1-opacityout0)*fractionLast;
884 : }
885 0 : }
886 491 : Opacity RefractiveIndexProfile::getDryOpacity(unsigned int nc)
887 : {
888 491 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
889 491 : double kv = 0;
890 21106 : for(unsigned int j = 0; j < numLayer_; j++) {
891 41230 : kv = kv + imag(vv_N_O2LinesPtr_[nc]->at(j) + vv_N_DryContPtr_[nc]->at(j)
892 41230 : + vv_N_O3LinesPtr_[nc]->at(j) + vv_N_COLinesPtr_[nc]->at(j)
893 41230 : + vv_N_N2OLinesPtr_[nc]->at(j) + vv_N_NO2LinesPtr_[nc]->at(j)
894 61845 : + vv_N_SO2LinesPtr_[nc]->at(j) + vv_N_HClLinesPtr_[nc]->at(j) + vv_N_HCNLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
895 : }
896 491 : return Opacity(kv);
897 : }
898 :
899 :
900 0 : Opacity RefractiveIndexProfile::getAverageDryOpacity(unsigned int spwid)
901 : {
902 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
903 0 : Opacity totalaverage;
904 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
905 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
906 0 : totalaverage = totalaverage + getDryOpacity(spwid, nc);
907 : }
908 0 : totalaverage = totalaverage / getNumChan(spwid);
909 0 : return totalaverage;
910 0 : }
911 :
912 0 : Opacity RefractiveIndexProfile::getAverageO2LinesOpacity(unsigned int spwid)
913 : {
914 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
915 0 : Opacity totalaverage;
916 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
917 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
918 0 : totalaverage = totalaverage + getO2LinesOpacity(spwid, nc);
919 : }
920 0 : totalaverage = totalaverage / getNumChan(spwid);
921 0 : return totalaverage;
922 0 : }
923 :
924 0 : Opacity RefractiveIndexProfile::getAverageO3LinesOpacity(unsigned int spwid)
925 : {
926 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
927 0 : Opacity totalaverage;
928 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
929 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
930 : /* std::cout << " Freq = " << getChanFreq(spwid,nc).get(Frequency::UnitGigaHertz)
931 : << " O3 opacity = " << getO3LinesOpacity(spwid,nc).get(Opacity::UnitNeper)
932 : << " O3 pathlength = " << getO3LinesPathLength(spwid,nc).get(Length::Microns)
933 : << " O2 opacity = " << getO2LinesOpacity(spwid,nc).get(Opacity::UnitNeper)
934 : << " O2 pathlength = " << getO2LinesPathLength(spwid,nc).get(Length::Microns)
935 : << std::endl; */
936 0 : totalaverage = totalaverage + getO3LinesOpacity(spwid, nc);
937 : }
938 0 : totalaverage = totalaverage / getNumChan(spwid);
939 0 : return totalaverage;
940 0 : }
941 :
942 0 : Opacity RefractiveIndexProfile::getAverageN2OLinesOpacity(unsigned int spwid)
943 : {
944 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
945 0 : Opacity totalaverage;
946 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
947 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
948 0 : totalaverage = totalaverage + getN2OLinesOpacity(spwid, nc);
949 : }
950 0 : totalaverage = totalaverage / getNumChan(spwid);
951 0 : return totalaverage;
952 0 : }
953 :
954 0 : Opacity RefractiveIndexProfile::getAverageNO2LinesOpacity(unsigned int spwid)
955 : {
956 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
957 0 : Opacity totalaverage;
958 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
959 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
960 0 : totalaverage = totalaverage + getNO2LinesOpacity(spwid, nc);
961 : }
962 0 : totalaverage = totalaverage / getNumChan(spwid);
963 0 : return totalaverage;
964 0 : }
965 :
966 0 : Opacity RefractiveIndexProfile::getAverageHClLinesOpacity(unsigned int spwid)
967 : {
968 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
969 0 : Opacity totalaverage;
970 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
971 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
972 0 : totalaverage = totalaverage + getHClLinesOpacity(spwid, nc);
973 : }
974 0 : totalaverage = totalaverage / getNumChan(spwid);
975 0 : return totalaverage;
976 0 : }
977 :
978 0 : Opacity RefractiveIndexProfile::getAverageHCNLinesOpacity(unsigned int spwid)
979 : {
980 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
981 0 : Opacity totalaverage;
982 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
983 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
984 0 : totalaverage = totalaverage + getHCNLinesOpacity(spwid, nc);
985 : }
986 0 : totalaverage = totalaverage / getNumChan(spwid);
987 0 : return totalaverage;
988 0 : }
989 :
990 0 : Opacity RefractiveIndexProfile::getAverageSO2LinesOpacity(unsigned int spwid)
991 : {
992 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
993 0 : Opacity totalaverage;
994 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
995 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
996 0 : totalaverage = totalaverage + getSO2LinesOpacity(spwid, nc);
997 : }
998 0 : totalaverage = totalaverage / getNumChan(spwid);
999 0 : return totalaverage;
1000 0 : }
1001 :
1002 :
1003 :
1004 :
1005 0 : Opacity RefractiveIndexProfile::getAverageCOLinesOpacity(unsigned int spwid)
1006 : {
1007 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
1008 0 : Opacity totalaverage;
1009 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
1010 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
1011 0 : totalaverage = totalaverage + getCOLinesOpacity(spwid, nc);
1012 : }
1013 0 : totalaverage = totalaverage / getNumChan(spwid);
1014 0 : return totalaverage;
1015 0 : }
1016 :
1017 0 : Opacity RefractiveIndexProfile::getAverageDryContOpacity(unsigned int spwid)
1018 : {
1019 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
1020 0 : Opacity totalaverage;
1021 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
1022 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
1023 0 : totalaverage = totalaverage + getDryContOpacity(spwid, nc);
1024 : }
1025 0 : totalaverage = totalaverage / getNumChan(spwid);
1026 0 : return totalaverage;
1027 0 : }
1028 :
1029 1 : Opacity RefractiveIndexProfile::getDryContOpacity()
1030 : {
1031 1 : return getDryContOpacity(0);
1032 : }
1033 :
1034 99 : Opacity RefractiveIndexProfile::getDryContOpacity(unsigned int nc)
1035 : {
1036 99 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1037 99 : double kv = 0;
1038 4250 : for(unsigned int j = 0; j < numLayer_; j++) {
1039 4151 : kv = kv + imag(vv_N_DryContPtr_[nc]->at(j)) * v_layerThickness_[j];
1040 : }
1041 99 : return Opacity(kv);
1042 : }
1043 :
1044 0 : Opacity RefractiveIndexProfile::getDryContOpacity(unsigned int spwid,
1045 : unsigned int nc)
1046 : {
1047 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1048 0 : return getDryContOpacity(v_transfertId_[spwid] + nc);
1049 : }
1050 :
1051 :
1052 :
1053 1 : Opacity RefractiveIndexProfile::getO2LinesOpacity()
1054 1 : { return getO2LinesOpacity(0); }
1055 99 : Opacity RefractiveIndexProfile::getO2LinesOpacity(unsigned int nc)
1056 99 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1057 99 : double kv = 0;
1058 4250 : for(unsigned int j = 0; j < numLayer_; j++){kv = kv + imag(vv_N_O2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1059 99 : return Opacity(kv);
1060 : }
1061 0 : Opacity RefractiveIndexProfile::getO2LinesOpacity(unsigned int spwid, unsigned int nc)
1062 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1063 0 : return getO2LinesOpacity(v_transfertId_[spwid] + nc); }
1064 :
1065 0 : Opacity RefractiveIndexProfile::get16O16OLinesOpacity()
1066 0 : { return get16O16OLinesOpacity(0); }
1067 98 : Opacity RefractiveIndexProfile::get16O16OLinesOpacity(unsigned int nc)
1068 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1069 98 : double kv = 0;
1070 4214 : for(unsigned int j = 0; j < numLayer_; j++){kv = kv + imag(vv_N_16O16OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1071 98 : return Opacity(kv);
1072 : }
1073 0 : Opacity RefractiveIndexProfile::get16O16OLinesOpacity(unsigned int spwid, unsigned int nc)
1074 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1075 0 : return get16O16OLinesOpacity(v_transfertId_[spwid] + nc); }
1076 :
1077 0 : Opacity RefractiveIndexProfile::get16O16OVIBLinesOpacity()
1078 0 : { return get16O16OVIBLinesOpacity(0); }
1079 98 : Opacity RefractiveIndexProfile::get16O16OVIBLinesOpacity(unsigned int nc)
1080 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1081 98 : double kv = 0;
1082 4214 : for(unsigned int j = 0; j < numLayer_; j++){kv = kv + imag(vv_N_16O16OVIBLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1083 98 : return Opacity(kv);
1084 : }
1085 0 : Opacity RefractiveIndexProfile::get16O16OVIBLinesOpacity(unsigned int spwid, unsigned int nc)
1086 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1087 0 : return get16O16OVIBLinesOpacity(v_transfertId_[spwid] + nc); }
1088 :
1089 0 : Opacity RefractiveIndexProfile::get16O18OLinesOpacity()
1090 0 : { return get16O18OLinesOpacity(0); }
1091 98 : Opacity RefractiveIndexProfile::get16O18OLinesOpacity(unsigned int nc)
1092 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1093 98 : double kv = 0;
1094 4214 : for(unsigned int j = 0; j < numLayer_; j++){kv = kv + imag(vv_N_16O18OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1095 98 : return Opacity(kv);
1096 : }
1097 0 : Opacity RefractiveIndexProfile::get16O18OLinesOpacity(unsigned int spwid, unsigned int nc)
1098 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1099 0 : return get16O18OLinesOpacity(v_transfertId_[spwid] + nc); }
1100 :
1101 0 : Opacity RefractiveIndexProfile::get16O17OLinesOpacity()
1102 0 : { return get16O17OLinesOpacity(0); }
1103 98 : Opacity RefractiveIndexProfile::get16O17OLinesOpacity(unsigned int nc)
1104 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1105 98 : double kv = 0;
1106 4214 : for(unsigned int j = 0; j < numLayer_; j++){kv = kv + imag(vv_N_16O17OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1107 98 : return Opacity(kv);
1108 : }
1109 0 : Opacity RefractiveIndexProfile::get16O17OLinesOpacity(unsigned int spwid, unsigned int nc)
1110 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1111 0 : return get16O17OLinesOpacity(v_transfertId_[spwid] + nc); }
1112 :
1113 :
1114 :
1115 1 : Opacity RefractiveIndexProfile::getCOLinesOpacity()
1116 : {
1117 1 : return getCOLinesOpacity(0);
1118 : }
1119 :
1120 99 : Opacity RefractiveIndexProfile::getCOLinesOpacity(unsigned int nc)
1121 : {
1122 99 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1123 99 : double kv = 0;
1124 4250 : for(unsigned int j = 0; j < numLayer_; j++) {
1125 4151 : kv = kv + imag(vv_N_COLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1126 : }
1127 99 : return Opacity(kv);
1128 : }
1129 :
1130 0 : Opacity RefractiveIndexProfile::getCOLinesOpacity(unsigned int spwid,
1131 : unsigned int nc)
1132 : {
1133 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1134 0 : return getCOLinesOpacity(v_transfertId_[spwid] + nc);
1135 : }
1136 :
1137 1 : Opacity RefractiveIndexProfile::getN2OLinesOpacity()
1138 : {
1139 1 : return getN2OLinesOpacity(0);
1140 : }
1141 :
1142 99 : Opacity RefractiveIndexProfile::getN2OLinesOpacity(unsigned int nc)
1143 : {
1144 99 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1145 99 : double kv = 0;
1146 4250 : for(unsigned int j = 0; j < numLayer_; j++) {
1147 4151 : kv = kv + imag(vv_N_N2OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1148 : }
1149 99 : return Opacity(kv);
1150 : }
1151 :
1152 0 : Opacity RefractiveIndexProfile::getN2OLinesOpacity(unsigned int spwid,
1153 : unsigned int nc)
1154 : {
1155 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1156 0 : return getN2OLinesOpacity(v_transfertId_[spwid] + nc);
1157 : }
1158 :
1159 0 : Opacity RefractiveIndexProfile::getNO2LinesOpacity()
1160 : {
1161 0 : return getNO2LinesOpacity(0);
1162 : }
1163 :
1164 0 : Opacity RefractiveIndexProfile::getNO2LinesOpacity(unsigned int nc)
1165 : {
1166 0 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1167 0 : double kv = 0;
1168 0 : for(unsigned int j = 0; j < numLayer_; j++) {
1169 0 : kv = kv + imag(vv_N_NO2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1170 : }
1171 0 : return Opacity(kv);
1172 : }
1173 :
1174 0 : Opacity RefractiveIndexProfile::getNO2LinesOpacity(unsigned int spwid,
1175 : unsigned int nc)
1176 : {
1177 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1178 0 : return getNO2LinesOpacity(v_transfertId_[spwid] + nc);
1179 : }
1180 :
1181 0 : Opacity RefractiveIndexProfile::getHClLinesOpacity()
1182 : {
1183 0 : return getHClLinesOpacity(0);
1184 : }
1185 :
1186 98 : Opacity RefractiveIndexProfile::getHClLinesOpacity(unsigned int nc)
1187 : {
1188 98 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1189 98 : double kv = 0;
1190 4214 : for(unsigned int j = 0; j < numLayer_; j++) {
1191 4116 : kv = kv + imag(vv_N_HClLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1192 : }
1193 98 : return Opacity(kv);
1194 : }
1195 :
1196 0 : Opacity RefractiveIndexProfile::getHClLinesOpacity(unsigned int spwid,
1197 : unsigned int nc)
1198 : {
1199 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1200 0 : return getHClLinesOpacity(v_transfertId_[spwid] + nc);
1201 : }
1202 :
1203 0 : Opacity RefractiveIndexProfile::getHCNLinesOpacity()
1204 : {
1205 0 : return getHCNLinesOpacity(0);
1206 : }
1207 :
1208 98 : Opacity RefractiveIndexProfile::getHCNLinesOpacity(unsigned int nc)
1209 : {
1210 98 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1211 98 : double kv = 0;
1212 4214 : for(unsigned int j = 0; j < numLayer_; j++) {
1213 4116 : kv = kv + imag(vv_N_HCNLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1214 : }
1215 98 : return Opacity(kv);
1216 : }
1217 :
1218 0 : Opacity RefractiveIndexProfile::getHCNLinesOpacity(unsigned int spwid,
1219 : unsigned int nc)
1220 : {
1221 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1222 0 : return getHCNLinesOpacity(v_transfertId_[spwid] + nc);
1223 : }
1224 :
1225 :
1226 0 : Opacity RefractiveIndexProfile::getSO2LinesOpacity()
1227 : {
1228 0 : return getSO2LinesOpacity(0);
1229 : }
1230 :
1231 0 : Opacity RefractiveIndexProfile::getSO2LinesOpacity(unsigned int nc)
1232 : {
1233 0 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1234 0 : double kv = 0;
1235 0 : for(unsigned int j = 0; j < numLayer_; j++) {
1236 0 : kv = kv + imag(vv_N_SO2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1237 : }
1238 0 : return Opacity(kv);
1239 : }
1240 :
1241 0 : Opacity RefractiveIndexProfile::getSO2LinesOpacity(unsigned int spwid,
1242 : unsigned int nc)
1243 : {
1244 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1245 0 : return getSO2LinesOpacity(v_transfertId_[spwid] + nc);
1246 : }
1247 :
1248 :
1249 1 : Opacity RefractiveIndexProfile::getO3LinesOpacity()
1250 : {
1251 1 : return getO3LinesOpacity(0);
1252 : }
1253 99 : Opacity RefractiveIndexProfile::getO3LinesOpacity(unsigned int nc)
1254 : {
1255 99 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1256 99 : double kv = 0;
1257 4250 : for(unsigned int j = 0; j < numLayer_; j++) {
1258 4151 : kv = kv + imag(vv_N_O3LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1259 : }
1260 99 : return Opacity(kv);
1261 : }
1262 :
1263 0 : Opacity RefractiveIndexProfile::getO3LinesOpacity(unsigned int spwid,
1264 : unsigned int nc)
1265 : {
1266 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1267 0 : return getO3LinesOpacity(v_transfertId_[spwid] + nc);
1268 : }
1269 :
1270 :
1271 0 : Opacity RefractiveIndexProfile::get16O16O16OLinesOpacity()
1272 : {
1273 0 : return get16O16O16OLinesOpacity(0);
1274 : }
1275 :
1276 98 : Opacity RefractiveIndexProfile::get16O16O16OLinesOpacity(unsigned int nc)
1277 : {
1278 98 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1279 98 : double kv = 0;
1280 4214 : for(unsigned int j = 0; j < numLayer_; j++) {
1281 4116 : kv = kv + imag(vv_N_16O16O16OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1282 : }
1283 98 : return Opacity(kv);
1284 : }
1285 :
1286 0 : Opacity RefractiveIndexProfile::get16O16O16OLinesOpacity(unsigned int spwid,
1287 : unsigned int nc)
1288 : {
1289 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1290 0 : return get16O16O16OLinesOpacity(v_transfertId_[spwid] + nc);
1291 : }
1292 :
1293 0 : Opacity RefractiveIndexProfile::get16O16O16OV1LinesOpacity()
1294 0 : {return get16O16O16OV1LinesOpacity(0);}
1295 98 : Opacity RefractiveIndexProfile::get16O16O16OV1LinesOpacity(unsigned int nc)
1296 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1297 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O16O16OV1LinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1298 98 : return Opacity(kv);}
1299 0 : Opacity RefractiveIndexProfile::get16O16O16OV1LinesOpacity(unsigned int spwid, unsigned int nc)
1300 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1301 0 : return get16O16O16OV1LinesOpacity(v_transfertId_[spwid] + nc);}
1302 :
1303 0 : Opacity RefractiveIndexProfile::get16O16O16OV2LinesOpacity()
1304 0 : {return get16O16O16OV2LinesOpacity(0);}
1305 98 : Opacity RefractiveIndexProfile::get16O16O16OV2LinesOpacity(unsigned int nc)
1306 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1307 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O16O16OV2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1308 98 : return Opacity(kv);}
1309 0 : Opacity RefractiveIndexProfile::get16O16O16OV2LinesOpacity(unsigned int spwid, unsigned int nc)
1310 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1311 0 : return get16O16O16OV2LinesOpacity(v_transfertId_[spwid] + nc);}
1312 :
1313 0 : Opacity RefractiveIndexProfile::get16O16O16OV3LinesOpacity()
1314 0 : {return get16O16O16OV3LinesOpacity(0);}
1315 98 : Opacity RefractiveIndexProfile::get16O16O16OV3LinesOpacity(unsigned int nc)
1316 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1317 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O16O16OV3LinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1318 98 : return Opacity(kv);}
1319 0 : Opacity RefractiveIndexProfile::get16O16O16OV3LinesOpacity(unsigned int spwid, unsigned int nc)
1320 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1321 0 : return get16O16O16OV3LinesOpacity(v_transfertId_[spwid] + nc);}
1322 :
1323 0 : Opacity RefractiveIndexProfile::get16O16O17OLinesOpacity()
1324 0 : {return get16O16O17OLinesOpacity(0);}
1325 98 : Opacity RefractiveIndexProfile::get16O16O17OLinesOpacity(unsigned int nc)
1326 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1327 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O16O17OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1328 98 : return Opacity(kv);}
1329 0 : Opacity RefractiveIndexProfile::get16O16O17OLinesOpacity(unsigned int spwid, unsigned int nc)
1330 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1331 0 : return get16O16O17OLinesOpacity(v_transfertId_[spwid] + nc);}
1332 :
1333 0 : Opacity RefractiveIndexProfile::get16O16O18OLinesOpacity()
1334 0 : {return get16O16O18OLinesOpacity(0);}
1335 98 : Opacity RefractiveIndexProfile::get16O16O18OLinesOpacity(unsigned int nc)
1336 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1337 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O16O18OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1338 98 : return Opacity(kv);}
1339 0 : Opacity RefractiveIndexProfile::get16O16O18OLinesOpacity(unsigned int spwid, unsigned int nc)
1340 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1341 0 : return get16O16O18OLinesOpacity(v_transfertId_[spwid] + nc);}
1342 :
1343 0 : Opacity RefractiveIndexProfile::get16O17O16OLinesOpacity()
1344 0 : {return get16O17O16OLinesOpacity(0);}
1345 98 : Opacity RefractiveIndexProfile::get16O17O16OLinesOpacity(unsigned int nc)
1346 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1347 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O17O16OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1348 98 : return Opacity(kv);}
1349 0 : Opacity RefractiveIndexProfile::get16O17O16OLinesOpacity(unsigned int spwid, unsigned int nc)
1350 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1351 0 : return get16O17O16OLinesOpacity(v_transfertId_[spwid] + nc);}
1352 :
1353 0 : Opacity RefractiveIndexProfile::get16O18O16OLinesOpacity()
1354 0 : {return get16O18O16OLinesOpacity(0);}
1355 98 : Opacity RefractiveIndexProfile::get16O18O16OLinesOpacity(unsigned int nc)
1356 98 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0); double kv = 0;
1357 4214 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_16O18O16OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1358 98 : return Opacity(kv);}
1359 0 : Opacity RefractiveIndexProfile::get16O18O16OLinesOpacity(unsigned int spwid, unsigned int nc)
1360 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1361 0 : return get16O18O16OLinesOpacity(v_transfertId_[spwid] + nc);}
1362 :
1363 :
1364 :
1365 1 : Opacity RefractiveIndexProfile::getWetOpacity(const Length &integratedwatercolumn)
1366 : {
1367 : // std::cout << "1 integratedwatercolumn.get()=" << integratedwatercolumn.get() << std::endl;
1368 : // std::cout << "2 getGroundWH2O().get()=" << getGroundWH2O().get() << std::endl;
1369 : // std::cout << "3 getWetOpacity()=" << std::endl;
1370 : // std::cout << "4 " << std::endl;
1371 2 : return getWetOpacity(getGroundWH2O(),0)*(integratedwatercolumn.get()/getGroundWH2O().get());
1372 :
1373 : // 2010_SEP02: return getWetOpacity(integratedwatercolumn,0)*(integratedwatercolumn.get()/getGroundWH2O().get());
1374 : }
1375 :
1376 1 : Opacity RefractiveIndexProfile::getWetOpacity(const Length &integratedwatercolumn,
1377 : unsigned int nc)
1378 : {
1379 1 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1380 1 : double kv = 0;
1381 : /* std::cout<<"nc="<<nc<<endl; */
1382 36 : for(unsigned int j = 0; j < numLayer_; j++) {
1383 35 : kv = kv + imag(vv_N_H2OLinesPtr_[nc]->at(j) + vv_N_H2OContPtr_[nc]->at(j))
1384 35 : * v_layerThickness_[j];
1385 :
1386 : }
1387 2 : return Opacity(kv*(integratedwatercolumn.get()/getGroundWH2O().get()));
1388 : }
1389 :
1390 0 : Opacity RefractiveIndexProfile::getWetOpacity(const Length & integratedwatercolumn,
1391 : unsigned int spwid,
1392 : unsigned int nc)
1393 : {
1394 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1395 0 : return getWetOpacity(integratedwatercolumn,v_transfertId_[spwid] + nc);
1396 : }
1397 :
1398 0 : Opacity RefractiveIndexProfile::getAverageWetOpacity(const Length &integratedwatercolumn,
1399 : unsigned int spwid)
1400 : {
1401 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
1402 0 : Opacity totalaverage;
1403 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
1404 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
1405 0 : totalaverage = totalaverage + getWetOpacity(integratedwatercolumn, spwid, nc);
1406 : }
1407 0 : totalaverage = totalaverage / getNumChan(spwid);
1408 0 : return totalaverage;
1409 0 : }
1410 :
1411 1 : Opacity RefractiveIndexProfile::getH2OLinesOpacity(const Length &integratedwatercolumn)
1412 1 : { return getH2OLinesOpacity(integratedwatercolumn,0);}
1413 :
1414 1 : Opacity RefractiveIndexProfile::getH2OLinesOpacity(const Length &integratedwatercolumn, unsigned int nc)
1415 1 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1416 1 : double kv = 0;
1417 36 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_H2OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1418 2 : return Opacity(kv*(integratedwatercolumn.get()/getGroundWH2O().get()));
1419 : }
1420 0 : Opacity RefractiveIndexProfile::getH2OLinesOpacity(const Length &integratedwatercolumn, unsigned int spwid, unsigned int nc)
1421 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1422 0 : return getH2OLinesOpacity(integratedwatercolumn,v_transfertId_[spwid] + nc);}
1423 :
1424 0 : Opacity RefractiveIndexProfile::getAverageH2OLinesOpacity(const Length &integratedwatercolumn,unsigned int spwid)
1425 0 : { if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
1426 0 : Opacity totalaverage; totalaverage = Opacity(0.0, Opacity::UnitNeper);
1427 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
1428 0 : totalaverage = totalaverage + getH2OLinesOpacity(integratedwatercolumn,spwid, nc);}
1429 0 : totalaverage = totalaverage / getNumChan(spwid);
1430 0 : return totalaverage;
1431 0 : }
1432 :
1433 0 : Opacity RefractiveIndexProfile::getHH16OLinesOpacity(const Length &integratedwatercolumn)
1434 0 : { return getHH16OLinesOpacity(integratedwatercolumn,0);}
1435 :
1436 0 : Opacity RefractiveIndexProfile::getHH16OLinesOpacity(const Length &integratedwatercolumn, unsigned int nc)
1437 0 : { if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1438 0 : double kv = 0;
1439 0 : for(unsigned int j = 0; j < numLayer_; j++) { kv = kv + imag(vv_N_HH16OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];}
1440 0 : return Opacity(kv*(integratedwatercolumn.get()/getGroundWH2O().get()));
1441 : }
1442 0 : Opacity RefractiveIndexProfile::getHH16OLinesOpacity(const Length &integratedwatercolumn, unsigned int spwid, unsigned int nc)
1443 0 : { if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1444 0 : return getHH16OLinesOpacity(integratedwatercolumn,v_transfertId_[spwid] + nc);}
1445 :
1446 0 : Opacity RefractiveIndexProfile::getAverageHH16OLinesOpacity(const Length &integratedwatercolumn,unsigned int spwid)
1447 0 : { if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
1448 0 : Opacity totalaverage; totalaverage = Opacity(0.0, Opacity::UnitNeper);
1449 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
1450 0 : totalaverage = totalaverage + getHH16OLinesOpacity(integratedwatercolumn,spwid, nc);}
1451 0 : totalaverage = totalaverage / getNumChan(spwid);
1452 0 : return totalaverage;
1453 0 : }
1454 :
1455 :
1456 :
1457 :
1458 1 : Opacity RefractiveIndexProfile::getH2OContOpacity(const Length &integratedwatercolumn)
1459 : {
1460 1 : return getH2OContOpacity(integratedwatercolumn,0);
1461 : }
1462 :
1463 :
1464 1 : Opacity RefractiveIndexProfile::getH2OContOpacity(const Length &integratedwatercolumn,
1465 : unsigned int nc)
1466 : {
1467 1 : if(!chanIndexIsValid(nc)) return Opacity(-999.0);
1468 1 : double kv = 0;
1469 36 : for(unsigned int j = 0; j < numLayer_; j++) {
1470 35 : kv = kv + imag(vv_N_H2OContPtr_[nc]->at(j)) * v_layerThickness_[j];
1471 : }
1472 2 : return Opacity(kv*(integratedwatercolumn.get()/getGroundWH2O().get()));
1473 : }
1474 :
1475 :
1476 0 : Opacity RefractiveIndexProfile::getH2OContOpacity(const Length &integratedwatercolumn,
1477 : unsigned int spwid,
1478 : unsigned int nc)
1479 : {
1480 0 : if(!spwidAndIndexAreValid(spwid, nc)) return Opacity(-999.0);
1481 0 : return getH2OContOpacity(integratedwatercolumn,v_transfertId_[spwid] + nc);
1482 : }
1483 :
1484 :
1485 :
1486 0 : Opacity RefractiveIndexProfile::getAverageH2OContOpacity(const Length &integratedwatercolumn,
1487 : unsigned int spwid)
1488 : {
1489 0 : if(!spwidAndIndexAreValid(spwid, 0)) return Opacity(-999.0);
1490 0 : Opacity totalaverage;
1491 0 : totalaverage = Opacity(0.0, Opacity::UnitNeper);
1492 0 : for(unsigned int nc = 0; nc < getNumChan(spwid); nc++) {
1493 0 : totalaverage = totalaverage + getH2OContOpacity(integratedwatercolumn,spwid, nc);
1494 : }
1495 0 : totalaverage = totalaverage / getNumChan(spwid);
1496 0 : return totalaverage;
1497 0 : }
1498 :
1499 0 : Angle RefractiveIndexProfile::getDispersiveH2OPhaseDelay(const Length &integratedwatercolumn)
1500 : {
1501 0 : return getDispersiveH2OPhaseDelay(integratedwatercolumn,0);
1502 : }
1503 :
1504 2 : Length RefractiveIndexProfile::getDispersiveH2OPathLength(const Length &integratedwatercolumn)
1505 : {
1506 2 : return getDispersiveH2OPathLength(integratedwatercolumn,0);
1507 : }
1508 :
1509 2 : Angle RefractiveIndexProfile::getDispersiveH2OPhaseDelay(const Length &integratedwatercolumn,
1510 : unsigned int nc)
1511 : {
1512 2 : if(!chanIndexIsValid(nc)) {
1513 0 : return Angle(-999.0, Angle::UnitDegree);
1514 : }
1515 2 : double kv = 0;
1516 72 : for(unsigned int j = 0; j < numLayer_; j++) {
1517 70 : kv = kv + real(vv_N_H2OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1518 : }
1519 2 : Angle aa(kv*(integratedwatercolumn.get()/getGroundWH2O().get())* 57.29578, Angle::UnitDegree);
1520 2 : return aa;
1521 2 : }
1522 :
1523 2 : Length RefractiveIndexProfile::getDispersiveH2OPathLength(const Length &integratedwatercolumn,
1524 : unsigned int nc)
1525 : {
1526 2 : if(!chanIndexIsValid(nc)) {
1527 0 : return Length(-999.0, Length::UnitMeter);
1528 : }
1529 2 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
1530 2 : Length ll((wavelength / 360.0) * getDispersiveH2OPhaseDelay(integratedwatercolumn,nc).get(Angle::UnitDegree),
1531 2 : Length::UnitMeter);
1532 2 : return ll;
1533 2 : }
1534 :
1535 0 : Angle RefractiveIndexProfile::getDispersiveH2OPhaseDelay(const Length &integratedwatercolumn,
1536 : unsigned int spwid,
1537 : unsigned int nc)
1538 : {
1539 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1540 0 : return Angle(-999.0, Angle::UnitDegree);
1541 : }
1542 0 : return getDispersiveH2OPhaseDelay(integratedwatercolumn,v_transfertId_[spwid] + nc);
1543 : }
1544 :
1545 0 : Angle RefractiveIndexProfile::getAverageDispersiveH2OPhaseDelay(const Length &integratedwatercolumn,
1546 : unsigned int spwid)
1547 : {
1548 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1549 0 : return Angle(-999.0, Angle::UnitDegree);
1550 : }
1551 0 : double av = 0.0;
1552 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1553 0 : av = av + getDispersiveH2OPhaseDelay(integratedwatercolumn,v_transfertId_[spwid] + i).get(Angle::UnitDegree);
1554 : }
1555 0 : av = av / getNumChan(spwid);
1556 0 : Angle average(av, Angle::UnitDegree);
1557 0 : return average;
1558 0 : }
1559 :
1560 0 : Length RefractiveIndexProfile::getDispersiveH2OPathLength(const Length &integratedwatercolumn,
1561 : unsigned int spwid,
1562 : unsigned int nc)
1563 : {
1564 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1565 0 : return Length(-999.0, Length::UnitMeter);
1566 : }
1567 0 : return getDispersiveH2OPathLength(integratedwatercolumn,v_transfertId_[spwid] + nc);
1568 : }
1569 :
1570 0 : Length RefractiveIndexProfile::getAverageDispersiveH2OPathLength(const Length &integratedwatercolumn,
1571 : unsigned int spwid)
1572 : {
1573 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1574 0 : return Length(-999.0, Length::UnitMeter);
1575 : }
1576 0 : double av = 0.0;
1577 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1578 0 : av = av + getDispersiveH2OPathLength(integratedwatercolumn,v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
1579 : }
1580 0 : av = av / getNumChan(spwid);
1581 0 : Length average(av, Length::UnitMilliMeter);
1582 0 : return average;
1583 0 : }
1584 :
1585 0 : Angle RefractiveIndexProfile::getNonDispersiveDryPhaseDelay()
1586 : {
1587 0 : return getNonDispersiveDryPhaseDelay(0);
1588 : }
1589 :
1590 1 : Length RefractiveIndexProfile::getNonDispersiveDryPathLength()
1591 : {
1592 1 : return getNonDispersiveDryPathLength(0);
1593 : }
1594 :
1595 0 : Angle RefractiveIndexProfile::getDispersiveDryPhaseDelay()
1596 : {
1597 0 : return getDispersiveDryPhaseDelay(0);
1598 : }
1599 :
1600 0 : Length RefractiveIndexProfile::getDispersiveDryPathLength()
1601 : {
1602 0 : return getDispersiveDryPathLength(0);
1603 : }
1604 :
1605 4801 : Angle RefractiveIndexProfile::getNonDispersiveDryPhaseDelay(unsigned int nc)
1606 : {
1607 4801 : if(!chanIndexIsValid(nc)) {
1608 0 : return Angle(-999.0, Angle::UnitDegree);
1609 : }
1610 4801 : double kv = 0;
1611 133796 : for(unsigned int j = 0; j < numLayer_; j++) {
1612 128995 : kv = kv + real(vv_N_DryContPtr_[nc]->at(j)) * v_layerThickness_[j];
1613 : }
1614 4801 : Angle aa(kv * 57.29578, Angle::UnitDegree);
1615 4801 : return aa;
1616 4801 : }
1617 :
1618 0 : Angle RefractiveIndexProfile::getDispersiveDryPhaseDelay(unsigned int nc)
1619 : {
1620 : // std::cout << "getO2LinesPhaseDelay(" << nc << ")=" << getO2LinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1621 : // std::cout << "getO3LinesPhaseDelay(" << nc << ")=" << getO3LinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1622 : // std::cout << "getN2OLinesPhaseDelay(" << nc << ")=" << getN2OLinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1623 : // std::cout << "getNO2LinesPhaseDelay(" << nc << ")=" << getNO2LinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1624 : // std::cout << "getHClLinesPhaseDelay(" << nc << ")=" << getHClLinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1625 : // std::cout << "getHCNLinesPhaseDelay(" << nc << ")=" << getHCNLinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1626 : // std::cout << "getSO2LinesPhaseDelay(" << nc << ")=" << getSO2LinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1627 : // std::cout << "getCOLinesPhaseDelay(" << nc << ")=" << getCOLinesPhaseDelay(nc).get(Angle::UnitDegree) << std::endl;
1628 0 : return getO2LinesPhaseDelay(nc) + getO3LinesPhaseDelay(nc)
1629 0 : + getN2OLinesPhaseDelay(nc) + getCOLinesPhaseDelay(nc)
1630 0 : + getNO2LinesPhaseDelay(nc) + getSO2LinesPhaseDelay(nc)
1631 0 : + getHClLinesPhaseDelay(nc) + getHCNLinesPhaseDelay(nc);
1632 : }
1633 :
1634 4801 : Length RefractiveIndexProfile::getNonDispersiveDryPathLength(unsigned int nc)
1635 : {
1636 4801 : if(!chanIndexIsValid(nc)) {
1637 0 : return Length(-999.0, Length::UnitMeter);
1638 : }
1639 4801 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
1640 : Length
1641 4801 : ll((wavelength / 360.0) * getNonDispersiveDryPhaseDelay(nc).get(Angle::UnitDegree),
1642 4801 : Length::UnitMeter);
1643 4801 : return ll;
1644 4801 : }
1645 :
1646 0 : Angle RefractiveIndexProfile::getNonDispersiveDryPhaseDelay(unsigned int spwid,
1647 : unsigned int nc)
1648 : {
1649 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1650 0 : return Angle(-999.0, Angle::UnitDegree);
1651 : }
1652 0 : return getNonDispersiveDryPhaseDelay(v_transfertId_[spwid] + nc);
1653 : }
1654 :
1655 0 : Length RefractiveIndexProfile::getDispersiveDryPathLength(unsigned int nc)
1656 : {
1657 0 : if(!chanIndexIsValid(nc)) {
1658 0 : return Length(-999.0, Length::UnitMeter);
1659 : }
1660 0 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
1661 0 : Length ll((wavelength / 360.0) * getDispersiveDryPhaseDelay(nc).get(Angle::UnitDegree),
1662 0 : Length::UnitMeter);
1663 0 : return ll;
1664 0 : }
1665 :
1666 0 : Angle RefractiveIndexProfile::getDispersiveDryPhaseDelay(unsigned int spwid,
1667 : unsigned int nc)
1668 : {
1669 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1670 0 : return Angle(-999.0, Angle::UnitDegree);
1671 : }
1672 0 : return getDispersiveDryPhaseDelay(v_transfertId_[spwid] + nc);
1673 : }
1674 :
1675 0 : Angle RefractiveIndexProfile::getAverageNonDispersiveDryPhaseDelay(unsigned int spwid)
1676 : {
1677 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1678 0 : return Angle(-999.0, Angle::UnitDegree);
1679 : }
1680 0 : double av = 0.0;
1681 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1682 0 : av = av
1683 0 : + getNonDispersiveDryPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
1684 : }
1685 0 : av = av / getNumChan(spwid);
1686 0 : Angle average(av, Angle::UnitDegree);
1687 0 : return average;
1688 0 : }
1689 :
1690 0 : Angle RefractiveIndexProfile::getAverageDispersiveDryPhaseDelay(unsigned int spwid)
1691 : {
1692 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1693 0 : return Angle(-999.0, Angle::UnitDegree);
1694 : }
1695 0 : double av = 0.0;
1696 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1697 0 : av = av + getDispersiveDryPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
1698 : }
1699 0 : av = av / getNumChan(spwid);
1700 0 : Angle average(av, Angle::UnitDegree);
1701 0 : return average;
1702 0 : }
1703 :
1704 0 : Length RefractiveIndexProfile::getNonDispersiveDryPathLength(unsigned int spwid,
1705 : unsigned int nc)
1706 : {
1707 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1708 0 : return Length(-999.0, Length::UnitMeter);
1709 : }
1710 0 : return getNonDispersiveDryPathLength(v_transfertId_[spwid] + nc);
1711 : }
1712 :
1713 0 : Length RefractiveIndexProfile::getDispersiveDryPathLength(unsigned int spwid,
1714 : unsigned int nc)
1715 : {
1716 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1717 0 : return Length(-999.0, Length::UnitMeter);
1718 : }
1719 0 : return getDispersiveDryPathLength(v_transfertId_[spwid] + nc);
1720 : }
1721 :
1722 240 : Length RefractiveIndexProfile::getAverageNonDispersiveDryPathLength(unsigned int spwid)
1723 : {
1724 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
1725 0 : return Length(-999.0, Length::UnitMeter);
1726 : }
1727 240 : double av = 0.0;
1728 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1729 4800 : av = av
1730 4800 : + getNonDispersiveDryPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
1731 : }
1732 240 : av = av / getNumChan(spwid);
1733 240 : Length average(av, Length::UnitMilliMeter);
1734 240 : return average;
1735 240 : }
1736 :
1737 0 : Length RefractiveIndexProfile::getAverageDispersiveDryPathLength(unsigned int spwid)
1738 : {
1739 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1740 0 : return Length(-999.0, Length::UnitMeter);
1741 : }
1742 0 : double av = 0.0;
1743 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1744 0 : av = av + getDispersiveDryPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
1745 : }
1746 :
1747 0 : av = av / getNumChan(spwid);
1748 0 : Length average(av, Length::UnitMilliMeter);
1749 0 : return average;
1750 0 : }
1751 :
1752 0 : Angle RefractiveIndexProfile::getO2LinesPhaseDelay()
1753 : {
1754 0 : return getO2LinesPhaseDelay(0);
1755 : }
1756 :
1757 1 : Length RefractiveIndexProfile::getO2LinesPathLength()
1758 : {
1759 1 : return getO2LinesPathLength(0);
1760 : }
1761 :
1762 4801 : Angle RefractiveIndexProfile::getO2LinesPhaseDelay(unsigned int nc)
1763 : {
1764 4801 : if(!chanIndexIsValid(nc)) {
1765 0 : return Angle(-999.0, Angle::UnitDegree);
1766 : }
1767 4801 : double kv = 0;
1768 133796 : for(unsigned int j = 0; j < numLayer_; j++) {
1769 128995 : kv = kv + real(vv_N_O2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1770 : }
1771 4801 : Angle aa(kv * 57.29578, Angle::UnitDegree);
1772 4801 : return aa;
1773 4801 : }
1774 :
1775 4801 : Length RefractiveIndexProfile::getO2LinesPathLength(unsigned int nc)
1776 : {
1777 4801 : if(!chanIndexIsValid(nc)) {
1778 0 : return Length(-999.0, Length::UnitMeter);
1779 : }
1780 4801 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
1781 4801 : Length ll((wavelength / 360.0) * getO2LinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
1782 4801 : return ll;
1783 4801 : }
1784 :
1785 0 : Angle RefractiveIndexProfile::getO2LinesPhaseDelay(unsigned int spwid,
1786 : unsigned int nc)
1787 : {
1788 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1789 0 : return Angle(-999.0, Angle::UnitDegree);
1790 : }
1791 0 : return getO2LinesPhaseDelay(v_transfertId_[spwid] + nc);
1792 : }
1793 :
1794 0 : Angle RefractiveIndexProfile::getAverageO2LinesPhaseDelay(unsigned int spwid)
1795 : {
1796 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1797 0 : return Angle(-999.0, Angle::UnitDegree);
1798 : }
1799 0 : double av = 0.0;
1800 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1801 0 : av = av + getO2LinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
1802 : }
1803 0 : av = av / getNumChan(spwid);
1804 0 : Angle average(av, Angle::UnitDegree);
1805 0 : return average;
1806 0 : }
1807 :
1808 0 : Length RefractiveIndexProfile::getO2LinesPathLength(unsigned int spwid,
1809 : unsigned int nc)
1810 : {
1811 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1812 0 : return Length(-999.0, Length::UnitMeter);
1813 : }
1814 0 : return getO2LinesPathLength(v_transfertId_[spwid] + nc);
1815 : }
1816 :
1817 240 : Length RefractiveIndexProfile::getAverageO2LinesPathLength(unsigned int spwid)
1818 : {
1819 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
1820 0 : return Length(-999.0, Length::UnitMeter);
1821 : }
1822 240 : double av = 0.0;
1823 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1824 4800 : av = av + getO2LinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
1825 : }
1826 240 : av = av / getNumChan(spwid);
1827 240 : Length average(av, Length::UnitMilliMeter);
1828 240 : return average;
1829 240 : }
1830 :
1831 0 : Angle RefractiveIndexProfile::getO3LinesPhaseDelay()
1832 : {
1833 0 : return getO3LinesPhaseDelay(0);
1834 : }
1835 :
1836 1 : Length RefractiveIndexProfile::getO3LinesPathLength()
1837 : {
1838 1 : return getO3LinesPathLength(0);
1839 : }
1840 :
1841 4801 : Angle RefractiveIndexProfile::getO3LinesPhaseDelay(unsigned int nc)
1842 : {
1843 4801 : if(!chanIndexIsValid(nc)) {
1844 0 : return Angle(-999.0, Angle::UnitDegree);
1845 : }
1846 4801 : double kv = 0;
1847 :
1848 : // if(nc=66){cout << "vv_N_O3LinesPtr_" << ".size()=" << vv_N_O3LinesPtr_.size() << std::endl;}
1849 :
1850 133796 : for(unsigned int j = 0; j < numLayer_; j++) {
1851 : /* if(nc=66){
1852 : std::cout << "j=" << j << " vv_N_O3LinesPtr_[" << nc << "]->at(" << j << ")=" << vv_N_O3LinesPtr_[nc]->at(j) << std::endl;
1853 : } */
1854 128995 : kv = kv + real(vv_N_O3LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1855 : }
1856 4801 : Angle aa(kv * 57.29578, Angle::UnitDegree);
1857 4801 : return aa;
1858 4801 : }
1859 :
1860 4801 : Length RefractiveIndexProfile::getO3LinesPathLength(unsigned int nc)
1861 : {
1862 4801 : if(!chanIndexIsValid(nc)) {
1863 0 : return Length(-999.0, Length::UnitMeter);
1864 : }
1865 4801 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
1866 4801 : Length ll((wavelength / 360.0) * getO3LinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
1867 4801 : return ll;
1868 4801 : }
1869 :
1870 0 : Angle RefractiveIndexProfile::getO3LinesPhaseDelay(unsigned int spwid,
1871 : unsigned int nc)
1872 : {
1873 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1874 0 : return Angle(-999.0, Angle::UnitDegree);
1875 : }
1876 0 : return getO3LinesPhaseDelay(v_transfertId_[spwid] + nc);
1877 : }
1878 :
1879 0 : Angle RefractiveIndexProfile::getAverageO3LinesPhaseDelay(unsigned int spwid)
1880 : {
1881 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1882 0 : return Angle(-999.0, Angle::UnitDegree);
1883 : }
1884 0 : double av = 0.0;
1885 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1886 0 : av = av + getO3LinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
1887 : }
1888 0 : av = av / getNumChan(spwid);
1889 0 : Angle average(av, Angle::UnitDegree);
1890 0 : return average;
1891 0 : }
1892 :
1893 0 : Length RefractiveIndexProfile::getO3LinesPathLength(unsigned int spwid,
1894 : unsigned int nc)
1895 : {
1896 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1897 0 : return Length(-999.0, Length::UnitMeter);
1898 : }
1899 0 : return getO3LinesPathLength(v_transfertId_[spwid] + nc);
1900 : }
1901 :
1902 240 : Length RefractiveIndexProfile::getAverageO3LinesPathLength(unsigned int spwid)
1903 : {
1904 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
1905 0 : return Length(-999.0, Length::UnitMeter);
1906 : }
1907 240 : double av = 0.0;
1908 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1909 4800 : av = av + getO3LinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
1910 : }
1911 240 : av = av / getNumChan(spwid);
1912 240 : Length average(av, Length::UnitMilliMeter);
1913 240 : return average;
1914 240 : }
1915 :
1916 0 : Angle RefractiveIndexProfile::getCOLinesPhaseDelay()
1917 : {
1918 0 : return getCOLinesPhaseDelay(0);
1919 : }
1920 :
1921 1 : Length RefractiveIndexProfile::getCOLinesPathLength()
1922 : {
1923 1 : return getCOLinesPathLength(0);
1924 : }
1925 :
1926 4801 : Angle RefractiveIndexProfile::getCOLinesPhaseDelay(unsigned int nc)
1927 : {
1928 4801 : if(!chanIndexIsValid(nc)) {
1929 0 : return Angle(-999.0, Angle::UnitDegree);
1930 : }
1931 4801 : double kv = 0;
1932 133796 : for(unsigned int j = 0; j < numLayer_; j++) {
1933 128995 : kv = kv + real(vv_N_COLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
1934 : }
1935 4801 : Angle aa(kv * 57.29578, Angle::UnitDegree);
1936 4801 : return aa;
1937 4801 : }
1938 :
1939 4801 : Length RefractiveIndexProfile::getCOLinesPathLength(unsigned int nc)
1940 : {
1941 4801 : if(!chanIndexIsValid(nc)) {
1942 0 : return Length(-999.0, Length::UnitMeter);
1943 : }
1944 4801 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
1945 4801 : Length ll((wavelength / 360.0) * getCOLinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
1946 4801 : return ll;
1947 4801 : }
1948 :
1949 0 : Angle RefractiveIndexProfile::getCOLinesPhaseDelay(unsigned int spwid,
1950 : unsigned int nc)
1951 : {
1952 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1953 0 : return Angle(-999.0, Angle::UnitDegree);
1954 : }
1955 0 : return getCOLinesPhaseDelay(v_transfertId_[spwid] + nc);
1956 : }
1957 :
1958 0 : Angle RefractiveIndexProfile::getAverageCOLinesPhaseDelay(unsigned int spwid)
1959 : {
1960 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
1961 0 : return Angle(-999.0, Angle::UnitDegree);
1962 : }
1963 0 : double av = 0.0;
1964 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1965 0 : av = av + getCOLinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
1966 : }
1967 0 : av = av / getNumChan(spwid);
1968 0 : Angle average(av, Angle::UnitDegree);
1969 0 : return average;
1970 0 : }
1971 :
1972 0 : Length RefractiveIndexProfile::getCOLinesPathLength(unsigned int spwid,
1973 : unsigned int nc)
1974 : {
1975 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
1976 0 : return Length(-999.0, Length::UnitMeter);
1977 : }
1978 0 : return getCOLinesPathLength(v_transfertId_[spwid] + nc);
1979 : }
1980 :
1981 240 : Length RefractiveIndexProfile::getAverageCOLinesPathLength(unsigned int spwid)
1982 : {
1983 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
1984 0 : return Length(-999.0, Length::UnitMeter);
1985 : }
1986 240 : double av = 0.0;
1987 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
1988 4800 : av = av + getCOLinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
1989 : }
1990 240 : av = av / getNumChan(spwid);
1991 240 : Length average(av, Length::UnitMilliMeter);
1992 240 : return average;
1993 240 : }
1994 :
1995 0 : Angle RefractiveIndexProfile::getN2OLinesPhaseDelay()
1996 : {
1997 0 : return getN2OLinesPhaseDelay(0);
1998 : }
1999 :
2000 1 : Length RefractiveIndexProfile::getN2OLinesPathLength()
2001 : {
2002 1 : return getN2OLinesPathLength(0);
2003 : }
2004 :
2005 4801 : Angle RefractiveIndexProfile::getN2OLinesPhaseDelay(unsigned int nc)
2006 : {
2007 4801 : if(!chanIndexIsValid(nc)) {
2008 0 : return Angle(-999.0, Angle::UnitDegree);
2009 : }
2010 4801 : double kv = 0;
2011 133796 : for(unsigned int j = 0; j < numLayer_; j++) {
2012 128995 : kv = kv + real(vv_N_N2OLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
2013 : }
2014 4801 : Angle aa(kv * 57.29578, Angle::UnitDegree);
2015 4801 : return aa;
2016 4801 : }
2017 :
2018 4801 : Length RefractiveIndexProfile::getN2OLinesPathLength(unsigned int nc)
2019 : {
2020 4801 : if(!chanIndexIsValid(nc)) {
2021 0 : return Length(-999.0, Length::UnitMeter);
2022 : }
2023 4801 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
2024 4801 : Length ll((wavelength / 360.0) * getN2OLinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
2025 4801 : return ll;
2026 4801 : }
2027 :
2028 0 : Angle RefractiveIndexProfile::getN2OLinesPhaseDelay(unsigned int spwid,
2029 : unsigned int nc)
2030 : {
2031 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2032 0 : return Angle(-999.0, Angle::UnitDegree);
2033 : }
2034 0 : return getN2OLinesPhaseDelay(v_transfertId_[spwid] + nc);
2035 : }
2036 :
2037 0 : Angle RefractiveIndexProfile::getAverageN2OLinesPhaseDelay(unsigned int spwid)
2038 : {
2039 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2040 0 : return Angle(-999.0, Angle::UnitDegree);
2041 : }
2042 0 : double av = 0.0;
2043 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2044 0 : av = av + getN2OLinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
2045 : }
2046 0 : av = av / getNumChan(spwid);
2047 0 : Angle average(av, Angle::UnitDegree);
2048 0 : return average;
2049 0 : }
2050 :
2051 0 : Length RefractiveIndexProfile::getN2OLinesPathLength(unsigned int spwid,
2052 : unsigned int nc)
2053 : {
2054 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2055 0 : return Length(-999.0, Length::UnitMeter);
2056 : }
2057 0 : return getN2OLinesPathLength(v_transfertId_[spwid] + nc);
2058 : }
2059 :
2060 240 : Length RefractiveIndexProfile::getAverageN2OLinesPathLength(unsigned int spwid)
2061 : {
2062 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
2063 0 : return Length(-999.0, Length::UnitMeter);
2064 : }
2065 240 : double av = 0.0;
2066 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2067 4800 : av = av + getN2OLinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
2068 : }
2069 240 : av = av / getNumChan(spwid);
2070 240 : Length average(av, Length::UnitMilliMeter);
2071 240 : return average;
2072 240 : }
2073 :
2074 :
2075 :
2076 :
2077 :
2078 :
2079 0 : Angle RefractiveIndexProfile::getNO2LinesPhaseDelay()
2080 : {
2081 0 : return getNO2LinesPhaseDelay(0);
2082 : }
2083 :
2084 0 : Length RefractiveIndexProfile::getNO2LinesPathLength()
2085 : {
2086 0 : return getNO2LinesPathLength(0);
2087 : }
2088 :
2089 4800 : Angle RefractiveIndexProfile::getNO2LinesPhaseDelay(unsigned int nc)
2090 : {
2091 4800 : if(!chanIndexIsValid(nc)) {
2092 0 : return Angle(-999.0, Angle::UnitDegree);
2093 : }
2094 4800 : double kv = 0;
2095 133760 : for(unsigned int j = 0; j < numLayer_; j++) {
2096 128960 : kv = kv + real(vv_N_NO2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
2097 : }
2098 4800 : Angle aa(kv * 57.29578, Angle::UnitDegree);
2099 4800 : return aa;
2100 4800 : }
2101 :
2102 4800 : Length RefractiveIndexProfile::getNO2LinesPathLength(unsigned int nc)
2103 : {
2104 4800 : if(!chanIndexIsValid(nc)) {
2105 0 : return Length(-999.0, Length::UnitMeter);
2106 : }
2107 4800 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
2108 4800 : Length ll((wavelength / 360.0) * getNO2LinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
2109 4800 : return ll;
2110 4800 : }
2111 :
2112 0 : Angle RefractiveIndexProfile::getNO2LinesPhaseDelay(unsigned int spwid,
2113 : unsigned int nc)
2114 : {
2115 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2116 0 : return Angle(-999.0, Angle::UnitDegree);
2117 : }
2118 0 : return getNO2LinesPhaseDelay(v_transfertId_[spwid] + nc);
2119 : }
2120 :
2121 0 : Angle RefractiveIndexProfile::getAverageNO2LinesPhaseDelay(unsigned int spwid)
2122 : {
2123 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2124 0 : return Angle(-999.0, Angle::UnitDegree);
2125 : }
2126 0 : double av = 0.0;
2127 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2128 0 : av = av + getNO2LinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
2129 : }
2130 0 : av = av / getNumChan(spwid);
2131 0 : Angle average(av, Angle::UnitDegree);
2132 0 : return average;
2133 0 : }
2134 :
2135 0 : Length RefractiveIndexProfile::getNO2LinesPathLength(unsigned int spwid,
2136 : unsigned int nc)
2137 : {
2138 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2139 0 : return Length(-999.0, Length::UnitMeter);
2140 : }
2141 0 : return getNO2LinesPathLength(v_transfertId_[spwid] + nc);
2142 : }
2143 :
2144 240 : Length RefractiveIndexProfile::getAverageNO2LinesPathLength(unsigned int spwid)
2145 : {
2146 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
2147 0 : return Length(-999.0, Length::UnitMeter);
2148 : }
2149 240 : double av = 0.0;
2150 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2151 4800 : av = av + getNO2LinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
2152 : }
2153 240 : av = av / getNumChan(spwid);
2154 240 : Length average(av, Length::UnitMilliMeter);
2155 240 : return average;
2156 240 : }
2157 :
2158 :
2159 :
2160 :
2161 :
2162 :
2163 :
2164 :
2165 0 : Angle RefractiveIndexProfile::getSO2LinesPhaseDelay()
2166 : {
2167 0 : return getSO2LinesPhaseDelay(0);
2168 : }
2169 :
2170 0 : Length RefractiveIndexProfile::getSO2LinesPathLength()
2171 : {
2172 0 : return getSO2LinesPathLength(0);
2173 : }
2174 :
2175 4800 : Angle RefractiveIndexProfile::getSO2LinesPhaseDelay(unsigned int nc)
2176 : {
2177 4800 : if(!chanIndexIsValid(nc)) {
2178 0 : return Angle(-999.0, Angle::UnitDegree);
2179 : }
2180 4800 : double kv = 0;
2181 133760 : for(unsigned int j = 0; j < numLayer_; j++) {
2182 128960 : kv = kv + real(vv_N_SO2LinesPtr_[nc]->at(j)) * v_layerThickness_[j];
2183 : }
2184 4800 : Angle aa(kv * 57.29578, Angle::UnitDegree);
2185 4800 : return aa;
2186 4800 : }
2187 :
2188 4800 : Length RefractiveIndexProfile::getSO2LinesPathLength(unsigned int nc)
2189 : {
2190 4800 : if(!chanIndexIsValid(nc)) {
2191 0 : return Length(-999.0, Length::UnitMeter);
2192 : }
2193 4800 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
2194 4800 : Length ll((wavelength / 360.0) * getSO2LinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
2195 4800 : return ll;
2196 4800 : }
2197 :
2198 0 : Angle RefractiveIndexProfile::getSO2LinesPhaseDelay(unsigned int spwid,
2199 : unsigned int nc)
2200 : {
2201 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2202 0 : return Angle(-999.0, Angle::UnitDegree);
2203 : }
2204 0 : return getSO2LinesPhaseDelay(v_transfertId_[spwid] + nc);
2205 : }
2206 :
2207 0 : Angle RefractiveIndexProfile::getAverageSO2LinesPhaseDelay(unsigned int spwid)
2208 : {
2209 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2210 0 : return Angle(-999.0, Angle::UnitDegree);
2211 : }
2212 0 : double av = 0.0;
2213 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2214 0 : av = av + getSO2LinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
2215 : }
2216 0 : av = av / getNumChan(spwid);
2217 0 : Angle average(av, Angle::UnitDegree);
2218 0 : return average;
2219 0 : }
2220 :
2221 0 : Length RefractiveIndexProfile::getSO2LinesPathLength(unsigned int spwid,
2222 : unsigned int nc)
2223 : {
2224 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2225 0 : return Length(-999.0, Length::UnitMeter);
2226 : }
2227 0 : return getSO2LinesPathLength(v_transfertId_[spwid] + nc);
2228 : }
2229 :
2230 240 : Length RefractiveIndexProfile::getAverageSO2LinesPathLength(unsigned int spwid)
2231 : {
2232 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
2233 0 : return Length(-999.0, Length::UnitMeter);
2234 : }
2235 240 : double av = 0.0;
2236 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2237 4800 : av = av + getSO2LinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
2238 : }
2239 240 : av = av / getNumChan(spwid);
2240 240 : Length average(av, Length::UnitMilliMeter);
2241 240 : return average;
2242 240 : }
2243 :
2244 :
2245 :
2246 0 : Angle RefractiveIndexProfile::getHClLinesPhaseDelay()
2247 : {
2248 0 : return getHClLinesPhaseDelay(0);
2249 : }
2250 :
2251 0 : Length RefractiveIndexProfile::getHClLinesPathLength()
2252 : {
2253 0 : return getHClLinesPathLength(0);
2254 : }
2255 :
2256 4800 : Angle RefractiveIndexProfile::getHClLinesPhaseDelay(unsigned int nc)
2257 : {
2258 4800 : if(!chanIndexIsValid(nc)) {
2259 0 : return Angle(-999.0, Angle::UnitDegree);
2260 : }
2261 4800 : double kv = 0;
2262 133760 : for(unsigned int j = 0; j < numLayer_; j++) {
2263 128960 : kv = kv + real(vv_N_HClLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
2264 : }
2265 4800 : Angle aa(kv * 57.29578, Angle::UnitDegree);
2266 4800 : return aa;
2267 4800 : }
2268 :
2269 4800 : Length RefractiveIndexProfile::getHClLinesPathLength(unsigned int nc)
2270 : {
2271 4800 : if(!chanIndexIsValid(nc)) {
2272 0 : return Length(-999.0, Length::UnitMeter);
2273 : }
2274 4800 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
2275 4800 : Length ll((wavelength / 360.0) * getHClLinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
2276 4800 : return ll;
2277 4800 : }
2278 :
2279 0 : Angle RefractiveIndexProfile::getHClLinesPhaseDelay(unsigned int spwid,
2280 : unsigned int nc)
2281 : {
2282 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2283 0 : return Angle(-999.0, Angle::UnitDegree);
2284 : }
2285 0 : return getHClLinesPhaseDelay(v_transfertId_[spwid] + nc);
2286 : }
2287 :
2288 0 : Angle RefractiveIndexProfile::getAverageHClLinesPhaseDelay(unsigned int spwid)
2289 : {
2290 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2291 0 : return Angle(-999.0, Angle::UnitDegree);
2292 : }
2293 0 : double av = 0.0;
2294 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2295 0 : av = av + getHClLinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
2296 : }
2297 0 : av = av / getNumChan(spwid);
2298 0 : Angle average(av, Angle::UnitDegree);
2299 0 : return average;
2300 0 : }
2301 :
2302 0 : Length RefractiveIndexProfile::getHClLinesPathLength(unsigned int spwid,
2303 : unsigned int nc)
2304 : {
2305 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2306 0 : return Length(-999.0, Length::UnitMeter);
2307 : }
2308 0 : return getHClLinesPathLength(v_transfertId_[spwid] + nc);
2309 : }
2310 :
2311 240 : Length RefractiveIndexProfile::getAverageHClLinesPathLength(unsigned int spwid)
2312 : {
2313 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
2314 0 : return Length(-999.0, Length::UnitMeter);
2315 : }
2316 240 : double av = 0.0;
2317 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2318 4800 : av = av + getHClLinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
2319 : }
2320 240 : av = av / getNumChan(spwid);
2321 240 : Length average(av, Length::UnitMilliMeter);
2322 240 : return average;
2323 240 : }
2324 :
2325 :
2326 :
2327 :
2328 :
2329 0 : Angle RefractiveIndexProfile::getHCNLinesPhaseDelay()
2330 : {
2331 0 : return getHCNLinesPhaseDelay(0);
2332 : }
2333 :
2334 0 : Length RefractiveIndexProfile::getHCNLinesPathLength()
2335 : {
2336 0 : return getHCNLinesPathLength(0);
2337 : }
2338 :
2339 4800 : Angle RefractiveIndexProfile::getHCNLinesPhaseDelay(unsigned int nc)
2340 : {
2341 4800 : if(!chanIndexIsValid(nc)) {
2342 0 : return Angle(-999.0, Angle::UnitDegree);
2343 : }
2344 4800 : double kv = 0;
2345 133760 : for(unsigned int j = 0; j < numLayer_; j++) {
2346 128960 : kv = kv + real(vv_N_HCNLinesPtr_[nc]->at(j)) * v_layerThickness_[j];
2347 : }
2348 4800 : Angle aa(kv * 57.29578, Angle::UnitDegree);
2349 4800 : return aa;
2350 4800 : }
2351 :
2352 4800 : Length RefractiveIndexProfile::getHCNLinesPathLength(unsigned int nc)
2353 : {
2354 4800 : if(!chanIndexIsValid(nc)) {
2355 0 : return Length(-999.0, Length::UnitMeter);
2356 : }
2357 4800 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
2358 4800 : Length ll((wavelength / 360.0) * getHCNLinesPhaseDelay(nc).get(Angle::UnitDegree), Length::UnitMeter);
2359 4800 : return ll;
2360 4800 : }
2361 :
2362 0 : Angle RefractiveIndexProfile::getHCNLinesPhaseDelay(unsigned int spwid,
2363 : unsigned int nc)
2364 : {
2365 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2366 0 : return Angle(-999.0, Angle::UnitDegree);
2367 : }
2368 0 : return getHCNLinesPhaseDelay(v_transfertId_[spwid] + nc);
2369 : }
2370 :
2371 0 : Angle RefractiveIndexProfile::getAverageHCNLinesPhaseDelay(unsigned int spwid)
2372 : {
2373 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2374 0 : return Angle(-999.0, Angle::UnitDegree);
2375 : }
2376 0 : double av = 0.0;
2377 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2378 0 : av = av + getHCNLinesPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
2379 : }
2380 0 : av = av / getNumChan(spwid);
2381 0 : Angle average(av, Angle::UnitDegree);
2382 0 : return average;
2383 0 : }
2384 :
2385 0 : Length RefractiveIndexProfile::getHCNLinesPathLength(unsigned int spwid,
2386 : unsigned int nc)
2387 : {
2388 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2389 0 : return Length(-999.0, Length::UnitMeter);
2390 : }
2391 0 : return getHCNLinesPathLength(v_transfertId_[spwid] + nc);
2392 : }
2393 :
2394 240 : Length RefractiveIndexProfile::getAverageHCNLinesPathLength(unsigned int spwid)
2395 : {
2396 240 : if(!spwidAndIndexAreValid(spwid, 0)) {
2397 0 : return Length(-999.0, Length::UnitMeter);
2398 : }
2399 240 : double av = 0.0;
2400 5040 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2401 4800 : av = av + getHCNLinesPathLength(v_transfertId_[spwid] + i).get(Length::UnitMilliMeter);
2402 : }
2403 240 : av = av / getNumChan(spwid);
2404 240 : Length average(av, Length::UnitMilliMeter);
2405 240 : return average;
2406 240 : }
2407 :
2408 :
2409 :
2410 :
2411 :
2412 0 : Angle RefractiveIndexProfile::getNonDispersiveH2OPhaseDelay(const Length &integratedwatercolumn)
2413 : {
2414 0 : return getNonDispersiveH2OPhaseDelay(integratedwatercolumn,0);
2415 : }
2416 :
2417 2 : Length RefractiveIndexProfile::getNonDispersiveH2OPathLength(const Length &integratedwatercolumn)
2418 : {
2419 2 : return getNonDispersiveH2OPathLength(integratedwatercolumn,0);
2420 : }
2421 :
2422 2 : Angle RefractiveIndexProfile::getNonDispersiveH2OPhaseDelay(const Length &integratedwatercolumn,
2423 : unsigned int nc)
2424 : {
2425 2 : double kv = 0;
2426 2 : if(!chanIndexIsValid(nc)) {
2427 0 : return Angle(-999.0, Angle::UnitDegree);
2428 : }
2429 72 : for(unsigned int j = 0; j < numLayer_; j++) {
2430 70 : kv = kv + real(vv_N_H2OContPtr_[nc]->at(j)) * v_layerThickness_[j];
2431 : }
2432 2 : Angle aa(kv*(integratedwatercolumn.get()/getGroundWH2O().get())* 57.29578, Angle::UnitDegree);
2433 2 : return aa;
2434 2 : }
2435 :
2436 2 : Length RefractiveIndexProfile::getNonDispersiveH2OPathLength(const Length &integratedwatercolumn,
2437 : unsigned int nc)
2438 : {
2439 2 : if(!chanIndexIsValid(nc)) {
2440 0 : return Length(-999.0, Length::UnitMeter);
2441 : }
2442 2 : double wavelength = 299792458.0 / v_chanFreq_[nc]; // in m
2443 2 : Length ll((wavelength / 360.0) * getNonDispersiveH2OPhaseDelay(integratedwatercolumn,nc).get(Angle::UnitDegree),Length::UnitMeter);
2444 2 : return ll;
2445 2 : }
2446 :
2447 0 : Angle RefractiveIndexProfile::getNonDispersiveH2OPhaseDelay(const Length &integratedwatercolumn,
2448 : unsigned int spwid,
2449 : unsigned int nc)
2450 : {
2451 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2452 0 : return Angle(-999.0, Angle::UnitDegree);
2453 : }
2454 0 : return getNonDispersiveH2OPhaseDelay(integratedwatercolumn,v_transfertId_[spwid] + nc);
2455 : }
2456 :
2457 0 : Angle RefractiveIndexProfile::getAverageNonDispersiveH2OPhaseDelay(const Length &integratedwatercolumn,
2458 : unsigned int spwid)
2459 : {
2460 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2461 0 : return Angle(-999.0, Angle::UnitDegree);
2462 : }
2463 0 : double av = 0.0;
2464 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2465 0 : av = av
2466 0 : + getNonDispersiveH2OPhaseDelay(v_transfertId_[spwid] + i).get(Angle::UnitDegree);
2467 : }
2468 0 : av = av / getNumChan(spwid);
2469 0 : Angle average(av*(integratedwatercolumn.get()/getGroundWH2O().get()), Angle::UnitDegree);
2470 0 : return average;
2471 0 : }
2472 :
2473 0 : Length RefractiveIndexProfile::getNonDispersiveH2OPathLength(const Length &integratedwatercolumn,
2474 : unsigned int spwid,
2475 : unsigned int nc)
2476 : {
2477 0 : if(!spwidAndIndexAreValid(spwid, nc)) {
2478 0 : return Length(-999.0);
2479 : }
2480 0 : return getNonDispersiveH2OPathLength(integratedwatercolumn,v_transfertId_[spwid] + nc);
2481 : }
2482 :
2483 0 : Length RefractiveIndexProfile::getAverageNonDispersiveH2OPathLength(const Length &integratedwatercolumn,
2484 : unsigned int spwid)
2485 : {
2486 0 : if(!spwidAndIndexAreValid(spwid, 0)) {
2487 0 : return Length(-999.0);
2488 : }
2489 0 : double av = 0.0;
2490 0 : for(unsigned int i = 0; i < getNumChan(spwid); i++) {
2491 0 : av = av
2492 0 : + getNonDispersiveH2OPathLength(integratedwatercolumn,v_transfertId_[spwid] + i).get(Length::UnitMeter);
2493 : }
2494 0 : av = av / getNumChan(spwid);
2495 0 : Length average(av, Length::UnitMeter);
2496 0 : return average;
2497 0 : }
2498 :
2499 : // NB: the function chanIndexIsValid will be overrided by ....
2500 112383 : bool RefractiveIndexProfile::chanIndexIsValid(unsigned int nc)
2501 : {
2502 112383 : if(nc < vv_N_H2OLinesPtr_.size()) return true;
2503 0 : if(nc < v_chanFreq_.size()) {
2504 : std::cout
2505 0 : << " RefractiveIndexProfile: Requested index in a new spectral window ==> update profile"
2506 0 : << std::endl;
2507 0 : mkRefractiveIndexProfile();
2508 : // std::cout << "...and we return" << std::endl;
2509 0 : return true;
2510 : }
2511 0 : std::cout << " RefractiveIndexProfile: ERROR: Invalid channel frequency index"
2512 0 : << std::endl;
2513 0 : return false;
2514 : }
2515 :
2516 : // NB: the function spwidAndIndexAreValid will be overrided by ...
2517 2738 : bool RefractiveIndexProfile::spwidAndIndexAreValid(unsigned int spwid,
2518 : unsigned int idx)
2519 : {
2520 :
2521 2738 : if(spwid > getNumSpectralWindow() - 1) {
2522 : std::cout
2523 0 : << " RefractiveIndexProfile: ERROR: spectral window identifier out of range "
2524 0 : << std::endl;
2525 0 : return false;
2526 : }
2527 2738 : if(idx > getNumChan(spwid) - 1) {
2528 0 : std::cout << " RefractiveIndexProfile: ERROR: channel index out of range "
2529 0 : << std::endl;
2530 0 : return false;
2531 : }
2532 2738 : unsigned int nc = v_transfertId_[spwid] + idx;
2533 2738 : bool valid = chanIndexIsValid(nc);
2534 2738 : return valid;
2535 : }
2536 :
2537 0 : void RefractiveIndexProfile::updateNewSpectralWindows()
2538 : {
2539 0 : mkRefractiveIndexProfile();
2540 0 : }
2541 :
2542 : ATM_NAMESPACE_END
|