Computing dispersive atmospheric delay with AATM
Abstract
This is a short and simple illustration of how to use (A)ATM to calculate the dispersive path delay introduced by the atmosphere as well as the non-dispersive parts. The program has only two run-time parameters: the frequency at which to carry out the computation and the relative humidity at ground level.
If you have performed similar calculations and get same or different results, I would very much like to hear from you.
This program will be a part of AATM-0.06 examples when this version is released.
Example usage
The interaction with the program below is extremely simple and best illustrated by an example:
./dispersive --help
Produces the help message, which for current version is:
Compute dispersive delay in the atmosphere
This program is part of AATM version 0.06
GPL license -- you have the right to the source code. See COPYING
Allowed options:
--help Produce this help message
--freq arg Frequency at which to compute the dispersion (GHz)
--ghum arg Relative humidity at ground level (percent)
The actual computation can look like this:
./dispersive --freq 330 --ghum 25
Freq Wet Non-Disp Wet Disp Dry Non-Disp
330 0.0137844 0.00144976 1.47484
Program source code
// Copyright (2008) Bojan Nikolic <b.nikolic@mrao.cam.ac.uk>
//
// This file is part of AATM
//
// AATM is free software: you can redistribute it and/or modify it
// under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// AATM is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
// License for more details.
//
// You should have received a copy of the GNU General Public License
// along with AATM. If not, see <http://www.gnu.org/licenses/>.
//
// Comments regarding this example welcome at:
// Bojan Nikolic <b.nikolic@mrao.cam.ac.uk>
//
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
// Unfortunately the using statement below is required because of poor
// desgin of the header files
using namespace std;
#include "ATMRefractiveIndexProfile.h"
#include "ATMPercent.h"
#include "ATMPressure.h"
#include "ATMNumberDensity.h"
#include "ATMMassDensity.h"
#include "ATMTemperature.h"
#include "ATMLength.h"
#include "ATMInverseLength.h"
#include "ATMOpacity.h"
#include "ATMHumidity.h"
#include "ATMFrequency.h"
#include "ATMWaterVaporRadiometer.h"
#include "ATMWVRMeasurement.h"
#include "ATMAtmosphereType.h"
#include "ATMType.h"
#include "ATMProfile.h"
#include "ATMSpectralGrid.h"
#include "ATMRefractiveIndex.h"
#include "ATMSkyStatus.h"
#include "ATMTypeName.h"
#include "ATMAngle.h"
// ------------ End ATM inclusion part ------------
#include "../config.h"
#include <boost/program_options.hpp>
typedef boost::shared_ptr<atm::AtmProfile> pAtmProf;
pAtmProf
simpleAOSAtmo(double ghum)
{
using namespace atm;
Atmospheretype atmType = tropical; // Atmospheric type (to reproduce behavior above the tropopause)
Temperature T( 270.0,"K" ); // Ground temperature
Pressure P( 560.0,"mb"); // Ground Pressure
Humidity H( ghum,"%" ); // Ground Relative Humidity (indication)
Length Alt( 5000,"m" ); // Altitude of the site
Length WVL( 2.0,"km"); // Water vapor scale height
double TLR= -5.6 ; // Tropospheric lapse rate (must be in K/km)
Length topAtm( 48.0,"km"); // Upper atm. boundary for calculations
Pressure Pstep( 10.0,"mb"); // Primary pressure step
double PstepFact= 1.2; // Pressure step ratio between two consecutive layers
return pAtmProf(new AtmProfile(Alt,
P,
T,
TLR,
H,
WVL,
Pstep,
PstepFact,
topAtm,
atmType));
}
void dispersive(double freq,
double ghum)
{
pAtmProf atmo(simpleAOSAtmo(ghum));
atm::Frequency afreq(freq,
"GHz");
atm::RefractiveIndexProfile rip(afreq,
*atmo);
std::cout<<"Freq"
<<"\t"
<<"Wet Non-Disp"
<<"\t\t"
<<"Wet Disp"
<<"\t\t"
<<"Dry Non-Disp"
<<std::endl;
std::cout<<freq
<<"\t"
<<rip.getNonDispersiveWetPathLength().get()
<<"\t\t"
<<rip.getDispersiveWetPathLength().get()
<<"\t\t"
<<rip.getNonDispersiveDryPathLength().get()
<<std::endl;
}
int main(int ac, char* av[])
{
using namespace boost::program_options;
options_description desc("Allowed options");
desc.add_options()
("help", "Produce this help message")
("freq", value<double>(), "Frequency at which to compute the dispersion (GHz)")
("ghum", value<double>(), "Relative humidity at ground level (percent)")
;
variables_map vm;
store(parse_command_line(ac, av, desc), vm);
notify(vm);
if (vm.count("help"))
{
std::cout<<"Compute dispersive delay in the atmosphere"
<<std::endl
<<std::endl
<<"This program is part of AATM version " + std::string(VERSION)
<<std::endl
<<"GPL license -- you have the right to the source code. See COPYING"
<<std::endl
<<std::endl
<<desc;
}
else
{
dispersive(vm["freq"].as<double>(),
vm["ghum"].as<double>()
);
}
return 0;
}