ZouHeDynamics::DensityType ZouHeDynamics::calcDensity(DataType& data, const VelocityType& velocity) const noexcept { const auto center = sumValues(data, CENTER_RHO.at(m_position)); const auto known = sumValues(data, KNOWN_RHO.at(m_position)); const auto velP = velocity.dot(VELOCITIES.at(m_position)); const auto wHs = Descriptor::getSplitCoefficient(); return (center + 2.0 * known) / (wHs - velP); }
ZouHeDynamics::VelocityType ZouHeDynamics::calcVelocity(DataType& data, DensityType rho) const noexcept { const auto center = sumValues(data, CENTER_RHO.at(m_position)); const auto known = sumValues(data, KNOWN_RHO.at(m_position)); const auto wHs = Descriptor::getSplitCoefficient(); const RealType speed = wHs - (1.0 / rho * (center + 2.0 * known)); // Velocity vector return speed * VELOCITIES.at(m_position); }
bool checkLTSumConsistency(LinearTermPtr a, LinearTermPtr b, DofOrderingPtr dofOrdering, BasisCachePtr basisCache) { double tol = 1e-14; int numCells = basisCache->cellIDs().size(); int numDofs = dofOrdering->totalDofs(); bool forceBoundaryTerm = false; FieldContainer<double> aValues(numCells,numDofs), bValues(numCells,numDofs), sumValues(numCells,numDofs); a->integrate(aValues,dofOrdering,basisCache,forceBoundaryTerm); b->integrate(bValues,dofOrdering,basisCache,forceBoundaryTerm); (a+b)->integrate(sumValues, dofOrdering, basisCache, forceBoundaryTerm); int size = aValues.size(); for (int i=0; i<size; i++) { double expectedValue = aValues[i] + bValues[i]; double diff = abs( expectedValue - sumValues[i] ); if (diff > tol) { return false; } } return true; }