Skip to content
Snippets Groups Projects

Add TinyMatrix's double-dot product

3 files
+ 183
0
Compare changes
  • Side-by-side
  • Inline

Files

@@ -315,6 +315,107 @@ template std::shared_ptr<const DiscreteFunctionVariant> dot(const TinyVector<2>&
template std::shared_ptr<const DiscreteFunctionVariant> dot(const TinyVector<3>&,
const std::shared_ptr<const DiscreteFunctionVariant>&);
std::shared_ptr<const DiscreteFunctionVariant>
doubleDot(const std::shared_ptr<const DiscreteFunctionVariant>& f_v,
const std::shared_ptr<const DiscreteFunctionVariant>& g_v)
{
if (not hasSameMesh({f_v, g_v})) {
throw NormalError("operands are defined on different meshes");
}
return std::visit(
[&](auto&& f, auto&& g) -> std::shared_ptr<DiscreteFunctionVariant> {
using TypeOfF = std::decay_t<decltype(f)>;
using TypeOfG = std::decay_t<decltype(g)>;
if constexpr (not std::is_same_v<TypeOfF, TypeOfG>) {
throw NormalError(EmbeddedDiscreteFunctionUtils::incompatibleOperandTypes(f, g));
} else {
using DataType = std::decay_t<typename TypeOfF::data_type>;
if constexpr (is_discrete_function_P0_v<TypeOfF>) {
if constexpr (is_tiny_matrix_v<DataType>) {
return std::make_shared<DiscreteFunctionVariant>(doubleDot(f, g));
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::invalidOperandType(f));
}
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::invalidOperandType(f));
}
}
},
f_v->discreteFunction(), g_v->discreteFunction());
}
template <size_t MatrixDimension>
std::shared_ptr<const DiscreteFunctionVariant>
doubleDot(const std::shared_ptr<const DiscreteFunctionVariant>& f, const TinyMatrix<MatrixDimension>& a)
{
return std::visit(
[&](auto&& discrete_function0) -> std::shared_ptr<DiscreteFunctionVariant> {
using DiscreteFunction0Type = std::decay_t<decltype(discrete_function0)>;
if constexpr (is_discrete_function_P0_v<DiscreteFunction0Type>) {
using DataType = std::decay_t<typename DiscreteFunction0Type::data_type>;
if constexpr (is_tiny_matrix_v<DataType>) {
if constexpr (std::is_same_v<DataType, TinyMatrix<MatrixDimension>>) {
return std::make_shared<DiscreteFunctionVariant>(doubleDot(discrete_function0, a));
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::incompatibleOperandTypes(f, a));
}
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::invalidOperandType(f));
}
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::incompatibleOperandTypes(f, a));
}
},
f->discreteFunction());
}
template <size_t MatrixDimension>
std::shared_ptr<const DiscreteFunctionVariant>
doubleDot(const TinyMatrix<MatrixDimension>& a, const std::shared_ptr<const DiscreteFunctionVariant>& f)
{
return std::visit(
[&](auto&& discrete_function0) -> std::shared_ptr<DiscreteFunctionVariant> {
using DiscreteFunction0Type = std::decay_t<decltype(discrete_function0)>;
if constexpr (is_discrete_function_P0_v<DiscreteFunction0Type>) {
using DataType = std::decay_t<typename DiscreteFunction0Type::data_type>;
if constexpr (is_tiny_matrix_v<DataType>) {
if constexpr (std::is_same_v<DataType, TinyMatrix<MatrixDimension>>) {
return std::make_shared<DiscreteFunctionVariant>(doubleDot(a, discrete_function0));
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::incompatibleOperandTypes(a, f));
}
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::invalidOperandType(f));
}
} else {
throw NormalError(EmbeddedDiscreteFunctionUtils::incompatibleOperandTypes(a, f));
}
},
f->discreteFunction());
}
template std::shared_ptr<const DiscreteFunctionVariant> doubleDot(const std::shared_ptr<const DiscreteFunctionVariant>&,
const TinyMatrix<1>&);
template std::shared_ptr<const DiscreteFunctionVariant> doubleDot(const std::shared_ptr<const DiscreteFunctionVariant>&,
const TinyMatrix<2>&);
template std::shared_ptr<const DiscreteFunctionVariant> doubleDot(const std::shared_ptr<const DiscreteFunctionVariant>&,
const TinyMatrix<3>&);
template std::shared_ptr<const DiscreteFunctionVariant> doubleDot(
const TinyMatrix<1>&,
const std::shared_ptr<const DiscreteFunctionVariant>&);
template std::shared_ptr<const DiscreteFunctionVariant> doubleDot(
const TinyMatrix<2>&,
const std::shared_ptr<const DiscreteFunctionVariant>&);
template std::shared_ptr<const DiscreteFunctionVariant> doubleDot(
const TinyMatrix<3>&,
const std::shared_ptr<const DiscreteFunctionVariant>&);
std::shared_ptr<const DiscreteFunctionVariant>
tensorProduct(const std::shared_ptr<const DiscreteFunctionVariant>& f_v,
const std::shared_ptr<const DiscreteFunctionVariant>& g_v)
Loading