Viewing 9 posts - 1 through 9 (of 9 total)
• Author
Posts
• #5671
Gloriousface
Participant

Hello，everyone

I’m trying to simulate the two-component flow problem, but the examples are all the velocity boundary problems of one component. Can I use velocity boundary for two components?

Best，
Gloriousface

#5672
mathias
Keymaster

You can do, yes.

#5673
Gloriousface
Participant

Thank you very much for your reply. Sorry to disturb you again. I’m simulating the flow of oil drops in water. According to the example of cylinder2d, I set the velocity boundary at the entrance of two lattices and the pressure boundary at the exit, but the program can’t work normally. I hope you can help me solve this problem, I will be very grateful.

The main parts of the procedure are as follows：

void prepareGeometry(SuperGeometry2D<T>& superGeometry )
{
Vector<T,2> origin1( 0, 0 );
Vector<T,2> extend1( nx,ny );
IndicatorCuboid2D<T> channel( extend1, origin1 );
superGeometry.rename( 0,2 );
superGeometry.rename( 2,1,1,1 );
Vector<T,2> origin2( 0, 0);
Vector<T,2> extend2( 0, ny );
IndicatorCuboid2D<T> inflow( extend2, origin2 );
superGeometry.rename( 2,3,1,inflow );
Vector<T,2> origin3( nx-1, 0);
Vector<T,2> extend3( 1, ny );
IndicatorCuboid2D<T> outflow( extend3, origin3 );
superGeometry.rename( 2,4,1,outflow );
Vector<T,2> center( nx/2, 35);
IndicatorCircle2D<T> circle( center, 30 );
superGeometry.rename( 1,5,circle );
}

void prepareLattice( SuperLattice2D<T, DESCRIPTOR>& sLatticeOne,
SuperLattice2D<T, DESCRIPTOR>& sLatticeTwo,
Dynamics<T, DESCRIPTOR>& bulkDynamics1,
Dynamics<T, DESCRIPTOR>& bulkDynamics2,
Dynamics<T, DESCRIPTOR>& bounceBackRho0,
Dynamics<T, DESCRIPTOR>& bounceBackRho1,
SuperGeometry2D<T>& superGeometry )
{
const T omega = 1;
sLatticeOne.defineDynamics( superGeometry, 0, &instances::getNoDynamics<T, DESCRIPTOR>() );
sLatticeTwo.defineDynamics( superGeometry, 0, &instances::getNoDynamics<T, DESCRIPTOR>() );
sLatticeOne.defineDynamics( superGeometry, 1, &bulkDynamics1 );
sLatticeOne.defineDynamics( superGeometry, 2, &bulkDynamics1 );
sLatticeOne.defineDynamics( superGeometry, 3, &bulkDynamics1 );
sLatticeOne.defineDynamics( superGeometry, 4, &bulkDynamics1 );
sLatticeOne.defineDynamics( superGeometry, 5, &bulkDynamics1 );
sLatticeTwo.defineDynamics( superGeometry, 1, &bulkDynamics2 );
sLatticeTwo.defineDynamics( superGeometry, 2, &bulkDynamics2 );
sLatticeTwo.defineDynamics( superGeometry, 3, &bulkDynamics2 );
sLatticeTwo.defineDynamics( superGeometry, 4, &bulkDynamics2 );
sLatticeTwo.defineDynamics( superGeometry, 5, &bulkDynamics2 );

setLocalVelocityBoundary<T,DESCRIPTOR>(sLatticeOne, omega, superGeometry, 3);
setLocalPressureBoundary<T,DESCRIPTOR>(sLatticeOne, omega, superGeometry, 4);
setLocalVelocityBoundary<T,DESCRIPTOR>(sLatticeTwo, omega, superGeometry, 3);
setLocalPressureBoundary<T,DESCRIPTOR>(sLatticeTwo, omega, superGeometry, 4);

sLatticeOne.defineDynamics( superGeometry, 2, &bounceBackRho0 );
sLatticeTwo.defineDynamics( superGeometry, 2, &bounceBackRho1 );
}

