如何将一些固体particles的体积整合成一个球形的有效parcel
-
@星星星星晴 这里面是两个环节的.一开始是粒子的注入.需要在注入后计算出它在cell里的state.这个state会store下来以计算后的形式,我认为这里是parcel了.
// Define local properties at beginning of time step // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ const scalar np0 = nParticle_; const scalar mass0 = mass();
接着是追踪parcel运动过程,在这里就只是调用之前calc出来的parcels的质量了.不同zise的parcel是一直被延续的,中间是以整体形式在计算域里被计算和追踪的.
// averaging sums forAllConstIter(typename TrackCloudType, cloud, iter) { const typename TrackCloudType::parcelType& p = iter(); const tetIndices tetIs = p.currentTetIndices(); const scalar m = p.nParticle()*p.mass();
这是我的理解,不知道是不是都对,你先看看,是不是符合你的情况.
-
@zhe
这就存在问题了啊,在开始的时候 parcel的mass 就是 他的size *volume 不考虑particle.
但是比如计算这个parcel受力的时候也用的是parcel的massOpenFOAM-8/src/lagrangian/intermediate/parcels/Templates/KinematicParcel/KinematicParcelI.H inline Foam::scalar Foam::KinematicParcel<ParcelType>::mass() const { return rho_*volume(); }
但是你后半部分的mass是在cloud中
OpenFOAM-8/src/lagrangian/intermediate/clouds/Templates/KinematicCloud/KinematicCloudI.H
就是代表着,在cloud中,追踪的mass是parcel这个合集的mass,真的很头大
-
@星星星星晴 在KinematicCloudI.H中计算了system mass也是以parcel来计算的,这是cloud层面上的.在我上个回复里的后半段是是追踪粒子的文档里的,不是cloud怎么的. 在追踪过程里,还是以parcel为追踪项的.
template<class ParcelType> template<class TrackCloudType> inline void Foam::MPPICParcel<ParcelType>::trackingData::updateAverages ( const TrackCloudType& cloud ) { // zero the sums volumeAverage_() = 0; radiusAverage_() = 0; rhoAverage_() = 0; uAverage_() = Zero; uSqrAverage_() = 0; frequencyAverage_() = 0; massAverage_() = 0; // temporary weights autoPtr<AveragingMethod<scalar>> weightAveragePtr ( AveragingMethod<scalar>::New ( IOobject ( cloud.name() + ":weightAverage", cloud.db().time().timeName(), cloud.mesh() ), cloud.solution().dict(), cloud.mesh() ) ); AveragingMethod<scalar>& weightAverage = weightAveragePtr(); // averaging sums forAllConstIter(typename TrackCloudType, cloud, iter) { const typename TrackCloudType::parcelType& p = iter(); const tetIndices tetIs = p.currentTetIndices(); const scalar m = p.nParticle()*p.mass(); volumeAverage_->add(p.coordinates(), tetIs, p.nParticle()*p.volume()); rhoAverage_->add(p.coordinates(), tetIs, m*p.rho()); uAverage_->add(p.coordinates(), tetIs, m*p.U()); massAverage_->add(p.coordinates(), tetIs, m); }
-
@zhe 我没有,而且MPPIC调用的是kinematicCloud,stochastic collision model中的很多properties是无法调用的比如下面这一段涉及到thermo的地方就是没有办法调用的。
bool massChanged = collideParcels(dt, p1, p2, m1, m2); if (massChanged) { if (m1 > rootVSmall) { const scalarField X(liquids_.X(p1.Y())); p1.setCellValues(this->owner(), td); p1.rho() = liquids_.rho(td.pc(), p1.T(), X); p1.Cp() = liquids_.Cp(td.pc(), p1.T(), X); p1.sigma() = liquids_.sigma(td.pc(), p1.T(), X); p1.mu() = liquids_.mu(td.pc(), p1.T(), X); p1.d() = cbrt(6.0*m1/(p1.nParticle()*p1.rho()*pi)); } if (m2 > rootVSmall) { const scalarField X(liquids_.X(p2.Y())); p2.setCellValues(this->owner(), td); p2.rho() = liquids_.rho(td.pc(), p2.T(), X); p2.Cp() = liquids_.Cp(td.pc(), p2.T(), X); p2.sigma() = liquids_.sigma(td.pc(), p2.T(), X); p2.mu() = liquids_.mu(td.pc(), p2.T(), X); p2.d() = cbrt(6.0*m2/(p2.nParticle()*p2.rho()*pi)); } }
Tut中的aachenbomb 在 stochastic collisionmodel 设置一个banana 就能看到Valid model了。
stochasticcollision model是spraycloud独有的。 而kinematiccloud中的collisionmodel 更多的倾向于是关于软硬球的处理,而且应该用的是deterministic tracking method。
所以如果你要在MPPIC下使用stochasticcollisionmodel的话,就要自己研究怎么添加模型了,基本上相当于自己全程写东西了