The Python based solid Earth tides (PySolid) is a thin Python wrapper of the solid.for program (by Dennis Milbert based on dehanttideinelMJD.f from V. Dehant, S. Mathews, J. Gipson and C. Bruyninx) to calculate solid Earth tides in east/north/up direction (section 7.1.2 in the 2003 IERS Conventions). Solid Earth tides introduces very long spatial wavelength range components in SAR/InSAR observations, as shown in the Sentinel-1 data with regular acquisitions and large swaths (Fattahi et al., 2020).
This is research code provided to you "as is" with NO WARRANTIES OF CORRECTNESS. Use at your own risk.
PySolid requires compilation of its underlying Fortran code.
Run the following to install the pre-compiled version. This works for macOS/Linux only. To update to the latest development version, use pip install --upgrade.
pip install git+https://github.com/insarlab/PySolid.gitOr you could download the source code and compile it yourself. Below is an example using conda.
# download source code
cd ~/tools
git clone https://github.com/insarlab/PySolid.git
# install dependencies via conda
conda config --add channels conda-forge
conda install --file PySolid/requirements.txt
# compile Fortran code into a Python interface using f2py to generate:
# solid.cpython-37m-darwin.so for macOS
# solid.cpython-37m-x86_64-linux-gnu.so for Linux
cd ~/tools/PySolid/pysolid
f2py -c -m solid solid.forSet the following environment variables in your source file (e.g. ~/.bash_profile for bash users or ~/.cshrc for csh/tcsh users).
export PYTHONPATH=${PYTHONPATH}:~/tools/PySolidRun the following to test the installation:
python -c "import pysolid; print(pysolid.__version__)"PySolid could compute solid Earth tides in two modes: point and grid. Both modes produce displacement in east, north and up direction.
- Point mode: compute 1D tides time-series at a specific point for a given time period
- Grid mode: compute 2D tides grid at a specific time for a given spatial grid
2.1 Point mode [nbviewer]
import datetime as dt
import pysolid
# prepare inputs
lat, lon = 34.0, -118.0 # point of interest in degree, Los Angles, CA
step_sec = 60 * 5 # sample spacing in time domain in seconds
dt0 = dt.datetime(2020,1,1,4,0,0) # start date and time
dt1 = dt.datetime(2021,1,1,2,0,0) # end date and time
# compute SET via pysolid
dt_out, tide_e, tide_n, tide_u = pysolid.calc_solid_earth_tides_point(lat, lon, dt0, dt1, step_sec=step_sec, display=False, verbose=False)
# plot the power spectral density of SET up component
pysolid.plot_power_spectral_density4tides(tide_u, sample_spacing=step_sec)2.2 Grid mode [nbviewer]
import numpy as np
import pysolid
# prepare inputs
date_str = '20201225'
atr = {
'LENGTH' : 500, # number of rows
'WIDTH' : 450, # number of columns
'X_FIRST': -126, # min longitude in degree (upper left corner of the upper left pixel)
'Y_FIRST': 43, # max laitude in degree (upper left corner of the upper left pixel)
'X_STEP' : 0.000925926 * 30, # output resolution in degree
'Y_STEP' : -0.000925926 * 30, # output resolution in degree
'CENTER_LINE_UTC': 50864.0, # UTC time of interest in seconds, e.g. acquisition time at the middle of SAR image
}
# compute SET via pysolid
tide_e, tide_n, tide_u) = pysolid.calc_solid_earth_tides_grid(date_str, atr, display=False, verbose=True)
# project SET from ENU to radar line-of-sight (LOS) direction with positive for motion towards satellite
inc_angle = 34.0 / 180. * np.pi # radian, typical value for Sentinel-1
head_angle = -168.0 / 180. * np.pi # radian, typical value for Sentinel-1 desc track
tide_los = ( tide_e * np.sin(inc_angle) * np.cos(head_angle) * -1
+ tide_n * np.sin(inc_angle) * np.sin(head_angle)
+ tide_u * np.cos(inc_angle))- Milbert, D., SOLID EARTH TIDE, http://geodesyworld.github.io/SOFTS/solid.htm, Accessd 2020 September 6.
- Fattahi, H., Z. Yunjun, X. Pi, P. S. Agram, P. Rosen, and Y. Aoki (2020), Absolute geolocation of SAR Big-Data: The first step for operational InSAR time-series analysis, AGU Fall Meeting 2020, 1-17 Dec 2020.
- McCarthy, D. D., and G. Petit (2004), IERS conventions (2003) (IERS Technical Note No. 32), 127 pp, International Earth Rotation And Reference Systems Service (IERS), Frankfurt, Germany.
- Petit, G., and B. Luzum (2010), IERS Conventions (2010) (IERS Technical Note No. 36) 179 pp., International Earth Rotation And Reference Systems Service (IERS), Frankfurt, Germany. [Code].


