summaryrefslogtreecommitdiff
path: root/modules/core/c++/macroscopic.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/core/c++/macroscopic.hpp')
-rw-r--r--modules/core/c++/macroscopic.hpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/modules/core/c++/macroscopic.hpp b/modules/core/c++/macroscopic.hpp
new file mode 100644
index 0000000..19ab3e9
--- /dev/null
+++ b/modules/core/c++/macroscopic.hpp
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "descriptor.hpp"
+
+namespace kel {
+namespace lbm {
+/**
+ * Calculate the macroscopic variables rho and u in Lattice Units.
+ */
+template<typename T, typename Desc>
+void compute_rho_u (
+ const saw::data<sch::FixedArray<T,Desc::Q>>& dfs,
+ saw::ref<saw::data<sch::Scalar<T>>> rho,
+ saw::ref<saw::data<sch::Vector<T,Desc::D>>> vel
+ )
+{
+ using dfi = df_info<T, Desc>;
+
+ rho().at({}).set(0);
+ for(uint64_t i = 0; i < Desc::D; ++i){
+ vel().at({{i}}).set(0);
+ }
+
+ for(size_t j = 0; j < Desc::Q; ++j){
+ rho().at({}) = rho().at({}) + dfs.at({j});
+ for(size_t i = 0; i < Desc::D; ++i){
+ vel().at({{i}}) = vel().at({{i}}) + saw::data<T>{static_cast<typename saw::native_data_type<T>::type>(dfi::directions[j][i])} * dfs.at({j});
+ }
+ }
+
+ for(size_t i = 0; i < Desc::D; ++i){
+ vel().at({{i}}) = vel().at({{i}}) / rho().at({});
+ }
+}
+}
+}