Skip to content
Snippets Groups Projects
Commit 3766c8ba authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Improve DiscreteFunctionInterpoler

It can now handle functions with values in B, N, Z, R, R^d and R^dxd
parent 01a77a08
No related branches found
No related tags found
1 merge request!75Feature/language discretization
......@@ -3,29 +3,101 @@
#include <scheme/DiscreteFunctionP0.hpp>
#include <utils/Exceptions.hpp>
template <size_t Dimension, typename DataType>
std::shared_ptr<IDiscreteFunction>
DiscreteFunctionInterpoler::_interpolate() const
{
std::shared_ptr mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<Dimension>>>(m_mesh);
return std::make_shared<DiscreteFunctionP0<Dimension, DataType>>(mesh, m_function_id);
}
template <size_t Dimension>
std::shared_ptr<IDiscreteFunction>
DiscreteFunctionInterpoler::_interpolate() const
{
const auto& function_descriptor = m_function_id.descriptor();
Assert(function_descriptor.domainMappingNode().children[1]->m_data_type == ASTNodeDataType::typename_t);
const ASTNodeDataType& data_type = function_descriptor.domainMappingNode().children[1]->m_data_type.contentType();
switch (data_type) {
case ASTNodeDataType::bool_t: {
return this->_interpolate<Dimension, bool>();
}
case ASTNodeDataType::unsigned_int_t: {
return this->_interpolate<Dimension, uint64_t>();
}
case ASTNodeDataType::int_t: {
return this->_interpolate<Dimension, int64_t>();
}
case ASTNodeDataType::double_t: {
return this->_interpolate<Dimension, double>();
}
case ASTNodeDataType::vector_t: {
switch (data_type.dimension()) {
case 1: {
return this->_interpolate<Dimension, TinyVector<1>>();
}
case 2: {
return this->_interpolate<Dimension, TinyVector<2>>();
}
case 3: {
return this->_interpolate<Dimension, TinyVector<3>>();
}
default: {
std::ostringstream os;
os << "invalid vector dimension " << rang::fgB::red << data_type.dimension() << rang::style::reset;
throw UnexpectedError(os.str());
}
}
}
case ASTNodeDataType::matrix_t: {
Assert(data_type.nbColumns() == data_type.nbRows(), "undefined matrix type");
switch (data_type.nbColumns()) {
case 1: {
return this->_interpolate<Dimension, TinyMatrix<1>>();
}
case 2: {
return this->_interpolate<Dimension, TinyMatrix<2>>();
}
case 3: {
return this->_interpolate<Dimension, TinyMatrix<3>>();
}
default: {
std::ostringstream os;
os << "invalid vector dimension " << rang::fgB::red << data_type.dimension() << rang::style::reset;
throw UnexpectedError(os.str());
}
}
}
default: {
std::ostringstream os;
os << "invalid interpolation value type: " << rang::fgB::red << dataTypeName(data_type) << rang::style::reset;
throw UnexpectedError(os.str());
}
}
}
std::shared_ptr<IDiscreteFunction>
DiscreteFunctionInterpoler::interpolate() const
{
std::shared_ptr<IDiscreteFunction> discrete_function;
switch (m_mesh->dimension()) {
case 1: {
std::shared_ptr mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<1>>>(m_mesh);
discrete_function = std::make_shared<DiscreteFunctionP0<1, double>>(mesh, m_function_id);
break;
return this->_interpolate<1>();
}
case 2: {
std::shared_ptr mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<2>>>(m_mesh);
discrete_function = std::make_shared<DiscreteFunctionP0<2, double>>(mesh, m_function_id);
break;
return this->_interpolate<2>();
}
case 3: {
std::shared_ptr mesh = std::dynamic_pointer_cast<const Mesh<Connectivity<3>>>(m_mesh);
discrete_function = std::make_shared<DiscreteFunctionP0<3, double>>(mesh, m_function_id);
break;
return this->_interpolate<3>();
}
default: {
throw UnexpectedError("invalid dimension");
}
}
return discrete_function;
return nullptr;
}
......@@ -15,6 +15,9 @@ class DiscreteFunctionInterpoler
std::shared_ptr<const IDiscreteFunctionDescriptor> m_discrete_function_descriptor;
const FunctionSymbolId m_function_id;
template <size_t Dimension, typename DataType>
std::shared_ptr<IDiscreteFunction> _interpolate() const;
template <size_t Dimension>
std::shared_ptr<IDiscreteFunction> _interpolate() const;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment