Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Write netcdf axis variables using the same real kind as data variables #283

Merged
merged 1 commit into from
Sep 26, 2023
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
12 changes: 9 additions & 3 deletions driver/fvGFS/fv_ufs_restart_io.F90
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ subroutine add_zaxis_to_field(field, axis_name, num_levels)
character(len=*), intent(in) :: axis_name
integer, intent(in) :: num_levels

real(8), allocatable, dimension(:) :: buffer
real, allocatable, dimension(:) :: buffer
integer :: rc, i

call ESMF_AttributeAdd(field, convention="NetCDF", purpose="FV3", &
Expand Down Expand Up @@ -485,6 +485,12 @@ subroutine write_ak_bk(Atm, timestamp)
character(len=8), dimension(2) :: dim_names_2d
integer :: j

#ifdef OVERLOAD_R4
character(len=5), parameter :: axis_type = 'float'
#else
character(len=6), parameter :: axis_type = 'double'
#endif

dim_names_2d(1) = "xaxis_1"
dim_names_2d(2) = "Time"

Expand All @@ -501,7 +507,7 @@ subroutine write_ak_bk(Atm, timestamp)

call register_axis(Fv_restart, "xaxis_1", size(Atm%ak(:), 1))
call register_axis(Fv_restart, "Time", unlimited)
call register_field(Fv_restart, "xaxis_1", "double", (/"xaxis_1"/))
call register_field(Fv_restart, "xaxis_1", axis_type, (/"xaxis_1"/))
call register_variable_attribute(Fv_restart,"xaxis_1", "axis", "X", str_len=1)
if (allocated(buffer)) deallocate(buffer)
allocate(buffer(size(Atm%ak(:), 1)))
Expand All @@ -510,7 +516,7 @@ subroutine write_ak_bk(Atm, timestamp)
end do
call write_data(Fv_restart, "xaxis_1", buffer)
deallocate(buffer)
call register_field(Fv_restart, "Time", "double", (/"Time"/))
call register_field(Fv_restart, "Time", axis_type, (/"Time"/))
call register_variable_attribute(Fv_restart, dim_names_2d(2), "cartesian_axis", "T", str_len=1)
call register_variable_attribute(Fv_restart, dim_names_2d(2), "units", "time level", str_len=len("time level"))
call register_variable_attribute(Fv_restart, dim_names_2d(2), "long_name", dim_names_2d(2), str_len=len(dim_names_2d(2)))
Expand Down
18 changes: 12 additions & 6 deletions tools/fv_io.F90
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@ module fv_io_mod
integer ::grid_xtdimid, grid_ytdimid, haloid, pfullid !For writing BCs
integer ::grid_xtstagdimid, grid_ytstagdimid, oneid

#ifdef OVERLOAD_R4
character(len=5), parameter :: axis_type = 'float'
#else
character(len=6), parameter :: axis_type = 'double'
#endif

contains


Expand Down Expand Up @@ -163,7 +169,7 @@ subroutine fv_io_register_axis(file_obj, numx, xpos, numy, ypos, numz, zsize)
axisname = 'xaxis_'//suffix
call register_axis(file_obj, axisname, 'X', domain_position=xpos(i))
if (.not. file_obj%is_readonly) then !if writing file
call register_field(file_obj, axisname, "double", (/axisname/))
call register_field(file_obj, axisname, axis_type, (/axisname/))
call register_variable_attribute(file_obj,axisname, "axis", "X", str_len=1)
call get_global_io_domain_indices(file_obj, axisname, is, ie, buffer)
call write_data(file_obj, axisname, buffer)
Expand All @@ -177,7 +183,7 @@ subroutine fv_io_register_axis(file_obj, numx, xpos, numy, ypos, numz, zsize)
axisname = 'yaxis_'//suffix
call register_axis(file_obj, axisname, 'Y', domain_position=ypos(i))
if (.not. file_obj%is_readonly) then !if writing file
call register_field(file_obj, axisname, "double", (/axisname/))
call register_field(file_obj, axisname, axis_type, (/axisname/))
call register_variable_attribute(file_obj,axisname, "axis", "Y", str_len=1)
call get_global_io_domain_indices(file_obj, axisname, is, ie, buffer)
call write_data(file_obj, axisname, buffer)
Expand All @@ -191,7 +197,7 @@ subroutine fv_io_register_axis(file_obj, numx, xpos, numy, ypos, numz, zsize)
axisname = 'zaxis_'//suffix
call register_axis(file_obj, axisname, zsize(i))
if (.not. file_obj%is_readonly) then !if writing file
call register_field(file_obj, axisname, "double", (/axisname/))
call register_field(file_obj, axisname, axis_type, (/axisname/))
call register_variable_attribute(file_obj,axisname, "axis", "Z", str_len=1)
if (allocated(buffer)) deallocate(buffer)
allocate(buffer(zsize(i)))
Expand All @@ -206,7 +212,7 @@ subroutine fv_io_register_axis(file_obj, numx, xpos, numy, ypos, numz, zsize)

call register_axis(file_obj, "Time", unlimited)
if (.not. file_obj%is_readonly) then !if writing file
call register_field(file_obj, "Time", "double", (/"Time"/))
call register_field(file_obj, "Time", axis_type, (/"Time"/))
call register_variable_attribute(file_obj, "Time", "cartesian_axis", "T", str_len=1)
call register_variable_attribute(file_obj, "Time", "units", "time level", &
str_len=len("time level"))
Expand Down Expand Up @@ -307,7 +313,7 @@ subroutine fv_io_register_restart(Atm)
call register_axis(Atm%Fv_restart, "xaxis_1", size(Atm%ak(:), 1))
call register_axis(Atm%Fv_restart, "Time", unlimited)
if (.not. Atm%Fv_restart%is_readonly) then !if writing file
call register_field(Atm%Fv_restart, "xaxis_1", "double", (/"xaxis_1"/))
call register_field(Atm%Fv_restart, "xaxis_1", axis_type, (/"xaxis_1"/))
call register_variable_attribute(Atm%Fv_restart,"xaxis_1", "axis", "X", str_len=1)
if (allocated(buffer)) deallocate(buffer)
allocate(buffer(size(Atm%ak(:), 1)))
Expand All @@ -316,7 +322,7 @@ subroutine fv_io_register_restart(Atm)
end do
call write_data(Atm%Fv_restart, "xaxis_1", buffer)
deallocate(buffer)
call register_field(Atm%Fv_restart, "Time", "double", (/"Time"/))
call register_field(Atm%Fv_restart, "Time", axis_type, (/"Time"/))
call register_variable_attribute(Atm%Fv_restart, dim_names_2d(2), "cartesian_axis", "T", str_len=1)
call register_variable_attribute(Atm%Fv_restart, dim_names_2d(2), "units", "time level", str_len=len("time level"))
call register_variable_attribute(Atm%Fv_restart, dim_names_2d(2), "long_name", dim_names_2d(2), str_len=len(dim_names_2d(2)))
Expand Down