function [X, Y, Z] = geo2cart(phi, lambda, h, i)
% GEO2CART Conversion of geographical coordinates (phi, lambda, h) to
% Cartesian coordinates (X, Y, Z).
%
% [X, Y, Z] = geo2cart(phi, lambda, h, i);
%
% Format for phi and lambda: [degrees minutes seconds].
% h, X, Y, and Z are in meters.
%
% Choices i of Reference Ellipsoid
%   1. International Ellipsoid 1924
%   2. International Ellipsoid 1967
%   3. World Geodetic System 1972
%   4. Geodetic Reference System 1980
%   5. World Geodetic System 1984
%
%   Inputs:
%       phi       - geocentric latitude (format [degrees minutes seconds])
%       lambda    - geocentric longitude (format [degrees minutes seconds])
%       h         - height
%       i         - reference ellipsoid type
%
%   Outputs:
%       X, Y, Z   - Cartesian coordinates (meters)

% GNSS-SDR is a Global Navigation Satellite System software-defined receiver.
% This file is part of GNSS-SDR.
%
% SPDX-FileCopyrightText: Kai Borre, 1998
% SPDX-License-Identifier: GPL-3.0-or-later

%==========================================================================

b   = phi(1) + phi(2)/60 + phi(3)/3600;
b   = b*pi / 180;
l   = lambda(1) + lambda(2)/60 + lambda(3)/3600;
l   = l*pi / 180;

a   = [6378388 6378160 6378135 6378137 6378137];
f   = [1/297 1/298.247 1/298.26 1/298.257222101 1/298.257223563];

ex2 = (2-f(i))*f(i) / ((1-f(i))^2);
c   = a(i) * sqrt(1+ex2);
N   = c / sqrt(1 + ex2*cos(b)^2);

X   = (N+h) * cos(b) * cos(l);
Y   = (N+h) * cos(b) * sin(l);
Z   = ((1-f(i))^2*N + h) * sin(b);

%%%%%%%%%%%%%% end geo2cart.m  %%%%%%%%%%%%%%%%%%%%%%%%
