function ddr = tropo(sinel,hsta,p,tkel,hum,hp,htkel,hhum)
%TROPO  Calculation of tropospheric correction.
%       The range correction ddr in m is to be subtracted from
%       pseudo-ranges and carrier phases

% sinel    sin of elevation angle of satellite
% hsta     height of station in km
% p        atmospheric pressure in mb at height hp
% tkel     surface temperature in degrees Kelvin at height htkel
% hum      humidity in % at height hhum
% hp       height of pressure measurement in km
% htkel    height of temperature measurement in km
% hhum     height of humidity measurement in km

% Reference
% Goad, C.C. & Goodman, L. (1974) A Modified Tropospheric
% Refraction Correction Model. Paper presented at the
% American Geophysical Union Annual Fall Meeting, San
% Francisco, December 12-17

% A Matlab reimplementation of a C code from driver.
% Kai Borre 06-28-95

a_e = 6378.137;     % semi-major axis of earth ellipsoid
b0 = 7.839257e-5;
tlapse = -6.5;
tkhum = tkel+tlapse*(hhum-htkel);
atkel = 7.5*(tkhum-273.15)/(237.3+tkhum-273.15);
e0 = 0.0611*hum*10^atkel;
tksea = tkel-tlapse*htkel;
em = -978.77/(2.8704e6*tlapse*1.0e-5);
tkelh = tksea+tlapse*hhum;
e0sea = e0*(tksea/tkelh)^(4*em);
tkelp = tksea+tlapse*hp;
psea = p*(tksea/tkelp)^em;
if sinel < 0
   sinel = 0; 
end;
tropo = 0;
done = 'FALSE';
refsea = 77.624e-6/tksea;
htop = 1.1385e-5/refsea;
refsea = refsea*psea;
ref = refsea*((htop-hsta)/htop)^4;
while 1
   rtop = (a_e+htop)^2-(a_e+hsta)^2*(1-sinel^2);
   if rtop < 0, rtop = 0; end;   % check to see if geometry is crazy
   rtop = sqrt(rtop)-(a_e+hsta)*sinel;
   a = -sinel/(htop-hsta);
   b = -b0*(1-sinel^2)/(htop-hsta);
   rn = zeros(8,1);
   for i = 1:8
      rn(i) = rtop^(i+1); 
   end;
   alpha = [2*a, 2*a^2+4*b/3, a*(a^2+3*b),...
               a^4/5+2.4*a^2*b+1.2*b^2, 2*a*b*(a^2+3*b)/3,...
                             b^2*(6*a^2+4*b)*1.428571e-1, 0, 0];
   if b^2 > 1.0e-35, alpha(7) = a*b^3/2; alpha(8) = b^4/9; end;
   dr = rtop;
   dr = dr+alpha*rn;
   tropo = tropo+dr*ref*1000;
   if strcmp(done, 'TRUE ') , ddr = tropo; break; end;
   done = 'TRUE ';
   refsea = (371900.0e-6/tksea-12.92e-6)/tksea;
   htop = 1.1385e-5*(1255/tksea+0.05)/refsea;
   ref = refsea*e0sea*((htop-hsta)/htop)^4;
end;
%%%%%%%%% end tropo.m  %%%%%%%%%%%%%%%%%%%
