diff --git a/ProcessLib/Parameter/ConstantParameter.h b/ProcessLib/Parameter/ConstantParameter.h index 330c38de124a92a71c36201fd07a9009b4bd0caf..0b1c0759260275c404af3db4b798a6da50fb8d26 100644 --- a/ProcessLib/Parameter/ConstantParameter.h +++ b/ProcessLib/Parameter/ConstantParameter.h @@ -46,6 +46,24 @@ struct ConstantParameter final : public Parameter<T> return _values; } + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> getNodalValuesOnElement( + MeshLib::Element const& element, double const /*t*/) const override + { + auto const n_nodes = element.getNumberOfNodes(); + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> result( + n_nodes, getNumberOfComponents()); + + // Column vector of values, copied for each node. + auto const row_values = + Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1> const>( + _values.data(), _values.size()); + for (unsigned i = 0; i < n_nodes; ++i) + { + result.row(i) = row_values; + } + return result; + } + private: std::vector<T> const _values; }; diff --git a/ProcessLib/Parameter/MeshElementParameter.h b/ProcessLib/Parameter/MeshElementParameter.h index 2679b41af70bc6ac3f9cfacc0e57748528cf1361..250b2a0a8bad2021cd6404170056d72883cfe312 100644 --- a/ProcessLib/Parameter/MeshElementParameter.h +++ b/ProcessLib/Parameter/MeshElementParameter.h @@ -11,8 +11,6 @@ #include "Parameter.h" -#include "BaseLib/Error.h" - namespace MeshLib { template <typename T> @@ -57,6 +55,27 @@ struct MeshElementParameter final : public Parameter<T> { return _cache; } + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> getNodalValuesOnElement( + MeshLib::Element const& element, double const t) const override + { + auto const n_nodes = element.getNumberOfNodes(); + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> result( + n_nodes, getNumberOfComponents()); + + // Column vector of values, copied for each node. + SpatialPosition x_position; + x_position.setElementID(element.getID()); + auto const& values = this->operator()(t, x_position); + auto const row_values = + Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1> const>( + values.data(), values.size()); + for (unsigned i = 0; i < n_nodes; ++i) + { + result.row(i) = row_values; + } + return result; + } + private: MeshLib::PropertyVector<T> const& _property; mutable std::vector<double> _cache; diff --git a/ProcessLib/Parameter/MeshNodeParameter.h b/ProcessLib/Parameter/MeshNodeParameter.h index 9920fbdebde494ce1223e2851c495cc96b669738..77c030933e9efb601d240f9c4ff4cf3f5ef092f8 100644 --- a/ProcessLib/Parameter/MeshNodeParameter.h +++ b/ProcessLib/Parameter/MeshNodeParameter.h @@ -12,6 +12,8 @@ #include "Parameter.h" #include "BaseLib/Error.h" +#include "MeshLib/Elements/Element.h" +#include "MeshLib/Node.h" namespace MeshLib { @@ -57,6 +59,27 @@ struct MeshNodeParameter final : public Parameter<T> { return _cache; } + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> getNodalValuesOnElement( + MeshLib::Element const& element, double const t) const override + { + auto const n_nodes = element.getNumberOfNodes(); + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> result( + n_nodes, getNumberOfComponents()); + + SpatialPosition x_position; + auto const nodes = element.getNodes(); + for (unsigned i = 0; i < n_nodes; ++i) + { + x_position.setNodeID(nodes[i]->getID()); + auto const& values = this->operator()(t, x_position); + result.row(i) = + Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1> const>( + values.data(), values.size()); + } + + return result; + } + private: MeshLib::PropertyVector<T> const& _property; mutable std::vector<double> _cache; diff --git a/ProcessLib/Parameter/Parameter.h b/ProcessLib/Parameter/Parameter.h index 8826df2628b9865f3b424578f384b89f94f40cbf..32f6a47bf8af1fe48f420f6ff7e61a2f352be22b 100644 --- a/ProcessLib/Parameter/Parameter.h +++ b/ProcessLib/Parameter/Parameter.h @@ -13,6 +13,13 @@ #include <memory> #include <utility> #include <vector> + +#include <Eigen/Dense> + +#include "BaseLib/Error.h" +#include "MeshLib/Elements/Element.h" +#include "MeshLib/Node.h" + #include "SpatialPosition.h" namespace BaseLib @@ -72,6 +79,41 @@ struct Parameter : public ParameterBase //! Returns the parameter value at the given time and position. virtual std::vector<T> const& operator()( double const t, SpatialPosition const& pos) const = 0; + + //! Returns a matrix of values for all nodes of the given element. + // + // The matrix is of the shape NxC, where N is the number of nodes and C is + // the number of components, such that subsequent multiplication with shape + // functions matrix from left (which is a row vector) results in a row + // vector of length C. + // + // The default implementation covers all cases, but the derived classes may + // provide faster implementations. + virtual Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> + getNodalValuesOnElement(MeshLib::Element const& element, + double const t) const + { + auto const n_nodes = static_cast<int>(element.getNumberOfNodes()); + auto const n_components = getNumberOfComponents(); + Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> result(n_nodes, + n_components); + + // Column vector of values, copied for each node. + SpatialPosition x_position; + auto const nodes = element.getNodes(); + for (int i = 0; i < n_nodes; ++i) + { + x_position.setAll( + nodes[i]->getID(), element.getID(), boost::none, boost::none); + auto const& values = this->operator()(t, x_position); + auto const row_values = + Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, 1> const>( + values.data(), values.size()); + result.row(i) = row_values; + } + + return result; + } }; //! Constructs a new ParameterBase from the given configuration.