116 std::vector<Scalar> kinematicEddyViscosityInner(this->gridGeometry().elementMapper().size(), 0.0);
117 std::vector<Scalar> kinematicEddyViscosityOuter(this->gridGeometry().elementMapper().size(), 0.0);
118 std::vector<Scalar> kinematicEddyViscosityDifference(this->gridGeometry().elementMapper().size(), 0.0);
119 std::vector<Scalar> switchingPosition(this->gridGeometry().elementMapper().size(), std::numeric_limits<Scalar>::max());
126 const Scalar aPlus = 26.0;
127 const Scalar k = 0.0168;
128 const Scalar cCP = 1.6;
129 const Scalar cWake = 0.25;
130 const Scalar cKleb = 0.3;
132 std::vector<Scalar> storedFMax;
133 std::vector<Scalar> storedYFMax;
134 storedFMax.resize(this->gridGeometry().elementMapper().size(), 0.0);
135 storedYFMax.resize(this->gridGeometry().elementMapper().size(), 0.0);
138 for (
const auto& element : elements(this->gridGeometry().gridView()))
140 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
141 Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength(elementIdx);
142 unsigned int flowDirectionAxis = this->flowDirectionAxis(elementIdx);
143 unsigned int wallNormalAxis = this->wallNormalAxis(elementIdx);
145 Scalar omegaAbs = abs(this->velocityGradient(elementIdx, flowDirectionAxis, wallNormalAxis)
146 - this->velocityGradient(elementIdx, wallNormalAxis, flowDirectionAxis));
147 Scalar uStar = sqrt(this->kinematicViscosity(asImp_().wallElementIndex(elementIdx))
148 * abs(this->velocityGradient(asImp_().wallElementIndex(elementIdx), flowDirectionAxis, wallNormalAxis)));
149 Scalar yPlus = effectiveWallDistance * uStar / this->kinematicViscosity(elementIdx);
150 Scalar mixingLength = this->karmanConstant() * effectiveWallDistance * (1.0 - exp(-yPlus / aPlus));
151 kinematicEddyViscosityInner[elementIdx] = mixingLength * mixingLength * omegaAbs;
153 Scalar f = effectiveWallDistance * omegaAbs * (1.0 - exp(-yPlus / aPlus));
154 if (f > storedFMax[asImp_().wallElementIndex(elementIdx)])
156 storedFMax[asImp_().wallElementIndex(elementIdx)] = f;
157 storedYFMax[asImp_().wallElementIndex(elementIdx)] = effectiveWallDistance;
162 for (
const auto& element : elements(this->gridGeometry().gridView()))
164 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
165 Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength(elementIdx);
167 Scalar maxVelocityNorm = 0.0;
168 Scalar minVelocityNorm = 0.0;
169 for (
unsigned axisIdx = 0; axisIdx < dim; ++axisIdx)
171 maxVelocityNorm += asImp_().velocityMaximum(asImp_().wallElementIndex(elementIdx))[axisIdx]
172 * asImp_().velocityMaximum(asImp_().wallElementIndex(elementIdx))[axisIdx];
173 minVelocityNorm += asImp_().velocityMinimum(asImp_().wallElementIndex(elementIdx))[axisIdx]
174 * asImp_().velocityMinimum(asImp_().wallElementIndex(elementIdx))[axisIdx];
177 Scalar deltaU = sqrt(maxVelocityNorm) - sqrt(minVelocityNorm);
178 Scalar yFMax = storedYFMax[asImp_().wallElementIndex(elementIdx)];
179 Scalar fMax = storedFMax[asImp_().wallElementIndex(elementIdx)];
180 Scalar fWake = min(yFMax * fMax, cWake * yFMax * deltaU * deltaU / fMax);
181 Scalar fKleb = 1.0 / (1.0 + 5.5 * power(cKleb * effectiveWallDistance / yFMax, 6));
182 kinematicEddyViscosityOuter[elementIdx] = k * cCP * fWake * fKleb;
184 kinematicEddyViscosityDifference[elementIdx]
185 = kinematicEddyViscosityInner[elementIdx] - kinematicEddyViscosityOuter[elementIdx];
189 for (
const auto& element : elements(this->gridGeometry().gridView()))
191 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
192 Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength(elementIdx);
195 Scalar check = kinematicEddyViscosityDifference[asImp_().wallElementIndex(elementIdx)] * kinematicEddyViscosityDifference[elementIdx];
197 && switchingPosition[asImp_().wallElementIndex(elementIdx)] > effectiveWallDistance)
199 switchingPosition[asImp_().wallElementIndex(elementIdx)] = effectiveWallDistance;
204 for (
const auto& element : elements(this->gridGeometry().gridView()))
206 unsigned int elementIdx = this->gridGeometry().elementMapper().index(element);
207 Scalar effectiveWallDistance = asImp_().wallDistance(elementIdx) + additionalRoughnessLength(elementIdx);
209 kinematicEddyViscosity_[elementIdx] = kinematicEddyViscosityInner[elementIdx];
210 if (effectiveWallDistance >= switchingPosition[asImp_().wallElementIndex(elementIdx)])
212 kinematicEddyViscosity_[elementIdx] = kinematicEddyViscosityOuter[elementIdx];