diff --git a/cime_config/testdefs/testlist_cam.xml b/cime_config/testdefs/testlist_cam.xml
index ef75f335..316e8e74 100644
--- a/cime_config/testdefs/testlist_cam.xml
+++ b/cime_config/testdefs/testlist_cam.xml
@@ -9,7 +9,6 @@
-
@@ -19,7 +18,6 @@
-
@@ -29,7 +27,6 @@
-
@@ -39,7 +36,6 @@
-
diff --git a/cime_config/testdefs/testmods_dirs/cam/outfrq_kessler_derecho/user_nl_cam b/cime_config/testdefs/testmods_dirs/cam/outfrq_kessler_derecho/user_nl_cam
index e6881e64..c5ea67b4 100644
--- a/cime_config/testdefs/testmods_dirs/cam/outfrq_kessler_derecho/user_nl_cam
+++ b/cime_config/testdefs/testmods_dirs/cam/outfrq_kessler_derecho/user_nl_cam
@@ -1,7 +1,6 @@
ncdata=/glade/campaign/cesm/community/amwg/sima_baselines/cam_sima_test_snapshots/cam_ne3pg3_kessler_snapshot_derecho_gnu_before_c20240412.nc
ncdata_check=/glade/campaign/cesm/community/amwg/sima_baselines/cam_sima_test_snapshots/cam_ne3pg3_kessler_snapshot_derecho_gnu_after_c20240412.nc
ncdata_check_err=.true.
-min_difference=1.0e-15
debug_output=0
pver=30
hist_add_inst_fields;h2: Q, T
diff --git a/src/history/cam_hist_file.F90 b/src/history/cam_hist_file.F90
index 7e8b75e8..b499dd9b 100644
--- a/src/history/cam_hist_file.F90
+++ b/src/history/cam_hist_file.F90
@@ -1416,7 +1416,7 @@ subroutine config_write_time_dependent_variables(this, restart)
! Increment samples
this%num_samples = this%num_samples + 1
- start = mod(this%num_samples, this%max_frames) + 1
+ start = mod(this%num_samples-1, this%max_frames) + 1
count1 = 1
is_initfile = (this%hfile_type == hfile_type_init_value)
@@ -1486,7 +1486,8 @@ subroutine config_write_time_dependent_variables(this, restart)
split_file_index == instantaneous_file_index .and. .not. restart) then
cycle
end if
- call this%write_field(this%field_list(field_idx), split_file_index, restart, start, field_idx)
+ call this%write_field(this%field_list(field_idx), split_file_index, restart, start, field_idx, &
+ this%precision())
end do
end do
call t_stopf ('write_field')
@@ -1496,13 +1497,14 @@ end subroutine config_write_time_dependent_variables
! ========================================================================
subroutine config_write_field(this, field, split_file_index, restart, &
- sample_index, field_index)
+ sample_index, field_index, field_precision)
use pio, only: PIO_OFFSET_KIND, pio_setframe
use hist_buffer, only: hist_buffer_t
use hist_api, only: hist_buffer_norm_value
use cam_grid_support, only: cam_grid_write_dist_array
use cam_abortutils, only: check_allocate, endrun
use hist_field, only: hist_field_info_t
+ use shr_kind_mod, only: r4 => shr_kind_r4
! Dummy arguments
class(hist_file_t), intent(inout) :: this
type(hist_field_info_t), intent(inout) :: field
@@ -1510,6 +1512,7 @@ subroutine config_write_field(this, field, split_file_index, restart, &
logical, intent(in) :: restart
integer, intent(in) :: sample_index
integer, intent(in) :: field_index
+ character(len=*), intent(in) :: field_precision
! Local variables
integer, allocatable :: field_shape(:) ! Field file dim sizes
@@ -1523,8 +1526,10 @@ subroutine config_write_field(this, field, split_file_index, restart, &
type(var_desc_t) :: varid
integer :: field_decomp
integer :: idx
- real(r8), allocatable :: field_data(:,:)
+ real(r8), allocatable :: field_data_r8(:,:)
+ real(r4), allocatable :: field_data_r4(:,:)
class(hist_buffer_t), pointer :: buff_ptr
+ character(len=CL) :: errmsg
character(len=*), parameter :: subname = 'config_write_field: '
!!! Get the field's shape and decomposition
@@ -1534,11 +1539,21 @@ subroutine config_write_field(this, field, split_file_index, restart, &
end_dims = field%end_dims()
frank = size(field_shape)
if (frank == 1) then
- allocate(field_data(end_dims(1) - beg_dims(1) + 1, 1), stat=ierr)
- call check_allocate(ierr, subname, 'field_data', file=__FILE__, line=__LINE__-1)
+ if (trim(field_precision) == 'REAL32') then
+ allocate(field_data_r4(end_dims(1) - beg_dims(1) + 1, 1), stat=ierr, errmsg=errmsg)
+ call check_allocate(ierr, subname, 'field_data_r4', file=__FILE__, line=__LINE__-1, errmsg=errmsg)
+ else
+ allocate(field_data_r8(end_dims(1) - beg_dims(1) + 1, 1), stat=ierr, errmsg=errmsg)
+ call check_allocate(ierr, subname, 'field_data_r8', file=__FILE__, line=__LINE__-1, errmsg=errmsg)
+ end if
else
- allocate(field_data(end_dims(1) - beg_dims(1) + 1, field_shape(2)), stat=ierr)
- call check_allocate(ierr, subname, 'field_data', file=__FILE__, line=__LINE__-1)
+ if (trim(field_precision) == 'REAL32') then
+ allocate(field_data_r4(end_dims(1) - beg_dims(1) + 1, field_shape(2)), stat=ierr, errmsg=errmsg)
+ call check_allocate(ierr, subname, 'field_data_r4', file=__FILE__, line=__LINE__-1, errmsg=errmsg)
+ else
+ allocate(field_data_r8(end_dims(1) - beg_dims(1) + 1, field_shape(2)), stat=ierr, errmsg=errmsg)
+ call check_allocate(ierr, subname, 'field_data_r8', file=__FILE__, line=__LINE__-1, errmsg=errmsg)
+ end if
end if
! Shape of array
dimind = field%dimensions()
@@ -1557,13 +1572,25 @@ subroutine config_write_field(this, field, split_file_index, restart, &
call pio_setframe(this%hist_files(split_file_index), varid, int(sample_index,kind=PIO_OFFSET_KIND))
buff_ptr => field%buffers
if (frank == 1) then
- call hist_buffer_norm_value(buff_ptr, field_data(:,1))
- call cam_grid_write_dist_array(this%hist_files(split_file_index), field_decomp, dim_sizes(1: frank), &
- field_shape, field_data(:,1), varid)
+ if (trim(field_precision) == 'REAL32') then
+ call hist_buffer_norm_value(buff_ptr, field_data_r4(:,1))
+ call cam_grid_write_dist_array(this%hist_files(split_file_index), field_decomp, (/dim_sizes(1)/), &
+ field_shape, field_data_r4(:,1), varid)
+ else
+ call hist_buffer_norm_value(buff_ptr, field_data_r8(:,1))
+ call cam_grid_write_dist_array(this%hist_files(split_file_index), field_decomp, (/dim_sizes(1)/), &
+ field_shape, field_data_r8(:,1), varid)
+ end if
else
- call hist_buffer_norm_value(buff_ptr, field_data)
- call cam_grid_write_dist_array(this%hist_files(split_file_index), field_decomp, dim_sizes(1: frank), &
- field_shape, field_data, varid)
+ if (trim(field_precision) == 'REAL32') then
+ call hist_buffer_norm_value(buff_ptr, field_data_r4)
+ call cam_grid_write_dist_array(this%hist_files(split_file_index), field_decomp, dim_sizes(1:frank), &
+ field_shape, field_data_r4, varid)
+ else
+ call hist_buffer_norm_value(buff_ptr, field_data_r8)
+ call cam_grid_write_dist_array(this%hist_files(split_file_index), field_decomp, dim_sizes(1:frank), &
+ field_shape, field_data_r8, varid)
+ end if
end if
end do