Skip to content

Commit

Permalink
Merge pull request #98 from cbritopacheco/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
cbritopacheco authored Jul 11, 2024
2 parents ab5ac29 + 721fc1e commit e3938cd
Show file tree
Hide file tree
Showing 63 changed files with 3,315 additions and 1,729 deletions.
1 change: 0 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@ rodin_add_compile_options(LANG CXX C OPTIONS -Wno-error=old-style-cast -Wno-erro
add_compile_definitions(_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION)
add_compile_definitions(__MAC_OS_X_VERSION_MIN_REQUIRED=__MAC_10_8)


if (RODIN_LTO)
rodin_add_compile_options(LANG CXX C OPTIONS -flto)
endif()
Expand Down
8 changes: 4 additions & 4 deletions examples/PDEs/Helmholtz.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ int main(int, char**)

// Functions
P1<Complex> vh(mesh);
GridFunction gf(vh);

Math::Vector<Complex> m(2);
m << Complex(3, 1), Complex(2, 9);
TrialFunction u(vh);
TestFunction v(vh);

std::cout << m << std::endl;
std::cout << m.dot(m) << std::endl;
Problem helmholtz(u, v);

// TrialFunction uRe(vh), uIm(vh);
// TestFunction vRe(vh), vIm(vh);
Expand Down
203 changes: 166 additions & 37 deletions src/Rodin/Assembly/Multithreaded.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,31 @@ namespace Rodin::Assembly

template <class TrialFES, class TestFES>
class Multithreaded<
std::vector<Eigen::Triplet<Real>>,
Variational::BilinearForm<TrialFES, TestFES, std::vector<Eigen::Triplet<Real>>>>
std::vector<Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>,
Variational::BilinearForm<TrialFES, TestFES,
std::vector<Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>> final
: public AssemblyBase<
std::vector<Eigen::Triplet<Real>>,
Variational::BilinearForm<TrialFES, TestFES, std::vector<Eigen::Triplet<Real>>>>
std::vector<Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>,
Variational::BilinearForm<TrialFES, TestFES,
std::vector<Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>>
{
public:
using ScalarType = Real;
using ScalarType =
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>());

using OperatorType = std::vector<Eigen::Triplet<ScalarType>>;

Expand Down Expand Up @@ -271,39 +288,96 @@ namespace Rodin::Assembly

template <class TrialFES, class TestFES>
thread_local
std::vector<Eigen::Triplet<Real>>
std::vector<
Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>
Multithreaded<
std::vector<Eigen::Triplet<Real>>,
Variational::BilinearForm<TrialFES, TestFES, std::vector<Eigen::Triplet<Real>>>>::tl_triplets;
std::vector<
Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>,
Variational::BilinearForm<TrialFES, TestFES,
std::vector<
Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>>::tl_triplets;

template <class TrialFES, class TestFES>
thread_local
std::unique_ptr<Variational::LocalBilinearFormIntegratorBase<Real>>
std::unique_ptr<
Variational::LocalBilinearFormIntegratorBase<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>
Multithreaded<
std::vector<Eigen::Triplet<Real>>,
Variational::BilinearForm<TrialFES, TestFES, std::vector<Eigen::Triplet<Real>>>>::tl_lbfi;
std::vector<
Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>,
Variational::BilinearForm<TrialFES, TestFES,
std::vector<
Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>>::tl_lbfi;

template <class TrialFES, class TestFES>
thread_local
std::unique_ptr<Variational::GlobalBilinearFormIntegratorBase<Real>>
std::unique_ptr<
Variational::GlobalBilinearFormIntegratorBase<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>
Multithreaded<
std::vector<Eigen::Triplet<Real>>,
Variational::BilinearForm<TrialFES, TestFES, std::vector<Eigen::Triplet<Real>>>>::tl_gbfi;
std::vector<
Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>,
Variational::BilinearForm<TrialFES, TestFES,
std::vector<Eigen::Triplet<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>>::tl_gbfi;

/**
* @brief Multithreaded assembly of the Math::SparseMatrix<Real> associated to a
* @brief Multithreaded assembly of the Math::SparseMatrix associated to a
* BilinearFormBase object.
*/
template <class TrialFES, class TestFES>
class Multithreaded<
Math::SparseMatrix<Real>,
Variational::BilinearForm<TrialFES, TestFES, Math::SparseMatrix<Real>>> final
Math::SparseMatrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<
TrialFES, TestFES,
Math::SparseMatrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>> final
: public AssemblyBase<
Math::SparseMatrix<Real>,
Variational::BilinearForm<TrialFES, TestFES, Math::SparseMatrix<Real>>>
Math::SparseMatrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<
TrialFES, TestFES,
Math::SparseMatrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>
{
public:
using ScalarType = Real;
using ScalarType =
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>());

using OperatorType = Math::SparseMatrix<ScalarType>;

Expand Down Expand Up @@ -370,14 +444,32 @@ namespace Rodin::Assembly

template <class TrialFES, class TestFES>
class Multithreaded<
Math::Matrix<Real>,
Variational::BilinearForm<TrialFES, TestFES, Math::Matrix<Real>>>
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<
TrialFES, TestFES,
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>> final
: public AssemblyBase<
Math::Matrix<Real>,
Variational::BilinearForm<TrialFES, TestFES, Math::Matrix<Real>>>
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<TrialFES, TestFES,
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>
{
public:
using ScalarType = Real;
using ScalarType =
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>());

using OperatorType = Math::Matrix<ScalarType>;

Expand Down Expand Up @@ -564,20 +656,57 @@ namespace Rodin::Assembly
mutable std::variant<Threads::ThreadPool, std::reference_wrapper<Threads::ThreadPool>> m_pool;
};

template <class TrialFES, class TestFES>
thread_local
Math::Matrix<Real>
Multithreaded<Math::Matrix<Real>, Variational::BilinearForm<TrialFES, TestFES, Math::Matrix<Real>>>::tl_res;
template <class TrialFES, class TestFES>
thread_local
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>
Multithreaded<
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<TrialFES, TestFES,
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>::tl_res;

template <class TrialFES, class TestFES>
thread_local
std::unique_ptr<Variational::LocalBilinearFormIntegratorBase<Real>>
Multithreaded<Math::Matrix<Real>, Variational::BilinearForm<TrialFES, TestFES, Math::Matrix<Real>>>::tl_lbfi;
template <class TrialFES, class TestFES>
thread_local
std::unique_ptr<
Variational::LocalBilinearFormIntegratorBase<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>
Multithreaded<
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<TrialFES, TestFES,
Math::Matrix<decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>::tl_lbfi;

template <class TrialFES, class TestFES>
thread_local
std::unique_ptr<Variational::GlobalBilinearFormIntegratorBase<Real>>
Multithreaded<Math::Matrix<Real>, Variational::BilinearForm<TrialFES, TestFES, Math::Matrix<Real>>>::tl_gbfi;
template <class TrialFES, class TestFES>
thread_local
std::unique_ptr<
Variational::GlobalBilinearFormIntegratorBase<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>
Multithreaded<
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>,
Variational::BilinearForm<TrialFES, TestFES,
Math::Matrix<
decltype(
std::declval<typename FormLanguage::Traits<TrialFES>::ScalarType>() *
std::declval<typename FormLanguage::Traits<TestFES>::ScalarType>())>>>::tl_gbfi;

/**
* @brief %Multithreaded assembly of the Math::Vector associated to a
Expand Down
Loading

0 comments on commit e3938cd

Please sign in to comment.