org.jgrasstools.hortonmachine.modules.hydrogeomorphology.etp.OmsPresteyTaylorEtpModel.java Source code

Java tutorial

Introduction

Here is the source code for org.jgrasstools.hortonmachine.modules.hydrogeomorphology.etp.OmsPresteyTaylorEtpModel.java

Source

/*
 * This file is part of JGrasstools (http://www.jgrasstools.org)
 * (C) HydroloGIS - www.hydrologis.com 
 * 
 * JGrasstools is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.jgrasstools.hortonmachine.modules.hydrogeomorphology.etp;

import static org.jgrasstools.gears.libs.modules.JGTConstants.isNovalue;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_AUTHORCONTACTS;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_AUTHORNAMES;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_KEYWORDS;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_LABEL;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_LICENSE;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_NAME;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_STATUS;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_UI;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_defaultPressure_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_defaultTemp_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_doHourly_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_inNetradiation_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_inPressure_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_inTemp_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_outPTEtp_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_pAlpha_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_pDailyDefaultNetradiation_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_pGmorn_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_pGnight_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_pHourlyDefaultNetradiation_DESCRIPTION;
import static org.jgrasstools.hortonmachine.i18n.HortonMessages.OMSPRESTEYTAYLORETPMODEL_time_DESCRIPTION;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

import oms3.annotations.Author;
import oms3.annotations.Description;
import oms3.annotations.Execute;
import oms3.annotations.In;
import oms3.annotations.Keywords;
import oms3.annotations.Label;
import oms3.annotations.License;
import oms3.annotations.Name;
import oms3.annotations.Out;
import oms3.annotations.Status;
import oms3.annotations.UI;
import oms3.annotations.Unit;

import org.jgrasstools.gears.libs.modules.JGTConstants;
import org.jgrasstools.gears.libs.modules.JGTModel;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormatter;

@Description(OMSPRESTEYTAYLORETPMODEL_DESCRIPTION)
@Author(name = OMSPRESTEYTAYLORETPMODEL_AUTHORNAMES, contact = OMSPRESTEYTAYLORETPMODEL_AUTHORCONTACTS)
@Keywords(OMSPRESTEYTAYLORETPMODEL_KEYWORDS)
@Label(OMSPRESTEYTAYLORETPMODEL_LABEL)
@Name(OMSPRESTEYTAYLORETPMODEL_NAME)
@Status(OMSPRESTEYTAYLORETPMODEL_STATUS)
@License(OMSPRESTEYTAYLORETPMODEL_LICENSE)
@UI(OMSPRESTEYTAYLORETPMODEL_UI)
public class OmsPresteyTaylorEtpModel extends JGTModel {

    @Description(OMSPRESTEYTAYLORETPMODEL_inNetradiation_DESCRIPTION)
    @In
    @Unit("Watt m-2 ")
    public HashMap<Integer, double[]> inNetradiation;

    @Description(OMSPRESTEYTAYLORETPMODEL_pDailyDefaultNetradiation_DESCRIPTION)
    @In
    @Unit("Watt m-2")
    public double defaultDailyNetradiation = 300.0;

    @Description(OMSPRESTEYTAYLORETPMODEL_pHourlyDefaultNetradiation_DESCRIPTION)
    @In
    @Unit("Watt m-2")
    public double defaultHourlyNetradiation = 100.0;

    @Description(OMSPRESTEYTAYLORETPMODEL_doHourly_DESCRIPTION)
    @In
    public boolean doHourly;

    @Description(OMSPRESTEYTAYLORETPMODEL_inTemp_DESCRIPTION)
    @In
    @Unit("C")
    public HashMap<Integer, double[]> inTemp;

    @Description(OMSPRESTEYTAYLORETPMODEL_pAlpha_DESCRIPTION)
    @In
    @Unit("m")
    public double pAlpha = 0;

    @Description(OMSPRESTEYTAYLORETPMODEL_pGmorn_DESCRIPTION)
    @In
    public double pGmorn = 0;

    @Description(OMSPRESTEYTAYLORETPMODEL_pGnight_DESCRIPTION)
    @In
    public double pGnight = 0;

    @Description(OMSPRESTEYTAYLORETPMODEL_defaultTemp_DESCRIPTION)
    @In
    @Unit("C")
    public double defaultTemp = 15.0;

    @Description(OMSPRESTEYTAYLORETPMODEL_inPressure_DESCRIPTION)
    @In
    @Unit("KPa")
    public HashMap<Integer, double[]> inPressure;

    @Description(OMSPRESTEYTAYLORETPMODEL_defaultPressure_DESCRIPTION)
    @In
    @Unit("KPa")
    public double defaultPressure = 100.0;

    @Description(OMSPRESTEYTAYLORETPMODEL_time_DESCRIPTION)
    @In
    public String tCurrent;

    @Description(OMSPRESTEYTAYLORETPMODEL_outPTEtp_DESCRIPTION)
    @Unit("mm hour-1")
    @Out
    public HashMap<Integer, double[]> outPTEtp;

    private DateTimeFormatter formatter = JGTConstants.utcDateFormatterYYYYMMDDHHMM;

    @Execute
    public void process() throws Exception {
        checkNull(inTemp);

        outPTEtp = new HashMap<Integer, double[]>();
        Set<Entry<Integer, double[]>> entrySet = inTemp.entrySet();
        for (Entry<Integer, double[]> entry : entrySet) {
            Integer basinId = entry.getKey();

            double temp = defaultTemp;
            double t = entry.getValue()[0];
            if (!isNovalue(t)) {
                temp = t;
            }

            double netradiation = 0;
            if (doHourly == true) {
                netradiation = defaultHourlyNetradiation * 0.0864 / 24.0;
            } else {
                netradiation = defaultDailyNetradiation * 0.0864;
            }
            if (inNetradiation != null) {
                double n = inNetradiation.get(basinId)[0];
                if (!isNovalue(n)) {
                    if (doHourly == true) {
                        netradiation = n * 0.0864 / 24.0;
                    } else {
                        netradiation = n * 0.0864;
                    }
                }
            }

            double pressure = defaultPressure;
            if (inPressure != null) {
                double p = inPressure.get(basinId)[0];
                if (isNovalue(p)) {
                    pressure = defaultPressure;
                } else {
                    pressure = p;
                }
            }

            DateTime currentDatetime = formatter.parseDateTime(tCurrent);
            int ora = currentDatetime.getHourOfDay();
            boolean isLigth = false;
            if (ora > 6 && ora < 18) {
                isLigth = true;
            }

            double etp = compute(pGmorn, pGnight, pAlpha, netradiation, temp, pressure, isLigth, doHourly);
            outPTEtp.put(basinId, new double[] { etp });
        }
    }

    private double compute(double ggm, double ggn, double alpha, double NetRad, double AirTem, double AtmPres,
            boolean islight, boolean ishourlyo) {
        double result = 0;
        if (ishourlyo == true) {
            double den_Delta = (AirTem + 237.3) * (AirTem + 237.3);
            double exp_Delta = (17.27 * AirTem) / (AirTem + 237.3);
            double num_Delta = 4098 * (0.6108 * Math.exp(exp_Delta));
            double Delta = num_Delta / den_Delta;

            double lambda = 2.501 - 0.002361 * AirTem;
            double gamma = 0.001013 * AtmPres / (0.622 * lambda);

            double coeff_G;
            if (islight == true) {
                coeff_G = ggm;
            } else {
                coeff_G = ggn;
            }

            double G = coeff_G * NetRad;

            result = (alpha) * Delta * (NetRad - G) / ((gamma + Delta) * lambda);

        } else {
            double den_Delta = (AirTem + 237.3) * (AirTem + 237.3);
            double exp_Delta = (17.27 * AirTem) / (AirTem + 237.3);
            double num_Delta = 4098 * (0.6108 * Math.exp(exp_Delta));
            double Delta = num_Delta / den_Delta;

            double lambda = 2.501 - 0.002361 * AirTem;
            double gamma = 0.001013 * AtmPres / (0.622 * lambda);

            result = (alpha) * Delta * (NetRad) / ((gamma + Delta) * lambda);

        }
        return result;
    }

}