FV3DYCORE  Version 2.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  logical :: drymassfixer = .false.
97  end type iau_external_data_type
101  real(kind=kind_phys) :: hr1
102  real(kind=kind_phys) :: hr2
103  real(kind=kind_phys) :: wt
104  real(kind=kind_phys) :: wt_normfact
105  end type iau_state_type
108 
109 contains
110 subroutine iau_initialize (IPD_Control, IAU_Data,Init_parm)
111  type(ipd_control_type), intent(in) :: ipd_control
112  type(iau_external_data_type), intent(inout) :: iau_data
113  type(ipd_init_type), intent(in) :: init_parm
114  ! local
115 
116  character(len=128) :: fname
117  real, dimension(:,:,:), allocatable:: u_inc, v_inc
118  real, allocatable:: lat(:), lon(:),agrid(:,:,:)
119  real(kind=kind_phys) sx,wx,wt,normfact,dtp
120 
121  integer:: i, j, k, nstep, kstep
122  integer:: i1, i2, j1
123  integer:: jbeg, jend
124 
125  logical:: found
126  integer nfilesall
127  integer, allocatable :: idt(:)
128 
129  is = ipd_control%isc
130  ie = is + ipd_control%nx-1
131  js = ipd_control%jsc
132  je = js + ipd_control%ny-1
133  call get_number_tracers(model_atmos, num_tracers=ntracers)
134  allocate (tracer_names(ntracers))
135  allocate (tracer_indicies(ntracers))
136  do i = 1, ntracers
137  call get_tracer_names(model_atmos, i, tracer_names(i))
138  tracer_indicies(i) = get_tracer_index(model_atmos,tracer_names(i))
139  enddo
140  allocate(s2c(is:ie,js:je,4))
141  allocate(id1(is:ie,js:je))
142  allocate(id2(is:ie,js:je))
143  allocate(jdc(is:ie,js:je))
144  allocate(agrid(is:ie,js:je,2))
145 ! determine number of increment files to read, and the valid forecast hours
146 
147  nfilesall = size(ipd_control%iau_inc_files)
148  nfiles = 0
149  if (is_master()) print*,'in iau_init',trim(ipd_control%iau_inc_files(1)),ipd_control%iaufhrs(1)
150  do k=1,nfilesall
151  if (trim(ipd_control%iau_inc_files(k)) .eq. '' .or. ipd_control%iaufhrs(k) .lt. 0) exit
152  if (is_master()) then
153  print *,k,trim(adjustl(ipd_control%iau_inc_files(k)))
154  endif
155  nfiles = nfiles + 1
156  enddo
157  if (is_master()) print *,'nfiles = ',nfiles
158  if (nfiles < 1) then
159  return
160  endif
161  if (nfiles > 1) then
162  allocate(idt(nfiles-1))
163  idt = ipd_control%iaufhrs(2:nfiles)-ipd_control%iaufhrs(1:nfiles-1)
164  do k=1,nfiles-1
165  if (idt(k) .ne. ipd_control%iaufhrs(2)-ipd_control%iaufhrs(1)) then
166  print *,'forecast intervals in iaufhrs must be constant'
167  call mpp_error (fatal,' forecast intervals in iaufhrs must be constant')
168  endif
169  enddo
170  deallocate(idt)
171  endif
172  if (is_master()) print *,'iau interval = ',ipd_control%iau_delthrs,' hours'
173  dt = (ipd_control%iau_delthrs*3600.)
174  rdt = 1.0/dt
175 
176 ! set up interpolation weights to go from GSI's gaussian grid to cubed sphere
177  deg2rad = pi/180.
178 
179  npz = ipd_control%levs
180  fname = 'INPUT/'//trim(ipd_control%iau_inc_files(1))
181 
182  if( file_exist(fname) ) then
183  call open_ncfile( fname, ncid ) ! open the file
184  call get_ncdim1( ncid, 'lon', im)
185  call get_ncdim1( ncid, 'lat', jm)
186  call get_ncdim1( ncid, 'lev', km)
187 
188  if (km.ne.npz) then
189  if (is_master()) print *, 'km = ', km
190  call mpp_error(fatal, &
191  '==> Error in IAU_initialize: km is not equal to npz')
192  endif
193 
194  if(is_master()) write(*,*) fname, ' DA increment dimensions:', im,jm,km
195 
196  allocate ( lon(im) )
197  allocate ( lat(jm) )
198 
199  call _get_var1 (ncid, 'lon', im, lon )
200  call _get_var1 (ncid, 'lat', jm, lat )
201  call close_ncfile(ncid)
202 
203  ! Convert to radians
204  do i=1,im
205  lon(i) = lon(i) * deg2rad
206  enddo
207  do j=1,jm
208  lat(j) = lat(j) * deg2rad
209  enddo
210 
211  else
212  call mpp_error(fatal,'==> Error in IAU_initialize: Expected file '&
213  //trim(fname)//' for DA increment does not exist')
214  endif
215 
216  ! Initialize lat-lon to Cubed bi-linear interpolation coeff:
217  ! populate agrid
218 ! print*,'is,ie,js,je=',is,ie,js,ie
219 ! print*,'size xlon=',size(Init_parm%xlon(:,1)),size(Init_parm%xlon(1,:))
220 ! print*,'size agrid=',size(agrid(:,1,1)),size(agrid(1,:,1)),size(agrid(1,1,:))
221  do j = 1,size(init_parm%xlon,2)
222  do i = 1,size(init_parm%xlon,1)
223 ! print*,i,j,is-1+j,js-1+j
224  agrid(is-1+i,js-1+j,1)=init_parm%xlon(i,j)
225  agrid(is-1+i,js-1+j,2)=init_parm%xlat(i,j)
226  enddo
227  enddo
228  call remap_coef( is, ie, js, je, is, ie, js, je, &
229  im, jm, lon, lat, id1, id2, jdc, s2c, &
230  agrid)
231  deallocate ( lon, lat,agrid )
232 
233 
234  allocate(iau_data%ua_inc(is:ie, js:je, km))
235  allocate(iau_data%va_inc(is:ie, js:je, km))
236  allocate(iau_data%temp_inc(is:ie, js:je, km))
237  allocate(iau_data%delp_inc(is:ie, js:je, km))
238  allocate(iau_data%delz_inc(is:ie, js:je, km))
239  allocate(iau_data%tracer_inc(is:ie, js:je, km,ntracers))
240 ! allocate arrays that will hold iau state
241  allocate (iau_state%inc1%ua_inc(is:ie, js:je, km))
242  allocate (iau_state%inc1%va_inc(is:ie, js:je, km))
243  allocate (iau_state%inc1%temp_inc (is:ie, js:je, km))
244  allocate (iau_state%inc1%delp_inc (is:ie, js:je, km))
245  allocate (iau_state%inc1%delz_inc (is:ie, js:je, km))
246  allocate (iau_state%inc1%tracer_inc(is:ie, js:je, km,ntracers))
247  iau_state%hr1=ipd_control%iaufhrs(1)
248  iau_state%wt = 1.0 ! IAU increment filter weights (default 1.0)
249  if (ipd_control%iau_filter_increments) then
250  ! compute increment filter weights, sum to obtain normalization factor
251  dtp=ipd_control%dtp
252  nstep = 0.5*ipd_control%iau_delthrs*3600/dtp
253  ! compute normalization factor for filter weights
254  normfact = 0.
255  do k=1,2*nstep+1
256  kstep = k-1-nstep
257  sx = acos(-1.)*kstep/nstep
258  wx = acos(-1.)*kstep/(nstep+1)
259  if (kstep .ne. 0) then
260  wt = sin(wx)/wx*sin(sx)/sx
261  else
262  wt = 1.0
263  endif
264  normfact = normfact + wt
265  if (is_master()) print *,'filter wts',k,kstep,wt
266  enddo
267  iau_state%wt_normfact = (2*nstep+1)/normfact
268  endif
269  call read_iau_forcing(ipd_control,iau_state%inc1,'INPUT/'//trim(ipd_control%iau_inc_files(1)))
270  if (nfiles.EQ.1) then ! only need to get incrments once since constant forcing over window
271  call setiauforcing(ipd_control,iau_data,iau_state%wt)
272  endif
273  if (nfiles.GT.1) then !have multiple files, but only read in 2 at a time and interpoalte between them
274  allocate (iau_state%inc2%ua_inc(is:ie, js:je, km))
275  allocate (iau_state%inc2%va_inc(is:ie, js:je, km))
276  allocate (iau_state%inc2%temp_inc (is:ie, js:je, km))
277  allocate (iau_state%inc2%delp_inc (is:ie, js:je, km))
278  allocate (iau_state%inc2%delz_inc (is:ie, js:je, km))
279  allocate (iau_state%inc2%tracer_inc(is:ie, js:je, km,ntracers))
280  iau_state%hr2=ipd_control%iaufhrs(2)
281  call read_iau_forcing(ipd_control,iau_state%inc2,'INPUT/'//trim(ipd_control%iau_inc_files(2)))
282  endif
283 ! print*,'in IAU init',dt,rdt
284  iau_data%drymassfixer = ipd_control%iau_drymassfixer
285 
286 end subroutine iau_initialize
287 
288 subroutine getiauforcing(IPD_Control,IAU_Data)
289 
290  implicit none
291  type(ipd_control_type), intent(in) :: ipd_control
292  type(iau_external_data_type), intent(inout) :: IAU_Data
293  real(kind=kind_phys) t1,t2,sx,wx,wt,dtp
294  integer n,i,j,k,sphum,kstep,nstep
295 
296  iau_data%in_interval=.false.
297  if (nfiles.LE.0) then
298  return
299  endif
300 
301  t1=iau_state%hr1 - ipd_control%iau_delthrs*0.5
302  t2=iau_state%hr1 + ipd_control%iau_delthrs*0.5
303  if (ipd_control%iau_filter_increments) then
304  ! compute increment filter weight
305  ! t1 beginning of window, t2 end of window
306  ! IPD_Control%fhour current time
307  ! in window kstep=-nstep,nstep (2*nstep+1 total)
308  ! time step IPD_control%dtp
309  dtp=ipd_control%dtp
310  nstep = 0.5*ipd_control%iau_delthrs*3600/dtp
311  ! compute normalized filter weight
312  kstep = (ipd_control%fhour-(t1+ipd_control%iau_delthrs*0.5))*3600./dtp
313  if (kstep .ge. -nstep .and. kstep .le. nstep) then
314  sx = acos(-1.)*kstep/nstep
315  wx = acos(-1.)*kstep/(nstep+1)
316  if (kstep .ne. 0) then
317  wt = (sin(wx)/wx*sin(sx)/sx)
318  else
319  wt = 1.
320  endif
321  iau_state%wt = iau_state%wt_normfact*wt
322  if (is_master()) print *,'filter wt',kstep,ipd_control%fhour,iau_state%wt
323  else
324  iau_state%wt = 0.
325  endif
326  endif
327 
328  if (nfiles.EQ.1) then
329 ! on check to see if we are in the IAU window, no need to update the
330 ! tendencies since they are fixed over the window
331  if ( ipd_control%fhour < t1 .or. ipd_control%fhour >= t2 ) then
332 ! if (is_master()) print *,'no iau forcing',t1,IPD_Control%fhour,t2
333  iau_data%in_interval=.false.
334  else
335  if (ipd_control%iau_filter_increments) call setiauforcing(ipd_control,iau_data,iau_state%wt)
336  if (is_master()) print *,'apply iau forcing',t1,ipd_control%fhour,t2
337  iau_data%in_interval=.true.
338  endif
339  return
340  endif
341 
342  if (nfiles > 1) then
343  t2=2
344  if (ipd_control%fhour < ipd_control%iaufhrs(1) .or. ipd_control%fhour >= ipd_control%iaufhrs(nfiles)) then
345 ! if (is_master()) print *,'no iau forcing',IPD_Control%iaufhrs(1),IPD_Control%fhour,IPD_Control%iaufhrs(nfiles)
346  iau_data%in_interval=.false.
347  else
348  iau_data%in_interval=.true.
349  do k=nfiles,1,-1
350  if (ipd_control%iaufhrs(k) > ipd_control%fhour) then
351  t2=k
352  endif
353  enddo
354 ! if (is_master()) print *,'t2=',t2
355  if (ipd_control%fhour >= iau_state%hr2) then ! need to read in next increment file
356  iau_state%hr1=iau_state%hr2
357  iau_state%hr2=ipd_control%iaufhrs(t2)
358  iau_state%inc1=iau_state%inc2
359  if (is_master()) print *,'reading next increment file',trim(ipd_control%iau_inc_files(t2))
360  call read_iau_forcing(ipd_control,iau_state%inc2,'INPUT/'//trim(ipd_control%iau_inc_files(t2)))
361  endif
362  call updateiauforcing(ipd_control,iau_data,iau_state%wt)
363  endif
364  endif
365  sphum=get_tracer_index(model_atmos,'sphum')
366  end subroutine getiauforcing
367 
368 subroutine updateiauforcing(IPD_Control,IAU_Data,wt)
369 
370  implicit none
371  type(ipd_control_type), intent(in) :: ipd_control
372  type(iau_external_data_type), intent(inout) :: IAU_Data
373  real(kind_phys) delt,wt
374  integer i,j,k,l
375 
376 ! if (is_master()) print *,'in updateiauforcing',nfiles,IPD_Control%iaufhrs(1:nfiles)
377  delt = (iau_state%hr2-(ipd_control%fhour))/(iau_state%hr2-iau_state%hr1)
378  do j = js,je
379  do i = is,ie
380  do k = 1,npz
381  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
382  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
383  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
384  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
385  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
386  do l=1,ntracers
387  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
388  enddo
389  enddo
390  enddo
391  enddo
392  end subroutine updateiauforcing
393 
394 
395  subroutine setiauforcing(IPD_Control,IAU_Data,wt)
396 
397  implicit none
398  type(ipd_control_type), intent(in) :: ipd_control
399  type(iau_external_data_type), intent(inout) :: IAU_Data
400  real(kind_phys) delt, dt,wt
401  integer i,j,k,l,sphum
402 ! this is only called if using 1 increment file
403  if (is_master()) print *,'in setiauforcing',rdt
404  do j = js,je
405  do i = is,ie
406  do k = 1,npz
407  iau_data%ua_inc(i,j,k) =wt*iau_state%inc1%ua_inc(i,j,k)*rdt
408  iau_data%va_inc(i,j,k) =wt*iau_state%inc1%va_inc(i,j,k)*rdt
409  iau_data%temp_inc(i,j,k) =wt*iau_state%inc1%temp_inc(i,j,k)*rdt
410  iau_data%delp_inc(i,j,k) =wt*iau_state%inc1%delp_inc(i,j,k)*rdt
411  iau_data%delz_inc(i,j,k) =wt*iau_state%inc1%delz_inc(i,j,k)*rdt
412  do l = 1,ntracers
413  iau_data%tracer_inc(i,j,k,l) =wt*iau_state%inc1%tracer_inc(i,j,k,l)*rdt
414  enddo
415  enddo
416  enddo
417  enddo
418  sphum=get_tracer_index(model_atmos,'sphum')
419  end subroutine setiauforcing
420 
421 subroutine read_iau_forcing(IPD_Control,increments,fname)
422  type(ipd_control_type), intent(in) :: ipd_control
423  type(iau_internal_data_type), intent(inout):: increments
424  character(len=*), intent(in) :: fname
425 !locals
426  real, dimension(:,:,:), allocatable:: u_inc, v_inc
427 
428  integer:: i, j, k, l, npz
429  integer:: i1, i2, j1
430  integer:: jbeg, jend
431  real(kind=R_GRID), dimension(2):: p1, p2, p3
432  real(kind=R_GRID), dimension(3):: e1, e2, ex, ey
433 
434  logical:: found
435  integer :: is, ie, js, je
436 
437  is = ipd_control%isc
438  ie = is + ipd_control%nx-1
439  js = ipd_control%jsc
440  je = js + ipd_control%ny-1
441 
442  deg2rad = pi/180.
443 
444  npz = ipd_control%levs
445 
446  if( file_exist(fname) ) then
447  call open_ncfile( fname, ncid ) ! open the file
448  else
449  call mpp_error(fatal,'==> Error in read_iau_forcing: Expected file '&
450  //trim(fname)//' for DA increment does not exist')
451  endif
452 
453  ! Find bounding latitudes:
454  jbeg = jm-1; jend = 2
455  do j=js,je
456  do i=is,ie
457  j1 = jdc(i,j)
458  jbeg = min(jbeg, j1)
459  jend = max(jend, j1+1)
460  enddo
461  enddo
462 
463  allocate ( wk3(1:im,jbeg:jend, 1:km) )
464  ! read in 1 time level
465  call interp_inc('T_inc',increments%temp_inc(:,:,:),jbeg,jend)
466  call interp_inc('delp_inc',increments%delp_inc(:,:,:),jbeg,jend)
467  call interp_inc('delz_inc',increments%delz_inc(:,:,:),jbeg,jend)
468  call interp_inc('u_inc',increments%ua_inc(:,:,:),jbeg,jend) ! can these be treated as scalars?
469  call interp_inc('v_inc',increments%va_inc(:,:,:),jbeg,jend)
470  do l=1,ntracers
471  call interp_inc(trim(tracer_names(l))//'_inc',increments%tracer_inc(:,:,:,l),jbeg,jend)
472  enddo
473  call close_ncfile(ncid)
474  deallocate (wk3)
475 
476 
477 end subroutine read_iau_forcing
478 
479 subroutine interp_inc(field_name,var,jbeg,jend)
480 ! interpolate increment from GSI gaussian grid to cubed sphere
481 ! everying is on the A-grid, earth relative
482  character(len=*), intent(in) :: field_name
483  real, dimension(is:ie,js:je,1:km), intent(inout) :: var
484  integer, intent(in) :: jbeg,jend
485  integer:: i1, i2, j1, k,j,i,ierr
486  call check_var_exists(ncid, field_name, ierr)
487  if (ierr == 0) then
488  call get_var3_r4( ncid, field_name, 1,im, jbeg,jend, 1,km, wk3 )
489  else
490  if (is_master()) print *,'warning: no increment for ',trim(field_name),' found, assuming zero'
491  wk3 = 0.
492  endif
493  do k=1,km
494  do j=js,je
495  do i=is,ie
496  i1 = id1(i,j)
497  i2 = id2(i,j)
498  j1 = jdc(i,j)
499  var(i,j,k) = s2c(i,j,1)*wk3(i1,j1 ,k) + s2c(i,j,2)*wk3(i2,j1 ,k)+&
500  s2c(i,j,3)*wk3(i2,j1+1,k) + s2c(i,j,4)*wk3(i1,j1+1,k)
501  enddo
502  enddo
503  enddo
504 end subroutine interp_inc
505 
506 end module fv_iau_mod
507 
508 
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:123
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:106
subroutine updateiauforcing(IPD_Control, IAU_Data, wt)
Definition: fv_iau_mod.F90:369
integer, parameter, public r_grid
Definition: fv_arrays.F90:34
subroutine, public getiauforcing(IPD_Control, IAU_Data)
Definition: fv_iau_mod.F90:289
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:422
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:396
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:111
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, isd, ied, jsd, jed, 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:480
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