Function as.4vel() takes a three-velocity and returns a
  four-velocity.
Given a four-vector \(V\), function inner4() returns the
  Lorentz invariant \(V^iV_i=\eta_{ij}V^iV^j\).  This
  quantity is unchanged under Lorentz transforms.  Note that function
  inner4() works for any four-vector, not just four-velocities.
  It will work for (eg) a four-displacement, a four-momentum vector or a
  four-frequency.  In electromagnetism, we could have a four-current or
  a four-potential.  If \(U\) is a four-velocity, then
  \(U^iU_i=-c^2\); if \(U\) is a 4-displacement, then \(U^iU_i\) is
  the squared interval.  If \(P\) is the four-momentum of a photon
  then \(P^iP_i=0\).
Function to3() is a low-level helper function used when
  as.3vel() is given a four-velocity.
Function is.consistent.4vel() checks for four-velocities being
  consistent in the sense that \(U^iU_i=-c^2\).  Giving this
  function a vector, for example, is.consistent.4vel(1:5), will
  return an error.
  
Compare the functions documented here with boost(), which
  returns a \(4\times 4\) transformation matrix (which also
  includes rotation information).