@Override
  public double pTurningR(double rayParameter) {
    for (int i = structure.getNzone() - 1; 0 <= i; i--) {
      double vpA = structure.getVpA(i);
      double vpB = structure.getVpB(i);
      double r = Math.pow(1 / (vpA * rayParameter), 1 / (vpB - 1));
      // System.out.println(i+" "+structure.getBoundary(i)+" "+r+" "+structure.getBoundary(i+1));

      if (structure.getBoundary(i) <= r && r < structure.getBoundary(i + 1)) return r;
    }
    return -1;
  }
  /*
   * (non-Javadoc)
   *
   * @see traveltime.manhattan.VelocityStructure#shTurningR(double)
   */
  @Override
  public double shTurningR(double rayParameter) {
    // System.out.println(rayParameter);
    for (int i = structure.getNzone() - 1; 0 <= i; i--) {
      double vsA = structure.getVsA(i);
      double vsB = structure.getVsB(i);
      double r = Math.pow(1 / (vsA * rayParameter), 1 / (vsB - 1));
      //			System.out.println(i + " " + structure.getBoundary(i) + " "
      //					+ structure.getBoundary(i + 1) + " " + r);
      if (structure.getBoundary(i) <= r && r <= structure.getBoundary(i + 1)) return r;
    }

    return -1;
  }
 @Override
 public double innerCoreBoundary() {
   return structure.getInnerCoreBoundary();
 }
 @Override
 public double getL(double r) {
   double vs = structure.getVs(r);
   return vs * vs * getRho(r);
 }
 @Override
 public double getA(double r) {
   double v = structure.getVp(r);
   return v * v * getRho(r);
 }
 public static NamedDiscontinuityStructure prem() {
   NamedDiscontinuityStructure nd = new NamedDiscontinuityStructure();
   nd.structure = manhattan.template.NamedDiscontinuityStructure.prem();
   return nd;
 }
 @Override
 public double getRho(double r) {
   return structure.getRho(r);
 }
 @Override
 public double earthRadius() {
   return structure.getBoundary(structure.getNzone());
 }
 @Override
 public double coreMantleBoundary() {
   return structure.getCoreMantleBoundary();
 }