4#ifndef _MOLECULARDYNAMICS_COUPLING_SOLVERS_LBCOUETTESOLVER_H_
5#define _MOLECULARDYNAMICS_COUPLING_SOLVERS_LBCOUETTESOLVER_H_
17#include "coupling/interface/PintableMacroSolver.h"
18#include "coupling/solvers/NumericalSolver.h"
23 LBCouetteSolverState(
int size) : _pdf(size, 0) {}
25 LBCouetteSolverState(
int size,
double* pdf) : LBCouetteSolverState(size) { std::copy(pdf, pdf + size, _pdf.data()); }
27 std::unique_ptr<State> clone()
const override {
return std::make_unique<LBCouetteSolverState>(*
this); }
29 ~LBCouetteSolverState() {}
31 int getSizeBytes()
const override {
return sizeof(double) * _pdf.size(); }
33 std::unique_ptr<State>
operator+(
const State& rhs)
override;
34 std::unique_ptr<State>
operator-(
const State& rhs)
override;
37 const LBCouetteSolverState* other =
dynamic_cast<const LBCouetteSolverState*
>(&rhs);
40 return _pdf == other->_pdf;
43 double*
getData()
override {
return _pdf.data(); }
44 const double*
getData()
const override {
return _pdf.data(); }
46 void print(std::ostream& os)
const override { os <<
"<LBCouetteSolverState instance with size " <<
getSizeBytes() <<
">"; }
49 std::vector<double> _pdf;
74 const unsigned int numThreads = 1,
const Scenario* scen =
nullptr)
75 :
coupling::
solvers::
NumericalSolver(channelheight, dx, dt, kinVisc, plotEveryTimestep, filestem, processes, scen), _mode(Mode::
coupling), _dt_pint(dt),
76 _omega(1.0 / (3.0 * (kinVisc * dt / (dx * dx)) + 0.5)),
_wallVelocity((dt / dx) * wallVelocity) {
82 _pdf1 =
new double[_pdfsize];
83 _pdf2 =
new double[_pdfsize];
85 omp_set_num_threads(numThreads);
87#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
89 std::cout <<
"tau=" << 1.0 /
_omega << std::endl;
94 std::cout << x <<
"," << y <<
"," << z <<
"FLAG=" <<
_flag[
get(x, y, z)] << std::endl;
101 std::cout <<
"ERROR LBCouetteSolver: NULL ptr!" << std::endl;
104#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
107 std::cout <<
"ERROR LBCouetteSolver: NULL ptr in send/recv!" << std::endl;
112#pragma omp parallel for
114 for (
int q = 0; q < 19; q++) {
119 computeDensityAndVelocityEverywhere();
144#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
178 const int timesteps = floor(dt /
_dt + 0.5);
179 if (fabs(timesteps *
_dt - dt) /
_dt > 1.0e-8) {
180 std::cout <<
"ERROR LBCouetteSolver::advance(): time steps and dt do not match!" << std::endl;
183 for (
int i = 0; i < timesteps; i++) {
185 computeDensityAndVelocityEverywhere();
201#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
202 if (_mode == Mode::supervising) {
203 std::cout <<
"ERROR LBCouetteSolver setMDBoundaryValues() called in supervising mode" << std::endl;
209 for (
auto pair : md2macroBuffer) {
212 std::tie(couplingCell, idx) = pair;
218#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
219 std::cout <<
"Process coords: " <<
_coords <<
": GlobalCellCoords for index " << idx <<
": " << globalCellCoords << std::endl;
221 const int index =
get(globalCellCoords[0], globalCellCoords[1], globalCellCoords[2]);
222#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
224 std::cout <<
"ERROR LBCouetteSolver::setMDBoundaryValues(): Cell " << index <<
" is no MD boundary cell!" << std::endl;
234 for (
unsigned int d = 0; d < 3; d++) {
235 _vel[3 * index + d] = localVel[d];
239 for (
unsigned int q = 0; q < 19; q++) {
241 if (((
int)globalCellCoords[0] +
_C[q][0] > 0) && ((
int)globalCellCoords[0] +
_C[q][0] <
_domainSizeX + 1) &&
242 ((
int)globalCellCoords[1] +
_C[q][1] > 0) && ((
int)globalCellCoords[1] +
_C[q][1] <
_domainSizeY + 1) &&
243 ((
int)globalCellCoords[2] +
_C[q][2] > 0) && ((
int)globalCellCoords[2] +
_C[q][2] <
_domainSizeZ + 1)) {
244 const int nbIndex =
get((
_C[q][0] + globalCellCoords[0]), (
_C[q][1] + globalCellCoords[1]), (
_C[q][2] + globalCellCoords[2]));
246 0.5 * (
_vel[3 * index + 2] +
_vel[3 * nbIndex + 2]));
247 _pdf1[19 * index + q] =
248 _pdf1[19 * nbIndex + 18 - q] -
249 6.0 *
_W[q] *
_density[nbIndex] * (
_C[18 - q][0] * interpolVel[0] +
_C[18 - q][1] * interpolVel[1] +
_C[18 - q][2] * interpolVel[2]);
263 if ((pos[0] < domainOffset[0]) || (pos[0] > domainOffset[0] +
_domainSizeX *
_dx) || (pos[1] < domainOffset[1]) ||
265 std::cout <<
"ERROR LBCouetteSolver::getVelocity(): Position " << pos <<
" out of range!" << std::endl;
266 std::cout <<
"domainOffset = " << domainOffset << std::endl;
267 std::cout <<
"_domainSizeX = " <<
_domainSizeX << std::endl;
268 std::cout <<
"_domainSizeY = " <<
_domainSizeY << std::endl;
269 std::cout <<
"_domainSizeZ = " <<
_domainSizeZ << std::endl;
270 std::cout <<
"_dx = " <<
_dx << std::endl;
275 for (
unsigned int d = 0; d < 3; d++) {
276 coords[d] = (
unsigned int)((
_dx + pos[d] - domainOffset[d]) /
_dx);
278 const int index =
get(coords[0], coords[1], coords[2]);
281 for (
int d = 0; d < 3; d++) {
284#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
285 std::cout <<
"Position " << pos <<
" corresponds to cell: " << coords <<
"; vel=" << vel << std::endl;
298 if ((pos[0] < domainOffset[0]) || (pos[0] > domainOffset[0] +
_domainSizeX *
_dx) || (pos[1] < domainOffset[1]) ||
300 std::cout <<
"ERROR LBCouetteSolver::getDensity(): Position " << pos <<
" out of range!" << std::endl;
305 for (
unsigned int d = 0; d < 3; d++) {
306 coords[d] = (
unsigned int)((
_dx + pos[d] - domainOffset[d]) /
_dx);
308 const int index =
get(coords[0], coords[1], coords[2]);
321 computeDensityAndVelocityEverywhere();
322 return std::make_unique<LBCouetteSolverState>(_pdfsize,
_pdf1);
325 void setState(
const std::unique_ptr<State>& input,
int cycle)
override {
328#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
329 if (state ==
nullptr) {
330 std::cout <<
"ERROR LBCouetteSolver setState() wrong state type" << std::endl;
336 computeDensityAndVelocityEverywhere();
341 std::unique_ptr<State>
operator()(
const std::unique_ptr<State>& input,
int cycle)
override {
344#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
345 if (_mode != Mode::supervising) {
346 std::cout <<
"ERROR LBCouetteSolver operator() called but not in supervising mode" << std::endl;
355 Mode
getMode()
const override {
return _mode; }
363 std::unique_ptr<PintableMacroSolver>
getSupervisor(
int num_cycles,
double visc_multiplier)
const override {
364#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
365 if (_mode == Mode::supervising) {
366 std::cout <<
"ERROR LBCouetteSolver getSupervisor(): already in supervising mode" << std::endl;
373 numThreads = omp_get_num_threads();
379 res->_mode = Mode::supervising;
380 res->_dt_pint =
_dt * num_cycles;
385 void print(std::ostream& os)
const override {
386 if (_mode == Mode::supervising)
387 os <<
"<LBCouetteSolver instance in supervising mode >";
388 if (_mode == Mode::coupling)
389 os <<
"<LBCouetteSolver instance in coupling mode >";
392 double get_avg_vel(
const std::unique_ptr<State>& state)
const override {
395 double res[3]{0, 0, 0};
396 for (
int i = 0; i < _pdfsize; i += 19) {
403 res[0] /= (_pdfsize / 19);
404 res[1] /= (_pdfsize / 19);
405 res[2] /= (_pdfsize / 19);
407 return std::sqrt(res[0] * res[0] + res[1] * res[1] + res[2] * res[2]);
414 void computeDensityAndVelocityEverywhere() {
420 const int index =
get(x, y, z);
421 const int pI = 19 * index;
422 double* vel = &
_vel[3 * index];
436#pragma omp parallel for
440 const int index =
get(x, y, z);
449 double* swap =
_pdf1;
456 const int pI = 19 * index;
457 for (
int q = 0; q < 9; q++) {
458 const int nb = 19 * (
_C[q][0] +
_C[q][1] *
_xO +
_C[q][2] *
_yO);
466 void collide(
int index,
int x,
int y,
int z) {
468 const int pI = 19 * index;
470 double* vel = &
_vel[3 * index];
473 const double u2 = 1.0 - 1.5 * (vel[0] * vel[0] + vel[1] * vel[1] + vel[2] * vel[2]);
475 double cu = -vel[1] - vel[2];
477 double feq =
_W[0] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
484 cu = -vel[0] - vel[2];
486 feq =
_W[1] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
495 feq =
_W[2] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
502 cu = vel[0] - vel[2];
504 feq =
_W[3] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
511 cu = vel[1] - vel[2];
513 feq =
_W[4] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
520 cu = -vel[0] - vel[1];
522 feq =
_W[5] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
531 feq =
_W[6] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
538 cu = vel[0] - vel[1];
540 feq =
_W[7] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
549 feq =
_W[8] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
568 void boundary(
double*
const pdf,
int index,
int x,
int y,
int z,
int q,
const Flag& flag,
int nbIndex) {
572 pdf[nbIndex + 18 - q] = pdf[index + q];
576 pdf[nbIndex + 18 - q] =
580 int target[3] = {x, y, z};
581 if (target[0] +
_C[q][0] == 0) {
586 if (target[1] +
_C[q][1] == 0) {
591 if (target[2] +
_C[q][2] == 0) {
597 pdf[19 * periodicNb + q] = pdf[index + q];
607 vel[0] = -(pdf[1] + pdf[5] + pdf[8] + pdf[11] + pdf[15]);
608 density = pdf[3] + pdf[7] + pdf[10] + pdf[13] + pdf[17];
609 vel[1] = (pdf[4] + pdf[11] + pdf[12] + pdf[13] + pdf[18]) - (pdf[0] + pdf[5] + pdf[6] + pdf[7] + pdf[14]);
610 vel[0] = density + vel[0];
611 density = density + pdf[0] + pdf[1] + pdf[2] + pdf[4] + pdf[5] + pdf[6] + pdf[8] + pdf[9] + pdf[11] + pdf[12] + pdf[14] + pdf[15] + pdf[16] + pdf[18];
612 vel[2] = (pdf[14] + pdf[15] + pdf[16] + pdf[17] + pdf[18]) - (pdf[0] + pdf[1] + pdf[2] + pdf[3] + pdf[4]);
613 vel[0] = vel[0] / density;
614 vel[1] = vel[1] / density;
615 vel[2] = vel[2] / density;
634#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
636 const int directions[6][5] = {{1, 5, 8, 11, 15}, {3, 7, 10, 13, 17}, {4, 11, 12, 13, 18}, {0, 5, 6, 7, 14}, {0, 1, 2, 3, 4}, {14, 15, 16, 17, 18}};
637 MPI_Request requests[2];
638 MPI_Status status[2];
642 if (nbFlagTo ==
LEFT || nbFlagTo ==
RIGHT) {
647 }
else if (nbFlagTo ==
FRONT || nbFlagTo ==
BACK) {
652 }
else if (nbFlagTo ==
TOP || nbFlagTo ==
BOTTOM) {
658 std::cout <<
"ERROR LBCouetteSolver::communicatePart: d >2 or d < 0!" << std::endl;
663 for (coords[2] = startSend[2]; coords[2] < endSend[2]; coords[2]++) {
664 for (coords[1] = startSend[1]; coords[1] < endSend[1]; coords[1]++) {
665 for (coords[0] = startSend[0]; coords[0] < endSend[0]; coords[0]++) {
666 for (
int q = 0; q < 5; q++) {
667 sendBuffer[q + 5 *
getParBuf(coords[plane[0]], coords[plane[1]], domainSize[0], domainSize[1])] =
668 pdf[directions[nbFlagTo][q] + 19 *
get(coords[0], coords[1], coords[2])];
674 MPI_Irecv(recvBuffer, (domainSize[0] + 2) * (domainSize[1] + 2) * 5, MPI_DOUBLE,
_parallelNeighbours[nbFlagFrom], 1000,
675 coupling::indexing::IndexingService<3>::getInstance().getComm(), &requests[0]);
676 MPI_Isend(sendBuffer, (domainSize[0] + 2) * (domainSize[1] + 2) * 5, MPI_DOUBLE,
_parallelNeighbours[nbFlagTo], 1000,
677 coupling::indexing::IndexingService<3>::getInstance().getComm(), &requests[1]);
678 MPI_Waitall(2, requests, status);
681 for (coords[2] = startRecv[2]; coords[2] < endRecv[2]; coords[2]++) {
682 for (coords[1] = startRecv[1]; coords[1] < endRecv[1]; coords[1]++) {
683 for (coords[0] = startRecv[0]; coords[0] < endRecv[0]; coords[0]++) {
684 for (
int q = 0; q < 5; q++) {
686 pdf[directions[nbFlagTo][q] + 19 *
get(coords[0], coords[1], coords[2])] =
687 recvBuffer[q + 5 *
getParBuf(coords[plane[0]], coords[plane[1]], domainSize[0], domainSize[1])];
700#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
738 const int _C[19][3]{{0, -1, -1}, {-1, 0, -1}, {0, 0, -1}, {1, 0, -1}, {0, 1, -1}, {-1, -1, 0}, {0, -1, 0}, {1, -1, 0}, {-1, 0, 0}, {0, 0, 0},
739 {1, 0, 0}, {-1, 1, 0}, {0, 1, 0}, {1, 1, 0}, {0, -1, 1}, {-1, 0, 1}, {0, 0, 1}, {1, 0, 1}, {0, 1, 1}};
741 const double _W[19]{1.0 / 36.0, 1.0 / 36.0, 1.0 / 18.0, 1.0 / 36.0, 1.0 / 36.0, 1.0 / 36.0, 1.0 / 18.0, 1.0 / 36.0, 1.0 / 18.0, 1.0 / 3.0,
742 1.0 / 18.0, 1.0 / 36.0, 1.0 / 18.0, 1.0 / 36.0, 1.0 / 36.0, 1.0 / 36.0, 1.0 / 18.0, 1.0 / 36.0, 1.0 / 36.0};
defines the cell type with cell-averaged quantities only (no linked cells).
Definition CouplingCell.h:29
const tarch::la::Vector< dim, double > & getMacroscopicMomentum() const
Definition CouplingCell.h:64
const double & getMacroscopicMass() const
Definition CouplingCell.h:58
provides access to coupling cells, which may belong to different indexing domains
Definition FlexibleCellContainer.h:30
value_T get() const
Definition CellIndex.h:138
Definition PintableMacroSolver.h:67
Definition PintableMacroSolver.h:30
Definition LBCouetteSolver.h:21
int getSizeBytes() const override
Definition LBCouetteSolver.h:31
std::unique_ptr< State > operator+(const State &rhs) override
const double * getData() const override
Definition LBCouetteSolver.h:44
void print(std::ostream &os) const override
Definition LBCouetteSolver.h:46
std::unique_ptr< State > operator-(const State &rhs) override
bool operator==(const State &rhs) const override
Definition LBCouetteSolver.h:36
double * getData() override
Definition LBCouetteSolver.h:43
implements a three-dimensional Lattice-Boltzmann Couette flow solver.
Definition LBCouetteSolver.h:56
static void computeDensityAndVelocity(double *const vel, double &density, const double *const pdf)
refers to the LB method; computes density and velocity on pdf
Definition LBCouetteSolver.h:606
std::unique_ptr< State > operator()(const std::unique_ptr< State > &input, int cycle) override
Definition LBCouetteSolver.h:341
std::unique_ptr< PintableMacroSolver > getSupervisor(int num_cycles, double visc_multiplier) const override
Definition LBCouetteSolver.h:363
void communicatePart(double *pdf, double *sendBuffer, double *recvBuffer, NbFlag nbFlagTo, NbFlag nbFlagFrom, tarch::la::Vector< 3, int > startSend, tarch::la::Vector< 3, int > endSend, tarch::la::Vector< 3, int > startRecv, tarch::la::Vector< 3, int > endRecv)
Definition LBCouetteSolver.h:632
std::unique_ptr< State > getState() override
Definition LBCouetteSolver.h:320
double get_avg_vel(const std::unique_ptr< State > &state) const override
Definition LBCouetteSolver.h:392
const double _omega
relaxation frequency
Definition LBCouetteSolver.h:729
const int _C[19][3]
lattice velocities
Definition LBCouetteSolver.h:738
void setMDBoundaryValues(coupling::datastructures::FlexibleCellContainer< 3 > &md2macroBuffer) override
applies the values received from the MD-solver within the conntinuum solver
Definition LBCouetteSolver.h:197
double * _pdf1
partical distribution function field
Definition LBCouetteSolver.h:734
void collide(int index, int x, int y, int z)
Definition LBCouetteSolver.h:466
void boundary(double *const pdf, int index, int x, int y, int z, int q, const Flag &flag, int nbIndex)
takes care of the correct boundary treatment for the LB method
Definition LBCouetteSolver.h:568
Mode getMode() const override
Definition LBCouetteSolver.h:355
const double _W[19]
lattice weights
Definition LBCouetteSolver.h:741
void communicate()
comunicates the boundary field data between the different processes
Definition LBCouetteSolver.h:699
tarch::la::Vector< 3, double > getVelocity(tarch::la::Vector< 3, double > pos) const override
returns velocity at a certain position
Definition LBCouetteSolver.h:258
void advance(double dt) override
advances one time step dt in time and triggers vtk plot if required
Definition LBCouetteSolver.h:174
virtual ~LBCouetteSolver()
a simple destructor
Definition LBCouetteSolver.h:123
virtual void setWallVelocity(const tarch::la::Vector< 3, double > wallVelocity) override
changes the velocity at the moving wall (z=0)
Definition LBCouetteSolver.h:314
tarch::la::Vector< 3, double > _wallVelocity
velocity of moving wall of Couette flow
Definition LBCouetteSolver.h:731
void collidestream()
collide-stream algorithm for the Lattice-Boltzmann method
Definition LBCouetteSolver.h:435
void setState(const std::unique_ptr< State > &input, int cycle) override
Definition LBCouetteSolver.h:325
void print(std::ostream &os) const override
Definition LBCouetteSolver.h:385
double * _pdf2
partial distribution function field (stores the old time step)
Definition LBCouetteSolver.h:736
void stream(int index)
the stream part of the LB algorithm (from pdf1 to pdf2)
Definition LBCouetteSolver.h:455
LBCouetteSolver(const double channelheight, tarch::la::Vector< 3, double > wallVelocity, const double kinVisc, const double dx, const double dt, const int plotEveryTimestep, const std::string filestem, const tarch::la::Vector< 3, unsigned int > processes, const unsigned int numThreads=1, const Scenario *scen=nullptr)
a simple constructor
Definition LBCouetteSolver.h:72
double getDensity(tarch::la::Vector< 3, double > pos) const override
returns density at a certain position
Definition LBCouetteSolver.h:293
is a virtual base class for the interface for a numerical fluid solver for the Couette scenario
Definition NumericalSolver.h:33
const int _domainSizeX
domain size in x-direction
Definition NumericalSolver.h:554
double * _recvBufferY
buffer to receive data from from front/back neighbour
Definition NumericalSolver.h:584
double * _sendBufferX
buffer to send data from left/right to right/left neighbour
Definition NumericalSolver.h:578
const double _channelheight
the height and width of the channel in z and y direction
Definition NumericalSolver.h:539
const double _kinVisc
kinematic viscosity of the fluid
Definition NumericalSolver.h:545
int _counter
time step counter
Definition NumericalSolver.h:569
int get(int i) const
returns i and performs checks in debug mode
Definition NumericalSolver.h:360
const int _yO
offset for z-direction
Definition NumericalSolver.h:593
double * _recvBufferZ
buffer to receive data from from top/buttom neighbour
Definition NumericalSolver.h:588
const int _avgDomainSizeZ
avg. domain size in MPI-parallel simulation in z-direction
Definition NumericalSolver.h:564
int getParBuf(int x, int y, int lengthx, int lengthy) const
returns index in 2D parallel buffer with buffer dimensions lengthx+2,lengthy+2. Performs checks in de...
Definition NumericalSolver.h:409
double * _sendBufferY
buffer to send data from front/back to front/back neighbour
Definition NumericalSolver.h:582
const int _xO
offset for y-direction (lexicographic grid ordering)
Definition NumericalSolver.h:591
double * _sendBufferZ
buffer to send data from top/buttom to top/buttom neighbour
Definition NumericalSolver.h:586
NumericalSolver(const double channelheight, const double dx, const double dt, const double kinVisc, const int plotEveryTimestep, const std::string filestem, const tarch::la::Vector< 3, unsigned int > processes, const Scenario *scen=nullptr)
a simple constructor
Definition NumericalSolver.h:46
Flag * _flag
flag field
Definition NumericalSolver.h:575
const int _avgDomainSizeY
avg. domain size in MPI-parallel simulation in y-direction
Definition NumericalSolver.h:562
const tarch::la::Vector< 3, unsigned int > _coords
coordinates of this process (=1,1,1, unless parallel run of the solver )
Definition NumericalSolver.h:567
const int _domainSizeY
domain size in y-direction
Definition NumericalSolver.h:556
const double _dt
time step
Definition NumericalSolver.h:543
tarch::la::Vector< 3, unsigned int > _processes
domain decomposition on MPI rank basis; total number is given by multipling all entries
Definition NumericalSolver.h:548
double * _density
density field
Definition NumericalSolver.h:573
tarch::la::Vector< 6, int > _parallelNeighbours
neighbour ranks
Definition NumericalSolver.h:595
const std::string _filestem
file stem for vtk plot
Definition NumericalSolver.h:552
NbFlag
The flags are used on parallel boundaries to define in which direction the boundary goes.
Definition NumericalSolver.h:530
@ LEFT
a parallel boundary to the left
Definition NumericalSolver.h:531
@ RIGHT
a parallel boundary to the right
Definition NumericalSolver.h:532
@ BOTTOM
a parallel boundary to the bottom
Definition NumericalSolver.h:535
@ FRONT
a parallel boundary to the front
Definition NumericalSolver.h:534
@ TOP
a parallel boundary to the top
Definition NumericalSolver.h:536
@ BACK
a parallel boundary to the back
Definition NumericalSolver.h:533
Flag
for every cell exists a flag entry, upon this is defined how the cell is handled
Definition NumericalSolver.h:519
@ MD_BOUNDARY
a cell on the boundary to md
Definition NumericalSolver.h:524
@ PERIODIC
a cell on a periodic boundary
Definition NumericalSolver.h:523
@ PARALLEL_BOUNDARY
a cell on a inner boundary of a splitted domain in a parallel run
Definition NumericalSolver.h:525
@ NO_SLIP
a cell on the no slip (non-moving) wall
Definition NumericalSolver.h:521
@ FLUID
a normal fluid cell
Definition NumericalSolver.h:520
@ MOVING_WALL
a cell on the moving wall
Definition NumericalSolver.h:522
const int _plotEveryTimestep
number of time steps between vtk plots
Definition NumericalSolver.h:550
double * _vel
velocity field
Definition NumericalSolver.h:571
const int _avgDomainSizeX
avg. domain size in MPI-parallel simulation in x-direction
Definition NumericalSolver.h:560
bool skipRank() const
returns true, if this rank is not of relevance for the LB simulation
Definition NumericalSolver.h:509
double * _recvBufferX
buffer to receive data from from left/right neighbour
Definition NumericalSolver.h:580
tarch::la::Vector< 3, int > _offset
offset of the md domain
Definition NumericalSolver.h:597
const double _dx
mesh size, dx=dy=dz
Definition NumericalSolver.h:541
const int _domainSizeZ
domain size in z-direction
Definition NumericalSolver.h:558
all numerical solvers are defined in the namespace, and their interfaces
Definition CouetteSolver.h:14
everything necessary for coupling operations, is defined in here
Definition AdditiveMomentumInsertion.h:15