code: def _get_bnl(self, C_AMP, vs30):
          
          # Default case 8d
          bnl = np.zeros_like(vs30)
          if np.all(vs30 >= self.CONSTS["Vref"]):
              return bnl
          # Case 8a
          bnl[vs30 < self.CONSTS["v1"]] = C_AMP["b1sa"]
          # Cade 8b
          idx = np.logical_and(vs30 > self.CONSTS["v1"],
                               vs30 <= self.CONSTS["v2"])
  
          if np.any(idx):
              bnl[idx] = (C_AMP["b1sa"] - C_AMP["b2sa"]) *\
                  (np.log(vs30[idx] / self.CONSTS["v2"]) /
                   np.log(self.CONSTS["v1"] / self.CONSTS["v2"])) + C_AMP["b2sa"]
          # Case 8c
          idx = np.logical_and(vs30 > self.CONSTS["v2"],
                               vs30 < self.CONSTS["Vref"])
          if np.any(idx):
              bnl[idx] = C_AMP["b2sa"] *\
                  np.log(vs30[idx] / self.CONSTS["Vref"]) /\
                  np.log(self.CONSTS["v2"] / self.CONSTS["Vref"])
          return bnl
docs: Gets the nonlinear term, given by equation 8 of Atkinson & Boore 2006