我们可以通过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]) );
}