EFH2IaTable.java [src/java/m/efh2] Revision:   Date:
package m.efh2;

import java.util.Map;
import java.util.TreeMap;

/**
 * lookup table: Initial abstraction (Ia) values for various curve numbers.
 */
public class EFH2IaTable {

    // NOTE: This is a literal implementation of the Ia lookup table,
    // Table2-4, from Engineering Field Handbook, ch 2 (EFH2)
    //
    private static final Map<Integer, Double> IaMap;


    static {
        IaMap = new TreeMap<>();
        IaMap.put(40, 3.000);
        IaMap.put(41, 2.878);
        IaMap.put(42, 2.762);
        IaMap.put(43, 2.651);
        IaMap.put(44, 2.545);
        IaMap.put(45, 2.444);
        IaMap.put(46, 2.348);
        IaMap.put(47, 2.255);
        IaMap.put(48, 2.167);
        IaMap.put(49, 2.082);
        IaMap.put(50, 2.000);
        IaMap.put(51, 1.922);
        IaMap.put(52, 1.846);
        IaMap.put(53, 1.774);
        IaMap.put(54, 1.704);
        IaMap.put(55, 1.636);
        IaMap.put(56, 1.571);
        IaMap.put(57, 1.509);
        IaMap.put(58, 1.448);
        IaMap.put(59, 1.390);
        IaMap.put(60, 1.333);
        IaMap.put(61, 1.279);
        IaMap.put(62, 1.226);
        IaMap.put(63, 1.175);
        IaMap.put(64, 1.125);
        IaMap.put(65, 1.077);
        IaMap.put(66, 1.030);
        IaMap.put(67, 0.985);
        IaMap.put(68, 0.941);
        IaMap.put(69, 0.899);
        IaMap.put(70, 0.857);
        IaMap.put(71, 0.817);
        IaMap.put(72, 0.778);
        IaMap.put(73, 0.740);
        IaMap.put(74, 0.703);
        IaMap.put(75, 0.667);
        IaMap.put(76, 0.632);
        IaMap.put(77, 0.597);
        IaMap.put(78, 0.564);
        IaMap.put(79, 0.532);
        IaMap.put(80, 0.500);
        IaMap.put(81, 0.469);
        IaMap.put(82, 0.439);
        IaMap.put(83, 0.410);
        IaMap.put(84, 0.381);
        IaMap.put(85, 0.353);
        IaMap.put(86, 0.326);
        IaMap.put(87, 0.299);
        IaMap.put(88, 0.273);
        IaMap.put(89, 0.247);
        IaMap.put(90, 0.222);
        IaMap.put(91, 0.198);
        IaMap.put(92, 0.174);
        IaMap.put(93, 0.151);
        IaMap.put(94, 0.128);
        IaMap.put(95, 0.105);
    }

    /**
     * constructor is private - use the static methods
     */
    private EFH2IaTable() {
    }

    /**
     * lookup Ia for the given runoff curve number
     *
     * @param runoffCN curve number, 40 <= CN <= 95
     * @return initial abstraction, inches
     */
    public static double lookupIa(int runoffCN) {
        if (runoffCN < 40 || runoffCN > 95) {
            throw new IllegalArgumentException("RunoffCN must be >= 40 and <= 95");
        }
        return IaMap.get(runoffCN);
    }
}