FV3DYCORE  Version1.0.0
fv_iau_mod.F90
Go to the documentation of this file.
1 !***********************************************************************
2 !* GNU Lesser General Public License
3 !*
4 !* This file is part of the FV3 dynamical core.
5 !*
6 !* The FV3 dynamical core is free software: you can redistribute it
7 !* and/or modify it under the terms of the
8 !* GNU Lesser General Public License as published by the
9 !* Free Software Foundation, either version 3 of the License, or
10 !* (at your option) any later version.
11 !*
12 !* The FV3 dynamical core is distributed in the hope that it will be
13 !* useful, but WITHOUT ANYWARRANTY; without even the implied warranty
14 !* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 !* See the GNU General Public License for more details.
16 !*
17 !* You should have received a copy of the GNU Lesser General Public
18 !* License along with the FV3 dynamical core.
19 !* If not, see <http://www.gnu.org/licenses/>.
20 !***********************************************************************
21 
22 !-------------------------------------------------------------------------------
27 !
30 !-------------------------------------------------------------------------------
31 
32 #ifdef OVERLOAD_R4
33 #define _GET_VAR1 get_var1_real
34 #else
35 #define _GET_VAR1 get_var1_double
36 #endif
37 
38 module fv_iau_mod
39 
40  use fms_mod, only: file_exist
41  use mpp_mod, only: mpp_error, fatal, note, mpp_pe
42  use mpp_domains_mod, only: domain2d
43 
44  use constants_mod, only: pi=>pi_8
45  use fv_arrays_mod, only: fv_atmos_type, &
46  fv_grid_type, &
48  r_grid
49  use fv_mp_mod, only: is_master
50  use sim_nc_mod, only: open_ncfile, &
51  close_ncfile, &
52  get_ncdim1, &
54  get_var3_r4, &
56  use ipd_typedefs, only: ipd_init_type, ipd_control_type, &
57  kind_phys => ipd_kind_phys
58  use block_control_mod, only: block_control_type
60  use tracer_manager_mod, only: get_tracer_names,get_tracer_index, get_number_tracers
61  use field_manager_mod, only: model_atmos
62  implicit none
63 
64  private
65 
66  real,allocatable::s2c(:,:,:)
67 ! real:: s2c(Atm(1)%bd%is:Atm(1)%bd%ie,Atm(1)%bd%js:Atm(1)%bd%je,4)
68 ! integer, dimension(Atm(1)%bd%is:Atm(1)%bd%ie,Atm(1)%bd%js:Atm(1)%bd%je):: &
69 ! id1, id2, jdc
70  integer,allocatable,dimension(:,:) :: id1,id2,jdc
71 
72  real :: deg2rad,dt,rdt
73  integer :: im,jm,km,nfiles,ncid
74  integer :: is, ie, js, je
75  integer :: npz,ntracers
76  character(len=32), allocatable :: tracer_names(:)
77  integer, allocatable :: tracer_indicies(:)
78 
79  real(kind=4), allocatable:: wk3(:,:,:)
81  real,allocatable :: ua_inc(:,:,:)
82  real,allocatable :: va_inc(:,:,:)
83  real,allocatable :: temp_inc(:,:,:)
84  real,allocatable :: delp_inc(:,:,:)
85  real,allocatable :: delz_inc(:,:,:)
86  real,allocatable :: tracer_inc(:,:,:,:)
87  end type iau_internal_data_type
89  real,allocatable :: ua_inc(:,:,:)
90  real,allocatable :: va_inc(:,:,:)
91  real,allocatable :: temp_inc(:,:,:)
92  real,allocatable :: delp_inc(:,:,:)
93  real,allocatable :: delz_inc(:,:,:)
94  real,allocatable :: tracer_inc(:,:,:,:)
95  logical :: in_interval = .false.
96  end type iau_external_data_type
100  real(kind=kind_phys) :: hr1
101  real(kind=kind_phys) :: hr2
102  real(kind=kind_phys) :: wt
103  real(kind=kind_phys) :: wt_normfact
104  end type iau_state_type
107 
108 contains
109 subroutine iau_initialize (IPD_Control, IAU_Data,Init_parm)
110  type(ipd_control_type), intent(in) :: ipd_control
111  type(iau_external_data_type), intent(inout) :: iau_data
112  type(ipd_init_type), intent(in) :: init_parm
113  ! local
114 
115  character(len=128) :: fname
116  real, dimension(:,:,:), allocatable:: u_inc, v_inc
117  real, allocatable:: lat(:), lon(:),agrid(:,:,:)
118  real(kind=kind_phys) sx,wx,wt,normfact,dtp
119 
120  integer:: i, j, k, nstep, kstep
121  integer:: i1, i2, j1
122  integer:: jbeg, jend
123 
124  logical:: found
125  integer nfilesall
126  integer, allocatable :: idt(:)
127 
128  is = ipd_control%isc
129  ie = is + ipd_control%nx-1
130  js = ipd_control%jsc
131  je = js + ipd_control%ny-1
132  call get_number_tracers(model_atmos, num_tracers=ntracers)
133  allocate (tracer_names(ntracers))
134  allocate (tracer_indicies(ntracers))
135  do i = 1, ntracers
136  call get_tracer_names(model_atmos, i, tracer_names(i))
137  tracer_indicies(i) = get_tracer_index(model_atmos,tracer_names(i))
138  enddo
139  allocate(s2c(is:ie,js:je,4))
140  allocate(id1(is:ie,js:je))
141  allocate(id2(is:ie,js:je))
142  allocate(jdc(is:ie,js:je))
143  allocate(agrid(is:ie,js:je,2))
144 ! determine number of increment files to read, and the valid forecast hours
145 
146  nfilesall = size(ipd_control%iau_inc_files)
147  nfiles = 0
148  if (is_master()) print*,'in iau_init',trim(ipd_control%iau_inc_files(1)),ipd_control%iaufhrs(1)
149  do k=1,nfilesall
150  if (trim(ipd_control%iau_inc_files(k)) .eq. '' .or. ipd_control%iaufhrs(k) .lt. 0) exit
151  if (is_master()) then
152  print *,k,trim(adjustl(ipd_control%iau_inc_files(k)))
153  endif
154  nfiles = nfiles + 1
155  enddo
156  if (is_master()) print *,'nfiles = ',nfiles
157  if (nfiles < 1) then
158  return
159  endif
160  if (nfiles > 1) then
161  allocate(idt(nfiles-1))
162  idt = ipd_control%iaufhrs(2:nfiles)-ipd_control%iaufhrs(1:nfiles-1)
163  do k=1,nfiles-1
164  if (idt(k) .ne. ipd_control%iaufhrs(2)-ipd_control%iaufhrs(1)) then
165  print *,'forecast intervals in iaufhrs must be constant'
166  call mpp_error (fatal,' forecast intervals in iaufhrs must be constant')
167  endif
168  enddo
169  deallocate(idt)
170  endif
171  if (is_master()) print *,'iau interval = ',ipd_control%iau_delthrs,' hours'
172  dt = (ipd_control%iau_delthrs*3600.)
173  rdt = 1.0/dt
174 
175 ! set up interpolation weights to go from GSI's gaussian grid to cubed sphere
176  deg2rad = pi/180.
177 
178  npz = ipd_control%levs
179  fname = 'INPUT/'//trim(ipd_control%iau_inc_files(1))
180 
181  if( file_exist(fname) ) then
182  call open_ncfile( fname, ncid ) ! open the file
183  call get_ncdim1( ncid, 'lon', im)
184  call get_ncdim1( ncid, 'lat', jm)
185  call get_ncdim1( ncid, 'lev', km)
186 
187  if (km.ne.npz) then
188  if (is_master()) print *, 'km = ', km
189  call mpp_error(fatal, &
190  '==> Error in IAU_initialize: km is not equal to npz')
191  endif
192 
193  if(is_master()) write(*,*) fname, ' DA increment dimensions:', im,jm,km
194 
195  allocate ( lon(im) )
196  allocate ( lat(jm) )
197 
198  call _get_var1 (ncid, 'lon', im, lon )
199  call _get_var1 (ncid, 'lat', jm, lat )
200  call close_ncfile(ncid)
201 
202  ! Convert to radians
203  do i=1,im
204  lon(i) = lon(i) * deg2rad
205  enddo
206  do j=1,jm
207  lat(j) = lat(j) * deg2rad
208  enddo
209 
210  else
211  call mpp_error(fatal,'==> Error in IAU_initialize: Expected file '&
212  //trim(fname)//' for DA increment does not exist')
213  endif
214 
215  ! Initialize lat-lon to Cubed bi-linear interpolation coeff:
216  ! populate agrid
217 ! print*,'is,ie,js,je=',is,ie,js,ie
218 ! print*,'size xlon=',size(Init_parm%xlon(:,1)),size(Init_parm%xlon(1,:))
219 ! print*,'size agrid=',size(agrid(:,1,1)),size(agrid(1,:,1)),size(agrid(1,1,:))
220  do j = 1,size(init_parm%xlon,2)
221  do i = 1,size(init_parm%xlon,1)
222 ! print*,i,j,is-1+j,js-1+j
223  agrid(is-1+i,js-1+j,1)=init_parm%xlon(i,j)
224  agrid(is-1+i,js-1+j,2)=init_parm%xlat(i,j)
225  enddo
226  enddo
227  call remap_coef( is, ie, js, je, &
228  im, jm, lon, lat, id1, id2, jdc, s2c, &
229  agrid)
230  deallocate ( lon, lat,agrid )
231 
232 
233  allocate(iau_data%ua_inc(is:ie, js:je, km))
234  allocate(iau_data%va_inc(is:ie, js:je, km))
235  allocate(iau_data%temp_inc(is:ie, js:je, km))
236  allocate(iau_data%delp_inc(is:ie, js:je, km))
237  allocate(iau_data%delz_inc(is:ie, js:je, km))
238  allocate(iau_data%tracer_inc(is:ie, js:je, km,ntracers))
239 ! allocate arrays that will hold iau state
240  allocate (iau_state%inc1%ua_inc(is:ie, js:je, km))
241  allocate (iau_state%inc1%va_inc(is:ie, js:je, km))
242  allocate (iau_state%inc1%temp_inc (is:ie, js:je, km))
243  allocate (iau_state%inc1%delp_inc (is:ie, js:je, km))
244  allocate (iau_state%inc1%delz_inc (is:ie, js:je, km))
245  allocate (iau_state%inc1%tracer_inc(is:ie, js:je, km,ntracers))
246  iau_state%hr1=ipd_control%iaufhrs(1)
247  iau_state%wt = 1.0 ! IAU increment filter weights (default 1.0)
248  if (ipd_control%iau_filter_increments) then
249  ! compute increment filter weights, sum to obtain normalization factor
250  dtp=ipd_control%dtp
251  nstep = 0.5*ipd_control%iau_delthrs*3600/dtp
252  ! compute normalization factor for filter weights
253  normfact = 0.
254  do k=1,2*nstep+1
255  kstep = k-1-nstep
256  sx = acos(-1.)*kstep/nstep
257  wx = acos(-1.)*kstep/(nstep+1)
258  if (kstep .ne. 0) then
259  wt = sin(wx)/wx*sin(sx)/sx
260  else
261  wt = 1.0
262  endif
263  normfact = normfact + wt
264  if (is_master()) print *,'filter wts',k,kstep,wt
265  enddo
266  iau_state%wt_normfact = (2*nstep+1)/normfact
267  endif
268  call read_iau_forcing(ipd_control,iau_state%inc1,'INPUT/'//trim(ipd_control%iau_inc_files(1)))
269  if (nfiles.EQ.1) then ! only need to get incrments once since constant forcing over window
270  call setiauforcing(ipd_control,iau_data,iau_state%wt)
271  endif
272  if (nfiles.GT.1) then !have multiple files, but only read in 2 at a time and interpoalte between them
273  allocate (iau_state%inc2%ua_inc(is:ie, js:je, km))
274  allocate (iau_state%inc2%va_inc(is:ie, js:je, km))
275  allocate (iau_state%inc2%temp_inc (is:ie, js:je, km))
276  allocate (iau_state%inc2%delp_inc (is:ie, js:je, km))
277  allocate (iau_state%inc2%delz_inc (is:ie, js:je, km))
278  allocate (iau_state%inc2%tracer_inc(is:ie, js:je, km,ntracers))
279  iau_state%hr2=ipd_control%iaufhrs(2)
280  call read_iau_forcing(ipd_control,iau_state%inc2,'INPUT/'//trim(ipd_control%iau_inc_files(2)))
281  endif
282 ! print*,'in IAU init',dt,rdt
283 
284 end subroutine iau_initialize
285 
286 subroutine getiauforcing(IPD_Control,IAU_Data)
287 
288  implicit none
289  type(ipd_control_type), intent(in) :: ipd_control
290  type(iau_external_data_type), intent(inout) :: iau_data
291  real(kind=kind_phys) t1,t2,sx,wx,wt,dtp
292  integer n,i,j,k,sphum,kstep,nstep
293 
294  iau_data%in_interval=.false.
295  if (nfiles.LE.0) then
296  return
297  endif
298 
299  t1=iau_state%hr1 - ipd_control%iau_delthrs*0.5
300  t2=iau_state%hr1 + ipd_control%iau_delthrs*0.5
301  if (ipd_control%iau_filter_increments) then
302  ! compute increment filter weight
303  ! t1 beginning of window, t2 end of window
304  ! IPD_Control%fhour current time
305  ! in window kstep=-nstep,nstep (2*nstep+1 total)
306  ! time step IPD_control%dtp
307  dtp=ipd_control%dtp
308  nstep = 0.5*ipd_control%iau_delthrs*3600/dtp
309  ! compute normalized filter weight
310  kstep = (ipd_control%fhour-(t1+ipd_control%iau_delthrs*0.5))*3600./dtp
311  if (kstep .ge. -nstep .and. kstep .le. nstep) then
312  sx = acos(-1.)*kstep/nstep
313  wx = acos(-1.)*kstep/(nstep+1)
314  if (kstep .ne. 0) then
315  wt = (sin(wx)/wx*sin(sx)/sx)
316  else
317  wt = 1.
318  endif
319  iau_state%wt = iau_state%wt_normfact*wt
320  if (is_master()) print *,'filter wt',kstep,ipd_control%fhour,iau_state%wt
321  else
322  iau_state%wt = 0.
323  endif
324  endif
325 
326  if (nfiles.EQ.1) then
327 ! on check to see if we are in the IAU window, no need to update the
328 ! tendencies since they are fixed over the window
329  if ( ipd_control%fhour < t1 .or. ipd_control%fhour >= t2 ) then
330 ! if (is_master()) print *,'no iau forcing',t1,IPD_Control%fhour,t2
331  iau_data%in_interval=.false.
332  else
333  if (ipd_control%iau_filter_increments) call setiauforcing(ipd_control,iau_data,iau_state%wt)
334  if (is_master()) print *,'apply iau forcing',t1,ipd_control%fhour,t2
335  iau_data%in_interval=.true.
336  endif
337  return
338  endif
339 
340  if (nfiles > 1) then
341  t2=2
342  if (ipd_control%fhour < ipd_control%iaufhrs(1) .or. ipd_control%fhour >= ipd_control%iaufhrs(nfiles)) then
343 ! if (is_master()) print *,'no iau forcing',IPD_Control%iaufhrs(1),IPD_Control%fhour,IPD_Control%iaufhrs(nfiles)
344  iau_data%in_interval=.false.
345  else
346  iau_data%in_interval=.true.
347  do k=nfiles,1,-1
348  if (ipd_control%iaufhrs(k) > ipd_control%fhour) then
349  t2=k
350  endif
351  enddo
352 ! if (is_master()) print *,'t2=',t2
353  if (ipd_control%fhour >= iau_state%hr2) then ! need to read in next increment file
354  iau_state%hr1=iau_state%hr2
355  iau_state%hr2=ipd_control%iaufhrs(t2)
356  iau_state%inc1=iau_state%inc2
357  if (is_master()) print *,'reading next increment file',trim(ipd_control%iau_inc_files(t2))
358  call read_iau_forcing(ipd_control,iau_state%inc2,'INPUT/'//trim(ipd_control%iau_inc_files(t2)))
359  endif
360  call updateiauforcing(ipd_control,iau_data,iau_state%wt)
361  endif
362  endif
363  sphum=get_tracer_index(model_atmos,'sphum')
364  end subroutine getiauforcing
365 
366 subroutine updateiauforcing(IPD_Control,IAU_Data,wt)
367 
368  implicit none
369  type(ipd_control_type), intent(in) :: ipd_control
370  type(IAU_external_data_type), intent(inout) :: IAU_Data
371  real(kind_phys) delt,wt
372  integer i,j,k,l
373 
374 ! if (is_master()) print *,'in updateiauforcing',nfiles,IPD_Control%iaufhrs(1:nfiles)
375  delt = (iau_state%hr2-(ipd_control%fhour))/(iau_state%hr2-iau_state%hr1)
376  do j = js,je
377  do i = is,ie
378  do k = 1,npz
379  iau_data%ua_inc(i,j,k) =(delt*iau_state%inc1%ua_inc(i,j,k) + (1.-delt)* iau_state%inc2%ua_inc(i,j,k))*rdt*wt
380  iau_data%va_inc(i,j,k) =(delt*iau_state%inc1%va_inc(i,j,k) + (1.-delt)* iau_state%inc2%va_inc(i,j,k))*rdt*wt
381  iau_data%temp_inc(i,j,k) =(delt*iau_state%inc1%temp_inc(i,j,k) + (1.-delt)* iau_state%inc2%temp_inc(i,j,k))*rdt*wt
382  iau_data%delp_inc(i,j,k) =(delt*iau_state%inc1%delp_inc(i,j,k) + (1.-delt)* iau_state%inc2%delp_inc(i,j,k))*rdt*wt
383  iau_data%delz_inc(i,j,k) =(delt*iau_state%inc1%delz_inc(i,j,k) + (1.-delt)* iau_state%inc2%delz_inc(i,j,k))*rdt*wt
384  do l=1,ntracers
385  iau_data%tracer_inc(i,j,k,l) =(delt*iau_state%inc1%tracer_inc(i,j,k,l) + (1.-delt)* iau_state%inc2%tracer_inc(i,j,k,l))*rdt*wt
386  enddo
387  enddo
388  enddo
389  enddo
390  end subroutine updateiauforcing
391 
392 
393  subroutine setiauforcing(IPD_Control,IAU_Data,wt)
394 
395  implicit none
396  type(ipd_control_type), intent(in) :: ipd_control
397  type(IAU_external_data_type), intent(inout) :: IAU_Data
398  real(kind_phys) delt, dt,wt
399  integer i,j,k,l,sphum
400 ! this is only called if using 1 increment file
401  if (is_master()) print *,'in setiauforcing',rdt
402  do j = js,je
403  do i = is,ie
404  do k = 1,npz
405  iau_data%ua_inc(i,j,k) =wt*iau_state%inc1%ua_inc(i,j,k)*rdt
406  iau_data%va_inc(i,j,k) =wt*iau_state%inc1%va_inc(i,j,k)*rdt
407  iau_data%temp_inc(i,j,k) =wt*iau_state%inc1%temp_inc(i,j,k)*rdt
408  iau_data%delp_inc(i,j,k) =wt*iau_state%inc1%delp_inc(i,j,k)*rdt
409  iau_data%delz_inc(i,j,k) =wt*iau_state%inc1%delz_inc(i,j,k)*rdt
410  do l = 1,ntracers
411  iau_data%tracer_inc(i,j,k,l) =wt*iau_state%inc1%tracer_inc(i,j,k,l)*rdt
412  enddo
413  enddo
414  enddo
415  enddo
416  sphum=get_tracer_index(model_atmos,'sphum')
417  end subroutine setiauforcing
418 
419 subroutine read_iau_forcing(IPD_Control,increments,fname)
420  type(ipd_control_type), intent(in) :: ipd_control
421  type(iau_internal_data_type), intent(inout):: increments
422  character(len=*), intent(in) :: fname
423 !locals
424  real, dimension(:,:,:), allocatable:: u_inc, v_inc
425 
426  integer:: i, j, k, l, npz
427  integer:: i1, i2, j1
428  integer:: jbeg, jend
429  real(kind=R_GRID), dimension(2):: p1, p2, p3
430  real(kind=R_GRID), dimension(3):: e1, e2, ex, ey
431 
432  logical:: found
433  integer :: is, ie, js, je
434 
435  is = ipd_control%isc
436  ie = is + ipd_control%nx-1
437  js = ipd_control%jsc
438  je = js + ipd_control%ny-1
439 
440  deg2rad = pi/180.
441 
442  npz = ipd_control%levs
443 
444  if( file_exist(fname) ) then
445  call open_ncfile( fname, ncid ) ! open the file
446  else
447  call mpp_error(fatal,'==> Error in read_iau_forcing: Expected file '&
448  //trim(fname)//' for DA increment does not exist')
449  endif
450 
451  ! Find bounding latitudes:
452  jbeg = jm-1; jend = 2
453  do j=js,je
454  do i=is,ie
455  j1 = jdc(i,j)
456  jbeg = min(jbeg, j1)
457  jend = max(jend, j1+1)
458  enddo
459  enddo
460 
461  allocate ( wk3(1:im,jbeg:jend, 1:km) )
462  ! read in 1 time level
463  call interp_inc('T_inc',increments%temp_inc(:,:,:),jbeg,jend)
464  call interp_inc('delp_inc',increments%delp_inc(:,:,:),jbeg,jend)
465  call interp_inc('delz_inc',increments%delz_inc(:,:,:),jbeg,jend)
466  call interp_inc('u_inc',increments%ua_inc(:,:,:),jbeg,jend) ! can these be treated as scalars?
467  call interp_inc('v_inc',increments%va_inc(:,:,:),jbeg,jend)
468  do l=1,ntracers
469  call interp_inc(trim(tracer_names(l))//'_inc',increments%tracer_inc(:,:,:,l),jbeg,jend)
470  enddo
471  call close_ncfile(ncid)
472  deallocate (wk3)
473 
474 
475 end subroutine read_iau_forcing
476 
477 subroutine interp_inc(field_name,var,jbeg,jend)
478 ! interpolate increment from GSI gaussian grid to cubed sphere
479 ! everying is on the A-grid, earth relative
480  character(len=*), intent(in) :: field_name
481  real, dimension(is:ie,js:je,1:km), intent(inout) :: var
482  integer, intent(in) :: jbeg,jend
483  integer:: i1, i2, j1, k,j,i,ierr
484  call check_var_exists(ncid, field_name, ierr)
485  if (ierr == 0) then
486  call get_var3_r4( ncid, field_name, 1,im, jbeg,jend, 1,km, wk3 )
487  else
488  if (is_master()) print *,'warning: no increment for ',trim(field_name),' found, assuming zero'
489  wk3 = 0.
490  endif
491  do k=1,km
492  do j=js,je
493  do i=is,ie
494  i1 = id1(i,j)
495  i2 = id2(i,j)
496  j1 = jdc(i,j)
497  var(i,j,k) = s2c(i,j,1)*wk3(i1,j1 ,k) + s2c(i,j,2)*wk3(i2,j1 ,k)+&
498  s2c(i,j,3)*wk3(i2,j1+1,k) + s2c(i,j,4)*wk3(i1,j1+1,k)
499  enddo
500  enddo
501  enddo
502 end subroutine interp_inc
503 
504 end module fv_iau_mod
505 
506 
real(kind=4), dimension(:,:,:), allocatable wk3
Definition: fv_iau_mod.F90:79
subroutine, public get_var3_r4(ncid, var3_name, is, ie, js, je, ks, ke, var3, time_slice)
Definition: sim_nc_mod.F90:246
The module &#39;fv_mp_mod&#39; is a single program multiple data (SPMD) parallel decompostion/communication m...
Definition: fv_mp_mod.F90:24
real deg2rad
Definition: fv_iau_mod.F90:72
The type &#39;fv_grid_type&#39; is made up of grid-dependent information from fv_grid_tools and fv_grid_utils...
Definition: fv_arrays.F90:120
integer js
Definition: fv_iau_mod.F90:74
integer, dimension(:,:), allocatable jdc
Definition: fv_iau_mod.F90:70
character(len=32), dimension(:), allocatable tracer_names
Definition: fv_iau_mod.F90:76
integer, dimension(:,:), allocatable id2
Definition: fv_iau_mod.F90:70
type(iau_state_type) iau_state
Definition: fv_iau_mod.F90:105
subroutine updateiauforcing(IPD_Control, IAU_Data, wt)
Definition: fv_iau_mod.F90:367
integer, parameter, public r_grid
Definition: fv_arrays.F90:35
subroutine, public getiauforcing(IPD_Control, IAU_Data)
Definition: fv_iau_mod.F90:287
subroutine, public get_var1_real(ncid, var1_name, im, var1, var_exist)
Definition: sim_nc_mod.F90:116
subroutine read_iau_forcing(IPD_Control, increments, fname)
Definition: fv_iau_mod.F90:420
real, dimension(:,:,:), allocatable s2c
Definition: fv_iau_mod.F90:66
integer ncid
Definition: fv_iau_mod.F90:73
subroutine, public get_var1_double(ncid, var1_name, im, var1, var_exist)
The &#39;get_var&#39; subroutines read in variables from netcdf files.
Definition: sim_nc_mod.F90:93
integer npz
Definition: fv_iau_mod.F90:75
integer nfiles
Definition: fv_iau_mod.F90:73
incremental analysis update module
Definition: fv_iau_mod.F90:38
subroutine setiauforcing(IPD_Control, IAU_Data, wt)
Definition: fv_iau_mod.F90:394
integer ntracers
Definition: fv_iau_mod.F90:75
The module &#39;fv_arrays&#39; contains the &#39;fv_atmos_type&#39; and associated datatypes.
Definition: fv_arrays.F90:24
subroutine, public iau_initialize(IPD_Control, IAU_Data, Init_parm)
Definition: fv_iau_mod.F90:110
The module &#39;sim_nc&#39; is a netcdf file reader.
Definition: sim_nc_mod.F90:28
integer ie
Definition: fv_iau_mod.F90:74
&#39;The module &#39;tread_da_increment&#39; contains routines for treating the increments of the prognostic vari...
subroutine, public open_ncfile(iflnm, ncid)
Definition: sim_nc_mod.F90:55
integer je
Definition: fv_iau_mod.F90:74
integer, dimension(:), allocatable tracer_indicies
Definition: fv_iau_mod.F90:77
integer, dimension(:,:), allocatable id1
Definition: fv_iau_mod.F90:70
subroutine, public remap_coef(is, ie, js, je, im, jm, lon, lat, id1, id2, jdc, s2c, agrid)
The subroutine &#39;remap_coef&#39; calculates the coefficients for horizonal regridding. ...
subroutine, public get_ncdim1(ncid, var1_name, im)
Definition: sim_nc_mod.F90:78
subroutine interp_inc(field_name, var, jbeg, jend)
Definition: fv_iau_mod.F90:478
subroutine, public check_var_exists(ncid, var_name, status)
Definition: sim_nc_mod.F90:238
integer jm
Definition: fv_iau_mod.F90:73
integer km
Definition: fv_iau_mod.F90:73
integer im
Definition: fv_iau_mod.F90:73
integer is
Definition: fv_iau_mod.F90:74
subroutine, public close_ncfile(ncid)
Definition: sim_nc_mod.F90:67