MAIA bb96820c
Multiphysics at AIA
Loading...
Searching...
No Matches
LbBndCnd< nDim > Class Template Referenceabstract

#include <lbbndcnd.h>

Inheritance diagram for LbBndCnd< nDim >:
[legend]
Collaboration diagram for LbBndCnd< nDim >:
[legend]

Public Types

using Cell = GridCell
 

Public Member Functions

 LbBndCnd (LbSolver< nDim > *solver)
 
virtual ~LbBndCnd ()
 The destructor. More...
 
virtual void setBndCndHandler ()
 Sets the BndCndHandler objects at solver setup. More...
 
virtual void updateVariables ()
 Dereferences bndCndHandlerVariables. More...
 
virtual void updateRHS ()
 Dereferences bndCndHandlerRHS. More...
 
void initializeBcData ()
 Initialize BC data variables. More...
 
virtual void createMBComm ()
 This function creates the communicator for calculating the wall forces of the level-set boundaries. More...
 
virtual void postCouple ()
 This function does the sub coupling step called from the coupling class. More...
 
virtual void initializeBndMovingBoundaries ()
 This function initializes the LbBndCnd for coupled simulations. More...
 

Protected Types

using MbCellCollector = maia::lb::collector::LbMbCellCollector< nDim >
 
typedef void(LbBndCnd::* BndCndHandler) (MInt set)
 
typedef void(LbBndCnd::* BndCndHandler_Mb) (MInt set)
 

Protected Member Functions

template<typename K , typename V >
GetWithDef (const std::map< K, V > &m, const K &key, const V &defval)
 
MInt a_boundaryCellMb (const MInt cellId)
 
virtual MInt findBndCnd (MInt index)
 This function returns the index in the array of the boundary conditions that are inflow/outflow conditions for a given index in all boundary cells. More...
 
virtual void solveBlasiusZ (MInt index)
 Solves the Blasius equation for f,f',f". More...
 
void sortBoundaryCells ()
 This function sorts the boundary cells according to the BC id. More...
 
virtual void calculateForces (MInt)
 
virtual void calculateWallDistances ()
 
virtual void addWallDistanceFieldToOutputFile (ParallelIo &parallelio, const MBool writeHeader, const MBool writeData)=0
 
virtual void createChannelBoundaries ()
 
virtual void bc0 (MInt)
 
virtual void bc10000 (MInt)
 
virtual void bc10001 (MInt)
 
virtual void bc10002 (MInt)
 
virtual void bc10004 (MInt)
 
virtual void bc10022 (MInt)
 
virtual void bc10010 (MInt)
 
virtual void bc10020 (MInt)
 
virtual void bc10040 (MInt)
 
virtual void bc10041 (MInt)
 
virtual void bc10042 (MInt)
 
virtual void bc10043 (MInt)
 
virtual void bc10044 (MInt)
 
virtual void bc10045 (MInt)
 
virtual void bc10046 (MInt)
 
virtual void bc10050 (MInt)
 
virtual void bc10060 (MInt)
 
virtual void bc10061 (MInt)
 
virtual void bc10090 (MInt)
 
virtual void bc10070 (MInt)
 
virtual void bc10080 (MInt)
 
virtual void bc20000 (MInt)
 
virtual void bc20001 (MInt)
 
virtual void bc20002 (MInt)
 
virtual void bc20003 (MInt)
 
virtual void bc20004 (MInt)
 
virtual void bc20005 (MInt)
 
virtual void bc20006 (MInt)
 
virtual void bc20010 (MInt)
 
virtual void bc20020 (MInt)
 
virtual void bc20220 (MInt)
 
virtual void bc20226 (MInt)
 
virtual void bc20227 (MInt)
 
virtual void bc20228 (MInt)
 
virtual void bc20501 (MInt)
 
virtual void bc20501_init (MInt)
 
virtual void bcIBBNeumannInit (MInt)
 
virtual void bc20022 (MInt)
 
virtual void bc20023 (MInt)
 
virtual void bc20024 (MInt)
 
virtual void bc20025 (MInt)
 
virtual void bc20026 (MInt)
 
virtual void bc20027 (MInt)
 
virtual void bc20030 (MInt)
 
virtual void bc20230 (MInt)
 
virtual void bc20050 (MInt)
 
virtual void bc20051 (MInt)
 
virtual void bc20052 (MInt)
 
virtual void bc20053 (MInt)
 
virtual void bc20054 (MInt)
 
virtual void bc20055 (MInt)
 
virtual void bc30000 (MInt)
 
virtual void bc30010 (MInt)
 
virtual void bc30011 (MInt)
 
virtual void bc30012 (MInt)
 
virtual void bc30013 (MInt)
 
virtual void bc30014 (MInt)
 
virtual void bc30015 (MInt)
 
virtual void bc30020 (MInt)
 
virtual void bc30021 (MInt)
 
virtual void bc30022 (MInt)
 
virtual void bc30023 (MInt)
 
virtual void bc30024 (MInt)
 
virtual void bc30025 (MInt)
 
virtual void bc30030 (MInt)
 
virtual void bc30031 (MInt)
 
virtual void bc30032 (MInt)
 
virtual void bc30033 (MInt)
 
virtual void bc30034 (MInt)
 
virtual void bc30035 (MInt)
 
virtual void bc30040 (MInt)
 
virtual void bc30041 (MInt)
 
virtual void bc30042 (MInt)
 
virtual void bc30043 (MInt)
 
virtual void bc30044 (MInt)
 
virtual void bc30045 (MInt)
 
virtual void bc30050 (MInt)
 
virtual void bc40000 (MInt)
 
virtual void bc40001 (MInt)
 
virtual void bc40010 (MInt)
 
virtual void bc40020 (MInt)
 
virtual void bc40030 (MInt)
 
virtual void bc40040 (MInt)
 
virtual void bc40041 (MInt)
 
virtual void bc40042 (MInt)
 
virtual void bc40043 (MInt)
 
virtual void bc40044 (MInt)
 
virtual void bc40045 (MInt)
 
virtual void bc40046 (MInt)
 
virtual void bc40060 (MInt)
 
virtual void bc40070 (MInt)
 
virtual void bc40071 (MInt)
 
virtual void bc40072 (MInt)
 
virtual void bc40073 (MInt)
 
virtual void bc40080 (MInt)
 
virtual void bc40081 (MInt)
 
virtual void bc40082 (MInt)
 
virtual void bc40072_40082_init (MInt)
 
virtual void bc40100 (MInt)
 
virtual void bc40110 (MInt)
 
virtual void bc40120 (MInt)
 
virtual void bc40130 (MInt)
 
virtual void bc10111 (MInt)
 
virtual void bc66666 (MInt)
 
virtual void bc66667 (MInt)
 
virtual void bc66668 (MInt)
 
virtual MInt checkForCommBC ()
 Checks if a BC exists that requires communication. More...
 
virtual MBool checkForCommForce ()
 Checks if a BC exists that requires communication. More...
 
virtual void setBCNeighborCommunicator ()
 Sets up a neighbor-communicator for certain BCs. More...
 
virtual void prepareBC (MInt index, MInt BCCounter, MInt segId)
 Prepares the BC 4070, 4071, 4072, 4080, 4081, and 4082. More...
 
virtual void prepareBC4073 (MInt BCCounter, MInt segId)
 
virtual void setBCWallNeighborCommunicator ()
 Sets up a neighbor-communicator for certain BCs. More...
 
virtual void prepareBC2000 ()
 Prepares the BC 4072. More...
 

Protected Attributes

MbCellCollector m_boundaryCellsMb {}
 
LbSolver< nDim > * m_solver
 pointer to a member function data type More...
 
std::vector< BndCndHandlerbndCndHandlerVariables
 
std::vector< BndCndHandlerbndCndHandlerRHS
 
std::vector< BndCndHandlerbndCndInitiator
 
std::vector< BndCndHandlerbndCndHandlerVariables_MB
 
std::vector< BndCndHandler_MbbndCndHandlerRHS_MB
 
MInt m_noInternalCells
 
MInt m_initialNoCells [3] {}
 
std::map< MInt, MIntm_boundaryCellMappingMb
 
MInt m_noInOutSegments {}
 
MInt m_noPeriodicSegments
 
MInt m_noSegments {}
 
MFloat ** m_initialVelocityVecs = nullptr
 
MFloat ** m_bndNormals = nullptr
 
MIntm_inOutSegmentsIds = nullptr
 
MIntm_periodicSegmentsIds
 
MIntm_bndNormalDirection = nullptr
 
MInt m_lbNoMovingWalls
 
MIntm_segIdMovingWalls {}
 
MFloatm_lbWallVelocity {}
 
MBool m_calcWallForces
 
MInt m_calcWallForcesInterval
 
MInt m_lbNoHeatedWalls
 
MIntm_segIdHeatedWalls {}
 
MFloatm_lbWallTemperature {}
 
MFloatm_Fext
 
MInt m_maxNoG0CellsLb
 
MInt m_maxNoDistributionsInDim
 
MString m_initVelocityMethod
 
MString m_bndNormalMethod
 
MInt m_fastParallelGeomNormals {}
 
MString m_interpolationDistMethod
 
MBool m_outputWallDistanceField = false
 
MString m_multiBCTreatment
 
MFloatm_phi = nullptr
 
MFloatm_theta = nullptr
 
MInt ** m_exDirs = nullptr
 
MFloat ** m_exWeights = nullptr
 
MInt m_solverId
 index of the array where the boundary conditions are stored in More...
 
std::vector< LbGridBoundaryCell< nDim > > m_bndCells
 
MString m_gridCutTest
 
MPrimitiveVariables< nDim > * PV
 
MInt m_noDistributions
 
MInt m_methodId
 
MFloat m_omega {}
 physical non-dimensional reference length More...
 
MFloat m_Ma
 
MFloat m_Re {}
 
MFloat m_nu {}
 
MFloat m_gradient {}
 
MFloat m_referenceLength
 
MFloat m_domainLength
 
MInt m_densityFluctuations
 
MFloat m_rho1 {}
 
MFloat m_rho2 {}
 
MInt m_lbControlInflow {}
 
std::vector< MIntm_bndCndIds
 
std::vector< MIntm_bndCndOffsets
 
std::vector< MIntm_bndCndSegIds
 
std::vector< MIntm_mapSegIdsInOutCnd
 
std::vector< MIntm_mapBndCndSegId2Index
 
std::vector< MIntm_mapIndex2BndCndSegId
 
std::vector< MIntm_noBndCellsPerSegment
 
MFloat ** m_blasius {}
 
MFloat m_blasius_delta {}
 
MFloat m_pulsatileFrequency
 
MBool m_latentHeat = false
 
MBool m_calcSublayerDist = false
 
std::unordered_map< MInt, LbBndCndDatam_bndCndData {}
 Stores BC specific data mapped by boundary index. More...
 
std::vector< MIntm_segIdUseBcData {}
 hold number of domains using BC data for this segment More...
 
MFloat m_deltaRho {}
 
MFloat m_ReLast {}
 
MFloat m_rhoLast {}
 
MFloat m_lRho {}
 
MFloat m_maxDeltaRho {}
 
MInt m_currentTimeStep {}
 
MPI_Group * tmp_group {}
 
MPI_Group * BCGroup {}
 
MPI_Comm * m_BCComm {}
 
MIntm_mapBndCndIdSegId {}
 
MIntm_totalNoBcCells {}
 
MStringm_BCOutputFileName {}
 
MIntm_allBoundaryIds {}
 
MInt m_noAllBoundaryIds {}
 
MInt ** m_allDomainsHaveBC {}
 
MInt m_numberOfCommBCs = 0
 
MIntm_noBCNeighbors {}
 
std::vector< std::vector< MInt > > m_BCneighbors
 
MBool m_calcBcResidual
 
std::ofstream * m_BCResidualStream {}
 
MFloatm_localReCutPoint {}
 
MFloatm_localReCutNormal {}
 
MFloat m_localReCutDistance {}
 
MFloat m_localReCutRe {}
 
MFloat m_localReCutDiameter {}
 
MIntm_allDomainsCalcForceMB {}
 
MBool m_hasCommForce
 
MPI_Comm m_BCWallMBComm
 
MInt m_noBCWallMBNeighbors
 
std::unordered_map< MInt, maia::lb::CalcWallForceContainerm_mapWallForceContainer
 
MString m_forceFile
 
std::vector< MIntm_BCWallMBNeighbors
 
std::vector< MIntm_localReCutCells
 
MBool m_hasLocalReCut {}
 
MInt m_totalNoDomainsReCut {}
 
MInt m_localReCutInterval {}
 
MFloat m_localReCutAdpPerc {}
 
MInt m_localReCutReportInterval {}
 
MInt m_firstBCinComm {}
 
MInt m_noReactivatedCells
 

Private Member Functions

virtual void createBoundaryCells ()
 Creates boundary cells according to the geometry information. More...
 
virtual void initMembers ()
 
virtual void calculateVectors ()
 
MBool calculateNormalFromTriangle (GeometryElement< nDim > ge, MFloat *normal)
 Calculate the normal based on a triangle. More...
 
MBool getNormalFromSTL (GeometryElement< nDim > ge, MFloat *normal)
 Get the normal from the STL. More...
 
void calculateBndNormals ()
 
virtual void calculateAveragedNormalAndCenter (MInt segmentId, MFloat *const normal, MFloat *const center)
 
virtual void fastParallelGeomNormals3D (std::vector< std::pair< MInt, MInt > > own_segments)
 
virtual void normalParallelGeomNormals3D (std::vector< std::pair< MInt, MInt > > own_segments)
 
virtual void updateBndNormals (MInt segId, MBool inside, MFloat *avg_normal)
 Updates the normals of an inlet/outlet based on inside / outside detection. More...
 
virtual void checkBndNormalDirection ()
 
virtual void printBndVelInfo ()
 This function prints the gathered information on the boundary vectors and the initial velocity vector into the log file. More...
 
virtual void processAngles ()
 
void bcDataAllocate (MInt index, MInt noVars)
 Allocate data for given boundary index. More...
 
void bcDataWriteRestartHeader (ParallelIo &parallelio)
 Write bndCndData info in given ParallelIo file's header. More...
 
void bcDataWriteRestartData (ParallelIo &parallelIo)
 Write bndCndData data in given ParallelIo file. More...
 
void bcDataReadRestartData (ParallelIo &parallelIo)
 Read bndCndData data in given ParallelIo file. More...
 
void applyDirectionChangeInflow (MInt index)
 This function checks if for an inflow boundary the normal points into the according direction and changes it depending on it. More...
 
void applyDirectionChangeOutflow (MInt index)
 This function checks if for an outflow boundary the normal points into the according direction and changes it depending on it. More...
 
void calculateBndNormals ()
 Calculates the averaged normal on a boundary segment. More...
 

Private Attributes

MBool(LbBndCnd::* retrieveNormal )(GeometryElement< nDim > ge, MFloat *normal)
 
MInt m_t_BCAll
 
MFloatsendBuffersMB = nullptr
 
MFloatreceiveBuffersMB = nullptr
 
MInthaloInformation = nullptr
 
MIntwindowInformation = nullptr
 
MPI_Request * mpi_request = nullptr
 

Friends

template<MInt nDim_>
class LbSolver
 
template<MInt nDim_, MInt nDist_, class SysEqn_ >
class CouplingLB
 

Detailed Description

template<MInt nDim>
class LbBndCnd< nDim >

Definition at line 45 of file lbbndcnd.h.

Member Typedef Documentation

◆ BndCndHandler

template<MInt nDim>
typedef void(LbBndCnd::* LbBndCnd< nDim >::BndCndHandler) (MInt set)
protected

Definition at line 61 of file lbbndcnd.h.

◆ BndCndHandler_Mb

template<MInt nDim>
typedef void(LbBndCnd::* LbBndCnd< nDim >::BndCndHandler_Mb) (MInt set)
protected

Definition at line 65 of file lbbndcnd.h.

◆ Cell

template<MInt nDim>
using LbBndCnd< nDim >::Cell = GridCell

Definition at line 53 of file lbbndcnd.h.

◆ MbCellCollector

template<MInt nDim>
using LbBndCnd< nDim >::MbCellCollector = maia::lb::collector::LbMbCellCollector<nDim>
protected

Definition at line 56 of file lbbndcnd.h.

Constructor & Destructor Documentation

◆ LbBndCnd()

template<MInt nDim>
LbBndCnd< nDim >::LbBndCnd ( LbSolver< nDim > *  solver)

◆ ~LbBndCnd()

template<MInt nDim>
LbBndCnd< nDim >::~LbBndCnd
virtual

Definition at line 347 of file lbbndcnd.cpp.

347 {
348 TRACE();
349
350 if(m_numberOfCommBCs > 0) {
360 }
361
370
371 // Delete boundary condition handlers
373 bndCndHandlerRHS.clear();
374 bndCndInitiator.clear();
375
376 // Delete boundary cells
377 m_bndCells.clear();
379}
MBool mDeallocate(T *&a)
deallocates the memory previously allocated for element 'a'
Definition: alloc.h:544
MInt * m_inOutSegmentsIds
Definition: lbbndcnd.h:91
MInt m_numberOfCommBCs
Definition: lbbndcnd.h:400
MPI_Group * BCGroup
Definition: lbbndcnd.h:391
std::vector< LbGridBoundaryCell< nDim > > m_bndCells
Definition: lbbndcnd.h:130
MInt * m_mapBndCndIdSegId
Definition: lbbndcnd.h:393
MString * m_BCOutputFileName
Definition: lbbndcnd.h:396
std::vector< MInt > m_bndCndIds
Definition: lbbndcnd.h:158
std::vector< BndCndHandler > bndCndHandlerVariables
Definition: lbbndcnd.h:62
MFloat * m_phi
Definition: lbbndcnd.h:118
MPI_Group * tmp_group
Definition: lbbndcnd.h:390
MFloat ** m_initialVelocityVecs
Definition: lbbndcnd.h:89
MInt * m_noBCNeighbors
Definition: lbbndcnd.h:401
MInt ** m_exDirs
Definition: lbbndcnd.h:125
MbCellCollector m_boundaryCellsMb
Definition: lbbndcnd.h:57
MFloat ** m_bndNormals
Definition: lbbndcnd.h:90
std::vector< BndCndHandler > bndCndInitiator
Definition: lbbndcnd.h:64
MInt * m_totalNoBcCells
Definition: lbbndcnd.h:394
MPI_Comm * m_BCComm
Definition: lbbndcnd.h:392
std::ofstream * m_BCResidualStream
Definition: lbbndcnd.h:404
MBool m_calcBcResidual
Definition: lbbndcnd.h:403
MFloat ** m_exWeights
Definition: lbbndcnd.h:126
MFloat * m_theta
Definition: lbbndcnd.h:119
MInt ** m_allDomainsHaveBC
Definition: lbbndcnd.h:399
std::vector< BndCndHandler > bndCndHandlerRHS
Definition: lbbndcnd.h:63
MInt * m_bndNormalDirection
Definition: lbbndcnd.h:93
void clear()
Clear tree by invalidating all nodes and setting size to zero.
Definition: container.h:395
int32_t MInt
Definition: maiatypes.h:62

Member Function Documentation

◆ a_boundaryCellMb()

template<MInt nDim>
MInt LbBndCnd< nDim >::a_boundaryCellMb ( const MInt  cellId)
inlineprotected

Definition at line 83 of file lbbndcnd.h.

83{ return GetWithDef(m_boundaryCellMappingMb, cellId, -1); }
std::map< MInt, MInt > m_boundaryCellMappingMb
Definition: lbbndcnd.h:71
V GetWithDef(const std::map< K, V > &m, const K &key, const V &defval)
Definition: lbbndcnd.h:74

◆ addWallDistanceFieldToOutputFile()

template<MInt nDim>
virtual void LbBndCnd< nDim >::addWallDistanceFieldToOutputFile ( ParallelIo parallelio,
const MBool  writeHeader,
const MBool  writeData 
)
protectedpure virtual

◆ applyDirectionChangeInflow()

template<MInt nDim>
void LbBndCnd< nDim >::applyDirectionChangeInflow ( MInt  index)
private
Author
Andreas Lintermann
Date
27.01.2010, 27.04.2015

A previously calculated direction array is used to check if the normal points into the right direction. If not, the normal is multiplicated with -1 and the direction indicator is switched. Note that bounday normals alway point outside.

Parameters
[in]indexthe index of the BC

Definition at line 1564 of file lbbndcnd.cpp.

1564 {
1565 TRACE();
1566
1567 if(m_initVelocityMethod != "read" && m_initVelocityMethod != "fromSTL") {
1569
1570 // wrong direction, mutiplicate with -1
1571 if(m_bndNormalDirection[ind] == -1)
1572 for(MInt i = 0; i < nDim; i++)
1573 m_initialVelocityVecs[ind][i] *= -1.0;
1574 }
1575}
std::vector< MInt > m_mapSegIdsInOutCnd
Definition: lbbndcnd.h:161
MString m_initVelocityMethod
Definition: lbbndcnd.h:110
IdType index(const FloatType *const x, const IdType level)
Return Hilbert index for given location and level in 2D or 3D.
Definition: hilbert.h:165

◆ applyDirectionChangeOutflow()

template<MInt nDim>
void LbBndCnd< nDim >::applyDirectionChangeOutflow ( MInt  index)
private
Author
Andreas Lintermann
Date
27.01.2010

A previously calculated direction array is used to check if the normal points into the right direction. If not, the normal is multiplicated with -1 and the direction indicator is switched. Note that boundary normals always point outside.

Parameters
[in]indexthe index of the BC

Definition at line 1588 of file lbbndcnd.cpp.

1588 {
1589 TRACE();
1590
1591 if(m_initVelocityMethod != "read" && m_initVelocityMethod != "fromSTL") {
1593
1594 // wrong direction, mutiplicate with -1
1595 if(m_bndNormalDirection[ind] == 1)
1596 for(MInt i = 0; i < nDim; i++)
1597 m_initialVelocityVecs[ind][i] *= -1.0;
1598 }
1599}

◆ bc0()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc0 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 241 of file lbbndcnd.h.

241{};

◆ bc10000()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10000 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 243 of file lbbndcnd.h.

243{};

◆ bc10001()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10001 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 244 of file lbbndcnd.h.

244{};

◆ bc10002()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10002 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 245 of file lbbndcnd.h.

245{};

◆ bc10004()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10004 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 246 of file lbbndcnd.h.

246{};

◆ bc10010()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10010 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 248 of file lbbndcnd.h.

248{};

◆ bc10020()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10020 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 249 of file lbbndcnd.h.

249{};

◆ bc10022()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10022 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 247 of file lbbndcnd.h.

247{};

◆ bc10040()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10040 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 250 of file lbbndcnd.h.

250{};

◆ bc10041()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10041 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 251 of file lbbndcnd.h.

