From ac416a9a4434f06720da3676e2d07d8f2ea134f7 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Tue, 10 Dec 2024 11:37:19 +1100 Subject: [PATCH 1/8] Added command line option for Vernier, added required flags in config joerg. --- infrastructure/build/fab/baf_base.py | 10 ++++ infrastructure/build/fab/default/config.py | 22 +++++++++ .../build/fab/joerg_default/config.py | 48 +++++++++---------- infrastructure/build/fab/lfric_base.py | 35 ++++++++++---- 4 files changed, 81 insertions(+), 34 deletions(-) diff --git a/infrastructure/build/fab/baf_base.py b/infrastructure/build/fab/baf_base.py index 8d0ee25..7236029 100755 --- a/infrastructure/build/fab/baf_base.py +++ b/infrastructure/build/fab/baf_base.py @@ -57,6 +57,9 @@ def __init__(self, name, root_symbol=None): self._tool_box = ToolBox() parser = self.define_command_line_options() self.handle_command_line_options(parser) + # Now allow further site-customisations depending on + # the command line arguments + self._site_config.handle_command_line_options(self._args) if root_symbol: self._root_symbol = root_symbol @@ -103,6 +106,13 @@ def config(self): ''' return self._config + @property + def args(self): + ''':returns: the arg parse objects containing the user's + command line information. + ''' + return self._args + def define_site_platform_target(self): '''This method defines the attributes site, platform (and target=site-platform) based on the command line option --site diff --git a/infrastructure/build/fab/default/config.py b/infrastructure/build/fab/default/config.py index 594da90..d3aedd8 100644 --- a/infrastructure/build/fab/default/config.py +++ b/infrastructure/build/fab/default/config.py @@ -1,10 +1,18 @@ #! /usr/bin/env python3 + +'''This module contains the default Baf configuration class. +''' + from default.setup_gnu import setup_gnu from default.setup_intel_classic import setup_intel_classic class Config: + '''This class is the default Configuration object for Baf builds. + It provides several callbacks which will be called from the build + scripts to allow site-specific customisations. + ''' def update_toolbox(self, build_config): '''Set the default compiler flags for the various compiler @@ -14,8 +22,22 @@ def update_toolbox(self, build_config): self.setup_classic_intel(build_config) self.setup_gnu(build_config) + def handle_command_line_options(self, args): + '''Additional callback function executed once all command line + options have been added. This is for example used to add + Vernier profiling flags, which are site-specific. + ''' + def setup_classic_intel(self, build_config): + '''For now call an external function, since it is expected that + this configuration can be very lengthy (once we support + compiler modes). + ''' setup_intel_classic(build_config) def setup_gnu(self, build_config): + '''For now call an external function, since it is expected that + this configuration can be very lengthy (once we support + compiler modes). + ''' setup_gnu(build_config) diff --git a/infrastructure/build/fab/joerg_default/config.py b/infrastructure/build/fab/joerg_default/config.py index 119d770..6379a50 100644 --- a/infrastructure/build/fab/joerg_default/config.py +++ b/infrastructure/build/fab/joerg_default/config.py @@ -1,14 +1,19 @@ #! /usr/bin/env python3 -from fab.tools import Category, ToolRepository +'''This module contains a setup for Joerg's laptop :) +''' + +import argparse +from typing import cast + +from fab.tools import Category, Linker, ToolRepository from default.config import Config as DefaultConfig class Config(DefaultConfig): - '''We need additional include flags for gfortran. Define this - by overwriting setup_gnu. - Also make gnu the default compiler. + '''This config class sets specific flags for Joerg's laptop :) + It makes gnu the default suite, and adds support for Vernier. ''' def __init__(self): @@ -16,25 +21,20 @@ def __init__(self): tr = ToolRepository() tr.set_default_compiler_suite("gnu") - def setup_gnu(self, build_config): - '''Define default compiler flags for GNU. + def handle_command_line_options(self, args: argparse.Namespace): + '''Called with the user's command line options. It checks if + Vernier profiling is requested, and if so, adds the required + include and linking flags. ''' - super().setup_gnu(build_config) - gfortran = ToolRepository().get_tool(Category.FORTRAN_COMPILER, - "gfortran") - gfortran.add_flags( - [ - # The lib directory contains mpi.mod - '-I', ('/home/joerg/work/spack/var/spack/environments/' - 'lfric-v0/.spack-env/view/lib'), - # mod_wait.mod - '-I', ('/home/joerg/work/spack/var/spack/environments/' - 'lfric-v0/.spack-env/view/include'), - '-DITSUPERWORKS' - ]) - for linker_name in ["linker-gfortran", "linker-mpif90-gfortran"]: - gfortran = ToolRepository().get_tool(Category.LINKER, linker_name) - gfortran.add_post_lib_flags( - ['-L', ('/home/joerg/work/spack/var/spack/' - 'environments/lfric-v0/.spack-env/view/lib')]) + super().handle_command_line_options(args) + if args.vernier: + tr = ToolRepository() + gfortran = tr.get_tool(Category.FORTRAN_COMPILER, "gfortran") + gfortran.add_flags( + ['-I', '/home/joerg/work/vernier/local/include']) + linker = tr.get_tool(Category.LINKER, "linker-gfortran") + linker = cast(Linker, linker) + linker.add_lib_flags( + "vernier", ["-L", "/home/joerg/work/vernier/local/lib", + "-lvernier_f", "-lvernier_c", "-lvernier"]) diff --git a/infrastructure/build/fab/lfric_base.py b/infrastructure/build/fab/lfric_base.py index 9b6f056..579cee2 100755 --- a/infrastructure/build/fab/lfric_base.py +++ b/infrastructure/build/fab/lfric_base.py @@ -106,9 +106,11 @@ class which can provide its own instance (to easily allow for a '--rose_picker', '-rp', type=str, default="v2.0.0", help="Version of rose_picker. Use 'system' to use an installed " "version.") + parser.add_argument("--vernier", action="store_true", default=False, + help="Support profiling with Vernier.") parser.add_argument( '--profile', '-pro', type=str, default="fast-debug", - help="Profie mode for compilation, choose from \ + help="Profile mode for compilation, choose from \ 'fast-debug'(default), 'full-debug', 'production'") parser.add_argument( '--precision', '-pre', type=str, default=None, @@ -174,7 +176,10 @@ def get_linker_flags(self) -> List[str]: :returns: list of flags for the linker. ''' - return ['yaxt', 'xios', 'netcdf', 'hdf5'] + super().get_linker_flags() + libs = ['yaxt', 'xios', 'netcdf', 'hdf5'] + if self._args.vernier: + libs.append("vernier") + return libs + super().get_linker_flags() def grab_files(self): dirs = ['infrastructure/source/', @@ -282,22 +287,32 @@ def preprocess_x90(self): def psyclone(self): psyclone_cli_args = self.get_psyclone_config() - compiler = self.config.tool_box[Category.FORTRAN_COMPILER] - linker = self.config.tool_box.get_tool(Category.LINKER, - mpi=self.config.mpi) - if "tau_f90.sh" in [compiler.exec_name, linker.exec_name]: - psyclone_cli_args.extend(self.get_psyclone_profiling_option()) + psyclone_cli_args.extend(self.get_additional_psyclone_options()) psyclone(self.config, kernel_roots=[self.config.build_output], transformation_script=self.get_transformation_script, api="dynamo0.3", cli_args=psyclone_cli_args) - def get_psyclone_config(self): + def get_psyclone_config(self) -> List[str]: + ''':returns: the command line options to pick the right + PSyclone config file. + ''' return ["--config", self._psyclone_config] - def get_psyclone_profiling_option(self): - return ["--profile", "kernels"] + def get_additional_psyclone_options(self) -> List[str]: + ''':returns: Additional PSyclone command line options. This + basic version checks if profiling using Tay or Vernier + is enabled, and if so, adds the kernel profiling flags + to PSyclone. + ''' + compiler = self.config.tool_box[Category.FORTRAN_COMPILER] + linker = self.config.tool_box.get_tool(Category.LINKER, + mpi=self.config.mpi) + if (self.args.vernier or + "tau_f90.sh" in [compiler.exec_name, linker.exec_name]): + return ["--profile", "kernels"] + return [] def get_transformation_script(self, fpath, config): ''':returns: the transformation script to be used by PSyclone. From 718aef0a93e6a5163651a32220747bb5a7b109fd Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Tue, 10 Dec 2024 11:55:48 +1100 Subject: [PATCH 2/8] Typing updates. --- infrastructure/build/fab/default/setup_gnu.py | 4 +++- infrastructure/build/fab/default/setup_intel_classic.py | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/infrastructure/build/fab/default/setup_gnu.py b/infrastructure/build/fab/default/setup_gnu.py index c42aed3..337a11b 100644 --- a/infrastructure/build/fab/default/setup_gnu.py +++ b/infrastructure/build/fab/default/setup_gnu.py @@ -6,8 +6,9 @@ This function gets called from the default site-specific config file ''' +from typing import cast from fab.build_config import BuildConfig -from fab.tools import Category, ToolRepository +from fab.tools import Category, Linker, ToolRepository def setup_gnu(build_config: BuildConfig): @@ -38,6 +39,7 @@ def setup_gnu(build_config: BuildConfig): # This will implicitly affect all gfortran based linkers, e.g. # linker-mpif90-gfortran will use these flags as well. linker = tr.get_tool(Category.LINKER, "linker-gfortran") + linker = cast(Linker, linker) linker.add_lib_flags("netcdf", nc_flibs) linker.add_lib_flags("yaxt", ["-lyaxt", "-lyaxt_c"]) linker.add_lib_flags("xios", ["-lxios"]) diff --git a/infrastructure/build/fab/default/setup_intel_classic.py b/infrastructure/build/fab/default/setup_intel_classic.py index 26e8901..40909ab 100644 --- a/infrastructure/build/fab/default/setup_intel_classic.py +++ b/infrastructure/build/fab/default/setup_intel_classic.py @@ -6,8 +6,10 @@ This function gets called from the default site-specific config file ''' +from typing import cast + from fab.build_config import BuildConfig -from fab.tools import Category, ToolRepository +from fab.tools import Category, Compiler, Linker, ToolRepository def setup_intel_classic(build_config: BuildConfig): @@ -25,6 +27,7 @@ def setup_intel_classic(build_config: BuildConfig): # that the intel compiler actually works. return + ifort = cast(Compiler, ifort) # The flag groups are mainly from infrastructure/build/fortran # /ifort.mk no_optimisation_flags = ['-O0'] @@ -81,6 +84,7 @@ def setup_intel_classic(build_config: BuildConfig): # This will implicitly affect all ifort based linkers, e.g. # linker-mpif90-ifort will use these flags as well. linker = tr.get_tool(Category.LINKER, "linker-ifort") + linker = cast(Linker, linker) linker.add_lib_flags("netcdf", nc_flibs) linker.add_lib_flags("yaxt", ["-lyaxt", "-lyaxt_c"]) linker.add_lib_flags("xios", ["-lxios"]) From e5e82de7b75f97ca2f3f1f396a516d8c73dd7270 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Tue, 10 Dec 2024 22:54:04 +1100 Subject: [PATCH 3/8] Added psydata profiling wrapper for tau and vernier, and get the installed automatically if tau or vernier is enabled. --- infrastructure/build/fab/lfric_base.py | 31 ++-- .../psyclone/psydata/tau}/tau_psy.f90 | 0 .../psyclone/psydata/vernier/vernier_psy.f90 | 145 ++++++++++++++++++ 3 files changed, 158 insertions(+), 18 deletions(-) rename infrastructure/{source/psydata => build/psyclone/psydata/tau}/tau_psy.f90 (100%) create mode 100644 infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 diff --git a/infrastructure/build/fab/lfric_base.py b/infrastructure/build/fab/lfric_base.py index 579cee2..efc4c43 100755 --- a/infrastructure/build/fab/lfric_base.py +++ b/infrastructure/build/fab/lfric_base.py @@ -200,24 +200,19 @@ def grab_files(self): grab_folder(self.config, src=self.lfric_core_root / dir, dst_label='psyclone_config') - # Get the implementation of the PSyData API for profiling when using - # TAU. wget requires internet, which gitlab runner does not have. - # So I temporarily store the tau_psy.f90 in this repo under - # `infrastructure/source/psydata``. During the install stage, this - # folder will be copied to lfric_core checkout. - # tau_psy.f90 will therefore be grabbed when `infrastructure/source`` - # is grabbed. - # compiler = self.config.tool_box[Category.FORTRAN_COMPILER] - # linker = self.config.tool_box[Category.LINKER] - # if "tau_f90.sh" in [compiler.exec_name, linker.exec_name]: - # _dst = self.config.source_root / 'psydata' - # if not _dst.is_dir(): - # _dst.mkdir(parents=True) - # wget = Tool("wget", "wget") - # wget.run(additional_parameters=['-N', - # 'https://raw.githubusercontent.com/stfc/PSyclone/' - # 'master/lib/profiling/tau/tau_psy.f90'], - # cwd=_dst) + compiler = self.config.tool_box[Category.FORTRAN_COMPILER] + linker = self.config.tool_box.get_tool(Category.LINKER, + mpi=self.config.mpi) + if (self.args.vernier or + "tau_f90.sh" in [compiler.exec_name, linker.exec_name]): + # Profiling. Grab the required psydata directory as well: + if self.args.vernier: + dir = "vernier" + else: + dir = "tau" + grab_folder(self.config, src=self.lfric_core_root / + "infrastructure" / "build" / "psyclone" / "psydata" + / dir, dst_label='psydata') def find_source_files(self, path_filters=None): self.configurator() diff --git a/infrastructure/source/psydata/tau_psy.f90 b/infrastructure/build/psyclone/psydata/tau/tau_psy.f90 similarity index 100% rename from infrastructure/source/psydata/tau_psy.f90 rename to infrastructure/build/psyclone/psydata/tau/tau_psy.f90 diff --git a/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 b/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 new file mode 100644 index 0000000..26eb713 --- /dev/null +++ b/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 @@ -0,0 +1,145 @@ +! ----------------------------------------------------------------------------- +! BSD 3-Clause License +! +! Copyright (c) 2024, Science and Technology Facilities Council. +! All rights reserved. +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions are met: +! +! * Redistributions of source code must retain the above copyright notice, this +! list of conditions and the following disclaimer. +! +! * Redistributions in binary form must reproduce the above copyright notice, +! this list of conditions and the following disclaimer in the documentation +! and/or other materials provided with the distribution. +! +! * Neither the name of the copyright holder nor the names of its +! contributors may be used to endorse or promote products derived from +! this software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +! DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +! FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +! DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +! SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +! OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +! ----------------------------------------------------------------------------- +! Author J. Henrichs, Bureau of Meteorology + + +!> An implemention of the PSyData API for profiling which wraps the use of Vernier. + +module profile_psy_data_mod + + ! The Vernier handle type + use vernier_mod, only : vik + implicit none + + type :: profile_PSyDataType + ! The opaque Vernier handle for a specific region + integer (kind=vik) :: vernier_handle + ! The name of the subroutine and module to be used by Vernier + character(:), allocatable :: name + ! True if this instance of PSyDataType has the name already + ! initialised. This way the copy of subroutine name is only + ! done first time PreStart is called. + logical :: initialised = .false. + contains + ! The profiling API uses only the two following calls: + procedure :: PreStart + procedure :: PostEnd + end type profile_PSyDataType + +contains + + ! --------------------------------------------------------------------------- + !> The initialisation subroutine. It is not called directly from + !! any PSyclone created code, so a call to profile_PSyDataInit must be + !! inserted manually by the developer. + + subroutine profile_PSyDataInit() + use vernier_mod, only: vernier_init + implicit none + call vernier_init(1) + end subroutine profile_PSyDataInit + + ! --------------------------------------------------------------------------- + !> Starts a profiling area. The module and region name can be used to create + !! a unique name for each region. + !! Parameters: + !! @param[in,out] this This PSyData instance. + !! @param[in] module_name Name of the module in which the region is + !! @param[in] region_name Name of the region (could be name of an invoke, or + !! subroutine name). + !! @param[in] num_pre_vars The number of variables that are declared and + !! written before the instrumented region. + !! @param[in] num_post_vars The number of variables that are also declared + !! before an instrumented region of code, but are written after + !! this region. + + subroutine PreStart(this, module_name, region_name, num_pre_vars, & + num_post_vars) + + use vernier_mod, only : vernier_start + implicit none + + class(profile_PSyDataType), intent(inout), target :: this + character(len=*), intent(in) :: module_name, region_name + integer, intent(in) :: num_pre_vars, num_post_vars + + if (.not. this%initialised) then + ! Venier only supports a single name, so we store the concatenated + ! strings to reduce runtime overhead + this%name = module_name//":"//region_name + this%initialised = .true. + endif + call vernier_start(this%vernier_handle, this%name) + + end subroutine PreStart + + ! --------------------------------------------------------------------------- + !! Ends a profiling area. It takes a PSyDataType type that corresponds to + !! to the PreStart call. + !! @param[in,out] this This PSyData instance. + ! + subroutine PostEnd(this) + + use vernier_mod, only : vernier_stop + + implicit none + + class(profile_PSyDataType), intent(inout), target :: this + + call vernier_stop(this%vernier_handle) + + end subroutine PostEnd + + ! --------------------------------------------------------------------------- + !> Called at the end of the execution of a program, usually to generate + !! all output for the profiling library. + subroutine profile_PSyDataShutdown() + use vernier_mod, only : vernier_finalize, vernier_write + + implicit none + call vernier_write() + call vernier_finalize() + end subroutine profile_PSyDataShutdown + + ! --------------------------------------------------------------------------- + !> Enable Vernier. + subroutine profile_PSyDataStart() + implicit none + end subroutine profile_PSyDataStart + + ! --------------------------------------------------------------------------- + !> Disable Vernier. + subroutine profile_PSyDataStop() + implicit none + end subroutine profile_PSyDataStop + +end module profile_psy_data_mod From f7447e617a0f1679231a0b77642c3037e44d65f2 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 30 Jan 2025 09:42:28 +1100 Subject: [PATCH 4/8] Used new path to Vernier. --- infrastructure/build/fab/joerg_default/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infrastructure/build/fab/joerg_default/config.py b/infrastructure/build/fab/joerg_default/config.py index 6379a50..4412fee 100644 --- a/infrastructure/build/fab/joerg_default/config.py +++ b/infrastructure/build/fab/joerg_default/config.py @@ -32,9 +32,9 @@ def handle_command_line_options(self, args: argparse.Namespace): tr = ToolRepository() gfortran = tr.get_tool(Category.FORTRAN_COMPILER, "gfortran") gfortran.add_flags( - ['-I', '/home/joerg/work/vernier/local/include']) + ['-I', '/home/joerg/work/Vernier/local/include']) linker = tr.get_tool(Category.LINKER, "linker-gfortran") linker = cast(Linker, linker) linker.add_lib_flags( - "vernier", ["-L", "/home/joerg/work/vernier/local/lib", + "vernier", ["-L", "/home/joerg/work/Vernier/local/lib", "-lvernier_f", "-lvernier_c", "-lvernier"]) From d8ffc26db6a69c988f4b91c31cea05dd6113d97a Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 30 Jan 2025 09:43:52 +1100 Subject: [PATCH 5/8] Pass openmp setting when requesting linker. --- infrastructure/build/fab/lfric_base.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/infrastructure/build/fab/lfric_base.py b/infrastructure/build/fab/lfric_base.py index efc4c43..e12a2d9 100755 --- a/infrastructure/build/fab/lfric_base.py +++ b/infrastructure/build/fab/lfric_base.py @@ -49,7 +49,7 @@ def __init__(self, name, root_symbol=None): # We need to find the apps directory (it will be required when # finding source files in the build scripts). We shouldn't assume # that it is 'next' to the core directory, nor should we assume - # that the name is 'apps'. In order to avoid reliance of any + # that the name is 'apps'. In order to avoid reliance on any # environment variable, we analyse the call tree to find the first # call that is not in our parent directory (in case that we ever # add another layer of base class). @@ -202,7 +202,8 @@ def grab_files(self): compiler = self.config.tool_box[Category.FORTRAN_COMPILER] linker = self.config.tool_box.get_tool(Category.LINKER, - mpi=self.config.mpi) + mpi=self.config.mpi, + openmp=self.config.openmp) if (self.args.vernier or "tau_f90.sh" in [compiler.exec_name, linker.exec_name]): # Profiling. Grab the required psydata directory as well: From a9954a88a43f847d3467bd3bd93ebfacfd223fba Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Thu, 30 Jan 2025 09:44:30 +1100 Subject: [PATCH 6/8] Add early error in case Vernier is requested, but the linker has no library flags for it. --- infrastructure/build/fab/lfric_base.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/infrastructure/build/fab/lfric_base.py b/infrastructure/build/fab/lfric_base.py index e12a2d9..fd44980 100755 --- a/infrastructure/build/fab/lfric_base.py +++ b/infrastructure/build/fab/lfric_base.py @@ -208,7 +208,13 @@ def grab_files(self): "tau_f90.sh" in [compiler.exec_name, linker.exec_name]): # Profiling. Grab the required psydata directory as well: if self.args.vernier: + try: + linker.get_lib_flags("vernier") + except RuntimeError: + raise RuntimeError(f"The linker{linker} does not have " + f"linker flags for Vernier.") dir = "vernier" + else: dir = "tau" grab_folder(self.config, src=self.lfric_core_root / From 490bd1c81464abf34c843bd4e8a7ca6f12dc9a1b Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Wed, 5 Feb 2025 10:05:04 +1100 Subject: [PATCH 7/8] Fixed typo. --- infrastructure/build/fab/lfric_base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infrastructure/build/fab/lfric_base.py b/infrastructure/build/fab/lfric_base.py index fd44980..e65cc70 100755 --- a/infrastructure/build/fab/lfric_base.py +++ b/infrastructure/build/fab/lfric_base.py @@ -304,7 +304,7 @@ def get_psyclone_config(self) -> List[str]: def get_additional_psyclone_options(self) -> List[str]: ''':returns: Additional PSyclone command line options. This - basic version checks if profiling using Tay or Vernier + basic version checks if profiling using Tau or Vernier is enabled, and if so, adds the kernel profiling flags to PSyclone. ''' From 8ad74316644cb77b6e53c163a8a6c2d6e59e6166 Mon Sep 17 00:00:00 2001 From: Joerg Henrichs Date: Wed, 5 Feb 2025 10:07:04 +1100 Subject: [PATCH 8/8] Added reference to ticket for empty functions. --- infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 b/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 index 26eb713..a2d05f8 100644 --- a/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 +++ b/infrastructure/build/psyclone/psydata/vernier/vernier_psy.f90 @@ -134,12 +134,16 @@ end subroutine profile_PSyDataShutdown !> Enable Vernier. subroutine profile_PSyDataStart() implicit none + ! Not supported by Vernier, see + ! https://github.com/MetOffice/Vernier/issues/153 end subroutine profile_PSyDataStart ! --------------------------------------------------------------------------- !> Disable Vernier. subroutine profile_PSyDataStop() implicit none + ! Not supported by Vernier, see + ! https://github.com/MetOffice/Vernier/issues/153 end subroutine profile_PSyDataStop end module profile_psy_data_mod