Skip to content

Commit

Permalink
Merge branch 'NOAA-GFDL:main' into am5-ci
Browse files Browse the repository at this point in the history
  • Loading branch information
rem1776 authored Nov 12, 2024
2 parents 0c9a2d1 + 644cbd3 commit 6373e8d
Show file tree
Hide file tree
Showing 37 changed files with 911 additions and 167 deletions.
18 changes: 9 additions & 9 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
# These owners will be the default owners for all the files in the
# repository. Unless a later match is found, these owners
# will be requested for a review when a PR is opened.
* @thomas-robinson @bensonr @rem1776
* @uramirez8707 @bensonr @rem1776

# GNU autotools files
Makefile.am @uramirez8707 @rem1776
Expand All @@ -41,7 +41,7 @@ cmake @mlee03
/.github/ @rem1776

# Testing files
/test_fms/ @uramirez8707 @mlee03 @bensonr @thomas-robinson @rem1776
/test_fms/ @uramirez8707 @mlee03 @bensonr @rem1776

# Specific component directories
/affinity/ @bensonr
Expand All @@ -53,15 +53,15 @@ cmake @mlee03
#/data_override/ Currently no code owner
/test_fms/data_override/ @rem1776

/diag_manager @thomas-robinson
/test_fms/diag_manager/ @thomas-robinson
/diag_manager @uramirez8707
/test_fms/diag_manager/ @uramirez8707

/fms/ @thomas-robinson @rem1776
/test_fms/fms/ @thomas-robinson @rem1776
/fms/ @uramirez8707 @rem1776
/test_fms/fms/ @uramirez8707 @rem1776
/fms2/ @uramirez8707
/test_fms/fms2/ @uramirez8707

/libFMS/ @thomas-robinson @rem1776
/libFMS/ @uramirez8707 @rem1776

/mpp/ @thomas-robinson @bensonr
/test_fms/mpp/ @thomas-robinson @bensonr @rem1776
/mpp/ @uramirez8707 @bensonr
/test_fms/mpp/ @uramirez8707 @bensonr @rem1776
10 changes: 6 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,8 @@ if(WITH_YAML)
endif()

if(USE_DEPRECATED_IO)
message( WARNING "fms_io WILL BE DEPRECATED IN A FUTURE RELEASE. PLEASE UPDATE TO USE FMS2_IO AND REMOVE "
"-DUSE_DEPRECATED_IO=on FROM YOUR OPTIONS")
list(APPEND fms_defs use_deprecated_io)
endif()

Expand Down Expand Up @@ -429,13 +431,13 @@ endforeach()
install(
TARGETS ${LIB_TARGETS}
EXPORT FMSExports
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})

### Package config
include(CMakePackageConfigHelpers)
set(CONFIG_INSTALL_DESTINATION lib/cmake/fms)
set(CONFIG_INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/fms)

