class HyperbolicMeshing extends MeshingFunction {

  @Override
  public Double evaluate(Integer i) {
    Validate.isTrue(i >= 0 && i < getNumberOfPoints(), "i out of range");
    if (i == 0) {
      return _l;
    }
    if (i == getNumberOfPoints() - 1) {
      return _r;
    }

    //short cut if required point is one of the specified fixed points 
    if (_fpValues != null) {
      int index = _um.getFixedPointIndex(i);
      if (index >= 0) {
        return _fpValues[index];
      }
    }

    final double z = _um.evaluate(i);
    return _alpha + _beta * Math.sinh(_gamma * z + _delta);
  }

  public  HyperbolicMeshing(final double xMin, final double xMax, final double xCent, final int nPoints, final double beta);
  public  HyperbolicMeshing(final double xMin, final double xMax, final double xCent, final int nPoints, final double beta, final double[] fixedPoints);

}