Skip to content

Commit

Permalink
DSl use move semantics reduce complexity to linear
Browse files Browse the repository at this point in the history
  • Loading branch information
HenningScheufler authored and greole committed Oct 4, 2024
1 parent 8ec3309 commit d2109e7
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 21 deletions.
37 changes: 17 additions & 20 deletions include/NeoFOAM/DSL/eqnSystem.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ class EqnSystem
public:

EqnSystem(const NeoFOAM::Executor& exec, std::size_t nCells)
: exec_(exec), nCells_(nCells), temporalTerms_(), implicitTerms_(), explicitTerms_(), volumeField_(nullptr)
: exec_(exec), nCells_(nCells), temporalTerms_(), implicitTerms_(), explicitTerms_(),
volumeField_(nullptr)
{}

NeoFOAM::Field<NeoFOAM::scalar> explicitOperation()
Expand Down Expand Up @@ -104,7 +105,7 @@ class EqnSystem

const std::size_t nCells() const { return nCells_; }

fvcc::VolumeField<NeoFOAM::scalar>* volumeField()
fvcc::VolumeField<NeoFOAM::scalar>* volumeField()
{
if (temporalTerms_.size() == 0 && implicitTerms_.size() == 0)
{
Expand All @@ -118,10 +119,11 @@ class EqnSystem
{
volumeField_ = implicitTerms_[0].volumeField();
}
return volumeField_;
return volumeField_;
}

NeoFOAM::scalar dt = 0;

private:

const NeoFOAM::Executor exec_;
Expand All @@ -132,19 +134,16 @@ class EqnSystem
fvcc::VolumeField<NeoFOAM::scalar>* volumeField_;
};

EqnSystem operator+(const EqnSystem& lhs, const EqnSystem& rhs)
EqnSystem operator+(EqnSystem lhs, const EqnSystem& rhs)
{
std::cout << "Adding EqnSystem from EqnSystem" << std::endl;
EqnSystem results = lhs;
results.addSystem(rhs);
return results;
lhs.addSystem(rhs);
return lhs;
}

EqnSystem operator+(const EqnSystem& lhs, const EqnTerm& rhs)
EqnSystem operator+(EqnSystem lhs, const EqnTerm& rhs)
{
EqnSystem results = lhs;
results.addTerm(rhs);
return results;
lhs.addTerm(rhs);
return lhs;
}

EqnSystem operator+(const EqnTerm& lhs, const EqnTerm& rhs)
Expand Down Expand Up @@ -173,18 +172,16 @@ EqnSystem operator*(NeoFOAM::scalar scale, const EqnSystem& es)
return results;
}

EqnSystem operator-(const EqnSystem& lhs, const EqnSystem& rhs)
EqnSystem operator-(EqnSystem lhs, const EqnSystem& rhs)
{
EqnSystem results = lhs;
results.addSystem(-1.0 * rhs);
return results;
lhs.addSystem(-1.0 * rhs);
return lhs;
}

EqnSystem operator-(const EqnSystem& lhs, const EqnTerm& rhs)
EqnSystem operator-(EqnSystem lhs, const EqnTerm& rhs)
{
EqnSystem results = lhs;
results.addTerm(-1.0 * rhs);
return results;
lhs.addTerm(-1.0 * rhs);
return lhs;
}

EqnSystem operator-(const EqnTerm& lhs, const EqnTerm& rhs)
Expand Down
2 changes: 1 addition & 1 deletion test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,4 @@ add_subdirectory(core)
add_subdirectory(fields)
add_subdirectory(finiteVolume)
add_subdirectory(mesh)
# add_subdirectory(dsl)
add_subdirectory(dsl)
90 changes: 90 additions & 0 deletions test/dsl/dsl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,14 @@
#include <catch2/catch_session.hpp>
#include <catch2/catch_test_macros.hpp>
#include <catch2/generators/catch_generators_all.hpp>
#include <catch2/benchmark/catch_benchmark.hpp>

