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;
75 const unsigned int numThreads = 1,
const Scenario* scen =
nullptr)
76 :
coupling::
solvers::
NumericalSolver(channelheight, dx, dt, kinVisc, plotEveryTimestep, filestem, processes, scen), _mode(Mode::
coupling), _dt_pint(dt),
83 _pdf1 =
new double[_pdfsize];
84 _pdf2 =
new double[_pdfsize];
86 omp_set_num_threads(numThreads);
88#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
90 std::cout <<
"tau=" << 1.0 /
_omega << std::endl;
95 std::cout << x <<
"," << y <<
"," << z <<
"FLAG=" <<
_flag[
get(x, y, z)] << std::endl;
102 std::cout <<
"ERROR LBCouetteSolver: NULL ptr!" << std::endl;
105#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
108 std::cout <<
"ERROR LBCouetteSolver: NULL ptr in send/recv!" << std::endl;
113#pragma omp parallel for
115 for (
int q = 0; q < 19; q++) {
120 computeDensityAndVelocityEverywhere();
145#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
179 const int timesteps = floor(dt /
_dt + 0.5);
180 if (fabs(timesteps *
_dt - dt) /
_dt > 1.0e-8) {
181 std::cout <<
"ERROR LBCouetteSolver::advance(): time steps and dt do not match!" << std::endl;
184 for (
int i = 0; i < timesteps; i++) {
186 computeDensityAndVelocityEverywhere();
203#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
204 if (_mode == Mode::supervising) {
205 std::cout <<
"ERROR LBCouetteSolver setMDBoundaryValues() called in supervising mode" << std::endl;
211 for (
auto pair : md2macroBuffer) {
214 std::tie(couplingCell, idx) = pair;
220#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
221 std::cout <<
"Process coords: " <<
_coords <<
": GlobalCellCoords for index " << idx <<
": " << globalCellCoords << std::endl;
223 const int index =
get(globalCellCoords[0], globalCellCoords[1], globalCellCoords[2]);
224#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
226 std::cout <<
"ERROR LBCouetteSolver::setMDBoundaryValues(): Cell " << index <<
" is no MD boundary cell!" << std::endl;
236 for (
unsigned int d = 0; d < 3; d++) {
237 _vel[3 * index + d] = localVel[d];
241 for (
unsigned int q = 0; q < 19; q++) {
243 if (((
int)globalCellCoords[0] +
_C[q][0] > 0) && ((
int)globalCellCoords[0] +
_C[q][0] <
_domainSizeX + 1) &&
244 ((
int)globalCellCoords[1] +
_C[q][1] > 0) && ((
int)globalCellCoords[1] +
_C[q][1] <
_domainSizeY + 1) &&
245 ((
int)globalCellCoords[2] +
_C[q][2] > 0) && ((
int)globalCellCoords[2] +
_C[q][2] <
_domainSizeZ + 1)) {
246 const int nbIndex =
get((
_C[q][0] + globalCellCoords[0]), (
_C[q][1] + globalCellCoords[1]), (
_C[q][2] + globalCellCoords[2]));
248 0.5 * (
_vel[3 * index + 2] +
_vel[3 * nbIndex + 2]));
249 _pdf1[19 * index + q] =
250 _pdf1[19 * nbIndex + 18 - q] -
251 6.0 *
_W[q] *
_density[nbIndex] * (
_C[18 - q][0] * interpolVel[0] +
_C[18 - q][1] * interpolVel[1] +
_C[18 - q][2] * interpolVel[2]);
265 if ((pos[0] < domainOffset[0]) || (pos[0] > domainOffset[0] +
_domainSizeX *
_dx) || (pos[1] < domainOffset[1]) ||
267 std::cout <<
"ERROR LBCouetteSolver::getVelocity(): Position " << pos <<
" out of range!" << std::endl;
268 std::cout <<
"domainOffset = " << domainOffset << std::endl;
269 std::cout <<
"_domainSizeX = " <<
_domainSizeX << std::endl;
270 std::cout <<
"_domainSizeY = " <<
_domainSizeY << std::endl;
271 std::cout <<
"_domainSizeZ = " <<
_domainSizeZ << std::endl;
272 std::cout <<
"_dx = " <<
_dx << std::endl;
277 for (
unsigned int d = 0; d < 3; d++) {
278 coords[d] = (
unsigned int)((
_dx + pos[d] - domainOffset[d]) /
_dx);
280 const int index =
get(coords[0], coords[1], coords[2]);
283 for (
int d = 0; d < 3; d++) {
286#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
287 std::cout <<
"Position " << pos <<
" corresponds to cell: " << coords <<
"; vel=" << vel << std::endl;
300 if ((pos[0] < domainOffset[0]) || (pos[0] > domainOffset[0] +
_domainSizeX *
_dx) || (pos[1] < domainOffset[1]) ||
302 std::cout <<
"ERROR LBCouetteSolver::getDensity(): Position " << pos <<
" out of range!" << std::endl;
307 for (
unsigned int d = 0; d < 3; d++) {
308 coords[d] = (
unsigned int)((
_dx + pos[d] - domainOffset[d]) /
_dx);
310 const int index =
get(coords[0], coords[1], coords[2]);
323 computeDensityAndVelocityEverywhere();
324 return std::make_unique<LBCouetteSolverState>(_pdfsize,
_pdf1);
327 void setState(
const std::unique_ptr<State>& input,
int cycle)
override {
330#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
331 if (state ==
nullptr) {
332 std::cout <<
"ERROR LBCouetteSolver setState() wrong state type" << std::endl;
338 computeDensityAndVelocityEverywhere();
343 std::unique_ptr<State>
operator()(
const std::unique_ptr<State>& input,
int cycle)
override {
346#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
347 if (_mode != Mode::supervising) {
348 std::cout <<
"ERROR LBCouetteSolver operator() called but not in supervising mode" << std::endl;
357 Mode
getMode()
const override {
return _mode; }
365 std::unique_ptr<PintableMacroSolver>
getSupervisor(
int num_cycles,
double visc_multiplier)
const override {
366#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
367 if (_mode == Mode::supervising) {
368 std::cout <<
"ERROR LBCouetteSolver getSupervisor(): already in supervising mode" << std::endl;
375 numThreads = omp_get_num_threads();
381 res->_mode = Mode::supervising;
382 res->_dt_pint =
_dt * num_cycles;
387 void print(std::ostream& os)
const override {
388 if (_mode == Mode::supervising)
389 os <<
"<LBCouetteSolver instance in supervising mode >";
390 if (_mode == Mode::coupling)
391 os <<
"<LBCouetteSolver instance in coupling mode >";
394 double get_avg_vel(
const std::unique_ptr<State>& state)
const override {
397 double res[3]{0, 0, 0};
398 for (
int i = 0; i < _pdfsize; i += 19) {
405 res[0] /= (_pdfsize / 19);
406 res[1] /= (_pdfsize / 19);
407 res[2] /= (_pdfsize / 19);
409 return std::sqrt(res[0] * res[0] + res[1] * res[1] + res[2] * res[2]);
416 void computeDensityAndVelocityEverywhere() {
422 const int index =
get(x, y, z);
423 const int pI = 19 * index;
424 double* vel = &
_vel[3 * index];
435#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
436 MPI_Comm_rank(coupling::indexing::IndexingService<3>::getInstance().getComm(), &rank);
438 std::stringstream ss;
440 if (_scen !=
nullptr) {
441 auto ts = _scen->getTimeIntegrationService();
443 if (ts->isPintEnabled())
444 ss <<
"_i" << ts->getInteration();
448 std::string filename = ss.str();
449 std::ofstream file(filename.c_str(),
_counter==0 ? std::ofstream::out : std::ofstream::app);
450 if (!file.is_open()) {
451 std::cout <<
"ERROR LBCouetteSolver::plot_avg_vel(): Could not open file " << filename <<
"!" << std::endl;
456 file <<
"coupling_cycle ; avg_vel" << std::endl;
459 std::unique_ptr<State> s = std::make_unique<LBCouetteSolverState>(_pdfsize,
_pdf1);
461 file <<
_counter <<
" ; " << vel << std::endl;
472#pragma omp parallel for
476 const int index =
get(x, y, z);
485 double* swap =
_pdf1;
492 const int pI = 19 * index;
493 for (
int q = 0; q < 9; q++) {
494 const int nb = 19 * (
_C[q][0] +
_C[q][1] *
_xO +
_C[q][2] *
_yO);
502 void collide(
int index,
int x,
int y,
int z) {
504 const int pI = 19 * index;
506 double* vel = &
_vel[3 * index];
509 const double u2 = 1.0 - 1.5 * (vel[0] * vel[0] + vel[1] * vel[1] + vel[2] * vel[2]);
511 double cu = -vel[1] - vel[2];
513 double feq =
_W[0] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
520 cu = -vel[0] - vel[2];
522 feq =
_W[1] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
531 feq =
_W[2] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
538 cu = vel[0] - vel[2];
540 feq =
_W[3] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
547 cu = vel[1] - vel[2];
549 feq =
_W[4] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
556 cu = -vel[0] - vel[1];
558 feq =
_W[5] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
567 feq =
_W[6] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
574 cu = vel[0] - vel[1];
576 feq =
_W[7] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
585 feq =
_W[8] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
604 void boundary(
double*
const pdf,
int index,
int x,
int y,
int z,
int q,
const Flag& flag,
int nbIndex) {
608 pdf[nbIndex + 18 - q] = pdf[index + q];
612 pdf[nbIndex + 18 - q] =
616 int target[3] = {x, y, z};
617 if (target[0] +
_C[q][0] == 0) {
622 if (target[1] +
_C[q][1] == 0) {
627 if (target[2] +
_C[q][2] == 0) {
633 pdf[19 * periodicNb + q] = pdf[index + q];
643 vel[0] = -(pdf[1] + pdf[5] + pdf[8] + pdf[11] + pdf[15]);
644 density = pdf[3] + pdf[7] + pdf[10] + pdf[13] + pdf[17];
645 vel[1] = (pdf[4] + pdf[11] + pdf[12] + pdf[13] + pdf[18]) - (pdf[0] + pdf[5] + pdf[6] + pdf[7] + pdf[14]);
646 vel[0] = density + vel[0];
647 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];
648 vel[2] = (pdf[14] + pdf[15] + pdf[16] + pdf[17] + pdf[18]) - (pdf[0] + pdf[1] + pdf[2] + pdf[3] + pdf[4]);
649 vel[0] = vel[0] / density;
650 vel[1] = vel[1] / density;
651 vel[2] = vel[2] / density;
670#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
672 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}};
673 MPI_Request requests[2];
674 MPI_Status status[2];
678 if (nbFlagTo ==
LEFT || nbFlagTo ==
RIGHT) {
683 }
else if (nbFlagTo ==
FRONT || nbFlagTo ==
BACK) {
688 }
else if (nbFlagTo ==
TOP || nbFlagTo ==
BOTTOM) {
694 std::cout <<
"ERROR LBCouetteSolver::communicatePart: d >2 or d < 0!" << std::endl;
699 for (coords[2] = startSend[2]; coords[2] < endSend[2]; coords[2]++) {
700 for (coords[1] = startSend[1]; coords[1] < endSend[1]; coords[1]++) {
701 for (coords[0] = startSend[0]; coords[0] < endSend[0]; coords[0]++) {
702 for (
int q = 0; q < 5; q++) {
703 sendBuffer[q + 5 *
getParBuf(coords[plane[0]], coords[plane[1]], domainSize[0], domainSize[1])] =
704 pdf[directions[nbFlagTo][q] + 19 *
get(coords[0], coords[1], coords[2])];
710 MPI_Irecv(recvBuffer, (domainSize[0] + 2) * (domainSize[1] + 2) * 5, MPI_DOUBLE,
_parallelNeighbours[nbFlagFrom], 1000,
711 coupling::indexing::IndexingService<3>::getInstance().getComm(), &requests[0]);
712 MPI_Isend(sendBuffer, (domainSize[0] + 2) * (domainSize[1] + 2) * 5, MPI_DOUBLE,
_parallelNeighbours[nbFlagTo], 1000,
713 coupling::indexing::IndexingService<3>::getInstance().getComm(), &requests[1]);
714 MPI_Waitall(2, requests, status);
717 for (coords[2] = startRecv[2]; coords[2] < endRecv[2]; coords[2]++) {
718 for (coords[1] = startRecv[1]; coords[1] < endRecv[1]; coords[1]++) {
719 for (coords[0] = startRecv[0]; coords[0] < endRecv[0]; coords[0]++) {
720 for (
int q = 0; q < 5; q++) {
722 pdf[directions[nbFlagTo][q] + 19 *
get(coords[0], coords[1], coords[2])] =
723 recvBuffer[q + 5 *
getParBuf(coords[plane[0]], coords[plane[1]], domainSize[0], domainSize[1])];
736#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
774 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},
775 {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}};
777 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,
778 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:642
std::unique_ptr< State > operator()(const std::unique_ptr< State > &input, int cycle) override
Definition LBCouetteSolver.h:343
std::unique_ptr< PintableMacroSolver > getSupervisor(int num_cycles, double visc_multiplier) const override
Definition LBCouetteSolver.h:365
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:668
std::unique_ptr< State > getState() override
Definition LBCouetteSolver.h:322
double get_avg_vel(const std::unique_ptr< State > &state) const override
Definition LBCouetteSolver.h:394
const double _omega
relaxation frequency
Definition LBCouetteSolver.h:765
const int _C[19][3]
lattice velocities
Definition LBCouetteSolver.h:774
void setMDBoundaryValues(coupling::datastructures::FlexibleCellContainer< 3 > &md2macroBuffer) override
applies the values received from the MD-solver within the conntinuum solver
Definition LBCouetteSolver.h:199
double * _pdf1
partical distribution function field
Definition LBCouetteSolver.h:770
void collide(int index, int x, int y, int z)
Definition LBCouetteSolver.h:502
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:604
Mode getMode() const override
Definition LBCouetteSolver.h:357
const double _W[19]
lattice weights
Definition LBCouetteSolver.h:777
void communicate()
comunicates the boundary field data between the different processes
Definition LBCouetteSolver.h:735
tarch::la::Vector< 3, double > getVelocity(tarch::la::Vector< 3, double > pos) const override
returns velocity at a certain position
Definition LBCouetteSolver.h:260
void advance(double dt) override
advances one time step dt in time and triggers vtk plot if required
Definition LBCouetteSolver.h:175
virtual ~LBCouetteSolver()
a simple destructor
Definition LBCouetteSolver.h:124
virtual void setWallVelocity(const tarch::la::Vector< 3, double > wallVelocity) override
changes the velocity at the moving wall (z=0)
Definition LBCouetteSolver.h:316
tarch::la::Vector< 3, double > _wallVelocity
velocity of moving wall of Couette flow
Definition LBCouetteSolver.h:767
const bool _plotAverageVelocity
enables avg_vel CSV output
Definition LBCouetteSolver.h:780
void collidestream()
collide-stream algorithm for the Lattice-Boltzmann method
Definition LBCouetteSolver.h:471
void setState(const std::unique_ptr< State > &input, int cycle) override
Definition LBCouetteSolver.h:327
void print(std::ostream &os) const override
Definition LBCouetteSolver.h:387
double * _pdf2
partial distribution function field (stores the old time step)
Definition LBCouetteSolver.h:772
LBCouetteSolver(const double channelheight, tarch::la::Vector< 3, double > wallVelocity, const double kinVisc, const double dx, const double dt, const int plotEveryTimestep, const bool plotAverageVelocity, 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:73
void stream(int index)
the stream part of the LB algorithm (from pdf1 to pdf2)
Definition LBCouetteSolver.h:491
double getDensity(tarch::la::Vector< 3, double > pos) const override
returns density at a certain position
Definition LBCouetteSolver.h:295
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