void setBoundaryValues( SuperLattice2D<T, DESCRIPTOR>& sLatticeOne,
SuperLattice2D<T, DESCRIPTOR>& sLatticeTwo,
T force, int iT, SuperGeometry2D<T>& superGeometry )
{
if ( iT==0 ) {
AnalyticalConst2D<T,T> noise( 4.e-2 );
std::vector<T> v( 2,T() );
AnalyticalConst2D<T,T> zeroV( v );
AnalyticalConst2D<T,T> zero( 1.e-6 );
AnalyticalLinear2D<T,T> one( 0.,-force*invCs2<T,DESCRIPTOR>(),0.98+force*ny*invCs2<T,DESCRIPTOR>() );
AnalyticalConst2D<T,T> onePlus( 0.98+force*ny/2.*invCs2<T,DESCRIPTOR>() );
AnalyticalRandom2D<T,T> random;
AnalyticalIdentity2D<T,T> randomOne( random*noise+one );
AnalyticalIdentity2D<T,T> randomPlus( random*noise+onePlus );
std::vector<T> F( 2,T() );
F[1] = -force;
AnalyticalConst2D<T,T> f( F );

sLatticeOne.defineRhoU( superGeometry, 5, zero, zeroV );
sLatticeOne.iniEquilibrium( superGeometry, 5, zero, zeroV );
sLatticeOne.defineField<descriptors::EXTERNAL_FORCE>( superGeometry, 5, f );
sLatticeTwo.defineRhoU( superGeometry, 5, randomPlus, zeroV );
sLatticeTwo.iniEquilibrium( superGeometry, 5, randomPlus, zeroV );

sLatticeOne.defineRhoU( superGeometry, 1, randomOne, zeroV );
sLatticeOne.iniEquilibrium( superGeometry, 1, randomOne, zeroV );
sLatticeOne.defineField<descriptors::EXTERNAL_FORCE>( superGeometry, 1, f );
sLatticeTwo.defineRhoU( superGeometry, 1, zero, zeroV );
sLatticeTwo.iniEquilibrium( superGeometry, 1, zero, zeroV );

sLatticeOne.defineRhoU(superGeometry, 3, randomOne, zeroV);
sLatticeOne.iniEquilibrium(superGeometry, 3, randomOne, zeroV);
sLatticeOne.defineField<descriptors::EXTERNAL_FORCE>(superGeometry, 3, f);
sLatticeTwo.defineRhoU(superGeometry, 3, randomOne, zeroV);
sLatticeTwo.iniEquilibrium(superGeometry, 3, randomOne, zeroV);

sLatticeOne.defineRhoU(superGeometry, 4, randomPlus, zeroV);
sLatticeOne.iniEquilibrium(superGeometry, 4, randomPlus, zeroV);
sLatticeOne.defineField<descriptors::EXTERNAL_FORCE>(superGeometry, 4, f);
sLatticeTwo.defineRhoU(superGeometry, 4, randomPlus, zeroV);
sLatticeTwo.iniEquilibrium(superGeometry, 4, randomPlus, zeroV);

sLatticeOne.defineRhoU(superGeometry, 2, zero, zeroV);
sLatticeOne.iniEquilibrium(superGeometry, 2, zero, zeroV);
sLatticeOne.defineField<descriptors::EXTERNAL_FORCE>(superGeometry, 2, f);
sLatticeTwo.defineRhoU(superGeometry, 2, zero, zeroV);
sLatticeTwo.iniEquilibrium(superGeometry, 2, zero, zeroV);

PolynomialStartScale<T,T> StartScale( maxIter, T( 1 ) );
T iTvec[1] = {T( iT )};
T frac[1] = {};
StartScale( frac,iTvec );
T maxVelocity = 0.02*3./2.*frac[0];
T distance2Wall = 0.1;
Poiseuille2D<T> poiseuilleU( superGeometry, 3, maxVelocity, distance2Wall );
sLatticeOne.defineU( superGeometry, 3, poiseuilleU );
sLatticeTwo.defineU( superGeometry, 3, poiseuilleU );

sLatticeOne.initialize();
sLatticeTwo.initialize();
}
}

#5674
mathias
Keymaster

Using a pressure boundary means fixing the density which is not a good idea if you are interested in the density evolutions. You should set a convetion boundary condition instead, which is a Neuman condition for density and velocity!

#5675
Gloriousface
Participant

Thank you very much for your reply. In fact, the oil-water two-phase density I simulated should be fixed. I have some questions about the speed setting,

T distance2Wall = 0.1;

What is the function of distance2Wall？

#5676
mathias
Keymaster

it is basically there ot distigish betwwen bounce back boundaries (0.5) and other (1.0).

#5677
Gloriousface
Participant

Thank you for answering my question in your busy schedule. In the parameter initialization of velocity and pressure boundary in bstep2d, set the density to 1.

setLocalVelocityBoundary<T,DESCRIPTOR>(sLattice, converter.getLatticeRelaxationFrequency(), superGeometry, 3);
setLocalPressureBoundary<T,DESCRIPTOR>(sLattice, converter.getLatticeRelaxationFrequency(), superGeometry, 4);
AnalyticalConst2D<T,T> rho( 1. );
sLattice.defineRhoU( bulkIndicator, rho, u );
sLattice.iniEquilibrium( bulkIndicator, rho, u );

How to assign the density in the initial condition of velocity and pressure boundary in multicomponent flow?

#5678
mathias
Keymaster

You can see that in our multi-component examples. Best Mathias

#5680
Gloriousface
Participant

Thank you very much for your reply.

Viewing 9 posts - 1 through 9 (of 9 total)
• You must be logged in to reply to this topic.