Make a real 3-d array diagnostic available for averaging or output.
1523 integer,
intent(in) :: diag_field_id
1525 real,
intent(in) :: field(:,:,:)
1526 type(diag_ctrl),
target,
intent(in) :: diag_cs
1527 logical,
optional,
intent(in) :: is_static
1528 real,
optional,
intent(in) :: mask(:,:,:)
1529 real,
dimension(:,:,:), &
1530 target,
optional,
intent(in) :: alt_h
1534 type(diag_type),
pointer :: diag => null()
1535 integer :: nz, i, j, k
1536 real,
dimension(:,:,:),
allocatable :: remapped_field
1537 logical :: staggered_in_x, staggered_in_y
1538 real,
dimension(:,:,:),
pointer :: h_diag => null()
1540 if (id_clock_diag_mediator>0)
call cpu_clock_begin(id_clock_diag_mediator)
1544 if (
present(alt_h))
then 1552 call assert(diag_field_id < diag_cs%next_free_diag_id, &
1553 'post_data_3d: Unregistered diagnostic id')
1554 diag => diag_cs%diags(diag_field_id)
1555 do while (
associated(diag))
1556 call assert(
associated(diag%axes),
'post_data_3d: axes is not associated')
1558 staggered_in_x = diag%axes%is_u_point .or. diag%axes%is_q_point
1559 staggered_in_y = diag%axes%is_v_point .or. diag%axes%is_q_point
1561 if (diag%v_extensive .and. .not.diag%axes%is_native)
then 1563 if (
present(mask))
then 1564 call mom_error(fatal,
"post_data_3d: no mask for regridded field.")
1567 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
1568 allocate(remapped_field(
size(field,1),
size(field,2), diag%axes%nz))
1569 call vertically_reintegrate_diag_field( &
1570 diag_cs%diag_remap_cs(diag%axes%vertical_coordinate_number), diag_cs%G, &
1572 diag_cs%diag_remap_cs(diag%axes%vertical_coordinate_number)%h_extensive, &
1573 staggered_in_x, staggered_in_y, diag%axes%mask3d, field, remapped_field)
1574 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
1575 if (
associated(diag%axes%mask3d))
then 1578 call post_data_3d_low(diag, remapped_field, diag_cs, is_static, &
1579 mask=diag%axes%mask3d)
1581 call post_data_3d_low(diag, remapped_field, diag_cs, is_static)
1583 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
1584 deallocate(remapped_field)
1585 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
1586 elseif (diag%axes%needs_remapping)
then 1588 if (
present(mask))
then 1589 call mom_error(fatal,
"post_data_3d: no mask for regridded field.")
1592 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
1593 allocate(remapped_field(
size(field,1),
size(field,2), diag%axes%nz))
1594 call diag_remap_do_remap(diag_cs%diag_remap_cs(diag%axes%vertical_coordinate_number), &
1595 diag_cs%G, diag_cs%GV, h_diag, staggered_in_x, staggered_in_y, &
1596 diag%axes%mask3d, field, remapped_field)
1597 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
1598 if (
associated(diag%axes%mask3d))
then 1601 call post_data_3d_low(diag, remapped_field, diag_cs, is_static, &
1602 mask=diag%axes%mask3d)
1604 call post_data_3d_low(diag, remapped_field, diag_cs, is_static)
1606 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
1607 deallocate(remapped_field)
1608 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
1609 elseif (diag%axes%needs_interpolating)
then 1611 if (
present(mask))
then 1612 call mom_error(fatal,
"post_data_3d: no mask for regridded field.")
1615 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
1616 allocate(remapped_field(
size(field,1),
size(field,2), diag%axes%nz+1))
1617 call vertically_interpolate_diag_field(diag_cs%diag_remap_cs( &
1618 diag%axes%vertical_coordinate_number), &
1619 diag_cs%G, h_diag, staggered_in_x, staggered_in_y, &
1620 diag%axes%mask3d, field, remapped_field)
1621 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
1622 if (
associated(diag%axes%mask3d))
then 1625 call post_data_3d_low(diag, remapped_field, diag_cs, is_static, &
1626 mask=diag%axes%mask3d)
1628 call post_data_3d_low(diag, remapped_field, diag_cs, is_static)
1630 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
1631 deallocate(remapped_field)
1632 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
1634 call post_data_3d_low(diag, field, diag_cs, is_static, mask)
1638 if (id_clock_diag_mediator>0)
call cpu_clock_end(id_clock_diag_mediator)