Skip to content

Commit

Permalink
Merge pull request #8 from ekluzek/add_version_to_srf_datasets
Browse files Browse the repository at this point in the history
Add version to srf datasets
  • Loading branch information
ekluzek authored Sep 5, 2024
2 parents d59dd24 + 0fd3d41 commit 064886f
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 8 deletions.
3 changes: 2 additions & 1 deletion src/main/clm_initializeMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ subroutine initialize1(dtime)
use clm_varcon , only: clm_varcon_init
use landunit_varcon , only: landunit_varcon_init
use clm_varctl , only: fsurdat, version
use surfrdMod , only: surfrd_get_num_patches, surfrd_get_nlevurb
use surfrdMod , only: surfrd_get_num_patches, surfrd_get_nlevurb, surfrd_compat_check
use controlMod , only: control_init, control_print, NLFilename
use ncdio_pio , only: ncd_pio_init
use initGridCellsMod , only: initGridCells
Expand Down Expand Up @@ -100,6 +100,7 @@ subroutine initialize1(dtime)

call control_init(dtime)
call ncd_pio_init()
call surfrd_compat_check(fsurdat)
call surfrd_get_num_patches(fsurdat, actual_maxsoil_patches, actual_numpft, actual_numcft)
call surfrd_get_nlevurb(fsurdat, actual_nlevurb)

Expand Down
9 changes: 3 additions & 6 deletions src/main/glcBehaviorMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -407,8 +407,7 @@ subroutine translate_glacier_region_behavior
glacier_region_behavior(i) = BEHAVIOR_SINGLE_AT_ATM_TOPO
case (behavior_str_unset)
write(iulog,*) ' ERROR: glacier_region_behavior not specified for ID ', i
write(iulog,*) 'You may need to extend the glacier_region_behavior namelist array,'
write(iulog,*) 'or you may be running with an old/incompatible surface dataset.'
write(iulog,*) 'You may need to extend the glacier_region_behavior namelist array.'
call endrun(msg=' ERROR: glacier_region_behavior not specified for ID '// &
errMsg(sourcefile, __LINE__))
case default
Expand Down Expand Up @@ -439,8 +438,7 @@ subroutine translate_glacier_region_melt_behavior
glacier_region_melt_behavior(i) = MELT_BEHAVIOR_REMAINS_IN_PLACE
case (behavior_str_unset)
write(iulog,*) ' ERROR: glacier_region_melt_behavior not specified for ID ', i
write(iulog,*) 'You may need to extend the glacier_region_melt_behavior namelist array,'
write(iulog,*) 'or you may be running with an old/incompatible surface dataset.'
write(iulog,*) 'You may need to extend the glacier_region_melt_behavior namelist array.'
call endrun(msg=' ERROR: glacier_region_melt_behavior not specified for ID '// &
errMsg(sourcefile, __LINE__))
case default
Expand Down Expand Up @@ -471,8 +469,7 @@ subroutine translate_glacier_region_ice_runoff_behavior
glacier_region_ice_runoff_behavior(i) = ICE_RUNOFF_BEHAVIOR_MELTED
case (behavior_str_unset)
write(iulog,*) ' ERROR: glacier_region_ice_runoff_behavior not specified for ID ', i
write(iulog,*) 'You may need to extend the glacier_region_ice_runoff_behavior namelist array,'
write(iulog,*) 'or you may be running with an old/incompatible surface dataset.'
write(iulog,*) 'You may need to extend the glacier_region_ice_runoff_behavior namelist array.'
call endrun(msg=' ERROR: glacier_region_ice_runoff_behavior not specified for ID '// &
errMsg(sourcefile, __LINE__))
case default
Expand Down
67 changes: 66 additions & 1 deletion src/main/surfrdMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ module surfrdMod
!
! !USES:
#include "shr_assert.h"
use shr_kind_mod , only : r8 => shr_kind_r8
use shr_kind_mod , only : r8 => shr_kind_r8, r4 => shr_kind_r4
use shr_log_mod , only : errMsg => shr_log_errMsg
use abortutils , only : endrun
use clm_varpar , only : nlevsoifl
Expand All @@ -27,6 +27,7 @@ module surfrdMod
save
!
! !PUBLIC MEMBER FUNCTIONS:
public :: surfrd_compat_check ! Check that this surface dataset is compatible
public :: surfrd_get_data ! Read surface dataset and determine subgrid weights
public :: surfrd_get_num_patches ! Read surface dataset to determine maxsoil_patches and numcft
public :: surfrd_get_nlevurb ! Read surface dataset to determine nlevurb
Expand All @@ -45,6 +46,70 @@ module surfrdMod

