713 integer,
intent(in) :: diag_field_id
714 real,
intent(in) :: field(:,:,:)
715 type(diag_ctrl),
target,
intent(in) :: diag_cs
716 logical,
optional,
intent(in) :: is_static
717 real,
optional,
intent(in) :: mask(:,:,:)
718 real,
target,
optional,
intent(in) :: alt_h(:,:,:)
728 type(diag_type),
pointer :: diag => null()
729 integer :: nz, i, j, k
730 real,
dimension(:,:,:),
allocatable :: remapped_field
731 logical :: staggered_in_x, staggered_in_y
732 real,
dimension(:,:,:),
pointer :: h_diag
734 if(
present(alt_h))
then 740 if (id_clock_diag_mediator>0)
call cpu_clock_begin(id_clock_diag_mediator)
744 call assert(diag_field_id < diag_cs%next_free_diag_id, &
745 'post_data_3d: Unregistered diagnostic id')
746 diag => diag_cs%diags(diag_field_id)
747 do while (
associated(diag))
748 call assert(
associated(diag%axes),
'post_data_3d: axes is not associated')
750 staggered_in_x = diag%axes%is_u_point .or. diag%axes%is_q_point
751 staggered_in_y = diag%axes%is_v_point .or. diag%axes%is_q_point
753 if (diag%v_extensive .and. .not.diag%axes%is_native)
then 755 if (
present(mask))
then 756 call mom_error(fatal,
"post_data_3d: no mask for regridded field.")
759 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
760 allocate(remapped_field(
size(field,1),
size(field,2), diag%axes%nz))
761 call vertically_reintegrate_diag_field( &
762 diag_cs%diag_remap_cs(diag%axes%vertical_coordinate_number), &
763 diag_cs%G, h_diag, staggered_in_x, staggered_in_y, &
764 diag%mask3d, diag_cs%missing_value, field, remapped_field)
765 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
766 if (
associated(diag%mask3d))
then 769 call post_data_3d_low(diag, remapped_field, diag_cs, is_static, &
770 mask=diag%mask3d(:,:,:diag%axes%nz))
772 call post_data_3d_low(diag, remapped_field, diag_cs, is_static)
774 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
775 deallocate(remapped_field)
776 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
777 elseif (diag%axes%needs_remapping)
then 779 if (
present(mask))
then 780 call mom_error(fatal,
"post_data_3d: no mask for regridded field.")
783 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
784 allocate(remapped_field(
size(field,1),
size(field,2), diag%axes%nz))
785 call diag_remap_do_remap(diag_cs%diag_remap_cs( &
786 diag%axes%vertical_coordinate_number), &
787 diag_cs%G, h_diag, staggered_in_x, staggered_in_y, &
788 diag%mask3d, diag_cs%missing_value, field, remapped_field)
789 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
790 if (
associated(diag%mask3d))
then 793 call post_data_3d_low(diag, remapped_field, diag_cs, is_static, &
794 mask=diag%mask3d(:,:,:diag%axes%nz))
796 call post_data_3d_low(diag, remapped_field, diag_cs, is_static)
798 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
799 deallocate(remapped_field)
800 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
801 elseif (diag%axes%needs_interpolating)
then 803 if (
present(mask))
then 804 call mom_error(fatal,
"post_data_3d: no mask for regridded field.")
807 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
808 allocate(remapped_field(
size(field,1),
size(field,2), diag%axes%nz+1))
809 call vertically_interpolate_diag_field(diag_cs%diag_remap_cs( &
810 diag%axes%vertical_coordinate_number), &
811 diag_cs%G, h_diag, staggered_in_x, staggered_in_y, &
812 diag%mask3d, diag_cs%missing_value, field, remapped_field)
813 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
814 if (
associated(diag%mask3d))
then 817 call post_data_3d_low(diag, remapped_field, diag_cs, is_static, &
818 mask=diag%mask3d(:,:,:diag%axes%nz+1))
820 call post_data_3d_low(diag, remapped_field, diag_cs, is_static)
822 if (id_clock_diag_remap>0)
call cpu_clock_begin(id_clock_diag_remap)
823 deallocate(remapped_field)
824 if (id_clock_diag_remap>0)
call cpu_clock_end(id_clock_diag_remap)
826 call post_data_3d_low(diag, field, diag_cs, is_static, mask)
830 if (id_clock_diag_mediator>0)
call cpu_clock_end(id_clock_diag_mediator)