3#include <Eigen/Cholesky>
28template <
typename SOLVER_T,
typename... Args>
78template <
typename SOLVER_T,
typename... Args>
90 PRECICE_CHECK(!(RADIAL_BASIS_FUNCTION_T::isStrictlyPositiveDefinite() && polynomial ==
Polynomial::ON),
"The integrated polynomial (polynomial=\"on\") is not supported for the selected radial-basis function. Please select another radial-basis function or change the polynomial configuration.");
93template <
typename SOLVER_T,
typename... Args>
110 outMesh = this->
input();
112 inMesh = this->
input();
136 globalInMesh.
addMesh(filteredInMesh);
137 globalOutMesh.
addMesh(*outMesh);
144 globalInMesh.
addMesh(secondaryInMesh);
148 globalOutMesh.
addMesh(secondaryOutMesh);
153 globalOutMesh.
addMesh(*outMesh);
157 if constexpr (
sizeof...(Args) > 0) {
162 globalOutMesh, boost::irange<Eigen::Index>(0, globalOutMesh.
nVertices()), this->_deadAxis,
_polynomial);
169template <
typename SOLVER_T,
typename... Args>
177template <
typename... Args>
180 if constexpr (
sizeof...(Args) > 0) {
181 auto param = std::get<0>(optionalArgs);
183 if (param.solver ==
"qr-solver") {
184 return "global-direct RBF (" + exec +
")";
186 return "global-iterative RBF (" + exec +
")";
189 return "global-direct RBF (cpu-executor)";
193template <
typename SOLVER_T,
typename... Args>
199template <
typename SOLVER_T,
typename... Args>
210 const auto &localInData = inData.
values;
212 int localOutputSize = 0;
213 for (
const auto &vertex : this->
output()->vertices()) {
214 if (vertex.isOwner()) {
229 const auto &localInData = inData.
values;
230 globalInValues.
insert(globalInValues.
begin(), localInData.data(), localInData.data() + localInData.size());
232 int localOutputSize = 0;
233 for (
const auto &vertex : this->
output()->vertices()) {
234 if (vertex.isOwner()) {
241 outputValueSizes.
push_back(localOutputSize);
245 int secondaryOutputValueSize;
248 globalInValues.
insert(globalInValues.
end(), secondaryBuffer.
begin(), secondaryBuffer.
end());
251 outputValueSizes.
push_back(secondaryOutputValueSize);
255 const int valueDim = inData.
dataDims;
258 Eigen::Map<Eigen::VectorXd> inputValues(globalInValues.
data(), globalInValues.
size());
259 Eigen::VectorXd outputValues((this->
output()->getGlobalNumberOfVertices()) * valueDim);
264 outputValues.setZero();
266 for (
int dim = 0; dim < valueDim; dim++) {
267 for (
int i = 0; i < in.size(); i++) {
268 in[i] = inputValues(i * valueDim + dim);
275 for (
int i = 0; i < this->
output()->getGlobalNumberOfVertices(); i++) {
276 outputValues[i * valueDim + dim] = out[i];
284 int outputCounter = 0;
285 for (
int i = 0; i < static_cast<int>(this->
output()->nVertices()); ++i) {
286 if (this->
output()->vertex(i).isOwner()) {
287 for (
int dim = 0; dim < valueDim; ++dim) {
288 outData[i * valueDim + dim] = outputValues(outputCounter);
295 int beginPoint = outputValueSizes.
at(0);
299 beginPoint += outputValueSizes.
at(rank);
302 outData = outputValues;
308 const int valueDim = inData.
dataDims;
310 int outputCounter = 0;
311 for (
int i = 0; i < static_cast<int>(this->
output()->nVertices()); ++i) {
312 if (this->
output()->vertex(i).isOwner()) {
313 for (
int dim = 0; dim < valueDim; ++dim) {
314 outData[i * valueDim + dim] = receivedValues.
at(outputCounter);
322template <
typename SOLVER_T,
typename... Args>
333 auto localInDataFiltered = this->
input()->getOwnedVertexData(inData.
values);
334 int localOutputSize = outData.size();
342 const int valueDim = inData.
dataDims;
350 const auto &localInData = this->
input()->getOwnedVertexData(inData.
values);
351 std::copy(localInData.data(), localInData.data() + localInData.size(), globalInValues.
begin());
354 int inputSizeCounter = localInData.size();
355 int secondaryOutDataSize{0};
360 inputSizeCounter += secondaryBuffer.
size();
363 outValuesSize.
push_back(secondaryOutDataSize);
367 const auto &localInData = inData.
values;
368 std::copy(localInData.data(), localInData.data() + localInData.size(), globalInValues.
begin());
378 Eigen::Map<Eigen::VectorXd> inputValues(globalInValues.
data(), globalInValues.
size());
380 Eigen::VectorXd outputValues;
381 outputValues.resize((
_rbfSolver->getOutputSize()) * valueDim);
384 outputValues.setZero();
387 for (
int dim = 0; dim < valueDim; dim++) {
389 for (
int i = 0; i < this->
input()->getGlobalNumberOfVertices(); i++) {
390 in[i] = inputValues[i * valueDim + dim];
396 for (
int i = 0; i < out.size(); i++) {
397 outputValues[i * valueDim + dim] = out[i];
401 outData = Eigen::Map<Eigen::VectorXd>(outputValues.data(), outValuesSize.
at(0));
404 int beginPoint = outValuesSize.
at(0);
410 beginPoint += outValuesSize.
at(rank);
416 outData = Eigen::Map<Eigen::VectorXd>(receivedValues.
data(), receivedValues.
size());
#define PRECICE_DEBUG(...)
#define PRECICE_TRACE(...)
#define PRECICE_CHECK(check,...)
#define PRECICE_ASSERT(...)
int getDimensions() const
const std::string & getName() const
Returns the name of the mesh, as set in the config file.
Abstract base class for mapping of data from one mesh to another.
mesh::PtrMesh output() const
Returns pointer to output mesh.
Constraint
Specifies additional constraints for a mapping.
int getDimensions() const
mesh::PtrMesh input() const
Returns pointer to input mesh.
bool _hasComputedMapping
Flag to indicate whether computeMapping() has been called.
virtual bool hasConstraint(const Constraint &constraint) const
Checks whether the mapping has the given constraint or not.
InitialGuessRequirement
Specifies whether the mapping requires an initial guess.
RadialBasisFctBaseMapping(Constraint constraint, int dimensions, const SOLVER_T::BASIS_FUNCTION_T &function, std::array< bool, 3 > deadAxis, InitialGuessRequirement mappingType)
SOLVER_T::BASIS_FUNCTION_T _basisFunction
typename RadialBasisFctSolver< RBF >::BASIS_FUNCTION_T RADIAL_BASIS_FUNCTION_T
std::unique_ptr< RadialBasisFctSolver< RBF > > _rbfSolver
precice::logging::Logger _log
std::tuple< Args... > optionalArgs
void computeMapping() final override
Computes the mapping coefficients from the in- and output mesh.
void mapConsistent(const time::Sample &inData, Eigen::VectorXd &outData) final override
Maps data using a consistent constraint.
void clear() final override
RadialBasisFctMapping(Mapping::Constraint constraint, int dimensions, RADIAL_BASIS_FUNCTION_T function, std::array< bool, 3 > deadAxis, Polynomial polynomial, Args... args)
Constructor.
std::string getName() const final override
void mapConservative(const time::Sample &inData, Eigen::VectorXd &outData) final override
Maps data using a conservative constraint.
Container and creator for meshes.
void addMesh(Mesh &deltaMesh)
static constexpr MeshID MESH_ID_UNDEFINED
Use if the id of the mesh is not necessary.
std::size_t nVertices() const
Returns the number of vertices.
A C++ 11 implementation of the non-owning C++20 std::span type.
static bool isPrimary()
True if this process is running the primary rank.
static auto allSecondaryRanks()
Returns an iterable range over salve ranks [1, _size)
static bool isSecondary()
True if this process is running a secondary rank.
static com::PtrCommunication & getCommunication()
Intra-participant communication.
void sendMesh(Communication &communication, int rankReceiver, const mesh::Mesh &mesh)
constexpr auto asVector
Allows to use Communication::AsVectorTag in a less verbose way.
void receiveMesh(Communication &communication, int rankSender, mesh::Mesh &mesh)
contains the logging framework.
contains data mapping from points to meshes.
static std::string getNameWithArgs(const std::tuple< Args... > &optionalArgs)
Polynomial
How to handle the polynomial?
void filterMesh(Mesh &destination, const Mesh &source, UnaryPredicate p)
std::shared_ptr< Mesh > PtrMesh
static constexpr SynchronizeTag Synchronize
Convenience instance of the SynchronizeTag.
Main namespace of the precice library.
int dataDims
The dimensionality of the data.