Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 21 additions & 6 deletions diag_manager/fms_diag_output_buffer.F90
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,11 @@ end subroutine set_buffer_id

!> Remaps 0-5d data buffer from the given object onto a 5d array pointer.
!> @returns a 5D remapped buffer, with 1:1 for any added dimensions.
function remap_buffer(buffobj, field_name)
function remap_buffer(buffobj, field_name, has_diurnal_axis)
class(fmsDiagOutputBuffer_class), target, intent(inout) :: buffobj !< any dimension buffer object
class(*), pointer :: remap_buffer(:,:,:,:,:)
character(len=*), intent(in) :: field_name !< name of field for error output
logical, intent(in) :: has_diurnal_axis !< true if the buffer has diurnal axis

! get num dimensions from type extension
select type (buffobj)
Expand All @@ -221,17 +222,31 @@ function remap_buffer(buffobj, field_name)
type is (outputBuffer2d_type)
if (.not. allocated(buffobj%buffer)) call mpp_error(FATAL, "remap_buffer: buffer data not yet allocated" // &
"for field:" // field_name)
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:1, 1:1, 1:1) => buffobj%buffer(:,:)
if (has_diurnal_axis) then
remap_buffer(1:size(buffobj%buffer,1), 1:1, 1:1, 1:1, 1:size(buffobj%buffer,2)) => buffobj%buffer(:,:)
else
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:1, 1:1, 1:1) => buffobj%buffer(:,:)
end if
type is (outputBuffer3d_type)
if (.not. allocated(buffobj%buffer)) call mpp_error(FATAL, "remap_buffer: buffer data not yet allocated" // &
"for field:" // field_name)
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:size(buffobj%buffer,3), 1:1, 1:1) => &
& buffobj%buffer(:,:,:)
if (has_diurnal_axis) then
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:1, 1:1, &
1:size(buffobj%buffer,3)) => buffobj%buffer(:,:,:)
else
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), &
1:size(buffobj%buffer,3), 1:1, 1:1) => buffobj%buffer(:,:,:)
end if
type is (outputBuffer4d_type)
if (.not. allocated(buffobj%buffer)) call mpp_error(FATAL, "remap_buffer: buffer data not yet allocated" // &
"for field:" // field_name)
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:size(buffobj%buffer,3), &
1:size(buffobj%buffer,4), 1:1) => buffobj%buffer(:,:,:,:)
if (has_diurnal_axis) then
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:size(buffobj%buffer,3), &
1:1, 1:size(buffobj%buffer,4)) => buffobj%buffer(:,:,:,:)
else
remap_buffer(1:size(buffobj%buffer,1), 1:size(buffobj%buffer,2), 1:size(buffobj%buffer,3), &
1:size(buffobj%buffer,4), 1:1) => buffobj%buffer(:,:,:,:)
end if
type is (outputBuffer5d_type)
if (.not. allocated(buffobj%buffer)) call mpp_error(FATAL, "remap_buffer: buffer data not yet allocated" // &
"for field:" // field_name)
Expand Down
12 changes: 6 additions & 6 deletions test_fms/diag_manager/test_diag_buffer.F90
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ program test_diag_buffer
r8val = p_val
end select
! get the 5d remapped buffer data
remap_buffer_out => buffobj0(5)%remap_buffer(fname)
remap_buffer_out => buffobj0(5)%remap_buffer(fname, .false.)
! check output from object and remapped buffer
print *, r8val
call print_5d(remap_buffer_out)
Expand All @@ -75,7 +75,7 @@ program test_diag_buffer
arr1d = p_data1
end select
!! get the remapped buffer
remap_buffer_out => buffobj1%remap_buffer(fname)
remap_buffer_out => buffobj1%remap_buffer(fname, .false.)
!! check output
print *, arr1d
call print_5d(remap_buffer_out)
Expand All @@ -94,7 +94,7 @@ program test_diag_buffer
!!! get the buffer
call buffobj2%get_buffer(arr2d, fname)
!!! get the remapped buffer
remap_buffer_out => buffobj2%remap_buffer(fname)
remap_buffer_out => buffobj2%remap_buffer(fname, .false.)
!!! check output
select type(arr2d)
type is(integer(i4_kind))
Expand All @@ -115,7 +115,7 @@ program test_diag_buffer
!! get the buffer
call buffobj3%get_buffer(arr3d, fname)
!! get the remapped buffer
remap_buffer_out => buffobj3%remap_buffer(fname)
remap_buffer_out => buffobj3%remap_buffer(fname, .false.)
!! check output
select type (arr3d)
type is(integer(i8_kind))
Expand All @@ -136,7 +136,7 @@ program test_diag_buffer
!! get the buffer
call buffobj4%get_buffer(arr4d, fname)
!! get the remapped buffer
remap_buffer_out => buffobj4%remap_buffer(fname)
remap_buffer_out => buffobj4%remap_buffer(fname, .false.)
!! check output
select type (arr4d)
type is(integer(i8_kind))
Expand All @@ -150,7 +150,7 @@ program test_diag_buffer
!! init to given value
call buffobj5%initialize_buffer( int(5, kind=i8_kind), fname )
!! get the remapped buffer
remap_buffer_out => buffobj5%remap_buffer(fname)
remap_buffer_out => buffobj5%remap_buffer(fname, .false.)
!! set some values in the buffer
allocate(i8arr5d(2,2,2,2,2))
i8arr5d = 10
Expand Down