371 T particleDiam =
parameters.template get<PARTICLE_DIAMETER>();
372 T visc =
parameters.template get<VISCOSITY>();
373 T convVel =
parameters.template get<CONV_VEL>();
374 T convDens =
parameters.template get<CONV_DENS>();
375 T convForce =
parameters.template get<CONV_FORCE>();
376 T convMass =
parameters.template get<CONV_MASS>();
377 T partDens =
parameters.template get<PART_DENS>();
379 auto earthAcc =
parameters.template get<EARTH_ACC>();
380 using DESCRIPTOR =
typename CELLS::template value_t<names::NavierStokes>::descriptor_t;
381 auto& cellNSE = cells.template get<names::NavierStokes>();
382 auto& cellADE = cells.template get<names::Concentration0>();
384 auto u_p = cellADE.template getField<descriptors::VELOCITY>();
385 auto u_pXp = cellADE.neighbor({1,0,0}).
template getField<descriptors::VELOCITY2>();
386 auto u_pXm = cellADE.neighbor({-1,0,0}).
template getField<descriptors::VELOCITY2>();
387 auto u_pYp = cellADE.neighbor({0,1,0}).
template getField<descriptors::VELOCITY2>();
388 auto u_pYm = cellADE.neighbor({0,-1,0}).
template getField<descriptors::VELOCITY2>();
389 auto u_pZp = cellADE.neighbor({0,0,1}).
template getField<descriptors::VELOCITY2>();
390 auto u_pZm = cellADE.neighbor({0,0,-1}).
template getField<descriptors::VELOCITY2>();
391 auto u_f = cellADE.template getField<descriptors::VELOCITY>();
392 T por = (1. - cellADE.computeRho());
394 cellNSE.computeRhoU(rho, u_f.data());
397 relU[0] = (u_f[0] - u_p[0]) * convVel;
398 relU[1] = (u_f[1] - u_p[1]) * convVel;
399 relU[2] = (u_f[2] - u_p[2]) * convVel;
400 T
norm =
util::sqrt(relU[0]*relU[0] + relU[1]*relU[1] + relU[2]*relU[2]);
401 T Re_p =
norm * particleDiam / visc;
405 C_D = 24.*(1. + 0.15*
util::pow(Re_p,0.687))/Re_p;
414 F_D[0] = 9.*visc*convDens/partDens/particleDiam*relU[0];
415 F_D[1] = 9.*visc*convDens/partDens/particleDiam*relU[1];
416 F_D[2] = 9.*visc*convDens/partDens/particleDiam*relU[2];
418 T mass = partDens * 3.14/4. * particleDiam * particleDiam;
419 if(cellADE.computeRho() > 0.001){
420 u_p[0] += dt * (F_D[0] + earthAcc[0]*(partDens - convDens)/partDens) / convVel - u_p * 0.5 * (u_pXp - u_pXm);
421 u_p[1] += dt * (F_D[1] + earthAcc[1]*(partDens - convDens)/partDens) / convVel - u_p * 0.5 * (u_pYp - u_pYm);
422 u_p[2] += dt * (F_D[2] + earthAcc[2]*(partDens - convDens)/partDens) / convVel - u_p * 0.5 * (u_pZp - u_pZm);
423 cellADE.template setField<descriptors::VELOCITY>(u_p);
426 T porPlusX = (1. - cellADE.neighbor({1,0,0}).computeRho());
427 T porMinusX = (1. - cellADE.neighbor({-1,0,0}).computeRho());
428 T porPlusY = (1. - cellADE.neighbor({0,1,0}).computeRho());
429 T porMinusY = (1. - cellADE.neighbor({0,-1,0}).computeRho());
430 T porPlusZ = (1. - cellADE.neighbor({0,0,1}).computeRho());
431 T porMinusZ = (1. - cellADE.neighbor({0,0,-1}).computeRho());
433 T porDX2 = porPlusX -2.*por + porMinusX;
434 T porDY2 = porPlusY -2.*por + porMinusY;
435 T porDZ2 = porPlusZ -2.*por + porMinusZ;
438 if( porDX2 != 0.) choice += 1;
439 if( porDY2 != 0.) choice += 1;
440 if( porDZ2 != 0.) choice += 1;
442 T coeff = (choice == 1) *1./4. + (choice == 2) * 1./6. + (choice == 3) * 5./36.;
443 T pressCorr = por + coeff * (porDX2 + porDY2 + porDZ2);
444 if(pressCorr < 0.001){ pressCorr = 1.; }
445 cellNSE.template setField<descriptors::PRESSCORR>(pressCorr);
446 T press = rho / pressCorr / descriptors::invCs2<T,DESCRIPTOR>();
447 T pressCorrForce[3] = {0.};
448 pressCorrForce[0] = press * 0.5 * (porPlusX - porMinusX);
449 pressCorrForce[1] = press * 0.5 * (porPlusY - porMinusY);
450 pressCorrForce[2] = press * 0.5 * (porPlusZ - porMinusZ);
453 if(cellADE.computeRho() > 0.001){
454 force[0] = pressCorrForce[0] / rho - (1. - por) * por * F_D[0] / convForce * convMass * partDens / rho + por * earthAcc[0] / convVel * dt;
455 force[1] = pressCorrForce[1] / rho - (1. - por) * por * F_D[1] / convForce * convMass * partDens / rho + por * earthAcc[1] / convVel * dt;
456 force[2] = pressCorrForce[2] / rho - (1. - por) * por * F_D[2] / convForce * convMass * partDens / rho + por * earthAcc[2] / convVel * dt;
458 cellNSE.template setField<descriptors::FORCE>(force);