150 static T
equilibrium(
int iPop,
int jPop, T rho,
const T u[DESCRIPTOR::d])
154 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
155 sum += (u[iD] - descriptors::c<DESCRIPTOR>(jPop,iD))*(u[iD] - descriptors::c<DESCRIPTOR>(iPop,iD));
157 return (descriptors::invCs2<T,DESCRIPTOR>()*sum + T(1))/rho*eq;
161 static T
equilibrium2(
int iPop,
int jPop, T rho,
const T u[DESCRIPTOR::d])
164 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
165 u_c += u[iD]*descriptors::c<DESCRIPTOR>(iPop,iD);
168 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
169 sum += (u[iD]*u[iD] + 2.*descriptors::c<DESCRIPTOR>(jPop,iD)*(descriptors::c<DESCRIPTOR>(iPop,iD)-u[iD]) )
170 * descriptors::invCs2<T,DESCRIPTOR>()*0.5
171 + (u_c*descriptors::c<DESCRIPTOR>(iPop,iD)*(2.*descriptors::c<DESCRIPTOR>(jPop,iD)-u[iD]))
172 * descriptors::invCs2<T,DESCRIPTOR>()*descriptors::invCs2<T,DESCRIPTOR>()*0.5;
174 return descriptors::t<T,DESCRIPTOR>(iPop)*(1.+sum);
201 static T bgkCollision(T* cell, T rho, const T u[DESCRIPTOR::d], T omega) {
202 const T uSqr = util::normSqr<T,DESCRIPTOR::d>(u);
203 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
204 cell[iPop] *= (T)1-omega;
205 cell[iPop] += omega * lbm<DESCRIPTOR>::equilibrium (
206 iPop, rho, u, uSqr );
212 static T incBgkCollision(T* cell, T pressure, const T j[DESCRIPTOR::d], T omega) {
213 const T jSqr = util::normSqr<T,DESCRIPTOR::d>(j);
214 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
215 cell[iPop] *= (T)1-omega;
216 cell[iPop] += omega * lbm<DESCRIPTOR>::incEquilibrium (
217 iPop, j, jSqr, pressure );
223 static T constRhoBgkCollision(T* cell, T rho, const T u[DESCRIPTOR::d], T ratioRho, T omega) {
224 const T uSqr = util::normSqr<T,DESCRIPTOR::d>(u);
225 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
226 T feq = lbm<DESCRIPTOR>::equilibrium(iPop, rho, u, uSqr );
228 ratioRho*(feq+descriptors::t<T,DESCRIPTOR>(iPop))-descriptors::t<T,DESCRIPTOR>(iPop) +
229 ((T)1-omega)*(cell[iPop]-feq);
235 static T computeRho(T const* cell) {
237 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
245 static void computeJ(T const* cell, T j[DESCRIPTOR::d]) {
246 for (int iD=0; iD < DESCRIPTOR::d; ++iD) {
249 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
250 for (int iD=0; iD < DESCRIPTOR::d; ++iD) {
251 j[iD] += cell[iPop]*descriptors::c<DESCRIPTOR>(iPop,iD);
257 static void computeRhoU(T
const* cell, T& rho, T u[DESCRIPTOR::d])
261 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
264 for (
int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
266 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
267 u[iD] += cell[iPop]*descriptors::c<DESCRIPTOR>(iPop,iD);
270 for (
int iD=0; iD < DESCRIPTOR::d; ++iD) {
276 static void computeRhoJ(T
const* cell, T& rho, T j[DESCRIPTOR::d])
284 static void computeStress(T const* cell, T rho, const T u[DESCRIPTOR::d],
285 T pi[util::TensorVal<DESCRIPTOR>::n] )
288 for (int iAlpha=0; iAlpha < DESCRIPTOR::d; ++iAlpha) {
289 for (int iBeta=iAlpha; iBeta < DESCRIPTOR::d; ++iBeta) {
291 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
292 pi[iPi] += descriptors::c<DESCRIPTOR>(iPop,iAlpha) *
293 descriptors::c<DESCRIPTOR>(iPop,iBeta) * cell[iPop];
295 // stripe off equilibrium contribution
296 pi[iPi] -= rho*u[iAlpha]*u[iBeta];
298 pi[iPi] -= 1./descriptors::invCs2<T,DESCRIPTOR>()*(rho-(T)1);
306 static void computeAllMomenta(T const* cell, T& rho, T u[DESCRIPTOR::d],
307 T pi[util::TensorVal<DESCRIPTOR>::n] )
309 computeRhoU(cell, rho, u);
310 computeStress(cell, rho, u, pi);
313 static void modifyVelocity(T* cell, const T newU[DESCRIPTOR::d]) {
314 T rho, oldU[DESCRIPTOR::d];
315 computeRhoU(cell, rho, oldU);
316 const T oldUSqr = util::normSqr<T,DESCRIPTOR::d>(oldU);
317 const T newUSqr = util::normSqr<T,DESCRIPTOR::d>(newU);
318 for (int iPop=0; iPop<DESCRIPTOR::q; ++iPop) {
319 cell[iPop] = cell[iPop]
320 - equilibrium(iPop, rho, oldU, oldUSqr)
321 + equilibrium(iPop, rho, newU, newUSqr);
332 static void addExternalForce(Cell<T,DESCRIPTOR>& cell, const T u[DESCRIPTOR::d], T omega, T amplitude) {
333 static const int forceBeginsAt = DESCRIPTOR::template index<descriptors::FORCE>();
334 T* force = cell.template getFieldPointer<descriptors::FORCE>();
335 for (int iPop=0; iPop < DESCRIPTOR::q; ++iPop) {
337 for (int iD=0; iD < DESCRIPTOR::d; ++iD) {
338 c_u += descriptors::c<DESCRIPTOR>(iPop,iD)*u[iD];
340 c_u *= descriptors::invCs2<T,DESCRIPTOR>() * descriptors::invCs2<T,DESCRIPTOR>();
342 for (int iD=0; iD < DESCRIPTOR::d; ++iD) {
344 ( (descriptors::c<DESCRIPTOR>(iPop,iD)-u[iD]) * descriptors::invCs2<T,DESCRIPTOR>()
345 + c_u * descriptors::c<DESCRIPTOR>(iPop,iD)
349 forceTerm *= descriptors::t<T,DESCRIPTOR>(iPop);
350 forceTerm *= 1-omega/(T)2;
351 forceTerm *= amplitude;
352 cell[iPop] += forceTerm;