54 lines
1.7 KiB
Python
54 lines
1.7 KiB
Python
import numpy as np
|
|
|
|
def campbell(ala):
|
|
"""
|
|
Campbell's leaf angle distribution function (ellipsoidal).
|
|
|
|
Parameters:
|
|
ala : average leaf angle in degrees
|
|
|
|
Returns:
|
|
freq : relative frequency for 13 inclination bins
|
|
litab: bin centers (degrees)
|
|
"""
|
|
tx1 = np.array([10., 20., 30., 40., 50., 60., 70., 80., 82., 84., 86., 88., 90.])
|
|
tx2 = np.array([0., 10., 20., 30., 40., 50., 60., 70., 80., 82., 84., 86., 88.])
|
|
litab = (tx1 + tx2) / 2
|
|
n = len(litab)
|
|
|
|
tl1 = np.radians(tx1)
|
|
tl2 = np.radians(tx2)
|
|
|
|
excent = np.exp(-1.6184e-5 * ala**3 + 2.1145e-3 * ala**2 - 0.12390 * ala + 3.2491)
|
|
|
|
freq = np.zeros(n)
|
|
for i in range(n):
|
|
x1 = excent / np.sqrt(1 + (excent**2) * np.tan(tl1[i])**2)
|
|
x2 = excent / np.sqrt(1 + (excent**2) * np.tan(tl2[i])**2)
|
|
|
|
if excent == 1:
|
|
freq[i] = abs(np.cos(tl1[i]) - np.cos(tl2[i]))
|
|
else:
|
|
alpha = excent / np.sqrt(abs(1 - excent**2))
|
|
alpha2 = alpha**2
|
|
x1_sq = x1**2
|
|
x2_sq = x2**2
|
|
|
|
if excent > 1:
|
|
alpx1 = np.sqrt(alpha2 + x1_sq)
|
|
alpx2 = np.sqrt(alpha2 + x2_sq)
|
|
dum1 = x1 * alpx1 + alpha2 * np.log(x1 + alpx1)
|
|
dum2 = x2 * alpx2 + alpha2 * np.log(x2 + alpx2)
|
|
freq[i] = abs(dum1 - dum2)
|
|
else:
|
|
almx1 = np.sqrt(alpha2 - x1_sq)
|
|
almx2 = np.sqrt(alpha2 - x2_sq)
|
|
dum1 = x1 * almx1 + alpha2 * np.arcsin(x1 / alpha)
|
|
dum2 = x2 * almx2 + alpha2 * np.arcsin(x2 / alpha)
|
|
freq[i] = abs(dum1 - dum2)
|
|
|
|
freq_sum = np.sum(freq)
|
|
freq_normalized = freq / freq_sum if freq_sum != 0 else freq
|
|
|
|
return freq_normalized, litab
|