GPS Solutions

, Volume 18, Issue 1, pp 153–162

# EPC: Matlab software to estimate Euler pole parameters

• Marc Cocard
• Rock Santerre
GPS Toolbox

## Abstract

The estimation of Euler pole parameters has always been an important issue in global tectonics and geodynamics studies. In addition, the increasing number of permanent GPS stations and the ease of access to their data, along with advances in computers, promise new methods and tools for the estimation and the quantitative analysis of Euler pole parameters. Therefore, we developed the Euler pole calculator software using a set of mathematical algorithms based on the model of tectonic plate motion on a spherical surface. The software is able to calculate the expected velocities for any points located on the earth’s surface given the relevant Euler pole parameters and to estimate the Euler pole parameters given the observed velocities of a set of sites located on the same tectonic plate. Mathematical algorithms and functions of the software are explained in detail.

### Keywords

Direct Euler pole problem Inverse Euler pole problem MATLAB

## Introduction

Motion of the tectonic plates across the earth’s surface can be represented by Euler’s rotation theorem in spherical geometry. According to the theorem, the movement of a rigid body across the surface of a sphere can be described as a rotation around an axis of rotation that passes through the center of the sphere. The pole of rotation is one of the two points where that axis intersects the surface of the sphere (Lowrie 2007). Application of this theorem in geophysics states that the displacement of one tectonic plate relative to other plates takes place as a rotation about the Euler pole of relative rotation between the plates.

The Euler pole can be located by different methods. Previously, most of the successful plate motion models were determined from transform fault azimuths, earthquake slip vectors and spreading rates at mid-ocean ridges (Chase 1972; Minster and Jordan 1978; DeMets et al. 1990, 2010; Argus and Gordon 1991). These models can explain the large-scale features of plate kinematics (Qiang et al. 1999).

Despite the importance of the Euler pole estimation in geodynamic studies, to the best of our knowledge, there is only one other software program for the calculation of Euler pole parameters using GPS velocity vectors. It is called PlatE-Motion (PEM) and was developed at the National Institute of Geophysics and Volcanology (INGV: Istituto Nazionale di Geofisica e Vulcanologia) in Italy (Cannavò and Palano 2011). However, developing a new software program is still interesting because: (1) the software redundancy can increase the reliability of the model solution or can facilitate the model solution validation by comparing the results obtained from different software (Hill and Blewitt 2006) and (2) PEM is not publicly available. Therefore, we developed the Euler pole calculator (EPC) software at the Center for Research in Geomatics (CRG), Laval University, Canada, to calculate both (1) the horizontal velocities of any point on the earth’s surface given the Euler pole parameters and (2) the Euler pole parameters by inverting the observed velocities at a set of measuring sites on the earth’s surface located on the same rigid tectonic block. Although we originally developed the software to work with GPS velocity vectors, it can also be used with velocity vectors obtained from other methods.

First, in Sects. 2 and 2.1, we describe the mathematical models and the least-squares adjustment method used to estimate the Euler pole parameters using the velocity vectors of a set of stations either in the Earth-Centered Earth-Fixed Cartesian Coordinate System or in the Local Geodetic Cartesian Coordinate System. Then, we mathematically discuss estimation of the Euler pole on the ellipsoidal model of the earth and other aspects of the ellipsoid-to-sphere simplification in Sect. 2.2. Following that, in Sect. 2.3, we explain four statistical tests/methods to evaluate the quality of the models. Lastly in Sect. 3, we introduce the main features of the developed software.

## Mathematical background

The Euler theorem can be mathematically formulated as:
$${\mathbf{v}}_{i}^{p} = {\varvec{\Omega}}^{p} \times {\mathbf{x}}_{i} = \left[ {\begin{array}{*{20}c} 0 & { - \omega_{z} } & {\omega_{y} } \\ {\omega_{z} } & 0 & { - \omega_{x} } \\ { - \omega_{y} } & {\omega_{x} } & 0 \\ \end{array} } \right]^{p} \left[ {\begin{array}{*{20}c} x \\ y \\ z \\ \end{array} } \right]_{i}$$
(1)
where $${\mathbf{v}}_{i}^{p}$$ and $${\mathbf{x}}_{i} \left( {x_{i} ,\;y_{i} ,\;z_{i} } \right)^{T}$$ are the velocity and the position of the station i, and $${\varvec{\Omega}}^{p} (\omega_{x}^{p} ,\;\omega_{y}^{p} ,\;\omega_{z}^{p} )$$ is the angular velocity or the Euler vector of the plate p associated with the station i. The label p in the model indicates the assumed plate and does not refer to the reference frame. The cross product is taken between the angular velocity vector and the station position vector in an Earth-Centered Earth-Fixed Cartesian Coordinate System (ECEF CCS). Therefore, the velocity $${\mathbf{v}}_{i}^{p}$$ is also expressed in the ECEF CCS. The magnitude of the Euler vector $${\varvec{\Omega}}^{p} = \,|{\varvec{\Omega}}^{p} |$$ is the rate of rotation of the plate p around its pole and is usually expressed in degrees per million years (°/Myr). The direction of the Euler vector $${\hat{\varvec{\Omega }}}^{p} = {\varvec{\Omega}}^{p} /|{\varvec{\Omega}}^{p} |$$ is called the “Euler pole” and is often expressed as a spherical latitude and longitude in degrees. In this rotation model, the plate p is basically constrained to move rigidly on the spherical earth’s surface without radial motion. We can rewrite (1) using basic skew-symmetric matrix properties (Liu and Trenkler 2008) as follows:
$${\mathbf{v}}_{i}^{p} = \left[ {\begin{array}{*{20}c} 0 & z & { - y} \\ { - z} & 0 & x \\ y & { - x} & 0 \\ \end{array} } \right]_{i} \left[ {\begin{array}{*{20}c} {\omega_{x} } \\ {\omega_{y} } \\ {\omega_{z} } \\ \end{array} } \right]^{p} = {\mathbf{X}}_{i} \times {\varvec{\Omega}}^{p}$$
(2)

This new form of (1) can help to simplify calculations of the Euler theorem, and therefore, it will be used as the basic formula for developing models in the following sections.

### Models and the least-squares adjustment

