From ae4f808b51329a236dcbd7671ceb8c85c3906b6f Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Tue, 8 Jan 2019 11:08:20 +0100 Subject: Move distribution decomposition methods to cell --- src/refinement/coupler2D.hh | 106 ++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 63 deletions(-) (limited to 'src') diff --git a/src/refinement/coupler2D.hh b/src/refinement/coupler2D.hh index 49efe57..8370707 100644 --- a/src/refinement/coupler2D.hh +++ b/src/refinement/coupler2D.hh @@ -31,63 +31,6 @@ namespace olb { -template class DESCRIPTOR> -void computeFeq(const Cell& cell, T fEq[DESCRIPTOR::q]) -{ - T rho{}; - T u[2] {}; - cell.computeRhoU(rho, u); - const T uSqr = u[0]*u[0] + u[1]*u[1]; - for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { - fEq[iPop] = lbHelpers::equilibrium(iPop, rho, u, uSqr); - } -} - -template class DESCRIPTOR> -void computeFneq(const Cell& cell, T fNeq[DESCRIPTOR::q]) -{ - T rho{}; - T u[2] {}; - cell.computeRhoU(rho, u); - lbHelpers::computeFneq(cell, fNeq, rho, u); -} - -template -T order4interpolation(T fm3, T fm1, T f1, T f3) -{ - return 9./16. * (fm1 + f1) - 1./16. * (fm3 + f3); -} - -template -T order3interpolation(T fm1, T f1, T f3) -{ - return 3./8. * fm1 + 3./4. * f1 - 1./8. * f3; -} - -template -T order2interpolation(T f0, T f1) -{ - return 0.5 * (f0 + f1); -} - -template class DESCRIPTOR> -void computeRestrictedFneq(const SuperLattice2D& lattice, Vector pos, T restrictedFneq[DESCRIPTOR::q]) -{ - for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { - T fNeq[DESCRIPTOR::q] {}; - computeFneq(lattice.get(pos[0], pos[1] + DESCRIPTOR::c[iPop][0], pos[2] + DESCRIPTOR::c[iPop][1]), fNeq); - - for (int jPop=0; jPop < DESCRIPTOR::q; ++jPop) { - restrictedFneq[jPop] += fNeq[jPop]; - } - } - - for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { - restrictedFneq[iPop] /= DESCRIPTOR::q; - } -} - - template class DESCRIPTOR> Vector Coupler2D::getFineLatticeR(int y) const { @@ -159,7 +102,7 @@ void FineCoupler2D::store() T u[2] {}; T fNeq[DESCRIPTOR::q] {}; coarseLattice.get(pos).computeRhoU(rho, u); - computeFneq(coarseLattice.get(pos), fNeq); + coarseLattice.get(pos).computeFneq(fNeq); _c2f_rho[y] = rho; _c2f_u[y] = Vector(u); @@ -167,23 +110,41 @@ void FineCoupler2D::store() } } +template +T order4interpolation(T fm3, T fm1, T f1, T f3) +{ + return 9./16. * (fm1 + f1) - 1./16. * (fm3 + f3); +} + +template +T order3interpolation(T fm1, T f1, T f3) +{ + return 3./8. * fm1 + 3./4. * f1 - 1./8. * f3; +} + +template +T order2interpolation(T f0, T f1) +{ + return 0.5 * (f0 + f1); +} + template class DESCRIPTOR> void FineCoupler2D::interpolate() { auto& coarseLattice = this->_coarse.getSuperLattice(); for (int y=0; y < this->_coarseSize; ++y) { - const auto coarsePos = this->getCoarseLatticeR(y); + const auto coarseCell = coarseLattice.get(this->getCoarseLatticeR(y)); T rho{}; T u[2] {}; - coarseLattice.get(coarsePos).computeRhoU(rho, u); + coarseCell.computeRhoU(rho, u); _c2f_rho[y] = order2interpolation(rho, _c2f_rho[y]); _c2f_u[y][0] = order2interpolation(u[0], _c2f_u[y][0]); _c2f_u[y][1] = order2interpolation(u[1], _c2f_u[y][1]); T fNeq[DESCRIPTOR::q] {}; - computeFneq(coarseLattice.get(coarsePos), fNeq); + coarseCell.computeFneq(fNeq); for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { _c2f_fneq[y][iPop] = order2interpolation(fNeq[iPop], _c2f_fneq[y][iPop]); } @@ -201,7 +162,7 @@ void FineCoupler2D::couple() const auto finePos = this->getFineLatticeR(2*y); T fEq[DESCRIPTOR::q] {}; - computeFeq(coarseLattice.get(coarsePos), fEq); + coarseLattice.get(coarsePos).computeFeq(fEq); for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { fineLattice.get(finePos)[iPop] = fEq[iPop] + this->_coarse.getScalingFactor() * _c2f_fneq[y][iPop]; @@ -308,6 +269,25 @@ void FineCoupler2D::couple() } +template class DESCRIPTOR> +void computeRestrictedFneq(const SuperLattice2D& lattice, + Vector pos, + T restrictedFneq[DESCRIPTOR::q]) +{ + for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { + T fNeq[DESCRIPTOR::q] {}; + lattice.get(pos[0], pos[1] + DESCRIPTOR::c[iPop][0], pos[2] + DESCRIPTOR::c[iPop][1]).computeFneq(fNeq); + + for (int jPop=0; jPop < DESCRIPTOR::q; ++jPop) { + restrictedFneq[jPop] += fNeq[jPop]; + } + } + + for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) { + restrictedFneq[iPop] /= DESCRIPTOR::q; + } +} + template class DESCRIPTOR> CoarseCoupler2D::CoarseCoupler2D( Grid2D& coarse, Grid2D& fine, @@ -331,7 +311,7 @@ void CoarseCoupler2D::couple() const auto coarsePos = this->getCoarseLatticeR(y); T fEq[DESCRIPTOR::q] {}; - computeFeq(fineLattice.get(finePos), fEq); + fineLattice.get(finePos).computeFeq(fEq); T fNeq[DESCRIPTOR::q] {}; computeRestrictedFneq(fineLattice, finePos, fNeq); -- cgit v1.2.3