283 logical,
intent(in) :: restart
284 type(time_type),
target,
intent(in) :: day
285 type(ocean_grid_type),
intent(in) :: g
286 type(verticalgrid_type),
intent(in) :: gv
287 real,
dimension(SZI_(G),SZJ_(G),SZK_(G)),
intent(in) :: h
288 type(diag_ctrl),
target,
intent(in) :: diag
289 type(ocean_obc_type),
pointer :: obc
290 type(ideal_age_tracer_cs),
pointer :: cs
291 type(sponge_cs),
pointer :: sponge_csp
292 type(diag_to_z_cs),
pointer :: diag_to_z_csp
311 character(len=24) :: name
312 character(len=72) :: longname
313 character(len=48) :: units
314 character(len=48) :: flux_units
316 character(len=72) :: cmorname
318 integer :: i, j, k, is, ie, js, je, isd, ied, jsd, jed, nz, m
319 integer :: isdb, iedb, jsdb, jedb
321 if (.not.
associated(cs))
return 322 if (cs%ntr < 1)
return 323 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = gv%ke
324 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
325 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
329 cs%nkml = max(gv%nkml,1)
332 call query_vardesc(cs%tr_desc(m), name=name, &
333 caller=
"initialize_ideal_age_tracer")
334 if ((.not.restart) .or. (cs%tracers_may_reinit .and. .not. &
335 query_initialized(cs%tr(:,:,:,m), name, cs%restart_CSp)))
then 337 if (len_trim(cs%IC_file) > 0)
then 339 if (.not.file_exists(cs%IC_file, g%Domain)) &
340 call mom_error(fatal,
"initialize_ideal_age_tracer: "// &
341 "Unable to open "//cs%IC_file)
343 if (cs%Z_IC_file)
then 344 ok = tracer_z_init(cs%tr(:,:,:,m), h, cs%IC_file, name,&
347 ok = tracer_z_init(cs%tr(:,:,:,m), h, cs%IC_file, &
348 trim(name), g, -1e34, 0.0)
349 if (.not.ok)
call mom_error(fatal,
"initialize_ideal_age_tracer: "//&
350 "Unable to read "//trim(name)//
" from "//&
351 trim(cs%IC_file)//
".")
354 call read_data(cs%IC_file, trim(name), cs%tr(:,:,:,m), &
355 domain=g%Domain%mpp_domain)
358 do k=1,nz ;
do j=js,je ;
do i=is,ie
359 if (g%mask2dT(i,j) < 0.5)
then 360 cs%tr(i,j,k,m) = cs%land_val(m)
362 cs%tr(i,j,k,m) = cs%IC_val(m)
364 enddo ;
enddo ;
enddo 370 if (
associated(obc))
then 379 if (gv%Boussinesq)
then ; flux_units =
"years m3 s-1" 380 else ; flux_units =
"years kg s-1" ;
endif 383 call query_vardesc(cs%tr_desc(m), name, units=units, longname=longname, &
384 cmor_field_name=cmorname, caller=
"initialize_ideal_age_tracer")
385 if (len_trim(cmorname)==0)
then 386 cs%id_tracer(m) = register_diag_field(
"ocean_model", trim(name), cs%diag%axesTL, &
387 day, trim(longname) , trim(units))
389 cs%id_tracer(m) = register_diag_field(
"ocean_model", trim(name), cs%diag%axesTL, &
390 day, trim(longname) , trim(units), cmor_field_name=cmorname)
392 cs%id_tr_adx(m) = register_diag_field(
"ocean_model", trim(name)//
"_adx", &
393 cs%diag%axesCuL, day, trim(longname)//
" advective zonal flux" , &
395 cs%id_tr_ady(m) = register_diag_field(
"ocean_model", trim(name)//
"_ady", &
396 cs%diag%axesCvL, day, trim(longname)//
" advective meridional flux" , &
398 cs%id_tr_dfx(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfx", &
399 cs%diag%axesCuL, day, trim(longname)//
" diffusive zonal flux" , &
401 cs%id_tr_dfy(m) = register_diag_field(
"ocean_model", trim(name)//
"_dfy", &
402 cs%diag%axesCvL, day, trim(longname)//
" diffusive zonal flux" , &
404 if (cs%id_tr_adx(m) > 0)
call safe_alloc_ptr(cs%tr_adx(m)%p,isdb,iedb,jsd,jed,nz)
405 if (cs%id_tr_ady(m) > 0)
call safe_alloc_ptr(cs%tr_ady(m)%p,isd,ied,jsdb,jedb,nz)
406 if (cs%id_tr_dfx(m) > 0)
call safe_alloc_ptr(cs%tr_dfx(m)%p,isdb,iedb,jsd,jed,nz)
407 if (cs%id_tr_dfy(m) > 0)
call safe_alloc_ptr(cs%tr_dfy(m)%p,isd,ied,jsdb,jedb,nz)
410 if ((cs%id_tr_adx(m) > 0) .or. (cs%id_tr_ady(m) > 0) .or. &
411 (cs%id_tr_dfx(m) > 0) .or. (cs%id_tr_dfy(m) > 0)) &
412 call add_tracer_diagnostics(name, cs%tr_Reg, cs%tr_adx(m)%p, &
413 cs%tr_ady(m)%p,cs%tr_dfx(m)%p,cs%tr_dfy(m)%p)
415 call register_z_tracer(cs%tr(:,:,:,m), trim(name), longname, units, &
416 day, g, diag_to_z_csp)