Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / da / da_tools / da_llxy_new.inc
blob144c4fe0d46af71847cb1d40cff5b454e2c2c415
1 subroutine da_llxy_new (info, outside, outside_all)
3    !-----------------------------------------------------------------------
4    ! Purpose: TBD
5    !-----------------------------------------------------------------------
7    ! This routine converts (lat, lon) into (x,y) coordinates
9    implicit none
11    type(infa_type),   intent(inout) :: info
12    logical,           intent(inout) :: outside(:,:)      ! wrt local domain
13    logical, optional, intent(out)   :: outside_all(:,:)  ! wrt all domains
15    if (trace_use) call da_trace_entry("da_llxy_new")
17    outside(:,:) = .false.
18    info%x(:,:)   = -1.0
19    info%y(:,:)   = -1.0
20    
21    ! get the (x, y) coordinates
23    if (fg_format == fg_format_wrf_arw_regional) then
24       call da_llxy_wrf_new(map_info, info)
25    else if (fg_format == fg_format_wrf_nmm_regional) then
26       write(unit=message(1),fmt='(A,I5)') &
27          "Needs to be developed for fg_format_nmm_regional = ",fg_format
28       call da_error(__FILE__,__LINE__,message(1:1))
29    else if (global) then
30       call da_llxy_global_new (info)
31    else
32       call da_llxy_default_new (info)
33    end if
35    call da_togrid_new (info%x, its-2, ite+2, info%i, info%dx, info%dxm)
36    call da_togrid_new (info%y, jts-2, jte+2, info%j, info%dy, info%dym)
38    ! refactor to remove this ugly duplication later
39    if (present(outside_all)) then
40       outside_all(:,:) = .false.
41       ! Do not check for global options 
42       if (.not. global) then 
43          where ((int(info%x(:,:)) < ids) .or. (int(info%x(:,:)) >= ide) .or. &
44             (int(info%y(:,:)) < jds) .or. (int(info%y(:,:)) >= jde))
45             outside_all(:,:) = .true. 
46             outside(:,:) = .true. 
47          end where
48          if (def_sub_domain) then
49             where (x_start_sub_domain > info%x(:,:) .or. y_start_sub_domain > info%y(:,:) .or. &
50                 x_end_sub_domain   < info%x(:,:) .or. y_end_sub_domain   < info%y(:,:))
51                outside_all(:,:) = .true.
52                outside(:,:) = .true. 
53             end where
54          end if
55       end if
56    end if
58    if (fg_format == fg_format_kma_global) then
59       where ((info%j(:,:) < jts-1) .or. (info%j(:,:)  > jte))
60          outside(:,:) = .true.
61       end where
63       where (info%j(:,:) == jde)
64          info%j(:,:) = info%j(:,:) - 1
65          info%dy(:,:)  = 1.0
66          info%dym(:,:) = 0.0
67       end where
69       return
70    end if
72    ! Check for edge of domain:
74    where ((info%i(:,:) < ids) .or. (info%i(:,:) >= ide) .or. &
75       (info%j(:,:) < jds) .or. (info%j(:,:) >= jde))
76       outside     = .true. 
77    end where
79    ! FIX? hack
80    where ((info%i(:,:) < its-1) .or. (info%i(:,:) > ite) .or. &
81       (info%j(:,:) < jts-1) .or. (info%j(:,:) > jte))
82       outside(:,:) = .true.
83    end where
85    if (def_sub_domain) then
86       where (x_start_sub_domain > info%x(:,:) .or. y_start_sub_domain > info%y(:,:) .or. &
87              x_end_sub_domain   < info%x(:,:) .or. y_end_sub_domain   < info%y(:,:))
88          outside = .true.
89       end where 
90    end if
92    if (trace_use) call da_trace_exit("da_llxy_new")
94 end subroutine da_llxy_new