Skip to content

Release 0.7.0

Compare
Choose a tag to compare
@LourensVeen LourensVeen released this 22 Jun 21:27
· 123 commits to develop since this release

MUSCLE3 0.7.0

MUSCLE3 is the third incarnation of the Multiscale Coupling Library and Environment, and the successor to MUSCLE 2. Its purpose is to make creating coupled multiscale simulations easy, and to then enable efficient Uncertainty Quantification of such models using advanced semi-intrusive algorithms.

MUSCLE3 uses the Multiscale Modelling and Simulation Language (MMSL) to describe the structure of a multiscale model. MMSL can be expressed in the form of a diagram (gMMSL; not yet implemented) or as a YAML file (yMMSL; this is convenient both for people and for software). The MMSL lets one describe which components (submodels, scale bridges, data converters, UQ components, etc.) a multiscale model consist of, how many instances of each we need, and how they are wired together.

MUSCLE3 is intended to scale from your laptop to the exascale. At the low end, it supports a non-distributed but parallel mode in which an entire multiscale simulation, including all component implementations and the MMSL configuration, is in a single (short) Python file. Next is a distributed mode where the manager and component instances run on multiple nodes in a cluster, and communicate directly with one another. Beyond that, additional components and optimisations are envisioned that would allow scaling to huge machines or combinations of multiple machines. Our goal is to make the transitions between these modes as smooth as possible, so that extra compute power can be added gradually, as needed.

Added

  • Checkpointing is now supported in C++ and Fortran as well
  • Added built-in profiling feature
  • New object-oriented Fortran API (existing API also still available)
  • New Instance.list_settings() function
  • Build support for macOS with CLang and G++/GFortran
  • Build support for Cray machines and compilers

Improved

  • Compiling with MPI and linking without or vice versa is now impossible
  • Fixed MessagePack build failure on old OSes
  • Fixed resource allocation for instance sets
  • Planner now detects F_INIT -> O_F loops and gives an error
  • Manager correctly handles instances that never register
  • Last lines of log now printer to screen on error for smoother problem solving
  • Various small fixes and improvements

Backwards Incompatible changes

  • Instance.reuse_instance no longer accepts apply_overlay argument. Use InstanceFlags.DONT_APPLY_OVERLAY when creating the instance instead.

  • LIBMUSCLE_Instance_create signature has changed, this might lead to errors like:

        30 |     instance = LIBMUSCLE_Instance_create(ports, MPI_COMM_WORLD, root_rank)
           |               1
     Error: Type mismatch in argument ‘flags’ at (1); passed INTEGER(4) to TYPE(libmuscle_instanceflags)
    

    You may provide an explicit InstanceFlags() argument, or use named arguments:

    instance = LIBMUSCLE_Instance_create(ports, LIBMUSCLE_InstanceFlags(), MPI_COMM_WORLD, root_rank)
    instance = LIBMUSCLE_Instance_create(ports, communicator=MPI_COMM_WORLD, root=root_rank)
    
  • DataConstRef items can no longer be added to a Data containing a list or dict. The newly added DataConstRef::list and DataConstRef::dict should be used instead.

Thanks

  • Maarten at Ignition Computing for implementing much of the above
  • Peter for debugging the MessagePack build issue
  • Peter, Jon and Gavin for ARCHER2 access and support
  • Koen for testing macOS build support
  • Everyone who reported issues and contributed feature ideas!