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;
209 computeDensityAndVelocityEverywhere();
212 for (
auto pair : md2macroBuffer) {
215 std::tie(couplingCell, idx) = pair;
221#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
222 std::cout <<
"Process coords: " <<
_coords <<
": GlobalCellCoords for index " << idx <<
": " << globalCellCoords << std::endl;
224 const int index =
get(globalCellCoords[0], globalCellCoords[1], globalCellCoords[2]);
225#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
227 std::cout <<
"ERROR LBCouetteSolver::setMDBoundaryValues(): Cell " << index <<
" is no MD boundary cell!" << std::endl;
238 for (
unsigned int d = 0; d < 3; d++) {
239 _vel[3 * index + d] = localVel[d];
243 for (
unsigned int q = 0; q < 19; q++) {
245 if (((
int)globalCellCoords[0] +
_C[q][0] > 0) && ((
int)globalCellCoords[0] +
_C[q][0] <
_domainSizeX + 1) &&
246 ((
int)globalCellCoords[1] +
_C[q][1] > 0) && ((
int)globalCellCoords[1] +
_C[q][1] <
_domainSizeY + 1) &&
247 ((
int)globalCellCoords[2] +
_C[q][2] > 0) && ((
int)globalCellCoords[2] +
_C[q][2] <
_domainSizeZ + 1)) {
248 const int nbIndex =
get((
_C[q][0] + globalCellCoords[0]), (
_C[q][1] + globalCellCoords[1]), (
_C[q][2] + globalCellCoords[2]));
250 0.5 * (
_vel[3 * index + 2] +
_vel[3 * nbIndex + 2]));
251 _pdf1[19 * index + q] =
252 _pdf1[19 * nbIndex + 18 - q] -
253 6.0 *
_W[q] *
_density[nbIndex] * (
_C[18 - q][0] * interpolVel[0] +
_C[18 - q][1] * interpolVel[1] +
_C[18 - q][2] * interpolVel[2]);
267 if ((pos[0] < domainOffset[0]) || (pos[0] > domainOffset[0] +
_domainSizeX *
_dx) || (pos[1] < domainOffset[1]) ||
269 std::cout <<
"ERROR LBCouetteSolver::getVelocity(): Position " << pos <<
" out of range!" << std::endl;
270 std::cout <<
"domainOffset = " << domainOffset << std::endl;
271 std::cout <<
"_domainSizeX = " <<
_domainSizeX << std::endl;
272 std::cout <<
"_domainSizeY = " <<
_domainSizeY << std::endl;
273 std::cout <<
"_domainSizeZ = " <<
_domainSizeZ << std::endl;
274 std::cout <<
"_dx = " <<
_dx << std::endl;
279 for (
unsigned int d = 0; d < 3; d++) {
280 coords[d] = (
unsigned int)((
_dx + pos[d] - domainOffset[d]) /
_dx);
282 const int index =
get(coords[0], coords[1], coords[2]);
285 for (
int d = 0; d < 3; d++) {
288#if (COUPLING_MD_DEBUG == COUPLING_MD_YES)
289 std::cout <<
"Position " << pos <<
" corresponds to cell: " << coords <<
"; vel=" << vel << std::endl;
302 if ((pos[0] < domainOffset[0]) || (pos[0] > domainOffset[0] +
_domainSizeX *
_dx) || (pos[1] < domainOffset[1]) ||
304 std::cout <<
"ERROR LBCouetteSolver::getDensity(): Position " << pos <<
" out of range!" << std::endl;
309 for (
unsigned int d = 0; d < 3; d++) {
310 coords[d] = (
unsigned int)((
_dx + pos[d] - domainOffset[d]) /
_dx);
312 const int index =
get(coords[0], coords[1], coords[2]);
325 computeDensityAndVelocityEverywhere();
327 return std::make_unique<LBCouetteSolverState>(0);
328 return std::make_unique<LBCouetteSolverState>(_pdfsize,
_pdf1);
331 void setState(
const std::unique_ptr<State>& input,
int cycle)
override {
337#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
338 if (state ==
nullptr) {
339 std::cout <<
"ERROR LBCouetteSolver setState() wrong state type" << std::endl;
345 computeDensityAndVelocityEverywhere();
350 std::unique_ptr<State>
operator()(
const std::unique_ptr<State>& input,
int cycle)
override {
353#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
354 if (_mode != Mode::supervising) {
355 std::cout <<
"ERROR LBCouetteSolver operator() called but not in supervising mode" << std::endl;
364 Mode
getMode()
const override {
return _mode; }
372 std::unique_ptr<PintableMacroSolver>
getSupervisor(
int num_cycles,
double visc_multiplier)
const override {
373#if (COUPLING_MD_ERROR == COUPLING_MD_YES)
374 if (_mode == Mode::supervising) {
375 std::cout <<
"ERROR LBCouetteSolver getSupervisor(): already in supervising mode" << std::endl;
382 numThreads = omp_get_num_threads();
388 res->_mode = Mode::supervising;
389 res->_dt_pint =
_dt * num_cycles;
394 void print(std::ostream& os)
const override {
395 if (_mode == Mode::supervising)
396 os <<
"<LBCouetteSolver instance in supervising mode >";
397 if (_mode == Mode::coupling)
398 os <<
"<LBCouetteSolver instance in coupling mode >";
401 double get_avg_vel(
const std::unique_ptr<State>& state)
const override {
406 double res[3]{0, 0, 0};
407 for (
int i = 0; i < _pdfsize; i += 19) {
414 res[0] /= (_pdfsize / 19);
415 res[1] /= (_pdfsize / 19);
416 res[2] /= (_pdfsize / 19);
418 return std::sqrt(res[0] * res[0] + res[1] * res[1] + res[2] * res[2]);
421 double get_avg_velX(
const std::unique_ptr<State>& state)
const {
427 for (
int i = 0; i < _pdfsize; i += 19) {
432 res /= (_pdfsize / 19);
441 void computeDensityAndVelocityEverywhere() {
447 const int index =
get(x, y, z);
448 const int pI = 19 * index;
449 double* vel = &
_vel[3 * index];
456 void plot_avg_vel() {
461#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
462 MPI_Comm_rank(coupling::indexing::IndexingService<3>::getInstance().getComm(), &rank);
464 std::stringstream ss;
466 if (_scen !=
nullptr) {
467 auto ts = _scen->getTimeIntegrationService();
469 if (ts->isPintEnabled())
470 ss <<
"_i" << ts->getIteration();
474 std::string filename = ss.str();
475 std::ofstream file(filename.c_str(),
_counter == 0 ? std::ofstream::out : std::ofstream::app);
476 if (!file.is_open()) {
477 std::cout <<
"ERROR LBCouetteSolver::plot_avg_vel(): Could not open file " << filename <<
"!" << std::endl;
482 file <<
"coupling_cycle ; avg_vel ; avg_velX" << std::endl;
485 std::unique_ptr<State> s = std::make_unique<LBCouetteSolverState>(_pdfsize,
_pdf1);
487 double velX = get_avg_velX(s);
488 file <<
_counter <<
" ; " << vel <<
" ; " << velX << std::endl;
499#pragma omp parallel for
503 const int index =
get(x, y, z);
512 double* swap =
_pdf1;
519 const int pI = 19 * index;
520 for (
int q = 0; q < 9; q++) {
521 const int nb = 19 * (
_C[q][0] +
_C[q][1] *
_xO +
_C[q][2] *
_yO);
529 void collide(
int index,
int x,
int y,
int z) {
531 const int pI = 19 * index;
533 double* vel = &
_vel[3 * index];
536 const double u2 = 1.0 - 1.5 * (vel[0] * vel[0] + vel[1] * vel[1] + vel[2] * vel[2]);
538 double cu = -vel[1] - vel[2];
540 double feq =
_W[0] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
547 cu = -vel[0] - vel[2];
549 feq =
_W[1] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
558 feq =
_W[2] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
565 cu = vel[0] - vel[2];
567 feq =
_W[3] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
574 cu = vel[1] - vel[2];
576 feq =
_W[4] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
583 cu = -vel[0] - vel[1];
585 feq =
_W[5] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
594 feq =
_W[6] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
601 cu = vel[0] - vel[1];
603 feq =
_W[7] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
612 feq =
_W[8] *
_density[index] * (u2 + 3.0 * cu + 4.5 * cu * cu);
631 void boundary(
double*
const pdf,
int index,
int x,
int y,
int z,
int q,
const Flag& flag,
int nbIndex) {
635 pdf[nbIndex + 18 - q] = pdf[index + q];
639 pdf[nbIndex + 18 - q] =
643 int target[3] = {x, y, z};
644 if (target[0] +
_C[q][0] == 0) {
649 if (target[1] +
_C[q][1] == 0) {
654 if (target[2] +
_C[q][2] == 0) {
660 pdf[19 * periodicNb + q] = pdf[index + q];
670 vel[0] = -(pdf[1] + pdf[5] + pdf[8] + pdf[11] + pdf[15]);
671 density = pdf[3] + pdf[7] + pdf[10] + pdf[13] + pdf[17];
672 vel[1] = (pdf[4] + pdf[11] + pdf[12] + pdf[13] + pdf[18]) - (pdf[0] + pdf[5] + pdf[6] + pdf[7] + pdf[14]);
673 vel[0] = density + vel[0];
674 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];
675 vel[2] = (pdf[14] + pdf[15] + pdf[16] + pdf[17] + pdf[18]) - (pdf[0] + pdf[1] + pdf[2] + pdf[3] + pdf[4]);
676 vel[0] = vel[0] / density;
677 vel[1] = vel[1] / density;
678 vel[2] = vel[2] / density;
697#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
699 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}};
700 MPI_Request requests[2];
701 MPI_Status status[2];
705 if (nbFlagTo ==
LEFT || nbFlagTo ==
RIGHT) {
710 }
else if (nbFlagTo ==
FRONT || nbFlagTo ==
BACK) {
715 }
else if (nbFlagTo ==
TOP || nbFlagTo ==
BOTTOM) {
721 std::cout <<
"ERROR LBCouetteSolver::communicatePart: d >2 or d < 0!" << std::endl;
726 for (coords[2] = startSend[2]; coords[2] < endSend[2]; coords[2]++) {
727 for (coords[1] = startSend[1]; coords[1] < endSend[1]; coords[1]++) {
728 for (coords[0] = startSend[0]; coords[0] < endSend[0]; coords[0]++) {
729 for (
int q = 0; q < 5; q++) {
730 sendBuffer[q + 5 *
getParBuf(coords[plane[0]], coords[plane[1]], domainSize[0], domainSize[1])] =
731 pdf[directions[nbFlagTo][q] + 19 *
get(coords[0], coords[1], coords[2])];
737 MPI_Irecv(recvBuffer, (domainSize[0] + 2) * (domainSize[1] + 2) * 5, MPI_DOUBLE,
_parallelNeighbours[nbFlagFrom], 1000,
738 coupling::indexing::IndexingService<3>::getInstance().getComm(), &requests[0]);
739 MPI_Isend(sendBuffer, (domainSize[0] + 2) * (domainSize[1] + 2) * 5, MPI_DOUBLE,
_parallelNeighbours[nbFlagTo], 1000,
740 coupling::indexing::IndexingService<3>::getInstance().getComm(), &requests[1]);
741 MPI_Waitall(2, requests, status);
744 for (coords[2] = startRecv[2]; coords[2] < endRecv[2]; coords[2]++) {
745 for (coords[1] = startRecv[1]; coords[1] < endRecv[1]; coords[1]++) {
746 for (coords[0] = startRecv[0]; coords[0] < endRecv[0]; coords[0]++) {
747 for (
int q = 0; q < 5; q++) {
749 pdf[directions[nbFlagTo][q] + 19 *
get(coords[0], coords[1], coords[2])] =
750 recvBuffer[q + 5 *
getParBuf(coords[plane[0]], coords[plane[1]], domainSize[0], domainSize[1])];
763#if (COUPLING_MD_PARALLEL == COUPLING_MD_YES)
801 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},
802 {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}};
804 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,
805 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:669
std::unique_ptr< State > operator()(const std::unique_ptr< State > &input, int cycle) override
Definition LBCouetteSolver.h:350
std::unique_ptr< PintableMacroSolver > getSupervisor(int num_cycles, double visc_multiplier) const override
Definition LBCouetteSolver.h:372
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:695
std::unique_ptr< State > getState() override
Definition LBCouetteSolver.h:324
double get_avg_vel(const std::unique_ptr< State > &state) const override
Definition LBCouetteSolver.h:401
const double _omega
relaxation frequency
Definition LBCouetteSolver.h:792
const int _C[19][3]
lattice velocities
Definition LBCouetteSolver.h:801
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:797
void collide(int index, int x, int y, int z)
Definition LBCouetteSolver.h:529
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:631
Mode getMode() const override
Definition LBCouetteSolver.h:364
const double _W[19]
lattice weights
Definition LBCouetteSolver.h:804
void communicate()
comunicates the boundary field data between the different processes
Definition LBCouetteSolver.h:762
tarch::la::Vector< 3, double > getVelocity(tarch::la::Vector< 3, double > pos) const override
returns velocity at a certain position
Definition LBCouetteSolver.h:262
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:318
tarch::la::Vector< 3, double > _wallVelocity
velocity of moving wall of Couette flow
Definition LBCouetteSolver.h:794
const bool _plotAverageVelocity
enables avg_vel CSV output
Definition LBCouetteSolver.h:807
void collidestream()
collide-stream algorithm for the Lattice-Boltzmann method
Definition LBCouetteSolver.h:498
void setState(const std::unique_ptr< State > &input, int cycle) override
Definition LBCouetteSolver.h:331
void print(std::ostream &os) const override
Definition LBCouetteSolver.h:394
double * _pdf2
partial distribution function field (stores the old time step)
Definition LBCouetteSolver.h:799
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:518
double getDensity(tarch::la::Vector< 3, double > pos) const override
returns density at a certain position
Definition LBCouetteSolver.h:297
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