Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Develop #98

Merged
merged 4 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading