diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 5de4406..07d1201 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,328 +1,326 @@
stages:
- docker
- lint
- build
- test
- deploy
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG
GIT_SUBMODULE_STRATEGY: recursive
BUILD_DIR: build-release
MAIN_BRANCH: master
cache:
key: "$CI_COMMIT_REF_SLUG"
# ------------------------------------------------------------------------------
.docker_build:
stage: docker
image: docker:24
services:
- docker:24
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
DEFAULT_IMAGE: $CI_REGISTRY_IMAGE:$CI_DEFAULT_BRANCH
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
script:
- docker pull $DEFAULT_IMAGE-$IMAGE_NAME || true
- docker build --cache-from $DEFAULT_IMAGE-$IMAGE_NAME
-t $IMAGE_TAG-$IMAGE_NAME -f $DOCKERFILE .
- docker push $IMAGE_TAG-$IMAGE_NAME
docker build:debian:
variables:
IMAGE_NAME: debian-stable
DOCKERFILE: tests/ci/docker/debian.mpi
extends: .docker_build
docker build:manylinux:
variables:
IMAGE_NAME: manylinux
DOCKERFILE: tests/ci/docker/manylinux
extends: .docker_build
.docker build:cuda:
variables:
IMAGE_NAME: cuda
DOCKERFILE: tests/ci/docker/ubuntu_lts.cuda
extends: .docker_build
# ------------------------------------------------------------------------------
.debian_stable:
variables:
output: ${CI_COMMIT_REF_SLUG}-debian-stable
image: ${IMAGE_TAG}-debian-stable
.manylinux:
variables:
output: ${CI_COMMIT_REF_SLUG}-manylinux
image: ${IMAGE_TAG}-manylinux
.cuda:
variables:
output: ${CI_COMMIT_REF_SLUG}-cuda
image: ${IMAGE_TAG}-cuda
# ------------------------------------------------------------------------------
lint:
stage: lint
extends:
- .debian_stable
allow_failure: true
variables:
CLANG_PATCH: clang_format.patch
FLAKE_ERRORS: flake8_lint.txt
script:
- git remote remove upstream || true
- git remote add upstream "$CI_PROJECT_URL"
- git fetch upstream
- '[ -z "$CI_MERGE_REQUEST_TARGET_BRANCH_NAME" ] && HEAD="$CI_COMMIT_BEFORE_SHA" || HEAD="upstream/$CI_MERGE_REQUEST_TARGET_BRANCH_NAME"'
- echo "$HEAD"
- clang-format --version
- clang-format --dump-config
- git-clang-format --diff "$HEAD" | tee $CLANG_PATCH
- python3 -m flake8 python/ | tee $FLAKE_ERRORS
- ( grep "no modified files to format" $CLANG_PATCH || grep "clang-format did not modify any files" $CLANG_PATCH ) && [ ! -s $FLAKE_ERRORS ]
artifacts:
when: on_failure
paths:
- $CLANG_PATCH
- $FLAKE_ERRORS
.build:
stage: build
variables:
COMPILE_LOG: compilation.log
script:
- scons 2>&1 | tee $COMPILE_LOG
artifacts:
when: always
paths: &build_artifacts
- build-setup.conf
- $COMPILE_LOG
- $BUILD_DIR
- config.log
- "*.json"
.ccache:
variables:
CCACHE_BASEDIR: $CI_PROJECT_DIR/$BUILD_DIR
CCACHE_DIR: $CI_PROJECT_DIR/.ccache
CCACHE_NOHASDIR: 1
CCACHE_COMPILERCHECK: content
CXX: /usr/lib/ccache/g++
OMPI_CXX: ${CXX}
cache:
key: ${output}
policy: pull-push
paths:
- .ccache
after_script:
- ccache --show-stats || true
library:
extends:
- .build
- .debian_stable
- .ccache
before_script:
- ccache --zero-stats || true
- bear -- scons build_tests=True
- use_googletest=True
build_python=True
py_exec=python3
use_mpi=$USE_MPI
backend=$BACKEND
fftw_threads=$FFTW_THREADS
verbose=True -h
parallel:
matrix:
- BACKEND: [cpp, omp]
USE_MPI: ["True", "False"]
FFTW_THREADS: [none, omp]
.build:cuda:
extends:
- .build
- .cuda
before_script:
- scons build_tests=True
use_googletest=True
build_python=True
py_exec=python3
use_mpi=False
backend=cuda
fftw_threads=none
verbose=True -h
documentation:
stage: build
extends:
- .build
- .debian_stable
- .ccache
variables:
PYTHONPATH: $CI_PROJECT_DIR/$BUILD_DIR/python
before_script:
- scons build_tests=False
- use_googletest=False
build_python=True
py_exec=python3
use_mpi=False
backend=cpp
fftw_threads=none
verbose=True -h
after_script:
- scons doc
# ------------------------------------------------------------------------------
static-checks:
stage: test
dependencies:
- "library: [cpp, False, none]"
allow_failure: true
extends: .debian_stable
variables:
CLANG_TIDY_FILE: clang_tidy.txt
MYPY_FILE: mypy.txt
script:
- jq 'del( .[] | select(.file|test("^(src/core/fftw/mpi/.*|tests/test_mpi.cpp)")))' compile_commands.json > compile_commands.json.strip
- mv compile_commands.json.strip compile_commands.json
- run-clang-tidy -extra-arg=-UTAMAAS_USE_MPI -header-filter="build-release/.*" -quiet src tests python > $CLANG_TIDY_FILE || true
- '[ -d build-release/python ] && ( mypy --ignore-missing-import build-release/python > $MYPY_FILE || true ) || true'
- '! grep -E "(warning|error)" $CLANG_TIDY_FILE && ! grep "error" $MYPY_FILE'
artifacts:
when: on_failure
paths:
- $CLANG_TIDY_FILE
- $MYPY_FILE
test:mpi:
stage: test
dependencies:
- "library: [cpp, True, none]"
extends: .debian_stable
variables:
PYTHONPATH: $CI_PROJECT_DIR/$BUILD_DIR/python
TESTS: $BUILD_DIR/tests
JUNITXML: results.xml
TESTS_LOG: tests.log
script:
- ls $PYTHONPATH
- python3 -c "import sys; print(sys.path)"
- python3 -m pytest -vvv --last-failed --durations=0 --junitxml=$JUNITXML
$TESTS 2>&1 | tee $TESTS_LOG
after_script:
- python3 -m pytest --cache-show || true
artifacts:
when: always
paths:
- $JUNITXML
- $TESTS_LOG
reports:
junit:
- $JUNITXML
cache:
key: ${output}-pytest
policy: pull-push
paths:
- .pytest_cache
# ------------------------------------------------------------------------------
.protected_refs:
extends: .manylinux
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH || $CI_COMMIT_TAG =~ /^v.*/'
wheels:
stage: build
extends:
- .manylinux
- .ccache
before_script:
- ccache --zero-stats || true
script:
- ./tests/ci/build_wheels.sh
artifacts:
paths:
- dist/wheelhouse
# ------------------------------------------------------------------------------
.deploy_wheels:
stage: deploy
extends: .protected_refs
dependencies:
- wheels
script:
python -m twine upload --verbose --skip-existing dist/wheelhouse/*
package:gitlab:
extends: .deploy_wheels
variables:
TWINE_USERNAME: gitlab-ci-token
TWINE_PASSWORD: ${CI_JOB_TOKEN}
TWINE_REPOSITORY_URL: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi
package:pypi:
extends: .deploy_wheels
variables:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${PYPI_TOKEN}
rules:
- if: '$CI_COMMIT_TAG =~ /^v.*/'
package:zenodo:
stage: deploy
extends: .debian_stable
dependencies: [] # do not download artifacts => clean tree
variables:
TAMAAS_RECORD: 5713675
script:
- scons archive
- 'TAMAAS_VERSION="$(./INFOS.py --version)"'
- ./tests/ci/zenodo.py
--record ${TAMAAS_RECORD}
--token ${ZENODO_TOKEN}
--version ${TAMAAS_VERSION}
CHANGELOG.md
COPYING
README.md
tamaas-${TAMAAS_VERSION}.tar.gz
rules:
- if: '$CI_COMMIT_TAG =~ /^v.*/'
package:docker:
stage: deploy
extends: .docker_build
variables:
DOCKERFILE: Dockerfile
script:
- '[ "$CI_COMMIT_REF_SLUG" = "$MAIN_BRANCH" ] && IMAGE="$CI_REGISTRY_IMAGE:latest"
|| IMAGE="$IMAGE_TAG"'
- docker pull $IMAGE || true
- docker build --cache-from $IMAGE --build-arg USE_MPI=True
-t $IMAGE -f $DOCKERFILE .
- docker push $IMAGE
pages:
stage: deploy
dependencies: [documentation]
script:
- mv $CI_PROJECT_DIR/$BUILD_DIR/doc/sphinx/html public
artifacts:
paths:
- public
rules:
- if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
diff --git a/SConstruct b/SConstruct
index 36afec8..f043f5f 100644
--- a/SConstruct
+++ b/SConstruct
@@ -1,493 +1,494 @@
# -*- mode:python; coding: utf-8 -*-
# vim: set ft=python:
#
# Copyright (©) 2016-2023 EPFL (École Polytechnique Fédérale de Lausanne),
# Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
# Copyright (©) 2020-2023 Lucas Frérot
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
# ------------------------------------------------------------------------------
# Imports
# ------------------------------------------------------------------------------
from __future__ import print_function
import sys
import os
from subprocess import check_output
from warnings import warn
# Import below not strictly necessary, but good for pep8
from SCons.Script import (
EnsurePythonVersion,
EnsureSConsVersion,
Help,
Environment,
Variables,
EnumVariable,
PathVariable,
BoolVariable,
ListVariable,
Split,
Export,
)
from SCons.Errors import StopError
from SCons import __version__ as scons_version
from version import get_git_subst
from detect import (FindFFTW, FindBoost, FindThrust, FindCuda, FindExpolit,
FindPybind11, FindLibCUDACXX, FindPETSc)
from INFOS import TAMAAS_INFOS
# ------------------------------------------------------------------------------
EnsurePythonVersion(3, 6)
EnsureSConsVersion(3, 0)
# ------------------------------------------------------------------------------
def detect_dependencies(env):
"Detect all dependencies"
fftw_comp = {
'omp': ['omp'],
'threads': ['threads'],
'none': [],
}
fftw_components = fftw_comp[env['fftw_threads']]
if main_env['use_mpi']:
fftw_components.append('mpi')
if main_env['use_fftw']:
FindFFTW(env, fftw_components, precision=env['real_type'])
if main_env['use_cuda']:
FindCuda(env)
FindBoost(env, [
'boost/version.hpp',
'boost/preprocessor/seq.hpp',
'boost/variant.hpp',
])
# Use thrust shipped with cuda if cuda is requested
thrust_var = 'CUDA_ROOT' if env['use_cuda'] else 'THRUST_ROOT'
FindThrust(env, env['backend'], thrust_var)
FindLibCUDACXX(env, "LIBCUDACXX_ROOT")
if env['build_python']:
FindPybind11(env)
if env['use_petsc']:
FindPETSc(env)
FindExpolit(env)
def subdir(env, dir):
"Building a sub-directory"
return env.SConscript(env.File('SConscript', dir),
variant_dir=env.Dir(dir, env['build_dir']),
duplicate=True)
def print_build_info(env):
info = ("-- Tamaas ${version}\n" + "-- SCons {} (Python {}.{})\n".format(
scons_version, sys.version_info.major, sys.version_info.minor) +
"-- Build type: ${build_type}\n" +
"-- Thrust backend: ${backend}\n" +
("-- FFTW threads: ${fftw_threads}\n" if env['use_fftw'] else '') +
- "-- MPI: ${use_mpi}\n" + "-- Build directory: ${build_dir}\n" +
+ "-- MPI: ${use_mpi}\n" + "-- PETSc: ${use_petsc}\n" +
+ "-- Build directory: ${build_dir}\n" +
("-- Python version (bindings): $py_version"
if env['build_python'] else ''))
print(env.subst(info))
# ------------------------------------------------------------------------------
# Main compilation
# ------------------------------------------------------------------------------
# Compilation colors
colors = {
'cyan': '\033[96m',
'purple': '\033[95m',
'blue': '\033[94m',
'green': '\033[92m',
'yellow': '\033[93m',
'gray': '\033[38;5;8m',
'orange': '\033[38;5;208m',
'red': '\033[91m',
'end': '\033[0m'
}
# Inherit all environment variables (for CXX detection, etc.)
main_env = Environment(ENV=os.environ, )
# Set tamaas information
for k, v in TAMAAS_INFOS._asdict().items():
main_env[k] = v
main_env['COLOR_DICT'] = colors
main_env.AddMethod(subdir, 'SubDirectory')
# Build variables
vars = Variables('build-setup.conf')
vars.AddVariables(
EnumVariable('build_type',
'Build type',
'release',
allowed_values=('release', 'profiling', 'debug'),
ignorecase=2),
EnumVariable('backend',
'Thrust backend',
'cpp',
allowed_values=('cpp', 'omp', 'tbb', 'cuda'),
ignorecase=2),
EnumVariable('fftw_threads',
'Threads FFTW library preference',
'none',
allowed_values=('omp', 'threads', 'none'),
ignorecase=2),
EnumVariable('sanitizer',
'Sanitizer type',
'none',
allowed_values=('none', 'memory', 'leaks', 'address'),
ignorecase=2),
PathVariable('prefix', 'Prefix where to install', '/usr/local',
PathVariable.PathAccept),
# Dependencies paths
PathVariable('FFTW_ROOT', 'FFTW custom path', os.getenv('FFTW_ROOT', ''),
PathVariable.PathAccept),
PathVariable('THRUST_ROOT', 'Thrust custom path',
os.getenv('THRUST_ROOT', ''), PathVariable.PathAccept),
PathVariable('LIBCUDACXX_ROOT', 'libcudacxx custom path',
os.getenv('LIBCUDACXX_ROOT', ''), PathVariable.PathAccept),
PathVariable('BOOST_ROOT', 'Boost custom path',
os.getenv('BOOST_ROOT', ''), PathVariable.PathAccept),
PathVariable('CUDA_ROOT', 'Cuda custom path', os.getenv('CUDA_ROOT', ''),
PathVariable.PathAccept),
PathVariable('GTEST_ROOT', 'Googletest custom path',
os.getenv('GTEST_ROOT', ''), PathVariable.PathAccept),
PathVariable('PYBIND11_ROOT', 'Pybind11 custom path',
os.getenv('PYBIND11_ROOT', ''), PathVariable.PathAccept),
PathVariable('PETSC_ROOT', 'PETSc custom path',
os.getenv('PETSC_ROOT', ''), PathVariable.PathAccept),
# Executables
('CXX', 'Compiler', os.getenv('CXX', 'g++')),
('MPICXX', 'MPI Compiler wrapper', os.getenv('MPICXX', 'mpicxx')),
('py_exec', 'Python executable', 'python3'),
# Compiler flags
('CXXFLAGS', 'C++ compiler flags', os.getenv('CXXFLAGS', "")),
# Pip flags
('PIPFLAGS', 'Pip installation flags', ""),
# Cosmetic
BoolVariable('verbose', 'Activate verbosity',
os.getenv('VERBOSE') in {'1', 'True', 'true'}),
BoolVariable('color', 'Color the non-verbose compilation output', False),
# Tamaas components
BoolVariable('build_tests', 'Build test suite', False),
BoolVariable('build_python', 'Build python wrapper', True),
# Documentation
ListVariable('doc_builders',
'Generated documentation formats',
default='html',
names=Split("html man")), # TODO include latex
# Dependencies
BoolVariable('use_mpi', 'Builds multi-process parallelism', False),
BoolVariable('use_petsc', 'Builds a PETSc solver wrapper', False),
# Distribution options
BoolVariable('strip_info', 'Strip binary of added information', True),
BoolVariable('build_static_lib', "Build a static libTamaas", False),
# Type variables
EnumVariable('real_type',
'Type for real precision variables',
'double',
allowed_values=('double', 'long double')),
EnumVariable('integer_type',
'Type for integer variables',
'int',
allowed_values=('int', 'long')),
)
# Set variables of environment
vars.Update(main_env)
help_text = vars.GenerateHelpText(main_env)
help_text += """
Commands:
scons [build] [options]... Compile Tamaas (and additional modules/tests)
scons install [prefix=/your/prefix] [options]... Install Tamaas to prefix
scons dev Install symlink to Tamaas python module (useful to development purposes)
scons test Run tests with pytest
scons doc Compile documentation with Doxygen and Sphinx+Breathe
scons archive Create a gzipped archive from source
""" # noqa
Help(help_text)
# Save all options, not just those that differ from default
with open('build-setup.conf', 'w') as setup:
for option in vars.options:
setup.write("# " + option.help.replace('\n', '\n# ') + "\n")
setup.write("{} = '{}'\n".format(option.key, main_env[option.key]))
# Printing unknown variables
if vars.UnknownVariables():
warn(f'unknown variables provided:\n\t{vars.UnknownVariables()}')
main_env['should_configure'] = \
not main_env.GetOption('clean') and not main_env.GetOption('help')
build_type = main_env['build_type']
build_dir = 'build-${build_type}'
main_env['build_dir'] = main_env.Dir(build_dir)
# Setting up the python name with version
if main_env['build_python']:
args = (main_env.subst("${py_exec} -c").split() + [
"from sysconfig import get_python_version;"
"print(get_python_version())"
])
main_env['py_version'] = bytes(check_output(args)).decode()
verbose = main_env['verbose']
# Remove colors if not set
if not main_env['color']:
for key in colors:
colors[key] = ''
if not verbose:
main_env['CXXCOMSTR'] = main_env['SHCXXCOMSTR'] = \
u'{0}[Compiling ($SHCXX)] {1}$SOURCE'.format(colors['green'],
colors['end'])
main_env['LINKCOMSTR'] = main_env['SHLINKCOMSTR'] = \
u'{0}[Linking] {1}$TARGET'.format(colors['purple'],
colors['end'])
main_env['ARCOMSTR'] = u'{}[Ar]{} $TARGET'.format(colors['purple'],
colors['end'])
main_env['RANLIBCOMSTR'] = \
u'{}[Randlib]{} $TARGET'.format(colors['purple'],
colors['end'])
main_env['PRINT_CMD_LINE_FUNC'] = pretty_cmd_print
main_env['INSTALLSTR'] = \
u'{}[Installing] {}$SOURCE to $TARGET'.format(colors['blue'],
colors['end'])
# Include paths
main_env.AppendUnique(CPPPATH=[
'#/src', '#/src/core', '#/src/surface', '#/src/percolation', '#/src/model',
'#/src/solvers', '#/src/gpu', '#/python', '#/third-party/expolit/include'
])
# Changing the shared object extension
main_env['SHOBJSUFFIX'] = '.o'
# Variables for clarity
main_env['use_cuda'] = main_env['backend'] == "cuda"
main_env['use_fftw'] = not main_env['use_cuda']
main_env['use_mpi'] = main_env['use_mpi'] and not main_env['use_cuda']
if not main_env['use_fftw']:
main_env['fftw_threads'] = 'none'
# Back to gcc if cuda is activated
if main_env['use_cuda'] and "g++" not in main_env['CXX']:
raise StopError('GCC should be used when compiling with CUDA')
# Printing some build infos
if main_env['should_configure']:
print_build_info(main_env)
# OpenMP flags - compiler dependent
omp_flags = {
"g++": ["-fopenmp"],
"clang++": ["-fopenmp"],
"icpc": ["-qopenmp"]
}
def cxx_alias(cxx):
for k in omp_flags.keys():
if k in cxx:
return k
raise StopError('Unsupported compiler: ' + cxx)
cxx = cxx_alias(main_env['CXX'])
# Setting main compilation flags
main_env['CXXFLAGS'] = Split(main_env['CXXFLAGS'])
main_env['LINKFLAGS'] = main_env['CXXFLAGS']
main_env.AppendUnique(
CXXFLAGS=Split('-std=c++14 -Wall -Wextra'),
CPPDEFINES={
'TAMAAS_LOOP_BACKEND': 'TAMAAS_LOOP_BACKEND_${backend.upper()}',
'TAMAAS_FFTW_BACKEND': 'TAMAAS_FFTW_BACKEND_${fftw_threads.upper()}'
},
)
if main_env['backend'] != 'cuda':
main_env.AppendUnique(CXXFLAGS=['-pedantic'])
# Adding OpenMP flags
if main_env['backend'] == 'omp':
main_env.AppendUnique(CXXFLAGS=omp_flags[cxx])
main_env.AppendUnique(LINKFLAGS=omp_flags[cxx])
else:
main_env.AppendUnique(CXXFLAGS=['-Wno-unknown-pragmas'])
# Correct bug in clang?
if main_env['backend'] == 'omp' and cxx == "clang++":
main_env.AppendUnique(LIBS=["atomic"])
elif main_env['backend'] == 'tbb':
main_env.AppendUnique(LIBS=['tbb'])
# Manage MPI compiler
if main_env['use_mpi']:
main_env['CXX'] = '$MPICXX'
main_env.AppendUnique(CPPDEFINES=['TAMAAS_USE_MPI'])
main_env.AppendUnique(CXXFLAGS=['-Wno-cast-function-type'])
# Petsc defines
if main_env['use_petsc']:
main_env.AppendUnique(CPPDEFINES=['TAMAAS_USE_PETSC'])
# Flags and options
if main_env['build_type'] == 'debug':
main_env.AppendUnique(CPPDEFINES=['TAMAAS_DEBUG'])
# Define the scalar types
main_env.AppendUnique(CPPDEFINES={
'TAMAAS_REAL_TYPE': main_env.subst('${real_type}'),
'TAMAAS_INT_TYPE': main_env.subst('${integer_type}'),
})
# Compilation flags
cxxflags_dict = {
"debug": Split("-g -O0"),
"profiling": Split("-g -O3 -fno-omit-frame-pointer"),
"release": Split("-O3")
}
if main_env['sanitizer'] != 'none':
if main_env['backend'] == 'cuda':
raise StopError("Sanitizers with cuda are not yet supported!")
cxxflags_dict[build_type].append('-fsanitize=${sanitizer}')
main_env.AppendUnique(CXXFLAGS=cxxflags_dict[build_type])
main_env.AppendUnique(SHLINKFLAGS=cxxflags_dict[build_type])
main_env.AppendUnique(LINKFLAGS=cxxflags_dict[build_type])
if main_env['should_configure']:
basic_checks(main_env)
detect_dependencies(main_env)
# Writing information file
main_env.Tool('textfile')
main_env['SUBST_DICT'] = get_git_subst()
# Empty values if requested
if main_env['strip_info']:
for k in main_env['SUBST_DICT']:
main_env['SUBST_DICT'][k] = ""
# Substitution of environment file
main_env['SUBST_DICT'].update({
'@build_type@': '$build_type',
'@build_dir@': '${build_dir.abspath}',
'@build_version@': '$version',
'@backend@': '$backend',
})
# Environment file content
env_content = """export PYTHONPATH=@build_dir@/python:$$PYTHONPATH
export LD_LIBRARY_PATH=@build_dir@/src:$$LD_LIBRARY_PATH
"""
# Writing environment file
env_file = main_env.Textfile(
main_env.File('tamaas_environment.sh', main_env['build_dir']), env_content)
# Default targets
build_targets = ['build-cpp', env_file]
install_targets = ['install-lib']
if main_env._get_major_minor_revision(scons_version)[0] >= 4:
main_env.Tool('compilation_db')
build_targets.append(
main_env.CompilationDatabase(PRINT_CMD_LINE_FUNC=pretty_cmd_print
if not main_env['verbose'] else None))
# Building Tamaas library
Export('main_env')
main_env.SubDirectory('src')
# Building Tamaas extra components
for dir in ['python', 'tests']:
if main_env['build_{}'.format(dir)] and not main_env.GetOption('help'):
main_env.SubDirectory(dir)
build_targets.append('build-{}'.format(dir))
# Building API + Sphinx documentation if requested
main_env.SubDirectory('doc')
main_env.Alias('doc', 'build-doc')
install_targets.append('install-doc')
# Define dummy dev command when python is deactivated
if not main_env['build_python']:
dummy_command(
main_env, 'dev', 'Command "dev" does not do anything' +
' without python activated ("build_python=True")')
else:
install_targets.append('install-python')
# Define dummy test command when tests are deactivated
if not main_env['build_tests']:
dummy_command(
main_env, 'test', 'Command "test" does not do anything' +
' without tests activated ("build_tests=True")')
# Definition of target aliases, a.k.a. sub-commands
main_env.Alias('build', build_targets)
# Define proper install targets
main_env.Alias('install', install_targets)
# Default target is to build stuff
main_env.Default('build')
# Building a tar archive
archive = main_env.Command(
'tamaas-${version}.tar.gz',
'',
('git archive '
'--format=tar.gz '
'--prefix=tamaas/ '
'-o $TARGET HEAD'),
)
main_env.Alias('archive', archive)
linting(main_env)
diff --git a/src/solvers/petsc_solver.hh b/src/solvers/petsc_solver.hh
index c3175d5..937a1a5 100644
--- a/src/solvers/petsc_solver.hh
+++ b/src/solvers/petsc_solver.hh
@@ -1,60 +1,60 @@
/*
* SPDX-License-Indentifier: AGPL-3.0-or-later
*
* Copyright (©) 2016-2023 EPFL (École Polytechnique Fédérale de Lausanne),
* Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides)
* Copyright (©) 2020-2023 Lucas Frérot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
*/
/* -------------------------------------------------------------------------- */
#ifndef MYPETSC_SOLVER_HH
#define MYPETSC_SOLVER_HH
/* -------------------------------------------------------------------------- */
#include "ep_solver.hh"
#include "residual.hh"
-#include
-#include
-#include
-#include
-#include
#include
+#include
#include
+#include
+#include
+#include
+#include
/* -------------------------------------------------------------------------- */
namespace tamaas {
/// Wrapper to PETSc SNES abstract solver
class PETScSolver : public EPSolver {
public:
using residual_ctx = std::pair*>;
public:
PETScSolver(Residual& residual, std::string petsc_args);
~PETScSolver() override;
void solve() override;
private:
PetscOptions snes_options;
Vec _xvec, _rvec;
Mat J;
SNES snes;
residual_ctx res_ctx;
};
} // namespace tamaas
/* -------------------------------------------------------------------------- */
#endif