package com.dy.pipIrrModel.modelCalculate; 
 | 
  
 | 
import net.objecthunter.exp4j.Expression; 
 | 
import net.objecthunter.exp4j.ExpressionBuilder; 
 | 
  
 | 
/** 
 | 
 * @Author: liurunyu 
 | 
 * @Date: 2025/8/18 14:51 
 | 
 * @Description 哈格里夫斯(Hargreaves)公式 计算作物实际蒸散量(mm/day) 
 | 
 */ 
 | 
public class Hargreaves { 
 | 
  
 | 
    /** 
 | 
     * 计算弧度 
 | 
     * 弧度=角度× π/180 
 | 
     * @param lat 地理纬度 
 | 
     * @return 
 | 
     */ 
 | 
    public static Double rad(Double lat) { 
 | 
        Expression expression = new ExpressionBuilder("x * pi / 180") 
 | 
                .variables("x") 
 | 
                .build(); 
 | 
        // 设置变量值 
 | 
        expression.setVariable("x", lat); 
 | 
        Double result = expression.evaluate(); 
 | 
        return result ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 太阳磁偏角 
 | 
     * @param dayIndex 为年内某天的日序数(比如1月1日为1,12月31日为365或366) 
 | 
     * @return 
 | 
     */ 
 | 
    public static Double sunMagnetismAngular(Integer dayIndex){ 
 | 
        Expression expression = new ExpressionBuilder("0.409 * sin(((2 * pi) / 365) * x - 1.39)") 
 | 
                .variables("x") 
 | 
                .build(); 
 | 
        // 设置变量值 
 | 
        expression.setVariable("x", dayIndex); 
 | 
        Double result = expression.evaluate(); 
 | 
        return result ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 日地间相对距离的倒数 
 | 
     * @param dayIndex 为年内某天的日序数(比如1月1日为1,12月31日为365或366) 
 | 
     * @return 
 | 
     */ 
 | 
    public static Double sunEarthDistance(Integer dayIndex){ 
 | 
        Expression expression = new ExpressionBuilder("1 + (0.033 * cos(((2 * pi) / 365) * x))") 
 | 
                .variables("x") 
 | 
                .build(); 
 | 
        // 设置变量值 
 | 
        expression.setVariable("x", dayIndex); 
 | 
        Double result = expression.evaluate(); 
 | 
        return result ; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 太阳时角 
 | 
     * 0.409 * sin(2 * pi / 365 * x - 1.39) 
 | 
     * @param fai 地理弧度 
 | 
     * @param sunMagnetismAngular 太阳磁偏角 
 | 
     * @return 
 | 
     */ 
 | 
    public static Double sunTimeAngular(Double fai, Double sunMagnetismAngular){ 
 | 
        Expression expression = new ExpressionBuilder("acos(-tan(x) * tan(y))") 
 | 
                .variables("x", "y") 
 | 
                .build(); 
 | 
        // 设置变量值 
 | 
        expression.setVariable("x", fai); 
 | 
        expression.setVariable("y", sunMagnetismAngular); 
 | 
        Double result = expression.evaluate(); 
 | 
        return result ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 计算天顶辐射 
 | 
     * @param sunEarthDistance 日地间相对距离的倒数 
 | 
     * @param sunTimeAngular 太阳时偏角 
 | 
     * @param fai 地理弧度 
 | 
     * @param sunMagnetismAngular 太阳磁偏角 
 | 
     * @return 
 | 
     */ 
 | 
    public static Double zenithRadiation(Double sunEarthDistance, 
 | 
                                         Double sunTimeAngular, 
 | 
                                         Double fai, 
 | 
                                         Double sunMagnetismAngular){ 
 | 
        Expression expression = new ExpressionBuilder("((24 * 60) / pi) * 0.082 * a * ((b * sin(c) * sin(d)) + (cos(c) * cos(d) * sin(b)))") 
 | 
                .variables("a", "b", "c", "d") 
 | 
                .build(); 
 | 
        // 设置变量值 
 | 
        expression.setVariable("a", sunEarthDistance); 
 | 
        expression.setVariable("b", sunTimeAngular); 
 | 
        expression.setVariable("c", fai); 
 | 
        expression.setVariable("d", sunMagnetismAngular); 
 | 
        Double result = expression.evaluate(); 
 | 
        return result ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 格里夫斯(Hargreaves)公式计算作物蒸散量(mm/day) 
 | 
     * @param kc 作物系数 
 | 
     * @param maxT 一日内最高温度 
 | 
     * @param maxT 一日内最高温度 
 | 
     * @param zenithRadiation 天顶辐射 
 | 
     * @return 
 | 
     */ 
 | 
    public static Double ET0(Double kc, Double maxT, Double minT, Double zenithRadiation){ 
 | 
        Expression expression = new ExpressionBuilder("x * (0.0023 * (((a + b) / 2) + 17.8) * ((a + b)^(1/2)) * c * 0.408)") 
 | 
                .variables("x", "a", "b", "c") 
 | 
                .build(); 
 | 
        // 设置变量值 
 | 
        expression.setVariable("x", kc); 
 | 
        expression.setVariable("a", maxT); 
 | 
        expression.setVariable("b", minT); 
 | 
        expression.setVariable("c", zenithRadiation); 
 | 
        Double result = expression.evaluate(); 
 | 
        return result ; 
 | 
    } 
 | 
  
 | 
  
 | 
    public static void main(String[] args) { 
 | 
        Double lat = 38.56064095143279 ;//纬度 
 | 
        Integer dayIndex = 239 ;//年内日序数(比如1月1日为1,12月31日为365或366) 
 | 
        Double kc = 0.41 ;//作物系数 
 | 
        Double maxT = 40.1 ;//一日内最高温度 
 | 
        Double minT = 28.1 ;//一日内最低温度 
 | 
  
 | 
        Double fai = rad(lat); 
 | 
        System.out.println("弧度:" + fai); 
 | 
  
 | 
        Double sunMagnetismAngular = sunMagnetismAngular(dayIndex); 
 | 
        System.out.println("太阳磁偏角:" + sunMagnetismAngular); 
 | 
  
 | 
        Double sunTimeAngular = sunTimeAngular(fai, sunMagnetismAngular); 
 | 
        System.out.println("太阳时角:" + sunTimeAngular); 
 | 
  
 | 
        Double sunEarthDistance = sunEarthDistance(dayIndex); 
 | 
        System.out.println("日地间相对距离的倒数:" + sunEarthDistance); 
 | 
  
 | 
        Double zenithRadiation = zenithRadiation(sunEarthDistance, sunTimeAngular, fai, sunMagnetismAngular); 
 | 
        System.out.println("天顶辐射:" + zenithRadiation); 
 | 
  
 | 
        Double et0 = ET0(kc, maxT, minT, zenithRadiation); 
 | 
        System.out.println("蒸散量:" + et0); 
 | 
    } 
 | 
  
 | 
} 
 |