15 use fckit_configuration_module,
only: fckit_configuration
16 use fckit_log_module,
only : log
49 integer :: var, i, j, k, isc, iec, jsc, jec, npz
53 real(kind=
kind_real),
allocatable :: rhs_ud(:,:,:), rhs_vd(:,:,:)
54 real(kind=
kind_real),
allocatable :: rhs_delp(:,:,:)
56 real(kind=
kind_real),
pointer :: self_ua(:,:,:)
57 real(kind=
kind_real),
pointer :: self_va(:,:,:)
58 real(kind=
kind_real),
pointer :: self_ud(:,:,:)
59 real(kind=
kind_real),
pointer :: self_vd(:,:,:)
60 real(kind=
kind_real),
pointer :: self_t(:,:,:)
61 real(kind=
kind_real),
pointer :: self_pt(:,:,:)
62 real(kind=
kind_real),
pointer :: self_delp(:,:,:)
63 real(kind=
kind_real),
pointer :: self_ps(:,:,:)
65 real(kind=
kind_real),
pointer :: rhs_ua(:,:,:)
66 real(kind=
kind_real),
pointer :: rhs_va(:,:,:)
67 real(kind=
kind_real),
pointer :: rhs_t(:,:,:)
68 real(kind=
kind_real),
pointer :: rhs_pt(:,:,:)
69 real(kind=
kind_real),
pointer :: rhs_ps(:,:,:)
84 if (.not.
has_field(rhs_fields,
'ud'))
then
85 if (self%has_field(
'ud'))
then
86 allocate(rhs_ud(isc:iec ,jsc:jec+1,1:npz))
87 allocate(rhs_vd(isc:iec+1,jsc:jec ,1:npz))
90 call a2d(geom, rhs_ua, rhs_va, rhs_ud, rhs_vd)
99 if (.not.
has_field(rhs_fields,
'delp'))
then
100 if (self%has_field(
'delp'))
then
101 allocate(rhs_delp(isc:iec,jsc:jec,1:npz))
104 rhs_delp(:,:,k) = (geom%bk(k+1)-geom%bk(k))*rhs_ps(:,:,1)
111 do var = 1,
size(rhs_fields)
114 if (rhs_fields(var)%fv3jedi_name ==
'ua')
then
116 if (self%has_field(
'ua'))
then
118 call self%get_field(
'ua', self_ua)
119 self_ua = self_ua + rhs_ua
121 if (self%has_field(
'ud') .and. .not.
has_field(rhs_fields,
'ud'))
then
122 call self%get_field(
'ud', self_ud)
123 self_ud = self_ud + rhs_ud
126 elseif (rhs_fields(var)%fv3jedi_name ==
'va')
then
128 if (self%has_field(
'va'))
then
130 call self%get_field(
'va', self_va)
131 self_va = self_va + rhs_va
133 if (self%has_field(
'vd') .and. .not.
has_field(rhs_fields,
'vd'))
then
134 call self%get_field(
'vd', self_vd)
135 self_vd = self_vd + rhs_vd
138 elseif (rhs_fields(var)%fv3jedi_name ==
't')
then
140 if (self%has_field(
't'))
then
142 call self%get_field(
't', self_t)
143 self_t = self_t + rhs_t
146 if (self%has_field(
'pt'))
then
148 call self%get_field(
'pt', self_pt)
149 self_pt = self_pt + rhs_pt
152 elseif (rhs_fields(var)%fv3jedi_name ==
'ps')
then
154 if (self%has_field(
'ps'))
then
156 call self%get_field(
'ps', self_ps)
157 self_ps = self_ps + rhs_ps
160 if (self%has_field(
'delp') .and. .not.
has_field(rhs_fields,
'delp'))
then
161 call self%get_field(
'delp', self_delp)
162 self_delp = self_delp + rhs_delp
168 call self%get_field(rhs_fields(var)%fv3jedi_name, field_pointer)
171 field_pointer%array = field_pointer%array + rhs_fields(var)%array
174 nullify(field_pointer)
180 if (
allocated(rhs_ud))
deallocate(rhs_ud)
181 if (
allocated(rhs_vd))
deallocate(rhs_vd)
182 if (
allocated(rhs_delp))
deallocate(rhs_delp)
187 if (self%fields(var)%tracer)
then
191 do k = 1, self%fields(var)%npz
194 if (self%fields(var)%array(i,j,k) < 0.0_kind_real)
then
196 self%fields(var)%array(i,j,k) = 0.0_kind_real
203 if (found_neg .and. self%f_comm%rank() == 0) print*, &
204 'fv3jedi_state_mod.add_incr: Removed negative values for '&
205 //trim(self%fields(var)%fv3jedi_name)
248 use dcmip_initial_conditions_test_1_2_3,
only : test1_advection_deformation, &
249 test1_advection_hadley, test3_gravity_wave
250 use dcmip_initial_conditions_test_4,
only : test4_baroclinic_wave
256 type(fckit_configuration),
intent(in) :: conf
257 type(datetime),
intent(inout) :: vdate
259 character(len=30) :: IC
260 character(len=20) :: sdate
261 character(len=1024) :: buf
265 real(kind=
kind_real) :: u0,v0,w0,t0,phis0,ps0,rho0,hum0,q1,q2,q3,q4
267 character(len=:),
allocatable :: str
269 real(kind=
kind_real),
pointer :: ud(:,:,:)
270 real(kind=
kind_real),
pointer :: vd(:,:,:)
271 real(kind=
kind_real),
pointer :: t(:,:,:)
272 real(kind=
kind_real),
pointer :: delp(:,:,:)
273 real(kind=
kind_real),
pointer :: q(:,:,:)
274 real(kind=
kind_real),
pointer :: qi(:,:,:)
275 real(kind=
kind_real),
pointer :: ql(:,:,:)
276 real(kind=
kind_real),
pointer :: o3(:,:,:)
277 real(kind=
kind_real),
pointer :: phis(:,:,:)
278 real(kind=
kind_real),
pointer :: w(:,:,:)
279 real(kind=
kind_real),
pointer :: delz(:,:,:)
282 If (conf%has(
"analytic_init"))
Then
283 call conf%get_or_die(
"analytic_init",str)
288 call log%warning(
"fv3jedi_state:analytic_init: "//ic)
289 call conf%get_or_die(
"date",str)
292 WRITE(buf,*)
'validity date is: '//sdate
294 call datetime_set(sdate, vdate)
297 call self%get_field(
'ud' , ud )
298 call self%get_field(
'vd' , vd )
299 call self%get_field(
't' , t )
300 call self%get_field(
'delp' , delp)
301 call self%get_field(
'sphum' , q )
302 call self%get_field(
'ice_wat', qi )
303 call self%get_field(
'liq_wat', ql )
304 call self%get_field(
'phis' , phis)
305 if ( self%has_field(
'o3mr' ))
call self%get_field(
'o3mr' , o3)
306 if ( self%has_field(
'o3ppmv'))
call self%get_field(
'o3ppmv', o3)
307 if (self%has_field(
'w' ))
call self%get_field(
'w' , w )
308 if (self%has_field(
'delz'))
call self%get_field(
'delz', delz)
310 int_option:
Select Case (ic)
312 Case (
"dcmip-test-1-1")
314 do i = geom%isc,geom%iec
315 do j = geom%jsc,geom%jec
316 rlat = geom%grid_lat(i,j)
317 rlon = geom%grid_lon(i,j)
320 Call test1_advection_deformation(rlon,rlat,pk,0.d0,1,u0,v0,w0,t0,&
321 phis0,ps,rho0,hum0,q1,q2,q3,q4)
328 pe1 = geom%ak(k) + geom%bk(k)*ps
329 pe2 = geom%ak(k+1) + geom%bk(k+1)*ps
330 pk = 0.5_kind_real * (pe1+pe2)
331 Call test1_advection_deformation(rlon,rlat,pk,0.d0,0,u0,v0,w0,t0,&
332 phis0,ps0,rho0,hum0,q1,q2,q3,q4)
336 If (self%has_field(
'w')) w(i,j,k) = w0
338 delp(i,j,k) = pe2-pe1
348 Case (
"dcmip-test-1-2")
350 do i = geom%isc,geom%iec
351 do j = geom%jsc,geom%jec
352 rlat = geom%grid_lat(i,j)
353 rlon = geom%grid_lon(i,j)
356 Call test1_advection_hadley(rlon,rlat,pk,0.d0,1,u0,v0,w0,&
357 t0,phis0,ps,rho0,hum0,q1)
364 pe1 = geom%ak(k) + geom%bk(k)*ps
365 pe2 = geom%ak(k+1) + geom%bk(k+1)*ps
366 pk = 0.5_kind_real * (pe1+pe2)
367 Call test1_advection_hadley(rlon,rlat,pk,0.d0,0,u0,v0,w0,&
368 t0,phis0,ps,rho0,hum0,q1)
372 If (self%has_field(
'w')) w(i,j,k) = w0
374 delp(i,j,k) = pe2-pe1
382 Case (
"dcmip-test-3-1")
384 do i = geom%isc,geom%iec
385 do j = geom%jsc,geom%jec
386 rlat = geom%grid_lat(i,j)
387 rlon = geom%grid_lon(i,j)
390 Call test3_gravity_wave(rlon,rlat,pk,0.d0,1,u0,v0,w0,&
391 t0,phis0,ps,rho0,hum0)
398 pe1 = geom%ak(k) + geom%bk(k)*ps
399 pe2 = geom%ak(k+1) + geom%bk(k+1)*ps
400 pk = 0.5_kind_real * (pe1+pe2)
401 Call test3_gravity_wave(rlon,rlat,pk,0.d0,0,u0,v0,w0,&
402 t0,phis0,ps,rho0,hum0)
406 If (self%has_field(
'w')) w(i,j,k) = w0
408 delp(i,j,k) = pe2-pe1
415 Case (
"dcmip-test-4-0")
417 do i = geom%isc,geom%iec
418 do j = geom%jsc,geom%jec
419 rlat = geom%grid_lat(i,j)
420 rlon = geom%grid_lon(i,j)
423 Call test4_baroclinic_wave(0,1.0_kind_real,rlon,rlat,pk,0.d0,1,u0,v0,w0,&
424 t0,phis0,ps,rho0,hum0,q1,q2)
431 pe1 = geom%ak(k) + geom%bk(k)*ps
432 pe2 = geom%ak(k+1) + geom%bk(k+1)*ps
433 pk = 0.5_kind_real * (pe1+pe2)
434 Call test4_baroclinic_wave(0,1.0_kind_real,rlon,rlat,pk,0.d0,0,u0,v0,w0,&
435 t0,phis0,ps,rho0,hum0,q1,q2)
439 If (self%has_field(
'w')) w(i,j,k) = w0
441 delp(i,j,k) = pe2-pe1
450 call abor1_ftn(
"fv3jedi_state analytic_IC: provide analytic_init")
452 End Select int_option