diff --git a/diag_manager/fms_diag_output_buffer.F90 b/diag_manager/fms_diag_output_buffer.F90 index d6ade5621d..979c3a66cb 100644 --- a/diag_manager/fms_diag_output_buffer.F90 +++ b/diag_manager/fms_diag_output_buffer.F90 @@ -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) @@ -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) diff --git a/test_fms/diag_manager/test_diag_buffer.F90 b/test_fms/diag_manager/test_diag_buffer.F90 index cd127c6b7d..c9dc7374e0 100644 --- a/test_fms/diag_manager/test_diag_buffer.F90 +++ b/test_fms/diag_manager/test_diag_buffer.F90 @@ -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) @@ -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) @@ -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)) @@ -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)) @@ -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)) @@ -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