251{};

◆ bc10042()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10042 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 252 of file lbbndcnd.h.

252{};

◆ bc10043()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10043 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 253 of file lbbndcnd.h.

253{};

◆ bc10044()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10044 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 254 of file lbbndcnd.h.

254{};

◆ bc10045()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10045 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 255 of file lbbndcnd.h.

255{};

◆ bc10046()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10046 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 256 of file lbbndcnd.h.

256{};

◆ bc10050()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10050 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 258 of file lbbndcnd.h.

258{};

◆ bc10060()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10060 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 259 of file lbbndcnd.h.

259{};

◆ bc10061()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10061 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 260 of file lbbndcnd.h.

260{};

◆ bc10070()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10070 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 264 of file lbbndcnd.h.

264{};

◆ bc10080()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10080 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 266 of file lbbndcnd.h.

266{};

◆ bc10090()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10090 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 262 of file lbbndcnd.h.

262{};

◆ bc10111()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc10111 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 368 of file lbbndcnd.h.

368{};

◆ bc20000()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20000 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 268 of file lbbndcnd.h.

268{};

◆ bc20001()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20001 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 269 of file lbbndcnd.h.

269{};

◆ bc20002()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20002 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 270 of file lbbndcnd.h.

270{};

◆ bc20003()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20003 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 271 of file lbbndcnd.h.

271{};

◆ bc20004()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20004 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 272 of file lbbndcnd.h.

272{};

◆ bc20005()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20005 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 273 of file lbbndcnd.h.

273{};

◆ bc20006()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20006 ( MInt  )
inlineprotectedvirtual

Definition at line 274 of file lbbndcnd.h.

274{};

◆ bc20010()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20010 ( MInt  )
inlineprotectedvirtual

Definition at line 275 of file lbbndcnd.h.

275{};

◆ bc20020()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20020 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 276 of file lbbndcnd.h.

276{};

◆ bc20022()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20022 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 287 of file lbbndcnd.h.

287{};

◆ bc20023()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20023 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 288 of file lbbndcnd.h.

288{};

◆ bc20024()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20024 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 289 of file lbbndcnd.h.

289{};

◆ bc20025()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20025 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 290 of file lbbndcnd.h.

290{};

◆ bc20026()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20026 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 291 of file lbbndcnd.h.

291{};

◆ bc20027()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20027 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 292 of file lbbndcnd.h.

292{};

◆ bc20030()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20030 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 293 of file lbbndcnd.h.

293{};

◆ bc20050()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20050 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 296 of file lbbndcnd.h.

296{};

◆ bc20051()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20051 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 297 of file lbbndcnd.h.

297{};

◆ bc20052()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20052 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 298 of file lbbndcnd.h.

298{};

◆ bc20053()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20053 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 299 of file lbbndcnd.h.

299{};

◆ bc20054()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20054 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 300 of file lbbndcnd.h.

300{};

◆ bc20055()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20055 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 301 of file lbbndcnd.h.

301{};

◆ bc20220()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20220 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 277 of file lbbndcnd.h.

277{};

◆ bc20226()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20226 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 279 of file lbbndcnd.h.

279{};

◆ bc20227()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20227 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 280 of file lbbndcnd.h.

280{};

◆ bc20228()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20228 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 281 of file lbbndcnd.h.

281{};

◆ bc20230()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20230 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 294 of file lbbndcnd.h.

294{};

◆ bc20501()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20501 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 282 of file lbbndcnd.h.

282{};

◆ bc20501_init()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc20501_init ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 283 of file lbbndcnd.h.

283{};

◆ bc30000()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30000 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 303 of file lbbndcnd.h.

303{};

◆ bc30010()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30010 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 305 of file lbbndcnd.h.

305{};

◆ bc30011()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30011 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 306 of file lbbndcnd.h.

306{};

◆ bc30012()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30012 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 307 of file lbbndcnd.h.

307{};

◆ bc30013()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30013 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 308 of file lbbndcnd.h.

308{};

◆ bc30014()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30014 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 309 of file lbbndcnd.h.

309{};

◆ bc30015()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30015 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 310 of file lbbndcnd.h.

310{};

◆ bc30020()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30020 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 312 of file lbbndcnd.h.

312{};

◆ bc30021()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30021 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 313 of file lbbndcnd.h.

313{};

◆ bc30022()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30022 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 314 of file lbbndcnd.h.

314{};

◆ bc30023()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30023 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 315 of file lbbndcnd.h.

315{};

◆ bc30024()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30024 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 316 of file lbbndcnd.h.

316{};

◆ bc30025()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30025 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 317 of file lbbndcnd.h.

317{};

◆ bc30030()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30030 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 319 of file lbbndcnd.h.

319{};

◆ bc30031()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30031 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 320 of file lbbndcnd.h.

320{};

◆ bc30032()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30032 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 321 of file lbbndcnd.h.

321{};

◆ bc30033()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30033 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 322 of file lbbndcnd.h.

322{};

◆ bc30034()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30034 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 323 of file lbbndcnd.h.

323{};

◆ bc30035()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30035 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 324 of file lbbndcnd.h.

324{};

◆ bc30040()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30040 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 326 of file lbbndcnd.h.

326{};

◆ bc30041()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30041 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 327 of file lbbndcnd.h.

327{};

◆ bc30042()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30042 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 328 of file lbbndcnd.h.

328{};

◆ bc30043()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30043 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 329 of file lbbndcnd.h.

329{};

◆ bc30044()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30044 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 330 of file lbbndcnd.h.

330{};

◆ bc30045()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30045 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 331 of file lbbndcnd.h.

331{};

◆ bc30050()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc30050 ( MInt  )
inlineprotectedvirtual

Definition at line 333 of file lbbndcnd.h.

333{};

◆ bc40000()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40000 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 335 of file lbbndcnd.h.

335{};

◆ bc40001()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40001 ( MInt  )
inlineprotectedvirtual

Definition at line 336 of file lbbndcnd.h.

336{};

◆ bc40010()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40010 ( MInt  )
inlineprotectedvirtual

Definition at line 337 of file lbbndcnd.h.

337{};

◆ bc40020()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40020 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 338 of file lbbndcnd.h.

338{};

◆ bc40030()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40030 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 339 of file lbbndcnd.h.

339{};

◆ bc40040()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40040 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 341 of file lbbndcnd.h.

341{};

◆ bc40041()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40041 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 342 of file lbbndcnd.h.

342{};

◆ bc40042()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40042 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 343 of file lbbndcnd.h.

343{};

◆ bc40043()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40043 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 344 of file lbbndcnd.h.

344{};

◆ bc40044()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40044 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 345 of file lbbndcnd.h.

345{};

◆ bc40045()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40045 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 346 of file lbbndcnd.h.

346{};

◆ bc40046()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40046 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 347 of file lbbndcnd.h.

347{};

◆ bc40060()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40060 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 349 of file lbbndcnd.h.

349{};

◆ bc40070()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40070 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 351 of file lbbndcnd.h.

351{};

◆ bc40071()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40071 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 352 of file lbbndcnd.h.

352{};

◆ bc40072()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40072 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 353 of file lbbndcnd.h.

353{};

◆ bc40072_40082_init()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40072_40082_init ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 359 of file lbbndcnd.h.

359{};

◆ bc40073()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40073 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 354 of file lbbndcnd.h.

354{};

◆ bc40080()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40080 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 355 of file lbbndcnd.h.

355{};

◆ bc40081()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40081 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 356 of file lbbndcnd.h.

356{};

◆ bc40082()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40082 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 357 of file lbbndcnd.h.

357{};

◆ bc40100()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40100 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 361 of file lbbndcnd.h.

361{};

◆ bc40110()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40110 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 362 of file lbbndcnd.h.

362{};

◆ bc40120()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40120 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 364 of file lbbndcnd.h.

364{};

◆ bc40130()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc40130 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 366 of file lbbndcnd.h.

366{};

◆ bc66666()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc66666 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 370 of file lbbndcnd.h.

370{};

◆ bc66667()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc66667 ( MInt  )
inlineprotectedvirtual

Definition at line 371 of file lbbndcnd.h.

371{};

◆ bc66668()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bc66668 ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 372 of file lbbndcnd.h.

372{};

◆ bcDataAllocate()

template<MInt nDim>
void LbBndCnd< nDim >::bcDataAllocate ( MInt  index,
MInt  noVars 
)
private
Author
Miro Gondrum
Date
09.02.2021
Parameters
[in]indexthe index of the BC

Definition at line 1404 of file lbbndcnd.cpp.

1404 {
1405 TRACE();
1406 m_bndCndData[index]; // creates default entry of bndCndData
1408 p.noVars = noVars;
1409 p.noBndCells = 0;
1410 for(MInt i = m_bndCndOffsets[index]; i < m_bndCndOffsets[index + 1]; i++) {
1411 if(!m_solver->a_isHalo(m_bndCells[i].m_cellId)) {
1412 p.noBndCells++;
1413 }
1414 }
1415 p.noBndCellsWithHalos = m_bndCndOffsets[index + 1] - m_bndCndOffsets[index];
1416 const MInt noEntries = p.noBndCellsWithHalos * p.noVars;
1417 mAlloc(p.data, noEntries, "m_bndCndData[" + std::to_string(index) + "].data", F0, AT_);
1419}
void mAlloc(T *&a, const MLong N, const MString &objectName, MString function)
allocates memory for one-dimensional array 'a' of size N
Definition: alloc.h:173
std::vector< MInt > m_bndCndSegIds
Definition: lbbndcnd.h:160
std::unordered_map< MInt, LbBndCndData > m_bndCndData
Stores BC specific data mapped by boundary index.
Definition: lbbndcnd.h:177
std::vector< MInt > m_bndCndOffsets
Definition: lbbndcnd.h:159
LbSolver< nDim > * m_solver
pointer to a member function data type
Definition: lbbndcnd.h:60
std::vector< MInt > m_segIdUseBcData
hold number of domains using BC data for this segment
Definition: lbbndcnd.h:178
constexpr std::underlying_type< FcCell >::type p(const FcCell property)
Converts property name to underlying integer value.

◆ bcDataReadRestartData()

template<MInt nDim>
void LbBndCnd< nDim >::bcDataReadRestartData ( ParallelIo parallelIo)
private
Author
Miro Gondrum
Date
11.02.2021
Parameters
[in]parallelIoParallel file handler opened in write mode

Definition at line 1511 of file lbbndcnd.cpp.

1511 {
1512 TRACE();
1513 using namespace maia::parallel_io;
1514 for(MInt i = 0; i < m_noSegments; i++) {
1515 if(m_segIdUseBcData[i]) {
1516 const MInt localSegIndex = m_mapBndCndSegId2Index[i];
1517 if(localSegIndex != -1) {
1518 // local domain hold this segment
1519 LbBndCndData& p = m_bndCndData[localSegIndex];
1520 const MInt noEntries = p.noBndCells * p.noVars;
1521 ParallelIo::size_type noEntriesGlobal;
1522 ParallelIo::calcOffset(noEntries, &p.globalOffset, &noEntriesGlobal, m_solver->mpiComm());
1523 const MString name = "bcData_segment" + to_string(i);
1524 // create tmp array only containing non-halo data that are written to target file
1525 MFloatScratchSpace tmp(max(noEntries, 1), AT_, "tmp");
1526 parallelIo.setOffset(noEntries, p.globalOffset);
1527 parallelIo.readArray(&tmp[0], name);
1528 // fill tmp array into data (which also contains halo data)
1529 MInt l = 0;
1530 const MInt offset = m_bndCndOffsets[localSegIndex];
1531 for(MInt j = 0; j < p.noBndCellsWithHalos; j++) {
1532 if(!m_solver->a_isHalo(m_bndCells[j + offset].m_cellId)) {
1533 for(MInt k = 0; k < p.noVars; k++) {
1534 p.data[j * p.noVars + k] = tmp[l * p.noVars + k];
1535 }
1536 l++;
1537 }
1538 }
1539 } else {
1540 // local domain does NOT hold this segment -> only participate in offset calculation
1541 const ParallelIo::size_type noEntries = 0;
1542 ParallelIo::size_type noEntriesGlobal, offset;
1543 ParallelIo::calcOffset(noEntries, &offset, &noEntriesGlobal, m_solver->mpiComm());
1544 const MString name = "bcData_segment" + to_string(i);
1545 MFloat* dummyData = nullptr;
1546 parallelIo.setOffset(noEntries, offset);
1547 parallelIo.readArray(&dummyData[0], name);
1548 }
1549 }
1550 }
1551}
std::vector< MInt > m_mapBndCndSegId2Index
Definition: lbbndcnd.h:162
MInt m_noSegments
Definition: lbbndcnd.h:88
This class is a ScratchSpace.
Definition: scratch.h:758
std::basic_string< char > MString
Definition: maiatypes.h:55
double MFloat
Definition: maiatypes.h:52

◆ bcDataWriteRestartData()

template<MInt nDim>
void LbBndCnd< nDim >::bcDataWriteRestartData ( ParallelIo parallelIo)
private
Author
Miro Gondrum
Date
11.02.2021
Parameters
[in]parallelIoParallel file handler opened in write mode
Note
Needs to be called after bcDataWriteRestartHeader

Definition at line 1470 of file lbbndcnd.cpp.

1470 {
1471 TRACE();
1472 using namespace maia::parallel_io;
1473 for(MInt i = 0; i < m_noSegments; i++) {
1474 if(m_segIdUseBcData[i]) {
1475 const MInt localSegIndex = m_mapBndCndSegId2Index[i];
1476 const MString name = "bcData_segment" + to_string(i);
1477 if(localSegIndex != -1) {
1478 // local domain hold this segment
1479 LbBndCndData& p = m_bndCndData[localSegIndex];
1480 const MInt noEntries = p.noBndCells * p.noVars;
1481 // create tmp array only containing non-halo data that are written to target file
1482 MFloatScratchSpace tmp(max(noEntries, 1), AT_, "tmp");
1483 MInt l = 0;
1484 const MInt offset = m_bndCndOffsets[localSegIndex];
1485 for(MInt j = 0; j < p.noBndCellsWithHalos; j++) {
1486 if(!m_solver->a_isHalo(m_bndCells[j + offset].m_cellId)) {
1487 for(MInt k = 0; k < p.noVars; k++) {
1488 tmp[l * p.noVars + k] = p.data[j * p.noVars + k];
1489 }
1490 l++;
1491 }
1492 }
1493 parallelIo.setOffset(noEntries, p.globalOffset);
1494 parallelIo.writeArray(&tmp[0], name);
1495 } else {
1496 // local domain does NOT hold this segment -> write no data
1497 const MFloat* dummyData = nullptr;
1498 parallelIo.setOffset(0, 0);
1499 parallelIo.writeArray(&dummyData[0], name);
1500 }
1501 }
1502 }
1503}

◆ bcDataWriteRestartHeader()

template<MInt nDim>
void LbBndCnd< nDim >::bcDataWriteRestartHeader ( ParallelIo parallelIo)
private
Author
Miro Gondrum
Date
10.02.2021
Parameters
[in]parallelIoParallel file handler opened in define mode
Note
Needs to be called before bcDataWriteRestartData

Definition at line 1428 of file lbbndcnd.cpp.

1428 {
1429 TRACE();
1430 using namespace maia::parallel_io;
1431 // Here it is looped over all global segment ids. Since most values are only
1432 // set for local segment ids a mapping is performed. In case of local missing
1433 // segment the number of cells per segment is zeroed.
1434 for(MInt i = 0; i < m_noSegments; i++) {
1435 if(m_segIdUseBcData[i]) {
1436 const MInt localSegIndex = m_mapBndCndSegId2Index[i];
1437 if(localSegIndex != -1) {
1438 // local domain hold this segment
1439 LbBndCndData& p = m_bndCndData[localSegIndex];
1440 const ParallelIo::size_type noEntries = p.noBndCells * p.noVars;
1441 ParallelIo::size_type noEntriesGlobal;
1442 ParallelIo::calcOffset(noEntries, &p.globalOffset, &noEntriesGlobal, m_solver->mpiComm());
1443 if(noEntriesGlobal > 0) {
1444 const MString name = "bcData_segment" + to_string(i);
1445 parallelIo.defineArray(PIO_FLOAT, name, noEntriesGlobal);
1446 parallelIo.setAttribute(name, "name", name);
1447 }
1448 } else {
1449 // local domain does NOT hold this segment
1450 const ParallelIo::size_type noEntries = 0;
1451 ParallelIo::size_type noEntriesGlobal, offset;
1452 ParallelIo::calcOffset(noEntries, &offset, &noEntriesGlobal, m_solver->mpiComm());
1453 if(noEntriesGlobal > 0) {
1454 const MString name = "bcData_segment" + to_string(i);
1455 parallelIo.defineArray(PIO_FLOAT, name, noEntriesGlobal);
1456 parallelIo.setAttribute(name, "name", name);
1457 }
1458 }
1459 }
1460 }
1461}

◆ bcIBBNeumannInit()

template<MInt nDim>
virtual void LbBndCnd< nDim >::bcIBBNeumannInit ( MInt  )
inlineprotectedvirtual

Reimplemented in LbBndCndDxQy< nDim, nDist, SysEqn >.

Definition at line 285 of file lbbndcnd.h.

285{};

◆ calculateAveragedNormalAndCenter()

template<MInt nDim>
void LbBndCnd< nDim >::calculateAveragedNormalAndCenter ( MInt  segmentId,
MFloat *const  normal,
MFloat *const  center 
)
privatevirtual

returns the center, the normal and the count of a segment

Author
Andreas Lintermann
Date
14.01.2016
Parameters
[in]segmentIdthe id of the segment to test
[in]normala MFloatScratchSpace to be filled with the avaregaed normal
[in]centera MFloatScratchSpace to be filled with the center
[in]countpointer to a counter

Definition at line 882 of file lbbndcnd.cpp.

882 {
883 TRACE();
884
885 for(MInt d = 0; d < nDim; d++) {
886 normal[d] = 0.0;
887 center[d] = 0.0;
888 }
889
890 MInt offStart = 0;
891 MInt offEnd = 0;
892
893 if(m_solver->m_geometry->m_parallelGeometry) {
894 offStart = m_solver->m_geometry->m_segmentOffsets[segmentId];
895 offEnd = m_solver->m_geometry->m_segmentOffsets[segmentId + 1];
896 } else {
897 offStart = m_solver->m_geometry->m_segmentOffsetsWithoutMB[segmentId];
898 offEnd = m_solver->m_geometry->m_segmentOffsetsWithoutMB[segmentId + 1];
899 }
900 MInt count = 0;
901
902 for(MInt e = offStart; e < offEnd; e++) {
903 GeometryElement<nDim> triangle = m_solver->m_geometry->elements[e];
904 std::array<MFloat, nDim> normal_t;
905
906 // this retrieves the normal either from the STL or recalculates it from the triangle
907 MBool is_valid = (this->*retrieveNormal)(triangle, normal_t.data());
908
909 // make sure that this is a valid triangle, otherwise, skip
910 if(is_valid) {
911 std::array<MFloat, nDim> tmp;
912 for(MInt d = 0; d < nDim; d++)
913 tmp[d] = normal[d] + normal_t[d];
914
915 // this is the dangerous case in which we might go back directly onto the surface again
916 MBool flip = true;
917 for(MInt d = 0; d < nDim; d++)
918 flip = flip && approx(tmp[d], 0.0, MFloatEps);
919
920 if(flip)
921 for(MInt d = 0; d < nDim; d++)
922 normal_t[d] *= -1;
923
924 for(MInt d = 0; d < nDim; d++) {
925 normal[d] += normal_t[d];
926 for(MInt v = 0; v < nDim; v++)
927 center[d] += triangle.m_vertices[v][d];
928 }
929 count++;
930 }
931 }
932
933 // Oha, there seems to be something wrong with the geometry, no normal found!
934 if(count == 0) {
935 stringstream errorMsg;
936 errorMsg << "ERROR: no normal found for segment id " << segmentId << endl;
937 m_log << errorMsg.str();
938 TERMM(1, errorMsg.str());
939 }
940
941 // normalize
942 MFloat avg_normal_len = sqrt(normal[0] * normal[0] + normal[1] * normal[1] + normal[2] * normal[2]);
943
944 for(MInt d = 0; d < nDim; d++) {
945 normal[d] /= avg_normal_len;
946 center[d] /= nDim * count;
947 }
948}
MFloat ** m_vertices
MBool(LbBndCnd::* retrieveNormal)(GeometryElement< nDim > ge, MFloat *normal)
Definition: lbbndcnd.h:199
MBool approx(const T &, const U &, const T)
Definition: functions.h:272
InfoOutFile m_log
bool MBool
Definition: maiatypes.h:58

◆ calculateBndNormals() [1/2]

void LbBndCnd< 3 >::calculateBndNormals ( )
private
Author
Andreas Lintermann
Date
23.01.2013, 27.04.2015, 14.01.2016

For each segment the averaged normal \(n\) is calculated by running over all triangles and adding either the cross-product of the spanning edges or by reading the normals stored in the STL. Additionally the center \(c\) is evaluated by averaging the vertex locations over the number of vertices. Then it is tested if

\[\vec{p}=\vec{c}+d\cdot\vec{n}\]

,

where $d$ is the length of the diagonal of the smallest cell, is inside the geometry (using pointIsInside2 from CartesianGrid).

Definition at line 1305 of file lbbndcnd.cpp.

1305 {
1306 constexpr MInt nDim = 3;
1307 TRACE();
1308
1309 m_log << " - calculating normals in 3D (bndNormalMethod is set to " << m_bndNormalMethod << ")" << endl;
1310
1311 // 1. find out what segments we own and print to log
1312 vector<pair<MInt, MInt>> own_segments;
1313 for(MInt i = 0; i < m_noInOutSegments; i++) {
1314 for(MInt o = 0; o < (MInt)m_bndCndSegIds.size(); o++)
1315 if(m_inOutSegmentsIds[i] == m_bndCndSegIds[o]) {
1316 own_segments.push_back(pair<MInt, MInt>(i, m_inOutSegmentsIds[i]));
1317 break;
1318 }
1319
1320 // initialize all by (0,0,0)
1321 for(MInt d = 0; d < nDim; d++)
1322 m_bndNormals[i][d] = 0.0;
1323 }
1324
1325 if(m_solver->m_geometry->m_parallelGeometry) {
1327 fastParallelGeomNormals3D(own_segments);
1328 else
1329 normalParallelGeomNormals3D(own_segments);
1330 } else {
1331 for(MInt s = 0; s < (MInt)own_segments.size(); s++) {
1332 MInt pos = own_segments[s].first;
1333 MInt segId = own_segments[s].second;
1334 std::array<MFloat, nDim> normal;
1335 std::array<MFloat, nDim> center;
1336 calculateAveragedNormalAndCenter(segId, normal.data(), center.data());
1337
1338 MFloat max_diag = (m_solver->c_cellLengthAtLevel(m_solver->grid().maxUniformRefinementLevel())) * SQRT3;
1339 std::array<MFloat, nDim> test_pt;
1340
1341 for(MInt d = 0; d < nDim; d++)
1342 test_pt[d] = center[d] + normal[d] * max_diag;
1343
1344 updateBndNormals(pos, !m_solver->m_geometry->pointIsInside2(test_pt.data()), normal.data());
1345 m_log << " * segment " << segId << endl;
1346 m_log << " = normal: (" << m_bndNormals[pos][0] << " " << m_bndNormals[pos][1] << " "
1347 << m_bndNormals[pos][2] << ")" << endl;
1348 m_log << " = center: (" << center[0] << " " << center[1] << " " << center[2] << ")" << endl;
1349 }
1350 }
1351}
MString m_bndNormalMethod
Definition: lbbndcnd.h:111
virtual void normalParallelGeomNormals3D(std::vector< std::pair< MInt, MInt > > own_segments)
Definition: lbbndcnd.cpp:1097
MInt m_noInOutSegments
Definition: lbbndcnd.h:86
virtual void calculateAveragedNormalAndCenter(MInt segmentId, MFloat *const normal, MFloat *const center)
Definition: lbbndcnd.cpp:882
MInt m_fastParallelGeomNormals
Definition: lbbndcnd.h:112
virtual void fastParallelGeomNormals3D(std::vector< std::pair< MInt, MInt > > own_segments)
Definition: lbbndcnd.cpp:963
virtual void updateBndNormals(MInt segId, MBool inside, MFloat *avg_normal)
Updates the normals of an inlet/outlet based on inside / outside detection.
Definition: lbbndcnd.cpp:1364

◆ calculateBndNormals() [2/2]

template<MInt nDim>
void LbBndCnd< nDim >::calculateBndNormals
private

Definition at line 1279 of file lbbndcnd.cpp.

1279 {
1280 TRACE();
1281 // TODO labels:LB dxqy: enable also for 2D
1282 std::stringstream ss;
1283 ss << "Calculate boundary normal not implemented for " << nDim << "D, yet !";
1284 TERMM(1, ss.str());
1285}

◆ calculateForces()

template<MInt nDim>
virtual void LbBndCnd< nDim >::calculateForces ( MInt  )
inlineprotectedvirtual

Definition at line 235 of file lbbndcnd.h.

235{};

◆ calculateNormalFromTriangle()

template<MInt nDim>
MBool LbBndCnd< nDim >::calculateNormalFromTriangle ( GeometryElement< nDim >  ge,
MFloat normal 
)
inlineprivate
Author
Andreas Lintermann
Date
27.04.2015

Calculate the normal from a traingle using the cross product. Just in case the normal has a length of 0 false is returned, otherwise true. If invalid, the triangle is skipped for the calculation of the segment normal in calculateBndNormals().

Parameters
[in]gethe GeometryElement (a triangle)
[in]normaladdress of the normal
Returns
the validity of the triangle normal

Definition at line 803 of file lbbndcnd.cpp.

803 {
804 TRACE();
805
806 std::array<MFloat, nDim> edge1;
807 std::array<MFloat, nDim> edge2;
808
809 // the edges
810 for(MInt d = 0; d < nDim; d++) {
811 edge1[d] = ge.m_vertices[1][d] - ge.m_vertices[0][d];
812 edge2[d] = ge.m_vertices[2][d] - ge.m_vertices[0][d];
813 }
814
815 MFloat normal_len = 0.0;
816 for(MInt d = 0; d < nDim; d++) {
817 MInt next = (d + 1) % nDim;
818 MInt nnext = (d + 2) % nDim;
819 normal[d] = edge1[next] * edge2[nnext] - edge1[nnext] * edge2[next];
820 normal_len += normal[d] * normal[d];
821 }
822
823 normal_len = sqrt(normal_len);
824
825 for(MInt d = 0; d < nDim; d++)
826 normal[d] /= normal_len;
827
828 if(approx(normal_len, 0.0, MFloatEps)) {
829 return false;
830 } else {
831 return true;
832 }
833}

◆ calculateVectors()

template<MInt nDim>
virtual void LbBndCnd< nDim >::calculateVectors ( )
privatevirtual

◆ calculateWallDistances()

template<MInt nDim>
virtual void LbBndCnd< nDim >::calculateWallDistances ( )
inlineprotectedvirtual

◆ checkBndNormalDirection()

template<MInt nDim>
virtual void LbBndCnd< nDim >::checkBndNormalDirection ( )
inlineprivatevirtual

Definition at line 207 of file lbbndcnd.h.

207{};

◆ checkForCommBC()

template<MInt nDim>
MInt LbBndCnd< nDim >::checkForCommBC
protectedvirtual
Author
Andreas Lintermann
Date
29.05.2015
Returns
a MBool that defines if such a BC exists or not

Definition at line 2569 of file lbbndcnd.cpp.

2569 {
2570 TRACE();
2571
2572 if(m_solver->m_geometry->m_parallelGeometry) {
2573 set<MInt> tmplist;
2574 for(MInt i = 0; i < m_noSegments; i++)
2575 tmplist.insert(*(m_solver->m_geometry->geometryContext().getProperty("BC", i)->asInt()));
2576 m_noAllBoundaryIds = tmplist.size();
2577 mAlloc(m_allBoundaryIds, m_noAllBoundaryIds, "m_allBoundaryIds", 0, AT_);
2578 MInt pos = 0;
2579 for(set<MInt>::iterator it = tmplist.begin(); it != tmplist.end(); ++it, pos++)
2580 m_allBoundaryIds[pos] = *it;
2581 } else {
2583 m_allBoundaryIds = m_solver->m_geometry->GetBoundaryIds(&m_noAllBoundaryIds);
2584 }
2585
2586 for(MInt i = 0; i < m_noAllBoundaryIds; i++) {
2587 switch(m_allBoundaryIds[i]) {
2588 case 1000: {
2590 break;
2591 }
2592 case 1022: {
2594 break;
2595 }
2596 case 1060: {
2598 break;
2599 }
2600 case 1080: {
2602 break;
2603 }
2604 case 4000: {
2606 break;
2607 }
2608 case 4030: {
2610 break;
2611 }
2612 case 4130: {
2614 break;
2615 }
2616 case 4070: {
2618 break;
2619 }
2620 case 4071: {
2622 break;
2623 }
2624 case 4072: {
2626 break;
2627 }
2628 case 4073: {
2630 break;
2631 }
2632 case 4080: {
2634 break;
2635 }
2636 case 4081: {
2638 break;
2639 }
2640 case 4082: {
2642 break;
2643 }
2644 case 4110: {
2646 break;
2647 }
2648 default: {
2649 }
2650 }
2651 }
2652 return m_numberOfCommBCs;
2653}
MInt * m_allBoundaryIds
Definition: lbbndcnd.h:397
MInt m_noAllBoundaryIds
Definition: lbbndcnd.h:398

◆ checkForCommForce()

template<MInt nDim>
MBool LbBndCnd< nDim >::checkForCommForce
protectedvirtual
Author
Andreas Lintermann
Date
29.05.2015
Returns
a MBool that defines if such a BC exists or not

Definition at line 2407 of file lbbndcnd.cpp.

2407 {
2408 TRACE();
2409
2411 m_allBoundaryIds = m_solver->m_geometry->GetBoundaryIds(&m_noAllBoundaryIds);
2412
2413 for(MInt i = 0; i < m_noAllBoundaryIds; i++) {
2414 switch(m_allBoundaryIds[i]) {
2415 case 2000: {
2416 return true;
2417 // The following statement was commented since it is not reachable. Remove if not needed anymore.
2418 // break;
2419 }
2420 default: {
2421 }
2422 }
2423 }
2424 return false;
2425}

◆ createBoundaryCells()

template<MInt nDim>
void LbBndCnd< nDim >::createBoundaryCells
privatevirtual
Author
Andreas Lintermann
Date
29.01.2010

This function runs over all cells and makes an intersection test with the triangles of nearby segments. All candidates carry a segment id and a boundary condition. Hence, a corner cell can have multiple properties. Depending on the allowance of multiple BCs, only one single (no multiple BCs allowed) boundary cell is added to a temporary vector. Anyhow, the boundary cell can carry multiple information on segment id and boundary condition. In this case the wall boundary condition is chosen by setting the first element of both the boundary condition array and the segment id to this wall condition. In the other case of multiple BCs, the boundary cell is added multiple times to the vector of temporary boundary cells, each time with its according different conditions. After that, the collector of boundary cells is initialized. The size is now known by the size of the temporary vector. Finally, the information in the vector is copied to the collector.

Definition at line 3207 of file lbbndcnd.cpp.

3207 {
3208 TRACE();
3209
3210 NEW_SUB_TIMER(t_createBCCells, "create boundary cells", m_t_BCAll);
3211 RECORD_TIMER_START(t_createBCCells);
3212
3213 MInt bndCellsIt = 0, bndCellsIt2 = 0;
3214 MFloat cellHalfLength = 0.0;
3215 ScratchSpace<MFloat> target(2 * nDim, AT_, "target");
3216
3217 m_log << " + Creating boundary cells..." << endl;
3218 m_log << " - Multiple BC treatment: " << m_multiBCTreatment << endl;
3219
3220 // This temporary, has to be filled into m_bndCells later on
3221 for(MInt i = 0; i < m_solver->m_cells.size(); i++) {
3222 // skip inActive cells (neither leaf nor interfaceParent)
3223 if(!m_solver->c_isLeafCell(i) && !m_solver->a_isInterfaceParent(i)) continue;
3224
3225 // Define corners of current cell in target
3226 for(MInt j = 0; j < nDim; j++) {
3227 cellHalfLength = m_solver->c_cellLengthAtLevel(m_solver->a_level(i) + 1);
3228 target[j] = m_solver->a_coordinate(i, j) - cellHalfLength;
3229 target[j + nDim] = m_solver->a_coordinate(i, j) + cellHalfLength;
3230 }
3231
3232 // Check for intersection with geometry elements
3233 MFloat* targetPtr = &target[0];
3234 std::vector<MInt> nodeList;
3235 if(m_gridCutTest == "SAT")
3236 m_solver->m_geometry->getIntersectionElements(targetPtr, nodeList, cellHalfLength, &m_solver->a_coordinate(i, 0));
3237 else
3238 m_solver->m_geometry->getIntersectionElements(targetPtr, nodeList);
3239 const MInt noNodes = nodeList.size();
3240
3241 if(noNodes > 0) {
3242 m_solver->a_onlyBoundary(i) = true;
3243 m_solver->a_isBndryCell(i) = true;
3244
3245 // Create a new boundary cell for our found cuts
3246 m_bndCells.emplace_back();
3247
3248 bndCellsIt = m_bndCells.size() - 1;
3249 m_bndCells[bndCellsIt].m_cellId = i;
3250
3251 // Fill the segmentIds of the boundary cell
3252 for(MInt j = 0; j < noNodes; j++) {
3253 MBool already_in = false;
3254 for(MInt k = 0; k < (MInt)(m_bndCells[bndCellsIt].m_segmentId.size()); k++)
3255 if(m_bndCells[bndCellsIt].m_segmentId[k] == m_solver->m_geometry->elements[nodeList[j]].m_segmentId) {
3256 already_in = true;
3257 break;
3258 }
3259 if(!already_in) {
3260 m_bndCells[bndCellsIt].m_segmentId.push_back(m_solver->m_geometry->elements[nodeList[j]].m_segmentId);
3261 m_bndCells[bndCellsIt].m_bndCndId.push_back(m_solver->m_geometry->elements[nodeList[j]].m_bndCndId);
3262 }
3263 }
3264
3265 if(m_bndCells[bndCellsIt].m_segmentId.size() > 1) {
3266 // exists inout / wall / periodic ?
3267 MInt positions[3] = {-1, -1, -1};
3268
3269 for(MInt j = 0; j < (MInt)(m_bndCells[bndCellsIt].m_segmentId.size()); j++) {
3270 MBool is_inout = false;
3271 MBool is_periodic = false;
3272
3273 for(MInt k = 0; k < m_noInOutSegments; k++)
3274 if(m_bndCells[bndCellsIt].m_segmentId[j] == m_inOutSegmentsIds[k]) {
3275 is_inout = true;
3276 break;
3277 }
3278 if(m_noPeriodicSegments != 0)
3279 for(MInt k = 0; k < m_noPeriodicSegments; k++)
3280 if(m_bndCells[bndCellsIt].m_segmentId[j] == m_periodicSegmentsIds[k]) {
3281 is_periodic = true;
3282 break;
3283 }
3284 if(is_inout)
3285 positions[0] = j;
3286 else if(!is_inout && !is_periodic)
3287 positions[1] = j;
3288 else if(is_periodic)
3289 positions[2] = j;
3290 }
3291
3292 MInt swap_pos = 0;
3293 if(m_multiBCTreatment == "W-P-I") {
3294 // Make wall first (if exists)
3295 if(positions[1] != -1) swap_pos = positions[1];
3296 // Make periodic first (if exists)
3297 else if(positions[2] != -1)
3298 swap_pos = positions[2];
3299
3300 } else if(m_multiBCTreatment == "W-I-P") {
3301 // Make wall first (if exists)
3302 if(positions[1] != -1) swap_pos = positions[1];
3303 // Make inout first (if exists)
3304 else if(positions[0] != -1)
3305 swap_pos = positions[0];
3306 } else if(m_multiBCTreatment == "I-W-P") {
3307 // Make inout first (if exists)
3308 if(positions[0] != -1) swap_pos = positions[0];
3309 // Make wall first (if exists)
3310 else if(positions[1] != -1)
3311 swap_pos = positions[1];
3312 } else if(m_multiBCTreatment == "I-P-W") {
3313 // Make inout first (if exists)
3314 if(positions[0] != -1) swap_pos = positions[0];
3315 // Make periodic first (if exists)
3316 else if(positions[2] != -1)
3317 swap_pos = positions[2];
3318 } else if(m_multiBCTreatment == "P-W-I") {
3319 // Make periodic first (if exists)
3320 if(positions[2] != -1) swap_pos = positions[2];
3321 // Make wall first (if exists)
3322 else if(positions[1] != -1)
3323 swap_pos = positions[1];
3324 } else if(m_multiBCTreatment == "P-I-W") {
3325 // Make periodic first (if exists)
3326 if(positions[2] != -1) swap_pos = positions[2];
3327 // Make inout first (if exists)
3328 else if(positions[0] != -1)
3329 swap_pos = positions[0];
3330 }
3331
3332 /********************************/
3333 /* Georg 24.06.2010 */
3334 /* */
3335 /********************************/
3336 else if(m_multiBCTreatment == "multiple") {
3337 // Add the bndCell n more times according to the number of different bc's.
3338 // No sorting of segmentIds is applied.
3339
3340 bndCellsIt2 = bndCellsIt;
3341 for(MInt j = 1; j < (MInt)(m_bndCells[bndCellsIt].m_segmentId.size()); j++) {
3342 // make sure that m_bndCells are only added if there is another bc
3343 MBool already_in = false;
3344 for(MInt k = 0; k <= (bndCellsIt2 - bndCellsIt); k++) {
3345 if(m_bndCells[bndCellsIt].m_bndCndId[bndCellsIt2 - bndCellsIt] == m_bndCells[bndCellsIt].m_bndCndId[j]) {
3346 already_in = true;
3347 break;
3348 }
3349 }
3350
3351 if(!already_in) {
3352 bndCellsIt2++;
3353 m_bndCells.emplace_back(); // add new m_bndCells
3354 m_bndCells[bndCellsIt2].m_cellId = i; // new m_bndCells has the same cellId as the previous one
3355
3356 m_bndCells[bndCellsIt2].m_segmentId.push_back(m_bndCells[bndCellsIt].m_segmentId[j]);
3357 m_bndCells[bndCellsIt2].m_bndCndId.push_back(m_bndCells[bndCellsIt].m_bndCndId[j]);
3358
3359 // m_bndCells[bndCellsIt2].m_segmentId[0] = m_bndCells[bndCellsIt].m_segmentId[j];
3360 // m_bndCells[bndCellsIt2].m_bndCndId[0] = m_bndCells[bndCellsIt].m_bndCndId[j];
3361 }
3362 }
3363 }
3364
3365 MInt tmp = m_bndCells[bndCellsIt].m_segmentId[0];
3366 m_bndCells[bndCellsIt].m_segmentId[0] = m_bndCells[bndCellsIt].m_segmentId[swap_pos];
3367 m_bndCells[bndCellsIt].m_segmentId[swap_pos] = tmp;
3368
3369 tmp = m_bndCells[bndCellsIt].m_bndCndId[0];
3370 m_bndCells[bndCellsIt].m_bndCndId[0] = m_bndCells[bndCellsIt].m_bndCndId[swap_pos];
3371 m_bndCells[bndCellsIt].m_bndCndId[swap_pos] = tmp;
3372 }
3373 }
3374 }
3375
3376 m_log << " - noBndCells: " << m_bndCells.size() << endl << endl;
3377
3378 for(auto& bndCell : m_bndCells) {
3379 bndCell.m_multiplier = 1.0;
3380 }
3381
3382 RECORD_TIMER_STOP(t_createBCCells);
3383}
MInt m_t_BCAll
Definition: lbbndcnd.h:219
MInt m_noPeriodicSegments
Definition: lbbndcnd.h:87
MString m_gridCutTest
Definition: lbbndcnd.h:132
MString m_multiBCTreatment
Definition: lbbndcnd.h:115
MInt * m_periodicSegmentsIds
Definition: lbbndcnd.h:92

◆ createChannelBoundaries()

template<MInt nDim>
virtual void LbBndCnd< nDim >::createChannelBoundaries ( )
inlineprotectedvirtual

Definition at line 239 of file lbbndcnd.h.

239{};

◆ createMBComm()

template<MInt nDim>
void LbBndCnd< nDim >::createMBComm
virtual
Author
Moritz Waldmann
Date
21.10.2019

firstInit &&

Definition at line 3416 of file lbbndcnd.cpp.

3416 {
3417 TRACE();
3418
3419 if(!m_calcWallForces) return;
3420
3421 if(!m_solver->grid().isActive()) {
3422 return;
3423 }
3424
3425 if(m_solver->noDomains() > 1) {
3426 if( (m_BCWallMBComm != MPI_COMM_NULL)) {
3427 MPI_Comm_free(&m_BCWallMBComm, AT_, "m_BCWallMBComm");
3428 }
3429
3430 m_allDomainsCalcForceMB[m_solver->domainId()] = m_solver->m_currentNoG0Cells;
3431
3432 if(!m_BCWallMBNeighbors.empty()) m_BCWallMBNeighbors.clear();
3433
3434 // unfortunately a global communication is requried
3435 MInt* const sndBuf = &(m_allDomainsCalcForceMB[m_solver->domainId()]);
3436 MPI_Allgather(sndBuf, 1, MPI_INT, m_allDomainsCalcForceMB, 1, MPI_INT, m_solver->mpiComm(), AT_, "sendBuf",
3437 "m_allDomainsCalcForceMB");
3438
3439 // for(MInt count = 0; count < m_solver->noDomains(); count++) {
3440 // if(m_allDomainsCalcForceMB[count] != 0)
3441 // m_log << " Domain[" << count << "] carries " << m_allDomainsCalcForceMB[count] << " MB cells. " <<
3442 // endl;
3443 // }
3444 for(MInt i = 0; i < m_solver->noDomains(); i++) {
3445 if(m_allDomainsCalcForceMB[i] > 0) {
3446 m_BCWallMBNeighbors.push_back(i);
3447 }
3448 }
3449
3451
3452 MIntScratchSpace ptBCWallMBNeighbors(m_noBCWallMBNeighbors, AT_, "ptBCWallMBNeighbors");
3453 for(MInt i = 0; i < m_noBCWallMBNeighbors; i++)
3454 ptBCWallMBNeighbors[i] = m_BCWallMBNeighbors[i];
3455
3456 // build a new communicator
3457 if(m_noBCWallMBNeighbors != 0) {
3458 MPI_Group tmp_groupMB, BCGroupMB;
3459 MPI_Comm_group(m_solver->mpiComm(), &tmp_groupMB, AT_, "tmp_groupMB");
3460 MPI_Group_incl(tmp_groupMB, m_noBCWallMBNeighbors, ptBCWallMBNeighbors.getPointer(), &BCGroupMB, AT_);
3461
3462 MPI_Comm_create(m_solver->mpiComm(), BCGroupMB, &m_BCWallMBComm, AT_, "m_BCWallMBComm");
3463 MPI_Group_free(&tmp_groupMB, AT_);
3464 MPI_Group_free(&BCGroupMB, AT_);
3465 if(m_solver->domainId() == m_BCWallMBNeighbors[0]) {
3466 m_forceFile = "forcesMB.log";
3467 // Write header
3468 std::FILE* forceFile;
3469 forceFile = fopen(m_forceFile.c_str(), "a+");
3470 fprintf(forceFile, "# Re=%f, Ma=%f, refLength_LB=%f, dx(maxLvl)=%e\n", m_solver->m_Re, m_solver->m_Ma,
3471 m_solver->m_referenceLength, m_solver->c_cellLengthAtLevel(m_solver->maxLevel()));
3472 fprintf(forceFile, "#");
3473 fprintf(forceFile, "%s\t", "1:timeStep");
3474 constexpr MInt columnLength = 15;
3475 fprintf(forceFile, "%*s\t", columnLength, "2:F_x");
3476 fprintf(forceFile, "%*s\t", columnLength, "3:F_y");
3477 if(nDim == 3) {
3478 fprintf(forceFile, "%*s\t", columnLength, "4:F_z");
3479 }
3480 fprintf(forceFile, "\n");
3481 fclose(forceFile);
3482 }
3483 }
3484
3485 } else {
3487 m_BCWallMBNeighbors.push_back(m_solver->domainId());
3488 }
3489}
MPI_Comm m_BCWallMBComm
Definition: lbbndcnd.h:412
MBool m_calcWallForces
Definition: lbbndcnd.h:97
MInt * m_allDomainsCalcForceMB
Definition: lbbndcnd.h:410
std::vector< MInt > m_BCWallMBNeighbors
Definition: lbbndcnd.h:417
MString m_forceFile
Definition: lbbndcnd.h:416
MInt m_noBCWallMBNeighbors
Definition: lbbndcnd.h:413
int MPI_Comm_free(MPI_Comm *comm, const MString &name, const MString &varname)
same as MPI_Comm_free, but updates the number of MPI communicators
int MPI_Comm_create(MPI_Comm comm, MPI_Group group, MPI_Comm *newcomm, const MString &name, const MString &varname)
same as MPI_Comm_create, but updates the number of MPI communicators
int MPI_Group_incl(MPI_Group group, int n, const int ranks[], MPI_Group *newgroup, const MString &name)
same as MPI_Group_incl
int MPI_Comm_group(MPI_Comm comm, MPI_Group *group, const MString &name, const MString &varname)
same as MPI_Comm_group
int MPI_Allgather(const void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, MPI_Comm comm, const MString &name, const MString &sndvarname, const MString &rcvvarname)
same as MPI_Allgather
int MPI_Group_free(MPI_Group *group, const MString &name)
same as MPI_Group_free

