FV3-JEDI
fv3jedi_vc_coldstartwinds_mod.f90
Go to the documentation of this file.
1 ! (C) Copyright 2020 UCAR
2 !
3 ! This software is licensed under the terms of the Apache Licence Version 2.0
4 ! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5 
7 
8 ! fckit
9 use fckit_configuration_module, only: fckit_configuration
10 
11 ! fv3
12 use fv_arrays_mod, only: r_grid
13 use fv_grid_utils_mod, only: mid_pt_sphere, get_unit_vect2, get_latlon_vector, inner_prod
14 
15 ! fv3jedi
21 
22 implicit none
23 private
25 
27  integer :: isc, iec, jsc, jec
28  real(kind=kind_real), allocatable, dimension(:,:,:) :: grid
29  contains
30  procedure :: create
31  procedure :: delete
32  procedure :: changevar
34 
35 ! --------------------------------------------------------------------------------------------------
36 
37 contains
38 
39 ! --------------------------------------------------------------------------------------------------
40 
41 subroutine create(self, geom, conf)
42 
43 class(fv3jedi_vc_coldstartwinds), intent(inout) :: self
44 type(fv3jedi_geom), intent(in) :: geom
45 type(fckit_configuration), intent(in) :: conf
46 
47 allocate(self%grid(geom%isd:geom%ied+1,geom%jsd:geom%jed+1,2))
48 self%grid = geom%grid
49 
50 self%isc = geom%isc
51 self%iec = geom%iec
52 self%jsc = geom%jsc
53 self%jec = geom%jec
54 
55 end subroutine create
56 
57 ! --------------------------------------------------------------------------------------------------
58 
59 subroutine delete(self)
60 
61 class(fv3jedi_vc_coldstartwinds), intent(inout) :: self
62 
63 deallocate(self%grid)
64 
65 end subroutine delete
66 
67 ! --------------------------------------------------------------------------------------------------
68 
69 subroutine changevar(self, xin, xout)
70 
71 class(fv3jedi_vc_coldstartwinds), intent(inout) :: self
72 type(fv3jedi_state), intent(in) :: xin
73 type(fv3jedi_state), intent(inout) :: xout
74 
75 integer :: f
76 character(len=field_clen), allocatable :: fields_to_do(:)
77 real(kind=kind_real), pointer :: field_ptr(:,:,:)
78 
79 ! Winds
80 logical :: have_d_winds
81 integer :: i, j, k, levp
82 real(kind=kind_real), allocatable :: ud_cold(:,:,:) !u component D-grid
83 real(kind=kind_real), allocatable :: vd_cold(:,:,:) !v component D-grid
84 real(kind=kind_real), pointer :: u_w_cold(:,:,:)
85 real(kind=kind_real), pointer :: v_w_cold(:,:,:)
86 real(kind=kind_real), pointer :: u_s_cold(:,:,:)
87 real(kind=kind_real), pointer :: v_s_cold(:,:,:)
88 
89 real(kind=r_grid), dimension(2) :: p1, p2, p3
90 real(kind=r_grid), dimension(3) :: e1, e2, ex, ey
91 
92 ! Identity part of the change of variables
93 ! ----------------------------------------
94 call copy_subset(xin%fields, xout%fields, fields_to_do)
95 
96 
97 ! If variable change is the identity early exit
98 ! ---------------------------------------------
99 if (.not.allocated(fields_to_do)) return
100 
101 
102 ! D-Grid winds
103 ! ------------
104 have_d_winds = .false.
105 if ( xin%has_field('u_w_cold') .and. xin%has_field('v_w_cold') .and. &
106  xin%has_field('u_s_cold') .and. xin%has_field('v_s_cold') ) then
107 
108  call xin%get_field('u_w_cold', u_w_cold)
109  call xin%get_field('v_w_cold', v_w_cold)
110  call xin%get_field('u_s_cold', u_s_cold)
111  call xin%get_field('v_s_cold', v_s_cold)
112 
113  levp = size(u_w_cold,3)
114 
115  allocate(ud_cold(self%isc:self%iec, self%jsc:self%jec+1,1:levp))
116  allocate(vd_cold(self%isc:self%iec+1,self%jsc:self%jec, 1:levp))
117 
118  do k = 1, levp
119  do j = self%jsc, self%jec+1
120  do i = self%isc, self%iec
121  p1(:) = self%grid(i, j,1:2)
122  p2(:) = self%grid(i+1,j,1:2)
123  call mid_pt_sphere(p1, p2, p3)
124  call get_unit_vect2(p1, p2, e1)
125  call get_latlon_vector(p3, ex, ey)
126  ud_cold(i,j,k) = u_s_cold(i,j,k)*inner_prod(e1, ex) + v_s_cold(i,j,k)*inner_prod(e1, ey)
127  enddo
128  enddo
129  do j = self%jsc, self%jec
130  do i = self%isc, self%iec+1
131  p1(:) = self%grid(i,j ,1:2)
132  p2(:) = self%grid(i,j+1,1:2)
133  call mid_pt_sphere(p1, p2, p3)
134  call get_unit_vect2(p1, p2, e2)
135  call get_latlon_vector(p3, ex, ey)
136  vd_cold(i,j,k) = u_w_cold(i,j,k)*inner_prod(e2, ex) + v_w_cold(i,j,k)*inner_prod(e2, ey)
137  enddo
138  enddo
139  enddo
140 
141  have_d_winds = .true.
142 
143 endif
144 
145 
146 ! Loop over the fields not found in the input state and work through cases
147 ! ------------------------------------------------------------------------
148 do f = 1, size(fields_to_do)
149 
150  call xout%get_field(trim(fields_to_do(f)), field_ptr)
151 
152  select case (trim(fields_to_do(f)))
153 
154  case ("ud_cold")
155 
156  if (.not. have_d_winds) call field_fail(fields_to_do(f))
157  field_ptr = ud_cold
158 
159  case ("vd_cold")
160 
161  if (.not. have_d_winds) call field_fail(fields_to_do(f))
162  field_ptr = vd_cold
163 
164  case default
165 
166  call abor1_ftn("fv3jedi_vc_coldstartwinds_mod.changevar unknown field: "//trim(fields_to_do(f))&
167  //". Not in input field and no transform case specified.")
168 
169  end select
170 
171 enddo
172 
173 ! Copy calendar infomation
174 ! ------------------------
175 xout%calendar_type = xin%calendar_type
176 xout%date_init = xin%date_init
177 
178 end subroutine changevar
179 
180 ! --------------------------------------------------------------------------------------------------
181 
fv3jedi_state_mod::fv3jedi_state
Fortran derived type to hold FV3JEDI state.
Definition: fv3jedi_state_mod.F90:30
fv3jedi_field_mod
Definition: fv3jedi_field_mod.f90:6
fv3jedi_fieldfail_mod::field_fail
subroutine, public field_fail(field)
Definition: fv3jedi_fieldfail_mod.f90:14
fv3jedi_state_mod
Definition: fv3jedi_state_mod.F90:6
fv3jedi_field_mod::copy_subset
subroutine, public copy_subset(field_in, field_ou, not_copied)
Definition: fv3jedi_field_mod.f90:236
fv3jedi_geom_mod
Fortran module handling geometry for the FV3 model.
Definition: fv3jedi_geom_mod.f90:8
fv3jedi_vc_coldstartwinds_mod::fv3jedi_vc_coldstartwinds
Definition: fv3jedi_vc_coldstartwinds_mod.f90:26
fv3jedi_vc_coldstartwinds_mod
Definition: fv3jedi_vc_coldstartwinds_mod.f90:6
fv3jedi_geom_mod::fv3jedi_geom
Fortran derived type to hold geometry data for the FV3JEDI model.
Definition: fv3jedi_geom_mod.f90:46
fv3jedi_fieldfail_mod
Definition: fv3jedi_fieldfail_mod.f90:1
fv3jedi_vc_coldstartwinds_mod::changevar
subroutine changevar(self, xin, xout)
Definition: fv3jedi_vc_coldstartwinds_mod.f90:70
fv3jedi_kinds_mod::kind_real
integer, parameter, public kind_real
Definition: fv3jedi_kinds_mod.f90:14
fv3jedi_kinds_mod
Definition: fv3jedi_kinds_mod.f90:6
fv3jedi_vc_coldstartwinds_mod::delete
subroutine delete(self)
Definition: fv3jedi_vc_coldstartwinds_mod.f90:60
fv3jedi_vc_coldstartwinds_mod::create
subroutine create(self, geom, conf)
Definition: fv3jedi_vc_coldstartwinds_mod.f90:42
fv3jedi_field_mod::field_clen
integer, parameter, public field_clen
Definition: fv3jedi_field_mod.f90:31