OpenLB 1.7
Loading...
Searching...
No Matches
Classes | Public Types | Public Member Functions | Static Public Attributes | List of all members
olb::VANSADECoupling< T > Struct Template Reference

VANS-ADE coupling. More...

#include <navierStokesAdvectionDiffusionCoupling.h>

+ Collaboration diagram for olb::VANSADECoupling< T >:

Classes

struct  CONV_DENS
 
struct  CONV_FORCE
 
struct  CONV_MASS
 
struct  CONV_VEL
 
struct  DT
 
struct  EARTH_ACC
 
struct  PART_DENS
 
struct  PARTICLE_DIAMETER
 
struct  VISCOSITY
 

Public Types

using parameters = meta::list<PARTICLE_DIAMETER,VISCOSITY,CONV_VEL,CONV_DENS,PART_DENS,DT,CONV_FORCE,CONV_MASS,EARTH_ACC>
 

Public Member Functions

template<typename CELLS , typename PARAMETERS >
void apply (CELLS &cells, PARAMETERS &parameters) any_platform
 

Static Public Attributes

static constexpr OperatorScope scope = OperatorScope::PerCellWithParameters
 

Detailed Description

template<typename T>
struct olb::VANSADECoupling< T >

VANS-ADE coupling.

Definition at line 353 of file navierStokesAdvectionDiffusionCoupling.h.

Member Typedef Documentation

◆ parameters

Definition at line 366 of file navierStokesAdvectionDiffusionCoupling.h.

Member Function Documentation

◆ apply()

template<typename T >
template<typename CELLS , typename PARAMETERS >
void olb::VANSADECoupling< T >::apply ( CELLS & cells,
PARAMETERS & parameters )
inline

Definition at line 369 of file navierStokesAdvectionDiffusionCoupling.h.

370 {
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>();
378 T dt = parameters.template get<DT>();
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>();
383
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());
393 T rho { };
394 cellNSE.computeRhoU(rho, u_f.data());
395
396 T relU[3] = {0.};
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;
402 T C_D = 0.;
403 if(Re_p != 0.){
404 if(Re_p <= 1000.){
405 C_D = 24.*(1. + 0.15*util::pow(Re_p,0.687))/Re_p;
406 }else{
407 C_D = 0.44;
408 }}
409 T F_D[3] = {0.};
410 //F_D[0] = C_D * 3./4. * rho * convDens * norm * relU[0] / particleDiam / partDens;
411 //F_D[1] = C_D * 3./4. * rho * convDens * norm * relU[1] / particleDiam / partDens;
412 //F_D[2] = C_D * 3./4. * rho * convDens * norm * relU[2] / particleDiam / partDens;
413 //dragCoeff = (9.*converter_.getPhysViscosity()*converter_.getPhysDensity()*converter_.getConversionFactorTime()) / (2.*pRho_*pRadius_*pRadius_);
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];
417
418 T mass = partDens * 3.14/4. * particleDiam * particleDiam;
419 if(cellADE.computeRho() > 0.001){
420 u_p[0] += dt * (F_D[0]/*mass*/ + earthAcc[0]*(partDens - convDens)/partDens) / convVel - u_p * 0.5 * (u_pXp - u_pXm);
421 u_p[1] += dt * (F_D[1]/*mass*/ + earthAcc[1]*(partDens - convDens)/partDens) / convVel - u_p * 0.5 * (u_pYp - u_pYm);
422 u_p[2] += dt * (F_D[2]/*mass*/ + earthAcc[2]*(partDens - convDens)/partDens) / convVel - u_p * 0.5 * (u_pZp - u_pZm);
423 cellADE.template setField<descriptors::VELOCITY>(u_p);
424 }
425
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());
432
433 T porDX2 = porPlusX -2.*por + porMinusX;
434 T porDY2 = porPlusY -2.*por + porMinusY;
435 T porDZ2 = porPlusZ -2.*por + porMinusZ;
436
437 int choice = 0;
438 if( porDX2 != 0.) choice += 1;
439 if( porDY2 != 0.) choice += 1;
440 if( porDZ2 != 0.) choice += 1;
441
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);
451
452 T force[3] = {0.};
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;
457 }
458 cellNSE.template setField<descriptors::FORCE>(force);
459 }
cpu::simd::Pack< T > sqrt(cpu::simd::Pack< T > value)
Definition pack.h:100
cpu::simd::Pack< T > pow(cpu::simd::Pack< T > base, cpu::simd::Pack< T > exp)
Definition pack.h:112
constexpr T norm(const ScalarVector< T, D, IMPL > &a)
Euclidean vector norm.
meta::list< PARTICLE_DIAMETER, VISCOSITY, CONV_VEL, CONV_DENS, PART_DENS, DT, CONV_FORCE, CONV_MASS, EARTH_ACC > parameters

References olb::norm(), olb::util::pow(), and olb::util::sqrt().

+ Here is the call graph for this function:

Member Data Documentation

◆ scope

template<typename T >
constexpr OperatorScope olb::VANSADECoupling< T >::scope = OperatorScope::PerCellWithParameters
staticconstexpr

Definition at line 354 of file navierStokesAdvectionDiffusionCoupling.h.


The documentation for this struct was generated from the following file: