Skip to content

Commit

Permalink
Merge branch 'main' of github.com:noaa-gfdl/fms into sat_vapor_pres_w…
Browse files Browse the repository at this point in the history
…arning
  • Loading branch information
rem1776 authored and rem1776 committed Dec 2, 2024
2 parents a9225ae + 3333fac commit b4f8364
Show file tree
Hide file tree
Showing 44 changed files with 871 additions and 76 deletions.
33 changes: 33 additions & 0 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 @@ -458,3 +460,34 @@ install(EXPORT FMSExports
NAMESPACE FMS::
FILE fms-targets.cmake
DESTINATION ${CONFIG_INSTALL_DESTINATION})

# pkgconf
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(includedir ${CMAKE_INSTALL_PREFIX}/${includeDir})

set(CC ${CMAKE_C_COMPILER})
set(FC ${CMAKE_Fortran_COMPILER})
set(CFLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE}}")
set(CPPFLAGS "${CMAKE_CPP_FLAGS} ${CMAKE_CPP_FLAGS_${CMAKE_BUILD_TYPE}}")
set(FCFLAGS "${CMAKE_Fortran_FLAGS} ${CMAKE_Fortran_FLAGS_${CMAKE_BUILD_TYPE}}")
set(LDFLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CMAKE_SHARED_LINKER_FLAGS_${CMAKE_BUILD_TYPE}}")

set(VERSION ${PROJECT_VERSION})

# TODO: If FMS depends on a library that is built as a static library, it
# should be listed here as an ldflag.
set(LIBS "")

if(NOT ${NetCDF_Fortran_LIBRARY_SHARED})
# autotools: Libs.private: -lnetcdff -lnetcdf
string(APPEND LIBS ${NetCDF_Fortran_LIBRARIES})
endif()

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/FMS.pc.in
${CMAKE_CURRENT_BINARY_DIR}/FMS.pc @ONLY)

install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FMS.pc
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
COMPONENT utilities)
2 changes: 1 addition & 1 deletion FMS.pc.in
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ Name: FMS
Description: The Flexible Modeling System Infrastructure Library
URL: https://www.gfdl.noaa.gov/fms
Version: @VERSION@
Libs: -L$(libdir) -lFMS
Libs: -L${libdir} -lFMS
Libs.private: @LIBS@
Cflags: -I${includedir}
Fflags: -I${includedir}
17 changes: 11 additions & 6 deletions block_control/block_control.F90
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,9 @@

module block_control_mod

use mpp_mod, only: mpp_error, NOTE, WARNING, FATAL
use mpp_mod, only: mpp_error, NOTE, WARNING, FATAL, mpp_sum, mpp_npes
use mpp_domains_mod, only: mpp_compute_extent
use fms_string_utils_mod, only: string
implicit none

