code: def calc_strain_tf(self, lin, lout):
          
          # FIXME: Correct discussion for using acceleration FAS
          # Strain(angFreq, z=h_m/2)
          # ------------------------ =
          #    accel_n(angFreq)
          #
          #          i k*_m [ A_m exp(i k*_m h_m / 2) - B_m exp(-i k*_m h_m / 2)]
          #          ------------------------------------------------------------
          #                         -angFreq^2 (2 * A_n)
          #
          assert lout.wave_field == WaveField.within
  
          ang_freqs = self.motion.angular_freqs
          # The numerator cannot be computed using wave_at_location() because
          # it is A - B.
          cterm = 1j * self._wave_nums[lout.index, :] * lout.depth_within
          numer = (1j * self._wave_nums[lout.index, :] *
                   (self._waves_a[lout.index, :] * np.exp(cterm) -
                    self._waves_b[lout.index, :] * np.exp(-cterm)))
          denom = -ang_freqs ** 2 * self.wave_at_location(lin)
  
          # Only compute transfer function for non-zero frequencies
          mask = ~np.isclose(ang_freqs, 0)
          tf = np.zeros_like(mask, dtype=np.complex)
          # Scale into units from gravity
          tf[mask] = GRAVITY * numer[mask] / denom[mask]
  
          return tf
docs: Compute the strain transfer function from `lout` to
          `location_in`.
  
          The strain transfer function from the acceleration at layer `n`
          (outcrop) to the mid-height of layer `m` (within) is defined as
  
          Parameters
          ----------
          lin : :class:`~site.Location`
              Location of input
          lout : :class:`~site.Location`
              Location of output. Note that this would typically be midheight
              of the layer.
  
          Returns
          -------
          strain_tf : :class:`numpy.ndarray`
              Transfer function to be applied to an acceleration FAS.