import numpy as np
from copy import deepcopy
from . import emissivity_models
from . import patch_characteristics_cupy
[docs]
def Lcyl_v2022a_cupy(esky, sky_patches, Ta, Tgwall, ewall, Lup, shmat, vegshmat, vbshvegshmat, solar_altitude, solar_azimuth, rows, cols, asvf):
'''
Function updated to use CuPy. This function combines the method to divide the sky vault into patches (Tregenza (1987) and Robinson & Stone (2004))
and the approach by Unsworth & Monteith or Martin & Berdahl (1984) or Bliss (1961) to calculate emissivities of the
different parts of the sky vault.
Parameters:
esky (float): Effective hemispherical sky emissivity.
sky_patches (ndarray): Array with patch altitude and azimuth in degrees.
Ta (float): Air temperature in degrees Celsius.
Tgwall (ndarray): Wall surface temperatures (°C).
ewall (ndarray): Wall surface emissivities.
Lup (ndarray): Upward longwave radiation.
shmat, vegshmat, vbshvegshmat (cp.ndarray): c
solar_altitude (float): Solar altitude angle in degrees.
solar_azimuth (float): Solar azimuth angle in degrees.
rows (int): Number of rows in the grid.
cols (int): Number of columns in the grid.
asvf (ndarray): Anisotropic Sky View Factor.
Returns
-------
Ldown : cp.ndarray
Longwave radiation from downward direction.
Lside : cp.ndarray
Longwave radiation from side directions.
Lx : cp.ndarray
Longwave radiation from (x = east, west, north, south) direction.
'''
# Stefan-Boltzmann's Constant
SBC = 5.67051e-8
# Sky longwave radiation from emissivity based on Prata (1996)
Ldown_prata = (esky * SBC * ((Ta + 273.15) ** 4))
# Degrees to radians
deg2rad = np.pi / 180
# Unique altitudes for patches
skyalt, skyalt_c = np.unique(sky_patches[:, 0], return_counts=True)
# skyzen = 90-skyalt # Unique zeniths for the patches
# Altitudes of the Robinson & Stone patches
patch_altitude = sky_patches[:, 0]
# Azimuths of the Robinson & Stone patches, used for box
patch_azimuth = sky_patches[:, 1]
emis_m = 2
# Unsworth & Monteith (1975)
if emis_m == 1:
patch_emissivity_normalized, esky_band = emissivity_models.model1(sky_patches, esky, Ta)
# Martin & Berdahl (1984)
elif emis_m == 2:
patch_emissivity_normalized, esky_band = emissivity_models.model2(sky_patches, esky, Ta)
# Bliss (1961)
elif emis_m == 3:
patch_emissivity_normalized, esky_band = emissivity_models.model3(sky_patches, esky, Ta)
# Calculation of steradian for each patch
steradian = np.zeros((patch_altitude.shape[0]))
for i in range(patch_altitude.shape[0]):
# If there are more than one patch in a band
if skyalt_c[skyalt == patch_altitude[i]] > 1:
steradian[i] = ((360 / skyalt_c[skyalt == patch_altitude[i]]) * deg2rad) * (np.sin((patch_altitude[i] + patch_altitude[0]) * deg2rad) \
- np.sin((patch_altitude[i] - patch_altitude[0]) * deg2rad))
# If there is only one patch in band, i.e. 90 degrees
else:
steradian[i] = ((360 / skyalt_c[skyalt == patch_altitude[i]]) * deg2rad) * (np.sin((patch_altitude[i]) * deg2rad) \
- np.sin((patch_altitude[i-1] + patch_altitude[0]) * deg2rad))
# True = anisotropic sky, False = isotropic sky
anisotropic_sky = True
# anisotropic_sky = False
# Longwave based on spectral flux density (divide by pi)
Ldown = np.zeros((patch_altitude.shape[0]))
Lside = np.zeros((patch_altitude.shape[0]))
Lnormal = np.zeros((patch_altitude.shape[0]))
for altitude in skyalt:
# Anisotropic sky
if anisotropic_sky:
temp_emissivity = esky_band[skyalt == altitude]
# Isotropic sky but with patches (need to switch anisotropic_sky to False)
else:
temp_emissivity = esky
# Estimate longwave radiation on a horizontal surface (Ldown), vertical surface (Lside) and perpendicular (Lnormal)
Ldown[patch_altitude == altitude] = ((temp_emissivity * SBC * ((Ta + 273.15) ** 4)) / np.pi) * steradian[patch_altitude == altitude] * np.sin(altitude * deg2rad)
Lside[patch_altitude == altitude] = ((temp_emissivity * SBC * ((Ta + 273.15) ** 4)) / np.pi) * steradian[patch_altitude == altitude] * np.cos(altitude * deg2rad)
Lnormal[patch_altitude == altitude] = ((temp_emissivity * SBC * ((Ta + 273.15) ** 4)) / np.pi) * steradian[patch_altitude == altitude]
Lsky_normal = deepcopy(sky_patches)
Lsky_down = deepcopy(sky_patches)
Lsky_side = deepcopy(sky_patches)
Lsky_normal[:,2] = Lnormal
Lsky_down[:,2] = Ldown
Lsky_side[:,2] = Lside
# Estimate longwave radiation in each patch based on patch characteristics, i.e. sky, vegetation or building (shaded or sunlit)
Ldown, Lside, Lside_sky, Lside_veg, Lside_sh, Lside_sun, Lside_ref, \
Least_, Lwest_, Lnorth_, Lsouth_ = patch_characteristics_cupy.define_patch_characteristics(solar_altitude, solar_azimuth,
patch_altitude, patch_azimuth, steradian,
asvf,
shmat, vegshmat, vbshvegshmat,
Lsky_down, Lsky_side, Lsky_normal, Lup,
Ta, Tgwall, ewall,
rows, cols)
return Ldown, Lside, Least_, Lwest_, Lnorth_, Lsouth_