FV3-JEDI
fv3jedi_geom_iter_mod.F90
Go to the documentation of this file.
1 !
2 ! (C) Copyright 2019 UCAR
3 !
4 ! This software is licensed under the terms of the Apache Licence Version 2.0
5 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6 
8 
9  use iso_c_binding
10  use kinds
13 
14  implicit none
15 
16  private
17  public :: fv3jedi_geom_iter
21 
23  type(fv3jedi_geom), pointer :: geom => null() !< Geometry
24  integer :: iind = 1 !< index e.g. lat(iind,jind)
25  integer :: jind = 1 !<
26  end type fv3jedi_geom_iter
27 
28 #define LISTED_TYPE fv3jedi_geom_iter
29 
30  !> Linked list interface - defines registry_t type
31 #include "oops/util/linkedList_i.f"
32 
33  !> Global registry
34  type(registry_t) :: fv3jedi_geom_iter_registry
35 
36 contains
37 
38  ! ------------------------------------------------------------------------------
39  ! Public
40  ! ------------------------------------------------------------------------------
41 
42  !> Linked list implementation
43 #include "oops/util/linkedList_c.f"
44 
45  ! ------------------------------------------------------------------------------
46  !> Setup for the geometry iterator
47  subroutine fv3jedi_geom_iter_setup(self, geom, iind, jind)
48 
49  ! Passed variables
50  type(fv3jedi_geom_iter), intent(inout) :: self !< Geometry iterator
51  type(fv3jedi_geom), pointer, intent( in) :: geom !< Geometry
52  integer, intent( in) :: iind, jind !< Index
53 
54  ! Associate geometry
55  self%geom => geom
56 
57  ! Define iind/jind for local tile
58  self%iind = iind
59  self%jind = jind
60 
61  end subroutine fv3jedi_geom_iter_setup
62 
63  ! ------------------------------------------------------------------------------
64  !> Clone for the geometry iterator
65  subroutine fv3jedi_geom_iter_clone(self, other)
66 
67  ! Passed variables
68  type(fv3jedi_geom_iter), intent(inout) :: self !< Geometry iterator
69  type(fv3jedi_geom_iter), intent( in) :: other !< Other geometry iterator
70 
71  ! Associate geometry
72  self%geom => other%geom
73 
74  ! Copy iind/jind
75  self%iind = other%iind
76  self%jind = other%jind
77 
78  end subroutine fv3jedi_geom_iter_clone
79 
80  ! ------------------------------------------------------------------------------
81  !> Check for the geometry iterator equality
82  subroutine fv3jedi_geom_iter_equals(self, other, equals)
83 
84  ! Passed variables
85  type(fv3jedi_geom_iter), intent( in) :: self !< Geometry iterator
86  type(fv3jedi_geom_iter), intent( in) :: other !< Other geometry iterator
87  integer, intent(out) :: equals !< Equality flag
88 
89  ! Initialization
90  equals = 0
91 
92  ! Check equality
93  if (associated(self%geom, other%geom) .and. (self%iind==other%iind) .and. (self%jind==other%jind)) equals = 1
94 
95  end subroutine fv3jedi_geom_iter_equals
96 
97  ! ------------------------------------------------------------------------------
98  !> Get geometry iterator current lat/lon
99  subroutine fv3jedi_geom_iter_current(self, lon, lat)
100 
101  ! Passed variables
102  type(fv3jedi_geom_iter), intent( in) :: self !< Geometry iterator
103  real(kind_real), intent(out) :: lat !< Latitude
104  real(kind_real), intent(out) :: lon !< Longitude
105 
106  ! Check iind/jind
107  if (self%iind == -1 .AND. self%jind == -1) then
108  ! special case of {-1,-1} means end of the grid
109  lat = self%geom%grid_lat(self%geom%iec,self%geom%jec)
110  lon = self%geom%grid_lon(self%geom%iec,self%geom%jec)
111  elseif (self%iind < self%geom%isc .OR. self%iind > self%geom%iec .OR. &
112  self%jind < self%geom%jsc .OR. self%jind > self%geom%jec) then
113  ! outside of the grid
114  call abor1_ftn('fv3jedi_geom_iter_current: iterator out of bounds')
115  else
116  ! inside of the grid
117  lat = self%geom%grid_lat(self%iind,self%jind)
118  lon = self%geom%grid_lon(self%iind,self%jind)
119  endif
120 
121  !convert to degrees from radians
122  lat = rad2deg*lat
123  lon = rad2deg*lon
124 
125  end subroutine fv3jedi_geom_iter_current
126 
127  ! ------------------------------------------------------------------------------
128  !> Update geometry iterator to next point
129  subroutine fv3jedi_geom_iter_next(self)
130 
131  ! Passed variables
132  type(fv3jedi_geom_iter), intent(inout) :: self !< Geometry iterator
133  integer :: iind, jind
134 
135  iind = self%iind
136  jind = self%jind
137 
138  ! increment by 1
139  if (iind.lt.self%geom%iec) then
140  iind = iind + 1
141  elseif (iind.eq.self%geom%iec) then
142  iind = self%geom%isc
143  jind = jind + 1
144  end if
145 
146  if (jind > self%geom%jec) then
147  iind=-1
148  jind=-1
149  end if
150 
151  self%iind = iind
152  self%jind = jind
153 
154  end subroutine fv3jedi_geom_iter_next
155  ! ------------------------------------------------------------------------------
156 
157 end module fv3jedi_geom_iter_mod
fv3jedi_geom_iter_mod
Definition: fv3jedi_geom_iter_mod.F90:7
fv3jedi_constants_mod::rad2deg
real(kind=kind_real), parameter, public rad2deg
Definition: fv3jedi_constants_mod.f90:13
fv3jedi_geom_iter_mod::fv3jedi_geom_iter_current
subroutine, public fv3jedi_geom_iter_current(self, lon, lat)
Get geometry iterator current lat/lon.
Definition: fv3jedi_geom_iter_mod.F90:100
fv3jedi_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_geom_iter_mod::fv3jedi_geom_iter
Definition: fv3jedi_geom_iter_mod.F90:22
fv3jedi_geom_iter_mod::fv3jedi_geom_iter_clone
subroutine, public fv3jedi_geom_iter_clone(self, other)
Clone for the geometry iterator.
Definition: fv3jedi_geom_iter_mod.F90:66
fv3jedi_geom_iter_mod::fv3jedi_geom_iter_setup
subroutine, public fv3jedi_geom_iter_setup(self, geom, iind, jind)
Linked list implementation.
Definition: fv3jedi_geom_iter_mod.F90:48
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_constants_mod
Definition: fv3jedi_constants_mod.f90:6
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
fv3jedi_geom_iter_mod::fv3jedi_geom_iter_next
subroutine, public fv3jedi_geom_iter_next(self)
Update geometry iterator to next point.
Definition: fv3jedi_geom_iter_mod.F90:130
fv3jedi_geom_iter_mod::fv3jedi_geom_iter_equals
subroutine, public fv3jedi_geom_iter_equals(self, other, equals)
Check for the geometry iterator equality.
Definition: fv3jedi_geom_iter_mod.F90:83
fv3jedi_geom_iter_mod::fv3jedi_geom_iter_registry
type(registry_t), public fv3jedi_geom_iter_registry
Linked list interface - defines registry_t type.
Definition: fv3jedi_geom_iter_mod.F90:34