Using (2), it is possible to calculate the velocity vector of any point located on the earth’s surface having the Euler parameters, or infer the Euler pole parameters by inverting the observed velocity vectors of a set of points located on the same rigid tectonic block. We name the former case the “direct Euler pole problem” and the latter case the “inverse Euler pole problem.” Based on this definition, we present two mathematical models in the following sections.

#### Direct Euler pole problem in ECEF CCS

Estimation of the station velocities is simpler in an ECEF CCS. Assume that station i in the rigid plate p with the position vector $${\mathbf{x}}_{i} \left( {x_{i} ,\;y_{i} ,\;z_{i} } \right)^{T}$$ in ECEF CCS and the rotation vector $${\varvec{\Omega}}^{p}$$ with its covariance matrix $${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }}$$ in the same coordinate system is known. Then, the velocity vector in the ECEF CCS is directly given by (2) as follows:
$${\mathbf{v}}_{i}^{{({\text{ECEF}})}} = \left[ {\begin{array}{*{20}c} {v_{x} } \\ {v_{y} } \\ {v_{z} } \\ \end{array} } \right]_{{i^{{({\text{ECEF}})}} }} = \left[ {\begin{array}{*{20}c} 0 & z & { - y} \\ { - z} & 0 & x \\ y & { - x} & 0 \\ \end{array} } \right]_{{i^{{({\text{ECEF}})}} }} \left[ {\begin{array}{*{20}c} {\omega_{x} } \\ {\omega_{y} } \\ {\omega_{z} } \\ \end{array} } \right]^{p} = \left[ {\begin{array}{*{20}c} {z_{i} \omega_{y}^{p} - y_{i} \omega_{z}^{p} } \\ {x_{i} \omega_{z}^{p} - z_{i} \omega_{x}^{p} } \\ {y_{i} \omega_{x}^{p} - x_{i} \omega_{y}^{p} } \\ \end{array} } \right]$$
(3)
The ECEF CCS velocity vector in (3) can be converted to a velocity vector in a Local Geodetic Cartesian Coordinate System (LG CCS) using a combination of the three consecutive rotations, as follows:
\begin{aligned} {\mathbf{v}}_{i}^{{\left( {\text{LG}} \right)}} & = \left[ {\begin{array}{*{20}c} {v_{n} } \\ {v_{e} } \\ {v_{u} } \\ \end{array} } \right]_{{i^{{({\text{LG}})}} }} = {\mathbf{R}}_{i} {\mathbf{v}}_{i}^{{\left( {\text{ECEF}} \right)}} \\ & = \left[ {\begin{array}{*{20}c} { - { \sin }\phi \;{ \cos }\lambda } & { - { \sin }\phi \;{ \sin }\lambda } & {{ \cos }\phi } \\ { - { \sin }\lambda } & {{ \cos }\lambda } & 0 \\ {{ \cos }\phi \;{ \cos }\lambda } & {{ \cos }\phi \;{ \sin }\lambda } & {{ \sin }\phi } \\ \end{array} } \right]_{i} \left[ {\begin{array}{*{20}c} {v_{x} } \\ {v_{y} } \\ {v_{z} } \\ \end{array} } \right]_{{i^{{({\text{ECEF}})}} }} \\ \end{aligned}
(4)
where ϕ and λ are the spherical latitude and longitude of station i, respectively.
Equation (4) gives the velocity vector of the station i in LG CCS. However, the Euler pole parameters are usually given by spherical latitude $$\varOmega_{\text{lat}}^{p}$$ in degrees, spherical longitude $$\varOmega_{\text{long}}^{p}$$ in degrees and rotation magnitude $$\varOmega^{p}$$ in degrees per million years. Therefore, they should be first converted to ECEF CCS. This conversion can be done using the following equation:
$$\left[ {\begin{array}{*{20}c} {\omega_{x} } \\ {\omega_{y} } \\ {\omega_{z} } \\ \end{array} } \right]^{p} = \frac{{\varOmega^{p} }}{{10^{6} }}\left[ {\begin{array}{*{20}c} {\cos \left( {\varOmega_{\text{lat}}^{p} } \right)\cos \left( {\varOmega_{\text{long}}^{p} } \right)} \\ {\cos \left( {\varOmega_{\text{lat}}^{p} } \right)\sin \left( {\varOmega_{\text{long}}^{p} } \right)} \\ {\sin \left( {\varOmega_{\text{lat}}^{p} } \right)} \\ \end{array} } \right]$$
(5)
Taking this point into account, the covariance matrix of the rotation vector in ECEF CCS is calculated using the covariance matrix of the pole of rotation in the spherical latitude and longitude and the rate of rotation $${\varvec{\Sigma}}_{{{\varvec{\upomega}}^{p} }}$$ using the error propagation law as follows:
$${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }} = {\mathbf{J}}\;{\varvec{\Sigma}}_{{{\varvec{\upomega}}^{p} }} {\mathbf{J}}^{T}$$
(6)
where J is the Jacobian matrix of linearized observations in (5):
\begin{aligned} J & = \left[ {\begin{array}{*{20}c} {\frac{{\partial \omega_{x}^{p} }}{{\partial \varOmega_{\text{lat}}^{p} }}} & {\frac{{\partial \omega_{x}^{p} }}{{\partial \varOmega_{\text{long}}^{p} }}} & {\frac{{\partial \omega_{x}^{p} }}{{\partial \varOmega^{p} }}} \\ {\frac{{\partial \omega_{y}^{p} }}{{\partial \varOmega_{\text{lat}}^{p} }}} & {\frac{{\partial \omega_{y}^{p} }}{{\partial \varOmega_{\text{long}}^{p} }}} & {\frac{{\partial \omega_{y}^{p} }}{{\partial \varOmega^{p} }}} \\ {\frac{{\partial \omega_{z}^{p} }}{{\partial \varOmega_{\text{lat}}^{p} }}} & {\frac{{\partial \omega_{z}^{p} }}{{\partial \varOmega_{\text{long}}^{p} }}} & {\frac{{\partial \omega_{z}^{p} }}{{\partial \varOmega^{p} }}} \\ \end{array} } \right] \\ & = \frac{1}{{10^{6} }}\left[ {\begin{array}{*{20}c} { - \varOmega^{p} \sin (\varOmega_{\text{lat}}^{p} )\cos (\varOmega_{\text{long}}^{p} )} & { - \varOmega^{p} \cos (\varOmega_{\text{lat}}^{p} )\sin (\varOmega_{\text{long}}^{p} )} & {\cos (\varOmega_{\text{lat}}^{p} )\cos (\varOmega_{\text{long}}^{p} )} \\ { - \varOmega^{p} \sin (\varOmega_{\text{lat}}^{p} )\sin (\varOmega_{\text{long}}^{p} )} & {\varOmega^{p} \cos (\varOmega_{\text{lat}}^{p} )\cos (\varOmega_{\text{long}}^{p} )} & {\cos (\varOmega_{\text{lat}}^{p} )\sin (\varOmega_{\text{long}}^{p} )} \\ {\varOmega^{p} \cos (\varOmega_{\text{lat}}^{p} )} & 0 & {\sin (\varOmega_{\text{lat}}^{p} )} \\ \end{array} } \right] \\ \end{aligned}
and $${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }}$$ is the covariance matrix of the Euler pole parameters of the rigid plate p in ECEF CCS. The matrix $${\varvec{\Sigma}}_{{{\varvec{\upomega}}^{p} }}$$ in (6) is assumed to be a diagonal matrix that is defined as:
$$\varSigma_{{\omega^{p} }} = {\text{diag}}(\sigma_{{\omega_{\text{lat}}^{p} }}^{2} ,\;\sigma_{{\omega_{\text{long}}^{p} }}^{2} ,\;\sigma_{{\omega^{p} }}^{2} )$$
In order to calculate the covariance matrix of velocities, we apply the error propagation law to (3):
$${\varvec{\Sigma}}_{{{\mathbf{v}}_{i}^{p} }}^{{\left( {\text{ECEF}} \right)}} = {\mathbf{K}}_{i}^{{\left( {\text{ECEF}} \right)}} {\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }} {\mathbf{K}}_{i}^{{T\left( {\text{ECEF}} \right)}}$$
(7)
where $${\mathbf{K}}_{i}^{{\left( {\text{ECEF}} \right)}}$$ is the Jacobian matrix of linearized observation in (3) in ECEF CCS:
$${\mathbf{K}}_{i}^{{({\text{ECEF}})}} = \left[ {\begin{array}{*{20}c} {\frac{{\partial v_{{x_{i} }}^{p} }}{{\partial \omega_{x}^{p} }}} & {\frac{{\partial v_{{x_{i} }}^{p} }}{{\partial \omega_{y}^{p} }}} & {\frac{{\partial v_{{x_{i} }}^{p} }}{{\partial \omega_{z}^{p} }}} \\ {\frac{{\partial v_{{y_{i} }}^{p} }}{{\partial \omega_{x}^{p} }}} & {\frac{{\partial v_{{y_{i} }}^{p} }}{{\partial \omega_{y}^{p} }}} & {\frac{{\partial v_{{y_{i} }}^{p} }}{{\partial \omega_{z}^{p} }}} \\ {\frac{{\partial v_{{z_{i} }}^{p} }}{{\partial \omega_{x}^{p} }}} & {\frac{{\partial v_{{z_{i} }}^{p} }}{{\partial \omega_{y}^{p} }}} & {\frac{{\partial v_{{z_{i} }}^{p} }}{{\partial \omega_{z}^{p} }}} \\ \end{array} } \right] = \left[ {\begin{array}{*{20}c} 0 & z & { - y} \\ { - z} & 0 & x \\ y & { - x} & 0 \\ \end{array} } \right]_{i}^{{({\text{ECEF}})}}$$
Equation (7) gives the covariance matrix of the velocities in ECEF CCS. To transform this covariance matrix to LG CCS, we can use the rotation matrix Ri introduced in (4), as follows:
$${\varvec{\Sigma}}_{{{\mathbf{v}}_{i}^{p} }}^{{\left( {\text{LG}} \right)}} = {\mathbf{R}}_{i} {\varvec{\Sigma}}_{{{\mathbf{v}}_{i}^{p} }}^{{\left( {\text{ECEF}} \right)}} {\mathbf{R}}_{i}^{T}$$
(8)

