summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudius "keldu" Holeksa <mail@keldu.de>2025-06-25 15:01:48 +0200
committerClaudius "keldu" Holeksa <mail@keldu.de>2025-06-25 15:01:48 +0200
commit210b04098cfc12e0fdcff0578d39cc9ccafb3b37 (patch)
tree888a291cc8b37382f68ad147783a5202e94da203
parent3403b07823d9f1ade288ff8c6a6774c81c63c262 (diff)
Debugging commit
-rw-r--r--c++/boundary.hpp30
-rw-r--r--c++/collision.hpp2
-rw-r--r--c++/descriptor.hpp4
-rw-r--r--examples/cavity_2d.cpp74
4 files changed, 43 insertions, 67 deletions
diff --git a/c++/boundary.hpp b/c++/boundary.hpp
index 77542c5..e52715e 100644
--- a/c++/boundary.hpp
+++ b/c++/boundary.hpp
@@ -9,14 +9,14 @@ namespace cmpt {
struct BounceBack {};
}
+/**
+ * Full-Way BounceBack.
+ */
template<typename T, typename Descriptor>
class component<T, Descriptor, cmpt::BounceBack> {
private:
- typename saw::native_data_type<T>::type relaxation_;
public:
- component(typename saw::native_data_type<T>::type relaxation__):
- relaxation_{relaxation__}
- {}
+ component() = default;
using Component = cmpt::BounceBack;
@@ -30,7 +30,7 @@ public:
/**
* Thoughts regarding automating order setup
*/
- static constexpr saw::string_literal name = "collision";
+ static constexpr saw::string_literal name = "full_way_bounce_back";
static constexpr saw::string_literal after = "";
static constexpr saw::string_literal before = "streaming";
@@ -38,20 +38,22 @@ public:
* Raw setup
*/
template<typename CellFieldSchema>
- void apply(saw::data<CellFieldSchema>& field, saw::data<sch::FixedArray<sch::UInt64,Descriptor::D>> index, uint64_t time_step){
- bool is_even = ((time_step % 2) == 0);
- auto& cell = field.at(index);
+ void apply(saw::data<CellFieldSchema>& field, const saw::data<sch::FixedArray<sch::UInt64,Descriptor::D>>& index, uint64_t time_step){
+ bool is_even = ((time_step % 2u) == 0u);
- auto& dfs_old = is_even ? cell.template get<"dfs_old">() : cell.template get<"dfs">();
- auto& dfs = (!is_even) ? cell.template get<"dfs_old">() : cell.template get<"dfs">();
+ // This is a ref
+ auto& cell = field(index);
- using dfi = df_info<sch::T,Desc>;
+ auto& dfs_old = (is_even) ? cell.template get<"dfs_old">() : cell.template get<"dfs">();
+ auto& dfs = (not is_even) ? cell.template get<"dfs_old">() : cell.template get<"dfs">();
+
+ using dfi = df_info<T,Descriptor>;
// Technically use .copy()
- auto df_cpy = dfs;
+ auto df_cpy = dfs_old;
- for(uint64_t i = 1u; i < Desc::Q; ++i){
- dfs({i}) = df_cpy({dfi::opposite_index.at(i)});
+ for(uint64_t i = 1u; i < Descriptor::Q; ++i){
+ dfs_old({i}) = df_cpy({dfi::opposite_index.at(i)});
}
}
};
diff --git a/c++/collision.hpp b/c++/collision.hpp
index 128a499..451e4bb 100644
--- a/c++/collision.hpp
+++ b/c++/collision.hpp
@@ -51,7 +51,7 @@ public:
auto eq = equilibrium<T,Descriptor>(rho,vel);
for(uint64_t i = 0u; i < Descriptor::Q; ++i){
- dfs({i}).set(dfs({i}).get() + (1.0 / relaxation_) * (eq.at(i).get() - dfs({i}).get()));
+ dfs_old({i}).set(dfs_old({i}).get() + (1.0 / relaxation_) * (eq.at(i).get() - dfs_old({i}).get()));
}
}
diff --git a/c++/descriptor.hpp b/c++/descriptor.hpp
index b1ee5b1..23c82f2 100644
--- a/c++/descriptor.hpp
+++ b/c++/descriptor.hpp
@@ -205,6 +205,10 @@ public:
const data<Sch, Encode>& operator()(const data<schema::UInt64>& index)const{
return inner_.at(index);
}
+
+ const data<kel::lbm::sch::Cell<Sch, Desc, S, D, Q>, Encode> copy() const {
+ return *this;
+ }
};
template<typename Desc, typename CellT, typename Encode>
diff --git a/examples/cavity_2d.cpp b/examples/cavity_2d.cpp
index c409165..e2b28c9 100644
--- a/examples/cavity_2d.cpp
+++ b/examples/cavity_2d.cpp
@@ -3,9 +3,8 @@
#include "../c++/lbm.hpp"
#include "../c++/component.hpp"
#include "../c++/collision.hpp"
+#include "../c++/boundary.hpp"
-/**
- */
#include <forstio/codec/data.hpp>
#include <iostream>
@@ -27,14 +26,14 @@ using namespace saw::schema;
* Q factor
*/
using T = Float32;
-using D2Q5 = Descriptor<2,5>;
-using D2Q9 = Descriptor<2,9>;
+using D2Q5 = Descriptor<2u,5u>;
+using D2Q9 = Descriptor<2u,9u>;
template<typename Desc>
-using DfCell = Cell<T, Desc, 0, 0, 1>;
+using DfCell = Cell<T, Desc, 0u, 0u, 1u>;
template<typename Desc>
-using CellInfo = Cell<UInt8, D2Q9, 1, 0, 0>;
+using CellInfo = Cell<UInt8, D2Q9, 1u, 0u, 0u>;
/**
* Basic type for simulation
@@ -67,13 +66,13 @@ std::array<typename saw::native_data_type<sch::T>::type,Desc::Q> equilibrium(
typename std::array<saw::native_data_type<sch::T>::type,Desc::Q> eq;
- for(std::size_t i = 0; i < eq.size(); ++i){
- auto vel_c = (vel[0]*dfi::directions[i][0] + vel[1]*dfi::directions[i][1]);
+ for(std::size_t i = 0u; i < eq.size(); ++i){
+ auto vel_c = (vel[0u]*dfi::directions[i][0u] + vel[1u]*dfi::directions[i][1u]);
auto vel_c_cs2 = vel_c * dfi::inv_cs2;
eq[i] = dfi::weights[i] * rho * (
1.0
+ vel_c_cs2
- - dfi::inv_cs2 * 0.5 * ( vel[0] * vel[0] + vel[1] * vel[1] )
+ - dfi::inv_cs2 * 0.5 * ( vel[0u] * vel[0u] + vel[1u] * vel[1u] )
+ vel_c_cs2 * vel_c_cs2 * 0.5
);
}
@@ -105,30 +104,9 @@ public:
};
*/
namespace cmpt {
-struct BounceBack{};
struct MovingWall {};
}
-
-/**
- * Full-Way BounceBack. I suspect that the moving wall requires half-way bounce back.
- */
-template<typename Desc>
-class component<sch::T, Desc, cmpt::BounceBack> {
-public:
-
- void apply(saw::data<sch::DfCell<Desc>>& dfs){
- using dfi = df_info<sch::T,Desc>;
-
- // Technically use .copy()
- auto df_cpy = dfs;
-
- for(uint64_t i = 1u; i < Desc::Q; ++i){
- dfs({i}) = df_cpy({dfi::opposite_index.at(i)});
- }
- }
-};
-
/**
* Full-Way moving wall Bounce back, something is not right here.
* Technically it should reflect properly.
@@ -247,41 +225,33 @@ void lbm_step(
* 1. Relaxation parameter \tau
*/
component<sch::T, sch::D2Q9, cmpt::BGK> coll{0.5384};
-
component<sch::T, sch::D2Q9, cmpt::BounceBack> bb;
+
component<sch::T, sch::D2Q9, cmpt::MovingWall> bb_lid;
bb_lid.lid_vel = {0.1,0.0};
- auto dim = latt.meta();
+ auto meta = latt.meta();
- for(saw::data<sch::UInt64> i{0u}; i < dim.at(0u); ++i){
- for(saw::data<sch::UInt64> j{0u}; j < dim.at(1u); ++j ){
+ // Collide
+ for(saw::data<sch::UInt64> i{0u}; i < meta.at(0u); ++i){
+ for(saw::data<sch::UInt64> j{0u}; j < meta.at(1u); ++j ){
auto& cell = latt({{i,j}});
auto& info = cell.template get<"info">();
switch(info({0u}).get()){
case 1u: {
- coll.apply(latt, {{i,j}}, time_step+1u);
- } break;
+ coll.apply(latt, {{i,j}}, time_step);
+ }; break;
+ case 2u: {
+ auto& df = even_step ? cell.template get<"dfs_old">() : cell.template get<"dfs">();
+ bb_lid.apply(df);
+ }; break;
+ case 3u: {
+ bb.apply(latt, {{i,j}}, time_step);
+ }; break;
}
}
}
- // Collide
- apply_for_cells([&](auto& cell, std::size_t i, std::size_t j){
- auto& df = even_step ? cell.template get<"dfs_old">() : cell.template get<"dfs">();
- auto& info = cell.template get<"info">();
-
- auto info_val = info({0u}).get();
- switch(info_val){
- case 2u:
- // bb.apply(df);
- bb_lid.apply(df);
- break;
- case 3u:
- bb.apply(df);
- break;
- }
- }, latt);
// Stream
for(uint64_t i = 1; (i+1) < latt.template get_dim_size<0>().get(); ++i){