docs: def _get_shallow_site_response_term(self, C, vs30, pga_rock):
          """
          Returns the shallow site response term defined in equations 17, 18 and
          19
          """
          vs_mod = vs30 / C["k1"]
          # Get linear global site response term
          f_site_g = C["c11"] * np.log(vs_mod)
          idx = vs30 > C["k1"]
          f_site_g[idx] = f_site_g[idx] + (C["k2"] * self.CONSTS["n"] *
                                           np.log(vs_mod[idx]))
  
          # Get nonlinear site response term
          idx = np.logical_not(idx)
          if np.any(idx):
              f_site_g[idx] = f_site_g[idx] + C["k2"] * (
                  np.log(pga_rock[idx] +
                         self.CONSTS["c"] * (vs_mod[idx] ** self.CONSTS["n"])) -
                  np.log(pga_rock[idx] + self.CONSTS["c"])
                  )
  
          # For Japan sites (SJ = 1) further scaling is needed (equation 19)
          if self.CONSTS["SJ"]:
              fsite_j = np.log(vs_mod)
              idx = vs30 > 200.0
              if np.any(idx):
                  fsite_j[idx] = (C["c13"] + C["k2"] * self.CONSTS["n"]) *\
                      fsite_j[idx]
              idx = np.logical_not(idx)
              if np.any(idx):
                  fsite_j[idx] = (C["c12"] + C["k2"] * self.CONSTS["n"]) *\
                      (fsite_j[idx] - np.log(200.0 / C["k1"]))
  
              return f_site_g + fsite_j
          else:
              return f_site_g