@xpqiu 好像是这样的,但是xxxx是对颗粒的某个值进行统计,类似于求D32。xxxx应该是不同核内取值不一样的数,如果这样的话,那么每个核内是计算自身负责区域内的颗粒,redece则是求和,应该是没问题的
下面是of内求D32的代码:
template<class CloudType>
inline Foam::scalar Foam::KinematicCloud<CloudType>::Dij
(
const label i,
const label j
) const
{
scalar si = 0.0;
scalar sj = 0.0;
forAllConstIter(typename KinematicCloud<CloudType>, *this, iter)
{
const parcelType& p = iter();
si += p.nParticle()*pow(p.d(), i);
sj += p.nParticle()*pow(p.d(), j);
}
reduce(si, sumOp<scalar>());
reduce(sj, sumOp<scalar>());
sj = max(sj, vSmall);
return si/sj;
}
我的代码是仿照写的,不过我要统计的是20个变量,所以直接定义List:
List<scalar> np(20,0.0);
for (label i=0;i<20;i++)
{
forAllIter(typename basicSprayCloud::sprayCloudType,parcels,pIter)
{
parceltype& p = pIter();
if (p满足条件)
{
np[i] += xxxx; //每个时间步累加
}
}
reduce(np[i], sumOp<scalar>());
}