diff --git a/AssemblerLib/SerialExecutor.h b/AssemblerLib/SerialExecutor.h new file mode 100644 index 0000000000000000000000000000000000000000..2943b81b4e5fb93eb49f2df58bd38649058c7c85 --- /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 0eafcbbec7f5560ec20af78432cc557fe06c79c7..1d73108ed193e0fc00d0d7df4447cd2b04e776ee 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 d516a23853af58cf1d96f42f272dd5aa0aba0bd8..b1c94eab7b25b54453516eb8d7ea5aea9b9284de 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 fdcdfba242acb81f9becc153e9097635746132b9..eaa5b493c10e885da3ae226d0bea9dbdbefa2e5e 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);