9 use shr_kind_mod
, only: r8 => shr_kind_r8, r4 => shr_kind_r4
10 use constituents
, only: pcnst
11 use ppgrid
, only: pcols, begchunk, endchunk
12 use phys_grid
, only: get_ncols_p, phys_grid_initialized
13 use infnan
, only: posinf, assignment(=)
14 use abortutils
, only: endrun
15 use cam_logfile
, only: iulog
37 real(r8) :: tbot(pcols)
38 real(r8) :: zbot(pcols)
39 real(r8) :: ubot(pcols)
40 real(r8) :: vbot(pcols)
41 real(r8) :: qbot(pcols,pcnst)
42 real(r8) :: pbot(pcols)
43 real(r8) :: rho(pcols)
44 real(r8) :: netsw(pcols)
45 real(r8) :: flwds(pcols)
46 real(r8) :: precsc(pcols)
47 real(r8) :: precsl(pcols)
48 real(r8) :: precc(pcols)
49 real(r8) :: precl(pcols)
50 real(r8) :: soll(pcols)
51 real(r8) :: sols(pcols)
52 real(r8) :: solld(pcols)
53 real(r8) :: solsd(pcols)
54 real(r8) :: thbot(pcols)
55 real(r8) :: co2prog(pcols)
56 real(r8) :: co2diag(pcols)
57 real(r8) :: psl(pcols)
58 real(r8) :: bcphiwet(pcols)
59 real(r8) :: bcphidry(pcols)
60 real(r8) :: bcphodry(pcols)
61 real(r8) :: ocphiwet(pcols)
62 real(r8) :: ocphidry(pcols)
63 real(r8) :: ocphodry(pcols)
64 real(r8) :: dstwet1(pcols)
65 real(r8) :: dstdry1(pcols)
66 real(r8) :: dstwet2(pcols)
67 real(r8) :: dstdry2(pcols)
68 real(r8) :: dstwet3(pcols)
69 real(r8) :: dstdry3(pcols)
70 real(r8) :: dstwet4(pcols)
71 real(r8) :: dstdry4(pcols)
83 real(r8) :: asdir(pcols)
84 real(r8) :: asdif(pcols)
85 real(r8) :: aldir(pcols)
86 real(r8) :: aldif(pcols)
87 real(r8) :: lwup(pcols)
88 real(r8) :: lhf(pcols)
89 real(r8) :: shf(pcols)
90 real(r8) :: wsx(pcols)
91 real(r8) :: wsy(pcols)
92 real(r8) :: tref(pcols)
93 real(r8) :: qref(pcols)
94 real(r8) :: u10(pcols)
96 real(r8) :: sst(pcols)
97 real(r8) :: snowhland(pcols)
98 real(r8) :: snowhice(pcols)
99 real(r8) :: fco2_lnd(pcols)
100 real(r8) :: fco2_ocn(pcols)
101 real(r8) :: fdms(pcols)
102 real(r8) :: landfrac(pcols)
103 real(r8) :: icefrac(pcols)
104 real(r8) :: ocnfrac(pcols)
105 real(r8),
pointer,
dimension(:) :: ram1
106 real(r8),
pointer,
dimension(:) :: fv
107 real(r8),
pointer,
dimension(:) :: soilw
108 real(r8) :: cflx(pcols,pcnst)
109 real(r8) :: ustar(pcols)
110 real(r8) :: re(pcols)
111 real(r8) :: ssq(pcols)
112 real(r8),
pointer,
dimension(:,:) :: depvel
115 logical :: dust = .false.
125 use seq_drydep_mod
, only : lnd_drydep, n_drydep
126 use cam_cpl_indices
, only: index_x2a_sl_soilw
129 type(cam_in_t),
pointer :: cam_in(:)
136 if ( .not. phys_grid_initialized() ) call endrun(
"HUB2ATM_ALLOC error: phys_grid not called yet" )
137 allocate (cam_in(begchunk:endchunk), stat=ierror)
138 if ( ierror /= 0 )
then
139 write(iulog,*)
'Allocation error: ', ierror
140 call endrun(
'HUB2ATM_ALLOC error: allocation error')
143 do c = begchunk,endchunk
144 nullify(cam_in(c)%ram1)
145 nullify(cam_in(c)%fv)
146 nullify(cam_in(c)%soilw)
147 nullify(cam_in(c)%depvel)
150 do c = begchunk,endchunk
151 allocate (cam_in(c)%ram1(pcols), stat=ierror)
152 if ( ierror /= 0 ) call endrun(
'HUB2ATM_ALLOC error: allocation error ram1')
153 allocate (cam_in(c)%fv(pcols), stat=ierror)
154 if ( ierror /= 0 ) call endrun(
'HUB2ATM_ALLOC error: allocation error fv')
155 if (index_x2a_sl_soilw /= 0)
then
156 allocate (cam_in(c)%soilw(pcols), stat=ierror)
157 if ( ierror /= 0 ) call endrun(
'HUB2ATM_ALLOC error: allocation error soilw')
162 if (lnd_drydep .and. n_drydep>0)
then
163 do c = begchunk,endchunk
164 allocate (cam_in(c)%depvel(pcols,n_drydep), stat=ierror)
165 if ( ierror /= 0 ) call endrun(
'HUB2ATM_ALLOC error: allocation error depvel')
169 do c = begchunk,endchunk
171 cam_in(c)%ncol = get_ncols_p(c)
172 cam_in(c)%asdir (:) = 0._r8
173 cam_in(c)%asdif (:) = 0._r8
174 cam_in(c)%aldir (:) = 0._r8
175 cam_in(c)%aldif (:) = 0._r8
176 cam_in(c)%lwup (:) = 0._r8
177 cam_in(c)%lhf (:) = 0._r8
178 cam_in(c)%shf (:) = 0._r8
179 cam_in(c)%wsx (:) = 0._r8
180 cam_in(c)%wsy (:) = 0._r8
181 cam_in(c)%tref (:) = 0._r8
182 cam_in(c)%qref (:) = 0._r8
183 cam_in(c)%u10 (:) = 0._r8
184 cam_in(c)%ts (:) = 0._r8
185 cam_in(c)%sst (:) = 0._r8
186 cam_in(c)%snowhland(:) = 0._r8
187 cam_in(c)%snowhice (:) = 0._r8
188 cam_in(c)%fco2_lnd (:) = 0._r8
189 cam_in(c)%fco2_ocn (:) = 0._r8
190 cam_in(c)%fdms (:) = 0._r8
191 cam_in(c)%landfrac (:) = posinf
192 cam_in(c)%icefrac (:) = posinf
193 cam_in(c)%ocnfrac (:) = posinf
195 cam_in(c)%ram1 (:) = 0.1_r8
196 cam_in(c)%fv (:) = 0.1_r8
197 if (
associated(cam_in(c)%soilw)) &
198 cam_in(c)%soilw (:) = 0.0_r8
200 cam_in(c)%cflx (:,:) = 0._r8
201 cam_in(c)%ustar (:) = 0._r8
202 cam_in(c)%re (:) = 0._r8
203 cam_in(c)%ssq (:) = 0._r8
204 if (lnd_drydep .and. n_drydep>0)
then
205 cam_in(c)%depvel (:,:) = 0._r8
226 if ( .not. phys_grid_initialized() ) call endrun(
"ATM2HUB_ALLOC error: phys_grid not called yet" )
227 allocate (cam_out(begchunk:endchunk), stat=ierror)
228 if ( ierror /= 0 )
then
229 write(iulog,*)
'Allocation error: ', ierror
230 call endrun(
'ATM2HUB_ALLOC error: allocation error')
233 do c = begchunk,endchunk
235 cam_out(c)%ncol = get_ncols_p(c)
236 cam_out(c)%tbot(:) = 0._r8
237 cam_out(c)%zbot(:) = 0._r8
238 cam_out(c)%ubot(:) = 0._r8
239 cam_out(c)%vbot(:) = 0._r8
240 cam_out(c)%qbot(:,:) = 0._r8
241 cam_out(c)%pbot(:) = 0._r8
242 cam_out(c)%rho(:) = 0._r8
243 cam_out(c)%netsw(:) = 0._r8
244 cam_out(c)%flwds(:) = 0._r8
245 cam_out(c)%precsc(:) = 0._r8
246 cam_out(c)%precsl(:) = 0._r8
247 cam_out(c)%precc(:) = 0._r8
248 cam_out(c)%precl(:) = 0._r8
249 cam_out(c)%soll(:) = 0._r8
250 cam_out(c)%sols(:) = 0._r8
251 cam_out(c)%solld(:) = 0._r8
252 cam_out(c)%solsd(:) = 0._r8
253 cam_out(c)%thbot(:) = 0._r8
254 cam_out(c)%co2prog(:) = 0._r8
255 cam_out(c)%co2diag(:) = 0._r8
256 cam_out(c)%psl(:) = 0._r8
257 cam_out(c)%bcphidry(:) = 0._r8
258 cam_out(c)%bcphodry(:) = 0._r8
259 cam_out(c)%bcphiwet(:) = 0._r8
260 cam_out(c)%ocphidry(:) = 0._r8
261 cam_out(c)%ocphodry(:) = 0._r8
262 cam_out(c)%ocphiwet(:) = 0._r8
263 cam_out(c)%dstdry1(:) = 0._r8
264 cam_out(c)%dstwet1(:) = 0._r8
265 cam_out(c)%dstdry2(:) = 0._r8
266 cam_out(c)%dstwet2(:) = 0._r8
267 cam_out(c)%dstdry3(:) = 0._r8
268 cam_out(c)%dstwet3(:) = 0._r8
269 cam_out(c)%dstdry4(:) = 0._r8
270 cam_out(c)%dstwet4(:) = 0._r8
280 if(
associated(cam_out))
then
290 type(cam_in_t),
pointer :: cam_in(:)
293 if(
associated(cam_in))
then
294 do c=begchunk,endchunk
295 if(
associated(cam_in(c)%ram1))
then
296 deallocate(cam_in(c)%ram1)
297 nullify(cam_in(c)%ram1)
299 if(
associated(cam_in(c)%fv))
then
300 deallocate(cam_in(c)%fv)
301 nullify(cam_in(c)%fv)
303 if(
associated(cam_in(c)%soilw))
then
304 deallocate(cam_in(c)%soilw)
305 nullify(cam_in(c)%soilw)
307 if(
associated(cam_in(c)%depvel))
then
308 deallocate(cam_in(c)%depvel)
309 nullify(cam_in(c)%depvel)
333 logical,
intent(in),
optional :: aero_dust_in
336 if ( present(aero_dust_in ) )
then
353 use physics_types
, only: physics_state
354 use ppgrid
, only: pver
355 use comsrf
, only: psm1, srfrpdel, prcsnw
356 use chem_surfvals
, only: chem_surfvals_get
357 use co2_cycle
, only: co2_transport, c_i
358 use physconst
, only: mwdry, mwco2
359 use constituents
, only: pcnst
360 use cam_control_mod
, only: rair
361 use physics_buffer
, only: pbuf_get_index, pbuf_get_field, physics_buffer_desc
364 type(physics_state
),
intent(in) :: state
365 type (cam_out_t),
intent(inout) :: cam_out
366 type(physics_buffer_desc
),
pointer :: pbuf(:)
373 integer :: prec_dp_idx, snow_dp_idx, prec_sh_idx, snow_sh_idx
374 integer :: prec_sed_idx,snow_sed_idx,prec_pcw_idx,snow_pcw_idx
376 real(r8),
pointer :: prec_dp(:)
377 real(r8),
pointer :: snow_dp(:)
378 real(r8),
pointer :: prec_sh(:)
379 real(r8),
pointer :: snow_sh(:)
380 real(r8),
pointer :: prec_sed(:)
381 real(r8),
pointer :: snow_sed(:)
382 real(r8),
pointer :: prec_pcw(:)
383 real(r8),
pointer :: snow_pcw(:)
389 prec_dp_idx = pbuf_get_index(
'PREC_DP')
390 snow_dp_idx = pbuf_get_index(
'SNOW_DP')
391 prec_sh_idx = pbuf_get_index(
'PREC_SH')
392 snow_sh_idx = pbuf_get_index(
'SNOW_SH')
393 prec_sed_idx = pbuf_get_index(
'PREC_SED')
394 snow_sed_idx = pbuf_get_index(
'SNOW_SED')
395 prec_pcw_idx = pbuf_get_index(
'PREC_PCW')
396 snow_pcw_idx = pbuf_get_index(
'SNOW_PCW')
398 call pbuf_get_field(pbuf, prec_dp_idx, prec_dp)
399 call pbuf_get_field(pbuf, snow_dp_idx, snow_dp)
400 call pbuf_get_field(pbuf, prec_sh_idx, prec_sh)
401 call pbuf_get_field(pbuf, snow_sh_idx, snow_sh)
402 call pbuf_get_field(pbuf, prec_sed_idx, prec_sed)
403 call pbuf_get_field(pbuf, snow_sed_idx, snow_sed)
404 call pbuf_get_field(pbuf, prec_pcw_idx, prec_pcw)
405 call pbuf_get_field(pbuf, snow_pcw_idx, snow_pcw)
408 cam_out%tbot(i) = state%t(i,pver)
409 cam_out%thbot(i) = state%t(i,pver) * state%exner(i,pver)
410 cam_out%zbot(i) = state%zm(i,pver)
411 cam_out%ubot(i) = state%u(i,pver)
412 cam_out%vbot(i) = state%v(i,pver)
413 cam_out%pbot(i) = state%pmid(i,pver)
414 cam_out%rho(i) = cam_out%pbot(i)/(rair*cam_out%tbot(i))
415 psm1(i,lchnk) = state%ps(i)
416 srfrpdel(i,lchnk)= state%rpdel(i,pver)
420 cam_out%qbot(i,m) = state%q(i,pver,m)
424 cam_out%co2diag(:ncol) = chem_surfvals_get(
'CO2VMR') * 1.0e+6_r8
425 if (co2_transport())
then
427 cam_out%co2prog(i) = state%q(i,pver,c_i(4)) * 1.0e+6_r8 *mwdry/mwco2
435 cam_out%precc (i) = prec_dp(i) + prec_sh(i)
436 cam_out%precl (i) = prec_sed(i) + prec_pcw(i)
437 cam_out%precsc(i) = snow_dp(i) + snow_sh(i)
438 cam_out%precsl(i) = snow_sed(i) + snow_pcw(i)
441 if (cam_out%precc(i) .lt.0._r8) cam_out%precc(i)=0._r8
442 if (cam_out%precl(i) .lt.0._r8) cam_out%precl(i)=0._r8
443 if (cam_out%precsc(i).lt.0._r8) cam_out%precsc(i)=0._r8
444 if (cam_out%precsl(i).lt.0._r8) cam_out%precsl(i)=0._r8
445 if (cam_out%precsc(i).gt.cam_out%precc(i)) cam_out%precsc(i)=cam_out%precc(i)
446 if (cam_out%precsl(i).gt.cam_out%precl(i)) cam_out%precsl(i)=cam_out%precl(i)
450 prcsnw(:ncol,lchnk) = cam_out%precsc(:ncol) + cam_out%precsl(:ncol)
subroutine, public cam_export(state, cam_out, pbuf)
Set components of cam_out_t objects.
subroutine, public hub2atm_setopts(aero_dust_in)
Set options used to initialize cam_in_t objects.
subroutine, public atm2hub_alloc(cam_out)
Initialize objects of type cam_out_t.
subroutine, public atm2hub_deallocate(cam_out)
Destroy objects of type cam_out_t.
subroutine, public hub2atm_alloc(cam_in)
Initialize objects of type cam_in_t.
subroutine, public hub2atm_deallocate(cam_in)
Destroy objects of type cam_in_t.