From 4e63b20ca077c283b34cdd233211c672e93f77ec Mon Sep 17 00:00:00 2001 From: Dmitrij Naumov <dmitrij@naumov.de> Date: Fri, 23 Aug 2013 23:06:44 +0200 Subject: [PATCH] Extract AssemblerLib::SerialExecutor from vector/matrix builder. Both are independent of each other. --- AssemblerLib/SerialExecutor.h | 39 +++++++++++++++++++ AssemblerLib/SerialVectorMatrixBuilder.h | 17 -------- .../TestSerialLinearSolver.cpp | 3 +- Tests/VecMatOnMeshLib/TestSerialVecMat.cpp | 5 ++- 4 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 AssemblerLib/SerialExecutor.h diff --git a/AssemblerLib/SerialExecutor.h b/AssemblerLib/SerialExecutor.h new file mode 100644 index 00000000000..2943b81b4e5 --- /dev/null +++ b/AssemblerLib/SerialExecutor.h @@ -0,0 +1,39 @@ +/** + * \author Norihiro Watanabe + * \date 2013-04-16 + * + * \copyright + * Copyright (c) 2013, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#ifndef ASSEMBLERLIB_SERIALEXECUTOR_H_H +#define ASSEMBLERLIB_SERIALEXECUTOR_H_H + +#include <vector> + +namespace AssemblerLib +{ + +/// Executes a \c f for each element in input vector. +/// Return values of the function call are ignored. +/// +/// \tparam T type of input vector elements +/// \tparam F \c f type +/// +/// \param v a vector of T pointers +/// \param f a function that accepts a pointer to T and an index as arguments +template <typename T, typename F> +void +serialExecute(std::vector<T*> const& v, F const& f) +{ + for (std::size_t i = 0; i < v.size(); i++) + f(v[i], i); +}; + +} // namespace AssemblerLib + +#endif // ASSEMBLERLIB_SERIALEXECUTOR_H_H diff --git a/AssemblerLib/SerialVectorMatrixBuilder.h b/AssemblerLib/SerialVectorMatrixBuilder.h index 0eafcbbec7f..1d73108ed19 100644 --- a/AssemblerLib/SerialVectorMatrixBuilder.h +++ b/AssemblerLib/SerialVectorMatrixBuilder.h @@ -13,8 +13,6 @@ #ifndef ASSEMBLERLIB_SERIALVECTORMATRIXBUILDER_H_ #define ASSEMBLERLIB_SERIALVECTORMATRIXBUILDER_H_ -#include <vector> - #include "AssemblerLib/MeshComponentMap.h" namespace AssemblerLib @@ -27,21 +25,6 @@ public: typedef VectorType_ VectorType; typedef MatrixType_ MatrixType; - /// Executes task(item, index) for each item in input vector. - /// Return values of the task call are ignored. - /// - /// \param vec_items a vector of mesh item pointers - /// \param task a function that accepts a mesh item pointer - /// and an index as arguments - template <class T_MESHITEM, class T_TASK> - static - void - forEachMeshItem(const std::vector<T_MESHITEM*> &vec_items, T_TASK &task) - { - for (std::size_t i=0; i<vec_items.size(); i++) - task(vec_items[i], i); - } - public: VectorType* createVector(const MeshComponentMap &dist_layout) { diff --git a/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp b/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp index d516a23853a..b1c94eab7b2 100644 --- a/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp +++ b/Tests/VecMatOnMeshLib/TestSerialLinearSolver.cpp @@ -20,6 +20,7 @@ #include "AssemblerLib/MeshComponentMap.h" #include "AssemblerLib/SerialDenseVectorMatrixBuilder.h" +#include "AssemblerLib/SerialExecutor.h" #include "MathLib/LinAlg/Dense/DenseTools.h" #include "MathLib/LinAlg/Solvers/GaussAlgorithm.h" @@ -108,7 +109,7 @@ TEST(VecMatOnMeshLib, SerialLinearSolver) map_ele_nodes2vec_entries); // Call global assembler for each mesh element. - SerialBuilder::forEachMeshItem(ex1.msh->getElements(), assembler); + AssemblerLib::serialExecute(ex1.msh->getElements(), assembler); //std::cout << "A=\n"; //A->write(std::cout); diff --git a/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp b/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp index fdcdfba242a..eaa5b493c10 100644 --- a/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp +++ b/Tests/VecMatOnMeshLib/TestSerialVecMat.cpp @@ -22,6 +22,7 @@ #include "AssemblerLib/MeshComponentMap.h" #include "AssemblerLib/SerialDenseVectorMatrixBuilder.h" +#include "AssemblerLib/SerialExecutor.h" #include "MathLib/LinAlg/Dense/DenseMatrix.h" #include "MathLib/LinAlg/Dense/DenseTools.h" @@ -157,7 +158,7 @@ TEST(VecMatOnMeshLib, SerialVectorMatrixBuilder) *vec_left_nodes_x_coord.get(), extractX, map_node2vec_entry); // do assembly for each selected node - SerialBuilder::forEachMeshItem(vec_selected_nodes, vec1Assembler); + AssemblerLib::serialExecute(vec_selected_nodes, vec1Assembler); ASSERT_EQ(0.0, (*vec_left_nodes_x_coord)[0]); ASSERT_EQ(0.5, (*vec_left_nodes_x_coord)[5]); @@ -198,7 +199,7 @@ TEST(VecMatOnMeshLib, SerialVectorMatrixBuilder) SetNodeDistXToMat matAssembler(*mat.get(), nodeDist, mat_data_pos); // do assembly for each selected element - SerialBuilder::forEachMeshItem(vec_selected_eles, matAssembler); + AssemblerLib::serialExecute(vec_selected_eles, matAssembler); ASSERT_NEAR(0.0, (*mat)(0,0), 1e-6); ASSERT_NEAR(0.1, (*mat)(0,1), 1e-6); -- GitLab