register_tracer_diagnostics does a set of register_diag_field calls for any previously registered in a tracer registry with a value of registry_diags set to .true.
324 type(ocean_grid_type),
intent(in) :: G
325 type(verticalGrid_type),
intent(in) :: GV
326 type(tracer_registry_type),
pointer :: Reg
327 real,
dimension(SZI_(G),SZJ_(G),SZK_(GV)), &
329 type(time_type),
intent(in) :: Time
330 type(diag_ctrl),
intent(in) :: diag
331 logical,
intent(in) :: use_ALE
334 character(len=24) :: name
335 character(len=24) :: shortnm
337 character(len=72) :: longname
338 character(len=72) :: flux_longname
339 character(len=48) :: units
340 character(len=48) :: flux_units
342 character(len=48) :: conv_units
344 character(len=48) :: unit2
345 character(len=72) :: cmorname
346 character(len=120) :: cmor_longname
347 character(len=120) :: var_lname
348 character(len=120) :: cmor_var_lname
349 character(len=72) :: cmor_varname
350 type(tracer_type),
pointer :: Tr=>null()
351 integer :: i, j, k, is, ie, js, je, nz, m, m2, nTr_in
352 integer :: isd, ied, jsd, jed, IsdB, IedB, JsdB, JedB
353 is = g%isc ; ie = g%iec ; js = g%jsc ; je = g%jec ; nz = g%ke
354 isd = g%isd ; ied = g%ied ; jsd = g%jsd ; jed = g%jed
355 isdb = g%IsdB ; iedb = g%IedB ; jsdb = g%JsdB ; jedb = g%JedB
357 if (.not.
associated(reg))
call mom_error(fatal,
"register_tracer_diagnostics: "//&
358 "register_tracer must be called before register_tracer_diagnostics")
362 do m=1,ntr_in ;
if (reg%Tr(m)%registry_diags)
then
367 name = tr%name ; units=adjustl(tr%units) ; longname = tr%longname
368 cmorname = tr%cmor_name ; cmor_longname = tr%cmor_longname
369 shortnm = tr%flux_nameroot
370 flux_longname = tr%flux_longname
371 if (len_trim(cmor_longname) == 0) cmor_longname = longname
373 if (len_trim(tr%flux_units) > 0)
then ; flux_units = tr%flux_units
374 elseif (gv%Boussinesq)
then ; flux_units = trim(units)//
" m3 s-1"
375 else ; flux_units = trim(units)//
" kg s-1" ;
endif
377 if (len_trim(tr%conv_units) > 0)
then ; conv_units = tr%conv_units
378 elseif (gv%Boussinesq)
then ; conv_units = trim(units)//
" m s-1"
379 else ; conv_units = trim(units)//
" kg m-2 s-1" ;
endif
381 if (len_trim(cmorname) == 0)
then
382 tr%id_tr = register_diag_field(
"ocean_model", trim(name), diag%axesTL, &
383 time, trim(longname), trim(units))
385 tr%id_tr = register_diag_field(
"ocean_model", trim(name), diag%axesTL, &
386 time, trim(longname), trim(units), cmor_field_name=cmorname, &
387 cmor_long_name=cmor_longname, cmor_units=tr%cmor_units, &
388 cmor_standard_name=cmor_long_std(cmor_longname))
390 if (tr%diag_form == 1)
then
391 tr%id_adx = register_diag_field(
"ocean_model", trim(shortnm)//
"_adx", &
392 diag%axesCuL, time, trim(flux_longname)//
" advective zonal flux" , &
393 trim(flux_units), v_extensive = .true., y_cell_method =
'sum')
394 tr%id_ady = register_diag_field(
"ocean_model", trim(shortnm)//
"_ady", &
395 diag%axesCvL, time, trim(flux_longname)//
" advective meridional flux" , &
396 trim(flux_units), v_extensive = .true., x_cell_method =
'sum')
397 tr%id_dfx = register_diag_field(
"ocean_model", trim(shortnm)//
"_dfx", &
398 diag%axesCuL, time, trim(flux_longname)//
" diffusive zonal flux" , &
399 trim(flux_units), v_extensive = .true., y_cell_method =
'sum')
400 tr%id_dfy = register_diag_field(
"ocean_model", trim(shortnm)//
"_dfy", &
401 diag%axesCvL, time, trim(flux_longname)//
" diffusive zonal flux" , &
402 trim(flux_units), v_extensive = .true., x_cell_method =
'sum')
404 tr%id_adx = register_diag_field(
"ocean_model", trim(shortnm)//
"_adx", &
405 diag%axesCuL, time,
"Advective (by residual mean) Zonal Flux of "//trim(flux_longname), &
406 flux_units, v_extensive=.true., conversion=tr%flux_scale, y_cell_method =
'sum')
407 tr%id_ady = register_diag_field(
"ocean_model", trim(shortnm)//
"_ady", &
408 diag%axesCvL, time,
"Advective (by residual mean) Meridional Flux of "//trim(flux_longname), &
409 flux_units, v_extensive=.true., conversion=tr%flux_scale, x_cell_method =
'sum')
410 tr%id_dfx = register_diag_field(
"ocean_model", trim(shortnm)//
"_diffx", &
411 diag%axesCuL, time,
"Diffusive Zonal Flux of "//trim(flux_longname), &
412 flux_units, v_extensive=.true., conversion=tr%flux_scale, y_cell_method =
'sum')
413 tr%id_dfy = register_diag_field(
"ocean_model", trim(shortnm)//
"_diffy", &
414 diag%axesCvL, time,
"Diffusive Meridional Flux of "//trim(flux_longname), &
415 flux_units, v_extensive=.true., conversion=tr%flux_scale, x_cell_method =
'sum')
417 if (tr%id_adx > 0)
call safe_alloc_ptr(tr%ad_x,isdb,iedb,jsd,jed,nz)
418 if (tr%id_ady > 0)
call safe_alloc_ptr(tr%ad_y,isd,ied,jsdb,jedb,nz)
419 if (tr%id_dfx > 0)
call safe_alloc_ptr(tr%df_x,isdb,iedb,jsd,jed,nz)
420 if (tr%id_dfy > 0)
call safe_alloc_ptr(tr%df_y,isd,ied,jsdb,jedb,nz)
422 tr%id_adx_2d = register_diag_field(
"ocean_model", trim(shortnm)//
"_adx_2d", &
423 diag%axesCu1, time, &
424 "Vertically Integrated Advective Zonal Flux of "//trim(flux_longname), &
425 flux_units, conversion=tr%flux_scale, y_cell_method =
'sum')
426 tr%id_ady_2d = register_diag_field(
"ocean_model", trim(shortnm)//
"_ady_2d", &
427 diag%axesCv1, time, &
428 "Vertically Integrated Advective Meridional Flux of "//trim(flux_longname), &
429 flux_units, conversion=tr%flux_scale, x_cell_method =
'sum')
430 tr%id_dfx_2d = register_diag_field(
"ocean_model", trim(shortnm)//
"_diffx_2d", &
431 diag%axesCu1, time, &
432 "Vertically Integrated Diffusive Zonal Flux of "//trim(flux_longname), &
433 flux_units, conversion=tr%flux_scale, y_cell_method =
'sum')
434 tr%id_dfy_2d = register_diag_field(
"ocean_model", trim(shortnm)//
"_diffy_2d", &
435 diag%axesCv1, time, &
436 "Vertically Integrated Diffusive Meridional Flux of "//trim(flux_longname), &
437 flux_units, conversion=tr%flux_scale, x_cell_method =
'sum')
439 if (tr%id_adx_2d > 0)
call safe_alloc_ptr(tr%ad2d_x,isdb,iedb,jsd,jed)
440 if (tr%id_ady_2d > 0)
call safe_alloc_ptr(tr%ad2d_y,isd,ied,jsdb,jedb)
441 if (tr%id_dfx_2d > 0)
call safe_alloc_ptr(tr%df2d_x,isdb,iedb,jsd,jed)
442 if (tr%id_dfy_2d > 0)
call safe_alloc_ptr(tr%df2d_y,isd,ied,jsdb,jedb)
444 tr%id_adv_xy = register_diag_field(
'ocean_model', trim(shortnm)//
"_advection_xy", &
446 'Horizontal convergence of residual mean advective fluxes of '//&
447 trim(lowercase(flux_longname)), conv_units, v_extensive=.true., &
448 conversion=tr%conv_scale)
449 tr%id_adv_xy_2d = register_diag_field(
'ocean_model', trim(shortnm)//
"_advection_xy_2d", &
451 'Vertical sum of horizontal convergence of residual mean advective fluxes of '//&
452 trim(lowercase(flux_longname)), conv_units, conversion=tr%conv_scale)
453 if ((tr%id_adv_xy > 0) .or. (tr%id_adv_xy_2d > 0)) &
454 call safe_alloc_ptr(tr%advection_xy,isd,ied,jsd,jed,nz)
456 tr%id_tendency = register_diag_field(
'ocean_model', trim(shortnm)//
'_tendency', &
458 'Net time tendency for '//trim(lowercase(longname)), trim(units)//
' s-1')
460 if (tr%id_tendency > 0)
then
461 call safe_alloc_ptr(tr%t_prev,isd,ied,jsd,jed,nz)
462 do k=1,nz ;
do j=js,je ;
do i=is,ie
463 tr%t_prev(i,j,k) = tr%t(i,j,k)
464 enddo ;
enddo ;
enddo
468 if (tr%diag_form == 1)
then
469 tr%id_dfxy_cont = register_diag_field(
"ocean_model", trim(shortnm)//
'_dfxy_cont_tendency', &
470 diag%axesTL, time,
"Lateral or neutral diffusion tracer content tendency for "//trim(shortnm), &
471 conv_units, conversion=tr%conv_scale, x_cell_method=
'sum', y_cell_method=
'sum', v_extensive=.true.)
473 tr%id_dfxy_cont_2d = register_diag_field(
"ocean_model", trim(shortnm)//
'_dfxy_cont_tendency_2d', &
474 diag%axesT1, time,
"Depth integrated lateral or neutral diffusion tracer concentration "//&
475 "tendency for "//trim(shortnm), conv_units, conversion = tr%conv_scale, &
476 x_cell_method =
'sum', y_cell_method =
'sum')
478 cmor_var_lname =
'Tendency of '//trim(lowercase(cmor_longname))//&
479 ' expressed as '//trim(lowercase(flux_longname))//&
480 ' content due to parameterized mesoscale diffusion'
481 tr%id_dfxy_cont = register_diag_field(
"ocean_model", trim(shortnm)//
'_dfxy_cont_tendency', &
482 diag%axesTL, time,
"Lateral or neutral diffusion tracer concentration tendency for "//trim(shortnm), &
483 conv_units, conversion = tr%conv_scale, cmor_field_name = trim(tr%cmor_tendprefix)//
'pmdiff', &
484 cmor_long_name = trim(cmor_var_lname), cmor_standard_name = trim(cmor_long_std(cmor_var_lname)), &
485 x_cell_method =
'sum', y_cell_method =
'sum', v_extensive = .true.)
487 cmor_var_lname =
'Tendency of '//trim(lowercase(cmor_longname))//
' expressed as '//&
488 trim(lowercase(flux_longname))//
' content due to parameterized mesoscale diffusion'
489 tr%id_dfxy_cont_2d = register_diag_field(
"ocean_model", trim(shortnm)//
'_dfxy_cont_tendency_2d', &
490 diag%axesT1, time,
"Depth integrated lateral or neutral diffusion tracer "//&
491 "concentration tendency for "//trim(shortnm), conv_units, &
492 conversion=tr%conv_scale, cmor_field_name=trim(tr%cmor_tendprefix)//
'pmdiff_2d', &
493 cmor_long_name=trim(cmor_var_lname), cmor_standard_name=trim(cmor_long_std(cmor_var_lname)), &
494 x_cell_method=
'sum', y_cell_method=
'sum')
496 tr%id_dfxy_conc = register_diag_field(
"ocean_model", trim(shortnm)//
'_dfxy_conc_tendency', &
497 diag%axesTL, time,
"Lateral (neutral) tracer concentration tendency for "//trim(shortnm), &
500 var_lname =
"Net time tendency for "//lowercase(flux_longname)
501 if (len_trim(tr%cmor_tendprefix) == 0)
then
502 tr%id_trxh_tendency = register_diag_field(
'ocean_model', trim(shortnm)//
'h_tendency', &
503 diag%axesTL, time, var_lname, conv_units, v_extensive=.true.)
504 tr%id_trxh_tendency_2d = register_diag_field(
'ocean_model', trim(shortnm)//
'h_tendency_2d', &
505 diag%axesT1, time,
"Vertical sum of "//trim(lowercase(var_lname)), conv_units)
507 cmor_var_lname =
"Tendency of "//trim(cmor_longname)//
" Expressed as "//&
508 trim(flux_longname)//
" Content"
509 tr%id_trxh_tendency = register_diag_field(
'ocean_model', trim(shortnm)//
'h_tendency', &
510 diag%axesTL, time, var_lname, conv_units, &
511 cmor_field_name=trim(tr%cmor_tendprefix)//
"tend", &
512 cmor_standard_name=cmor_long_std(cmor_var_lname), cmor_long_name=cmor_var_lname, &
513 v_extensive=.true., conversion=tr%conv_scale)
514 cmor_var_lname = trim(cmor_var_lname)//
" Vertical Sum"
515 tr%id_trxh_tendency_2d = register_diag_field(
'ocean_model', trim(shortnm)//
'h_tendency_2d', &
516 diag%axesT1, time,
"Vertical sum of "//trim(lowercase(var_lname)), conv_units, &
517 cmor_field_name=trim(tr%cmor_tendprefix)//
"tend_2d", &
518 cmor_standard_name=cmor_long_std(cmor_var_lname), cmor_long_name=cmor_var_lname, &
519 conversion=tr%conv_scale)
521 if ((tr%id_trxh_tendency > 0) .or. (tr%id_trxh_tendency_2d > 0))
then
522 call safe_alloc_ptr(tr%Trxh_prev,isd,ied,jsd,jed,nz)
523 do k=1,nz ;
do j=js,je ;
do i=is,ie
524 tr%Trxh_prev(i,j,k) = tr%t(i,j,k) * h(i,j,k)
525 enddo ;
enddo ;
enddo
529 if (use_ale .and. tr%remap_tr)
then
530 var_lname =
"Vertical remapping tracer concentration tendency for "//trim(reg%Tr(m)%name)
531 tr%id_remap_conc= register_diag_field(
'ocean_model', &
532 trim(tr%flux_nameroot)//
'_tendency_vert_remap', diag%axesTL, time, var_lname, &
535 var_lname =
"Vertical remapping tracer content tendency for "//trim(reg%Tr(m)%flux_longname)
536 tr%id_remap_cont = register_diag_field(
'ocean_model', &
537 trim(tr%flux_nameroot)//
'h_tendency_vert_remap', &
538 diag%axesTL, time, var_lname, flux_units, v_extensive=.true., conversion = tr%conv_scale)
540 var_lname =
"Vertical sum of vertical remapping tracer content tendency for "//&
541 trim(reg%Tr(m)%flux_longname)
542 tr%id_remap_cont_2d = register_diag_field(
'ocean_model', &
543 trim(tr%flux_nameroot)//
'h_tendency_vert_remap_2d', &
544 diag%axesT1, time, var_lname, flux_units, conversion = tr%conv_scale)
548 if (use_ale .and. (reg%ntr<max_fields_) .and. tr%remap_tr)
then
549 unit2 = trim(units)//
"2"
550 if (index(units(1:len_trim(units)),
" ") > 0) unit2 =
"("//trim(units)//
")2"
551 tr%id_tr_vardec = register_diag_field(
'ocean_model', trim(shortnm)//
"_vardec", diag%axesTL, &
552 time,
"ALE variance decay for "//lowercase(longname), trim(unit2)//
" s-1")
553 if (tr%id_tr_vardec > 0)
then
556 tr%ind_tr_squared = m2
557 call safe_alloc_ptr(reg%Tr(m2)%t,isd,ied,jsd,jed,nz) ; reg%Tr(m2)%t(:,:,:) = 0.0
558 reg%Tr(m2)%name = trim(shortnm)//
"2"
559 reg%Tr(m2)%longname =
"Squared "//trim(longname)
560 reg%Tr(m2)%units = unit2
561 reg%Tr(m2)%registry_diags = .false.
562 reg%Tr(m2)%ind_tr_squared = -1
564 reg%ntr = reg%ntr + 1