◆ fastParallelGeomNormals3D()

template<MInt nDim>
void LbBndCnd< nDim >::fastParallelGeomNormals3D ( std::vector< std::pair< MInt, MInt > >  own_segments)
privatevirtual

Caluates the normal for one participatiung process for an in/outlet BC and distributes

Author
Andreas Lintermann
Date
12.06.2016

Only one process in the BC communicator performs a normal calculation and uses this to generate a point in the center of gravity. It is then checked if this point is inside/outside the geometry to define the boundary normal.

param[in] own_segments is a vector of tuples of positions and segmentId

Definition at line 963 of file lbbndcnd.cpp.

963 {
964 TRACE();
965
966 MIntScratchSpace numAllOwners(m_solver->noDomains(), AT_, "numAllOwners");
967 for(MInt d = 0; d < m_solver->noDomains(); d++)
968 numAllOwners[d] = 0;
969 numAllOwners[m_solver->domainId()] = own_segments.size();
970
971 MPI_Allreduce(MPI_IN_PLACE, numAllOwners.getPointer(), m_solver->noDomains(), MPI_INT, MPI_SUM, m_solver->mpiComm(),
972 AT_, "MPI_IN_PLACE", "numAllOwners.getPointer()");
973
974 MInt sumOwners = 0;
975 MInt myOffsetStart = 0;
976 for(MInt d = 0; d < m_solver->noDomains(); d++) {
977 if(d == m_solver->domainId()) myOffsetStart = sumOwners;
978 sumOwners += numAllOwners[d];
979 }
980
981 // calculate my local normal and the test point (used later) and print to log
982 MFloatScratchSpace test_pts(sumOwners * nDim, AT_, "test_pts");
983 MIntScratchSpace io(sumOwners * nDim, AT_, "io");
984 for(MInt i = 0; i < sumOwners * nDim; i++) {
985 test_pts[i] = 0.0;
986 io[i] = 0;
987 }
988
989 for(MInt s = 0; s < (MInt)own_segments.size(); s++) {
990 MInt pos = own_segments[s].first;
991 MInt segId = own_segments[s].second;
992 MInt posInTestPts = (myOffsetStart + s) * nDim;
993
994 std::array<MFloat, nDim> normal;
995 std::array<MFloat, nDim> center;
996 calculateAveragedNormalAndCenter(segId, normal.data(), center.data());
997
998 MFloat max_diag = (m_solver->c_cellLengthAtLevel(m_solver->grid().maxUniformRefinementLevel())) * SQRT3;
999
1000 for(MInt d = 0; d < nDim; d++) {
1001 test_pts[posInTestPts + d] = center[d] + normal[d] * max_diag;
1002 m_bndNormals[pos][d] = normal[d];
1003 }
1004
1005 m_log << " * local values for segment " << segId << endl;
1006 m_log << " = local normal: (" << normal[0] << " " << normal[1];
1007 if constexpr(nDim == 3) m_log << " " << normal[2];
1008 m_log << ")" << endl;
1009 m_log << " = local center: (" << center[0] << " " << center[1];
1010 if constexpr(nDim == 3) m_log << " " << center[2];
1011 m_log << ")" << endl;
1012 m_log << " = local test point: (" << test_pts[posInTestPts] << " " << test_pts[posInTestPts + 1] << " "
1013 << test_pts[posInTestPts + 2] << endl;
1014 }
1015
1016 MPI_Allreduce(MPI_IN_PLACE, test_pts.getPointer(), sumOwners * nDim, MPI_DOUBLE, MPI_SUM, m_solver->mpiComm(), AT_,
1017 "MPI_IN_PLACE", "test_pts.getPointer()");
1018
1019 // this runs bascially over all test points and checks for each domain if there exist intersections with the geometry
1020 for(MInt i = 0; i < sumOwners; i++) {
1021 MInt pos = i * nDim;
1022 vector<vector<MInt>> int_nodes;
1023 m_solver->m_geometry->determineRayIntersectedElements(&test_pts[pos], &int_nodes);
1024
1025 // now for each direction we need to know if the original ids are unique
1026 for(MInt d = 0; d < nDim; d++) {
1027 // this will contain the number of intersections per domain
1028 MIntScratchSpace doms_with_ints(m_solver->noDomains(), AT_, "doms_with_ints");
1029 for(MInt dom = 0; dom < m_solver->noDomains(); dom++)
1030 doms_with_ints[dom] = 0;
1031
1032 doms_with_ints[m_solver->domainId()] = int_nodes[d].size();
1033
1034 // after the following doms_with_ints contains for each process the number of intersection for direcetion d
1035 MPI_Allreduce(MPI_IN_PLACE, doms_with_ints.getPointer(), m_solver->noDomains(), MPI_INT, MPI_SUM,
1036 m_solver->mpiComm(), AT_, "MPI_IN_PLACE", "doms_with_ints.getPointer()");
1037
1038 MInt no_allCuts = 0;
1039 MInt myOff = 0;
1040 for(MInt dom = 0; dom < m_solver->noDomains(); dom++)
1041 no_allCuts += doms_with_ints[dom];
1042
1043 for(MInt dom = 0; dom < m_solver->domainId(); dom++)
1044 myOff += doms_with_ints[dom];
1045
1046 MIntScratchSpace origCmps(no_allCuts, AT_, "origCmps");
1047 for(MInt l = 0; l < no_allCuts; l++)
1048 origCmps[l] = 0;
1049
1050 for(MInt l = 0; l < (MInt)int_nodes[d].size(); l++)
1051 origCmps[myOff + l] = m_solver->m_geometry->elements[int_nodes[d][l]].m_originalId;
1052
1053 MPI_Allreduce(MPI_IN_PLACE, origCmps.getPointer(), no_allCuts, MPI_INT, MPI_SUM, m_solver->mpiComm(), AT_,
1054 "MPI_IN_PLACE", "origCmps.getPointer()");
1055
1056 set<MInt> uniques;
1057 for(MInt l = 0; l < no_allCuts; l++)
1058 uniques.insert(origCmps[l]);
1059
1060 io[i * nDim + d] = uniques.size();
1061 }
1062 }
1063
1064 // summarize the number of cuts to dermine the global inside/outside
1065 MPI_Allreduce(MPI_IN_PLACE, io.getPointer(), sumOwners * nDim, MPI_INT, MPI_SUM, m_solver->mpiComm(), AT_,
1066 "MPI_IN_PLACE", "io.getPointer()");
1067
1068 for(MInt s = 0; s < (MInt)own_segments.size(); s++) {
1069 MInt p = own_segments[s].first;
1070 MInt posInTestPts = (myOffsetStart + s) * nDim;
1071 MInt sum = 0;
1072
1073 for(MInt d = 0; d < nDim; d++)
1074 sum += io[posInTestPts + d];
1075
1076 MBool is_inside = sum % 2;
1077
1078 updateBndNormals(p, is_inside, m_bndNormals[p]);
1079 m_log << " * segment " << m_inOutSegmentsIds[p] << endl;
1080 m_log << " = normal: (" << m_bndNormals[p][0] << " " << m_bndNormals[p][1] << " " << m_bndNormals[p][2]
1081 << ")" << endl;
1082 }
1083}
int MPI_Allreduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm, const MString &name, const MString &sndvarname, const MString &rcvvarname)
same as MPI_Allreduce

◆ findBndCnd()

template<MInt nDim>
MInt LbBndCnd< nDim >::findBndCnd ( MInt  index)
protectedvirtual
Author
Andreas Lintermann
Date
27.01.2010

The function simply runs over the the array containing the segment ids of the boundaries that are inflow/outflow and checks if in the original array of all boundary cell at a given offset this segment id is found.

Definition at line 1388 of file lbbndcnd.cpp.

1388 {
1389 TRACE();
1390
1391 MInt ind = -1;
1392 for(MInt i = 0; i < m_noInOutSegments; i++)
1393 if(m_bndCells[m_bndCndOffsets[index]].m_segmentId[0] == m_inOutSegmentsIds[i]) ind = i;
1394
1395 return ind;
1396}

◆ getNormalFromSTL()

template<MInt nDim>
MBool LbBndCnd< nDim >::getNormalFromSTL ( GeometryElement< nDim >  ge,
MFloat normal 
)
inlineprivate
Author
Andreas Lintermann
Date
27.04.2015

Gets the normal directly from the STL information. Just in case the normal has a length of 0 false is returned, otherwise true. If invalid, the triangle is skipped for the calculation of the segment normal in calculateBndNormals().

Parameters
[in]gethe GeometryElement (a triangle)
[in]normaladdress of the normal
Returns
the validity of the triangle normal

Definition at line 851 of file lbbndcnd.cpp.

851 {
852 TRACE();
853
854 MFloat normal_len = 0.0;
855 for(MInt d = 0; d < nDim; d++) {
856 normal[d] = ge.m_normal[d];
857 normal_len += normal[d] * normal[d];
858 }
859
860 normal_len = sqrt(normal_len);
861
862 for(MInt d = 0; d < nDim; d++)
863 normal[d] /= normal_len;
864 if(approx(normal_len, 0.0, MFloatEps))
865 return false;
866 else
867 return true;
868}

◆ GetWithDef()

template<MInt nDim>
template<typename K , typename V >
V LbBndCnd< nDim >::GetWithDef ( const std::map< K, V > &  m,
const K &  key,
const V &  defval 
)
inlineprotected

Definition at line 74 of file lbbndcnd.h.

74 {
75 typename std::map<K, V>::const_iterator it = m.find(key);
76 if(it == m.end()) {
77 return defval;
78 } else {
79 return it->second;
80 }
81 }

◆ initializeBcData()

template<MInt nDim>
void LbBndCnd< nDim >::initializeBcData
Author
Miro Gondrum
Date
09.02.2021

Definition at line 3390 of file lbbndcnd.cpp.

3390 {
3391 // Initialize BC
3392 for(MInt i = 0; i < (MInt)(m_bndCndIds.size()); i++) {
3393 (this->*bndCndInitiator[i])(i);
3394 }
3395 if(!m_solver->m_restartFile) {
3396 for(auto p : m_bndCndData) {
3397 const MInt& p_index = p.first;
3398 const LbBndCndData& p_data = p.second;
3399 const MInt bndCndOffset = m_bndCndOffsets[p_index];
3400 for(MInt i = 0; i < p_data.noBndCellsWithHalos; i++) {
3401 for(MInt j = 0; j < p_data.noVars; j++) {
3402 p_data.data[i * p_data.noVars + j] = m_solver->a_oldVariable(m_bndCells[i + bndCndOffset].m_cellId, j);
3403 }
3404 }
3405 }
3406 }
3407}
MInt noBndCellsWithHalos
number of boundary cells represented in data
Definition: lbbndcnd.h:29
MInt noVars
number of variables that are stored for BC
Definition: lbbndcnd.h:30
MFloat * data
pointer the relevant data
Definition: lbbndcnd.h:32

◆ initializeBndMovingBoundaries()

template<MInt nDim>
void LbBndCnd< nDim >::initializeBndMovingBoundaries
virtual
Author
Moritz Waldmann
Date
21.10.2019

Definition at line 3498 of file lbbndcnd.cpp.

3498 {
3499 TRACE();
3500
3501 //#####################################################################
3502 // Allocate space for pointer lists which store the boundary functions
3503 //#####################################################################
3504
3505 m_log << " + Setting the boundary condition handler for LB_LS..." << endl << endl;
3506 bndCndHandlerVariables_MB.resize(1);
3508 bndCndHandlerRHS_MB.resize(1);
3509 // TODO labels:LB,toenhance Generalize the configuration of mb bnd cnd
3510 // Use real boundary conditions for InitGFieldFromSTL stls ??
3512 /*if(m_solver->m_bernoulliBeam)
3513 bndCndHandlerRHS_MB[0] = &LbBndCnd::bc66667;*/
3514 // Free surface
3515 // bndCndHandlerRHS_MB[0] = &LbBndCnd::bc66668;
3516
3517 //#####################################################################
3518 // Allocation of all lists needed
3519 // Setting the required constants
3520 //#####################################################################
3521
3522 // Create Communicator
3523 mAlloc(m_allDomainsCalcForceMB, m_solver->noDomains(), "m_allDomainsCalcForceMB", 0, AT_);
3524
3525 //#####################################################################
3526 // Create Communicator
3527 //#####################################################################
3528
3529 m_BCWallMBComm = MPI_COMM_NULL;
3530}
virtual void bc0(MInt)
Definition: lbbndcnd.h:241
virtual void bc66666(MInt)
Definition: lbbndcnd.h:370
std::vector< BndCndHandler_Mb > bndCndHandlerRHS_MB
Definition: lbbndcnd.h:67
std::vector< BndCndHandler > bndCndHandlerVariables_MB
Definition: lbbndcnd.h:66

◆ initMembers()

template<MInt nDim>
virtual void LbBndCnd< nDim >::initMembers ( )
privatevirtual

◆ normalParallelGeomNormals3D()

template<MInt nDim>
void LbBndCnd< nDim >::normalParallelGeomNormals3D ( std::vector< std::pair< MInt, MInt > >  own_segments)
privatevirtual

Caluates the normal for all participatiung process for an in/outlet BC and avarages

Author
Andreas Lintermann
Date
12.06.2016

Each process in the BC communicator generates a normal from the triangles and then avarages it together with the other participating processes. All of them furthermore run the inside-outside determination.

param[in] own_segments is a vector of tuples of positions and segmentId

Definition at line 1097 of file lbbndcnd.cpp.

1097 {
1098 TRACE();
1099
1100 MIntScratchSpace allDoOwn(m_noInOutSegments, AT_, "allDoOwn");
1101 MIntScratchSpace IDoOwn(m_noInOutSegments, AT_, "IDoOwn");
1102 MFloatScratchSpace test_pts(m_noInOutSegments, nDim, AT_, "test_pts");
1103
1104 for(MInt i = 0; i < m_noInOutSegments; i++)
1105 for(MInt d = 0; d < nDim; d++)
1106 test_pts(i, d) = 0.0;
1107
1108 for(MInt i = 0; i < m_noInOutSegments; i++)
1109 IDoOwn[i] = 0;
1110
1111 for(MInt s = 0; s < (MInt)own_segments.size(); s++)
1112 IDoOwn[own_segments[s].first] = 1;
1113
1114
1115 MPI_Allreduce(IDoOwn.getPointer(), allDoOwn.getPointer(), m_noInOutSegments, MPI_INT, MPI_SUM, m_solver->mpiComm(),
1116 AT_, "IDoOwn.getPointer()", "allDoOwn.getPointer()");
1117
1118 // calculate my local normal and the test point (used later) and print to log
1119 for(MInt s = 0; s < (MInt)own_segments.size(); s++) {
1120 MInt pos = own_segments[s].first;
1121 MInt segId = own_segments[s].second;
1122
1123 std::array<MFloat, nDim> normal;
1124 std::array<MFloat, nDim> center;
1125 calculateAveragedNormalAndCenter(segId, normal.data(), center.data());
1126
1127 MFloat max_diag = (m_solver->c_cellLengthAtLevel(m_solver->grid().maxUniformRefinementLevel())) * SQRT3;
1128
1129 for(MInt d = 0; d < nDim; d++) {
1130 test_pts(pos, d) = center[d] + normal[d] * max_diag;
1131 m_bndNormals[pos][d] = normal[d];
1132 }
1133
1134 m_log << " * local values for segment " << segId << endl;
1135 m_log << " = local normal: (" << normal[0] << " " << normal[1];
1136 if constexpr(nDim == 3) m_log << " " << normal[2];
1137 m_log << ")" << endl;
1138 m_log << " = local center: (" << center[0] << " " << center[1];
1139 if constexpr(nDim == 3) m_log << " " << center[2];
1140 m_log << ")" << endl;
1141 m_log << " = local test point: (" << test_pts(pos, 0) << " " << test_pts(pos, 1) << " " << test_pts(pos, 2)
1142 << endl;
1143 }
1144
1145 // this is now for all the others
1146
1147 // count the number of non-single entries in allDoOwn
1148 // also store the roots of segment ids for domains that own the segment completely
1149 MIntScratchSpace owner_roots(m_solver->noDomains(), AT_, "owner_roots");
1150 MInt numComm = 0;
1151 vector<MInt> posToComm;
1152 for(MInt i = 0; i < m_noInOutSegments; i++) {
1153 if(allDoOwn[i] == 1 && IDoOwn[i] == 1)
1154 owner_roots[m_solver->domainId()] = i;
1155 else
1156 owner_roots[m_solver->domainId()] = -1;
1157
1158 if(allDoOwn[i] > 1) {
1159 posToComm.push_back(i);
1160 numComm++;
1161 }
1162 }
1163
1164 // create the communicators
1165 vector<MPI_Comm> comms;
1166 for(MInt i = 0; i < numComm; i++) {
1167 MInt pos = posToComm[i];
1168
1169 // place holders for all owners
1170 MInt sumowners = 0;
1171 MInt firstOwner = -1;
1172 MIntScratchSpace owners(m_solver->noDomains(), AT_, "owners");
1173 MPI_Comm tmpComm;
1174
1175 // first determine all owners
1176 m_solver->m_geometry->determineSegmentOwnership(m_inOutSegmentsIds[pos], &IDoOwn[pos], &sumowners, &firstOwner,
1177 owners.getPointer());
1178
1179 if(m_solver->domainId() == firstOwner) owner_roots[m_solver->domainId()] = pos;
1180 m_log << " * creating MPI communicators for segment " << m_inOutSegmentsIds[pos] << endl;
1181 m_log << " = sum of owners: " << sumowners << endl;
1182 m_log << " = root of communication: " << firstOwner << endl;
1183 m_log << " = owners: ";
1184 for(MInt d = 0; d < m_solver->noDomains(); d++)
1185 if(owners[d] > 0) m_log << d << " ";
1186 m_log << endl;
1187
1188 // build communicator for the subgroup
1189 m_solver->createMPIComm(owners.getPointer(), sumowners, &tmpComm);
1190 comms.push_back(tmpComm);
1191 }
1192 MPI_Allreduce(MPI_IN_PLACE, owner_roots.getPointer(), m_solver->noDomains(), MPI_INT, MPI_SUM, m_solver->mpiComm(),
1193 AT_, "MPI_IN_PLACE", "owner_roots.getPointer()");
1194
1195 // do the exchange
1196 for(MInt i = 0; i < numComm; i++) {
1197 MInt p = posToComm[i];
1198 // I am an owner, I need to participate in the communication
1199 if(IDoOwn[p]) {
1200 // sum the normals and test points and average
1201 MFloatScratchSpace testenv(2 * nDim, AT_, "testenv");
1202 MInt j = 0;
1203 for(MInt d = 0; d < nDim; d++, j++)
1204 testenv[j] = m_bndNormals[p][d];
1205 for(MInt d = 0; d < nDim; d++, j++)
1206 testenv[j] = test_pts(p, d);
1207
1208 MPI_Allreduce(MPI_IN_PLACE, testenv.getPointer(), 2 * nDim, MPI_DOUBLE, MPI_SUM, comms[i], AT_, "MPI_IN_PLACE",
1209 "testenv.getPointer()");
1210
1211 MInt size;
1212 MPI_Comm_size(comms[i], &size);
1213
1214 // average over the number of domains
1215 for(MInt d = 0; d < 2 * nDim; d++)
1216 testenv[d] /= size;
1217
1218 // now testenv contains the averaged normal and the averaged test point
1219 // copy back to original position
1220 j = 0;
1221 for(MInt d = 0; d < nDim; d++, j++)
1222 m_bndNormals[i][d] = testenv[j];
1223 for(MInt d = 0; d < nDim; d++, j++)
1224 test_pts(p, d) = testenv[j];
1225 }
1226 }
1227
1228 // at this position all domains owning (a piece) of a segment have their normal and test point available
1229
1230 // now test all the test points
1231 // allocate space on all domains for the testing points
1232 MFloatScratchSpace rec_test_pts(nDim * m_noInOutSegments, AT_, "rec_test_pts");
1233 for(MInt i = 0; i < nDim * m_noInOutSegments; i++)
1234 rec_test_pts[i] = 0.0;
1235
1236 for(MInt d = 0; d < m_solver->noDomains(); d++) {
1237 MInt segInOut = owner_roots[m_solver->domainId()];
1238 if(segInOut >= 0) {
1239 MInt p = segInOut * nDim;
1240 for(MInt k = 0; k < nDim; k++)
1241 rec_test_pts[p + k] = test_pts(segInOut, k);
1242 }
1243 }
1244
1245 MPI_Allreduce(MPI_IN_PLACE, rec_test_pts.getPointer(), nDim * m_noInOutSegments, MPI_DOUBLE, MPI_SUM,
1246 m_solver->mpiComm(), AT_, "MPI_IN_PLACE", "rec_test_pts.getPointer()");
1247
1248 // now perform inside/outside determination
1249 MIntScratchSpace num_cuts(m_noInOutSegments * nDim, AT_, "num_cuts");
1250
1251 for(MInt i = 0; i < m_noInOutSegments; i++) {
1252 MInt pos = i * nDim;
1253 m_solver->m_geometry->pointIsInside2(&rec_test_pts[pos], &num_cuts[pos]);
1254 }
1255
1256 // summarize the number of cuts to dermine the global inside/outside
1257 MPI_Allreduce(MPI_IN_PLACE, num_cuts.getPointer(), nDim * m_noInOutSegments, MPI_INT, MPI_SUM, m_solver->mpiComm(),
1258 AT_, "MPI_IN_PLACE", "num_cuts.getPointer()");
1259
1260 for(MInt s = 0; s < (MInt)own_segments.size(); s++) {
1261 MInt p = own_segments[s].first;
1262 MInt pos = p * nDim;
1263 MInt sum = 0;
1264
1265 for(MInt d = 0; d < nDim; d++)
1266 sum += num_cuts[pos + d];
1267
1268 MBool is_inside = sum % 2;
1269
1270 updateBndNormals(p, is_inside, m_bndNormals[p]);
1271 m_log << " * segment " << m_inOutSegmentsIds[p] << endl;
1272 m_log << " = normal: (" << m_bndNormals[p][0] << " " << m_bndNormals[p][1] << " " << m_bndNormals[p][2]
1273 << ")" << endl;
1274 }
1275}

◆ postCouple()