Therefore, the covariance matrix of the velocities in the LG CCS is also obtained.

#### Direct Euler pole problem in LG CCS

The LG CCS model is based on ECEF CCS and is used when coordinates of the measuring stations are available in LG CCS. Xi in (2) can be rewritten using the transformation between ECEF CCS and spherical coordinates of stations as:
$${\mathbf{X}}_{i} = r_{e} \left[ {\begin{array}{*{20}c} 0 & {{ \sin }\phi } & { - { \cos }\phi \;{ \sin }\lambda } \\ { - { \sin }\phi } & 0 & {{ \cos }\phi \;{ \cos }\lambda } \\ {{ \cos }\phi \;{ \sin }\lambda } & { - { \cos }\phi \;{ \cos }\lambda } & 0 \\ \end{array} } \right]_{i}$$
(9)
where re is the earth’s radius and ϕ and λ are the spherical latitude and longitude of the station i. The LG CCS velocity $${\mathbf{v}}_{i}^{{\left( {\text{LG}} \right)}}$$ can be calculated from the ECEF CCS velocity $${\mathbf{v}}_{i}^{{\left( {\text{ECEF}} \right)}}$$ using the rotation matrix Ri presented in (4). The velocity vector in LG CCS is given by substituting (2) and (9) into (4):
$${\mathbf{v}}_{i}^{p} = \left[ {\begin{array}{*{20}c} {v_{n} } \\ {v_{e} } \\ {v_{u} } \\ \end{array} } \right]_{{i^{{({\text{LG}})}} }} = r_{e} \left[ {\begin{array}{*{20}c} {{ \sin }\lambda } & { - { \cos }\lambda } & 0 \\ { - { \sin }\phi \;{ \cos }\lambda } & { - { \sin }\phi \;{ \sin }\lambda } & {{ \cos }\phi } \\ 0 & 0 & 0 \\ \end{array} } \right]_{i} \left[ {\begin{array}{*{20}c} {\omega_{x}^{p} } \\ {\omega_{y}^{p} } \\ {\omega_{z}^{p} } \\ \end{array} } \right]$$
(10)
Equation (10) shows clearly that the up-component of the velocity vector is zero. This confirms that the rotation around the Euler pole on a spherical surface does not change the height. Therefore, we can simplify (10) and estimate the horizontal velocities in LG CCS by:
$${\mathbf{v}}_{i}^{p} = \left[ {\begin{array}{*{20}c} {v_{n} } \\ {v_{e} } \\ \end{array} } \right]_{{i^{(LG)} }} = r_{e} \left[ {\begin{array}{*{20}c} {{ \sin }\lambda } & { - { \cos }\lambda } & 0 \\ { - { \sin }\phi \;{ \cos }\lambda } & { - { \sin }\phi \;{ \sin }\lambda } & {{ \cos }\phi } \\ \end{array} } \right]_{i} \left[ {\begin{array}{*{20}c} {\omega_{x}^{p} } \\ {\omega_{y}^{p} } \\ {\omega_{z}^{p} } \\ \end{array} } \right] = {\mathbf{K}}_{i}^{(LG)} \left[ {\begin{array}{*{20}c} {\omega_{x}^{p} } \\ {\omega_{y}^{p} } \\ {\omega_{z}^{p} } \\ \end{array} } \right]$$
(11)
Covariance matrix of horizontal velocities in LG CCS is calculated by applying the error propagation law to (11):
$${\varvec{\Sigma}}_{{{\mathbf{v}}_{i}^{p} }}^{{\left( {\text{LG}} \right)}} = {\mathbf{K}}_{i}^{{\left( {\text{LG}} \right)}} {\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }} {\mathbf{K}}_{i}^{{T\left( {\text{LG}} \right)}}$$
(12)
where $${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }}$$ in (12) is assumed as a diagonal matrix that is defined as:
$${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }} = {\text{diag}}\left( {\sigma_{{\varOmega_{\text{lat}}^{p} }}^{2} ,\;\sigma_{{\varOmega_{\text{long}}^{p} }}^{2} ,\;\sigma_{{\varOmega^{p} }}^{2} } \right)$$