export(EXPORT FMSExports
NAMESPACE FMS::
Expand Down
4 changes: 4 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -537,3 +537,7 @@ AC_CONFIG_FILES([
])

AC_OUTPUT()

if test $enable_deprecated_io = yes; then
AC_MSG_WARN(FMS_IO WILL BE DEPRECATED IN A FUTURE RLEASE. PLEASE UPDATE TO USE FMS2_IO AND REMOVE --enable-deprecated-io FROM YOUR CONFIGURE OPTIONS)
fi
5 changes: 5 additions & 0 deletions data_override/README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
- [Converting legacy data_table to data_table.yaml](README.MD#3-converting-legacy-data_table-to-data_tableyaml)
- [Examples](README.MD#4-examples)
- [External Weight File Structure](README.MD#5-external-weight-file-structure)
- [Ensemble and Nest Support](README.MD#6-ensemble-and-nest-support)

#### 1. YAML Data Table format:
Each entry in the data_table has the following key values:
Expand Down Expand Up @@ -200,3 +201,7 @@ variables:
- weight(:,:,2) -> (i,j+1)
- weight(:,:,3) -> (i+1,j)
- weight(:,:,4) -> (i+1,j+1)

#### 6. Ensemble and Nest Support

It may be desired to have each member of an ensemble use a different forcing file. In other to support this, FMS allows for each ensemble member to have its own data_table.yaml. For example, for a run with 2 ensemble members, fms will search for data_table_ens_01.yaml and data_table_ens_02.yaml. However, if both the data_table.yaml and the data_table_ens_* files are present, the code will crash as only 1 option is allowed. Similary, each nest can have its own data_table (data_table_nest_01.yaml), but in this case FMS will not crash if both data_table_nest_01.yaml and data_table.yaml are present. The main grid will use the data_table.yaml and the first nest will use the data_table_nest_01.yaml file.
15 changes: 12 additions & 3 deletions data_override/include/data_override.inc
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
! modules. These modules are not intended to be used directly - they should be
! used through the data_override_mod API. See data_override.F90 for details.

use platform_mod, only: r4_kind, r8_kind, FMS_PATH_LEN
use platform_mod, only: r4_kind, r8_kind, FMS_PATH_LEN, FMS_FILE_LEN
use yaml_parser_mod
use constants_mod, only: DEG_TO_RAD
use mpp_mod, only : mpp_error, FATAL, WARNING, NOTE, stdout, stdlog, mpp_max
Expand All @@ -45,7 +45,7 @@ use mpp_domains_mod, only : domainUG, mpp_pass_SG_to_UG, mpp_get_UG_SG_domain, N
use time_manager_mod, only: time_type, OPERATOR(>), OPERATOR(<)
use fms2_io_mod, only : FmsNetcdfFile_t, open_file, close_file, &
read_data, fms2_io_init, variable_exists, &
get_mosaic_tile_file, file_exists
get_mosaic_tile_file, file_exists, get_instance_filename
use get_grid_version_mod, only: get_grid_version_1, get_grid_version_2
use fms_string_utils_mod, only: string

Expand Down Expand Up @@ -591,9 +591,18 @@ subroutine read_table_yaml(data_table)
integer :: nentries, mentries
integer :: i
character(len=50) :: buffer
character(len=FMS_FILE_LEN) :: filename !< Name of the expected data_table.yaml
integer :: file_id
file_id = open_and_parse_file("data_table.yaml")
! If doing and ensemble or nest run add the filename appendix (ens_XX or nest_XX) to the filename
call get_instance_filename("data_table.yaml", filename)
if (index(trim(filename), "ens_") .ne. 0) then
if (file_exists(filename) .and. file_exists("data_table.yaml")) &
call mpp_error(FATAL, "Both data_table.yaml and "//trim(filename)//" exists, pick one!")
endif
file_id = open_and_parse_file(trim(filename))
if (file_id==999) then
nentries = 0
else
Expand Down
4 changes: 4 additions & 0 deletions diag_manager/diag_yaml_format.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ The purpose of this document is to explain the diag_table yaml format.
- [2.6 Sub_region Section](diag_yaml_format.md#26-sub_region-section)
- [3. More examples](diag_yaml_format.md#3-more-examples)
- [4. Schema](diag_yaml_format.md#4-schema)
- [5. Ensemble and Nest Support](diag_yaml_format.md#5-ensemble-and-nest-support)

### 1. Converting from legacy ascii diag_table format

Expand Down Expand Up @@ -349,3 +350,6 @@ diag_files:
A formal specification of the file format, in the form of a JSON schema, can be
found in the [gfdl_msd_schemas](https://github.com/NOAA-GFDL/gfdl_msd_schemas)
repository on Github.

### 5. Ensemble and Nest Support
When using nests, it may be desired for a nest to have a different file frequency or number of variables from the parent grid. This may allow users to save disk space and reduce simulations time. In order to supports, FMS allows each nest to have a different diag_table.yaml from the parent grid. For example, if running with 1 test FMS will use diag_table.yaml for the parent grid and diag_table.nest_01.yaml for the first nest Similary, each ensemble member can have its own diag_table (diag_table_ens_XX.yaml, where XX is the ensemble number). However, for the ensemble case if both the diag_table.yaml and the diag_table_ens_* files are present, the code will crash as only 1 option is allowed.
5 changes: 3 additions & 2 deletions diag_manager/fms_diag_object.F90
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ integer function fms_register_diag_field_obj &
integer, allocatable :: file_ids(:) !< The file IDs for this variable
integer :: i !< For do loops
integer, allocatable :: diag_field_indices(:) !< indices where the field was found in the yaml
class(diagDomain_t), pointer :: null_diag_domain => NULL() !< Workaround for a Cray bug which will be fixed in CCE 19
#endif
#ifndef use_yaml
fms_register_diag_field_obj = DIAG_FIELD_NOT_FOUND
Expand Down Expand Up @@ -267,7 +268,7 @@ integer function fms_register_diag_field_obj &
call fileptr%add_field_and_yaml_id(fieldptr%get_id(), diag_field_indices(i))
call fileptr%add_buffer_id(fieldptr%buffer_ids(i))
if(fieldptr%get_type_of_domain() .eq. NO_DOMAIN) then
call fileptr%set_file_domain(NULL(), fieldptr%get_type_of_domain())
call fileptr%set_file_domain(null_diag_domain, fieldptr%get_type_of_domain())
else
call fileptr%set_file_domain(fieldptr%get_domain(), fieldptr%get_type_of_domain())
endif
Expand All @@ -284,7 +285,7 @@ integer function fms_register_diag_field_obj &
call fileptr%add_buffer_id(fieldptr%buffer_ids(i))
call fileptr%init_diurnal_axis(this%diag_axis, this%registered_axis, diag_field_indices(i))
if(fieldptr%get_type_of_domain() .eq. NO_DOMAIN) then
call fileptr%set_file_domain(NULL(), fieldptr%get_type_of_domain())
call fileptr%set_file_domain(null_diag_domain, fieldptr%get_type_of_domain())
else
call fileptr%set_file_domain(fieldptr%get_domain(), fieldptr%get_type_of_domain())
endif
Expand Down
10 changes: 9 additions & 1 deletion diag_manager/fms_diag_yaml.F90
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ module fms_diag_yaml_mod
fms_f2c_string
use platform_mod, only: r4_kind, i4_kind, r8_kind, i8_kind, FMS_FILE_LEN
use fms_mod, only: lowercase
use fms2_io_mod, only: file_exists, get_instance_filename

implicit none

Expand Down Expand Up @@ -381,10 +382,17 @@ subroutine diag_yaml_object_init(diag_subset_output)
!! outputing data at every frequency)
character(len=:), allocatable :: filename!< Diag file name (for error messages)
logical :: is_instantaneous !< .True. if the file is instantaneous (i.e no averaging)
character(len=FMS_FILE_LEN) :: yamlfilename !< Name of the expected diag_table.yaml

if (diag_yaml_module_initialized) return

diag_yaml_id = open_and_parse_file("diag_table.yaml")
! If doing and ensemble or nest run add the filename appendix (ens_XX or nest_XX) to the filename
call get_instance_filename("diag_table.yaml", yamlfilename)
if (index(trim(yamlfilename), "ens_") .ne. 0) then
if (file_exists(yamlfilename) .and. file_exists("diag_table.yaml")) &
call mpp_error(FATAL, "Both diag_table.yaml and "//trim(yamlfilename)//" exists, pick one!")
endif
diag_yaml_id = open_and_parse_file(trim(yamlfilename))

call diag_get_value_from_key(diag_yaml_id, 0, "title", diag_yaml%diag_title)
call get_value_from_key(diag_yaml_id, 0, "base_date", diag_yaml%diag_basedate)
Expand Down
15 changes: 12 additions & 3 deletions field_manager/field_manager.F90
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ module field_manager_mod
use fms_mod, only : lowercase, &
write_version_number, &
check_nml_error
use fms2_io_mod, only: file_exists
use fms2_io_mod, only: file_exists, get_instance_filename
use platform_mod, only: r4_kind, r8_kind, FMS_PATH_LEN, FMS_FILE_LEN
#ifdef use_yaml
use fm_yaml_mod
Expand Down Expand Up @@ -606,18 +606,27 @@ subroutine read_field_table_yaml(nfields, table_name)
logical :: fm_success !< logical for whether fm_change_list was a success
logical :: subparams !< logical whether subparams exist in this iteration

character(len=FMS_FILE_LEN) :: filename !< Name of the expected field_table.yaml

if (.not.PRESENT(table_name)) then
tbl_name = 'field_table.yaml'
else
tbl_name = trim(table_name)
endif
if (.not. file_exists(trim(tbl_name))) then

call get_instance_filename(tbl_name, filename)
if (index(trim(filename), "ens_") .ne. 0) then
if (file_exists(filename) .and. file_exists(tbl_name)) &
call mpp_error(FATAL, "Both "//trim(tbl_name)//" and "//trim(filename)//" exists, pick one!")
endif

if (.not. file_exists(trim(filename))) then
if(present(nfields)) nfields = 0
return
endif

! Construct my_table object
call build_fmTable(my_table, trim(tbl_name))
call build_fmTable(my_table, trim(filename))

do h=1,size(my_table%types)
do i=1,size(my_table%types(h)%models)
Expand Down
10 changes: 10 additions & 0 deletions fms/fms_io.F90
Original file line number Diff line number Diff line change
Expand Up @@ -693,6 +693,11 @@ subroutine fms_io_init()
call mpp_error(FATAL,'=>fms_io_init: Error reading input nml file')
endif

call mpp_error(NOTE, "fms_io_init: fms_io WILL BE DEPRECATED IN A FUTURE RELEASE! "//&
"PLEASE REMOVE -Duse_deprecated_io FROM YOUR COMPILE FLAGS "// &
"AND MOVE TO FMS2_IO. CONTACT YOUR MODEL LIASISON IF YOU NEED "// &
"ASSISTANCE")

! take namelist options if present
! read_data_bug is no longer supported.
if (read_data_bug) then
Expand Down Expand Up @@ -802,6 +807,11 @@ subroutine fms_io_exit()

if( .NOT.module_is_initialized )return !make sure it's only called once per PE

call mpp_error(NOTE, "fms_io_exit: fms_io WILL BE DEPRECATED IN A FUTURE RELEASE! "//&
"PLEASE REMOVE -Duse_deprecated_io FROM YOUR COMPILE FLAGS "// &
"AND MOVE TO FMS2_IO. CONTACT YOUR MODEL LIASISON IF YOU NEED "// &
"ASSISTANCE")

do i=1,max_axis_size
axisdata(i) = i
enddo
Expand Down
10 changes: 8 additions & 2 deletions fms2_io/fms_io_utils.F90
Original file line number Diff line number Diff line change
Expand Up @@ -824,8 +824,14 @@ subroutine get_instance_filename(name_in,name_out)
if ( i .ne. 0 ) then
name_out = name_in(1:i-1)//'.'//trim(filename_appendix)//name_in(i:length)
else
!< If .nc is not in the name, add the appendix at the end of the file
name_out = name_in(1:length) //'.'//trim(filename_appendix)
i = index(trim(name_in), ".yaml", back=.true.)
if (i .ne. 0) then
!< If .yaml is in the filename add the appendix before it
name_out = name_in(1:i-1)//'.'//trim(filename_appendix)//name_in(i:length)
else
!< If .nc and .yaml are not in the name, add the appendix at the end of the file
name_out = name_in(1:length) //'.'//trim(filename_appendix)
endif
end if
end if

Expand Down
Loading

0 comments on commit 6373e8d

Please sign in to comment.