diff --git a/include/tug/Core/BTCS.hpp b/include/tug/Core/BTCS.hpp index 8b8f7a5..9b952ab 100644 --- a/include/tug/Core/BTCS.hpp +++ b/include/tug/Core/BTCS.hpp @@ -51,7 +51,7 @@ constexpr std::pair calcBoundaryCoeffClosed(T alpha_center, T alpha_side, // creates coefficient matrix for next time step from alphas in x-direction template static Eigen::SparseMatrix -createCoeffMatrix(const Eigen::MatrixX &alpha, +createCoeffMatrix(const typename Grid::RowMajMat &alpha, const std::vector> &bcLeft, const std::vector> &bcRight, const std::vector> &inner_bc, int numCols, @@ -160,9 +160,9 @@ constexpr T calcExplicitConcentrationsBoundaryConstant(T conc_center, T conc_bc, // concentrations template static Eigen::VectorX -createSolutionVector(const Eigen::MatrixX &concentrations, - const Eigen::MatrixX &alphaX, - const Eigen::MatrixX &alphaY, +createSolutionVector(const typename Grid::RowMajMat &concentrations, + const typename Grid::RowMajMat &alphaX, + const typename Grid::RowMajMat &alphaY, const std::vector> &bcLeft, const std::vector> &bcRight, const std::vector> &bcTop, diff --git a/include/tug/Grid.hpp b/include/tug/Grid.hpp index c4f35ec..3dbd2bd 100644 --- a/include/tug/Grid.hpp +++ b/include/tug/Grid.hpp @@ -10,6 +10,8 @@ #include #include +#include +#include #include namespace tug { @@ -22,6 +24,9 @@ namespace tug { */ template class Grid { public: + using RowMajMat = + Eigen::Matrix; + /** * @brief Constructs a new 1D-Grid object of a given length, which holds a * matrix with concentrations and a respective matrix of alpha coefficients. @@ -68,9 +73,9 @@ public: this->deltaCol = static_cast(this->domainCol) / static_cast(this->col); // -> 1 - this->concentrations = Eigen::MatrixX::Constant(row, col, MAT_INIT_VAL); - this->alphaX = Eigen::MatrixX::Constant(row, col, MAT_INIT_VAL); - this->alphaY = Eigen::MatrixX::Constant(row, col, MAT_INIT_VAL); + this->concentrations = RowMajMat::Constant(row, col, MAT_INIT_VAL); + this->alphaX = RowMajMat::Constant(row, col, MAT_INIT_VAL); + this->alphaY = RowMajMat::Constant(row, col, MAT_INIT_VAL); } /** @@ -90,13 +95,27 @@ public: this->concentrations = concentrations; } + /** + * @brief Sets the concentrations matrix for a 1D or 2D-Grid. + * + * @param concentrations A pointer to an array holding the concentrations. + * Array must have correct dimensions as defined in row and col. (Or length, + * in 1D case). There is no check for correct dimensions, so be careful! + */ + void setConcentrations(T *concentrations) { + Eigen::Map< + Eigen::Matrix> + map(concentrations, this->row, this->col); + this->concentrations = map; + } + /** * @brief Gets the concentrations matrix for a Grid. * * @return An Eigen3 matrix holding the concentrations and having * the same dimensions as the grid. */ - const Eigen::MatrixX &getConcentrations() { return this->concentrations; } + const auto &getConcentrations() { return this->concentrations; } /** * @brief Set the alpha coefficients of a 1D-Grid. Grid must be one @@ -119,6 +138,26 @@ public: this->alphaX = alpha; } + /** + * @brief Set the alpha coefficients of a 1D-Grid. Grid must be one + * dimensional. + * + * @param alpha A pointer to an array holding the alpha coefficients. Array + * must have correct dimensions as defined in length. There is no check for + * correct dimensions, so be careful! + */ + void setAlpha(T *alpha) { + if (dim != 1) { + throw std::invalid_argument( + "Grid is not one dimensional, you should probably " + "use 2D setter function!"); + } + Eigen::Map< + Eigen::Matrix> + map(alpha, 1, this->col); + this->alphaX = map; + } + /** * @brief Set the alpha coefficients of a 2D-Grid. Grid must be two * dimensional. @@ -150,13 +189,40 @@ public: this->alphaY = alphaY; } + /** + * @brief Set the alpha coefficients of a 2D-Grid. Grid must be two + * dimensional. + * + * @param alphaX A pointer to an array holding the alpha coefficients in + * x-direction. Array must have correct dimensions as defined in row and col. + * There is no check for correct dimensions, so be careful! + * @param alphaY A pointer to an array holding the alpha coefficients in + * y-direction. Array must have correct dimensions as defined in row and col. + * There is no check for correct dimensions, so be careful! + */ + void setAlpha(T *alphaX, T *alphaY) { + if (dim != 2) { + throw std::invalid_argument( + "Grid is not two dimensional, you should probably " + "use 1D setter function!"); + } + Eigen::Map< + Eigen::Matrix> + mapX(alphaX, this->row, this->col); + Eigen::Map< + Eigen::Matrix> + mapY(alphaY, this->row, this->col); + this->alphaX = mapX; + this->alphaY = mapY; + } + /** * @brief Gets the matrix of alpha coefficients of a 1D-Grid. Grid must be one * dimensional. * * @return A matrix with 1 row holding the alpha coefficients. */ - const Eigen::MatrixX &getAlpha() const { + const auto &getAlpha() const { if (dim != 1) { throw std::invalid_argument( "Grid is not one dimensional, you should probably " @@ -172,7 +238,7 @@ public: * * @return A matrix holding the alpha coefficients in x-direction. */ - const Eigen::MatrixX &getAlphaX() const { + const auto &getAlphaX() const { if (dim != 2) { throw std::invalid_argument( @@ -188,7 +254,7 @@ public: * * @return A matrix holding the alpha coefficients in y-direction. */ - const Eigen::MatrixX &getAlphaY() const { + const auto &getAlphaY() const { if (dim != 2) { throw std::invalid_argument( @@ -316,16 +382,19 @@ public: } private: - int col; // number of grid columns - int row{1}; // number of grid rows - int dim; // 1D or 2D - T domainCol; // number of domain columns - T domainRow{0}; // number of domain rows - T deltaCol; // delta in x-direction (between columns) - T deltaRow{0}; // delta in y-direction (between rows) - Eigen::MatrixX concentrations; // Matrix holding grid concentrations - Eigen::MatrixX alphaX; // Matrix holding alpha coefficients in x-direction - Eigen::MatrixX alphaY; // Matrix holding alpha coefficients in y-direction + int col; // number of grid columns + int row{1}; // number of grid rows + int dim; // 1D or 2D + T domainCol; // number of domain columns + T domainRow{0}; // number of domain rows + T deltaCol; // delta in x-direction (between columns) + T deltaRow{0}; // delta in y-direction (between rows) + + RowMajMat concentrations; // Matrix holding grid concentrations + RowMajMat alphaX; // Matrix holding alpha coefficients in x-direction + RowMajMat alphaY; // Matrix holding alpha coefficients in y-direction + + using RowMajMatMap = Eigen::Map; static constexpr T MAT_INIT_VAL = 0; }; diff --git a/test/testGrid.cpp b/test/testGrid.cpp index 8e17526..9eee265 100644 --- a/test/testGrid.cpp +++ b/test/testGrid.cpp @@ -1,6 +1,7 @@ #include #include #include +#include using namespace Eigen; using namespace std; @@ -250,4 +251,18 @@ TEST_CASE("2D Grid64 non-quadratic") { dr = -2; CHECK_THROWS(grid.setDomain(dr, dc)); } + + SUBCASE("set concentration from pointer") { + std::vector concentrations(r * c); + + for (int i = 0; i < r * c; i++) { + concentrations[i] = i; + } + + grid.setConcentrations(concentrations.data()); + + CHECK_EQ(grid.getConcentrations()(0, 0), 0); + CHECK_EQ(grid.getConcentrations()(0, 1), 1); + CHECK_EQ(grid.getConcentrations()(1, 0), c); + } }