Commit bf054388 authored by Praetorius, Simon's avatar Praetorius, Simon
Browse files

Some cleanup for intel compiler

parent 520d1838
...@@ -137,9 +137,9 @@ void ProblemStat<Traits>::addMatrixOperator( ...@@ -137,9 +137,9 @@ void ProblemStat<Traits>::addMatrixOperator(
RowTreePath row, ColTreePath col, RowTreePath row, ColTreePath col,
double* factor, double* estFactor) double* factor, double* estFactor)
{ {
static_assert( Concept::PreTreePath<RowTreePath>, static_assert( Concepts::PreTreePath<RowTreePath>,
"row must be a valid treepath, or an integer/index-constant"); "row must be a valid treepath, or an integer/index-constant");
static_assert( Concept::PreTreePath<ColTreePath>, static_assert( Concepts::PreTreePath<ColTreePath>,
"col must be a valid treepath, or an integer/index-constant"); "col must be a valid treepath, or an integer/index-constant");
auto i = child(globalBasis->localView().tree(), makeTreePath(row)); auto i = child(globalBasis->localView().tree(), makeTreePath(row));
...@@ -161,9 +161,9 @@ void ProblemStat<Traits>::addMatrixOperator( ...@@ -161,9 +161,9 @@ void ProblemStat<Traits>::addMatrixOperator(
RowTreePath row, ColTreePath col, RowTreePath row, ColTreePath col,
double* factor, double* estFactor) double* factor, double* estFactor)
{ {
static_assert( Concept::PreTreePath<RowTreePath>, static_assert( Concepts::PreTreePath<RowTreePath>,
"row must be a valid treepath, or an integer/index-constant"); "row must be a valid treepath, or an integer/index-constant");
static_assert( Concept::PreTreePath<ColTreePath>, static_assert( Concepts::PreTreePath<ColTreePath>,
"col must be a valid treepath, or an integer/index-constant"); "col must be a valid treepath, or an integer/index-constant");
auto i = child(globalBasis->localView().tree(), makeTreePath(row)); auto i = child(globalBasis->localView().tree(), makeTreePath(row));
...@@ -185,7 +185,7 @@ void ProblemStat<Traits>::addVectorOperator( ...@@ -185,7 +185,7 @@ void ProblemStat<Traits>::addVectorOperator(
TreePath path, TreePath path,
double* factor, double* estFactor) double* factor, double* estFactor)
{ {
static_assert( Concept::PreTreePath<TreePath>, static_assert( Concepts::PreTreePath<TreePath>,
"path must be a valid treepath, or an integer/index-constant"); "path must be a valid treepath, or an integer/index-constant");
auto i = child(globalBasis->localView().tree(), makeTreePath(path)); auto i = child(globalBasis->localView().tree(), makeTreePath(path));
...@@ -206,7 +206,7 @@ void ProblemStat<Traits>::addVectorOperator( ...@@ -206,7 +206,7 @@ void ProblemStat<Traits>::addVectorOperator(
TreePath path, TreePath path,
double* factor, double* estFactor) double* factor, double* estFactor)
{ {
static_assert( Concept::PreTreePath<TreePath>, static_assert( Concepts::PreTreePath<TreePath>,
"path must be a valid treepath, or an integer/index-constant"); "path must be a valid treepath, or an integer/index-constant");
auto i = child(globalBasis->localView().tree(), makeTreePath(path)); auto i = child(globalBasis->localView().tree(), makeTreePath(path));
......
...@@ -338,4 +338,15 @@ namespace AMDiS ...@@ -338,4 +338,15 @@ namespace AMDiS
return C; return C;
} }
template <class T, int M, int N>
Dune::FieldMatrix<T,M,N>& multiplies_ABt(Dune::FieldMatrix<T, M, N> const& A, Dune::DiagonalMatrix<T, N> const& B, Dune::FieldMatrix<T,M,N>& C)
{
for (int m = 0; m < M; ++m) {
for (int n = 0; n < N; ++n) {
C[m][n] = A[m][n] * B.diagonal(n);
}
}
return C;
}
} // end namespace AMDiS } // end namespace AMDiS
...@@ -15,14 +15,16 @@ namespace AMDiS ...@@ -15,14 +15,16 @@ namespace AMDiS
return unsigned(c) - unsigned('0'); return unsigned(c) - unsigned('0');
} }
template <std::size_t N> template <char... digits>
constexpr std::size_t string2num(const char (&arr)[N]) constexpr std::size_t string2num()
{ {
const char arr[] = {digits...};
assert(arr[0] != '-' && "Negative integral constant"); assert(arr[0] != '-' && "Negative integral constant");
std::size_t result = 0; std::size_t result = 0;
std::size_t power = 1; std::size_t power = 1;
const int N = sizeof...(digits);
for (std::size_t i = 0; i < N; ++i) { for (std::size_t i = 0; i < N; ++i) {
char c = arr[N - 1 - i]; char c = arr[N - 1 - i];
result+= char2digit(c) * power; result+= char2digit(c) * power;
...@@ -38,7 +40,7 @@ namespace AMDiS ...@@ -38,7 +40,7 @@ namespace AMDiS
template <char... digits> template <char... digits>
constexpr auto operator"" _c() constexpr auto operator"" _c()
{ {
return index_<Impl::string2num<sizeof...(digits)>({digits...})>; return index_<Impl::string2num<digits...>()>;
} }
} // end namespace AMDiS } // end namespace AMDiS
...@@ -45,18 +45,6 @@ namespace AMDiS ...@@ -45,18 +45,6 @@ namespace AMDiS
return fct_(geometry_.value().global(local)); return fct_(geometry_.value().global(local));
} }
friend auto derivative(AnalyticLocalFunction const& lf)
{
static_assert(Concepts::HasPartial<Function>,
"No partial(_0,...) defined for Functor F of AnalyticLocalFunction.");
auto df = partial(lf.fct(), index_<0>);
using RawSignature = typename Dune::Functions::SignatureTraits<R(D)>::RawSignature;
using DerivativeSignature = typename Dune::Functions::DefaultDerivativeTraits<RawSignature>::Range(D);
return AnalyticLocalFunction<DerivativeSignature,LocalContext,decltype(df)>{df};
}
Function const& fct() const Function const& fct() const
{ {
return fct_; return fct_;
...@@ -77,6 +65,20 @@ namespace AMDiS ...@@ -77,6 +65,20 @@ namespace AMDiS
} }
template <class R, class D, class LocalContext, class F>
auto derivative(AnalyticLocalFunction<R(D),LocalContext,F> const& lf)
{
static_assert(Concepts::HasPartial<F>,
"No partial(_0,...) defined for Functor F of AnalyticLocalFunction.");
auto df = partial(lf.fct(), index_<0>);
using RawSignature = typename Dune::Functions::SignatureTraits<R(D)>::RawSignature;
using DerivativeSignature = typename Dune::Functions::DefaultDerivativeTraits<RawSignature>::Range(D);
return AnalyticLocalFunction<DerivativeSignature,LocalContext,decltype(df)>{df};
}
/// \class AnalyticGridFunction /// \class AnalyticGridFunction
/// \brief A Gridfunction that evaluates a function with global coordinates. /// \brief A Gridfunction that evaluates a function with global coordinates.
/** /**
...@@ -121,16 +123,6 @@ namespace AMDiS ...@@ -121,16 +123,6 @@ namespace AMDiS
return LocalFunction{gf.fct_}; return LocalFunction{gf.fct_};
} }
/// \brief Return a GridFunction representing the derivative of a functor.
// [expects: Functor f has free function derivative(f)]
friend auto derivative(AnalyticGridFunction const& gf)
{
static_assert(Concepts::HasPartial<Function>,
"No partial(_0,...) defined for Functor of AnalyticLocalFunction.");
auto df = partial(gf.fct(), index_<0>);
return AnalyticGridFunction<decltype(df), GridView>{df, gf.entitySet().gridView()};
}
EntitySet const& entitySet() const EntitySet const& entitySet() const
{ {
...@@ -146,6 +138,19 @@ namespace AMDiS ...@@ -146,6 +138,19 @@ namespace AMDiS
}; };
/// \brief Return a GridFunction representing the derivative of a functor.
// [expects: Functor f has free function derivative(f)]
template <class F, class GV>
auto derivative(AnalyticGridFunction<F,GV> const& gf)
{
static_assert(Concepts::HasPartial<F>,
"No partial(_0,...) defined for Functor of AnalyticLocalFunction.");
auto df = partial(gf.fct(), index_<0>);
return AnalyticGridFunction<decltype(df), GV>{df, gf.entitySet().gridView()};
}
#ifndef DOXYGEN #ifndef DOXYGEN
// A pre-GridFunction that just stores the function // A pre-GridFunction that just stores the function
template <class Function> template <class Function>
......
...@@ -179,9 +179,10 @@ namespace AMDiS ...@@ -179,9 +179,10 @@ namespace AMDiS
using RawRange = std::decay_t<Range>; using RawRange = std::decay_t<Range>;
using LocalDomain = typename EntitySet::LocalCoordinate; using LocalDomain = typename EntitySet::LocalCoordinate;
using LocalFunction = FunctorLocalFunction<RawRange(LocalDomain), Functor, LocalFct<GridFunctions>...>;
public: public:
using LocalFunction = FunctorLocalFunction<RawRange(LocalDomain), Functor, LocalFct<GridFunctions>...>;
/// Constructor. Stores copies of the functor and gridfunctions. /// Constructor. Stores copies of the functor and gridfunctions.
template <class... GridFcts> template <class... GridFcts>
explicit FunctorGridFunction(Functor const& fct, GridFcts&&... gridFcts) explicit FunctorGridFunction(Functor const& fct, GridFcts&&... gridFcts)
...@@ -196,22 +197,15 @@ namespace AMDiS ...@@ -196,22 +197,15 @@ namespace AMDiS
MakeSeq_t<sizeof...(GridFunctions)>{}); MakeSeq_t<sizeof...(GridFunctions)>{});
} }
/// \brief Creates a LocalFunction from the LocalFunctions of the GridFunctions. \relates FunctorLocalFunction
friend LocalFunction localFunction(FunctorGridFunction const& gf)
{
return Dune::Std::apply([&gf](auto const&... gridFcts)
{
return LocalFunction{gf.fct_, localFunction(gridFcts)...};
},
gf.gridFcts_);
}
/// Return the stored \ref EntitySet of the first GridFunction /// Return the stored \ref EntitySet of the first GridFunction
EntitySet const& entitySet() const EntitySet const& entitySet() const
{ {
return std::get<0>(gridFcts_).entitySet(); return std::get<0>(gridFcts_).entitySet();
} }
auto const& fct() const { return fct_; }
auto const& gridFcts() const { return gridFcts_; }
private: private:
template <class Outer, class Inner, std::size_t... I> template <class Outer, class Inner, std::size_t... I>
auto eval(Outer outer, Inner inner, Indices<I...>) const auto eval(Outer outer, Inner inner, Indices<I...>) const
...@@ -225,6 +219,19 @@ namespace AMDiS ...@@ -225,6 +219,19 @@ namespace AMDiS
}; };
/// \brief Creates a LocalFunction from the LocalFunctions of the GridFunctions. \relates FunctorLocalFunction
template <class F, class... GFs>
auto localFunction(FunctorGridFunction<F,GFs...> const& gf)
{
return Dune::Std::apply([&gf](auto const&... gridFcts)
{
using LocalFunction = typename FunctorGridFunction<F,GFs...>::LocalFunction;
return LocalFunction{gf.fct(), localFunction(gridFcts)...};
},
gf.gridFcts());
}
#ifndef DOXYGEN #ifndef DOXYGEN
// Generator function for FunctorGridFunction expressions // Generator function for FunctorGridFunction expressions
template <class Functor, class... GridFcts> template <class Functor, class... GridFcts>
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment