22 #include <LbmLib/include/nodes/BoundaryNode.hpp>
23 #include <LbmLib/include/nodes/PhysicalNode.hpp>
24 #include <LbmLib/include/GlobalSimulationParameters.hpp>
25 #include <LbmLib/include/solver/BoundaryAbstractSolver.hpp>
26 #include <LbmLib/include/solver/CDESolver/CDESolverD2Q5HH.hpp>
27 #include <UtilLib/include/Exception.hpp>
28 #include <UtilLib/include/Log.hpp>
39 const double gamma = 800.0;
47 for (
auto d : cdeDirIter_) {
48 distributions_[d] = 0.0;
52 for (
auto d : cdeDirIter_) {
53 distributions_[d] = 0.2;
61 for (
auto d : distributions_) {
62 (*stream) <<
'\t' << d;
72 for (
auto d : cdeDirIter_) {
73 (*stream) >> distributions_[d];
78 assert(dir > T && dir < NE);
79 return distributions_[dir];
83 for (
auto &it: this->distributions_) {
89 return std::accumulate(distributions_.begin(), distributions_.end(), 0.0);
95 const double C =
getC();
101 const double w0 = C / 3.0;
102 const double w1 = C / 6.0;
103 const double tauI = 1.0 /
getTau();
108 temp[E] = w1 * (1.0 + ux * 3.0);
109 temp[N] = w1 * (1.0 + uy * 3.0);
110 temp[W] = w1 * (1.0 + (-ux) * 3.0);
111 temp[S] = w1 * (1.0 + (-uy) * 3.0);
113 const double Cu = 0.0;
116 const double HHdecay = 0.00001;
117 const double HHproduction = 0.0001;
119 double reaktionTermR;
123 reaktionTerm = deltaT * HHproduction / 3.0;
124 reaktionTermR = deltaT * HHproduction / 6.0;
127 reaktionTerm = deltaT*(-HHdecay*C) / 3.0;
128 reaktionTermR = deltaT*(-HHdecay*C) / 6.0;
131 distributions_[T] = distributions_[T] - distributions_[T] * tauI + temp[T] *
133 distributions_[E] = distributions_[E] - distributions_[E] * tauI + temp[E] *
134 tauI + reaktionTermR;
135 distributions_[N] = distributions_[N] - distributions_[N] * tauI + temp[N] *
136 tauI + reaktionTermR;
137 distributions_[W] = distributions_[W] - distributions_[W] * tauI + temp[W] *
138 tauI + reaktionTermR;
139 distributions_[S] = distributions_[S] - distributions_[S] * tauI + temp[S] *
140 tauI + reaktionTermR;
155 const double C =
getC();
160 const double w1 = C / 6.0;
167 return w1 * (1.0 + u * 3.0);
170 return w1 * (1.0 + v * 3.0);
173 return w1 * (1.0 + (-u) * 3.0);
176 return w1 * (1.0 + (-v) * 3.0);
181 "you want to get a inverse direction of a Direction that does not exist");
188 std::swap(distributions_[getInverseDirection(W)],
191 std::swap(distributions_[getInverseDirection(S)],
196 void CDESolverD2Q5HH::localSwap() {
197 std::swap(distributions_[E], distributions_[W]);
198 std::swap(distributions_[N], distributions_[S]);
208 std::array<Direction, 4> dir1 {{E, N, W, S}};
209 for (
auto d : dir1) {
221 std::array<Direction, 4> dir2 {{NE, NW, SW, SE}};
222 for (
auto d : dir2) {
233 std::stringstream message;
234 message << std::setprecision(12);
235 message <<
"Default initialisation on PhysicalNode ";
237 message <<
" failed. Therefore the node was reinitialised from the diagonal directions";
238 LOG(UtilLib::logINFO) << message.str().c_str();
245 std::stringstream message;
246 message << std::setprecision(12)
247 <<
"Initialization on PhysicalNode "
249 <<
" failed at time "
250 << Parameters.getCurrentIteration()
251 <<
". Therefore the node was initialized with all neighbors {E,N,W,S}, ignoring their domainID."
253 for (
auto d : dir1) {
259 LOG(UtilLib::logINFO) << message.str().c_str();
262 sumC /=
static_cast<double>(counter);
263 for (
auto d : cdeDirIter_) {
264 this->distributions_[d] = sumC / 5.0;
269 const std::string CDESolverD2Q5HH::name =
"CDESolverD2Q5HH";
276 distributions_(std::array<double,
virtual void writeSolver(std::ostream *const stream)
writes the solver to the stream
The Base class for all CDESolver implementations This classes uses the recursive template idiom to au...
virtual double & accessDistribution(const Direction &dir)
accessDistribution Access to the distribution
virtual void loadSolver(std::stringstream *const stream)
loads the solver from the stream
size_t solverID_
solverID_ The ID of the solver instance. Coincides with the index in the vector PhysicalNode::cdeSolv...
virtual void collide()
collide The collision step of the LBM
PhysicalNode * getPhysicalNeighbour(const Direction &d) const
getPhysicalNeighbour Getter method to access the Physical Neighbour
const nodes::PhysicalNode * physicalNode_
physicalNode_ The physical Node which owns this solver
The CDEDirectionsIteratorD2Q5 class Provides methods to handle the Directions. Use the Function Direc...
T x
x the value in x direction
virtual double & accessDistribution(const Direction &dir)=0
accessDistribution Access to the distribution
virtual void reinitialise()
reinitialise this solver as the corresponding physical node has switched domain
unsigned int getDomainIdentifier() const
getter for the Domain Identifier of this node
virtual void advect()
advect The advect step of the LBM
virtual void rescaleDistributions(const double factor)
Rescales all distributions by a factor.
virtual double getC() const =0
getC Calculates the concentration on this node
const Field< double > & getVelocity() const
getVelocity Returns the current velocity of the fluid
double getTau() const
getTau Getter method for the tau parameter
const solver::FluidSolver & getFluidSolver() const
getFluidSolver Const getter method for the fluid Solver
int getXPos() const
getXPos Getter for the X position
BoundaryNode * getBoundaryNeighbour(const Direction &d) const
getBoundaryNeighbour Getter method to access the Boundary Neighbour
virtual double calculateEquilibrium(const Direction &dir)
calculateEquilibrium calculates the equilibirum for direction dir
int getYPos() const
getYPos Getter for the Y position
virtual double getC() const
getC Calculates the concentration on this node
solver::CDEAbstractSolver & getCDESolver(size_t id) const
getCDESolver Getter method for the cde Solver
virtual void initSolver()
initSolver Use this to initalise the solver
T y
y the value in y direction