81 INTEGER,
INTENT(in) :: id
82 INTEGER,
INTENT(in) :: it
83 REAL(KIND(1D0)),
INTENT(in) :: lamdaP
84 REAL(KIND(1D0)),
INTENT(in) :: lamdaF
88 REAL(KIND(1D0)),
INTENT(in) :: Press_hPa
89 REAL(KIND(1D0)),
INTENT(in) :: Temp_C
90 REAL(KIND(1D0)),
INTENT(in) :: avrh
91 REAL(KIND(1D0)),
INTENT(in) :: avkdn
92 REAL(KIND(1D0)),
INTENT(in) :: ldown
93 REAL(KIND(1D0)),
INTENT(in) :: Tg
96 REAL(KIND(1D0)),
INTENT(in) :: lat
97 REAL(KIND(1D0)),
INTENT(in) :: zenith_deg
98 REAL(KIND(1D0)),
INTENT(in) :: azimuth
99 REAL(KIND(1D0)),
INTENT(in) :: dectime
100 REAL(KIND(1D0)),
INTENT(in) :: scale
102 REAL(KIND(1D0)),
PARAMETER :: absL = 0.97
103 REAL(KIND(1D0)),
PARAMETER :: absK = 0.7
104 REAL(KIND(1D0)),
INTENT(in) :: heightgravity
106 REAL(KIND(1D0)),
INTENT(in) :: alb_bldg
107 REAL(KIND(1D0)),
INTENT(in) :: alb_ground
108 REAL(KIND(1D0)),
INTENT(in) :: emis_wall
109 REAL(KIND(1D0)),
INTENT(in) :: emis_ground
111 REAL(KIND(1D0)),
DIMENSION(ncolumnsdataOutSOLWEIG - 5),
INTENT(OUT) :: dataOutLineSOLWEIG
113 REAL(KIND(1D0)) :: t, Tstart, height, psi
114 REAL(KIND(1D0)) :: altitude, zen
115 REAL(KIND(1D0)) :: CI, c, I0, Kt, Tw, weight1
116 REAL(KIND(1D0)) :: Ta, RH, P, radG, radD, radI
117 REAL(KIND(1D0)) :: I0et, CIuncorr
118 REAL(KIND(1D0)) :: SNDN, SNUP, DEC, DAYL
119 REAL(KIND(1D0)) :: msteg, emis_sky, ea
121 INTEGER :: DOY, hour, first, second, j
122 REAL(KIND(1D0)) :: timeadd
123 REAL(KIND(1D0)) :: firstdaytime
125 REAL(KIND(1D0)) :: CIlatenight
126 REAL(KIND(1D0)) :: Fside
127 REAL(KIND(1D0)) :: Fup
128 REAL(KIND(1D0)) :: HW
130 REAL(KIND(1D0)),
DIMENSION(1, 1) :: svfalfa, sos, Tgmap1
131 REAL(KIND(1D0)),
DIMENSION(1, 1) :: gvf
132 REAL(KIND(1D0)),
DIMENSION(1, 1) :: Tmrt, shadow, Sstr, F_sh
133 REAL(KIND(1D0)),
DIMENSION(1, 1) :: vegsh
134 REAL(KIND(1D0)),
DIMENSION(1, 1) :: buildings, svf
135 REAL(KIND(1D0)),
DIMENSION(1, 1) :: svfveg
136 REAL(KIND(1D0)),
DIMENSION(1, 1) :: svfaveg
137 REAL(KIND(1D0)),
DIMENSION(1, 1) :: Kdown2d, Keast, Knorth, Ksouth, Kup2d, Kwest
138 REAL(KIND(1D0)),
DIMENSION(1, 1) :: Ldown2d, Least, Lnorth, Lsouth, Lup2d, Lwest
141 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: tmp, Knight, svf_blgd_veg, Tgmap0
143 REAL(KIND(1D0)),
PARAMETER :: azimuthA(1:18) = [(j*(360.0/18.0), j=0, 17)]
145 REAL(KIND(1D0)),
PARAMETER :: pi = 3.141592653589793
146 REAL(KIND(1D0)),
PARAMETER :: SBC = 5.67051e-8
149 INTEGER,
PARAMETER :: onlyglobal = 1
150 INTEGER,
PARAMETER :: usevegdem = 0
151 INTEGER,
PARAMETER :: row = 1
152 INTEGER,
PARAMETER :: col = 1
153 INTEGER,
PARAMETER :: Posture = 1
154 INTEGER,
PARAMETER :: SOLWEIG_ldown = 0
161 ALLOCATE (knight(1, 1))
162 ALLOCATE (tgmap0(1, 1))
163 ALLOCATE (svf_blgd_veg(1, 1))
169 IF (posture == 1)
THEN
184 height = heightgravity
222 tmp = 1 - (svf + svfveg - 1)
223 WHERE (tmp <= 0) tmp = 0.000000001
224 svfalfa = asin(exp(log(tmp)/2))
227 first = int(anint(height))
231 second = int(anint(height*20))
234 svf_blgd_veg = (svf - (1 - svfveg)*(1 - psi))
237 CALL daylen(doy, lat, dayl, dec, sndn, snup)
239 altitude = 90 - zenith_deg
242 ea = 6.107*10**((7.5*ta)/(237.3 + ta))*(rh/100)
243 msteg = 46.5*(ea/(ta + 273.15))
244 emis_sky = (1 - (1 + msteg)*exp(-((1.2 + 3.0*msteg)**0.5))) - 0.04
247 IF (altitude > 0)
THEN
251 CALL clearnessindex_2013b(zen, doy, ta, rh/100, radg, lat, p, i0, ci, kt, i0et, ciuncorr)
256 IF (onlyglobal == 1)
THEN
261 IF (usevegdem == 1)
THEN
273 DO j = 1,
SIZE(azimutha)
274 CALL sunonsurface_veg(azimutha(j), scale, buildings, first, second, psi, sos)
277 gvf = gvf/
SIZE(azimutha) + (buildings*(-1) + 1)
284 kdown2d = radi*shadow*sin(altitude*
deg2rad) &
285 + radd*svf_blgd_veg &
286 + radg*alb_bldg*(1 - svf_blgd_veg)*(1 - f_sh)
288 kup2d = alb_ground*( &
289 radi*gvf*sin(altitude*
deg2rad) &
290 + radd*svf_blgd_veg &
291 + radg*alb_bldg*(1 - svf_blgd_veg)*(1 - f_sh))
295 radi, radg, radd, azimuth, altitude, psi, t, alb_ground, &
296 keast, knorth, ksouth, kwest)
336 timeadd = (dectime + 1) - doy - (it/24.)
337 weight1 = exp(-33.27*timeadd)
338 tgmap1 = tgmap0*(1 - weight1) + tgmap1*weight1
339 lup2d = sbc*emis_ground*((tgmap1 + 273.15)**4)
345 IF (dectime < (doy + 0.5) .AND. dectime > doy .AND. altitude < 1.0)
THEN
384 lup2d = sbc*emis_ground*((knight + ta + tg + 273.15)**4)
389 IF (solweig_ldown == 1)
THEN
390 ldown2d = (svf + svfveg - 1)*emis_sky*sbc*((ta + 273.15)**4) &
391 + (2 - svfveg - svfaveg)*emis_wall*sbc*((ta + 273.15)**4) &
392 + (svfaveg - svf)*emis_wall*sbc*((ta + 273.15 + tw)**4) &
393 + (2 - svf - svfveg)*(1 - emis_wall)*emis_sky*sbc*((ta + 273.15)**4)
399 ldown2d = ldown2d*(1 - c) + c*( &
400 (svf + svfveg - 1)*sbc*((ta + 273.15)**4) &
401 + (2 - svfveg - svfaveg)*emis_wall*sbc*((ta + 273.15)**4) &
402 + (svfaveg - svf)*emis_wall*sbc*((ta + 273.15 + tw)**4) &
403 + (2 - svf - svfveg)*(1 - emis_wall)*sbc*((ta + 273.15)**4))
406 ldown2d = (svf + svfveg - 1)*ldown &
407 + (2 - svfveg - svfaveg)*emis_wall*sbc*((ta + 273.15)**4) &
408 + (svfaveg - svf)*emis_wall*sbc*((ta + 273.15 + tw)**4) &
409 + (2 - svf - svfveg)*(1 - emis_wall)*ldown
414 altitude, ta, tw, sbc, emis_wall, emis_sky, t, ci, azimuth, zen, ldown, svfalfa, &
415 least, lnorth, lsouth, lwest)
418 sstr = absk*(kdown2d*fup + kup2d*fup + knorth*fside + keast*fside + ksouth*fside + kwest*fside) &
419 + absl*(ldown2d*fup + lup2d*fup + lnorth*fside + least*fside + lsouth*fside + lwest*fside)
420 tmrt = sqrt(sqrt((sstr/(absl*sbc)))) - 273.15
431 dataoutlinesolweig = [azimuth, altitude, radg, radi, radd, &
432 kdown2d(row, col), kup2d(row, col), &
433 ksouth(row, col), kwest(row, col), knorth(row, col), keast(row, col), &
434 ldown2d(row, col), lup2d(row, col), &
435 lsouth(row, col), lwest(row, col), lnorth(row, col), least(row, col), &
436 tmrt(row, col), i0, ci, gvf(row, col), shadow(row, col), svf(row, col), &
437 svf_blgd_veg(row, col), ta, tg]
444 DEALLOCATE (svf_blgd_veg)
510 SUBROUTINE clearnessindex_2013b(zen, DOY, Ta, RH, radG, lat, P_kPa, I0, CI, Kt, I0et, CIuncorr)
516 INTEGER,
INTENT(in) :: DOY
518 REAL(KIND(1D0)),
INTENT(in) :: zen
519 REAL(KIND(1D0)),
INTENT(in) :: Ta
520 REAL(KIND(1D0)),
INTENT(in) :: RH
521 REAL(KIND(1D0)),
INTENT(in) :: P_kPa
522 REAL(KIND(1D0)),
INTENT(in) :: radG
523 REAL(KIND(1D0)),
INTENT(in) :: lat
524 REAL(KIND(1D0)),
INTENT(out) :: I0et
525 REAL(KIND(1D0)),
INTENT(out) :: CIuncorr
526 REAL(KIND(1D0)),
INTENT(out) :: CI
527 REAL(KIND(1D0)),
INTENT(out) :: I0
528 REAL(KIND(1D0)),
INTENT(out) :: Kt
529 REAL(KIND(1D0)) :: iG, Itoa, p
530 REAL(KIND(1D0)),
DIMENSION(4) :: G
531 REAL(KIND(1D0)),
PARAMETER :: pi = 3.141592653589793
549 IF (p_kpa == -999)
THEN
559 m = 35.*cos(zen)*((1224.*(cos(zen)**2) + 1.)**(-1./2.))
560 trpg = 1.021 - 0.084*(m*(0.000949*p + 0.051))**0.5
565 g = [3.37, 2.85, 2.80, 2.64]
566 ELSE IF (lat >= 10 .AND. lat < 20)
THEN
567 g = [2.99, 3.02, 2.70, 2.93]
568 ELSE IF (lat >= 20 .AND. lat < 30)
THEN
569 g = [3.60, 3.00, 2.98, 2.93]
570 ELSE IF (lat >= 30 .AND. lat < 40)
THEN
571 g = [3.04, 3.11, 2.92, 2.94]
572 ELSE IF (lat >= 40 .AND. lat < 50)
THEN
573 g = [2.70, 2.95, 2.77, 2.71]
574 ELSE IF (lat >= 50 .AND. lat < 60)
THEN
575 g = [2.52, 3.07, 2.67, 2.93]
576 ELSE IF (lat >= 60 .AND. lat < 70)
THEN
577 g = [1.76, 2.69, 2.61, 2.61]
578 ELSE IF (lat >= 70 .AND. lat < 80)
THEN
579 g = [1.60, 1.67, 2.24, 2.63]
580 ELSE IF (lat >= 80 .AND. lat < 90)
THEN
581 g = [1.11, 1.44, 1.94, 2.02]
583 IF (doy > 335 .OR. doy <= 60)
THEN
585 ELSE IF (doy > 60 .AND. doy <= 152)
THEN
587 ELSE IF (doy > 152 .AND. doy <= 244)
THEN
589 ELSE IF (doy > 244 .AND. doy <= 335)
THEN
595 td = (b2*(((
a2*ta)/(b2 + ta)) + log(rh)))/(
a2 - (((
a2*ta)/(b2 + ta)) + log(rh)))
597 u = exp(0.1133 - log(ig + 1) + 0.0393*td)
598 tw = 1 - 0.077*((u*m)**0.3)
601 i0 = itoa*cos(zen)*trpg*tw*d*tar
611 corr = 0.1473*log(90 - (zen/pi*180)) + 0.3454
614 ci = ciuncorr + (1 - corr)
615 i0et = itoa*cos(zen)*d
1050 radI, radG, radD, azimuth, altitude, psi, t, albedo, & ! input
1051 Keast, Knorth, Ksouth, Kwest)
1055 REAL(KIND(1D0)),
PARAMETER :: pi = 3.141592653589793
1056 REAL(KIND(1D0)),
INTENT(in) :: radI
1057 REAL(KIND(1D0)),
INTENT(in) :: radG
1058 REAL(KIND(1D0)),
INTENT(in) :: radD
1059 REAL(KIND(1D0)),
INTENT(in) :: azimuth
1060 REAL(KIND(1D0)),
INTENT(in) :: altitude
1061 REAL(KIND(1D0)),
INTENT(in) :: psi
1062 REAL(KIND(1D0)),
INTENT(in) :: t
1063 REAL(KIND(1D0)),
INTENT(in) :: albedo
1065 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: shadow, F_sh
1066 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: Keast, Knorth, Ksouth, Kwest
1068 REAL(KIND(1D0)) :: vikttot, aziE, aziN, aziS, aziW
1069 REAL(KIND(1D0)),
DIMENSION(1, 1) :: viktveg, viktwall
1072 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfE = 1
1073 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfS = 1
1074 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfW = 1
1075 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfN = 1
1076 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfEveg = 1
1077 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfSveg = 1
1078 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfWveg = 1
1079 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfNveg = 1
1082 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: svfviktbuveg
1084 ALLOCATE (svfviktbuveg(1, 1))
1088 azis = azimuth - 90 + t
1089 aziw = azimuth - 180 + t
1090 azin = azimuth - 270 + t
1093 CALL kvikt_veg(svfe, svfeveg, vikttot, viktveg, viktwall)
1094 svfviktbuveg = (viktwall + (viktveg)*(1 - psi))
1095 IF (azimuth > (360 - t) .OR. azimuth <= (180 - t))
THEN
1096 keast = radi*shadow*cos(altitude*(pi/180))*sin(azie*(pi/180)) + &
1097 radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1099 keast = radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1102 CALL kvikt_veg(svfs, svfsveg, vikttot, viktveg, viktwall)
1103 svfviktbuveg = (viktwall + (viktveg)*(1 - psi))
1104 IF (azimuth > (90 - t) .AND. azimuth <= (270 - t))
THEN
1105 ksouth = radi*shadow*cos(altitude*(pi/180))*sin(azis*(pi/180)) + &
1106 radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1108 ksouth = radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1111 CALL kvikt_veg(svfw, svfwveg, vikttot, viktveg, viktwall)
1112 svfviktbuveg = (viktwall + (viktveg)*(1 - psi))
1113 IF (azimuth > (180 - t) .AND. azimuth <= (360 - t))
THEN
1114 kwest = radi*shadow*cos(altitude*(pi/180))*sin(aziw*(pi/180)) + &
1115 radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1117 kwest = radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1120 CALL kvikt_veg(svfn, svfnveg, vikttot, viktveg, viktwall)
1121 svfviktbuveg = (viktwall + (viktveg)*(1 - psi))
1122 IF (azimuth <= (90 - t) .OR. azimuth > (270 - t))
THEN
1123 knorth = radi*shadow*cos(altitude*(pi/180))*sin(azin*(pi/180)) + &
1124 radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1126 knorth = radd*(1 - svfviktbuveg) + radg*albedo*svfviktbuveg*(1 - f_sh)
1129 DEALLOCATE (svfviktbuveg)
1158 altitude, Ta, Tw, SBC, emis_wall, emis_sky, t, CI, azimuth, zen, ldown, svfalfa, &
1159 Least, Lnorth, Lsouth, Lwest)
1163 REAL(KIND(1D0)),
INTENT(in) :: altitude, Ta, Tw, SBC, emis_wall, emis_sky, t, CI, azimuth, ldown, zen
1165 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: svfalfa
1166 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: Ldown2d, Lup2d
1167 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: Least, Lnorth, Lsouth, Lwest
1169 REAL(KIND(1D0)) :: vikttot, aziE, aziN, aziS, aziW, c
1171 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: svfalfaE, svfalfaS, svfalfaW, svfalfaN
1172 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: alfaB, betaB, betasun
1173 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: Lground, Lrefl, Lsky, Lsky_allsky, Lveg, Lwallsh, Lwallsun
1174 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: viktonlywall, viktaveg, svfvegbu
1175 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: oneminussvfE, oneminussvfS, oneminussvfW, oneminussvfN
1176 REAL(KIND(1D0)),
PARAMETER :: pi = 3.141592653589793
1177 INTEGER,
PARAMETER :: SOLWEIG_ldown = 0
1179 REAL(KIND(1D0)),
DIMENSION(1, 1) :: viktveg, viktsky, viktrefl, viktwall
1180 REAL(KIND(1D0)),
DIMENSION(1, 1) :: F_sh
1183 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfE = 1
1184 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfS = 1
1185 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfW = 1
1186 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfN = 1
1187 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfEveg = 1
1188 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfSveg = 1
1189 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfWveg = 1
1190 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfNveg = 1
1191 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfEaveg = 1
1192 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfSaveg = 1
1193 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfWaveg = 1
1194 REAL(KIND(1D0)),
DIMENSION(1, 1),
PARAMETER :: svfNaveg = 1
1196 ALLOCATE (oneminussvfe(1, 1))
1197 ALLOCATE (oneminussvfs(1, 1))
1198 ALLOCATE (oneminussvfw(1, 1))
1199 ALLOCATE (oneminussvfn(1, 1))
1200 ALLOCATE (svfalfae(1, 1))
1201 ALLOCATE (svfalfas(1, 1))
1202 ALLOCATE (svfalfaw(1, 1))
1203 ALLOCATE (svfalfan(1, 1))
1204 ALLOCATE (alfab(1, 1))
1205 ALLOCATE (betab(1, 1))
1206 ALLOCATE (betasun(1, 1))
1207 ALLOCATE (lground(1, 1))
1208 ALLOCATE (lrefl(1, 1))
1209 ALLOCATE (lsky(1, 1))
1210 ALLOCATE (lsky_allsky(1, 1))
1211 ALLOCATE (lveg(1, 1))
1212 ALLOCATE (lwallsh(1, 1))
1213 ALLOCATE (lwallsun(1, 1))
1214 ALLOCATE (viktonlywall(1, 1))
1215 ALLOCATE (viktaveg(1, 1))
1216 ALLOCATE (svfvegbu(1, 1))
1224 oneminussvfe = 1.-svfe;
WHERE (oneminussvfe <= 0) oneminussvfe = 0.000000001
1225 oneminussvfs = 1.-svfs;
WHERE (oneminussvfs <= 0) oneminussvfs = 0.000000001
1226 oneminussvfw = 1.-svfw;
WHERE (oneminussvfw <= 0) oneminussvfw = 0.000000001
1227 oneminussvfn = 1.-svfn;
WHERE (oneminussvfn <= 0) oneminussvfn = 0.000000001
1228 svfalfae = asin(exp((log(oneminussvfe))/2))
1229 svfalfas = asin(exp((log(oneminussvfs))/2))
1230 svfalfaw = asin(exp((log(oneminussvfw))/2))
1231 svfalfan = asin(exp((log(oneminussvfn))/2))
1235 azin = azimuth - 90 + t
1236 azie = azimuth - 180 + t
1237 azis = azimuth - 270 + t
1243 IF (solweig_ldown == 1)
THEN
1245 lsky_allsky = emis_sky*sbc*((ta + 273.15)**4)*(1 - c) + c*sbc*((ta + 273.15)**4)
1251 CALL lvikt_veg(svfe, svfeveg, svfeaveg, vikttot, &
1252 viktveg, viktsky, viktrefl, viktwall)
1254 IF (altitude > 0)
THEN
1255 alfab = atan(svfalfae)
1256 betab = atan(tan((svfalfae)*f_sh))
1257 betasun = ((alfab - betab)/2) + betab
1258 IF (azimuth > (180 - t) .AND. azimuth <= (360 - t))
THEN
1259 lwallsun = sbc*emis_wall*((ta + 273.15 + tw*sin(azie*(pi/180)))**4)* &
1260 viktwall*(1 - f_sh)*cos(betasun)*0.5
1261 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*f_sh*0.5
1264 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1268 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1270 lsky = ((svfe + svfeveg - 1)*lsky_allsky)*viktsky*0.5
1271 lveg = sbc*emis_wall*((ta + 273.15)**4)*viktveg*0.5
1273 lrefl = (ldown2d + lup2d)*(viktrefl)*(1 - emis_wall)*0.5
1274 least = lsky + lwallsun + lwallsh + lveg + lground + lrefl
1277 CALL lvikt_veg(svfs, svfsveg, svfsaveg, vikttot, &
1278 viktveg, viktsky, viktrefl, viktwall)
1280 IF (altitude > 0)
THEN
1281 alfab = atan(svfalfas)
1282 betab = atan(tan((svfalfas)*f_sh))
1283 betasun = ((alfab - betab)/2) + betab
1284 IF (azimuth <= (90 - t) .OR. azimuth > (270 - t))
THEN
1285 lwallsun = sbc*emis_wall*((ta + 273.15 + tw*sin(azis*(pi/180)))**4)* &
1286 viktwall*(1 - f_sh)*cos(betasun)*0.5
1287 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*f_sh*0.5
1290 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1294 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1296 lsky = ((svfs + svfsveg - 1)*lsky_allsky)*viktsky*0.5
1297 lveg = sbc*emis_wall*((ta + 273.15)**4)*viktveg*0.5
1299 lrefl = (ldown2d + lup2d)*(viktrefl)*(1 - emis_wall)*0.5
1300 lsouth = lsky + lwallsun + lwallsh + lveg + lground + lrefl
1303 CALL lvikt_veg(svfw, svfwveg, svfwaveg, vikttot, &
1304 viktveg, viktsky, viktrefl, viktwall)
1306 IF (altitude > 0)
THEN
1307 alfab = atan(svfalfaw)
1308 betab = atan(tan((svfalfaw)*f_sh))
1309 betasun = ((alfab - betab)/2) + betab
1310 IF (azimuth > (360 - t) .OR. azimuth <= (180 - t))
THEN
1311 lwallsun = sbc*emis_wall*((ta + 273.15 + tw*sin(aziw*(pi/180)))**4)* &
1312 viktwall*(1 - f_sh)*cos(betasun)*0.5
1313 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*f_sh*0.5
1316 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1320 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1322 lsky = ((svfw + svfwveg - 1)*lsky_allsky)*viktsky*0.5
1323 lveg = sbc*emis_wall*((ta + 273.15)**4)*viktveg*0.5
1325 lrefl = (ldown2d + lup2d)*(viktrefl)*(1 - emis_wall)*0.5
1326 lwest = lsky + lwallsun + lwallsh + lveg + lground + lrefl
1329 CALL lvikt_veg(svfn, svfnveg, svfnaveg, vikttot, &
1330 viktveg, viktsky, viktrefl, viktwall)
1332 IF (altitude > 0)
THEN
1333 alfab = atan(svfalfan)
1334 betab = atan(tan((svfalfan)*f_sh))
1335 betasun = ((alfab - betab)/2) + betab
1336 IF (azimuth > (90 - t) .AND. azimuth <= (270 - t))
THEN
1337 lwallsun = sbc*emis_wall*((ta + 273.15 + tw*sin(azin*(pi/180)))**4)* &
1338 viktwall*(1 - f_sh)*cos(betasun)*0.5
1339 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*f_sh*0.5
1342 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1346 lwallsh = sbc*emis_wall*((ta + 273.15)**4)*viktwall*0.5
1348 lsky = ((svfn + svfnveg - 1)*lsky_allsky)*viktsky*0.5
1349 lveg = sbc*emis_wall*((ta + 273.15)**4)*viktveg*0.5
1351 lrefl = (ldown2d + lup2d)*(viktrefl)*(1 - emis_wall)*0.5
1352 lnorth = lsky + lwallsun + lwallsh + lveg + lground + lrefl
1354 DEALLOCATE (svfalfae)
1355 DEALLOCATE (svfalfas)
1356 DEALLOCATE (svfalfaw)
1357 DEALLOCATE (svfalfan)
1360 DEALLOCATE (betasun)
1361 DEALLOCATE (lground)
1364 DEALLOCATE (lsky_allsky)
1366 DEALLOCATE (lwallsh)
1367 DEALLOCATE (lwallsun)
1368 DEALLOCATE (viktonlywall)
1369 DEALLOCATE (viktaveg)
1370 DEALLOCATE (svfvegbu)
1374 SUBROUTINE lvikt_veg(isvf, isvfveg, isvfaveg, vikttot, & ! input
1375 viktveg, viktsky, viktrefl, viktwall)
1378 REAL(KIND(1D0)),
INTENT(in) :: vikttot
1379 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: isvf
1380 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: isvfveg
1381 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: isvfaveg
1382 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: viktveg
1383 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: viktsky
1384 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: viktrefl
1385 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: viktwall
1387 REAL(KIND(1D0)),
DIMENSION(1, 1) :: viktonlywall
1388 REAL(KIND(1D0)),
DIMENSION(1, 1) :: viktaveg
1389 REAL(KIND(1D0)),
DIMENSION(1, 1) :: svfvegbu
1399 viktonlywall = (vikttot - &
1400 (63.227*isvf**6 - 161.51*isvf**5 + 156.91*isvf**4 &
1401 - 70.424*isvf**3 + 16.773*isvf**2 - 0.4863*isvf))/vikttot
1403 viktaveg = (vikttot &
1404 - (63.227*isvfaveg**6 - 161.51*isvfaveg**5 &
1405 + 156.91*isvfaveg**4 - 70.424*isvfaveg**3 &
1406 + 16.773*isvfaveg**2 - 0.4863*isvfaveg))/vikttot
1408 viktwall = viktonlywall - viktaveg
1410 svfvegbu = (isvfveg + isvf - 1)
1411 viktsky = (63.227*svfvegbu**6 - 161.51*svfvegbu**5 &
1412 + 156.91*svfvegbu**4 - 70.424*svfvegbu**3 &
1413 + 16.773*svfvegbu**2 - 0.4863*svfvegbu)/vikttot
1414 viktrefl = (vikttot &
1415 - (63.227*svfvegbu**6 - 161.51*svfvegbu**5 &
1416 + 156.91*svfvegbu**4 - 70.424*svfvegbu**3 &
1417 + 16.773*svfvegbu**2 - 0.4863*svfvegbu))/vikttot
1418 viktveg = (vikttot &
1419 - (63.227*svfvegbu**6 - 161.51*svfvegbu**5 &
1420 + 156.91*svfvegbu**4 - 70.424*svfvegbu**3 &
1421 + 16.773*svfvegbu**2 - 0.4863*svfvegbu))/vikttot
1422 viktveg = viktveg - viktwall
1533 REAL(KIND(1D0)),
INTENT(in) :: azimuth, altitude, scale
1534 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: shadow
1536 REAL(KIND(1D0)),
DIMENSION(1, 1) :: a
1538 REAL(KIND(1D0)),
PARAMETER :: pi = 3.141592653589793
1539 REAL(KIND(1D0)),
PARAMETER :: maxpos = 10000000000.0
1541 REAL(KIND(1D0)) :: degrees, azi, alt, dx, dy, dz, ds, absdx, absdy
1542 REAL(KIND(1D0)) :: amaxvalue, pibyfour, threetimespibyfour, fivetimespibyfour
1543 REAL(KIND(1D0)) :: seventimespibyfour, sinazimuth, cosazimuth, tanazimuth
1544 REAL(KIND(1D0)) :: signsinazimuth, signcosazimuth, dssin, dscos, tanaltitudebyscale
1545 INTEGER :: index, xc1, xc2, yc1, yc2, xp1, xp2, yp1, yp2
1547 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: temp, f
1562 azi = min(azimuth, 0 - 0.0001)*degrees
1563 alt = min(altitude, 90 - 0.0001)*degrees
1566 ALLOCATE (temp(1, 1))
1580 amaxvalue = maxval(a)
1582 threetimespibyfour = 3.*pibyfour
1583 fivetimespibyfour = 5.*pibyfour
1584 seventimespibyfour = 7.*pibyfour
1585 sinazimuth = sin(azi)
1586 cosazimuth = cos(azi)
1587 tanazimuth = tan(azi)
1588 CALL issign(sinazimuth, maxpos, signsinazimuth)
1589 CALL issign(cosazimuth, maxpos, signcosazimuth)
1592 dssin = abs(1./sinazimuth)
1593 dscos = abs(1./cosazimuth)
1594 tanaltitudebyscale = tan(alt)/scale
1597 DO WHILE (amaxvalue >= dz .AND. abs(dx) <= 1 .AND. abs(dy) <= 1)
1599 IF ((pibyfour <= azi .AND. azi < threetimespibyfour) .OR. (fivetimespibyfour <= azi .AND. azi < seventimespibyfour))
THEN
1600 dy = signsinazimuth*index
1601 dx = -1.*signcosazimuth*abs(nint(index/tanazimuth))
1604 dy = signsinazimuth*abs(nint(index*tanazimuth))
1605 dx = -1.*signcosazimuth*index
1609 dz = ds*index*tanaltitudebyscale
1615 xc1 = int((dx + absdx)/2) + 1
1616 xc2 = (1 + int((dx - absdx)/2))
1617 yc1 = int((dy + absdy)/2) + 1
1618 yc2 = (1 + int((dy - absdy)/2))
1619 xp1 = -int((dx - absdx)/2) + 1
1620 xp2 = (1 - int((dx + absdx)/2))
1621 yp1 = -int((dy - absdy)/2) + 1
1622 yp2 = (1 - int((dy + absdy)/2))
1624 temp(xp1:xp2, yp1:yp2) = a(xc1:xc2, yc1:yc2) - dz
1871 INTEGER :: first, second
1873 REAL(KIND(1D0)),
INTENT(in) :: iazimuthA
1874 REAL(KIND(1D0)),
INTENT(in) :: scale
1875 REAL(KIND(1D0)),
INTENT(in) :: psi
1877 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(in) :: buildings
1878 REAL(KIND(1D0)),
DIMENSION(1, 1),
INTENT(out) :: sos
1880 REAL(KIND(1D0)),
DIMENSION(1, 1) :: sunwall
1882 REAL(KIND(1D0)),
DIMENSION(1, 1) :: sh, vegsh
1884 REAL(KIND(1D0)) :: iazimuth, sinazimuth, cosazimuth, tanazimuth
1885 INTEGER :: index, xc1, xc2, yc1, yc2, xp1, xp2, yp1, yp2, n
1886 REAL(KIND(1D0)) :: dx, dy, ds, absdx, absdy
1887 REAL(KIND(1D0)) :: pibyfour, threetimespibyfour, fivetimespibyfour
1888 REAL(KIND(1D0)) :: seventimespibyfour
1889 REAL(KIND(1D0)) :: signsinazimuth, signcosazimuth, dssin, dscos
1890 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: weightsumwall, weightsumsh, gvf1, gvf2
1891 REAL(KIND(1D0)),
ALLOCATABLE,
DIMENSION(:, :) :: f, tempsh, tempbu, tempbub, tempwallsun, tempb, sh1
1893 REAL(KIND(1D0)),
PARAMETER :: pi = 3.141592653589793
1894 REAL(KIND(1D0)),
PARAMETER :: maxpos = 10000000000.0
1896 ALLOCATE (weightsumwall(1, 1))
1897 ALLOCATE (weightsumsh(1, 1))
1898 ALLOCATE (gvf1(1, 1))
1899 ALLOCATE (gvf2(1, 1))
1901 ALLOCATE (tempsh(1, 1))
1902 ALLOCATE (tempbu(1, 1))
1903 ALLOCATE (tempbub(1, 1))
1904 ALLOCATE (tempwallsun(1, 1))
1905 ALLOCATE (tempb(1, 1))
1906 ALLOCATE (sh1(1, 1))
1908 iazimuth = iazimutha*(pi/180)
1910 IF (iazimuth == 0)
THEN
1911 iazimuth = iazimuth + 0.000001
1922 sh1 = sh - (1 - vegsh)*(1 - psi)
1933 weightsumwall = 0.0d0
1935 first = int(real(first, kind(1d0))*scale)
1936 second = int(real(second, kind(1d0))*scale)
1940 threetimespibyfour = 3.*pibyfour
1941 fivetimespibyfour = 5.*pibyfour
1942 seventimespibyfour = 7.*pibyfour
1943 sinazimuth = sin(iazimuth)
1944 cosazimuth = cos(iazimuth)
1945 tanazimuth = tan(iazimuth)
1946 CALL issign(sinazimuth, maxpos, signsinazimuth)
1947 CALL issign(cosazimuth, maxpos, signcosazimuth)
1950 dssin = abs(1./sinazimuth)
1951 dscos = abs(1./cosazimuth)
1955 IF ((pibyfour <= iazimuth .AND. iazimuth < threetimespibyfour) &
1956 .OR. (fivetimespibyfour <= iazimuth .AND. iazimuth < seventimespibyfour))
THEN
1957 dy = signsinazimuth*index
1958 dx = -1.*signcosazimuth*abs(nint(index/tanazimuth))
1961 dy = signsinazimuth*abs(nint(index*tanazimuth))
1962 dx = -1.*signcosazimuth*index
1969 xc1 = int((dx + absdx)/2) + 1
1970 xc2 = (1 + int((dx - absdx)/2))
1971 yc1 = int((dy + absdy)/2) + 1
1972 yc2 = (1 + int((dy - absdy)/2))
1973 xp1 = -int((dx - absdx)/2) + 1
1974 xp2 = (1 - int((dx + absdx)/2))
1975 yp1 = -int((dy - absdy)/2) + 1
1976 yp2 = (1 - int((dy + absdy)/2))
1978 tempbu(xp1:xp2, yp1:yp2) = buildings(xc1:xc2, yc1:yc2)
1980 tempsh(xp1:xp2, yp1:yp2) = sh1(xc1:xc2, yc1:yc2)
1983 weightsumsh = weightsumsh + tempsh*f
1985 tempwallsun(xp1:xp2, yp1:yp2) = sunwall(xc1:xc2, yc1:yc2)
1986 tempb = tempwallsun*f
1987 WHERE ((tempb + tempbub) > 0)
1991 weightsumwall = weightsumwall + tempbub
1993 IF (index*scale == first)
THEN
1994 gvf1 = (weightsumwall + weightsumsh)/first
2002 gvf2 = (weightsumsh + weightsumwall)/second
2008 sos = (gvf1*0.5 + gvf2*0.4)/0.9
2010 DEALLOCATE (weightsumwall)
2011 DEALLOCATE (weightsumsh)
2017 DEALLOCATE (tempbub)
2018 DEALLOCATE (tempwallsun)