279 logical,
intent(in) :: restart
280 type(time_type),
target,
intent(in) :: day
282 type(verticalgrid_type),
intent(in) :: gv
283 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
284 type(diag_ctrl),
target,
intent(in) :: diag
285 type(ocean_obc_type),
pointer :: obc
286 type(oil_tracer_cs),
pointer :: cs
287 type(sponge_cs),
pointer :: sponge_csp
288 type(diag_to_z_cs),
pointer :: diag_to_z_csp
307 character(len=16) :: name
308 character(len=72) :: longname
309 character(len=48) :: units
310 character(len=48) :: flux_units
313 integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, m
314 integer :: isdb, iedb, jsdb, jedb
316 if (.not.
associated(cs))
return 317 if (cs%ntr < 1)
return 318 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
319 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
320 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
323 do j=g%jsdB+1,g%jed ;
do i=g%isdB+1,g%ied
326 if (cs%oil_source_longitude<g%geoLonBu(i,j) .and. &
327 cs%oil_source_longitude>=g%geoLonBu(i-1,j) .and. &
328 cs%oil_source_latitude<g%geoLatBu(i,j) .and. &
329 cs%oil_source_latitude>=g%geoLatBu(i,j-1) )
then 339 call query_vardesc(cs%tr_desc(m), name=name, caller=
"initialize_oil_tracer")
340 if ((.not.restart) .or. (cs%oil_may_reinit .and. .not. &
341 query_initialized(cs%tr(:,:,:,m), name, cs%restart_CSp)))
then 343 if (len_trim(cs%IC_file) > 0)
then 345 if (.not.file_exists(cs%IC_file, g%Domain)) &
346 call mom_error(fatal,
"initialize_oil_tracer: "// &
347 "Unable to open "//cs%IC_file)
349 if (cs%Z_IC_file)
then 350 ok = tracer_z_init(cs%tr(:,:,:,m), h, cs%IC_file, name, &
353 ok = tracer_z_init(cs%tr(:,:,:,m), h, cs%IC_file, &
354 trim(name), g, -1e34, 0.0)
355 if (.not.ok)
call mom_error(fatal,
"initialize_oil_tracer: "//&
356 "Unable to read "//trim(name)//
" from "//&
357 trim(cs%IC_file)//
".")
360 call read_data(cs%IC_file, trim(name), cs%tr(:,:,:,m), &
361 domain=g%Domain%mpp_domain)
364 do k=1,nz ;
do j=js,je ;
do i=is,ie
365 if (g%mask2dT(i,j) < 0.5)
then 366 cs%tr(i,j,k,m) = cs%land_val(m)
368 cs%tr(i,j,k,m) = cs%IC_val(m)
370 enddo ;
enddo ;
enddo 376 if (
associated(obc))
then 385 if (gv%Boussinesq)
then ; flux_units =
"years m3 s-1" 386 else ; flux_units =
"years kg s-1" ;
endif 390 call query_vardesc(cs%tr_desc(m), name, units=units, longname=longname, &
391 caller=
"initialize_oil_tracer")
392 cs%id_tracer(m) = register_diag_field(
"ocean_model", trim(name), cs%diag%axesTL, &
393 day, trim(longname) , trim(units))
394 cs%id_tr_adx(m) = register_diag_field(
"ocean_model", trim(name)//
"_adx", &
395 cs%diag%axesCuL, day, trim(longname)//
" advective zonal flux" , &
397 cs%id_tr_ady(m) = register_diag_field(
"ocean_model", trim(name)//
"_ady", &
398 cs%diag%axesCvL, day, trim(longname)//
" advective meridional flux" , &
400 cs%id_tr_dfx(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfx", &
401 cs%diag%axesCuL, day, trim(longname)//
" diffusive zonal flux" , &
403 cs%id_tr_dfy(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfy", &
404 cs%diag%axesCvL, day, trim(longname)//
" diffusive zonal flux" , &
406 if (cs%id_tr_adx(m) > 0)
call safe_alloc_ptr(cs%tr_adx(m)%p,isdb,iedb,jsd,jed,nz)
407 if (cs%id_tr_ady(m) > 0)
call safe_alloc_ptr(cs%tr_ady(m)%p,isd,ied,jsdb,jedb,nz)
408 if (cs%id_tr_dfx(m) > 0)
call safe_alloc_ptr(cs%tr_dfx(m)%p,isdb,iedb,jsd,jed,nz)
409 if (cs%id_tr_dfy(m) > 0)
call safe_alloc_ptr(cs%tr_dfy(m)%p,isd,ied,jsdb,jedb,nz)
412 if ((cs%id_tr_adx(m) > 0) .or. (cs%id_tr_ady(m) > 0) .or. &
413 (cs%id_tr_dfx(m) > 0) .or. (cs%id_tr_dfy(m) > 0)) &
414 call add_tracer_diagnostics(name, cs%tr_Reg, cs%tr_adx(m)%p, &
415 cs%tr_ady(m)%p,cs%tr_dfx(m)%p,cs%tr_dfy(m)%p)
417 call register_z_tracer(cs%tr(:,:,:,m), trim(name), longname, units, &
418 day, g, diag_to_z_csp)
Ocean grid type. See mom_grid for details.