Equation (12) gives covariance matrix of the velocities directly in LG CSS, in which $${\mathbf{K}}_{i}^{{\left( {\text{LG}} \right)}}$$ is the same with the Jacobian matrix of linearized observations in (11).

#### Inverse Euler pole problem in ECEF CCS

We can write the observation equation or velocity vectors for n measuring stations on the same rigid plate p by expanding the scalar form of (2) as follows:
$$\left[ {\begin{array}{*{20}c} {{\mathbf{v}}_{1} } \\ \vdots \\ {{\mathbf{v}}_{n} } \\ \end{array} } \right]_{3n \times 1}^{p} = \left[ {\begin{array}{*{20}c} {{\mathbf{X}}_{1} } \\ \vdots \\ {{\mathbf{X}}_{n} } \\ \end{array} } \right]_{3n \times 3}^{p} \left[ {\begin{array}{*{20}c} {\omega_{x} } \\ {\omega_{y} } \\ {\omega_{z} } \\ \end{array} } \right]_{3 \times 1}^{p}$$
(13)
We can now calculate the rotation vector $${\varvec{\Omega}}^{p} = (\omega_{x}^{p} ,\;\omega_{y}^{p} ,\;\omega_{z}^{p} )^{T}$$ for the rigid plate p using the least-squares method. If we show the observation vector $$({\mathbf{v}}_{1} \; \cdots \;{\mathbf{v}}_{n} )^{T}$$ by L and the design matrix $$({\mathbf{X}}_{1} \; \cdots \;{\mathbf{X}}_{n} )^{T}$$ by A, we have:
$$\begin{gathered} {\varvec{\Omega}}^{p} = \left( {{\mathbf{A}}^{T} {\mathbf{WA}}} \right)^{ - 1} \left( {{\mathbf{A}}^{T} {\mathbf{W}}\;{\mathbf{L}}} \right) \\ = {\mathbf{N}}^{ - 1} \;{\mathbf{A}}^{T} {\mathbf{W}}\;{\mathbf{L}} \\ \end{gathered}$$
(14)
where W is the weight matrix of the observations and N−1 is called the cofactor matrix of unknowns. Assuming the rotation on a sphere, the rotation vector might be defined by the rate of rotation $$|{\varvec{\Omega}}^{p} |$$ (angular velocity) and the pole of rotation (spherical latitude and longitude) as follows:
$$\begin{gathered} \left| {{\varvec{\Omega}}^{p} } \right|\text{ = }\sqrt {(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} + (\omega_{z}^{p} )^{2} } \\ \varOmega_{\text{lat}}^{p} = { \arctan }\left( {\omega_{z}^{p} /\sqrt {(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} } } \right) \\ \varOmega_{\text{long}}^{p} = { \arctan }\left( {\omega_{y}^{p} /\omega_{x}^{p} } \right) \\ \end{gathered}$$
(15)
The accuracy or the standard deviation of the components of the estimated rotation vector $${\varvec{\Omega}}^{p} (\omega_{x}^{p} ,\;\omega_{y}^{p} ,\;\omega_{z}^{p} )$$ is the square root of diagonal elements of the covariance matrix of unknowns $${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }}$$, which is calculated using the a posteriori sigma value $$\hat{\sigma }_{0}$$ and the cofactor matrix of unknowns as follows:
$${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }} = \hat{\sigma }_{0}^{2} \cdot {\mathbf{N}}^{ - 1}$$
(16)
and $$\hat{\sigma }_{0}$$ is calculated as:
$$\hat{\sigma }_{0} = \sqrt {\frac{{{\varvec{\upnu}}_{r}^{T} {\mathbf{W\nu }}_{r} }}{df}}$$
(17)
in which $${\varvec{\upnu}}_{r}$$ is the vector of velocity residuals and df represents the degree of freedom of the equation system. Even though there are three observation equations per velocity vector, the degree of freedom in (17) equals to 2n−3, in which n is the number of measuring stations. This is because the third component of the velocity vector depends on the first two and therefore cannot be taken into account as an independent observation equation. More specifically, the radial component of the velocity corresponding to the vertical velocity on the sphere does not contribute to the solution of the rotation vector. This is clearly shown by (10) for the case of LG CCS (see Sect. 2.2.3 for discussion).
The accuracy of the estimated Euler pole parameters $$\left( {|{\varvec{\Omega}}^{p} |,\;\varOmega_{\text{lat}}^{p} ,\;\varOmega_{\text{long}}^{p} } \right)$$ can be derived by applying the error propagation law to (15):
$${\varvec{\Sigma}}_{{{\varvec{\upomega}}^{p} }} = {\mathbf{G}}\;{\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }} {\mathbf{G}}^{T}$$
(18)
where G is the Jacobian matrix of linearized observation:
$$\begin{gathered} {\mathbf{G}} = \left[ {\begin{array}{*{20}c} {\frac{{\partial {\mid }{\varvec{\Omega}}^{p} {\mid }}}{{\partial \omega_{x}^{p} }}} & {\frac{{\partial {\mid }{\varvec{\Omega}}^{p} {\mid }}}{{\partial \omega_{y}^{p} }}} & {\frac{{\partial {\mid }{\varvec{\Omega}}^{p} {\mid }}}{{\partial \omega_{z}^{p} }}} \\ {\frac{\partial \phi }{{\partial \omega_{x}^{p} }}} & {\frac{\partial \phi }{{\partial \omega_{y}^{p} }}} & {\frac{\partial \phi }{{\partial \omega_{z}^{p} }}} \\ {\frac{\partial \lambda }{{\partial \omega_{x}^{p} }}} & {\frac{\partial \lambda }{{\partial \omega_{y}^{p} }}} & {\frac{\partial \lambda }{{\partial \omega_{z}^{p} }}} \\ \end{array} } \right] \\ = \left[ {\begin{array}{*{20}c} {\frac{{\omega_{x}^{p} }}{{{\mid }{\varvec{\Omega}}^{p} {\mid }}}} & {\frac{{\omega_{y}^{p} }}{{{\mid }{\varvec{\Omega}}^{p} {\mid }}}} & {\frac{{\omega_{z}^{p} }}{{{\mid }{\varvec{\Omega}}^{p} {\mid }}}} \\ { - \frac{1}{{{\mid }{\varvec{\Omega}}^{p} {\mid }^{2} }} \cdot \frac{{\omega_{x}^{p} \omega_{z}^{p} }}{{\sqrt {(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} } }}} & { - \frac{1}{{{\mid }{\varvec{\Omega}}^{p} {\mid }^{2} }} \cdot \frac{{\omega_{y}^{p} \omega_{z}^{p} }}{{\sqrt {(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} } }}} & { - \frac{1}{{{\mid }{\varvec{\Omega}}^{p} {\mid }^{2} }} \cdot \sqrt {(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} } } \\ {\frac{{ - \omega_{y}^{p} }}{{(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} }}} & {\frac{{\omega_{x}^{p} }}{{(\omega_{x}^{p} )^{2} + (\omega_{y}^{p} )^{2} }}} & 0 \\ \end{array} } \right] \\ \end{gathered}$$

Having the covariance matrix of the rotation vector $${\varvec{\Sigma}}_{{{\varvec{\upomega}}^{p} }}$$ from (18), we can calculate the accuracy or the sigma values of the estimated velocities using (7) and (8).

#### Inverse Euler pole problem in LG CCS

In LG CCS, we can write the observation equation for n stations in the same rigid plate by expanding the scalar form of (11), and the least-squares adjustment is continued same as Sect. 2.1.3. Having the covariance matrix of the rotation vector $${\varvec{\Sigma}}_{{{\varvec{\Omega}}^{p} }}$$ from (16), we can obtain the covariance matrix of the estimated Euler pole parameters $${\varvec{\Sigma}}_{{{\varvec{\upomega}}^{p} }}$$ and the estimated velocities using (18) and (11), respectively.

In Sect. 2.1, we presented the mathematical models that are used to solve the direct or the inverse Euler pole problem in detail. However, some principal remarks about the Euler model, its inputs and calculations need to be discussed and clarified more. Therefore, in the rest of this section, we will discuss the effect of the simplification in the Euler model, the consequences of including the vertical component of the velocity vectors and the importance of reducing the size of the normal matrix.

#### Ellipsoid-to-sphere simplification

We approximated the ellipsoidal model of the earth by a spherical model for two reasons: (1) The Euler rotation theorem is defined in the spherical geometry and (2) to simplify our models. This simplification was applied on both the direct and the inverse Euler pole problems. Here, we discuss the amplitude of this simplification mathematically and show that for most of the cases, the difference between an ellipsoidal and a spherical model is negligible.

The relationship between the spherical latitude $$\phi^{\prime}$$ and the geodetic latitude ϕ is obtained by (Curtis 2009, p. 282):
$$\phi^{{\prime }} = { \tan }^{ - 1} \left( {\left( {1 - e^{2} } \right) \cdot { \tan }\phi } \right)$$
(19)
where e is the eccentricity of the ellipse. While according to (19) the spherical and geodetic latitudes are equal at the equator and poles, they have a small difference of $$\phi^{{\prime }} - \phi$$ in between. To find the maximum of this difference, we set the first-order derivative of the equation equal to zero. After simplification we have:
$${ \sin }\phi = \pm \sqrt {\frac{1}{{2 - e^{2} }}}$$
(20)

Equation (20) gives the geodetic latitude of the points where this difference is maximum. This latitude for the WGS84 ellipsoid (with e = 0.081819) equals to $$\phi = \pm 45^{^\circ } 5^{{\prime }}$$, corresponding to maximum difference of 0.1924° (≃21.4 km on the earth’s surface).

Despite the fact that a change in latitude makes a negligible change in velocity, it is very important to consistently use either spherical or geodetic latitude in the inverse Euler pole problem to get consistent results. In other words, the same type of latitude must be used for both the Euler pole and the location of stations. When the Euler pole is estimated in the spherical latitude, however, it is inconsistent with the coordinates of the sites in geodetic latitude. This becomes especially important when the Euler pole is very close to stations. In this situation, the Euler pole may jump to the other side of the stations and therefore makes a theoretical site velocity of the opposite direction than observed. Therefore, to avoid this problem, we can establish two strategies to solve the inverse Euler pole problem:
1. 1.

Use geodetic latitude for the position of stations, and then, transform spherical latitude of the estimated Euler pole to the geodetic latitude.

2. 2.

Use spherical latitude for the position of stations.

In the direct Euler pole problem, however, spherical latitude of the Euler pole must always be used.

#### Simplification of the weight matrix

