class NodalDoublesSurface extends DoublesSurface {

  @Override
  public Double getZValue(final Double x, final Double y) {
    Validate.notNull(x, "x");
    Validate.notNull(y, "y");
    final double[] xArray = getXDataAsPrimitive();
    final double[] yArray = getYDataAsPrimitive();
    final int n = size();
    for (int i = 0; i < n; i++) {
      if (Double.doubleToLongBits(xArray[i]) == Double.doubleToLongBits(x)) {
        if (Double.doubleToLongBits(yArray[i]) == Double.doubleToLongBits(y)) {
          return getZDataAsPrimitive()[i];
        }
      }
    }
    throw new IllegalArgumentException("No x-y data in surface for (" + x + ", " + y + ")");
  }

  public  NodalDoublesSurface(final double[] xData, final double[] yData, final double[] zData);
  public  NodalDoublesSurface(final Double[] xData, final Double[] yData, final Double[] zData);
  public  NodalDoublesSurface(final List<Double> xData, final List<Double> yData, final List<Double> zData);
  public  NodalDoublesSurface(final DoublesPair[] xyData, final double[] zData);
  public  NodalDoublesSurface(final DoublesPair[] xyData, final Double[] zData);
  public  NodalDoublesSurface(final List<DoublesPair> xyData, final List<Double> zData);
  public  NodalDoublesSurface(final Map<DoublesPair, Double> xyzData);
  public  NodalDoublesSurface(final List<Triple<Double, Double, Double>> xyzData);
  public  NodalDoublesSurface(final double[] xData, final double[] yData, final double[] zData, final String name);
  public  NodalDoublesSurface(final Double[] xData, final Double[] yData, final Double[] zData, final String name);
  public  NodalDoublesSurface(final List<Double> xData, final List<Double> yData, final List<Double> zData, final String name);
  public  NodalDoublesSurface(final DoublesPair[] xyData, final double[] zData, final String name);
  public  NodalDoublesSurface(final DoublesPair[] xyData, final Double[] zData, final String name);
  public  NodalDoublesSurface(final List<DoublesPair> xyData, final List<Double> zData, final String name);
  public  NodalDoublesSurface(final Map<DoublesPair, Double> xyzData, final String name);
  public  NodalDoublesSurface(final List<Triple<Double, Double, Double>> xyzData, final String name);

}