#include "NeoFOAM/DSL/eqnTerm.hpp"
#include "NeoFOAM/DSL/eqnSystem.hpp"


namespace dsl = NeoFOAM::DSL;
namespace fvcc = NeoFOAM::finiteVolume::cellCentred;

class Laplacian
{
Expand All @@ -35,6 +37,8 @@ class Laplacian

const std::size_t nCells() const { return nCells_; }

fvcc::VolumeField<NeoFOAM::scalar>* volumeField() { return nullptr; }

dsl::EqnTerm::Type termType_;

const NeoFOAM::Executor exec_;
Expand Down Expand Up @@ -65,6 +69,8 @@ class Divergence

const std::size_t nCells() const { return nCells_; }

fvcc::VolumeField<NeoFOAM::scalar>* volumeField() { return nullptr; }

dsl::EqnTerm::Type termType_;

const NeoFOAM::Executor exec_;
Expand Down Expand Up @@ -102,18 +108,33 @@ TEST_CASE("DSL")
REQUIRE(eqnSys.size() == 2);
REQUIRE(getField(eqnSys.explicitOperation()) == 2);
}
BENCHMARK("Creation from EqnTerm")
{
dsl::EqnSystem eqnSys = lapTerm + divTerm;
return eqnSys;
};

{
dsl::EqnSystem eqnSys(lapTerm + lapTerm + divTerm + divTerm);
REQUIRE(eqnSys.size() == 4);
REQUIRE(getField(eqnSys.explicitOperation()) == 4.0);
}
BENCHMARK("Creation from multiple terms")
{
dsl::EqnSystem eqnSys2(lapTerm + lapTerm + divTerm + divTerm);
return eqnSys2;
};

{
dsl::EqnSystem eqnSys(lapTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1));
REQUIRE(eqnSys.size() == 2);
REQUIRE(getField(eqnSys.explicitOperation()) == 2.0);
}
BENCHMARK("Creation from term and temporary term")
{
dsl::EqnSystem eqnSys(lapTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1));
return eqnSys;
};

{
dsl::EqnSystem eqnSys = lapTerm - divTerm;
Expand Down Expand Up @@ -148,6 +169,19 @@ TEST_CASE("DSL")
REQUIRE(combinedEqnSys.size() == 8);
REQUIRE(getField(combinedEqnSys.explicitOperation()) == 8.0);
}
BENCHMARK("Creation from term and temporary term")
{
dsl::EqnSystem eqnSys(
lapTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1) + divTerm
+ Divergence(dsl::EqnTerm::Type::Explicit, exec, 1)
);
dsl::EqnSystem eqnSys2(
lapTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1) + divTerm
+ Divergence(dsl::EqnTerm::Type::Explicit, exec, 1)
);
dsl::EqnSystem combinedEqnSys = eqnSys + eqnSys2;
return combinedEqnSys;
};

{
dsl::EqnSystem eqnSys(
Expand Down Expand Up @@ -184,4 +218,60 @@ TEST_CASE("DSL")
REQUIRE(getField(subtractEqnSys.explicitOperation()) == 2.0);
}
}
// profiling
// with different number of terms
BENCHMARK("Creation from 2 terms")
{
dsl::EqnSystem eqnSys(divTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1));

return eqnSys;
};

BENCHMARK("Creation from 4 terms")
{
dsl::EqnSystem eqnSys(
divTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
);

return eqnSys;
};

BENCHMARK("Creation from 8 terms")
{
dsl::EqnSystem eqnSys(
divTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
);

return eqnSys;
};

BENCHMARK("Creation from 16 terms")
{
dsl::EqnSystem eqnSys(
divTerm + Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
+ Laplacian(dsl::EqnTerm::Type::Explicit, exec, 1)
);

return eqnSys;
};
}

0 comments on commit d2109e7

Please sign in to comment.