Correlations between velocity components of different sites are often unavailable or neglected. In this case, it is assumed that velocities of different stations are independent, and based on this assumption, the corresponding covariance values are substituted by zero. This, however, reduces the weight matrix W in (14) to a block diagonal matrix and simplifies the calculation of the normal matrix as:
$${\mathbf{N}} = \mathop \sum \limits_{i = 1}^{n} {\mathbf{A}}_{i}^{T} {\mathbf{W}}_{i} {\mathbf{A}}_{i}$$
(21)
where n is the number of stations and Ai and Wi are the corresponding design and weight matrices of station i, respectively. In the same way, the second part of the least-squares adjustment in (14) and the a posteriori sigma value in (17) are simplified as:
$${\mathbf{A}}^{T} {\mathbf{WL}} = \mathop \sum \limits_{i = 1}^{n} {\mathbf{A}}_{i}^{T} {\mathbf{W}}_{i} {\mathbf{L}}_{i}$$
(22)
$${\varvec{\upnu}}_{r}^{T} {\mathbf{W\nu }}_{r} = \mathop \sum \limits_{i = 1}^{n} {\varvec{\upnu}}_{{r_{i} }}^{T} {\mathbf{W}}_{i} {\varvec{\upnu}}_{{r_{i} }}$$
(23)
where Li and $${\varvec{\upnu}}_{{r_{i} }}$$ are the observation and velocity residuals vectors of station i, respectively. This simplification becomes important since it prevents one from inverting a large normal matrix when the Euler pole is estimated from velocities of a large number of measuring stations.

#### Effect of the vertical component of the velocities

We showed in (10) that the vertical velocities do not contribute to the estimation of the Euler pole parameters. However, this is not true for the a posteriori sigma value $$\hat{\sigma }_{0}$$ obtained from (17). When a full vector of velocity residuals is used, $$\hat{\sigma }_{0}^{2}$$ is increased by $$\mathop \sum \nolimits \nu_{{r_{z} }}^{2} /df$$, and consequently, elements of the covariance matrix of the Euler pole parameters are artificially enlarged. To avoid this effect, the vertical components of the velocity vectors should not be used to calculate the rotation vector. In other words, the vertical components of velocity vectors should be set to zero before they are transformed from LG CSS to ECEF CCS. This is not the case, however, for the inverse Euler pole problem in LG CCS (Sect. 2.1.4).

We tested this concept by transforming a set of velocity vectors of some continuous GPS stations across the North American plate from ECEF CCS to LG CCS, and putting the vertical component of the velocities to zero. Then, we transformed back the velocity vectors to ECEF CCS in order to eliminate the effect of the vertical component of the velocities in the model. Finally, we estimated the Euler pole parameters using both the original and the transformed velocities. The results are shown in Table 1.
Table 1

The estimated Euler pole parameters and their sigma values from the velocity vectors in ECEF CCS (AV: angular velocity)

Data set

Lat. (°)

Long. (°)

AV (°/Myr)

σLat. (°)

σLong. (°)

σOmega (°/Myr)

Original

−6.810

−84.764

0.1856

4.218

1.219

0.0096

Transformed

−6.813

−84.754

0.1855

1.319

0.381

0.0021

The difference between the location of the plate rotation pole and magnitude of the angular velocity is not significant with respect to the corresponding sigma values. As we expected, however, sigma values obtained from the transformed data set are smaller than the corresponding values obtained from the original data set by the factor of ~3.2 for this specific data set.

#### Comparing ECEF CCS and LG CCS

Although the two models are mathematically equivalent, the LG CCS model has the following advantages:
• Ellipsoidal latitudes and horizontal velocities of the stations can be used directly in the model. In other words, the up-component of the velocity vector is already neglected, and therefore, there is no need to get ECEF Cartesian coordinates referring to a spherical reference shape.

• The a posteriori sigma value is overestimated when a full vector of velocity residuals $$(\nu_{{r_{x} }} ,\;\nu_{{r_{y} }} ,\;\nu_{{r_{z} }} )$$ is used in ECEF CCS, as we showed in Sect. 2.2.3.

### Statistical tests

Quality assessment of a model solution is crucial to evaluate the quality of the whole process in the estimation of Euler pole parameters. Therefore, we have implemented four statistical tests, namely χ2 test of goodness of fit, Pearson’s correlation coefficient, Baarda’s data snooping and the τ test. We believe that these tests are the most important ones for our purpose.

#### χ2 test of goodness of fit

The χ2 test is used to test whether a sample of data came from a population with a specific distribution. Since this test is independent of the distribution that is being used, it can be used to test the hypothesis that observations were drawn from a specific theoretical distribution.

#### Pearson’s correlation coefficient

The strength of the relationship between two variables can be explored by trend analysis that is often used in the early stages of a statistical analysis as a preliminary means to test the linear relationship. The analysis is usually limited to a rectilinear trend in the bivariate data, and it is represented by a single parameter called “correlation coefficient.” Pearson’s correlation coefficient is the most common correlation coefficient and is defined as:
$$\rho_{xy} = \mathop \sum \limits_{i = 1}^{n} \left( {x_{i} - \bar{x}} \right)\left( {y_{i} - \bar{y}} \right)/\left( {n - 1} \right)\sigma_{x} \sigma_{y}$$
(24)
where n is the number of xy pairs of data points and $$\sigma_{x}$$ and $$\sigma_{y}$$ are the univariate standard deviations corresponding to x and y.
The significance of the Pearson’s correlation coefficient can be tested by determining the probability of correlation value ρ for a random sample from a population with zero correlation value. The significance of the correlation coefficient is estimated using a t-statistic:
$$t = \rho \sqrt {\left( {n - 2} \right)/(1 - \rho^{2} )}$$
(25)

If the calculated t is higher than the critical t with n−2 degree of freedom and the significance level of 5 %, then the correlation coefficient is significant. This test, however, is only valid when both of the variables have Gaussian distribution with respect to both of the variables (Trauth 2010).

#### Baarda’s data snooping

The cofactor matrix of residuals can be used to statistically detect blunders in the data set. This matrix can be written as (Ghilani 2010):
$${\mathbf{Q}}_{vv} = {\mathbf{W}}^{ - 1} - {\mathbf{AQ}}_{xx} {\mathbf{A}}^{T}$$
(26)
where W is the weight matrix of observations, A is the design matrix of the adjustment, and Qxx is the cofactor matrix of unknowns that is obtained from the adjustment. From this, the standard residuals are computed from the appropriate diagonal elements of the Qvv as:
$$\bar{\nu }_{i} = \frac{{\nu_{i} }}{{\sqrt {q_{ii} } }}$$
(27)
where $$\bar{\nu }_{i}$$ is the standardized residual, vi is the computed residual from the adjustment, and qii is the diagonal element of the Qvv. Using Qvv, the standard deviation of the residual is $$\sigma_{0} \sqrt {q_{ii} }$$, where σ0 is the a priori sigma value. If a residual differs significantly from zero, the corresponding observation can be considered as a blunder. Therefore, as suggested by BaardaW (1968), the test statistic for testing this hypothesis is defined by multiplying the denominator of (27) by σ0 as follows:
$$t_{i} = \frac{{\nu_{i} }}{{\sigma_{0} .\sqrt {q_{ii} } }} = \frac{{\nu_{i} }}{{\sigma_{{\nu_{i} }} }} = \frac{{\bar{\nu }_{i} }}{{\sigma_{0} }}$$
(28)
Thus, we can test all the residuals by defining a rejection level given by a two-tailed Student’s t test with r−1 degrees of freedom as:
$$\frac{{\left| {\nu_{i} } \right|}}{{\sigma_{0} .\sqrt {q_{ii} } }} > t_{\alpha /2} \left( r \right)$$
(29)
where r is the total number of the redundant observations in the system. The observation with the largest absolute value of ti as given by (28) is rejected when it is greater than the rejection level $$t_{\alpha /2} \left( r \right)$$. It is worth mentioning that a proper relative weighting of observations and a good knowledge of the a priori sigma value has a key role in this form of blunder detection, and it is important to choose weights that reflect observational errors.

#### The tau test

In Baarda’s data snooping, the observational precision or the variance factor $$\sigma_{0}^{2}$$ should be known, which means all the variances are proportionally scaled (Kuang 1996). On the other hand, the ratio in (28) has a t-distribution only if the distribution of the numerator (normal) and the denominator (chi-squared) are stochastically independent (Leick 2004). Therefore, when $$\sigma_{0}^{2}$$ is not adequately known or when the emphasis is not on the a priori error estimates, the a posteriori estimation of the variance factor $$\hat{\sigma }_{0}^{2}$$ is used. In this case, Pope (1976) shows that (28) is instead another test statistic called τ (tau) and is defined as:
$$\tau_{i} = \frac{{\nu_{i} }}{{\hat{\sigma }_{0} \cdot \sqrt {q_{ii} } }} = \frac{{\nu_{i} }}{{\hat{\sigma }_{{\nu_{i} }} }} = \frac{{\bar{\nu }_{i} }}{{\hat{\sigma }_{0} }}$$
(30)
whose critical value $$\tau_{\alpha /2}$$ can be calculated from the Student’s t-distribution as:
$$\tau_{\alpha /2} (r) = \frac{{t_{\alpha /2} (r - 1) \cdot \sqrt r }}{{\sqrt {r - 1 + t_{\alpha /2}^{2} (r - 1)} }}$$
(31)
Using (28) and the τ criterion, observations are flagged for further investigation and possibly rejection when:
$$\frac{{\left| {\bar{\nu }_{i} } \right|}}{{\hat{\sigma }_{0} }} > \tau_{\alpha /2}$$
(32)

This test is applied successively to all standardized residuals same as those used in the Baarda’s data snooping procedure. It is worth mentioning that when the degree of freedom r increases, t and τ distributions give closer critical values, and when r tends to infinite, both of them approach to the normal distribution (Kuang 1996; Leick 2004).

## The software functionality

Based on mathematical models and statistical tests introduced in Sect. 2, we developed the EPC software using the MATLAB programming language with a Graphical User Interface (GUI). This choice makes the software cross-platform, and therefore, EPC can be run under the majority of operating systems, namely Windows, Macintosh and Unix/Linux. Since EPC has a GUI, an X-Window environment should also be installed on UNIX-like operating systems, and MATLAB should be started with the Java Virtual Machine (JVM) enabled. EPC requires the basic MATLAB and the following toolboxes: Statistics and Mapping.

EPC is available as an open source software program (Weber 2004) under the BSD license (www.opensource.org/licenses/bsd-license.php). The source code can be downloaded from the software home page at http://sourceforge.net/projects/epcalc/ and also on the GPS Toolbox Web site: http://www.ngs.noaa.gov/gps-toolbox. The EPC software includes a set of MATLAB functions (m-files), GUIs (fig-files), map data files (mat-files) and user’s manual as well as a separate folder for some sample input files. To run the software, add the software folder to the MATLAB search path and type epc in the MATLAB command prompt. Figure 1 shows the main window of the software.

Based on the mathematical models explained in Sect. 2.1, EPC accepts input files in two ASCII text formats: ECEF X, Y, Z and NEU. In the former format, data are stored in 13 space-separated columns, including station name (column one), coordinates of the station in the X-, Y- and Z-directions in ECEF CCS in meters (columns 2–4), associated velocities to the station in the X-, Y- and Z-directions in meters per year (columns 5–7) and their corresponding velocity errors (one sigma) in meters per year (columns 8–10) as well as the correlations between velocity components (X–Y, X–Z and Y–Z) (columns 11–13). In the latter format, data are stored in eight space-separated columns, including station name (columns 1), coordinates of the station in LG CCS in decimal degrees (columns 2–3), associated velocities to the station in north and east directions in meters per year (columns 4–5) and the corresponding velocity errors (one sigma) in meters per year (columns 6–7) as well as the correlation between the two velocity components (column 8). Except for the names of the stations, all the data for the former format must be in ECEF CCS, and for the latter format in LG CCS.

Data files in the proper format are opened and shown in the “Input data” table (Fig. 1). In either of the input formats, the software does not accept non-real values such as empty fields for the station coordinates and velocities, but this is acceptable for sigma values. Missed sigma values are substituted by “Not a Number (NaN).” However, depending on the nature of the problem (direct or inverse), they might not be necessary to calculate unknown parameters. In the direct Euler pole problem, for example, the associated sigma values for the estimated velocity vectors are calculated from the sigma values of Euler pole parameters based on the error propagation law (7) and (12). Nevertheless, when sigma values are necessary for calculations, for example, in the inverse Euler pole problem to form the weight matrix for estimating Euler parameters in the least-squares adjustment (14), they are substituted with the identity matrix. The software does not accept NaNs and real values at the same time.

