211 type(ocean_grid_type),
intent(in) :: g
212 type(verticalgrid_type),
intent(in) :: gv
213 logical,
intent(in) :: restart
214 type(time_type),
target,
intent(in) :: day
215 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
216 type(diag_ctrl),
target,
intent(in) :: diag
217 type(ocean_obc_type),
pointer :: obc
218 type(dome_tracer_cs),
pointer :: cs
219 type(sponge_cs),
pointer :: sponge_csp
220 type(diag_to_z_cs),
pointer :: diag_to_z_csp
239 real,
allocatable :: temp(:,:,:)
240 real,
pointer,
dimension(:,:,:) :: &
241 obc_tr1_u => null(), &
245 character(len=16) :: name
246 character(len=72) :: longname
247 character(len=48) :: units
248 character(len=48) :: flux_units
250 real,
pointer :: tr_ptr(:,:,:) => null()
256 real :: e(szk_(g)+1), e_top, e_bot, d_tr
257 integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, m
258 integer :: isdb, iedb, jsdb, jedb
260 if (.not.
associated(cs))
return 261 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
262 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
263 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
264 h_neglect = gv%H_subroundoff
269 if (.not.restart)
then 270 if (len_trim(cs%tracer_IC_file) >= 1)
then 272 if (.not.file_exists(cs%tracer_IC_file, g%Domain)) &
273 call mom_error(fatal,
"DOME_initialize_tracer: Unable to open "// &
276 call query_vardesc(cs%tr_desc(m), name, caller=
"initialize_DOME_tracer")
277 call read_data(cs%tracer_IC_file, trim(name), &
278 cs%tr(:,:,:,m), domain=g%Domain%mpp_domain)
282 do k=1,nz ;
do j=js,je ;
do i=is,ie
283 cs%tr(i,j,k,m) = 1.0e-20
284 enddo ;
enddo ;
enddo 288 do m=2,ntr ;
do j=js,je ;
do i=is,ie
290 if ((m <= 6) .and. (g%geoLatT(i,j) > (300.0+50.0*
real(m-1))) .and. &
291 (g%geolatt(i,j) < (350.0+50.0*
real(m-1)))) tr_y = 1.0
294 cs%tr(i,j,k,m) = cs%tr(i,j,k,m) + tr_y
299 do j=js,je ;
do i=is,ie
300 e(nz+1) = -g%bathyT(i,j)
302 e(k) = e(k+1) + h(i,j,k)*gv%H_to_m
304 e_top = -600.0*
real(m-1) + 3000.0
305 e_bot = -600.0*
real(m-1) + 2700.0
306 if (e_top < e(k))
then 307 if (e_top < e(k+1))
then ; d_tr = 0.0
308 elseif (e_bot < e(k+1))
then 309 d_tr = (e_top-e(k+1)) / ((h(i,j,k)+h_neglect)*gv%H_to_m)
310 else ; d_tr = (e_top-e_bot) / ((h(i,j,k)+h_neglect)*gv%H_to_m)
312 elseif (e_bot < e(k))
then 313 if (e_bot < e(k+1))
then ; d_tr = 1.0
314 else ; d_tr = (e(k)-e_bot) / ((h(i,j,k)+h_neglect)*gv%H_to_m)
319 if (h(i,j,k) < 2.0*gv%Angstrom) d_tr=0.0
320 cs%tr(i,j,k,m) = cs%tr(i,j,k,m) + d_tr
329 if ( cs%use_sponge )
then 334 if (.not.
associated(sponge_csp)) &
335 call mom_error(fatal,
"DOME_initialize_tracer: "// &
336 "The pointer to sponge_CSp must be associated if SPONGE is defined.")
338 allocate(temp(g%isd:g%ied,g%jsd:g%jed,nz))
339 do k=1,nz ;
do j=js,je ;
do i=is,ie
340 if (g%geoLatT(i,j) > 700.0 .and. (k > nz/2))
then 345 enddo ;
enddo ;
enddo 351 tr_ptr => cs%tr(:,:,:,m)
352 call set_up_sponge_field(temp, tr_ptr, g, nz, sponge_csp)
357 if (
associated(obc))
then 358 call query_vardesc(cs%tr_desc(1), name, caller=
"initialize_DOME_tracer")
359 if (obc%specified_v_BCs_exist_globally)
then 360 allocate(obc_tr1_v(g%isd:g%ied,g%jsd:g%jed,nz))
361 do k=1,nz ;
do j=g%jsd,g%jed ;
do i=g%isd,g%ied
362 if (k < nz/2)
then ; obc_tr1_v(i,j,k) = 0.0
363 else ; obc_tr1_v(i,j,k) = 1.0 ;
endif 364 enddo ;
enddo ;
enddo 365 call add_tracer_obc_values(trim(name), cs%tr_Reg, &
366 0.0, obc_in_v=obc_tr1_v)
369 call add_tracer_obc_values(trim(name), cs%tr_Reg, 0.0)
374 call query_vardesc(cs%tr_desc(m), name, caller=
"initialize_DOME_tracer")
375 call add_tracer_obc_values(trim(name), cs%tr_Reg, 0.0)
380 if (gv%Boussinesq)
then ; flux_units =
"kg kg-1 m3 s-1" 381 else ; flux_units =
"kg s-1" ;
endif 385 call query_vardesc(cs%tr_desc(m), name, units=units, longname=longname, &
386 caller=
"initialize_DOME_tracer")
387 cs%id_tracer(m) = register_diag_field(
"ocean_model", trim(name), cs%diag%axesTL, &
388 day, trim(longname) , trim(units))
389 cs%id_tr_adx(m) = register_diag_field(
"ocean_model", trim(name)//
"_adx", &
390 cs%diag%axesCuL, day, trim(longname)//
" advective zonal flux" , &
392 cs%id_tr_ady(m) = register_diag_field(
"ocean_model", trim(name)//
"_ady", &
393 cs%diag%axesCvL, day, trim(longname)//
" advective meridional flux" , &
395 cs%id_tr_dfx(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfx", &
396 cs%diag%axesCuL, day, trim(longname)//
" diffusive zonal flux" , &
398 cs%id_tr_dfy(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfy", &
399 cs%diag%axesCvL, day, trim(longname)//
" diffusive zonal flux" , &
401 if (cs%id_tr_adx(m) > 0)
call safe_alloc_ptr(cs%tr_adx(m)%p,isdb,iedb,jsd,jed,nz)
402 if (cs%id_tr_ady(m) > 0)
call safe_alloc_ptr(cs%tr_ady(m)%p,isd,ied,jsdb,jedb,nz)
403 if (cs%id_tr_dfx(m) > 0)
call safe_alloc_ptr(cs%tr_dfx(m)%p,isdb,iedb,jsd,jed,nz)
404 if (cs%id_tr_dfy(m) > 0)
call safe_alloc_ptr(cs%tr_dfy(m)%p,isd,ied,jsdb,jedb,nz)
407 if ((cs%id_tr_adx(m) > 0) .or. (cs%id_tr_ady(m) > 0) .or. &
408 (cs%id_tr_dfx(m) > 0) .or. (cs%id_tr_dfy(m) > 0)) &
409 call add_tracer_diagnostics(name, cs%tr_Reg, cs%tr_adx(m)%p, &
410 cs%tr_ady(m)%p, cs%tr_dfx(m)%p, cs%tr_dfy(m)%p)
412 call register_z_tracer(cs%tr(:,:,:,m), trim(name), longname, units, &
413 day, g, diag_to_z_csp)