updated top-level README and version_decl for V4.5 (#1847)
[WRF.git] / var / da / da_radiance / da_get_satzen.inc
blobb522d24e62e77a47a07b055fe0dfea75d14d84d7
1 subroutine da_get_satzen ( lat,lon,sate_index,theta_true )
2 !-------------------------------------------------
3 ! Purpose: calculate geostationary satellite_zenith_angle
5 ! Menthod: Yang et al., 2017: Impact of assimilating GOES imager 
6 !          clear-sky radiance with a rapid refresh assimilation 
7 !          system for convection-permitting forecast over Mexico. 
8 !          J. Geophys. Res. Atmos., 122, 5472–5490
9 !-------------------------------------------------
11   implicit none
13   real,    intent(in)   :: lat,lon
14   integer, intent(in)   :: sate_index
15   real,    intent(out)  :: theta_true
17   real                  :: alat, alon, alon_sat
18   real                  :: theta, r_tmp, theta_tmp
21         alat = lat
22         alon = lon
24         if (sate_index .eq. 11) then
25            alon_sat = -135.*pi/180.
26         else if (sate_index .eq. 12) then
27            alon_sat = -60.*pi/180.
28         else if (sate_index .eq. 13) then
29            alon_sat = -75.*pi/180.
30         else if (sate_index .eq. 14) then
31            alon_sat = -105.*pi/180.
32         else if (sate_index .eq. 15) then
33            alon_sat = -135.*pi/180.
34         else
35            write(*,*)'this satellite is not included'
36            stop
37         end if
39         alat = alat*pi/180.
40         alon = alon*pi/180.
41         theta = abs(alon-alon_sat)
42         r_tmp = (2*earth_radius*sin(theta/2.)-earth_radius*(1-cos(alat))*sin(theta/2.))**2 &
43                 +(2*earth_radius*sin(alat/2.))**2-(earth_radius*(1-cos(alat))*sin(theta/2.))**2
44         r_tmp = sqrt(r_tmp)
45         theta_true = 2*asin(r_tmp/earth_radius/2.)
46         theta_tmp = atan(earth_radius*sin(theta_true)/(satellite_height+earth_radius*(1-sin(theta_true))))
47         theta_true = (theta_true+theta_tmp)*180./pi
49         return
51 end subroutine da_get_satzen