palabos源码:reduceImmersedForce

这个博客详细介绍了如何使用模板类ReduceImmersedForce3D来计算带有特定tag的固体物在流体中的受力情况。通过比较顶点标记并累加g力,实现对特定区域的力的求和。在这个过程中,首先检查顶点的flag,然后仅对匹配指定reductionFlag的顶点进行力的计算和积累。此方法适用于多体动力学模拟中的沉浸边界条件处理。
摘要由CSDN通过智能技术生成

我们可以通过instantiateImmersedWallDataWithIndexedTagging生成贴上不同tag的固体物,这样根据不同的tag可以通过reduceImmersedForce计算其受力。

其原理也很简单,就是通过对比vertices的flag,然后从g里面累计得到力。

template<typename T>
ReduceImmersedForce3D<T>::ReduceImmersedForce3D(int reductionFlag_)
    : sum_g_ids(
            Array<plint,3> (
                this->getStatistics().subscribeSum(),
                this->getStatistics().subscribeSum(),
                this->getStatistics().subscribeSum() ) ),
      reductionFlag(reductionFlag_)
{ }

template<typename T>
void ReduceImmersedForce3D<T>::processGenericBlocks (
        Box3D domain, std::vector<AtomicBlock3D*> blocks )
{
    PLB_PRECONDITION( blocks.size()==1 );
    AtomicContainerBlock3D* container = dynamic_cast<AtomicContainerBlock3D*>(blocks[0]);
    PLB_ASSERT( container );
    Dot3D location = container->getLocation();
    ImmersedWallData3D<T>* wallData = 
        dynamic_cast<ImmersedWallData3D<T>*>( container->getData() );
    PLB_ASSERT(wallData);
    std::vector< Array<T,3> > const& vertices = wallData->vertices;
    std::vector< Array<T,3> > const& g = wallData->g;
    std::vector<int> const& flags = wallData->flags;
    PLB_ASSERT( vertices.size()==g.size() );
    PLB_ASSERT( vertices.size()==flags.size() );

    for (pluint i=0; i<vertices.size(); ++i) {
        Array<T,3> vertex = vertices[i];
        if ( flags[i]==reductionFlag &&
             closedOpenContained(vertex, domain.shift(location.x, location.y, location.z)) )
        {
            this->getStatistics().gatherSum(sum_g_ids[0], g[i][0]);
            this->getStatistics().gatherSum(sum_g_ids[1], g[i][1]);
            this->getStatistics().gatherSum(sum_g_ids[2], g[i][2]);
        }
    }
}

template<typename T>
ReduceImmersedForce3D<T>* ReduceImmersedForce3D<T>::clone() const {
    return new ReduceImmersedForce3D<T>(*this);
}

template<typename T>
void ReduceImmersedForce3D<T>::getTypeOfModification(std::vector<modif::ModifT>& modified) const {
    modified[0] = modif::nothing; // Container Block.
}

template<typename T>
BlockDomain::DomainT ReduceImmersedForce3D<T>::appliesTo() const {
    return BlockDomain::bulk;
}

template<typename T>
Array<T,3> ReduceImmersedForce3D<T>::getSumG() const {
    return Array<T,3> (
            this->getStatistics().getSum(sum_g_ids[0]),
            this->getStatistics().getSum(sum_g_ids[1]),
            this->getStatistics().getSum(sum_g_ids[2]) );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值