template<MInt nDim>
void LbBndCnd< nDim >::postCouple
virtual
Author
Moritz Waldmann
Date
21.10.2019

Definition at line 3538 of file lbbndcnd.cpp.

3538 {
3539 if(!m_solver->grid().isActive()) {
3540 return;
3541 }
3542
3543 const MInt startSet = m_solver->m_levelSetId;
3544 for(MInt set = startSet; set < m_solver->m_maxNoSets; set++) {
3545 (this->*bndCndHandlerVariables_MB[0])(set);
3546 (this->*bndCndHandlerRHS_MB[0])(set);
3547 }
3548}

◆ prepareBC()

template<MInt nDim>
void LbBndCnd< nDim >::prepareBC ( MInt  index,
MInt  BCCounter,
MInt  segId 
)
protectedvirtual
Author
Andreas Lintermann
Date
29.05.2015

Determines the number of cells that belong to this BC and then communicates this to all other domains. Those domains having such a BC are then grouped into a new communicator m_BCComm and a file is opened to record the BC residual (the density and the local Reynolds number.

Parameters
[in]indexthe index of the BC, counter the counter of BCs requiring communication

Definition at line 2669 of file lbbndcnd.cpp.

2669 {
2670 TRACE();
2671
2672 for(MInt count = 0; count < (MInt)m_bndCndSegIds.size(); count++) {
2673 if(m_bndCndIds[count] == index && m_bndCndSegIds[count] == segId) {
2674 const MInt bndCndIdIndex = count;
2675 m_allDomainsHaveBC[BCCounter][m_solver->domainId()] =
2676 m_bndCndOffsets[bndCndIdIndex + 1] - m_bndCndOffsets[bndCndIdIndex];
2677 m_mapBndCndIdSegId[count] = BCCounter;
2678 break;
2679 } else
2680 m_allDomainsHaveBC[BCCounter][m_solver->domainId()] = 0;
2681 }
2682
2683 if(m_solver->noDomains() > 1) {
2684 // unfortunately a global communication is requried
2685 const MInt sndBuf = m_allDomainsHaveBC[BCCounter][m_solver->domainId()];
2686 MIntScratchSpace domainsHaveBC(m_solver->noDomains(), AT_, "domainsHaveBC");
2687 MPI_Allgather(&sndBuf, 1, MPI_INT, domainsHaveBC.getPointer(), 1, MPI_INT, m_solver->mpiComm(), AT_, "sndBuf",
2688 "m_allDomainsHaveBC");
2689
2690 for(MInt count = 0; count < m_solver->noDomains(); count++) {
2691 m_allDomainsHaveBC[BCCounter][count] = domainsHaveBC(count);
2692 }
2693
2694 std::vector<MInt> BCneighborsPerSeg;
2695 m_totalNoBcCells[BCCounter] = 0;
2696 for(MInt i = 0; i < m_solver->noDomains(); i++) {
2697 if(m_allDomainsHaveBC[BCCounter][i] > 0) {
2698 BCneighborsPerSeg.push_back(i);
2699 m_totalNoBcCells[BCCounter] += m_allDomainsHaveBC[BCCounter][i];
2700 }
2701 }
2702
2703 m_BCneighbors.push_back(BCneighborsPerSeg);
2704
2705 m_noBCNeighbors[BCCounter] = (MInt)m_BCneighbors[BCCounter].size();
2706
2707 if(m_noBCNeighbors[BCCounter] > 1) {
2708 MIntScratchSpace ptBCneighbors(m_noBCNeighbors[BCCounter], AT_, "ptBCneighbors");
2709 for(MInt i = 0; i < m_noBCNeighbors[BCCounter]; i++)
2710 ptBCneighbors.p[i] = m_BCneighbors[BCCounter][i];
2711
2712 MPI_Comm_group(m_solver->mpiComm(), &tmp_group[BCCounter], AT_, "tmp_group");
2713
2714 MPI_Group_incl(tmp_group[BCCounter], m_noBCNeighbors[BCCounter], ptBCneighbors.getPointer(), &BCGroup[BCCounter],
2715 AT_);
2716 MPI_Comm_create(m_solver->mpiComm(), BCGroup[BCCounter], &m_BCComm[BCCounter], AT_, "m_BCComm");
2717 }
2718 } else {
2719 std::vector<MInt> BCneighborsPerSeg;
2720 BCneighborsPerSeg.push_back(m_solver->domainId());
2721 m_BCneighbors.push_back(BCneighborsPerSeg);
2722 m_totalNoBcCells[BCCounter] = m_allDomainsHaveBC[BCCounter][0];
2723 m_noBCNeighbors[BCCounter] = 1;
2724 }
2725}
std::vector< std::vector< MInt > > m_BCneighbors
Definition: lbbndcnd.h:402

◆ prepareBC2000()

template<MInt nDim>
void LbBndCnd< nDim >::prepareBC2000
protectedvirtual
Author
Andreas Lintermann
Date
29.05.2015

Determines the number of cells that belong to this BC and then communicates this to all other domains. Those domains having such a BC are then grouped into a new communicator m_BCComm and a file is opened to record the BC residual (the density and the local Reynolds number.

Parameters
[in]bndCndIdIndexthe index of the BC 4072 in the BC array

Definition at line 2486 of file lbbndcnd.cpp.

2486 {
2487 TRACE();
2488
2489 if(!m_calcWallForces) return;
2490
2491 MInt noAllBoundaryIds = 0;
2492 const MInt* const allBoundaryIds = m_solver->m_geometry->GetBoundaryIds(&noAllBoundaryIds);
2493 TERMM_IF_COND(noAllBoundaryIds != m_noSegments, "noAllBoundaryIds != m_noSegments");
2494
2496 for(MInt i = 0; i < m_noSegments; i++) {
2497 if(allBoundaryIds[i] == 2000) {
2499 }
2500 }
2501
2502 for(auto& mapWallForceIterator : m_mapWallForceContainer) {
2503 const MInt segId = mapWallForceIterator.first;
2504 const MInt index = m_mapBndCndSegId2Index[segId];
2505 auto& cwfc = mapWallForceIterator.second;
2506
2507 const MInt noCalcForceCells = (index > -1) ? (m_bndCndOffsets[index + 1] - m_bndCndOffsets[index]) : 0;
2508
2509 // unfortunately a global communication is requried
2510 std::vector<MInt> noCalcForceCellsPerDomain(m_solver->noDomains(), 0);
2511 MPI_Allgather(&noCalcForceCells, 1, MPI_INT, noCalcForceCellsPerDomain.data(), 1, MPI_INT, m_solver->mpiComm(), AT_,
2512 "noCalcForceCells", "noCalcForceCellsPerDomain");
2513 std::vector<MInt> bcWallNeighbors;
2514 for(MInt i = 0; i < m_solver->noDomains(); i++) {
2515 if(noCalcForceCellsPerDomain[i] > 0) {
2516 bcWallNeighbors.push_back(i);
2517 }
2518 }
2519
2520 cwfc.noComm = bcWallNeighbors.size();
2521
2522 // build a new communicator
2523 if(cwfc.noComm != 0) {
2524 MPI_Group tmp_bcGroupWall;
2525 MPI_Group bcGroupWall;
2526 MPI_Comm_group(m_solver->mpiComm(), &tmp_bcGroupWall, AT_, "tmp_group");
2527 MPI_Group_incl(tmp_bcGroupWall, cwfc.noComm, bcWallNeighbors.data(), &bcGroupWall, AT_);
2528 MPI_Comm_create(m_solver->mpiComm(), bcGroupWall, &cwfc.comm, AT_, "cwfc.comm");
2529
2530 cwfc.isRoot = (m_solver->domainId() == bcWallNeighbors[0]);
2531 if(cwfc.isRoot) {
2532 if(m_mapWallForceContainer.size() > 1) {
2533 std::stringstream fileNameS;
2534 fileNameS << m_forceFile << m_bndCndSegIds[index];
2535 cwfc.fileName = fileNameS.str();
2536 } else {
2537 cwfc.fileName = m_forceFile;
2538 }
2539 // Write header
2540 std::FILE* forceFile;
2541 forceFile = fopen(cwfc.fileName.c_str(), "a+");
2542 fprintf(forceFile, "# Re=%f, Ma=%f, refLength_LB=%f, dx(maxLvl)=%e\n", m_solver->m_Re, m_solver->m_Ma,
2543 m_solver->m_referenceLength, m_solver->c_cellLengthAtLevel(m_solver->maxLevel()));
2544 fprintf(forceFile, "#");
2545 fprintf(forceFile, "%s\t", "1:TS");
2546 constexpr MInt columnLength = 15;
2547 fprintf(forceFile, "%*s\t", columnLength, "2:F_x");
2548 fprintf(forceFile, "%*s\t", columnLength, "3:F_y");
2549 if constexpr(nDim == 3) {
2550 fprintf(forceFile, "%*s\t", columnLength, "4:F_z");
2551 }
2552 fprintf(forceFile, "\n");
2553 fclose(forceFile);
2554 }
2555 }
2556 }
2557}
std::unordered_map< MInt, maia::lb::CalcWallForceContainer > m_mapWallForceContainer
Definition: lbbndcnd.h:415

◆ prepareBC4073()

template<MInt nDim>
void LbBndCnd< nDim >::prepareBC4073 ( MInt  BCCounter,
MInt  segId 
)
protectedvirtual

Definition at line 2728 of file lbbndcnd.cpp.

2728 {
2729 m_log << " - BC 4073" << endl;
2730 m_log << " * reading properties from file" << endl;
2731 // get the plane from the geomtry file that specifies the plane that should be used for
2732 // the calculation of the local Reynolds number
2733 if(m_solver->m_geometry->geometryContext().propertyExists("localReCut", 0)) {
2734 MInt num = m_solver->m_geometry->geometryContext().getProperty("localReCut", 0)->count();
2735 if((nDim == 2 && num != 4) || (nDim == 3 && num != 6)) {
2736 stringstream errorMsg;
2737 errorMsg << "ERROR: no wrong number of entries in the geometry property 'localReCut' for BC 4073" << endl;
2738 m_log << errorMsg.str();
2739 TERMM(1, errorMsg.str());
2740 }
2741
2742 // this holds the cut information for the local Reynolds number calculation
2743 mAlloc(m_localReCutPoint, nDim, "m_localReCutPoint", 0.0, AT_);
2744 mAlloc(m_localReCutNormal, nDim, "m_localReCutNormal", 0.0, AT_);
2745
2746 MFloat len = 0.0;
2747 for(MInt i = 0; i < nDim; i++) {
2748 m_localReCutPoint[i] = *m_solver->m_geometry->geometryContext().getProperty("localReCut", 0)->asFloat(i);
2749 m_localReCutNormal[i] = *m_solver->m_geometry->geometryContext().getProperty("localReCut", 0)->asFloat(i + nDim);
2751 }
2752 len = sqrt(len);
2753 if(approx(len, 0.0, MFloatEps)) {
2754 stringstream errorMsg;
2755 errorMsg << "ERROR: the normal defined by the geometry property 'localReCut' seems to be wrong" << endl;
2756 m_log << errorMsg.str();
2757 TERMM(1, errorMsg.str());
2758 }
2759
2760 // normalize
2761 for(MInt i = 0; i < nDim; i++)
2762 m_localReCutNormal[i] /= len;
2763
2764 if(m_solver->m_geometry->geometryContext().propertyExists("localReCutDistance", 0))
2765 m_localReCutDistance = *m_solver->m_geometry->geometryContext().getProperty("localReCutDistance", 0)->asFloat();
2766 else
2767 m_localReCutDistance = m_solver->c_cellLengthAtLevel(0);
2768
2769 if(m_solver->m_geometry->geometryContext().propertyExists("localReCutInterval", 0))
2770 m_localReCutInterval = *m_solver->m_geometry->geometryContext().getProperty("localReCutInterval", 0)->asInt();
2771 else {
2772 stringstream errorMsg;
2773 errorMsg << "ERROR: no geometry property 'localReCutInterval' defined for BC 4073" << endl;
2774 m_log << errorMsg.str();
2775 TERMM(1, errorMsg.str());
2776 }
2777 } else {
2778 stringstream errorMsg;
2779 errorMsg << "ERROR: no geometry property 'localReCut' defined for BC 4073" << endl;
2780 m_log << errorMsg.str();
2781 TERMM(1, errorMsg.str());
2782 }
2783
2785 if(m_solver->m_geometry->geometryContext().propertyExists("localReCutReportInterval", 0))
2787 *m_solver->m_geometry->geometryContext().getProperty("localReCutReportInterval", 0)->asInt();
2788
2789 m_localReCutRe = m_solver->m_Re;
2790 if(m_solver->m_geometry->geometryContext().propertyExists("localReCutRe", 0))
2791 m_localReCutRe = *m_solver->m_geometry->geometryContext().getProperty("localReCutRe", 0)->asFloat();
2792
2794 if(m_solver->m_geometry->geometryContext().propertyExists("localReCutDiameter", 0))
2795 m_localReCutDiameter = *m_solver->m_geometry->geometryContext().getProperty("localReCutDiameter", 0)->asFloat();
2796
2797 m_localReCutAdpPerc = 0.2;
2798 if(m_solver->m_geometry->geometryContext().propertyExists("localReCutAdpPerc", 0))
2799 m_localReCutAdpPerc = *m_solver->m_geometry->geometryContext().getProperty("localReCutAdpPerc", 0)->asFloat();
2800
2801 // load from restart? -> overwrite local data
2802 m_log << " * reading information for restart" << endl;
2803 if(m_solver->m_restartFile) {
2804 if(m_solver->m_geometry->geometryContext().propertyExists("localReCut_rho1", 0))
2805 m_solver->m_rho1 = *m_solver->m_geometry->geometryContext().getProperty("localReCut_rho1", 0)->asFloat();
2806 else {
2807 stringstream errorMsg;
2808 errorMsg << "ERROR: no geometry property 'localReCut_rho1' defined for BC 4073 (as required for restart)" << endl;
2809 m_log << errorMsg.str();
2810 TERMM(1, errorMsg.str());
2811 }
2812
2813 if(m_solver->m_geometry->geometryContext().propertyExists("localReCut_lRho", 0))
2814 m_lRho = *m_solver->m_geometry->geometryContext().getProperty("localReCut_lRho", 0)->asFloat();
2815 else {
2816 stringstream errorMsg;
2817 errorMsg << "ERROR: no geometry property 'localReCut_lRho' defined for BC 4073 (as required for restart)" << endl;
2818 m_log << errorMsg.str();
2819 TERMM(1, errorMsg.str());
2820 }
2821
2822 if(m_solver->m_geometry->geometryContext().propertyExists("localReCut_rhoLast", 0))
2823 m_rhoLast = *m_solver->m_geometry->geometryContext().getProperty("localReCut_rhoLast", 0)->asFloat();
2824 else {
2825 stringstream errorMsg;
2826 errorMsg << "ERROR: no geometry property 'localReCut_rhoLast' defined for BC 4073 (as required for restart)"
2827 << endl;
2828 m_log << errorMsg.str();
2829 TERMM(1, errorMsg.str());
2830 }
2831
2832 if(m_solver->m_geometry->geometryContext().propertyExists("localReCut_deltaRho", 0))
2833 m_deltaRho = *m_solver->m_geometry->geometryContext().getProperty("localReCut_deltaRho", 0)->asFloat();
2834 else {
2835 stringstream errorMsg;
2836 errorMsg << "ERROR: no geometry property 'localReCut_deltaRho' defined for BC 4073 (as required for restart)"
2837 << endl;
2838 m_log << errorMsg.str();
2839 TERMM(1, errorMsg.str());
2840 }
2841
2842 if(m_solver->m_geometry->geometryContext().propertyExists("localReCut_ReLast", 0))
2843 m_ReLast = *m_solver->m_geometry->geometryContext().getProperty("localReCut_ReLast", 0)->asFloat();
2844 else {
2845 stringstream errorMsg;
2846 errorMsg << "ERROR: no geometry property 'localReCut_ReLast' defined for BC 4073 (as required for restart)"
2847 << endl;
2848 m_log << errorMsg.str();
2849 TERMM(1, errorMsg.str());
2850 }
2851 }
2852
2853 // find all cells that have a cut with the line/plane and the according distance
2854 m_log << " * finding cells that have a cut with the reference plane" << endl;
2855 for(MInt i = 0; i < m_solver->m_cells.size(); i++) {
2856 // only leaf cells
2857 if(m_solver->c_noChildren(i) > 0 || m_solver->a_isHalo(i)) continue;
2858
2859 MFloat cellHalfLength = m_solver->c_cellLengthAtLevel(m_solver->a_level(i) + 1);
2860 const MFloat* const coordinates = &(m_solver->a_coordinate(i, 0));
2861
2862 std::array<MFloat, nDim> edge;
2863
2864 // fill edge and projection dist = edge * normal (which is normalized)
2865 MFloat prodist = 0.0;
2866 MFloat dist = 0.0;
2867 for(MInt d = 0; d < nDim; d++) {
2868 edge[d] = coordinates[d] - m_localReCutPoint[d];
2869 prodist += edge[d] * m_localReCutNormal[d];
2870 dist += edge[d] * edge[d];
2871 }
2872
2873 dist = sqrt(dist);
2874
2875 if(fabs(prodist) < cellHalfLength && dist <= m_localReCutDistance) m_localReCutCells.push_back(i);
2876 }
2877 m_log << " = no of cells for this domain: " << m_localReCutCells.size() << endl;
2878 m_hasLocalReCut = (m_localReCutCells.size() > 0);
2879
2880 // does this domain have the according BC?
2881 MBool has_bc4073 = false;
2882 for(MInt i = 0; i < (MInt)(m_bndCndIds.size()); i++)
2883 if(m_bndCndIds[i] == 4073 && m_mapSegIdsInOutCnd[i] != -1 && m_bndCndSegIds[i] == segId) {
2884 has_bc4073 = true;
2885 break;
2886 }
2887
2888 m_allDomainsHaveBC[BCCounter][m_solver->domainId()] = m_hasLocalReCut ? m_localReCutCells.size() : -1;
2889
2890 if(m_allDomainsHaveBC[BCCounter][m_solver->domainId()] == -1 && has_bc4073)
2891 m_allDomainsHaveBC[BCCounter][m_solver->domainId()] = 0;
2892
2893 // unfortunately a global communication is requried
2894 MInt* const sndBuf = &(m_allDomainsHaveBC[BCCounter][m_solver->domainId()]);
2895 MPI_Allgather(sndBuf, 1, MPI_INT, m_allDomainsHaveBC[BCCounter], 1, MPI_INT, m_solver->mpiComm(), AT_, "sndBuf",
2896 "m_allDomainsHaveBC");
2897
2898 std::vector<MInt> BCneighborsPerSeg;
2899
2901 m_totalNoBcCells[BCCounter] = 0;
2902 for(MInt i = 0; i < m_solver->noDomains(); i++)
2903 if(m_allDomainsHaveBC[BCCounter][i] != -1) {
2904 BCneighborsPerSeg.push_back(i);
2905 if(m_allDomainsHaveBC[BCCounter][i] > 0) {
2907 m_totalNoBcCells[BCCounter] += m_allDomainsHaveBC[BCCounter][i];
2908 }
2909 }
2910
2911 m_BCneighbors.push_back(BCneighborsPerSeg);
2912 m_noBCNeighbors[BCCounter] = (MInt)m_BCneighbors[BCCounter].size();
2913
2914 m_firstBCinComm = 0;
2915 if(m_noBCNeighbors[BCCounter] > 0) m_firstBCinComm = m_BCneighbors[BCCounter][0];
2916
2917 MIntScratchSpace ptBCneighbors(m_noBCNeighbors[BCCounter], AT_, "ptBCneighbors");
2918 for(MInt i = 0; i < m_noBCNeighbors[BCCounter]; i++)
2919 ptBCneighbors.p[i] = m_BCneighbors[BCCounter][i];
2920
2921 // build a new communicator
2922 m_log << " * building MPI communicator" << endl;
2923 if(m_noBCNeighbors[BCCounter] != 0 && m_solver->noDomains() > 1) {
2924 // MPI_Group tmp_group, BCGroup;
2925
2926 MPI_Comm_group(m_solver->mpiComm(), &tmp_group[BCCounter], AT_, "tmp_group");
2927
2928 MPI_Group_incl(tmp_group[BCCounter], m_noBCNeighbors[BCCounter], ptBCneighbors.getPointer(), &BCGroup[BCCounter],
2929 AT_);
2930#ifdef MAIA_MPI_DEBUG
2931 MPI_Comm_create(m_solver->mpiComm(), BCGroup[BCCounter], &m_BCComm[BCCounter], AT_, "m_BCComm");
2932#else
2933 MPI_Comm_create(m_solver->mpiComm(), BCGroup[BCCounter], &m_BCComm[BCCounter], AT_, "m_BCComm");
2934#endif
2935 }
2936 if(m_calcBcResidual && m_solver->domainId() == m_firstBCinComm) {
2937 m_BCResidualStream[BCCounter].open(m_BCOutputFileName[BCCounter], ios_base::app);
2938
2939 if(!m_solver->m_restartFile)
2940 m_BCResidualStream[BCCounter] << "############################\n"
2941 << "# Order of appearance:\n"
2942 << "# 1: globalTimeStep\n"
2943 << "# 2: m_localReCutRe\n"
2944 << "# 3: l_Re\n"
2945 << "# 4: m_ReLast\n"
2946 << "# 5: Re_diff\n"
2947 << "# 6: m_lRho\n"
2948 << "# 7: m_rhoLast\n"
2949 << "# 8: m_deltaRho\n"
2950 << "############################\n"
2951 << endl;
2952 }
2953
2954 // special treatment for those domains that have a cut with the plane/line but do not contain any BC 4073 cells
2955 m_log << " * updating boundary condition list" << endl;
2956 if(!has_bc4073 && m_hasLocalReCut) {
2957 // we need to add bc4073
2958 m_bndCndIds.push_back(4073);
2959 m_bndCndOffsets.push_back(m_bndCndOffsets[m_bndCndOffsets.size() - 1]);
2960 // empty treatment
2961 m_bndCndSegIds.push_back(-1);
2962 m_mapSegIdsInOutCnd.push_back(-1);
2963
2964 m_log << " + created new BC 4073" << endl;
2965 }
2966
2967 m_log << " * update interval: " << m_localReCutInterval << endl;
2968 m_log << " * update percentage: " << m_localReCutAdpPerc << endl;
2969 m_log << " * report interval: " << m_localReCutReportInterval << endl;
2970 m_log << " * point: ";
2971 for(MInt i = 0; i < nDim; i++)
2972 m_log << m_localReCutPoint[i] << " ";
2973 m_log << endl;
2974 m_log << " * distance: " << m_localReCutDistance << endl;
2975 m_log << " * normal: ";
2976 for(MInt i = 0; i < nDim; i++)
2977 m_log << m_localReCutNormal[i] << " ";
2978 m_log << endl;
2979 m_log << " * target Re: " << m_localReCutRe
2980 << (approx(m_localReCutRe, m_solver->m_Re, MFloatEps) ? " (same as global Re)" : " (different than global Re)")
2981 << endl;
2982 m_log << " * reference length " << m_localReCutDiameter
2983 << (approx(m_localReCutDiameter, m_referenceLength, MFloatEps) ? " (same as global ref. length)"
2984 : " (different than global ref. length)")
2985 << endl;
2986 m_log << " * local cut: " << (m_hasLocalReCut ? "yes" : "no") << endl;
2987 m_log << " * no. cut cells: " << m_localReCutCells.size() << endl;
2988 m_log << " * no. total cut cells: " << m_totalNoBcCells[BCCounter] << endl;
2989 m_log << " * domain owns BC: " << (has_bc4073 ? "yes" : "no") << endl;
2990 m_log << " * no. domains cut: " << m_totalNoDomainsReCut << endl;
2991 m_log << " * no. comm. domains: " << m_noBCNeighbors[BCCounter] << endl;
2992 m_log << " * first comm. domain: " << m_firstBCinComm << endl;
2993 m_log << " * comm. domains: ";
2994 for(MInt i = 0; i < m_noBCNeighbors[BCCounter]; i++)
2995 m_log << m_BCneighbors[BCCounter][i] << " ";
2996 m_log << endl;
2997 if(m_solver->m_restartFile) {
2998 m_log << " * restart details: " << endl;
2999 m_log << " > rho1: " << m_solver->m_rho1 << endl;
3000 m_log << " > lRho: " << m_lRho << endl;
3001 m_log << " > rhoLast: " << m_rhoLast << endl;
3002 m_log << " > deltaRho: " << m_deltaRho << endl;
3003 m_log << " > ReLast: " << m_ReLast << endl;
3004 }
3005 m_log << endl;
3006}
MInt m_totalNoDomainsReCut
Definition: lbbndcnd.h:420
MFloat m_ReLast
Definition: lbbndcnd.h:384
std::vector< MInt > m_localReCutCells
Definition: lbbndcnd.h:418
MInt m_firstBCinComm
Definition: lbbndcnd.h:424
MInt m_localReCutInterval
Definition: lbbndcnd.h:421
MFloat m_rhoLast
Definition: lbbndcnd.h:385
MFloat * m_localReCutPoint
Definition: lbbndcnd.h:405
MFloat m_deltaRho
Definition: lbbndcnd.h:383
MFloat m_localReCutRe
Definition: lbbndcnd.h:408
MFloat m_localReCutDiameter
Definition: lbbndcnd.h:409
MFloat m_referenceLength
Definition: lbbndcnd.h:145
MFloat m_localReCutAdpPerc
Definition: lbbndcnd.h:422
MFloat m_lRho
Definition: lbbndcnd.h:386
MFloat * m_localReCutNormal
Definition: lbbndcnd.h:406
MBool m_hasLocalReCut
Definition: lbbndcnd.h:419
MFloat m_localReCutDistance
Definition: lbbndcnd.h:407
MInt m_localReCutReportInterval
Definition: lbbndcnd.h:423
MFloat dist(const Point< DIM > &p, const Point< DIM > &q)
Definition: pointbox.h:54

◆ printBndVelInfo()

template<MInt nDim>
void LbBndCnd< nDim >::printBndVelInfo
privatevirtual
Author
Andreas Lintermann
Date
28.01.2010, 27.04.2015

Prints all information about the boundary conditions.

Definition at line 551 of file lbbndcnd.cpp.

551 {
552 TRACE();
553
554 NEW_SUB_TIMER(t_printBndVelInfo, "print boundary velcoity info", m_t_BCAll);
555 RECORD_TIMER_START(t_printBndVelInfo);
556
557
558 m_log << " + We have the following inflow / outflow boundary information: " << endl;
559
560 for(MInt i = 0; i < (MInt)(m_bndCndIds.size()); i++) {
561 MInt mapId = m_mapSegIdsInOutCnd[i];
562 if(mapId != -1) {
563 m_log << " - information for segment " << m_bndCndSegIds[i] << endl;
564 m_log << " * BC: " << m_bndCndIds[i] << endl;
565 m_log << " * no cells: " << m_noBndCellsPerSegment[m_bndCndSegIds[i]] << endl;
566 m_log << " * normal id: " << m_mapSegIdsInOutCnd[i] << endl;
567 m_log << " * normal dir: " << m_bndNormalDirection[mapId] << " ("
568 << (m_bndNormalDirection[mapId] == -1 ? "outside" : "inside") << ")" << endl;
569 m_log << " * normal: ";
570 for(MInt j = 0; j < nDim; j++)
571 m_log << m_bndNormals[mapId][j] << " ";
572 m_log << endl;
573 m_log << " * init vel: ";
574 for(MInt j = 0; j < nDim; j++)
575 m_log << m_initialVelocityVecs[mapId][j] << " ";
576 m_log << endl;
577 m_log << " * ext dirs: " << m_exDirs[mapId][0] << " " << m_exDirs[mapId][1] << endl;
578 m_log << " * ext wght: " << m_exWeights[mapId][0] << " " << m_exWeights[mapId][1] << endl;
579 }
580 }
581
582 m_log << endl;
583
584 RECORD_TIMER_STOP(t_printBndVelInfo);
585}
std::vector< MInt > m_noBndCellsPerSegment
Definition: lbbndcnd.h:164

◆ processAngles()

template<MInt nDim>
void LbBndCnd< nDim >::processAngles
privatevirtual

Definition at line 382 of file lbbndcnd.cpp.

382 {
383 TRACE();
384
385 NEW_SUB_TIMER(t_processAngles, "process angles", m_t_BCAll);
386 RECORD_TIMER_START(t_processAngles);
387
388
389 m_log << " + Processing angles..." << endl;
390
391 // -------------------------------------------------------------------------------
392 // Determine data for arbitrary outlet directions
393 // (polar angles & directions are derived from the normal vector of the outlet)
394 // -------------------------------------------------------------------------------
395
396 MFloat projection, angle1, angle2;
397 MFloat length;
398
399 MIntScratchSpace axesDirs(nDim, AT_, "axesDirs");
400 MFloat projections[3];
401
402 for(MInt id = 0; id < m_noInOutSegments; id++) {
403 MInt seg_id = -1;
404 for(MInt o = 0; o < (MInt)m_bndCndSegIds.size(); o++)
405 if(m_inOutSegmentsIds[id] == m_bndCndSegIds[o]) {
406 seg_id = o;
407 break;
408 }
409
410 if(seg_id < 0) continue;
411
412 if(m_bndNormals[id][0] > 0) {
413 m_phi[id] = atan(m_bndNormals[id][1] / m_bndNormals[id][0]);
414
415 axesDirs[0] = 0;
416
417 if(m_bndNormals[id][1] > 0)
418 axesDirs[1] = 2;
419 else
420 axesDirs[1] = 3;
421 } else {
422 axesDirs[0] = 1;
423
424 if(m_bndNormals[id][1] > 0) {
425 if(approx(m_bndNormals[id][0], 0.0, MFloatEps)) {
426 m_phi[id] = PI / 2;
427 } else {
428 m_phi[id] = PI + atan(m_bndNormals[id][1] / m_bndNormals[id][0]);
429 }
430
431 axesDirs[1] = 2;
432
433 } else {
434 if(approx(m_bndNormals[id][0], 0.0, MFloatEps)) {
435 m_phi[id] = -PI / 2;
436 } else {
437 m_phi[id] = -PI + atan(m_bndNormals[id][1] / m_bndNormals[id][0]);
438 }
439 axesDirs[1] = 3;
440 }
441 }
442
443 IF_CONSTEXPR(nDim == 3) {
444 m_theta[id] = asin(m_bndNormals[id][2]);
445
446 if(m_bndNormals[id][2] > 0)
447 axesDirs[2] = 4;
448 else
449 axesDirs[2] = 5;
450 }
451 else m_theta[id] = 0;
452
453 for(MInt i = 0; i < nDim; i++) {
454 projections[i] = 0.0;
455 for(MInt j = 0; j < nDim; j++)
456 projections[i] += (LbLatticeDescriptorBase<3>::idFld(axesDirs[i], j) - 1.0)
457 * m_bndNormals[id][j]; // TODO labels:LB dxqy: 3 replaceable by nDim ?
458 }
459
460 IF_CONSTEXPR(nDim == 3) {
461 m_log << " - InOutSegment " << id << ":" << endl;
462 m_log << " * segment id: " << m_bndCndSegIds[seg_id] << endl;
463 m_log << " * distributions along axes which point into the fluid: " << axesDirs[0] << " " << axesDirs[1]
464 << " " << axesDirs[0] << endl;
465 m_log << " * scalar product with bndNormal: " << projections[0] << " "
466 << projections[1] << " " << projections[2] << endl;
467 }
468 else {
469 m_log << " - InOutSegment " << id << ":" << endl;
470 m_log << " * angle phi: " << 180 * m_phi[id] / PI << endl;
471 m_log << " * distributions along axes which point into the fluid: " << axesDirs[0] << " " << axesDirs[1]
472 << endl;
473 m_log << " * scalar product with bndNormal: " << projections[0] << " "
474 << projections[1] << endl;
475 }
476
477
478 // -----------------------------------------------------------------------------------------------------------
479 // Determine directions and weights for extrapolation, i.e. go through all
480 // directions and take those two which have the highest projection on the inverse normal vector.
481 // The weights are calculated from the ratio of enclosed angles.
482 // -----------------------------------------------------------------------------------------------------------
483
484 angle1 = 0;
485 angle2 = 0;
486 m_exDirs[id][0] = -1;
487 m_exDirs[id][1] = -1;
488
489 // number of neighbors was raised to maximum to improve extrapolation
490 for(MInt i = 0; i < pow(3.0, nDim) - 1; i++) {
491 // for (MInt i=0; i < m_noDistributions - 1; i++){
492 projection = 0.0;
493 length = 0.0;
494 for(MInt j = 0; j < nDim; j++) {
495 projection += -1.0 * (LbLatticeDescriptorBase<3>::idFld(i, j) - 1.0)
496 * m_bndNormals[id][j]; // TODO labels:LB dxqy: 3 replaceable by nDim ?
497 length += (LbLatticeDescriptorBase<3>::idFld(i, j) - 1.0)
498 * (LbLatticeDescriptorBase<3>::idFld(i, j) - 1.0); // TODO labels:LB dxqy: 3 replaceable by nDim ?
499 }
500 length = sqrt(length);
501 projection = projection / length;
502
503 if(projection > angle1) {
504 if(angle1 > angle2) {
505 angle2 = angle1;
506 m_exDirs[id][1] = m_exDirs[id][0];
507 }
508 m_exDirs[id][0] = i;
509 angle1 = projection;
510 } else {
511 if(projection > angle2) {
512 m_exDirs[id][1] = i;
513 angle2 = projection;
514 }
515 }
516 }
517
518 angle1 = abs(acos(angle1));
519 angle2 = abs(acos(angle2));
520
521 m_exWeights[id][0] = angle2 / (angle1 + angle2);
522 m_exWeights[id][1] = angle1 / (angle1 + angle2);
523
524 m_log << " * extrapolation directions: " << m_exDirs[id][0] << " "
525 << m_exDirs[id][1] << endl;
526 m_log << " * angle enclosed with bndNormal: " << 180 * angle1 / PI << " "
527 << 180 * angle2 / PI << endl;
528 m_log << " * extrapolation weights: " << m_exWeights[id][0] << " "
529 << m_exWeights[id][1] << endl;
530
531 // Oha, there seems to be something wrong, no extrapolation neighbors found
532 if(m_exDirs[id][0] == -1 && m_exDirs[id][1] == -1) {
533 stringstream errorMsg;
534 errorMsg << "ERROR: no neighbors found for extrapolation for segment id " << m_inOutSegmentsIds[id] << endl;
535 m_log << errorMsg.str();
536 TERMM(1, errorMsg.str());
537 }
538 }
539
540 m_log << endl;
541
542 RECORD_TIMER_STOP(t_processAngles);
543}
MInt id
Definition: maiatypes.h:71
LB lattice descriptor for arrays depending on D.
static constexpr MInt idFld(MInt i, MInt j)

◆ setBCNeighborCommunicator()

template<MInt nDim>
void LbBndCnd< nDim >::setBCNeighborCommunicator
protectedvirtual
Author
Andreas Lintermann
Date
27.09.2012

This function checks if a BC is used which requires internal communication. If so, a new communicator group is created holding only the processes having a part of the BC. A file is opened, which will hold the residual for this BC.

Definition at line 3020 of file lbbndcnd.cpp.

3020 {
3021 TRACE();
3022
3023 NEW_SUB_TIMER(t_setBCNC, "set BC neighbor communicators", m_t_BCAll);
3024 RECORD_TIMER_START(t_setBCNC);
3025
3026 // first of all check if we have a BC which requries communication
3028 if(m_numberOfCommBCs == 0) {
3029 RECORD_TIMER_STOP(t_setBCNC);
3030 return;
3031 }
3032
3033 mAlloc(m_allDomainsHaveBC, m_numberOfCommBCs, m_solver->noDomains(), "m_allDomainsHaveBC", 0, AT_);
3034 mAlloc(m_noBCNeighbors, m_numberOfCommBCs, "m_noBCNeighbors", 0, AT_);
3035 mAlloc(m_totalNoBcCells, m_numberOfCommBCs, "m_totalNoBcCells", 0, AT_);
3036
3037 mAlloc(tmp_group, m_numberOfCommBCs, "tmp_group", AT_);
3038 mAlloc(BCGroup, m_numberOfCommBCs, "BCGroup", AT_);
3039 mAlloc(m_BCComm, m_numberOfCommBCs, "m_BCComm", AT_);
3040
3041 if(m_calcBcResidual) mAlloc(m_BCResidualStream, m_numberOfCommBCs, "m_BCResidualStream", AT_);
3042 mAlloc(m_BCOutputFileName, m_numberOfCommBCs, "m_BCOutputFileName", AT_);
3043
3044 if((MInt)(m_bndCndIds.size()) > 0)
3045 mAlloc(m_mapBndCndIdSegId, (MInt)(m_bndCndIds.size()), "m_mapBndCndIdSegId", 0, AT_);
3046
3047 m_log << " + Found a BC which requires communication:" << endl;
3048
3049 MInt counterCommBC = 0;
3050
3051 for(MInt segId = 0; segId < m_noAllBoundaryIds; segId++) {
3052 stringstream s;
3053 MBool found = false;
3054 switch(m_allBoundaryIds[segId]) {
3055 case 1000: {
3056 s << "Output_SegNo_" << segId << "_BC_" << 1000 << ".dat";
3057 m_BCOutputFileName[counterCommBC] = s.str();
3058 prepareBC(1000, counterCommBC, segId);
3059 found = true;
3060 break;
3061 }
3062 case 1022: {
3063 s << "Output_SegNo_" << segId << "_BC_" << 1022 << ".dat";
3064 m_BCOutputFileName[counterCommBC] = s.str();
3065 prepareBC(1022, counterCommBC, segId);
3066 found = true;
3067 break;
3068 }
3069 case 1060: {
3070 s << "Output_SegNo_" << segId << "_BC_" << 1060 << ".dat";
3071 m_BCOutputFileName[counterCommBC] = s.str();
3072 prepareBC(1060, counterCommBC, segId);
3073 found = true;
3074 break;
3075 }
3076 case 1080: {
3077 s << "Output_SegNo_" << segId << "_BC_" << 1080 << ".dat";
3078 m_BCOutputFileName[counterCommBC] = s.str();
3079 prepareBC(1080, counterCommBC, segId);
3080 found = true;
3081 break;
3082 }
3083 case 4000: {
3084 s << "Output_SegNo_" << segId << "_BC_" << 4000 << ".dat";
3085 m_BCOutputFileName[counterCommBC] = s.str();
3086 prepareBC(4000, counterCommBC, segId);
3087 found = true;
3088 break;
3089 }
3090 case 4030: {
3091 s << "Output_SegNo_" << segId << "_BC_" << 4030 << ".dat";
3092 m_BCOutputFileName[counterCommBC] = s.str();
3093 prepareBC(4030, counterCommBC, segId);
3094 found = true;
3095 break;
3096 }
3097 case 4130: {
3098 s << "Output_SegNo_" << segId << "_BC_" << 4130 << ".dat";
3099 m_BCOutputFileName[counterCommBC] = s.str();
3100 prepareBC(4130, counterCommBC, segId);
3101 found = true;
3102 break;
3103 }
3104 case 4070: {
3105 s << "Output_SegNo_" << segId << "_BC_" << 4070 << ".dat";
3106 m_BCOutputFileName[counterCommBC] = s.str();
3107 prepareBC(4070, counterCommBC, segId);
3108 found = true;
3109 break;
3110 }
3111 case 4071: {
3112 s << "Output_SegNo_" << segId << "_BC_" << 4071 << ".dat";
3113 m_BCOutputFileName[counterCommBC] = s.str();
3114 prepareBC(4071, counterCommBC, segId);
3115 found = true;
3116 break;
3117 }
3118 case 4072: {
3119 s << "Output_SegNo_" << segId << "_BC_" << 4072 << ".dat";
3120 m_BCOutputFileName[counterCommBC] = s.str();
3121 prepareBC(4072, counterCommBC, segId);
3122 found = true;
3123 break;
3124 }
3125 case 4073: {
3126 s << "Output_SegNo_" << segId << "_BC_" << 4073 << ".dat";
3127 m_BCOutputFileName[counterCommBC] = s.str();
3128 prepareBC4073(counterCommBC, segId);
3129 found = true;
3130 break;
3131 }
3132 case 4080: {
3133 s << "Output_SegNo_" << segId << "_BC_" << 4080 << ".dat";
3134 m_BCOutputFileName[counterCommBC] = s.str();
3135 prepareBC(4080, counterCommBC, segId);
3136 found = true;
3137 break;
3138 }
3139 case 4081: {
3140 s << "Output_SegNo_" << segId << "_BC_" << 4081 << ".dat";
3141 m_BCOutputFileName[counterCommBC] = s.str();
3142 prepareBC(4081, counterCommBC, segId);
3143 found = true;
3144 break;
3145 }
3146 case 4082: {
3147 s << "Output_SegNo_" << segId << "_BC_" << 4082 << ".dat";
3148 m_BCOutputFileName[counterCommBC] = s.str();
3149 prepareBC(4082, counterCommBC, segId);
3150 found = true;
3151 break;
3152 }
3153 case 4110: {
3154 s << "Output_SegNo_" << segId << "_BC_" << 4110 << ".dat";
3155 m_BCOutputFileName[counterCommBC] = s.str();
3156 prepareBC(4110, counterCommBC, segId);
3157 found = true;
3158 break;
3159 }
3160 default: {
3161 }
3162 }
3163
3164 if(found) {
3165 counterCommBC++;
3166 }
3167 }
3168
3169 RECORD_TIMER_STOP(t_setBCNC);
3170}
virtual MInt checkForCommBC()
Checks if a BC exists that requires communication.
Definition: lbbndcnd.cpp:2569
virtual void prepareBC4073(MInt BCCounter, MInt segId)
Definition: lbbndcnd.cpp:2728
virtual void prepareBC(MInt index, MInt BCCounter, MInt segId)
Prepares the BC 4070, 4071, 4072, 4080, 4081, and 4082.
Definition: lbbndcnd.cpp:2669

◆ setBCWallNeighborCommunicator()

template<MInt nDim>
void LbBndCnd< nDim >::setBCWallNeighborCommunicator
protectedvirtual
Author
Andreas Lintermann
Date
20.12.2019

This function checks if a BC is used which requires internal communication. If so, a new communicator group is created holding only the processes having a part of the BC.

Definition at line 2437 of file lbbndcnd.cpp.

2437 {
2438 TRACE();
2439
2440 NEW_SUB_TIMER(t_setBCNC, "set BC neighbor communicators", m_t_BCAll);
2441 RECORD_TIMER_START(t_setBCNC);
2442
2443 // first of all check if we have a BC which requries communication
2445 if(!m_hasCommForce) {
2446 RECORD_TIMER_STOP(t_setBCNC);
2447 return;
2448 }
2449
2450 m_log << " + Found a BC which requires communication:" << endl;
2451
2452 // currently working only for one BC
2453 for(MInt i = 0; i < m_noAllBoundaryIds; i++) {
2454 MBool found = false;
2455 switch(m_allBoundaryIds[i]) {
2456 case 2000: {
2457 prepareBC2000();
2458 found = true;
2459 break;
2460 }
2461 default: {
2462 }
2463 }
2464 if(found) {
2465 break;
2466 }
2467 }
2468
2469 RECORD_TIMER_STOP(t_setBCNC);
2470}
virtual void prepareBC2000()
Prepares the BC 4072.
Definition: lbbndcnd.cpp:2486
virtual MBool checkForCommForce()
Checks if a BC exists that requires communication.
Definition: lbbndcnd.cpp:2407
MBool m_hasCommForce
Definition: lbbndcnd.h:411

◆ setBndCndHandler()

template<MInt nDim>
void LbBndCnd< nDim >::setBndCndHandler
virtual

setBndCndHandler() needs to be called after loadBndCells(). It needs the boundary condition to set the boundary condition handler. Each new boundary condition needs to be implemented here, too.

Definition at line 1786 of file lbbndcnd.cpp.

1786 {
1787 TRACE();
1788 if(!m_solver->isActive()) return;
1789
1790 NEW_SUB_TIMER(t_setBCHandler, "set BC handler", m_t_BCAll);
1791 RECORD_TIMER_START(t_setBCHandler);
1792
1793 m_log << " + Setting the boundary condition handler..." << endl << endl;
1794
1795 // Allocate space for pointer lists which store the boundary functions
1796 bndCndHandlerVariables.resize(m_bndCndIds.size());
1797 bndCndHandlerRHS.resize(m_bndCndIds.size());
1798 bndCndInitiator.resize(m_bndCndIds.size());
1799
1800 m_segIdUseBcData.resize(m_noSegments, 0);
1801
1802 // Fill the function pointer lists with correct bc functions
1803 for(MInt i = 0; i < (MInt)(m_bndCndIds.size()); i++) {
1804 switch(m_bndCndIds[i]) {
1805 case 0:
1809 DEBUG("ERROR: bndCndHandlers only point to a dummy function", MAIA_DEBUG_LEVEL1);
1810 break;
1811
1812 //----------------------------------------------------
1813 // velocity boundary conditions
1814
1815 case 1000: // velocity (eq)
1820 break;
1821 case 1001: // velocity (eq)
1826 break;
1827 case 1002: // Inflow condition for periodic channel (z periodic, x/y is inflow)
1832 break;
1833 case 1004: // velocity (eq)
1838 break;
1839 case 1022: // Inflow condition for periodic channel (z periodic, x/y is inflow)
1844 break;
1845 case 1010: // Inflow condition
1850 break;
1851 case 1020: // Inflow condition
1856 break;
1857 case 1040: // velocity NRCBC Izquerdo et al. 2008
1858 bcDataAllocate(i, nDim + 1);
1863 break;
1864 case 1041:
1865 bcDataAllocate(i, nDim + 1);
1870 break;
1871 case 1042:
1872 bcDataAllocate(i, nDim + 1);
1877 break;
1878 case 1043:
1879 bcDataAllocate(i, nDim + 1);
1884 break;
1885 case 1044:
1886 bcDataAllocate(i, nDim + 1);
1891 break;
1892 case 1045:
1893 bcDataAllocate(i, nDim + 1);
1898 break;
1899 case 1046: // velocity CBC LODI (force equilibrium)
1904 break;
1905 case 1050:
1910 break;
1911 case 1060: // velocity (eq), thermal
1916 break;
1917 case 1061: // velocity (eq), thermal, Blasius for velocity
1919 solveBlasiusZ(i);
1923 break;
1924 case 1070: // keeping local inflow mass flux to rho_0*Ma*Cs
1925 if(m_densityFluctuations) TERMM(1, "BC 1070 not working for densityFluctuations");
1930 break;
1931
1932 case 1090: // velocity (eq), transport, concentration = 0.0
1937 break;
1938
1939 //----------------------------------------------------
1940 // Pulsatile BCs
1941
1942 case 1080: // velocity (eq) - sinus
1947 break;
1948
1949
1950 //----------------------------------------------------
1951 // Povitsky
1952
1953 case 1111: // Povitsky cavity condition (equilibirum dist)
1957 break;
1958
1959 //----------------------------------------------------
1960 // wall boundary conditions
1961
1962 case 2000: // no slip, BFL
1966 break;
1967 case 2001: // no slip, simple bounce back, halfway between nodes
1971 break;
1972 case 2002: // no slip, simple bounce back, on nodes
1976 break;
1977 case 2003: // no slip, equilibrium functions
1981 break;
1982 case 2004: // no slip, Haenel interpolated
1986 break;
1987 case 2005: // no slip, Guo interpolated
1991 break;
1992 case 2006: // free slip, only for 2d
1996 break;
1997 case 2010: // no slip, BFL, with force calculation
2001 break;
2002 case 2020: // no slip, BFL, with force calculation
2006 break;
2007 case 2220: // no slip, BFL , Thermal
2011 break;
2012
2013 case 2226: // no slip, BFL, Thermal (Dirichlet condition), cylinder flow
2017 break;
2018 case 2227: // no slip, BFL, Thermal (Dirichlet condition), channel flow
2022 break;
2023 case 2228: // no slip, BFL, Thermal flux (Neumann condition), channel flow
2027 break;
2028
2029 case 2022: // no slip, BFL , also for Thermal
2033 break;
2034 case 2023: // no slip, simple bounce back, on nodes for Thermal
2038 break;
2039 case 2024: // no slip, Thermal bc2004
2043 break;
2044 case 2025: // no slip, Thermal, sets eq. dist. fnc. for given mac. vars.
2048 break;
2049 case 2026: // no slip, simple bounce back, halfway between nodes, same as 2001, but also for Thermal
2053 break;
2054 case 2027: // no slip, interpolated bounce back, thermal interpolated
2058 break;
2059 case 2030: // no slip, Haenel interpolated with velocity
2063 break;
2064 case 2230: // no slip, Haenel interpolated with velocity
2068 break;
2069 case 2050: // sliding wall in axis direction
2073 break;
2074 case 2051:
2078 break;
2079 case 2052:
2083 break;
2084 case 2053:
2088 break;
2089 case 2054:
2093 break;
2094 case 2055:
2098 break;
2099
2100 case 2501: // nasal mucosa model, latent heat
2104 break;
2105
2106 //----------------------------------------------------
2107 // zero gradient boundary conditions
2108
2109 //----------------------------------------------------
2110 case 3000: // extrapolation in normal vector direction
2114 break;
2115
2116 case 3010: // extrapolation in axis direction
2120 break;
2121 case 3011:
2125 break;
2126 case 3012:
2130 break;
2131 case 3013:
2135 break;
2136 case 3014:
2140 break;
2141 case 3015:
2145 break;
2146
2147 case 3020:
2151 break;
2152 case 3021:
2156 break;
2157 case 3022:
2161 break;
2162 case 3023:
2166 break;
2167 case 3024:
2171 break;
2172 case 3025:
2176 break;
2177
2178 case 3030:
2182 break;
2183 case 3031:
2187 break;
2188 case 3032:
2192 break;
2193 case 3033:
2197 break;
2198 case 3034:
2202 break;
2203 case 3035:
2207 break;
2208
2209 case 3040:
2213 break;
2214 case 3041:
2218 break;
2219 case 3042:
2223 break;
2224 case 3043:
2228 break;
2229 case 3044:
2233 break;
2234 case 3045:
2238 break;
2239
2240 case 3050:
2244 break;
2245
2246
2247 //----------------------------------------------------
2248 // pressure bc's
2249
2250 case 4000: // prescribe equilibrium distributions
2254 break;
2255 case 4001: // prescribe equilibrium distributions
2259 break;
2260 case 4010: // Extrapolation Chen
2264 break;
2265 case 4020: // relaxed pressure
2269 break;
2270 case 4030: // Extrapolation with non-eq
2274 break;
2275 case 4040: // pressure NRCBC Izquerdo et al. 2008
2276 bcDataAllocate(i, nDim + 1);
2280 break;
2281 case 4041:
2282 bcDataAllocate(i, nDim + 1);
2286 break;
2287 case 4042:
2288 bcDataAllocate(i, nDim + 1);
2292 break;
2293 case 4043:
2294 bcDataAllocate(i, nDim + 1);
2298 break;
2299 case 4044:
2300 bcDataAllocate(i, nDim + 1);
2304 break;
2305 case 4045:
2306 bcDataAllocate(i, nDim + 1);
2310 break;
2311
2312 case 4046: // non-reflective based on LODI by prescribing equilibrium
2316 break;
2317
2318 case 4060:
2322 break;
2323
2324 case 4070: // relax pressure based on formulations by Hoerschler
2328 break;
2329 case 4071: // hold pressure constant at a given value
2333 break;
2334 case 4072: // adjusts pressure to yield a specified local Reynolds number
2338 break;
2339 case 4073: // adjusts pressure to yield a specified local Reynolds number (measured at a specified location)
2343 break;
2344 case 4080: // relax pressure based on formulations by Hoerschler, additionally set temperature
2348 break;
2349 case 4081: // hold pressure constant at a given value, extrapolate temperature and velcoities
2353 break;
2354 case 4082: // adjusts pressure to yield a specified local Reynolds number
2358 break;
2359
2360 case 4100: // prescribe equilibrium distributions
2364 break;
2365 case 4110: // prescribe equilibrium distributions (similar to bc4030)
2369 break;
2370
2371 case 4120: // prescribe equilibrium distributions (similar to bc4030)
2375 break;
2376
2377 case 4130: // Extrapolation with non-eq
2381 break;
2382 default:
2383 stringstream errorMessage;
2384 errorMessage << " LbBncCndDxQy::setBndCndHandler : Unknown boundary condition " << m_bndCndIds[i]
2385 << " exiting program.";
2386 TERMM(1, errorMessage.str());
2387 }
2388 }
2389
2390 // Communications
2391 MPI_Allreduce(MPI_IN_PLACE, m_segIdUseBcData.data(), m_segIdUseBcData.size(), MPI_INT, MPI_SUM, m_solver->mpiComm(),
2392 AT_, "MPI_IN_PLACE", "m_SegIdUseBcData.data()");
2393
2394 RECORD_TIMER_STOP(t_setBCHandler);
2395}
virtual void bc20051(MInt)
Definition: lbbndcnd.h:297
virtual void bc30042(MInt)
Definition: lbbndcnd.h:328
virtual void bc20227(MInt)
Definition: lbbndcnd.h:280
virtual void bc10041(MInt)
Definition: lbbndcnd.h:251
virtual void bc10002(MInt)
Definition: lbbndcnd.h:245
virtual void bc40043(MInt)
Definition: lbbndcnd.h:344
virtual void bc30013(MInt)
Definition: lbbndcnd.h:308
virtual void bc10010(MInt)
Definition: lbbndcnd.h:248
virtual void bcIBBNeumannInit(MInt)
Definition: lbbndcnd.h:285
virtual void bc40073(MInt)
Definition: lbbndcnd.h:354
virtual void bc30023(MInt)
Definition: lbbndcnd.h:315
virtual void bc40046(MInt)
Definition: lbbndcnd.h:347
virtual void bc20228(MInt)
Definition: lbbndcnd.h:281
virtual void bc30012(MInt)
Definition: lbbndcnd.h:307
virtual void bc10022(MInt)
Definition: lbbndcnd.h:247
virtual void bc30024(MInt)
Definition: lbbndcnd.h:316
virtual void bc20002(MInt)
Definition: lbbndcnd.h:270
virtual void bc40072_40082_init(MInt)
Definition: lbbndcnd.h:359
virtual void bc20005(MInt)
Definition: lbbndcnd.h:273
virtual void bc10040(MInt)
Definition: lbbndcnd.h:250
virtual void bc20022(MInt)
Definition: lbbndcnd.h:287
virtual void bc20001(MInt)
Definition: lbbndcnd.h:269
virtual void bc20006(MInt)
Definition: lbbndcnd.h:274
virtual void bc40040(MInt)
Definition: lbbndcnd.h:341
virtual void bc40042(MInt)
Definition: lbbndcnd.h:343
virtual void bc30014(MInt)
Definition: lbbndcnd.h:309
virtual void bc20226(MInt)
Definition: lbbndcnd.h:279
virtual void bc20501_init(MInt)
Definition: lbbndcnd.h:283
virtual void bc10000(MInt)
Definition: lbbndcnd.h:243
virtual void bc30030(MInt)
Definition: lbbndcnd.h:319
virtual void bc10044(MInt)
Definition: lbbndcnd.h:254
virtual void bc30022(MInt)
Definition: lbbndcnd.h:314
virtual void bc20010(MInt)
Definition: lbbndcnd.h:275
virtual void bc30043(MInt)
Definition: lbbndcnd.h:329
virtual void bc20220(MInt)
Definition: lbbndcnd.h:277
virtual void bc30000(MInt)
Definition: lbbndcnd.h:303
virtual void bc20000(MInt)
Definition: lbbndcnd.h:268
virtual void bc30040(MInt)
Definition: lbbndcnd.h:326
virtual void bc10111(MInt)
Definition: lbbndcnd.h:368
virtual void bc40071(MInt)
Definition: lbbndcnd.h:352
virtual void bc10090(MInt)
Definition: lbbndcnd.h:262
virtual void bc10060(MInt)
Definition: lbbndcnd.h:259
virtual void bc40072(MInt)
Definition: lbbndcnd.h:353
virtual void bc40030(MInt)
Definition: lbbndcnd.h:339
void bcDataAllocate(MInt index, MInt noVars)
Allocate data for given boundary index.
Definition: lbbndcnd.cpp:1404
virtual void bc20024(MInt)
Definition: lbbndcnd.h:289
virtual void bc40120(MInt)
Definition: lbbndcnd.h:364
virtual void bc40110(MInt)
Definition: lbbndcnd.h:362
MInt m_densityFluctuations
Definition: lbbndcnd.h:147
virtual void bc40070(MInt)
Definition: lbbndcnd.h:351
virtual void bc10004(MInt)
Definition: lbbndcnd.h:246
virtual void bc40080(MInt)
Definition: lbbndcnd.h:355
virtual void bc20050(MInt)
Definition: lbbndcnd.h:296
virtual void bc40081(MInt)
Definition: lbbndcnd.h:356
void applyDirectionChangeInflow(MInt index)
This function checks if for an inflow boundary the normal points into the according direction and cha...
Definition: lbbndcnd.cpp:1564
virtual void bc10001(MInt)
Definition: lbbndcnd.h:244
virtual void bc30034(MInt)
Definition: lbbndcnd.h:323
virtual void bc30041(MInt)
Definition: lbbndcnd.h:327
virtual void bc20023(MInt)
Definition: lbbndcnd.h:288
virtual void bc30050(MInt)
Definition: lbbndcnd.h:333
virtual void bc40020(MInt)
Definition: lbbndcnd.h:338
virtual void bc20025(MInt)
Definition: lbbndcnd.h:290
virtual void bc40044(MInt)
Definition: lbbndcnd.h:345
virtual void bc30031(MInt)
Definition: lbbndcnd.h:320
virtual void bc20055(MInt)
Definition: lbbndcnd.h:301
virtual void bc40010(MInt)
Definition: lbbndcnd.h:337
virtual void bc30010(MInt)
Definition: lbbndcnd.h:305
virtual void bc20052(MInt)
Definition: lbbndcnd.h:298
virtual void bc30015(MInt)
Definition: lbbndcnd.h:310
virtual void bc30033(MInt)
Definition: lbbndcnd.h:322
virtual void bc20501(MInt)
Definition: lbbndcnd.h:282
virtual void bc40041(MInt)
Definition: lbbndcnd.h:342
virtual void bc20053(MInt)
Definition: lbbndcnd.h:299
virtual void bc40060(MInt)
Definition: lbbndcnd.h:349
virtual void bc30025(MInt)
Definition: lbbndcnd.h:317
virtual void bc10020(MInt)
Definition: lbbndcnd.h:249
virtual void bc10050(MInt)
Definition: lbbndcnd.h:258
virtual void bc30044(MInt)
Definition: lbbndcnd.h:330
virtual void bc40100(MInt)
Definition: lbbndcnd.h:361
virtual void bc30035(MInt)
Definition: lbbndcnd.h:324
virtual void bc10043(MInt)
Definition: lbbndcnd.h:253
virtual void bc30011(MInt)
Definition: lbbndcnd.h:306
virtual void bc40000(MInt)
Definition: lbbndcnd.h:335
virtual void bc20027(MInt)
Definition: lbbndcnd.h:292
virtual void bc10061(MInt)
Definition: lbbndcnd.h:260
virtual void bc20030(MInt)
Definition: lbbndcnd.h:293
virtual void bc30045(MInt)
Definition: lbbndcnd.h:331
virtual void bc40001(MInt)
Definition: lbbndcnd.h:336
virtual void bc20026(MInt)
Definition: lbbndcnd.h:291
virtual void bc10042(MInt)
Definition: lbbndcnd.h:252
virtual void bc10045(MInt)
Definition: lbbndcnd.h:255
virtual void bc20003(MInt)
Definition: lbbndcnd.h:271
virtual void bc10046(MInt)
Definition: lbbndcnd.h:256
virtual void bc40082(MInt)
Definition: lbbndcnd.h:357
virtual void bc40130(MInt)
Definition: lbbndcnd.h:366
virtual void bc20054(MInt)
Definition: lbbndcnd.h:300
virtual void solveBlasiusZ(MInt index)
Solves the Blasius equation for f,f',f".
Definition: lbbndcnd.cpp:1614
virtual void bc30032(MInt)
Definition: lbbndcnd.h:321
virtual void bc10070(MInt)
Definition: lbbndcnd.h:264
virtual void bc30021(MInt)
Definition: lbbndcnd.h:313
virtual void bc30020(MInt)
Definition: lbbndcnd.h:312
virtual void bc20020(MInt)
Definition: lbbndcnd.h:276
virtual void bc20230(MInt)
Definition: lbbndcnd.h:294
virtual void bc10080(MInt)
Definition: lbbndcnd.h:266
virtual void bc20004(MInt)
Definition: lbbndcnd.h:272
virtual void bc40045(MInt)
Definition: lbbndcnd.h:346

◆ solveBlasiusZ()

template<MInt nDim>
void LbBndCnd< nDim >::solveBlasiusZ ( MInt  index)
protectedvirtual
Author
Andreas Lintermann
Date
24.05.2011

Solves the Blasius equation for cells in positive z-direction and stores the result in an array m_blasius. The values are calculated beginning with a starting f" = 0.332051914927913096446.The similarity parameter eta of the boundary cells is stored in the boundary cell variable m_eta.

Parameters
indexThe index ot the boundary to be treated

Definition at line 1614 of file lbbndcnd.cpp.

1614 {
1615 TRACE();
1616 MInt currentId;
1617 MFloat minmax[2] = {10000000.0, -10000000.0};
1618
1619 MInt x_pos = m_solver->m_referenceLength * m_solver->m_blasiusPos;
1620 MFloat z_pos = 0.0;
1621
1622 set<MFloat> etas;
1623 MFloat eta;
1624
1625 MFloat etamax;
1626 MFloat fppwall = 0.332051914927913096446;
1627
1628 // This is fine enough!
1629 MFloat deta = 0.001;
1630 MInt steps;
1631
1632 // Find min and max Z
1633 for(MInt i = m_bndCndOffsets[index], j = 0; i < m_bndCndOffsets[index + 1]; i++, j++) {
1634 if(m_solver->c_noChildren(m_bndCells[i].m_cellId) > 0) continue;
1635 if(m_solver->a_coordinate(m_bndCells[i].m_cellId, nDim - 1) < minmax[0])
1636 minmax[0] = m_solver->a_coordinate(m_bndCells[i].m_cellId, nDim - 1);
1637 if(m_solver->a_coordinate(m_bndCells[i].m_cellId, nDim - 1) > minmax[1])
1638 minmax[1] = m_solver->a_coordinate(m_bndCells[i].m_cellId, nDim - 1);
1639 }
1640
1641 // Find all etas and store in m_eta
1642 for(MInt i = m_bndCndOffsets[index]; i < m_bndCndOffsets[index + 1]; i++) {
1643 currentId = m_bndCells[i].m_cellId;
1644 if(m_solver->c_noChildren(currentId) > 0) {
1645 m_bndCells[i].m_eta = 0.0;
1646 continue;
1647 }
1648 z_pos = ((m_solver->a_coordinate(currentId, nDim - 1)) - minmax[0]
1649 + ((m_solver->c_cellLengthAtLevel(m_solver->maxLevel())) / 2.0))
1650 / (m_solver->c_cellLengthAtLevel(m_solver->maxLevel()));
1651 eta = z_pos * sqrt((m_Ma * LBCS) / (x_pos * m_solver->m_nu));
1652 etas.insert(eta);
1653
1654 m_bndCells[i].m_eta = eta;
1655 }
1656
1657 // Sort entries
1658 list<MFloat> etas_sorted;
1659 for(set<MFloat>::iterator i = etas.begin(); i != etas.end(); i++)
1660 etas_sorted.push_back(*i);
1661
1662 etas_sorted.sort();
1663
1664 list<MFloat>::iterator it1 = etas_sorted.end();
1665 it1--;
1666 list<MFloat>::iterator it2 = etas_sorted.begin();
1667 it2++;
1668
1669
1670 // Calculate Blasius solution
1671 etamax = *(it1);
1672 it1 = etas_sorted.begin();
1673
1674 steps = etamax / deta;
1675
1676 // This is accurate enough
1677 m_blasius_delta = deta;
1678
1679 mAlloc(m_blasius, steps + 1, 5, "m_blasius", F0, AT_);
1680 m_blasius[0][3] = fppwall;
1681
1682 // Lets use the shooting method for getting the Blasius solution
1683 for(MInt i = 0; i < steps; i++) {
1684 m_blasius[i + 1][0] = m_blasius[i][0] + deta;
1685 m_blasius[i + 1][1] = m_blasius[i][1] + m_blasius[i][2] * deta;
1686 m_blasius[i + 1][2] = m_blasius[i][2] + m_blasius[i][3] * deta;
1687 m_blasius[i + 1][3] = m_blasius[i][3] + (-0.5 * m_blasius[i][1] * m_blasius[i][3]) * deta;
1688 }
1689}
MFloat ** m_blasius
Definition: lbbndcnd.h:166
MFloat m_blasius_delta
Definition: lbbndcnd.h:167
MFloat m_Ma
Definition: lbbndcnd.h:141

◆ sortBoundaryCells()

template<MInt nDim>
void LbBndCnd< nDim >::sortBoundaryCells
protected
Author
Andreas Lintermann
Date
27.01.2010

The sorting of the boundary cells is necessary because all cells are stored in one single collector. The boundary condition functions get the position of a type of boundary cells in the collector (offset) and the number of boundary cells of equal type ( i.e. with the same boundary id) as parameter.

Definition at line 1702 of file lbbndcnd.cpp.

1702 {
1703 TRACE();
1704
1705 // TODO labels:LB,TIMERS fix timers when sortBoundaryCells is called from lbbndcnddxqy.cpp
1706 /* NEW_SUB_TIMER(t_sortBCCells, "sort boundary cells", m_t_BCAll); */
1707 /* RECORD_TIMER_START(t_sortBCCells); */
1708
1709 // Sort the boundary cells
1710 const MInt tmpCellSize = m_bndCells.size();
1711
1712 m_log << " + Sorting boundary cells..." << endl;
1713 m_log << " - no. boundary cells: " << tmpCellSize << endl;
1714
1715 // using stable_sort to preserve the order by cellId within segmentIds
1716 stable_sort(m_bndCells.begin(), m_bndCells.end(),
1717 [](auto& a, auto& b) { return a.m_segmentId[0] < b.m_segmentId[0]; });
1718
1719 MInt tmpSegmentId = -1; // holds the current id
1720 MInt tmpBndCndId = -1; // holds the current boundary cells bndCndId
1721 MInt counter = 0; // Counts the boundary cells
1722
1723 // setting some default states, which is important in case of redoing this
1724 // method call
1725 m_bndCndIds.clear();
1726 m_bndCndOffsets.clear();
1727 m_bndCndSegIds.clear();
1731 // TODO labels:LB maybe also useful to reset: a_isBndryCell, a_bndId
1732
1733 for(MInt i = 0; i < tmpCellSize; i++) {
1734 if(tmpSegmentId != m_bndCells[i].m_segmentId[0]) {
1735 // Since m_bndCells has been sorted previously and new segmentid differs
1736 // from tmpSegmentId, we sort now for a new tmpSegmentId and co
1737 tmpSegmentId = m_bndCells[i].m_segmentId[0];
1738 tmpBndCndId = m_bndCells[i].m_bndCndId[0];
1739
1740 m_bndCndIds.push_back(tmpBndCndId);
1741 m_bndCndOffsets.push_back(counter);
1742 m_bndCndSegIds.push_back(tmpSegmentId);
1743 m_mapBndCndSegId2Index[tmpSegmentId] = m_bndCndSegIds.size() - 1;
1744 m_mapIndex2BndCndSegId[m_bndCndSegIds.size() - 1] = tmpSegmentId;
1745 }
1746 m_noBndCellsPerSegment[tmpSegmentId]++;
1747 m_solver->a_isBndryCell(m_bndCells[counter].m_cellId) = true;
1748 m_solver->a_bndId(m_bndCells[counter].m_cellId) = counter;
1749
1750 counter++;
1751 }
1752
1753 m_bndCndOffsets.push_back(counter);
1754
1755 // Make the mapping from all segments ids to the one that are just in/outflow
1756 m_mapSegIdsInOutCnd.resize((MInt)m_bndCndSegIds.size());
1757 for(MInt i = 0; i < (MInt)(m_bndCndSegIds.size()); i++) {
1758 MInt seg_id = m_bndCndSegIds[i];
1759
1760 m_log << " - BC " << m_bndCndIds[i] << endl;
1761 m_log << " * index: " << i << endl;
1762 m_log << " * segment id: " << seg_id << endl;
1763 m_log << " * no cells: " << m_noBndCellsPerSegment[seg_id] << endl;
1764 m_log << " * offsets: " << m_bndCndOffsets[i] << " - " << m_bndCndOffsets[i + 1] - 1 << endl;
1765
1766 MInt pos = -1;
1767 for(MInt j = 0; j < m_noInOutSegments; j++)
1768 if(seg_id == m_inOutSegmentsIds[j]) pos = j;
1769
1770 m_mapSegIdsInOutCnd[i] = pos;
1771
1772 m_log << " * mapping: " << m_mapSegIdsInOutCnd[i] << " "
1773 << ((m_mapSegIdsInOutCnd[i] < 0) ? "(this is not an inflow / outflow BC)" : "") << endl;
1774 }
1775 m_log << endl;
1776
1777 /* RECORD_TIMER_STOP(t_sortBCCells); */
1778}
std::vector< MInt > m_mapIndex2BndCndSegId
Definition: lbbndcnd.h:163
Definition: contexttypes.h:19

◆ updateBndNormals()

template<MInt nDim>
void LbBndCnd< nDim >::updateBndNormals ( MInt  segId,
MBool  is_inside,
MFloat avg_normal 
)
privatevirtual
Author
Andreas Lintermann
Date
21.09.2015
Parameters
[in]segIdthe id of the segment
[in]is_insidethe result of the inside / outside determination
[in]svg_normalthe averaged normal used to override

Definition at line 1364 of file lbbndcnd.cpp.

1364 {
1365 // init the right direction, they should always point outside
1366 m_bndNormalDirection[segId] = -1;
1367
1368 // outside
1369 if(!is_inside) {
1370 for(MInt d = 0; d < nDim; d++)
1371 m_bndNormals[segId][d] = avg_normal[d];
1372 }
1373 // inside
1374 else {
1375 for(MInt d = 0; d < nDim; d++)
1376 m_bndNormals[segId][d] = -1.0 * avg_normal[d];
1377 }
1378}

◆ updateRHS()

template<MInt nDim>
void LbBndCnd< nDim >::updateRHS
virtual

Definition at line 3185 of file lbbndcnd.cpp.

3185 {
3186 TRACE();
3187 for(MInt i = 0; i < (MInt)(m_bndCndIds.size()); i++) {
3188 (this->*bndCndHandlerRHS[i])(i);
3189 }
3190}

◆ updateVariables()

template<MInt nDim>
void LbBndCnd< nDim >::updateVariables
virtual

Definition at line 3174 of file lbbndcnd.cpp.

3174 {
3175 TRACE();
3176
3177 for(MInt i = 0; i < (MInt)(m_bndCndIds.size()); i++) {
3178 (this->*bndCndHandlerVariables[i])(i);
3179 }
3180}

Friends And Related Function Documentation

◆ CouplingLB

template<MInt nDim>
template<MInt nDim_, MInt nDist_, class SysEqn_ >
friend class CouplingLB
friend

Definition at line 50 of file lbbndcnd.h.

◆ LbSolver

template<MInt nDim>
template<MInt nDim_>
friend class LbSolver
friend

Definition at line 48 of file lbbndcnd.h.

Member Data Documentation

◆ BCGroup

template<MInt nDim>
MPI_Group* LbBndCnd< nDim >::BCGroup {}
protected

Definition at line 391 of file lbbndcnd.h.

◆ bndCndHandlerRHS

template<MInt nDim>
std::vector<BndCndHandler> LbBndCnd< nDim >::bndCndHandlerRHS
protected

Definition at line 63 of file lbbndcnd.h.

◆ bndCndHandlerRHS_MB

template<MInt nDim>
std::vector<BndCndHandler_Mb> LbBndCnd< nDim >::bndCndHandlerRHS_MB
protected

Definition at line 67 of file lbbndcnd.h.

◆ bndCndHandlerVariables

template<MInt nDim>
std::vector<BndCndHandler> LbBndCnd< nDim >::bndCndHandlerVariables
protected

Definition at line 62 of file lbbndcnd.h.

◆ bndCndHandlerVariables_MB

template<MInt nDim>
std::vector<BndCndHandler> LbBndCnd< nDim >::bndCndHandlerVariables_MB
protected

Definition at line 66 of file lbbndcnd.h.

◆ bndCndInitiator

template<MInt nDim>
std::vector<BndCndHandler> LbBndCnd< nDim >::bndCndInitiator
protected

Definition at line 64 of file lbbndcnd.h.

◆ haloInformation

template<MInt nDim>
MInt* LbBndCnd< nDim >::haloInformation = nullptr
private

Definition at line 223 of file lbbndcnd.h.

◆ m_allBoundaryIds

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_allBoundaryIds {}
protected

Definition at line 397 of file lbbndcnd.h.

◆ m_allDomainsCalcForceMB

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_allDomainsCalcForceMB {}
protected

Definition at line 410 of file lbbndcnd.h.

◆ m_allDomainsHaveBC

template<MInt nDim>
MInt** LbBndCnd< nDim >::m_allDomainsHaveBC {}
protected

Definition at line 399 of file lbbndcnd.h.

◆ m_BCComm

template<MInt nDim>
MPI_Comm* LbBndCnd< nDim >::m_BCComm {}
protected

Definition at line 392 of file lbbndcnd.h.

◆ m_BCneighbors

template<MInt nDim>
std::vector<std::vector<MInt> > LbBndCnd< nDim >::m_BCneighbors
protected

Definition at line 402 of file lbbndcnd.h.

◆ m_BCOutputFileName

template<MInt nDim>
MString* LbBndCnd< nDim >::m_BCOutputFileName {}
protected

Definition at line 396 of file lbbndcnd.h.

◆ m_BCResidualStream

template<MInt nDim>
std::ofstream* LbBndCnd< nDim >::m_BCResidualStream {}
protected

Definition at line 404 of file lbbndcnd.h.

◆ m_BCWallMBComm

template<MInt nDim>
MPI_Comm LbBndCnd< nDim >::m_BCWallMBComm
protected

Definition at line 412 of file lbbndcnd.h.

◆ m_BCWallMBNeighbors

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_BCWallMBNeighbors
protected

Definition at line 417 of file lbbndcnd.h.

◆ m_blasius

template<MInt nDim>
MFloat** LbBndCnd< nDim >::m_blasius {}
protected

Definition at line 166 of file lbbndcnd.h.

◆ m_blasius_delta

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_blasius_delta {}
protected

Definition at line 167 of file lbbndcnd.h.

◆ m_bndCells

template<MInt nDim>
std::vector<LbGridBoundaryCell<nDim> > LbBndCnd< nDim >::m_bndCells
protected

Definition at line 130 of file lbbndcnd.h.

◆ m_bndCndData

template<MInt nDim>
std::unordered_map<MInt, LbBndCndData> LbBndCnd< nDim >::m_bndCndData {}
protected

Definition at line 177 of file lbbndcnd.h.

◆ m_bndCndIds

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_bndCndIds
protected

Definition at line 158 of file lbbndcnd.h.

◆ m_bndCndOffsets

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_bndCndOffsets
protected

Definition at line 159 of file lbbndcnd.h.

◆ m_bndCndSegIds

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_bndCndSegIds
protected

Definition at line 160 of file lbbndcnd.h.

◆ m_bndNormalDirection

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_bndNormalDirection = nullptr
protected

Definition at line 93 of file lbbndcnd.h.

◆ m_bndNormalMethod

template<MInt nDim>
MString LbBndCnd< nDim >::m_bndNormalMethod
protected

Definition at line 111 of file lbbndcnd.h.

◆ m_bndNormals

template<MInt nDim>
MFloat** LbBndCnd< nDim >::m_bndNormals = nullptr
protected

Definition at line 90 of file lbbndcnd.h.

◆ m_boundaryCellMappingMb

template<MInt nDim>
std::map<MInt, MInt> LbBndCnd< nDim >::m_boundaryCellMappingMb
protected

Definition at line 71 of file lbbndcnd.h.

◆ m_boundaryCellsMb

template<MInt nDim>
MbCellCollector LbBndCnd< nDim >::m_boundaryCellsMb {}
protected

Definition at line 57 of file lbbndcnd.h.

◆ m_calcBcResidual

template<MInt nDim>
MBool LbBndCnd< nDim >::m_calcBcResidual
protected

Definition at line 403 of file lbbndcnd.h.

◆ m_calcSublayerDist

template<MInt nDim>
MBool LbBndCnd< nDim >::m_calcSublayerDist = false
protected

Definition at line 174 of file lbbndcnd.h.

◆ m_calcWallForces

template<MInt nDim>
MBool LbBndCnd< nDim >::m_calcWallForces
protected

Definition at line 97 of file lbbndcnd.h.

◆ m_calcWallForcesInterval

template<MInt nDim>
MInt LbBndCnd< nDim >::m_calcWallForcesInterval
protected

Definition at line 98 of file lbbndcnd.h.

◆ m_currentTimeStep

template<MInt nDim>
MInt LbBndCnd< nDim >::m_currentTimeStep {}
protected

Definition at line 388 of file lbbndcnd.h.

◆ m_deltaRho

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_deltaRho {}
protected

Definition at line 383 of file lbbndcnd.h.

◆ m_densityFluctuations

template<MInt nDim>
MInt LbBndCnd< nDim >::m_densityFluctuations
protected

Definition at line 147 of file lbbndcnd.h.

◆ m_domainLength

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_domainLength
protected

Definition at line 146 of file lbbndcnd.h.

◆ m_exDirs

template<MInt nDim>
MInt** LbBndCnd< nDim >::m_exDirs = nullptr
protected

Definition at line 125 of file lbbndcnd.h.

◆ m_exWeights

template<MInt nDim>
MFloat** LbBndCnd< nDim >::m_exWeights = nullptr
protected

Definition at line 126 of file lbbndcnd.h.

◆ m_fastParallelGeomNormals

template<MInt nDim>
MInt LbBndCnd< nDim >::m_fastParallelGeomNormals {}
protected

Definition at line 112 of file lbbndcnd.h.

◆ m_Fext

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_Fext
protected

Definition at line 104 of file lbbndcnd.h.

◆ m_firstBCinComm

template<MInt nDim>
MInt LbBndCnd< nDim >::m_firstBCinComm {}
protected

Definition at line 424 of file lbbndcnd.h.

◆ m_forceFile

template<MInt nDim>
MString LbBndCnd< nDim >::m_forceFile
protected

Definition at line 416 of file lbbndcnd.h.

◆ m_gradient

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_gradient {}
protected

Definition at line 144 of file lbbndcnd.h.

◆ m_gridCutTest

template<MInt nDim>
MString LbBndCnd< nDim >::m_gridCutTest
protected

Definition at line 132 of file lbbndcnd.h.

◆ m_hasCommForce

template<MInt nDim>
MBool LbBndCnd< nDim >::m_hasCommForce
protected

Definition at line 411 of file lbbndcnd.h.

◆ m_hasLocalReCut

template<MInt nDim>
MBool LbBndCnd< nDim >::m_hasLocalReCut {}
protected

Definition at line 419 of file lbbndcnd.h.

◆ m_initialNoCells

template<MInt nDim>
MInt LbBndCnd< nDim >::m_initialNoCells[3] {}
protected

Definition at line 69 of file lbbndcnd.h.

◆ m_initialVelocityVecs

template<MInt nDim>
MFloat** LbBndCnd< nDim >::m_initialVelocityVecs = nullptr
protected

Definition at line 89 of file lbbndcnd.h.

◆ m_initVelocityMethod

template<MInt nDim>
MString LbBndCnd< nDim >::m_initVelocityMethod
protected

Definition at line 110 of file lbbndcnd.h.

◆ m_inOutSegmentsIds

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_inOutSegmentsIds = nullptr
protected

Definition at line 91 of file lbbndcnd.h.

◆ m_interpolationDistMethod

template<MInt nDim>
MString LbBndCnd< nDim >::m_interpolationDistMethod
protected

Definition at line 113 of file lbbndcnd.h.

◆ m_latentHeat

template<MInt nDim>
MBool LbBndCnd< nDim >::m_latentHeat = false
protected

Definition at line 173 of file lbbndcnd.h.

◆ m_lbControlInflow

template<MInt nDim>
MInt LbBndCnd< nDim >::m_lbControlInflow {}
protected

Definition at line 157 of file lbbndcnd.h.

◆ m_lbNoHeatedWalls

template<MInt nDim>
MInt LbBndCnd< nDim >::m_lbNoHeatedWalls
protected

Definition at line 99 of file lbbndcnd.h.

◆ m_lbNoMovingWalls

template<MInt nDim>
MInt LbBndCnd< nDim >::m_lbNoMovingWalls
protected

Definition at line 94 of file lbbndcnd.h.

◆ m_lbWallTemperature

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_lbWallTemperature {}
protected

Definition at line 101 of file lbbndcnd.h.

◆ m_lbWallVelocity

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_lbWallVelocity {}
protected

Definition at line 96 of file lbbndcnd.h.

◆ m_localReCutAdpPerc

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_localReCutAdpPerc {}
protected

Definition at line 422 of file lbbndcnd.h.

◆ m_localReCutCells

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_localReCutCells
protected

Definition at line 418 of file lbbndcnd.h.

◆ m_localReCutDiameter

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_localReCutDiameter {}
protected

Definition at line 409 of file lbbndcnd.h.

◆ m_localReCutDistance

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_localReCutDistance {}
protected

Definition at line 407 of file lbbndcnd.h.

◆ m_localReCutInterval

template<MInt nDim>
MInt LbBndCnd< nDim >::m_localReCutInterval {}
protected

Definition at line 421 of file lbbndcnd.h.

◆ m_localReCutNormal

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_localReCutNormal {}
protected

Definition at line 406 of file lbbndcnd.h.

◆ m_localReCutPoint

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_localReCutPoint {}
protected

Definition at line 405 of file lbbndcnd.h.

◆ m_localReCutRe

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_localReCutRe {}
protected

Definition at line 408 of file lbbndcnd.h.

◆ m_localReCutReportInterval

template<MInt nDim>
MInt LbBndCnd< nDim >::m_localReCutReportInterval {}
protected

Definition at line 423 of file lbbndcnd.h.

◆ m_lRho

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_lRho {}
protected

Definition at line 386 of file lbbndcnd.h.

◆ m_Ma

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_Ma
protected

Definition at line 141 of file lbbndcnd.h.

◆ m_mapBndCndIdSegId

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_mapBndCndIdSegId {}
protected

Definition at line 393 of file lbbndcnd.h.

◆ m_mapBndCndSegId2Index

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_mapBndCndSegId2Index
protected

Definition at line 162 of file lbbndcnd.h.

◆ m_mapIndex2BndCndSegId

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_mapIndex2BndCndSegId
protected

Definition at line 163 of file lbbndcnd.h.

◆ m_mapSegIdsInOutCnd

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_mapSegIdsInOutCnd
protected

Definition at line 161 of file lbbndcnd.h.

◆ m_mapWallForceContainer

template<MInt nDim>
std::unordered_map<MInt, maia::lb::CalcWallForceContainer> LbBndCnd< nDim >::m_mapWallForceContainer
protected

Definition at line 415 of file lbbndcnd.h.

◆ m_maxDeltaRho

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_maxDeltaRho {}
protected

Definition at line 387 of file lbbndcnd.h.

◆ m_maxNoDistributionsInDim

template<MInt nDim>
MInt LbBndCnd< nDim >::m_maxNoDistributionsInDim
protected

Definition at line 107 of file lbbndcnd.h.

◆ m_maxNoG0CellsLb

template<MInt nDim>
MInt LbBndCnd< nDim >::m_maxNoG0CellsLb
protected

Definition at line 105 of file lbbndcnd.h.

◆ m_methodId

template<MInt nDim>
MInt LbBndCnd< nDim >::m_methodId
protected

Definition at line 137 of file lbbndcnd.h.

◆ m_multiBCTreatment

template<MInt nDim>
MString LbBndCnd< nDim >::m_multiBCTreatment
protected

Definition at line 115 of file lbbndcnd.h.

◆ m_noAllBoundaryIds

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noAllBoundaryIds {}
protected

Definition at line 398 of file lbbndcnd.h.

◆ m_noBCNeighbors

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_noBCNeighbors {}
protected

Definition at line 401 of file lbbndcnd.h.

◆ m_noBCWallMBNeighbors

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noBCWallMBNeighbors
protected

Definition at line 413 of file lbbndcnd.h.

◆ m_noBndCellsPerSegment

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_noBndCellsPerSegment
protected

Definition at line 164 of file lbbndcnd.h.

◆ m_noDistributions

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noDistributions
protected

Definition at line 136 of file lbbndcnd.h.

◆ m_noInOutSegments

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noInOutSegments {}
protected

Definition at line 86 of file lbbndcnd.h.

◆ m_noInternalCells

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noInternalCells
protected

Definition at line 68 of file lbbndcnd.h.

◆ m_noPeriodicSegments

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noPeriodicSegments
protected

Definition at line 87 of file lbbndcnd.h.

◆ m_noReactivatedCells

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noReactivatedCells
protected

Definition at line 425 of file lbbndcnd.h.

◆ m_noSegments

template<MInt nDim>
MInt LbBndCnd< nDim >::m_noSegments {}
protected

Definition at line 88 of file lbbndcnd.h.

◆ m_nu

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_nu {}
protected

Definition at line 143 of file lbbndcnd.h.

◆ m_numberOfCommBCs

template<MInt nDim>
MInt LbBndCnd< nDim >::m_numberOfCommBCs = 0
protected

Definition at line 400 of file lbbndcnd.h.

◆ m_omega

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_omega {}
protected

Definition at line 140 of file lbbndcnd.h.

◆ m_outputWallDistanceField

template<MInt nDim>
MBool LbBndCnd< nDim >::m_outputWallDistanceField = false
protected

Definition at line 114 of file lbbndcnd.h.

◆ m_periodicSegmentsIds

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_periodicSegmentsIds
protected

Definition at line 92 of file lbbndcnd.h.

◆ m_phi

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_phi = nullptr
protected

Definition at line 118 of file lbbndcnd.h.

◆ m_pulsatileFrequency

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_pulsatileFrequency
protected

Definition at line 170 of file lbbndcnd.h.

◆ m_Re

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_Re {}
protected

Definition at line 142 of file lbbndcnd.h.

◆ m_referenceLength

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_referenceLength
protected

Definition at line 145 of file lbbndcnd.h.

◆ m_ReLast

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_ReLast {}
protected

Definition at line 384 of file lbbndcnd.h.

◆ m_rho1

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_rho1 {}
protected

Definition at line 149 of file lbbndcnd.h.

◆ m_rho2

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_rho2 {}
protected

Definition at line 150 of file lbbndcnd.h.

◆ m_rhoLast

template<MInt nDim>
MFloat LbBndCnd< nDim >::m_rhoLast {}
protected

Definition at line 385 of file lbbndcnd.h.

◆ m_segIdHeatedWalls

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_segIdHeatedWalls {}
protected

Definition at line 100 of file lbbndcnd.h.

◆ m_segIdMovingWalls

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_segIdMovingWalls {}
protected

Definition at line 95 of file lbbndcnd.h.

◆ m_segIdUseBcData

template<MInt nDim>
std::vector<MInt> LbBndCnd< nDim >::m_segIdUseBcData {}
protected

Definition at line 178 of file lbbndcnd.h.

◆ m_solver

template<MInt nDim>
LbSolver<nDim>* LbBndCnd< nDim >::m_solver
protected

Definition at line 60 of file lbbndcnd.h.

◆ m_solverId

template<MInt nDim>
MInt LbBndCnd< nDim >::m_solverId
protected

Definition at line 129 of file lbbndcnd.h.

◆ m_t_BCAll

template<MInt nDim>
MInt LbBndCnd< nDim >::m_t_BCAll
private

Definition at line 219 of file lbbndcnd.h.

◆ m_theta

template<MInt nDim>
MFloat* LbBndCnd< nDim >::m_theta = nullptr
protected

Definition at line 119 of file lbbndcnd.h.

◆ m_totalNoBcCells

template<MInt nDim>
MInt* LbBndCnd< nDim >::m_totalNoBcCells {}
protected

Definition at line 394 of file lbbndcnd.h.

◆ m_totalNoDomainsReCut

template<MInt nDim>
MInt LbBndCnd< nDim >::m_totalNoDomainsReCut {}
protected

Definition at line 420 of file lbbndcnd.h.

◆ mpi_request

template<MInt nDim>
MPI_Request* LbBndCnd< nDim >::mpi_request = nullptr
private

Definition at line 225 of file lbbndcnd.h.

◆ PV

template<MInt nDim>
MPrimitiveVariables<nDim>* LbBndCnd< nDim >::PV
protected

Definition at line 134 of file lbbndcnd.h.

◆ receiveBuffersMB

template<MInt nDim>
MFloat* LbBndCnd< nDim >::receiveBuffersMB = nullptr
private

Definition at line 222 of file lbbndcnd.h.

◆ retrieveNormal

template<MInt nDim>
MBool(LbBndCnd::* LbBndCnd< nDim >::retrieveNormal) (GeometryElement< nDim > ge, MFloat *normal)
private

Definition at line 199 of file lbbndcnd.h.

◆ sendBuffersMB

template<MInt nDim>
MFloat* LbBndCnd< nDim >::sendBuffersMB = nullptr
private

Definition at line 221 of file lbbndcnd.h.

◆ tmp_group

template<MInt nDim>
MPI_Group* LbBndCnd< nDim >::tmp_group {}
protected

Definition at line 390 of file lbbndcnd.h.

◆ windowInformation

template<MInt nDim>
MInt* LbBndCnd< nDim >::windowInformation = nullptr
private

Definition at line 224 of file lbbndcnd.h.


The documentation for this class was generated from the following files: