Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / da / da_tools / da_llxy.inc
blob36a0d810a0dc66a660f28bf42dfbbbd4b99c236f
1 subroutine da_llxy (info, loc, outside, outside_all)
3    !-----------------------------------------------------------------------
4    ! Purpose: TBD
5    !    Updated for Analysis on Arakawa-C grid
6    !    Author: Syed RH Rizvi,  MMM/ESSL/NCAR,  Date: 10/22/2008
7    !-----------------------------------------------------------------------
9    ! This routine converts (lat, lon) into (x,y) coordinates
11    implicit none
13    type(info_type),       intent(in)    :: info
14    type(model_loc_type),  intent(inout) :: loc
15    logical      ,         intent(out)   :: outside      !wrt local domain
16    logical, optional,     intent(out)   :: outside_all  !wrt all domains
18    ! too many return statments to trace
19    ! if (trace_use_frequent) call da_trace_entry("da_llxy")
21    outside = .false.
22    loc % x   = -1.0
23    loc % y   = -1.0
24    
25    ! get the (x, y) coordinates
27    if ( fg_format == fg_format_wrf_arw_regional ) then
28       call da_llxy_wrf(map_info, info%lat, info%lon, loc%x, loc%y)
29    else if (fg_format == fg_format_wrf_nmm_regional) then
30       call da_llxy_rotated_latlon(info%lat, info%lon, map_info, loc%x, loc%y)
31    else if (global) then
32       call da_llxy_global (info%lat, info%lon, loc%x, loc%y)
33    else
34       call da_llxy_default (info%lat, info%lon, loc%x, loc%y)
35    end if
37 #ifdef A2C
38    call da_togrid (loc%x, its-3, ite+3, loc%i, loc%dx, loc%dxm)!
40    call da_togrid (loc%y, jts-3, jte+3, loc%j, loc%dy, loc%dym)
41 #else
42    call da_togrid (loc%x, its-2, ite+2, loc%i, loc%dx, loc%dxm)!
44    call da_togrid (loc%y, jts-2, jte+2, loc%j, loc%dy, loc%dym)
46 #endif
47    ! refactor to remove this ugly duplication later
48    if (present(outside_all)) then
49       outside_all = .false.
50       ! Do not check for global options 
51       if (.not. global) then 
52          if ((int(loc%x) < ids) .or. (int(loc%x) > ide) .or. &
53             (int(loc%y) < jds) .or. (int(loc%y) > jde)) then
54             outside_all = .true. 
55             outside = .true. 
56             return
57          end if
58          if (def_sub_domain) then
59             if (x_start_sub_domain > loc%x .or. y_start_sub_domain > loc%y .or. &
60                 x_end_sub_domain   < loc%x .or. y_end_sub_domain   < loc%y) then
61                outside_all = .true.
62             outside = .true. 
63             return
64             end if
65          end if
66       end if
67    end if
69    if (fg_format == fg_format_kma_global) then
70       if ((loc%j < jts-1) .or. (loc%j > jte)) then
71          outside = .true.
72          return
73       end if
75       if (loc%j == jde) then
76          loc%j = loc%j - 1
77          loc%dy  = 1.0
78          loc%dym = 0.0
79       end if
81       return
82    end if
84    ! Check for edge of domain:
86    if ((loc%i < ids) .or. (loc%i >= ide) .or. &
87       (loc%j < jds) .or. (loc%j >= jde)) then
88       outside     = .true. 
89       return
90    end if
92    ! FIX? hack
93 #ifdef A2C
94 !rizviupdt   if ((loc%i < its-1) .or. (loc%i > ite) .or. &
95 !rizviupdt      (loc%j < jts-1) .or. (loc%j > jte)) then
96    if ((loc%i < its-2) .or. (loc%i > ite) .or. &
97       (loc%j < jts-2) .or. (loc%j > jte)) then
98 #else
99    if ((loc%i < its-1) .or. (loc%i > ite) .or. &
100       (loc%j < jts-1) .or. (loc%j > jte)) then
101 #endif
102    ! if ((loc%i < its-1) .or. (loc%i >= ite) .or. &
103    !     (loc%j < jts-1) .or. (loc%j >= jte)) then
104       outside = .true.
105       return
107       if (def_sub_domain) then
108          if (x_start_sub_domain > loc%x .or. y_start_sub_domain > loc%y .or. &
109              x_end_sub_domain   < loc%x .or. y_end_sub_domain   < loc%y) then
110              outside = .true.
111          end if
112       end if
113    end if
115    ! if (trace_use_frequent) call da_trace_exit("da_llxy")
117 end subroutine da_llxy