In the direct Euler pole problem, the user should enter Euler pole parameters and their associated sigma values. Then, velocity vectors and velocity residuals along with the estimated velocity errors are calculated according to (3) or (11), and (7) or (12), depending on the coordinate system of the input data. In the inverse Euler pole problem, Euler pole parameters and the corresponding covariance matrix are estimated from (15) and (18) based on the coordinate system of the input data without user intervention. Furthermore, the degree of freedom, a posteriori sigma and the RMSE value are calculated in the inverse Euler pole problem.

We implemented four statistical tests explained in Sect. 2.3 to evaluate the quality of the solution in the Euler pole or velocity vector estimation. The χ2 test is used to test the null hypothesis that the velocity residuals are a random sample that can be described by a Gaussian distribution with a typical central value and a random dispersion around it. The null hypothesis is tested against the alternative hypothesis that the velocity residuals are not normally distributed with the estimated mean and variance. In the software, the velocity residuals in the east and north directions are separately tested at the 5 % significance level, and the result is reported along with the probability of observing the given statistic or one more extreme under the assumption of the null hypothesis (the p value), the chi-square statistic and the degree of freedom.

The Pearson’s correlation coefficient is used to give a rough estimate of the rectilinear trend in the results in the form of a scatter plot as well as numerical values. The observed velocities from the input data file are first plotted against the modeled velocities. This scatter plot visualizes the existing trend in the data set and shows the consistency of the results. Since the Pearson’s correlation coefficient is very sensitive to disturbances, it helps to detect outliers in the data set. Then, the correlation coefficients in the east and north directions are separately calculated. The significance of the correlation coefficient is tested afterward at 5 % significance level using the Student’s t test. If the calculated t is higher than the critical t, the correlation coefficient is significant.

Baarda’s data snooping is very well suited to find individual blunders in the input data set. In other words, it can be used to exclude sites containing gross errors in their velocities. For two reasons, observations that are detected as blunders should not be all removed in one step: (1) The existence of any blunder in the data set will affect the remaining observations, and (2) the rejection level in (28) depends on σ0 (Ghilani 2010). In other words, because of the nature of the least-squares adjustment method that tries to distribute blunders, several correct observations may get large residuals and be flagged by mistake (type I error) (Leick 2004). Therefore, it is recommended to eliminate only the larger blunder from the list of observations.

Blunders are eliminated in the tau test with the same method of the Baarda’s data snooping. That is, in every run of the test, only one single observation corresponding to the largest standardized residuals which was flagged as an outlier or blunder using (32) is eliminated, and the adjustment is rerun. This procedure is continued until no further observation is detected as an outlier. Then, the rejected observations are reentered into the adjustment one at a time to control if they are again detected as blunders. If an observation is detected as a blunder for the second time, it is discarded from the data set (Ghilani 2010).

Location of stations and their names from the input file, as well as the estimated velocity vectors, velocity residuals and the Euler pole can be visualized in the map canvas of the software (Fig. 1). This helps users to have a brief overview of the input and output data. Furthermore, because of the small size of the map canvas and the need to have the exact numerical values, the estimated parameters can be saved in the comma-separated values (csv), ESRI shape file (shp) and Google Keyhole Markup Language (kml) file formats. This makes the further numerical or visual analysis of the outputs very easy.

## Notes

### Acknowledgments

We included two functions of the geodetic toolbox developed by Mike Craymer in our software in order to reduce the number of the MATLAB toolboxes that are necessary to run the software.

### References

1. Argus DF, Gordon RG (1991) No-net-rotation model of current plate velocities incorporating plate motion model NUVEL-1. Geophys Res Lett 18(11):2039–2042
2. Baarda W (1968) A testing procedure for use in geodetic networks. Publication on Geodesy, New Series, 2(5), Netherlands Geodetic CommissionGoogle Scholar
3. Cannavò F, Palano M (2011) PlatEMotion: a Matlab tool for geodetic reference frame definition. Rapporti Tecnici INVG 201:1–13Google Scholar
4. Chase CG (1972) The N plate problem of plate tectonics. Geophys J Int 29(2):117–122
5. Curtis HD (2009) Orbital mechanics for engineering students, 2nd edn. Butterworth-Heinemann, LondonGoogle Scholar
6. DeMets C, Gordon RG, Argus DF, Stein S (1990) Current plate motions. Geophys J Int 101(2):425–478
7. DeMets C, Gordon RG, Argus DF (2010) Geologically current plate motions. Geophys J Int 181(1):1–80
8. Ghilani CD (2010) Adjustment computations: spatial data analysis. Wiley, Hoboken
9. Hill EM, Blewitt G (2006) Testing for fault activity at Yucca Mountain, Nevada, using independent GPS results from the BARGEN network. Geophys Res Lett 33(14):L14302
10. Kuang S (1996) Geodetic network analysis and optimal design: concepts and applications. Ann Arbor Press, ChelseaGoogle Scholar
11. Leick A (2004) GPS Satellite surveying, 3rd edn. Wiley, HobokenGoogle Scholar
12. Liu S, Trenkler G (2008) Hadamard, Khatri-Rao, Kronecker and other matrix products. Int J Inf Syst Sci 4(1):160–177Google Scholar
13. Lowrie W (2007) Fundamentals of geophysics. Cambridge University Press, New York
14. Minster JB, Jordan TH (1978) Present-day plate motions. J Geophys Res 83(11):5331
15. Pope AJ (1976) The statistics of residuals and the detection of outliers. NOAA TRNOS 65 NGS 1, NOAA, Rockville, MDGoogle Scholar
16. Qiang Z, Wenyao Z, Yongqin X (1999) Global plate motion models incorporating the velocity. Geophys Res Lett 26(18):2813–2816
17. Trauth MH (2010) MATLAB recipes for earth sciences. Springer, Berlin
18. Weber S (2004) The success of open source. Harvard University Press, CambridgeGoogle Scholar