7 PZS,PZS_XY,ZXHAT_ll,ZYHAT_ll,IIOR_ll, &
8 IJOR_ll,ZZS_ll,ZZS_XY_ll,PDIRSWDT,PDIRSRFSWD)
56 REAL,
DIMENSION(:,:),
INTENT(IN) :: PMAP
57 REAL,
DIMENSION(:),
INTENT(IN) :: PXHAT
58 REAL,
DIMENSION(:),
INTENT(IN) :: PYHAT
59 REAL,
DIMENSION(:,:),
INTENT(IN) :: PCOSZEN
60 REAL,
DIMENSION(:,:),
INTENT(IN) :: PSINZEN
61 REAL,
DIMENSION(:,:),
INTENT(IN) :: PAZIMSOL
62 REAL,
DIMENSION(:,:),
INTENT(IN) :: PZS
63 REAL,
DIMENSION(:,:),
INTENT(IN) :: PZS_XY
64 REAL,
DIMENSION(:),
INTENT(IN) :: ZXHAT_ll
65 REAL,
DIMENSION(:),
INTENT(IN) :: ZYHAT_ll
66 INTEGER,
INTENT(IN) :: IIOR_ll
69 INTEGER,
INTENT(IN) :: IJOR_ll
71 REAL,
DIMENSION(:,:),
INTENT(IN) :: ZZS_ll
73 REAL,
DIMENSION(:,:),
INTENT(IN) :: ZZS_XY_ll
77 REAL,
DIMENSION(:,:,:,:),
INTENT(INOUT):: PDIRSWDT
79 REAL,
DIMENSION(:,:,:),
INTENT(OUT) :: PDIRSRFSWD
84 REAL,
PARAMETER :: XRADIUS = 6371229.
85 REAL,
PARAMETER :: XPI = 4.*atan(1.)
86 INTEGER,
PARAMETER :: JPHEXT = 1
92 INTEGER :: IIB, IIE, IJB, IJE
112 REAL,
DIMENSION(3) :: ZXT
113 REAL,
DIMENSION(3) :: ZYT
114 REAL,
DIMENSION(3) :: ZZT
115 REAL,
DIMENSION(3) :: ZAT
116 REAL,
DIMENSION(3) :: ZBT
121 INTEGER :: IIU_ll, IJU_ll
122 INTEGER :: IIB_ll, IIE_ll, IJB_ll, IJE_ll
123 INTEGER :: IIMAX_ll, IJMAX_ll
124 INTEGER :: JI_ll, JJ_ll
125 INTEGER :: II_ll, IJ_ll
135 iimax_ll=
SIZE(zxhat_ll)-2*jphext
136 ijmax_ll=
SIZE(zyhat_ll)-2*jphext
137 iiu_ll = iimax_ll+2*jphext
138 iju_ll = ijmax_ll+2*jphext
140 iie_ll = iiu_ll - jphext
142 ije_ll = iju_ll - jphext
145 iie =
SIZE(pxhat) - jphext
147 ije =
SIZE(pyhat) - jphext
153 zzs_max_ll=maxval(zzs_ll)
155 lsphere=any(pmap(iib:iie,ijb:ije)/=pmap(iib,ijb))
170 IF (pcoszen(ji,jj)<0.) cycle
175 IF (pcoszen(ji,jj)==1.) cycle
185 zcoszen =pcoszen(ji,jj)
190 zsinzen =psinzen(ji,jj)
195 zazim=pazimsol(ji,jj)
199 zazim = xpi/2. - zazim
208 ji_ll = ji + iior_ll - 1
209 jj_ll = jj + ijor_ll - 1
220 IF (all(pdirswdt(ji,jj,jt,:)==0.)) cycle
226 zx=(5.*pxhat(ji)+pxhat(ji+1))/6.
227 zy=0.5*(pyhat(jj)+pyhat(jj+1))
228 zz=(pzs(ji,jj)+pzs_xy(ji,jj)+pzs_xy(ji,jj+1))/3.
230 zx=0.5*(pxhat(ji)+pxhat(ji+1))
231 zy=(5.*pyhat(jj+1)+pyhat(jj))/6.
232 zz=(pzs(ji,jj)+pzs_xy(ji,jj+1)+pzs_xy(ji+1,jj+1))/3.
234 zx=(5.*pxhat(ji+1)+pxhat(ji))/6.
235 zy=0.5*(pyhat(jj)+pyhat(jj+1))
236 zz=(pzs(ji,jj)+pzs_xy(ji+1,jj)+pzs_xy(ji+1,jj+1))/3.
238 zx=0.5*(pxhat(ji)+pxhat(ji+1))
239 zy=(5.*pyhat(jj)+pyhat(jj+1))/6.
240 zz=(pzs(ji,jj)+pzs_xy(ji,jj)+pzs_xy(ji+1,jj))/3.
257 DO jloop=1,2*(iiu_ll+iju_ll)
261 IF (zsinazim>0. .AND. zcosazim>0.)
THEN 262 zdy=(zyhat_ll(ij_ll+1)-zy)/zsinazim
263 zdx=(zxhat_ll(ii_ll+1)-zx)/zcosazim
264 ELSE IF (zsinazim<0. .AND. zcosazim>0.)
THEN 265 zdy=(zyhat_ll(ij_ll) -zy)/zsinazim
266 zdx=(zxhat_ll(ii_ll+1)-zx)/zcosazim
267 ELSE IF (zsinazim>0. .AND. zcosazim<0.)
THEN 268 zdy=(zyhat_ll(ij_ll+1)-zy)/zsinazim
269 zdx=(zxhat_ll(ii_ll) -zx)/zcosazim
270 ELSE IF (zsinazim<0. .AND. zcosazim<0.)
THEN 271 zdy=(zyhat_ll(ij_ll) -zy)/zsinazim
272 zdx=(zxhat_ll(ii_ll) -zx)/zcosazim
273 ELSE IF (zsinazim==0. .AND. zcosazim<0.)
THEN 274 zdx=-(zxhat_ll(ii_ll) -zx)
276 ELSE IF (zsinazim==0. .AND. zcosazim>0.)
THEN 277 zdx=(zxhat_ll(ii_ll+1)-zx)
279 ELSE IF (zsinazim<0. .AND. zcosazim==0.)
THEN 280 zdy=-(zyhat_ll(ij_ll) -zy)
282 ELSE IF (zsinazim>0. .AND. zcosazim==0.)
THEN 283 zdy=(zyhat_ll(ij_ll+1)-zy)
288 zx = zx + zdy * zcosazim
289 zy = zy + zdy * zsinazim
290 zz = zz + zdy * zcoszen / pmap(ji,jj) / zsinzen
291 IF (zsinazim>0.)
THEN 297 zx = zx + zdx * zcosazim
298 zy = zy + zdx * zsinazim
299 zz = zz + zdx * zcoszen / pmap(ji,jj) / zsinzen
300 IF (zcosazim>0.)
THEN 309 IF (lsphere) zzcurv = ((zz-zzi)*zsinzen/zcoszen)**2 &
314 IF (zz > zzs_max_ll-zzcurv)
EXIT 318 IF ( ii_ll<iib_ll .OR. ii_ll>iie_ll &
319 .OR. ij_ll<ijb_ll .OR. ij_ll>ije_ll )
EXIT 324 IF (.NOT. ( zzs_ll(ii_ll ,ij_ll ) -zzcurv < zz .AND. &
325 zzs_xy_ll(ii_ll ,ij_ll ) -zzcurv < zz .AND. &
326 zzs_xy_ll(ii_ll+1,ij_ll ) -zzcurv < zz .AND. &
327 zzs_xy_ll(ii_ll ,ij_ll+1) -zzcurv < zz .AND. &
328 zzs_xy_ll(ii_ll+1,ij_ll+1) -zzcurv < zz ) )
THEN 334 zxt(1) =0.5*(zxhat_ll(ii_ll)+zxhat_ll(ii_ll+1))
335 zyt(1) =0.5*(zyhat_ll(ij_ll)+zyhat_ll(ij_ll+1))
336 zzt(1) =zzs_ll(ii_ll ,ij_ll ) - zzcurv
337 zxt(2) =zxhat_ll(ii_ll)
338 zyt(2) =zyhat_ll(ij_ll)
339 zzt(2) =zzs_xy_ll(ii_ll ,ij_ll ) - zzcurv
340 zxt(3) =zxhat_ll(ii_ll)
341 zyt(3) =zyhat_ll(ij_ll+1)
342 zzt(3) =zzs_xy_ll(ii_ll ,ij_ll+1) - zzcurv
343 CALL proj_solar(zxt(1),zyt(1),zzt(1),zat(1),zbt(1))
344 CALL proj_solar(zxt(2),zyt(2),zzt(2),zat(2),zbt(2))
345 CALL proj_solar(zxt(3),zyt(3),zzt(3),zat(3),zbt(3))
348 pdirswdt(ji,jj,jt,:)=0.
356 zxt(3) =zxhat_ll(ii_ll+1)
357 zyt(3) =zyhat_ll(ij_ll+1)
358 zzt(3) =zzs_xy_ll(ii_ll+1,ij_ll+1) - zzcurv
359 CALL proj_solar(zxt(3),zyt(3),zzt(3),zat(3),zbt(3))
362 pdirswdt(ji,jj,jt,:)=0.
370 zxt(3) =zxhat_ll(ii_ll+1)
371 zyt(3) =zyhat_ll(ij_ll)
372 zzt(3) =zzs_xy_ll(ii_ll+1,ij_ll ) - zzcurv
373 CALL proj_solar(zxt(3),zyt(3),zzt(3),zat(3),zbt(3))
376 pdirswdt(ji,jj,jt,:)=0.
384 zxt(3) =zxhat_ll(ii_ll)
385 zyt(3) =zyhat_ll(ij_ll)
386 zzt(3) =zzs_xy_ll(ii_ll ,ij_ll ) - zzcurv
387 CALL proj_solar(zxt(3),zyt(3),zzt(3),zat(3),zbt(3))
390 pdirswdt(ji,jj,jt,:)=0.
413 pdirsrfswd(ji,jj,:) = ( pdirswdt(ji,jj,1,:) &
414 + pdirswdt(ji,jj,2,:) &
415 + pdirswdt(ji,jj,3,:) &
416 + pdirswdt(ji,jj,4,:))&
427 REAL,
INTENT(IN) :: PX
428 REAL,
INTENT(IN) :: PY
429 REAL,
INTENT(IN) :: PZ
430 REAL,
INTENT(OUT) :: PA
431 REAL,
INTENT(OUT) :: PB
433 pa = zcoszen*zcosazim*px + zcoszen*zsinazim*py - zsinzen*pz
434 pb = - zsinazim*px + zcosazim*py
439 REAL,
DIMENSION(3),
INTENT(IN) :: PA
440 REAL,
DIMENSION(3),
INTENT(IN) :: PB
441 REAL,
INTENT(IN) :: PAD
442 REAL,
INTENT(IN) :: PBD
443 LOGICAL,
INTENT(OUT) :: OF
445 REAL :: ZC1, ZC2, ZC3
454 zc3=-pb(1)*pa(2)+pb(2)*pa(1)
456 IF ( (zc1*pad+zc2*pbd+zc3)*(zc1*pa(3)+zc2*pb(3)+zc3) <0.)
RETURN 462 zc3=-pb(3)*pa(2)+pb(2)*pa(3)
464 IF ( (zc1*pad+zc2*pbd+zc3)*(zc1*pa(1)+zc2*pb(1)+zc3) <0.)
RETURN 470 zc3=-pb(3)*pa(1)+pb(1)*pa(3)
472 IF ( (zc1*pad+zc2*pbd+zc3)*(zc1*pa(2)+zc2*pb(2)+zc3) <0.)
RETURN
subroutine proj_solar(PX, PY, PZ, PA, PB)
subroutine surf_solar_shadows(PMAP, PXHAT, PYHAT, PCOSZEN, PSINZEN, PAZIMSOL, PZS, PZS_XY, ZXHAT_ll, ZYHAT_ll, IIOR_ll, IJOR_ll, ZZS_ll, ZZS_XY_ll, PDIRSWDT, PDIRSRFSWD)
subroutine solar_interc(PA, PB, PAD, PBD, OF)