File size: 2,405 Bytes
542edf7
 
e8721da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ec9d9e0
e8721da
 
 
 
 
ec9d9e0
e8721da
 
 
 
 
542edf7
 
 
 
 
 
ec9d9e0
542edf7
 
 
ec9d9e0
e8721da
542edf7
 
 
 
 
 
 
e8721da
 
542edf7
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from forecast import get_forecast_data
from utils.soil_utils import get_soil_properties


def calculate_ETx(Kc, ETo):
    """
    Calculate the maximum evapotranspiration (ETx) using the crop coefficient (Kc) and reference evapotranspiration (ETo).

    Parameters:
    Kc (float): Crop coefficient
    ETo (float): Reference evapotranspiration (mm)

    Returns:
    float: Maximum evapotranspiration (ETx) in mm
    """
    ETx = Kc * ETo
    return ETx

def calculate_ETa(ETx, soil_moisture, field_capacity, wilting_point):
    """
    Calculate the actual evapotranspiration (ETa) using the maximum evapotranspiration (ETx), soil moisture, field capacity, and wilting point.

    Parameters:
    ETx (float): Maximum evapotranspiration (mm)
    soil_moisture (float): Current soil moisture content (%)
    field_capacity (float): Field capacity of the soil (%)
    wilting_point (float): Wilting point of the soil (%)

    Returns:
    float: Actual evapotranspiration (ETa) in mm
    """
    if soil_moisture > field_capacity:
        ETa = ETx
    elif soil_moisture < wilting_point:
        ETa = 0
    else:
        ETa = ETx * ((soil_moisture - wilting_point) / (field_capacity - wilting_point))
    
    return ETa


def calculate_yield_projection(Yx, ETx, ETa, Ky):
    """
    Calculate the agricultural yield projection using the FAO water production function.

    Parameters:
    Yx (float): Maximum yield (quintal/ha)
    ETx (float): Maximum evapotranspiration (mm)
    ETa (float): Actual evapotranspiration (mm)
    Ky (float): Yield response factor

    Returns:
    float: Projected yield (quintal/ha)
    """
    Ya = Yx * (1 - Ky * (1 - ETa / ETx))
    return round(Ya, 2)


def get_yield_forecast(latitude: float, longitude: float, scenario: str = "pessimist", shading_coef: float = 0.):
    monthly_forecast = get_forecast_data(latitude, longitude, scenario=scenario, shading_coef=shading_coef)

    Kc, Ky = get_cultural_coefficients()

    Yx = get_maximum_theoretical_yield()

    soil_properties = get_soil_properties(latitude, longitude)

    ETo = monthly_forecast["et0"]

    ETx = calculate_ETx(Kc, ETo)

    ETa = calculate_ETa(
        ETx,
        soil_properties["soil_moisture"],
        soil_properties["field_capacity"],
        soil_properties["wilting_point"],
    )

    projected_yield = calculate_yield_projection(Yx, ETx, ETa, Ky)

    return projected_yield