Skip to content

ESMF 8.8.0

Latest
Compare
Choose a tag to compare
@theurich theurich released this 10 Jan 17:18
· 4 commits to develop since this release

Overview

The 8.8.0 release of ESMF is backward compatible with ESMF 8.7.0 for all the interfaces that are marked as backward compatible in the Reference Manual. ESMF 8.8.0 introduces performance improvement, feature enhancement, and two bug fixes in different areas of the framework. Notably, the ESMF_StateReconcile() method has been fundamentally re-implemented in 8.8.0 to improve performance during the initialization phase of a coupled model. A new method ESMF_FieldEmptyReset() has been introduced to reset an ESMF Field back to a less complete field status. Extensions were made to the ESMF Geom class and NUOPC State metadata to add more capabilities and options for the user.

Although there are some API changes to add more options for users, in general this release requires no user code changes. However, please note that the following experimental methods that were not marked as backward compatible in previous releases are now removed in this version: ESMF_StateRead(), ESMF_StateWrite(), and ESMF_RouteHandlePrint(); this may require minor modifications to user code that contains the above methods.

In addition, ESMF 8.8.0 may introduce some bit-for-bit changes in second-order conservative weight calculation due to enhancements in the algorithm.

Lastly, ESMPy has been updated to support Python version 3.8 and above.

The ESMF team is grateful for the many years of support, ideation, feedback, testing, and code contributions that the ESMF user community has provided since its inception. We look forward to continuing this partnership with the community to further improve and add features to ESMF. As always, please utilize ESMF Discussions (https://github.com/orgs/esmf-org/discussions) or write esmf_support@ucar.edu with any questions or issues concerning ESMF.

Release Notes

  • The public Fortran API in this release is backward compatible with the previous release, ESMF 8.7.0, for all the interfaces that are marked as backward compatible in the Reference Manual. There were API changes to a few unmarked methods that may require minor modifications to user code that uses these methods. The complete list of API changes is summarized in a table showing interface changes since ESMF 8.7.0. The table includes the rationale and impact for each change.
  • Some bit-for-bit changes are expected for this release compared to ESMF 8.7.0. This is based on test runs with the Intel compiler suite using options “-O2 -fp-model precise”, and due to the following change:
    • The second-order conservative weight calculation algorithm used by the ESMF regrid weight generation methods and applications was modified to operate on the incoming destination cells in the order of their ids. This fixes an issue where sometimes weights were calculated slightly differently on different PETs due to changes in destination order. The fix was made to both the 2D Cartesian and 2D spherical weight calculation. Expected bit-for-bit changes:
      • Roundoff level changes to second-order conservative weights due to a change in calculation order.
    • The algorithm for calculating second-order conservative weights on the XGrid has been improved to use more of the information inherent in the XGrid. This removes some issues with unmapped cells as well as making the results more precise.
      • Changes to second-order conservative weights when calculated through the XGrid.
  • ESMPy has been updated to support newer Python versions and drop support for older versions; specifically:
    • Python 3.7 is no longer supported.
    • The LocStream __getitem__ function has been fixed for Python 3.12 and later.
    • Segmentation faults that sometimes occurred with MeshCreateFromFile and RouteHandleCreateFromFile have been fixed.
    • Some unit tests have been fixed to work with recent versions of numpy.
    • Some unused Python code was upgraded to Python 3; despite being unused, this code caused problems with some installations (e.g., via spack).
  • The NUOPC State metadata was extended to include a new option for the FieldTransferPolicy attribute: “transferAllWithNamespace”. This new option mirror transfers all of the Fields from the provider to the acceptor component by automatically placing them into the namespace of the provider component.
  • The ESMF_StateReconcile() method has been fundamentally re-implemented. This method plays a central role during the setup of multi-component coupled systems. Many users, particularly under NUOPC, do not directly interact with this ESMF method. However, the generic NUOPC Connector uses it heavily during the NUOPC initialization process. Previous to ESMF 8.8.0, the implementation of ESMF_StateReconcile() leveraged all-to-all communications, leading to memory usage and execution times that increased quadratic with the number of PETs across which the method was called. The new implementation completely avoids all-to-all communications, showing memory usage and execution times that increase close to the theoretically expected logarithmic scaling by the number of participating PETs.
  • The ESMF_StateRead(), ESMF_StateWrite(), ESMF_StateWriteRestart(), and ESMF_StateReadRestart() methods have been removed from the ESMF API. The implementation of these methods was very problematic and it was decided to remove them to prevent users from employing them in their code. If you do need them, please contact ESMF support (esmf_support@ucar.edu) and we can help find a solution.
  • Added the capability to reset an ESMF Field back to a less complete field status. This new functionality allows a Field to be repeatedly stripped down and then built up again with different features (e.g. with a different typekind). This capability is provided via the new method ESMF_FieldEmptyReset().
  • The ESMF Geom class was further extended to include equality and inequality operators, as well as the ESMF_GeomMatch() method. The later method outputs different levels of comparison between Geom objects.
  • Added support for creating a RouteHandle representing the transpose of a regrid weight matrix. This new RouteHandle is available through the ESMF_FieldRegridStore() interface.

Bug Fixes:

  • Fixed an issue where, with some compilers, Time Manager methods like ESMF_TimeGet() and ESMF_TimePrint() returned garbled time strings.
  • Fixed an issue where some sequences of regrid weight generation calls (e.g. ESMF_FieldRegridStore()) on a Field containing a Mesh can result in mask values from a previous call being used in a following call. For example, doing a bilinear regridding on a Field created on a Mesh on the ESMF_MESHLOC_ELEMENT location with one set of mask values followed by a conservative regridding on the same Mesh with a different set of mask values can lead to some wrong mask values being used during the second regridding.

Known Issues

Platform-specific issues:

  • It has been found that running ESMF applications across > 1000 MPI tasks on Infiniband based clusters, using IntelMPI requires setting environment variable FI_MLX_INJECT_LIMIT=0. This recommendation was made by Intel support staff when looking at larger ESMF applications that would hang inside MPI calls on such hardware for no apparent reason.
  • Compiling ESMF with GCC version 8.1.0 triggers an internal compiler error in ESMF_HConfig.F90 due to the use of allocatable character variables. Earlier and later versions of GCC do not have this issue.
  • On Darwin, with version 15 of the clang C compiler, when building under Rosetta, it is sometimes necessary to add “-Wl,-ld_classic” to environment variables ESMF_CXXLINKOPTS, ESMF_CLINKOPTS, and ESMF_F90LINKOPTS to work around link errors. (For more details, see the related GitHub issue.)
  • The Cray (cce) compiler currently has problems running PIO with mpiuni, at least for some versions of this compiler (tested with version 15.0.1).
  • There is an issue with intercepting the MPI calls for profiling on one of the supported platforms (hearhear: Darwin+gfortran+mpich set up via spack). This results in a single FAIL reported for ESMF_TraceMPIUTest.F90.

Documentation

Tables