Skip to content

Commit

Permalink
Move reduceVector to Eigen helper functions (precice#795)
Browse files Browse the repository at this point in the history
  • Loading branch information
oguzziya authored Jul 10, 2020
1 parent f737cee commit e8dee9b
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 26 deletions.
31 changes: 5 additions & 26 deletions src/mapping/RadialBasisFctMapping.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "mesh/RTree.hpp"
#include "utils/Event.hpp"
#include "utils/MasterSlave.hpp"
#include "utils/EigenHelperFunctions.hpp"
#include "mesh/impl/BBUtils.hpp"

#include <Eigen/Core>
Expand Down Expand Up @@ -533,28 +534,6 @@ void RadialBasisFctMapping<RADIAL_BASIS_FUNCTION_T>::tagMeshSecondRound()
}

// ------- Non-Member Functions ---------
Eigen::VectorXd reduceVector(const Eigen::VectorXd &fullVector, std::vector<bool> deadAxis)
{

int dimensions = deadAxis.size();
int deadDimensions = 0;
for (int d = 0; d < dimensions; d++) {
if (deadAxis[d])
deadDimensions += 1;
}

PRECICE_ASSERT(dimensions > deadDimensions, dimensions, deadDimensions);
Eigen::VectorXd reducedVector(dimensions - deadDimensions);
int k = 0;

for (int d = 0; d < dimensions; d++) {
if (not deadAxis[d]) {
reducedVector[k] = fullVector[d];
k++;
}
}
return reducedVector;
}

template <typename RADIAL_BASIS_FUNCTION_T>
Eigen::MatrixXd buildMatrixCLU(RADIAL_BASIS_FUNCTION_T basisFunction, const mesh::Mesh &inputMesh, std::vector<bool> deadAxis)
Expand All @@ -579,10 +558,10 @@ Eigen::MatrixXd buildMatrixCLU(RADIAL_BASIS_FUNCTION_T basisFunction, const mesh
for (int j = i; j < inputSize; ++j) {
const auto &u = inputMesh.vertices()[i].getCoords();
const auto &v = inputMesh.vertices()[j].getCoords();
matrixCLU(i, j) = basisFunction.evaluate(reduceVector((u - v), deadAxis).norm());
matrixCLU(i, j) = basisFunction.evaluate(utils::reduceVector((u - v), deadAxis).norm());
}

const auto reduced = reduceVector(inputMesh.vertices()[i].getCoords(), deadAxis);
const auto reduced = utils::reduceVector(inputMesh.vertices()[i].getCoords(), deadAxis);

for (int dim = 0; dim < dimensions - deadDimensions; dim++) {
matrixCLU(i, inputSize + 1 + dim) = reduced[dim];
Expand Down Expand Up @@ -620,10 +599,10 @@ Eigen::MatrixXd buildMatrixA(RADIAL_BASIS_FUNCTION_T basisFunction, const mesh::
for (int j = 0; j < inputSize; ++j) {
const auto &u = outputMesh.vertices()[i].getCoords();
const auto &v = inputMesh.vertices()[j].getCoords();
matrixA(i, j) = basisFunction.evaluate(reduceVector((u - v), deadAxis).norm());
matrixA(i, j) = basisFunction.evaluate(utils::reduceVector((u - v), deadAxis).norm());
}

const auto reduced = reduceVector(outputMesh.vertices()[i].getCoords(), deadAxis);
const auto reduced = utils::reduceVector(outputMesh.vertices()[i].getCoords(), deadAxis);

for (int dim = 0; dim < dimensions - deadDimensions; dim++) {
matrixA(i, inputSize + 1 + dim) = reduced[dim];
Expand Down
23 changes: 23 additions & 0 deletions src/utils/EigenHelperFunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,5 +55,28 @@ void append(
v(n) = value;
}

Eigen::VectorXd reduceVector(
const Eigen::VectorXd &fullVector,
const std::vector<bool>& deadAxis)
{
int deadDimensions = 0;
int dimensions = deadAxis.size();
for (int d = 0; d < dimensions; d++) {
if (deadAxis[d])
deadDimensions += 1;
}
PRECICE_ASSERT(dimensions > deadDimensions, dimensions, deadDimensions);
Eigen::VectorXd reducedVector(dimensions - deadDimensions);
int k = 0;
for (int d = 0; d < dimensions; d++) {
if (not deadAxis[d]) {
reducedVector[k] = fullVector[d];
k++;
}
}
return reducedVector;
}


} // namespace utils
} // namespace precice
4 changes: 4 additions & 0 deletions src/utils/EigenHelperFunctions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

#include <Eigen/Core>
#include <iterator>
#include <vector>
#include "utils/algorithm.hpp"
#include "utils/assertion.hpp"

Expand All @@ -14,6 +15,9 @@ void appendFront(Eigen::MatrixXd &A, Eigen::VectorXd &v);

void removeColumnFromMatrix(Eigen::MatrixXd &A, int col);

/// Deletes all dead directions from fullVector and returns a vector of reduced dimensionality.
Eigen::VectorXd reduceVector(const Eigen::VectorXd &fullVector, const std::vector<bool> &deadAxis);

void append(Eigen::VectorXd &v, double value);

template <typename Derived1>
Expand Down

0 comments on commit e8dee9b

Please sign in to comment.