serialbox: add new package (#28872)
This commit is contained in:
parent
cba918c081
commit
c80c92aa39
@ -0,0 +1,27 @@
|
||||
# This patch is applicable starting version 2.3.1
|
||||
--- a/examples/fortran/simple/m_ser.F90
|
||||
+++ b/examples/fortran/simple/m_ser.F90
|
||||
@@ -38 +38 @@ USE utils_ppser, ONLY: &
|
||||
- REAL(KIND=8), DIMENSION(:,:,:) :: a
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)), DIMENSION(:,:,:) :: a
|
||||
@@ -59 +59 @@ USE utils_ppser, ONLY: &
|
||||
- REAL(KIND=8), DIMENSION(:,:,:) :: a
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)), DIMENSION(:,:,:) :: a
|
||||
@@ -91,2 +91,2 @@ USE utils_ppser, ONLY: &
|
||||
- REAL(KIND=8), DIMENSION(:,:,:) :: a
|
||||
- REAL(KIND=8) :: rprecision
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)), DIMENSION(:,:,:) :: a
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)) :: rprecision
|
||||
@@ -97 +97 @@ USE utils_ppser, ONLY: &
|
||||
- prefix_ref='SerialboxTest',rprecision=rprecision,rperturb=1.0e-5_8)
|
||||
+ prefix_ref='SerialboxTest',rprecision=rprecision,rperturb=REAL(1.0e-5,SELECTED_REAL_KIND(15)))
|
||||
--- a/examples/fortran/simple/main_consumer.F90
|
||||
+++ b/examples/fortran/simple/main_consumer.F90
|
||||
@@ -14 +14 @@ PROGRAM main_consumer
|
||||
- REAL(KIND=8), DIMENSION(5,5,5) :: a
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)), DIMENSION(5,5,5) :: a
|
||||
--- a/examples/fortran/simple/main_producer.F90
|
||||
+++ b/examples/fortran/simple/main_producer.F90
|
||||
@@ -14 +14 @@ PROGRAM main_producer
|
||||
- REAL(KIND=8), DIMENSION(5,5,5) :: a
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)), DIMENSION(5,5,5) :: a
|
31
var/spack/repos/builtin/packages/serialbox/nag/ftg.patch
Normal file
31
var/spack/repos/builtin/packages/serialbox/nag/ftg.patch
Normal file
@ -0,0 +1,31 @@
|
||||
# This patch is applicable starting version 2.3.1
|
||||
--- a/src/serialbox-fortran/m_ser_ftg.f90
|
||||
+++ b/src/serialbox-fortran/m_ser_ftg.f90
|
||||
@@ -822,5 +822,5 @@ SUBROUTINE ftg_write_logical_1d(fieldname, field, lbounds, ubounds)
|
||||
CALL ftg_register_only_internal(fieldname, 'bool', fs_boolsize(), lbounds, ubounds)
|
||||
END IF
|
||||
- CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', TRIM(ADJUSTL(ftg_loc_hex(C_LOC(field)))))
|
||||
+ CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', 'N/A')
|
||||
END IF
|
||||
|
||||
@@ -853,5 +853,5 @@ SUBROUTINE ftg_write_logical_2d(fieldname, field, lbounds, ubounds)
|
||||
CALL ftg_register_only_internal(fieldname, 'bool', fs_boolsize(), lbounds, ubounds)
|
||||
END IF
|
||||
- CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', TRIM(ADJUSTL(ftg_loc_hex(C_LOC(field)))))
|
||||
+ CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', 'N/A')
|
||||
END IF
|
||||
|
||||
@@ -886,5 +886,5 @@ SUBROUTINE ftg_write_logical_3d(fieldname, field, lbounds, ubounds)
|
||||
CALL ftg_register_only_internal(fieldname, 'bool', fs_boolsize(), lbounds, ubounds)
|
||||
END IF
|
||||
- CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', TRIM(ADJUSTL(ftg_loc_hex(C_LOC(field)))))
|
||||
+ CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', 'N/A')
|
||||
END IF
|
||||
|
||||
@@ -919,5 +919,5 @@ SUBROUTINE ftg_write_logical_4d(fieldname, field, lbounds, ubounds)
|
||||
CALL ftg_register_only_internal(fieldname, 'bool', fs_boolsize(), lbounds, ubounds)
|
||||
END IF
|
||||
- CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', TRIM(ADJUSTL(ftg_loc_hex(C_LOC(field)))))
|
||||
+ CALL ftg_add_field_metainfo(TRIM(fieldname), 'ftg:loc', 'N/A')
|
||||
END IF
|
||||
|
@ -0,0 +1,9 @@
|
||||
# This patch is applicable starting version 2.0.1
|
||||
--- a/src/serialbox-fortran/utils_ppser.f90
|
||||
+++ b/src/serialbox-fortran/utils_ppser.f90
|
||||
@@ -33 +33 @@ MODULE utils_ppser
|
||||
-USE iso_fortran_env
|
||||
+USE f90_unix_proc; USE iso_fortran_env
|
||||
@@ -66 +66 @@ SUBROUTINE ppser_initialize(directory, prefix, mode, prefix_ref, mpi_rank, rprec
|
||||
- REAL(KIND=8), OPTIONAL, INTENT(IN) :: rprecision, rperturb
|
||||
+ REAL(KIND=SELECTED_REAL_KIND(15)), OPTIONAL, INTENT(IN) :: rprecision, rperturb
|
183
var/spack/repos/builtin/packages/serialbox/package.py
Normal file
183
var/spack/repos/builtin/packages/serialbox/package.py
Normal file
@ -0,0 +1,183 @@
|
||||
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
|
||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
|
||||
class Serialbox(CMakePackage):
|
||||
"""Serialbox is a serialization library and tools for C/C++, Python3 and
|
||||
Fortran. Serialbox is used in several projects for building validation
|
||||
frameworks against reference runs."""
|
||||
|
||||
homepage = "https://github.com/GridTools/serialbox"
|
||||
url = "https://github.com/GridTools/serialbox/archive/v2.6.1.tar.gz"
|
||||
|
||||
maintainers = ['skosukhin']
|
||||
|
||||
version('2.6.1', sha256='b795ce576e8c4fd137e48e502b07b136079c595c82c660cfa2e284b0ef873342')
|
||||
version('2.6.0', sha256='9199f8637afbd7f2b3c5ba932d1c63e9e14d553a0cafe6c29107df0e04ee9fae')
|
||||
version('2.5.4', sha256='f4aee8ef284f58e6847968fe4620e222ac7019d805bbbb26c199e4b6a5094fee')
|
||||
version('2.5.3', sha256='696499b3f43978238c3bcc8f9de50bce2630c07971c47c9e03af0324652b2d5d')
|
||||
|
||||
variant('c', default=True, description='enable C interface')
|
||||
variant('python', default=False, description='enable Python interface')
|
||||
variant('fortran', default=False, description='enable Fortran interface')
|
||||
variant('ftg', default=False,
|
||||
description='enable FortranTestGenerator frontend')
|
||||
variant('sdb', default=False, description='enable stencil debugger')
|
||||
variant('shared', default=True, description='build shared libraries')
|
||||
variant('examples', default=False, description='build the examples')
|
||||
variant('logging', default=True,
|
||||
description='enable the logging infrastructure')
|
||||
variant('async-api', default=True,
|
||||
description='enable the asynchronous API')
|
||||
variant('netcdf', default=False,
|
||||
description='build the NetCDF archive backend')
|
||||
variant('std-filesystem', default=True,
|
||||
description='use std::experimental::filesystem (no dependency on '
|
||||
'compiled boost libs)')
|
||||
|
||||
depends_on('cmake@3.12:', type='build')
|
||||
# We might be provided with an external vanilla cmake, and we need one with
|
||||
# with https://gitlab.kitware.com/cmake/cmake/-/merge_requests/5025
|
||||
depends_on('cmake@3.19:', when='%pgi', type='build')
|
||||
|
||||
depends_on('boost@1.54:', type='build')
|
||||
depends_on('boost+filesystem+system',
|
||||
when='~std-filesystem', type=('build', 'link'))
|
||||
|
||||
depends_on('netcdf-c', when='+netcdf')
|
||||
|
||||
depends_on('python@3.4:', when='+python', type=('build', 'run'))
|
||||
depends_on('py-numpy', when='+python', type=('build', 'run'))
|
||||
|
||||
# pp_ser fails to process source files containing Unicode character with
|
||||
# Python 3 (https://github.com/GridTools/serialbox/pull/249):
|
||||
patch('ppser_py3.patch', when='@2.2.1:')
|
||||
|
||||
# NAG patches:
|
||||
patch('nag/interface.patch', when='@2.0.1:%nag+fortran')
|
||||
patch('nag/examples.patch', when='@2.3.1:%nag+fortran+examples')
|
||||
patch('nag/ftg.patch', when='@2.3.1:%nag+ftg')
|
||||
|
||||
conflicts('+ftg', when='~fortran',
|
||||
msg='the FortranTestGenerator frontend requires the Fortran '
|
||||
'interface')
|
||||
conflicts('+ftg', when='@:2.2.999',
|
||||
msg='the FortranTestGenerator frontend is supported only '
|
||||
'starting version 2.3.0')
|
||||
conflicts('+sdb', when='~python',
|
||||
msg='the stencil debugger requires the Python interface')
|
||||
conflicts('+fortran', when='~c',
|
||||
msg='the Fortran interface requires the C interface')
|
||||
conflicts('+python', when='~c',
|
||||
msg='the Python interface requires the C interface')
|
||||
conflicts('+python', when='~shared',
|
||||
msg='the Python interface requires the shared libraries')
|
||||
|
||||
def patch(self):
|
||||
# The following is implemented as a method to avoid having two sets of
|
||||
# almost identical patch files: one with the CR symbols (for versions
|
||||
# 2.5.x) and one without them (for versions 2.6.x).
|
||||
|
||||
# Remove hard-coded -march=native
|
||||
# (see https://github.com/GridTools/serialbox/pull/233):
|
||||
if self.spec.satisfies('@2.0.1:2.6.0'):
|
||||
filter_file(
|
||||
r'^(\s*set\(CMAKE_CXX_FLAGS.*-march=native)',
|
||||
r'#\1', 'CMakeLists.txt')
|
||||
|
||||
# Do not fallback to boost::filesystem:
|
||||
if '+std-filesystem' in self.spec:
|
||||
filter_file(
|
||||
r'(message\()'
|
||||
r'STATUS( "std::experimental::filesystem not found).*("\))',
|
||||
r'\1FATAL_ERROR\2\3', 'CMakeLists.txt')
|
||||
|
||||
@property
|
||||
def libs(self):
|
||||
query_parameters = self.spec.last_query.extra_parameters
|
||||
|
||||
shared = '+shared' in self.spec
|
||||
|
||||
query2libraries = {
|
||||
tuple(): ['libSerialboxCore'],
|
||||
('c', 'fortran'): [
|
||||
'libSerialboxFortran',
|
||||
'libSerialboxC',
|
||||
'libSerialboxCore',
|
||||
],
|
||||
('c',): [
|
||||
'libSerialboxC',
|
||||
'libSerialboxCore',
|
||||
],
|
||||
('fortran',): [
|
||||
'libSerialboxFortran',
|
||||
'libSerialboxC',
|
||||
'libSerialboxCore'
|
||||
]
|
||||
}
|
||||
|
||||
key = tuple(sorted(query_parameters))
|
||||
libraries = query2libraries[key]
|
||||
|
||||
if self.spec.satisfies('@2.5.0:2.5'):
|
||||
libraries = [
|
||||
'{0}{1}'.format(name, 'Shared' if shared else 'Static')
|
||||
for name in libraries]
|
||||
|
||||
libs = find_libraries(
|
||||
libraries, root=self.prefix, shared=shared, recursive=True)
|
||||
|
||||
if libs:
|
||||
return libs
|
||||
|
||||
msg = 'Unable to recursively locate {0} libraries in {1}'
|
||||
raise spack.error.NoLibrariesError(
|
||||
msg.format(self.spec.name, self.spec.prefix))
|
||||
|
||||
def flag_handler(self, name, flags):
|
||||
cmake_flags = []
|
||||
|
||||
if name == 'cxxflags':
|
||||
# Intel (at least up to version 19.0.1, version 19.0.4 works) and
|
||||
# PGI (at least up to version 19.9, version 20.1.0 works) compilers
|
||||
# have problems with C++11 name mangling. An attempt to link to
|
||||
# libSerialboxCore leads to:
|
||||
# undefined reference to
|
||||
# `std::experimental::filesystem::v1::__cxx11::path::
|
||||
# _M_find_extension[abi:cxx11]() const'
|
||||
if any(self.spec.satisfies('{0}+std-filesystem'.format(x))
|
||||
for x in ['%intel@:19.0.1', '%pgi@:19.9']):
|
||||
cmake_flags.append('-D_GLIBCXX_USE_CXX11_ABI=0')
|
||||
|
||||
return flags, None, (cmake_flags or None)
|
||||
|
||||
def cmake_args(self):
|
||||
args = [
|
||||
'-DBOOST_ROOT:PATH=%s' % self.spec['boost'].prefix,
|
||||
# https://cmake.org/cmake/help/v3.15/module/FindBoost.html#boost-cmake
|
||||
self.define('Boost_NO_BOOST_CMAKE', True),
|
||||
self.define_from_variant('SERIALBOX_ENABLE_C', 'c'),
|
||||
self.define_from_variant('SERIALBOX_ENABLE_PYTHON', 'python'),
|
||||
self.define_from_variant('SERIALBOX_ENABLE_FORTRAN', 'fortran'),
|
||||
self.define_from_variant('SERIALBOX_ENABLE_FTG', 'ftg'),
|
||||
self.define_from_variant('SERIALBOX_ENABLE_SDB', 'sdb'),
|
||||
self.define_from_variant('SERIALBOX_BUILD_SHARED', 'shared'),
|
||||
self.define_from_variant('SERIALBOX_EXAMPLES', 'examples'),
|
||||
self.define_from_variant('SERIALBOX_LOGGING', 'logging'),
|
||||
self.define_from_variant('SERIALBOX_ASYNC_API', 'async-api'),
|
||||
# CMake scripts of Serialbox (at least up to version 2.6.0) are
|
||||
# broken and do not instruct the compiler to link to the OpenSSL
|
||||
# libraries:
|
||||
self.define('SERIALBOX_USE_OPENSSL', False),
|
||||
self.define_from_variant('SERIALBOX_ENABLE_EXPERIMENTAL_FILESYSTEM',
|
||||
'std-filesystem'),
|
||||
self.define_from_variant('SERIALBOX_USE_NETCDF', 'netcdf'),
|
||||
self.define('SERIALBOX_TESTING', self.run_tests),
|
||||
]
|
||||
|
||||
if '+netcdf' in self.spec:
|
||||
args.append('-DNETCDF_ROOT:PATH=%s' % self.spec['netcdf-c'].prefix)
|
||||
|
||||
return args
|
23
var/spack/repos/builtin/packages/serialbox/ppser_py3.patch
Normal file
23
var/spack/repos/builtin/packages/serialbox/ppser_py3.patch
Normal file
@ -0,0 +1,23 @@
|
||||
# This patch is applicable starting version 2.2.1
|
||||
--- a/src/serialbox-python/pp_ser/pp_ser.py
|
||||
+++ b/src/serialbox-python/pp_ser/pp_ser.py
|
||||
@@ -51 +51 @@ __email__ = 'oliver.fuhrer@meteoswiss.ch'
|
||||
-def to_ascii(text):
|
||||
+def open23(name, mode='r'):
|
||||
@@ -53 +53,9 @@ def to_ascii(text):
|
||||
- return bytes(text, 'ascii')
|
||||
+ return open(name, mode,
|
||||
+ encoding=(None if 'b' in mode else 'UTF-8'))
|
||||
+ else:
|
||||
+ return open(name, mode)
|
||||
+
|
||||
+
|
||||
+def bytes23(text):
|
||||
+ if sys.version_info[0] == 3:
|
||||
+ return bytes(text, 'UTF-8')
|
||||
@@ -815 +823 @@ class PpSer:
|
||||
- input_file = open(os.path.join(self.infile), 'r')
|
||||
+ input_file = open23(os.path.join(self.infile), 'r')
|
||||
@@ -860 +868 @@ class PpSer:
|
||||
- output_file.write(to_ascii(self.__outputBuffer))
|
||||
+ output_file.write(bytes23(self.__outputBuffer))
|
Loading…
Reference in New Issue
Block a user