AFEPack
组合类型 | 命名空间 | 函数
MPI_PeriodHandler.h文件参考

处理周期区域的工具 更多...

浏览该文件的源代码。

组合类型

struct  MPI::Periodic::PointDistance< DOW >
struct  MPI::Periodic::details::matchTolerence

命名空间

namespace  MPI
namespace  MPI::Periodic
namespace  MPI::Periodic::details

函数

template<int DIM, int DOW>
void MPI::Periodic::details::collectGeometry (HGeometry< DIM, DOW > &geo, int bnd_mark, property_id_t< bool > &pid, std::vector< std::vector< void * > > &bnd_geo)
template<class GEO >
void MPI::Periodic::details::geometry_reference_point (const GEO &geo, Point< GEO::dow > &pnt)
template<int DOW>
void MPI::Periodic::details::geometry_reference_point (const HGeometry< 0, DOW > &geo, Point< DOW > &pnt)
template<int DIM, class FOREST >
void MPI::Periodic::details::matchRankGeometryBuffer (FOREST &forest, int local_rank, std::vector< void * > &local_geo, std::vector< Point< FOREST::dow > > &local_grp, int remote_rank, std::vector< void * > &remote_geo, std::vector< Point< FOREST::dow > > &remote_grp)
template<int DIM, class FOREST >
void MPI::Periodic::details::matchRankGeometry (FOREST &forest, int shift, std::vector< void * > &geo, std::vector< Point< FOREST::dow > > &grp, BinaryBuffer<> &buf, int tag)
template<int DIM, class FOREST >
void MPI::Periodic::details::matchGeometry (FOREST &forest, std::vector< void * > &geo)
template<class FOREST >
void MPI::Periodic::readConfigFile (FOREST &forest, const std::string &file)
template<class FOREST >
void MPI::Periodic::periodizeForest (FOREST &forest)
template<class FOREST >
void MPI::Periodic::periodizeForest (FOREST &forest, const std::string &file)

详细描述

处理周期区域的工具

作者:
Ruo Li <rli>
日期:
Thu Mar 11 16:02:25 2010

面对周期区域,我们需要处理的事情包括如下几项:

1. 在进行自适应的时候,几何体的匹配方式需要修改,具有周期对应性质的 几何体要进行匹配;

2. 在进行了负载平衡操作以后,匹配了的几何体因为只存储了一个备份,因 此几何体的坐标可能出错,我们需要对其做一个校正;

3. 在进行自由度匹配的时候,也要对具有周期对应性质的自由度进行归并;

在以上几项均完成的情况下,整个程序仍然可能出错:如果两个具有周期对应 性质的几何体在负载平衡的时候被放到了同一个进程上,那么在数据展开时它 将失去一些不应该归并的拷贝,使得整个数据结构被破坏。这样的情形如何避 免尚未考虑好。

对于前面进行处理的三个步骤,我们可以采用如下的方式完成:

a. 在1和3中,进行匹配的程序使用计算点与点之间的距离的模式。我们在这 些地方进行扩展,使用一个型为 match_point(p0, p1, h) 的函数来代替 过去的 distance(p0, p1) < h 的语句,使得当 p0 和 p1 是具有周期对 应性质的点进行判断的时候返回真值;

b. 在2的处理中,我们对周期对应的几何体存储几个备份。为了做到这一点, 我们在进行负载平衡时,对所有的周期匹配方式建立的共享关系都忽略。

我们来详细分析一下做负载平衡时所出现的问题:这个问题原则上是由于共享 的几何体事实上有两种不同的共享方式,但是我们却没有分开考虑造成的。一 种方式是两个共享的几何体本质上就是同一个几何体,其所有的数据都完全一 致;另一种方式是两个共享的几何体从物理上来说是同一个几何体,但是具有 不一样的数据(在周期边界条件下,表现为坐标值不相同)。这个问题事实上在 并非分布式并行的时候就已经存在了,即所谓Physical Entity和Geometric Entity的一对多和多对一的关系处理问题。要彻底解决这个问题,需要从网格 数据结构部分开始修改。所以签于其复杂性,我们暂时先不做此考虑。

目前,我们将远程共享指针中加入一个整型变量表征所谓"对象共享类型"。 如果两个对象是完全相同的,那么对象必须在不同的进程上,共享类型为 0。 对于共享类型不是 0 的情形,我们认为两个对象不是完全的复制品,并允许 其出现在同一个进程上。

在做负载平衡的时候,对所有非 0 的共享关系均忽略。因此我们的处理方式 相当于在负载平衡的时候先拆散所有的周期匹配关系,然后在负载平衡完成 以后,将所有周期匹配关系重新建立起来。这将会浪费一些运行时间,但是 可以节省大量的程序开发上的工作量。

注:尽管此处处理的是周期情形,但是对于用户定义的特殊匹配器,其实可以 做非常不同方式的匹配。参考 ex37 中的写法。