public block_control_type
Expand Down Expand Up @@ -104,15 +105,19 @@ subroutine define_blocks (component, Block, isc, iec, jsc, jec, kpts, &
integer, dimension(ny_block) :: j1, j2
character(len=256) :: text
integer :: i, j, nblks, ix, ii, jj
integer :: non_uniform_blocks !< Number of non uniform blocks

if (message) then
non_uniform_blocks = 0
if ((mod(iec-isc+1,nx_block) .ne. 0) .or. (mod(jec-jsc+1,ny_block) .ne. 0)) then
write( text,'(a,a,2i4,a,2i4,a)' ) trim(component),'define_blocks: domain (',&
(iec-isc+1), (jec-jsc+1),') is not an even divisor with definition (',&
nx_block, ny_block,') - blocks will not be uniform'
call mpp_error (WARNING, trim(text))
non_uniform_blocks = 1
endif
call mpp_sum(non_uniform_blocks)
if (non_uniform_blocks > 0 ) then
call mpp_error(NOTE, string(non_uniform_blocks)//" out of "//string(mpp_npes())//" total domains "//&
"have non-uniform blocks for block size ("//string(nx_block)//","//string(ny_block)//")")
message = .false.
endif
message = .false.
endif

!--- set up blocks
Expand Down
5 changes: 5 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -533,7 +533,12 @@ AC_CONFIG_FILES([
test_fms/random_numbers/Makefile
test_fms/topography/Makefile
test_fms/column_diagnostics/Makefile
test_fms/block_control/Makefile
FMS.pc
])

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: 2 additions & 2 deletions diag_manager/diag_manager.F90
Original file line number Diff line number Diff line change
Expand Up @@ -1789,7 +1789,7 @@ LOGICAL FUNCTION diag_send_data(diag_field_id, field, time, is_in, js_in, ks_in,
allocate(mask_remap(1:size(mask,1), 1:size(mask,2), 1:size(mask,3), 1))
mask_remap(:,:,:,1) = mask
endif
diag_send_data = fms_diag_object%fms_diag_accept_data(diag_field_id, field_remap, mask_remap, rmask_remap, &
call fms_diag_object%fms_diag_accept_data(diag_field_id, field_remap, mask_remap, rmask_remap, &
time, is_in, js_in, ks_in, ie_in, je_in, ke_in, weight, &
err_msg)
deallocate (field_remap)
Expand Down Expand Up @@ -3518,7 +3518,7 @@ LOGICAL FUNCTION send_data_4d(diag_field_id, field, time, is_in, js_in, ks_in, &
if (present(mask)) mask_local = mask
if (present(rmask)) rmask_local = rmask

send_data_4d = fms_diag_object%fms_diag_accept_data(diag_field_id, field, mask_local, rmask_local, &
call fms_diag_object%fms_diag_accept_data(diag_field_id, field, mask_local, rmask_local, &
time, is_in, js_in, ks_in, ie_in, je_in, ke_in, weight, &
err_msg)

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.
14 changes: 5 additions & 9 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 Expand Up @@ -536,7 +537,7 @@ end function fms_diag_axis_init
!! multithreaded case.
!! \note If some of the diag manager is offloaded in the future, then it should be treated similarly
!! to the multi-threaded option for processing later
logical function fms_diag_accept_data (this, diag_field_id, field_data, mask, rmask, &
subroutine fms_diag_accept_data (this, diag_field_id, field_data, mask, rmask, &
time, is_in, js_in, ks_in, &
ie_in, je_in, ke_in, weight, err_msg)
class(fmsDiagObject_type),TARGET, INTENT(inout) :: this !< Diaj_obj to fill
Expand Down Expand Up @@ -680,8 +681,6 @@ logical function fms_diag_accept_data (this, diag_field_id, field_data, mask, rm
!$omp end critical
call this%FMS_diag_fields(diag_field_id)%set_data_buffer(field_data, oor_mask, field_weight, &
is, js, ks, ie, je, ke)
fms_diag_accept_data = .TRUE.
return
else

!< At this point if we are no longer in an openmp region or running with 1 thread
Expand Down Expand Up @@ -709,13 +708,10 @@ logical function fms_diag_accept_data (this, diag_field_id, field_data, mask, rm
if(.not. this%FMS_diag_fields(diag_field_id)%has_mask_allocated()) &
call this%FMS_diag_fields(diag_field_id)%allocate_mask(oor_mask)
call this%FMS_diag_fields(diag_field_id)%set_mask(oor_mask, field_info)
return
end if main_if
!> Return false if nothing is done
fms_diag_accept_data = .FALSE.
return
#endif
end function fms_diag_accept_data
end subroutine fms_diag_accept_data

!< @brief Do the math for all the buffers
subroutine do_buffer_math(this)
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
1 change: 1 addition & 0 deletions libFMS.F90
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,7 @@ module fms
fms_string_utils_sort_this => fms_sort_this, &
fms_string_utils_find_my_string => fms_find_my_string, &
fms_string_utils_find_unique => fms_find_unique, &
fms_string_utils_f2c_string => fms_f2c_string, &
fms_string_utils_c2f_string => fms_c2f_string, &
fms_string_utils_cstring2cpointer => fms_cstring2cpointer, &
fms_string_utils_copy => string_copy
Expand Down
2 changes: 1 addition & 1 deletion test_fms/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ ACLOCAL_AMFLAGS = -I m4
SUBDIRS = astronomy coupler diag_manager data_override exchange monin_obukhov drifters \
mosaic2 interpolator fms mpp mpp_io time_interp time_manager horiz_interp topography \
field_manager axis_utils affinity fms2_io parser string_utils sat_vapor_pres tracer_manager \
random_numbers diag_integral column_diagnostics tridiagonal
random_numbers diag_integral column_diagnostics tridiagonal block_control

# testing utility scripts to distribute
EXTRA_DIST = test-lib.sh.in intel_coverage.sh.in tap-driver.sh
Loading

0 comments on commit b4f8364

Please sign in to comment.