contains

!-----------------------------------------------------------------------
subroutine surfrd_compat_check ( lfsurdat )
!
! !DESCRIPTION:
! Check compatability for this surface dataset and abort with an error if it's not
!
! !USES:
use ncdio_pio, only : check_att
! !ARGUMENTS:
character(len=*), intent(in) :: lfsurdat ! surface dataset filename
! !LOCAL VARIABLES:
type(file_desc_t) :: ncid ! netcdf id
logical :: exists ! If attribute or variable was found on the file
integer :: status ! Status return code
real(r4) :: version ! Version number on the dataset
! NOTE: Only increment the expected_version when surface datasets are incompatible with the previous version
! If datasets are just updated data and backwards compatble leave the expected version alone
real(r4), parameter :: expected_version = 5.3_r4
character(len=50) :: description
character(len=*), parameter :: version_name = 'Dataset_Version'

call ncd_pio_openfile (ncid, trim(lfsurdat), 0)
call check_att(ncid, pio_global, version_name, exists)
if (exists) then
status = pio_get_att(ncid, pio_global, version_name, version)
else
! For a few previous versions guess on the compatability version based on existence of variables
call check_var( ncid, 'PCT_OCEAN', exists)
if (exists) then
version = 5.2_r4
else
call check_var( ncid, 'CONST_HARVEST_SH1', exists)
if (exists) then
version = 5.0_r4
else
call check_var( ncid, 'GLACIER_REGION', exists)
if (exists) then
version = 4.5_r4
else
! This is a version before the main clm4_5 dataseta so marking it as 0 for unknown
version = 0.0_r4
end if
end if
end if
end if
call ncd_pio_closefile(ncid)
if ( (version /= expected_version) )then
if ( version < expected_version )then
description = 'older'
if ( version == 0.0_r4 ) description = trim(description)//' than 4.5'
else if ( version > expected_version )then
description = 'newer'
end if
if ( masterproc )then
write(iulog,*) 'Input surface dataset is: ', trim(lfsurdat)
write(iulog,'(3a)') 'This surface dataset is ', trim(description), ' and incompatible with this version of CTSM'
write(iulog,'(a,f3.1,a,f3.1)') 'Dataset version = ', version, ' Version expected = ', expected_version
write(iulog,*) errMsg(sourcefile, __LINE__)
end if
call endrun(msg="ERROR: Incompatible surface dataset")
end if

end subroutine surfrd_compat_check

!-----------------------------------------------------------------------
subroutine surfrd_get_data (begg, endg, ldomain, lfsurdat, actual_numcft)
!
Expand Down
6 changes: 6 additions & 0 deletions tools/mksurfdata_esmf/src/mkfileMod.F90
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,11 @@ subroutine mkfile_define_atts(pioid, dynlanduse)
character(len= 10) :: time ! temporary
character(len= 5) :: zone ! temporary
integer :: rcode
! Surface dataset version these datasets are compatible with:
! - Only update this when the new surface datasets will be incompatible with the previous verison
! - Since whenever we update surface datasets we update to a new minor version this always corresponds
! to a CTSM minor version: 5.3, i6.1, 6.5 etcetera
real(r4), parameter :: data_version = 5.3 ! Compatibility version number of the datasets to create
character(len=*), parameter :: subname = 'mkfile_define_atts'
!-----------------------------------------------------------------------

Expand All @@ -126,6 +131,7 @@ subroutine mkfile_define_atts(pioid, dynlanduse)
str = 'Community Land Model: CLM5'
rcode = pio_put_att (pioid, pio_global, 'Source', trim(str))
rcode = pio_put_att (pioid, pio_global, 'Version', trim(gitdescribe))
rcode = pio_put_att (pioid, pio_global, 'Dataset_Version', data_version)
rcode = pio_put_att (pioid, pio_global, 'Logname', trim(logname))
rcode = pio_put_att (pioid, pio_global, 'Host', trim(hostname))
rcode = pio_put_att (pioid, pio_global, 'Number-of-tasks', npes)
Expand Down

0 comments on commit 064886f

Please sign in to comment.