diff --git a/sci-libs/cantera/cantera-2.4.0-r2.ebuild b/sci-libs/cantera/cantera-2.4.0-r2.ebuild new file mode 100644 index 00000000000000..2d69f8d348c627 --- /dev/null +++ b/sci-libs/cantera/cantera-2.4.0-r2.ebuild @@ -0,0 +1,126 @@ +# Copyright 1999-2019 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=7 + +PYTHON_COMPAT=( python3_{5,6,7} ) + +FORTRAN_NEEDED=fortran +FORTRAN_STANDARD=90 + +inherit desktop fortran-2 python-single-r1 scons-utils toolchain-funcs + +DESCRIPTION="Object-oriented tool suite for chemical kinetics, thermodynamics, and transport" +HOMEPAGE="https://www.cantera.org" +SRC_URI="https://github.com/Cantera/${PN}/archive/v${PV}.tar.gz -> ${P}.tar.gz" + +LICENSE="BSD" +SLOT="0" +KEYWORDS="~amd64 ~x86" +IUSE="+cti fortran pch +python test" + +REQUIRED_USE=" + python? ( cti ) + ${PYTHON_REQUIRED_USE} + " + +RDEPEND=" + ${PYTHON_DEPS} + python? ( + dev-python/numpy[${PYTHON_USEDEP}] + ) + =4.0 ++for cvode_call in ['CVodeCreate(CV_BDF, CV_NEWTON);','CVodeCreate(CV_BDF);']: ++ ret = SCons.Conftest.CheckLib(context, ++ ['sundials_cvodes'], ++ header='#include "cvodes/cvodes.h"', ++ language='C++', ++ call=cvode_call, ++ autoadd=False, ++ extra_libs=env['blas_lapack_libs']) + # CheckLib returns False to indicate success ++ if not ret: ++ if env['system_sundials'] == 'default': ++ env['system_sundials'] = 'y' ++ break ++ ++# Execute if the cycle ends without 'break' ++else: + if env['system_sundials'] == 'default': + env['system_sundials'] = 'n' + elif env['system_sundials'] == 'y': + config_error('Expected system installation of Sundials, but it could ' + 'not be found.') +-elif env['system_sundials'] == 'default': +- env['system_sundials'] = 'y' +- + + # Checkout Sundials submodule if needed + if (env['system_sundials'] == 'n' and +@@ -1066,7 +1072,7 @@ + + # Ignore the minor version, e.g. 2.4.x -> 2.4 + env['sundials_version'] = '.'.join(sundials_version.split('.')[:2]) +- if env['sundials_version'] not in ('2.4','2.5','2.6','2.7','3.0','3.1','3.2'): ++ if env['sundials_version'] not in ('2.4','2.5','2.6','2.7','3.0','3.1','3.2','4.0','4.1'): + print("""ERROR: Sundials version %r is not supported.""" % env['sundials_version']) + sys.exit(1) + print("""INFO: Using system installation of Sundials version %s.""" % sundials_version) +diff -Nur old/include/cantera/numerics/CVodesIntegrator.h new/include/cantera/numerics/CVodesIntegrator.h +--- old/include/cantera/numerics/CVodesIntegrator.h 2018-08-24 16:24:45.000000000 +0300 ++++ new/include/cantera/numerics/CVodesIntegrator.h 2019-08-14 04:39:50.000000000 +0300 +@@ -49,7 +49,6 @@ + m_maxord = n; + } + virtual void setMethod(MethodType t); +- virtual void setIterator(IterType t); + virtual void setMaxStepSize(double hmax); + virtual void setMinStepSize(double hmin); + virtual void setMaxSteps(int nmax); +diff -Nur old/include/cantera/numerics/Integrator.h new/include/cantera/numerics/Integrator.h +--- old/include/cantera/numerics/Integrator.h 2018-08-24 16:24:45.000000000 +0300 ++++ new/include/cantera/numerics/Integrator.h 2019-08-14 04:44:27.000000000 +0300 +@@ -34,17 +34,6 @@ + Adams_Method //! Adams + }; + +-//! Specifies the method used for iteration. +-/*! +- * Not all methods are supported by all integrators. +- */ +-enum IterType { +- //! Newton Iteration +- Newton_Iter, +- //! Functional Iteration +- Functional_Iter +-}; +- + //! Abstract base class for ODE system integrators. + /*! + * @ingroup odeGroup +@@ -163,11 +152,6 @@ + warn("setMethodType"); + } + +- //! Set the linear iterator. +- virtual void setIterator(IterType t) { +- warn("setInterator"); +- } +- + //! Set the maximum step size + virtual void setMaxStepSize(double hmax) { + warn("setMaxStepSize"); +diff -Nur old/src/kinetics/ImplicitSurfChem.cpp new/src/kinetics/ImplicitSurfChem.cpp +--- old/src/kinetics/ImplicitSurfChem.cpp 2018-08-24 16:24:45.000000000 +0300 ++++ new/src/kinetics/ImplicitSurfChem.cpp 2019-08-14 04:45:57.000000000 +0300 +@@ -79,7 +79,6 @@ + // numerically, and use a Newton linear iterator + m_integ->setMethod(BDF_Method); + m_integ->setProblemType(DENSE + NOJAC); +- m_integ->setIterator(Newton_Iter); + m_work.resize(ntmax); + } + +diff -Nur old/src/numerics/CVodesIntegrator.cpp new/src/numerics/CVodesIntegrator.cpp +--- old/src/numerics/CVodesIntegrator.cpp 2018-08-24 16:24:45.000000000 +0300 ++++ new/src/numerics/CVodesIntegrator.cpp 2019-08-14 04:49:02.000000000 +0300 +@@ -88,7 +88,6 @@ + m_type(DENSE+NOJAC), + m_itol(CV_SS), + m_method(CV_BDF), +- m_iter(CV_NEWTON), + m_maxord(0), + m_reltol(1.e-9), + m_abstols(1.e-15), +@@ -218,17 +217,6 @@ + } + } + +-void CVodesIntegrator::setIterator(IterType t) +-{ +- if (t == Newton_Iter) { +- m_iter = CV_NEWTON; +- } else if (t == Functional_Iter) { +- m_iter = CV_FUNCTIONAL; +- } else { +- throw CanteraError("CVodesIntegrator::setIterator", "unknown iterator"); +- } +-} +- + void CVodesIntegrator::sensInit(double t0, FuncEval& func) + { + m_np = func.nparams(); +@@ -284,7 +272,11 @@ + //! Specify the method and the iteration type. Cantera Defaults: + //! CV_BDF - Use BDF methods + //! CV_NEWTON - use Newton's method +- m_cvode_mem = CVodeCreate(m_method, m_iter); ++ #if CT_SUNDIALS_VERSION < 40 ++ m_cvode_mem = CVodeCreate(m_method, CV_NEWTON); ++ #else ++ m_cvode_mem = CVodeCreate(m_method); ++ #endif + if (!m_cvode_mem) { + throw CanteraError("CVodesIntegrator::initialize", + "CVodeCreate failed."); +@@ -394,7 +386,11 @@ + #if CT_SUNDIALS_VERSION >= 30 + SUNLinSolFree((SUNLinearSolver) m_linsol); + SUNMatDestroy((SUNMatrix) m_linsol_matrix); +- m_linsol_matrix = SUNBandMatrix(N, nu, nl, nu+nl); ++ #if CT_SUNDIALS_VERSION < 40 ++ m_linsol_matrix = SUNBandMatrix(N, nu, nl, nu+nl); ++ #else ++ m_linsol_matrix = SUNBandMatrix(N, nu, nl); ++ #endif + #if CT_SUNDIALS_USE_LAPACK + m_linsol = SUNLapackBand(m_y, (SUNMatrix) m_linsol_matrix); + #else +diff -Nur old/src/numerics/IDA_Solver.cpp new/src/numerics/IDA_Solver.cpp +--- old/src/numerics/IDA_Solver.cpp 2018-08-24 16:24:45.000000000 +0300 ++++ new/src/numerics/IDA_Solver.cpp 2019-08-14 04:51:01.000000000 +0300 +@@ -442,7 +442,11 @@ + #if CT_SUNDIALS_VERSION >= 30 + SUNLinSolFree((SUNLinearSolver) m_linsol); + SUNMatDestroy((SUNMatrix) m_linsol_matrix); +- m_linsol_matrix = SUNBandMatrix(N, nu, nl, nu+nl); ++ #if CT_SUNDIALS_VERSION < 40 ++ m_linsol_matrix = SUNBandMatrix(N, nu, nl, nu+nl); ++ #else ++ m_linsol_matrix = SUNBandMatrix(N, nu, nl); ++ #endif + #if CT_SUNDIALS_USE_LAPACK + m_linsol = SUNLapackBand(m_y, (SUNMatrix) m_linsol_matrix); + #else +diff -Nur old/src/zeroD/ReactorNet.cpp new/src/zeroD/ReactorNet.cpp +--- old/src/zeroD/ReactorNet.cpp 2018-08-24 16:24:45.000000000 +0300 ++++ new/src/zeroD/ReactorNet.cpp 2019-08-14 04:51:35.000000000 +0300 +@@ -28,7 +28,6 @@ + // numerically, and use a Newton linear iterator + m_integ->setMethod(BDF_Method); + m_integ->setProblemType(DENSE + NOJAC); +- m_integ->setIterator(Newton_Iter); + } + + void ReactorNet::setInitialTime(double time)